Merge "Create getMobileProvisioningUrl in telephony"
diff --git a/Android.bp b/Android.bp
index 26e7165..36c2fa8 100644
--- a/Android.bp
+++ b/Android.bp
@@ -314,6 +314,7 @@
         ":framework-telecomm-sources",
         ":framework-telephony-common-sources",
         ":framework-telephony-sources",
+        ":framework-vcn-util-sources",
         ":framework-wifi-annotations",
         ":framework-wifi-non-updatable-sources",
         ":PacProcessor-aidl-sources",
@@ -1238,6 +1239,7 @@
     visibility: [
         "//frameworks/base/wifi",
         "//frameworks/base/services/net",
+        "//packages/modules/Wifi/framework",
     ],
 }
 
@@ -1262,12 +1264,14 @@
         "core/java/com/android/internal/util/StateMachine.java",
         "core/java/com/android/internal/util/WakeupMessage.java",
     ],
-    visibility: ["//frameworks/opt/net/wifi/service"],
+    visibility: [
+        "//frameworks/opt/net/wifi/service",
+        "//packages/modules/Wifi/service",
+    ],
 }
 
 // TODO(b/145644363): move this to under StubLibraries.bp or ApiDocs.bp
 metalava_framework_docs_args = "--manifest $(location core/res/AndroidManifest.xml) " +
-    "--ignore-classes-on-classpath " +
     "--hide-package com.android.server " +
     "--hide-package android.audio.policy.configuration.V7_0 " +
     "--error UnhiddenSystemApi " +
diff --git a/ApiDocs.bp b/ApiDocs.bp
index ba93a48..ada80bb 100644
--- a/ApiDocs.bp
+++ b/ApiDocs.bp
@@ -91,7 +91,9 @@
     arg_files: [
         "core/res/AndroidManifest.xml",
     ],
-    args: metalava_framework_docs_args,
+    args: metalava_framework_docs_args +
+        // Needed for hidden libcore annotations for now.
+        " --ignore-classes-on-classpath ",
     write_sdk_values: true,
 }
 
@@ -101,7 +103,10 @@
     arg_files: [
         "core/res/AndroidManifest.xml",
     ],
-    args: metalava_framework_docs_args + " --show-annotation android.annotation.SystemApi\\(client=android.annotation.SystemApi.Client.PRIVILEGED_APPS\\) ",
+    args: metalava_framework_docs_args +
+        // Needed for hidden libcore annotations for now.
+        " --ignore-classes-on-classpath " +
+        " --show-annotation android.annotation.SystemApi\\(client=android.annotation.SystemApi.Client.PRIVILEGED_APPS\\) ",
     write_sdk_values: true,
 }
 
diff --git a/StubLibraries.bp b/StubLibraries.bp
index 6cabc57..4b28352 100644
--- a/StubLibraries.bp
+++ b/StubLibraries.bp
@@ -50,7 +50,9 @@
         ":art.module.public.api{.public.stubs.source}",
         "**/package.html",
     ],
-    sdk_version: "core_platform",
+    sdk_version: "none",
+    system_modules: "none",
+    java_version: "1.8",
     arg_files: ["core/res/AndroidManifest.xml"],
     // TODO(b/147699819): remove below aidl includes.
     aidl: {
@@ -77,6 +79,7 @@
         "android.hardware.usb.gadget-V1.0-java",
         "android.hardware.vibrator-V1.3-java",
         "framework-protos",
+        "stable.core.platform.api.stubs",
         // There are a few classes from modules used as type arguments that
         // need to be resolved by metalava. For now, we can use a previously
         // finalized stub library to resolve them. If a new class gets added,
@@ -330,20 +333,6 @@
     },
 }
 
-java_library_static {
-    name: "android_non_updatable_stubs_current",
-    srcs: [":api-stubs-docs-non-updatable"],
-    defaults: ["android_defaults_stubs_current"],
-    libs: ["sdk_system_29_android"],
-}
-
-java_library_static {
-    name: "android_system_non_updatable_stubs_current",
-    srcs: [":system-api-stubs-docs-non-updatable"],
-    defaults: ["android_defaults_stubs_current"],
-    libs: ["sdk_system_29_android"],
-}
-
 /////////////////////////////////////////////////////////////////////
 // hwbinder.stubs provides APIs required for building HIDL Java
 // libraries.
diff --git a/apex/permission/service/Android.bp b/apex/permission/service/Android.bp
index b7d8433..6e04edf 100644
--- a/apex/permission/service/Android.bp
+++ b/apex/permission/service/Android.bp
@@ -39,4 +39,6 @@
         "test_com.android.permission",
     ],
     installable: true,
+    // We don't have last-api tracking files for the public part of this jar's API.
+    unsafe_ignore_missing_latest_api: true,
 }
diff --git a/cmds/idmap2/idmap2/Lookup.cpp b/cmds/idmap2/idmap2/Lookup.cpp
index 8323d0b..437180d 100644
--- a/cmds/idmap2/idmap2/Lookup.cpp
+++ b/cmds/idmap2/idmap2/Lookup.cpp
@@ -71,7 +71,7 @@
   }
 
   // next, try to parse as a package:type/name string
-  if (auto resid = am.GetResourceId(res, "", fallback_package)) {
+  if (auto resid = am.GetResourceId(res, "", fallback_package); resid.ok()) {
     return *resid;
   }
 
@@ -94,7 +94,7 @@
     case Res_value::TYPE_STRING: {
       const ResStringPool* pool = am->GetStringPoolForCookie(value.cookie);
       out->append("\"");
-      if (auto str = pool->string8ObjectAt(value.data)) {
+      if (auto str = pool->string8ObjectAt(value.data); str.ok()) {
         out->append(*str);
       }
     } break;
diff --git a/cmds/idmap2/libidmap2/XmlParser.cpp b/cmds/idmap2/libidmap2/XmlParser.cpp
index 7c55b64..4030b83 100644
--- a/cmds/idmap2/libidmap2/XmlParser.cpp
+++ b/cmds/idmap2/libidmap2/XmlParser.cpp
@@ -98,7 +98,7 @@
 
   switch ((*value).dataType) {
     case Res_value::TYPE_STRING: {
-      if (auto str = parser_.getStrings().string8ObjectAt((*value).data)) {
+      if (auto str = parser_.getStrings().string8ObjectAt((*value).data); str.ok()) {
         return std::string(str->string());
       }
       break;
diff --git a/config/preloaded-classes b/config/preloaded-classes
index 29f6055..5e88d97d 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -3716,9 +3716,9 @@
 android.media.IRingtonePlayer$Stub$Proxy
 android.media.IRingtonePlayer$Stub
 android.media.IRingtonePlayer
-android.media.IStrategyPreferredDeviceDispatcher$Stub$Proxy
-android.media.IStrategyPreferredDeviceDispatcher$Stub
-android.media.IStrategyPreferredDeviceDispatcher
+android.media.IStrategyPreferredDevicesDispatcher$Stub$Proxy
+android.media.IStrategyPreferredDevicesDispatcher$Stub
+android.media.IStrategyPreferredDevicesDispatcher
 android.media.IVolumeController$Stub$Proxy
 android.media.IVolumeController$Stub
 android.media.IVolumeController
diff --git a/core/api/current.txt b/core/api/current.txt
index 3f173bd..65d3e4a 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -19373,14 +19373,17 @@
   public class AudioManager {
     method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener);
     method public int abandonAudioFocusRequest(@NonNull android.media.AudioFocusRequest);
+    method public void addOnCommunicationDeviceChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnCommunicationDeviceChangedListener);
     method public void adjustStreamVolume(int, int, int);
     method public void adjustSuggestedStreamVolume(int, int, int);
     method public void adjustVolume(int, int);
+    method public void clearDeviceForCommunication();
     method public void dispatchMediaKeyEvent(android.view.KeyEvent);
     method public int generateAudioSessionId();
     method @NonNull public java.util.List<android.media.AudioPlaybackConfiguration> getActivePlaybackConfigurations();
     method @NonNull public java.util.List<android.media.AudioRecordingConfiguration> getActiveRecordingConfigurations();
     method public int getAllowedCapturePolicy();
+    method @Nullable public android.media.AudioDeviceInfo getDeviceForCommunication();
     method public android.media.AudioDeviceInfo[] getDevices(int);
     method public java.util.List<android.media.MicrophoneInfo> getMicrophones() throws java.io.IOException;
     method public int getMode();
@@ -19415,11 +19418,13 @@
     method @Deprecated public void registerMediaButtonEventReceiver(android.app.PendingIntent);
     method @Deprecated public void registerRemoteControlClient(android.media.RemoteControlClient);
     method @Deprecated public boolean registerRemoteController(android.media.RemoteController);
+    method public void removeOnCommunicationDeviceChangedListener(@NonNull android.media.AudioManager.OnCommunicationDeviceChangedListener);
     method @Deprecated public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, int, int);
     method public int requestAudioFocus(@NonNull android.media.AudioFocusRequest);
     method public void setAllowedCapturePolicy(int);
     method @Deprecated public void setBluetoothA2dpOn(boolean);
     method public void setBluetoothScoOn(boolean);
+    method public boolean setDeviceForCommunication(@NonNull android.media.AudioDeviceInfo);
     method public void setMicrophoneMute(boolean);
     method public void setMode(int);
     method public void setParameters(String);
@@ -19554,6 +19559,10 @@
     method public void onAudioFocusChange(int);
   }
 
+  public static interface AudioManager.OnCommunicationDeviceChangedListener {
+    method public void onCommunicationDeviceChanged(@Nullable android.media.AudioDeviceInfo);
+  }
+
   public final class AudioMetadata {
     method @NonNull public static android.media.AudioMetadataMap createMap();
   }
@@ -33225,8 +33234,8 @@
   }
 
   protected static interface ContactsContract.DataColumns {
-    field public static final String CARRIER_PRESENCE = "carrier_presence";
-    field public static final int CARRIER_PRESENCE_VT_CAPABLE = 1; // 0x1
+    field @Deprecated public static final String CARRIER_PRESENCE = "carrier_presence";
+    field @Deprecated public static final int CARRIER_PRESENCE_VT_CAPABLE = 1; // 0x1
     field public static final String DATA1 = "data1";
     field public static final String DATA10 = "data10";
     field public static final String DATA11 = "data11";
@@ -40257,7 +40266,7 @@
     field public static final String KEY_USE_ACS_FOR_RCS_BOOL = "use_acs_for_rcs_bool";
     field public static final String KEY_USE_HFA_FOR_PROVISIONING_BOOL = "use_hfa_for_provisioning_bool";
     field public static final String KEY_USE_OTASP_FOR_PROVISIONING_BOOL = "use_otasp_for_provisioning_bool";
-    field public static final String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool";
+    field @Deprecated public static final String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool";
     field public static final String KEY_USE_RCS_SIP_OPTIONS_BOOL = "use_rcs_sip_options_bool";
     field public static final String KEY_USE_WFC_HOME_NETWORK_MODE_IN_ROAMING_NETWORK_BOOL = "use_wfc_home_network_mode_in_roaming_network_bool";
     field public static final String KEY_VOICEMAIL_NOTIFICATION_PERSISTENT_BOOL = "voicemail_notification_persistent_bool";
@@ -40298,9 +40307,12 @@
   }
 
   public static final class CarrierConfigManager.Ims {
+    field public static final String KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL = "ims.enable_presence_capability_exchange_bool";
+    field public static final String KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL = "ims.enable_presence_group_subscribe_bool";
     field public static final String KEY_ENABLE_PRESENCE_PUBLISH_BOOL = "ims.enable_presence_publish_bool";
     field public static final String KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL = "ims.ims_single_registration_required_bool";
     field public static final String KEY_PREFIX = "ims.";
+    field public static final String KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL = "ims.rcs_bulk_capability_exchange_bool";
     field public static final String KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT = "ims.wifi_off_deferring_time_millis_int";
   }
 
@@ -41762,7 +41774,7 @@
     method @Deprecated public String iccTransmitApduLogicalChannel(int, int, int, int, int, int, String);
     method public boolean isConcurrentVoiceAndDataSupported();
     method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE, "android.permission.READ_PRIVILEGED_PHONE_STATE"}) public boolean isDataConnectionAllowed();
-    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isDataEnabled();
+    method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.MODIFY_PHONE_STATE}) public boolean isDataEnabled();
     method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isDataEnabledForReason(int);
     method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_NETWORK_STATE, android.Manifest.permission.READ_PHONE_STATE}) public boolean isDataRoamingEnabled();
     method public boolean isEmergencyNumber(@NonNull String);
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index cbd65d1..b4f1395 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -4145,8 +4145,11 @@
 
   public class AudioManager {
     method @Deprecated public int abandonAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, android.media.AudioAttributes);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDeviceForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener) throws java.lang.SecurityException;
+    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDeviceForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener) throws java.lang.SecurityException;
+    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForCapturePresetChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForCapturePresetChangedListener) throws java.lang.SecurityException;
+    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void addOnPreferredDevicesForStrategyChangedListener(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener) throws java.lang.SecurityException;
     method public void clearAudioServerStateCallback();
+    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean clearPreferredDevicesForCapturePreset(int);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int dispatchAudioFocusChange(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
     method @IntRange(from=0) public long getAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo);
     method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public static java.util.List<android.media.audiopolicy.AudioProductStrategy> getAudioProductStrategies();
@@ -4156,13 +4159,17 @@
     method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMaxVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
     method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getMinVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
     method @Nullable @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public android.media.AudioDeviceAttributes getPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
+    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<android.media.AudioDeviceAttributes> getPreferredDevicesForCapturePreset(int);
+    method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public java.util.List<android.media.AudioDeviceAttributes> getPreferredDevicesForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
     method @NonNull @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int[] getSupportedSystemUsages();
     method @IntRange(from=0) @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int getVolumeIndexForAttributes(@NonNull android.media.AudioAttributes);
     method public boolean isAudioServerRunning();
     method public boolean isHdmiSystemAudioSupported();
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public int registerAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
     method public void registerVolumeGroupCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.VolumeGroupCallback);
-    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDeviceForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener);
+    method @Deprecated @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDeviceForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDeviceForStrategyChangedListener);
+    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForCapturePresetChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForCapturePresetChangedListener);
+    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void removeOnPreferredDevicesForStrategyChangedListener(@NonNull android.media.AudioManager.OnPreferredDevicesForStrategyChangedListener);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean removePreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy);
     method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int) throws java.lang.IllegalArgumentException;
     method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.MODIFY_PHONE_STATE, android.Manifest.permission.MODIFY_AUDIO_ROUTING}) public int requestAudioFocus(android.media.AudioManager.OnAudioFocusChangeListener, @NonNull android.media.AudioAttributes, int, int, android.media.audiopolicy.AudioPolicy) throws java.lang.IllegalArgumentException;
@@ -4170,7 +4177,9 @@
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setAdditionalOutputDeviceDelay(@NonNull android.media.AudioDeviceInfo, @IntRange(from=0) long);
     method public void setAudioServerStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.media.AudioManager.AudioServerStateCallback);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setFocusRequestResult(@NonNull android.media.AudioFocusInfo, int, @NonNull android.media.audiopolicy.AudioPolicy);
+    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForCapturePreset(int, @NonNull android.media.AudioDeviceAttributes);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDeviceForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull android.media.AudioDeviceAttributes);
+    method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public boolean setPreferredDevicesForStrategy(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull java.util.List<android.media.AudioDeviceAttributes>);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setSupportedSystemUsages(@NonNull int[]);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void setVolumeIndexForAttributes(@NonNull android.media.AudioAttributes, int, int);
     method @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING) public void unregisterAudioPolicy(@NonNull android.media.audiopolicy.AudioPolicy);
@@ -4189,8 +4198,16 @@
     method public void onAudioServerUp();
   }
 
-  public static interface AudioManager.OnPreferredDeviceForStrategyChangedListener {
-    method public void onPreferredDeviceForStrategyChanged(@NonNull android.media.audiopolicy.AudioProductStrategy, @Nullable android.media.AudioDeviceAttributes);
+  @Deprecated public static interface AudioManager.OnPreferredDeviceForStrategyChangedListener {
+    method @Deprecated public void onPreferredDeviceForStrategyChanged(@NonNull android.media.audiopolicy.AudioProductStrategy, @Nullable android.media.AudioDeviceAttributes);
+  }
+
+  public static interface AudioManager.OnPreferredDevicesForCapturePresetChangedListener {
+    method public void onPreferredDevicesForCapturePresetChanged(int, @NonNull java.util.List<android.media.AudioDeviceAttributes>);
+  }
+
+  public static interface AudioManager.OnPreferredDevicesForStrategyChangedListener {
+    method public void onPreferredDevicesForStrategyChanged(@NonNull android.media.audiopolicy.AudioProductStrategy, @NonNull java.util.List<android.media.AudioDeviceAttributes>);
   }
 
   public abstract static class AudioManager.VolumeGroupCallback {
@@ -6968,12 +6985,14 @@
     method @NonNull @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public android.os.connectivity.WifiBatteryStats getWifiBatteryStats();
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportFullWifiLockAcquiredFromSource(@NonNull android.os.WorkSource);
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportFullWifiLockReleasedFromSource(@NonNull android.os.WorkSource);
+    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportMobileRadioPowerState(boolean, int) throws java.lang.RuntimeException;
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiBatchedScanStartedFromSource(@NonNull android.os.WorkSource, @IntRange(from=0) int);
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiBatchedScanStoppedFromSource(@NonNull android.os.WorkSource);
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiMulticastDisabled(@NonNull android.os.WorkSource);
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiMulticastEnabled(@NonNull android.os.WorkSource);
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiOff();
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiOn();
+    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiRadioPowerState(boolean, int) throws java.lang.RuntimeException;
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiRssiChanged(@IntRange(from=0xffffff81, to=0) int);
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiScanStartedFromSource(@NonNull android.os.WorkSource);
     method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public void reportWifiScanStoppedFromSource(@NonNull android.os.WorkSource);
@@ -7354,7 +7373,7 @@
     method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void prepareForUnattendedUpdate(@NonNull android.content.Context, @NonNull String, @Nullable android.content.IntentSender) throws java.io.IOException;
     method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void processPackage(android.content.Context, java.io.File, android.os.RecoverySystem.ProgressListener, android.os.Handler) throws java.io.IOException;
     method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void processPackage(android.content.Context, java.io.File, android.os.RecoverySystem.ProgressListener) throws java.io.IOException;
-    method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void rebootAndApply(@NonNull android.content.Context, @NonNull String, @NonNull String) throws java.io.IOException;
+    method @Deprecated @RequiresPermission(android.Manifest.permission.RECOVERY) public static void rebootAndApply(@NonNull android.content.Context, @NonNull String, @NonNull String) throws java.io.IOException;
     method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void rebootAndApply(@NonNull android.content.Context, @NonNull String, boolean) throws java.io.IOException;
     method @RequiresPermission(allOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void rebootWipeAb(android.content.Context, java.io.File, String) throws java.io.IOException;
     method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void scheduleUpdateOnBoot(android.content.Context, java.io.File) throws java.io.IOException;
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index feadd06..9cf9ce4 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -850,6 +850,7 @@
   }
 
   public class AudioManager {
+    method @Nullable public static android.media.AudioDeviceInfo getDeviceInfoFromType(int);
     method public boolean hasRegisteredDynamicPolicy();
   }
 
@@ -871,6 +872,9 @@
     method public static float getMasterBalance();
     method public static final int getNumStreamTypes();
     method public static int setMasterBalance(float);
+    field public static final int DEVICE_ROLE_DISABLED = 2; // 0x2
+    field public static final int DEVICE_ROLE_NONE = 0; // 0x0
+    field public static final int DEVICE_ROLE_PREFERRED = 1; // 0x1
     field public static final int STREAM_DEFAULT = -1; // 0xffffffff
   }
 
diff --git a/core/java/android/app/admin/DevicePolicyManager.java b/core/java/android/app/admin/DevicePolicyManager.java
index 6edc8ea..9acf6756 100644
--- a/core/java/android/app/admin/DevicePolicyManager.java
+++ b/core/java/android/app/admin/DevicePolicyManager.java
@@ -53,7 +53,6 @@
 import android.content.pm.ParceledListSlice;
 import android.content.pm.UserInfo;
 import android.graphics.Bitmap;
-import android.net.NetworkUtils;
 import android.net.PrivateDnsConnectivityChecker;
 import android.net.ProxyInfo;
 import android.net.Uri;
@@ -90,6 +89,7 @@
 import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.net.NetworkUtilsInternal;
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.util.Preconditions;
 import com.android.org.conscrypt.TrustedCertificateStore;
@@ -11466,7 +11466,7 @@
             return PRIVATE_DNS_SET_ERROR_FAILURE_SETTING;
         }
 
-        if (NetworkUtils.isWeaklyValidatedHostname(privateDnsHost)) {
+        if (NetworkUtilsInternal.isWeaklyValidatedHostname(privateDnsHost)) {
             if (!PrivateDnsConnectivityChecker.canConnectToPrivateDnsServer(privateDnsHost)) {
                 return PRIVATE_DNS_SET_ERROR_HOST_NOT_SERVING;
             }
diff --git a/core/java/android/bluetooth/BluetoothAdapter.java b/core/java/android/bluetooth/BluetoothAdapter.java
index 2dfbb3a..e4b2d70 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -2933,6 +2933,16 @@
                             }
                         });
                     }
+                    synchronized (mBluetoothConnectionCallbackExecutorMap) {
+                        if (!mBluetoothConnectionCallbackExecutorMap.isEmpty()) {
+                            try {
+                                mService.registerBluetoothConnectionCallback(mConnectionCallback);
+                            } catch (RemoteException e) {
+                                Log.e(TAG, "onBluetoothServiceUp: Failed to register bluetooth"
+                                        + "connection callback", e);
+                            }
+                        }
+                    }
                 }
 
                 public void onBluetoothServiceDown() {
@@ -3582,25 +3592,25 @@
             return false;
         }
 
-        // If the callback map is empty, we register the service-to-app callback
-        if (mBluetoothConnectionCallbackExecutorMap.isEmpty()) {
-            try {
-                mServiceLock.readLock().lock();
-                if (mService != null) {
-                    if (!mService.registerBluetoothConnectionCallback(mConnectionCallback)) {
-                        return false;
-                    }
-                }
-            } catch (RemoteException e) {
-                Log.e(TAG, "", e);
-                mBluetoothConnectionCallbackExecutorMap.remove(callback);
-            } finally {
-                mServiceLock.readLock().unlock();
-            }
-        }
-
-        // Adds the passed in callback to our map of callbacks to executors
         synchronized (mBluetoothConnectionCallbackExecutorMap) {
+            // If the callback map is empty, we register the service-to-app callback
+            if (mBluetoothConnectionCallbackExecutorMap.isEmpty()) {
+                try {
+                    mServiceLock.readLock().lock();
+                    if (mService != null) {
+                        if (!mService.registerBluetoothConnectionCallback(mConnectionCallback)) {
+                            return false;
+                        }
+                    }
+                } catch (RemoteException e) {
+                    Log.e(TAG, "", e);
+                    mBluetoothConnectionCallbackExecutorMap.remove(callback);
+                } finally {
+                    mServiceLock.readLock().unlock();
+                }
+            }
+
+            // Adds the passed in callback to our map of callbacks to executors
             if (mBluetoothConnectionCallbackExecutorMap.containsKey(callback)) {
                 throw new IllegalArgumentException("This callback has already been registered");
             }
diff --git a/core/java/android/net/EthernetManager.java b/core/java/android/net/EthernetManager.java
index 84a8e1c3..7cd63ef 100644
--- a/core/java/android/net/EthernetManager.java
+++ b/core/java/android/net/EthernetManager.java
@@ -24,10 +24,11 @@
 import android.compat.annotation.UnsupportedAppUsage;
 import android.content.Context;
 import android.os.Build;
-import android.os.Handler;
-import android.os.Message;
 import android.os.RemoteException;
 
+import com.android.internal.annotations.GuardedBy;
+import com.android.internal.os.BackgroundThread;
+
 import java.util.ArrayList;
 import java.util.Objects;
 import java.util.concurrent.Executor;
@@ -41,31 +42,35 @@
 @SystemService(Context.ETHERNET_SERVICE)
 public class EthernetManager {
     private static final String TAG = "EthernetManager";
-    private static final int MSG_AVAILABILITY_CHANGED = 1000;
 
-    private final Context mContext;
     private final IEthernetManager mService;
-    private final Handler mHandler = new Handler(ConnectivityThread.getInstanceLooper()) {
-        @Override
-        public void handleMessage(Message msg) {
-            if (msg.what == MSG_AVAILABILITY_CHANGED) {
-                boolean isAvailable = (msg.arg1 == 1);
-                for (Listener listener : mListeners) {
-                    listener.onAvailabilityChanged((String) msg.obj, isAvailable);
-                }
-            }
-        }
-    };
-    private final ArrayList<Listener> mListeners = new ArrayList<>();
+    @GuardedBy("mListeners")
+    private final ArrayList<ListenerInfo> mListeners = new ArrayList<>();
     private final IEthernetServiceListener.Stub mServiceListener =
             new IEthernetServiceListener.Stub() {
                 @Override
                 public void onAvailabilityChanged(String iface, boolean isAvailable) {
-                    mHandler.obtainMessage(
-                            MSG_AVAILABILITY_CHANGED, isAvailable ? 1 : 0, 0, iface).sendToTarget();
+                    synchronized (mListeners) {
+                        for (ListenerInfo li : mListeners) {
+                            li.executor.execute(() ->
+                                    li.listener.onAvailabilityChanged(iface, isAvailable));
+                        }
+                    }
                 }
             };
 
+    private static class ListenerInfo {
+        @NonNull
+        public final Executor executor;
+        @NonNull
+        public final Listener listener;
+
+        private ListenerInfo(@NonNull Executor executor, @NonNull Listener listener) {
+            this.executor = executor;
+            this.listener = listener;
+        }
+    }
+
     /**
      * A listener interface to receive notification on changes in Ethernet.
      * @hide
@@ -89,7 +94,6 @@
      * @hide
      */
     public EthernetManager(Context context, IEthernetManager service) {
-        mContext = context;
         mService = service;
     }
 
@@ -146,21 +150,38 @@
 
     /**
      * Adds a listener.
+     *
+     * Consider using {@link #addListener(Listener, Executor)} instead: this method uses a default
+     * executor that may have higher latency than a provided executor.
      * @param listener A {@link Listener} to add.
      * @throws IllegalArgumentException If the listener is null.
      * @hide
      */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public void addListener(Listener listener) {
-        if (listener == null) {
-            throw new IllegalArgumentException("listener must not be null");
+    public void addListener(@NonNull Listener listener) {
+        addListener(listener, BackgroundThread.getExecutor());
+    }
+
+    /**
+     * Adds a listener.
+     * @param listener A {@link Listener} to add.
+     * @param executor Executor to run callbacks on.
+     * @throws IllegalArgumentException If the listener or executor is null.
+     * @hide
+     */
+    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
+    public void addListener(@NonNull Listener listener, @NonNull Executor executor) {
+        if (listener == null || executor == null) {
+            throw new NullPointerException("listener and executor must not be null");
         }
-        mListeners.add(listener);
-        if (mListeners.size() == 1) {
-            try {
-                mService.addListener(mServiceListener);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
+        synchronized (mListeners) {
+            mListeners.add(new ListenerInfo(executor, listener));
+            if (mListeners.size() == 1) {
+                try {
+                    mService.addListener(mServiceListener);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
             }
         }
     }
@@ -185,16 +206,18 @@
      * @hide
      */
     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public void removeListener(Listener listener) {
+    public void removeListener(@NonNull Listener listener) {
         if (listener == null) {
             throw new IllegalArgumentException("listener must not be null");
         }
-        mListeners.remove(listener);
-        if (mListeners.isEmpty()) {
-            try {
-                mService.removeListener(mServiceListener);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
+        synchronized (mListeners) {
+            mListeners.removeIf(l -> l.listener == listener);
+            if (mListeners.isEmpty()) {
+                try {
+                    mService.removeListener(mServiceListener);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
             }
         }
     }
diff --git a/core/java/android/net/INetworkManagementEventObserver.aidl b/core/java/android/net/INetworkManagementEventObserver.aidl
index f0fe92e..37813ce 100644
--- a/core/java/android/net/INetworkManagementEventObserver.aidl
+++ b/core/java/android/net/INetworkManagementEventObserver.aidl
@@ -85,11 +85,14 @@
     /**
      * Interface data activity status is changed.
      *
-     * @param iface The interface.
+     * @param networkType The legacy network type of the data activity change.
      * @param active  True if the interface is actively transmitting data, false if it is idle.
      * @param tsNanos Elapsed realtime in nanos when the state of the network interface changed.
+     * @param uid Uid of this event. It represents the uid that was responsible for waking the
+     *            radio. For those events that are reported by system itself, not from specific uid,
+     *            use -1 for the events which means no uid.
      */
-    void interfaceClassDataActivityChanged(String label, boolean active, long tsNanos);
+    void interfaceClassDataActivityChanged(int networkType, boolean active, long tsNanos, int uid);
 
     /**
      * Information about available DNS servers has been received.
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl
index e486052..792e5b4 100644
--- a/core/java/android/net/INetworkPolicyManager.aidl
+++ b/core/java/android/net/INetworkPolicyManager.aidl
@@ -17,6 +17,7 @@
 package android.net;
 
 import android.net.INetworkPolicyListener;
+import android.net.Network;
 import android.net.NetworkPolicy;
 import android.net.NetworkQuotaInfo;
 import android.net.NetworkState;
@@ -67,6 +68,8 @@
     void setDeviceIdleMode(boolean enabled);
     void setWifiMeteredOverride(String networkId, int meteredOverride);
 
+    int getMultipathPreference(in Network network);
+
     @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
     NetworkQuotaInfo getNetworkQuotaInfo(in NetworkState state);
 
diff --git a/core/java/android/net/LinkProperties.java b/core/java/android/net/LinkProperties.java
index 0941e7d..486e2d7 100644
--- a/core/java/android/net/LinkProperties.java
+++ b/core/java/android/net/LinkProperties.java
@@ -20,12 +20,13 @@
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.compat.annotation.UnsupportedAppUsage;
-import android.net.util.LinkPropertiesUtils;
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
 import android.text.TextUtils;
 
+import com.android.net.module.util.LinkPropertiesUtils;
+
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
diff --git a/core/java/android/net/MacAddress.java b/core/java/android/net/MacAddress.java
index 178183d..c7116b4 100644
--- a/core/java/android/net/MacAddress.java
+++ b/core/java/android/net/MacAddress.java
@@ -20,13 +20,13 @@
 import android.annotation.NonNull;
 import android.annotation.Nullable;
 import android.compat.annotation.UnsupportedAppUsage;
-import android.net.util.MacAddressUtils;
 import android.net.wifi.WifiInfo;
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
 
 import com.android.internal.util.Preconditions;
+import com.android.net.module.util.MacAddressUtils;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
diff --git a/core/java/android/net/NetworkPolicyManager.java b/core/java/android/net/NetworkPolicyManager.java
index f05f033..ce16a78 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -432,6 +432,17 @@
         }
     }
 
+    /**
+     * Get multipath preference for the given network.
+     */
+    public int getMultipathPreference(Network network) {
+        try {
+            return mService.getMultipathPreference(network);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
     /** {@hide} */
     @Deprecated
     public static Iterator<Pair<ZonedDateTime, ZonedDateTime>> cycleIterator(NetworkPolicy policy) {
diff --git a/core/java/android/net/NetworkStatsHistory.java b/core/java/android/net/NetworkStatsHistory.java
index fba7561..bf25602 100644
--- a/core/java/android/net/NetworkStatsHistory.java
+++ b/core/java/android/net/NetworkStatsHistory.java
@@ -26,9 +26,9 @@
 import static android.net.NetworkStatsHistory.Entry.UNKNOWN;
 import static android.net.NetworkStatsHistory.ParcelUtils.readLongArray;
 import static android.net.NetworkStatsHistory.ParcelUtils.writeLongArray;
-import static android.net.NetworkUtils.multiplySafeByRational;
 import static android.text.format.DateUtils.SECOND_IN_MILLIS;
 
+import static com.android.internal.net.NetworkUtilsInternal.multiplySafeByRational;
 import static com.android.internal.util.ArrayUtils.total;
 
 import android.compat.annotation.UnsupportedAppUsage;
diff --git a/core/java/android/net/NetworkUtils.java b/core/java/android/net/NetworkUtils.java
index d84ee2a..b5962c5 100644
--- a/core/java/android/net/NetworkUtils.java
+++ b/core/java/android/net/NetworkUtils.java
@@ -16,14 +16,9 @@
 
 package android.net;
 
-import static android.system.OsConstants.AF_INET;
-import static android.system.OsConstants.AF_INET6;
-
-import android.annotation.NonNull;
 import android.compat.annotation.UnsupportedAppUsage;
 import android.os.Build;
 import android.system.ErrnoException;
-import android.system.Os;
 import android.util.Log;
 import android.util.Pair;
 
@@ -155,14 +150,6 @@
     public static native Network getDnsNetwork() throws ErrnoException;
 
     /**
-     * Allow/Disallow creating AF_INET/AF_INET6 sockets and DNS lookups for current process.
-     *
-     * @param allowNetworking whether to allow or disallow creating AF_INET/AF_INET6 sockets
-     *                        and DNS lookups.
-     */
-    public static native void setAllowNetworkingForProcess(boolean allowNetworking);
-
-    /**
      * Get the tcp repair window associated with the {@code fd}.
      *
      * @param fd the tcp socket's {@link FileDescriptor}.
@@ -437,60 +424,4 @@
         return routedIPCount;
     }
 
-    private static final int[] ADDRESS_FAMILIES = new int[] {AF_INET, AF_INET6};
-
-    /**
-     * Returns true if the hostname is weakly validated.
-     * @param hostname Name of host to validate.
-     * @return True if it's a valid-ish hostname.
-     *
-     * @hide
-     */
-    public static boolean isWeaklyValidatedHostname(@NonNull String hostname) {
-        // TODO(b/34953048): Use a validation method that permits more accurate,
-        // but still inexpensive, checking of likely valid DNS hostnames.
-        final String weakHostnameRegex = "^[a-zA-Z0-9_.-]+$";
-        if (!hostname.matches(weakHostnameRegex)) {
-            return false;
-        }
-
-        for (int address_family : ADDRESS_FAMILIES) {
-            if (Os.inet_pton(address_family, hostname) != null) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Safely multiple a value by a rational.
-     * <p>
-     * Internally it uses integer-based math whenever possible, but switches
-     * over to double-based math if values would overflow.
-     * @hide
-     */
-    public static long multiplySafeByRational(long value, long num, long den) {
-        if (den == 0) {
-            throw new ArithmeticException("Invalid Denominator");
-        }
-        long x = value;
-        long y = num;
-
-        // Logic shamelessly borrowed from Math.multiplyExact()
-        long r = x * y;
-        long ax = Math.abs(x);
-        long ay = Math.abs(y);
-        if (((ax | ay) >>> 31 != 0)) {
-            // Some bits greater than 2^31 that might cause overflow
-            // Check the result using the divide operator
-            // and check for the special case of Long.MIN_VALUE * -1
-            if (((y != 0) && (r / y != x)) ||
-                    (x == Long.MIN_VALUE && y == -1)) {
-                // Use double math to avoid overflowing
-                return (long) (((double) num / den) * value);
-            }
-        }
-        return r / den;
-    }
 }
diff --git a/core/java/android/net/Proxy.java b/core/java/android/net/Proxy.java
index 20ccc07..03b07e0 100644
--- a/core/java/android/net/Proxy.java
+++ b/core/java/android/net/Proxy.java
@@ -24,6 +24,8 @@
 import android.text.TextUtils;
 import android.util.Log;
 
+import com.android.net.module.util.ProxyUtils;
+
 import java.net.InetSocketAddress;
 import java.net.ProxySelector;
 import java.net.URI;
@@ -251,7 +253,7 @@
         if (p != null) {
             host = p.getHost();
             port = Integer.toString(p.getPort());
-            exclList = p.getExclusionListAsString();
+            exclList = ProxyUtils.exclusionListAsString(p.getExclusionList());
             pacFileUrl = p.getPacFileUrl();
         }
         setHttpProxySystemProperty(host, port, exclList, pacFileUrl);
diff --git a/core/java/android/net/RouteInfo.java b/core/java/android/net/RouteInfo.java
index 6166a75..94f849f 100644
--- a/core/java/android/net/RouteInfo.java
+++ b/core/java/android/net/RouteInfo.java
@@ -21,11 +21,12 @@
 import android.annotation.Nullable;
 import android.annotation.SystemApi;
 import android.compat.annotation.UnsupportedAppUsage;
-import android.net.util.NetUtils;
 import android.os.Build;
 import android.os.Parcel;
 import android.os.Parcelable;
 
+import com.android.net.module.util.NetUtils;
+
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.net.Inet4Address;
diff --git a/core/java/android/net/vcn/VcnConfig.java b/core/java/android/net/vcn/VcnConfig.java
index 148acf1..d4a3fa7 100644
--- a/core/java/android/net/vcn/VcnConfig.java
+++ b/core/java/android/net/vcn/VcnConfig.java
@@ -15,30 +15,104 @@
  */
 package android.net.vcn;
 
+import static com.android.internal.annotations.VisibleForTesting.Visibility;
+
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.os.PersistableBundle;
+import android.util.ArraySet;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.Preconditions;
+import com.android.server.vcn.util.PersistableBundleUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Objects;
+import java.util.Set;
 
 /**
  * This class represents a configuration for a Virtual Carrier Network.
  *
+ * <p>Each {@link VcnGatewayConnectionConfig} instance added represents a connection that will be
+ * brought up on demand based on active {@link NetworkRequest}(s).
+ *
+ * @see VcnManager for more information on the Virtual Carrier Network feature
  * @hide
  */
 public final class VcnConfig implements Parcelable {
     @NonNull private static final String TAG = VcnConfig.class.getSimpleName();
 
-    private VcnConfig() {
+    private static final String GATEWAY_CONNECTION_CONFIGS_KEY = "mGatewayConnectionConfigs";
+    @NonNull private final Set<VcnGatewayConnectionConfig> mGatewayConnectionConfigs;
+
+    private VcnConfig(@NonNull Set<VcnGatewayConnectionConfig> tunnelConfigs) {
+        mGatewayConnectionConfigs = Collections.unmodifiableSet(tunnelConfigs);
+
         validate();
     }
-    // TODO: Implement getters, validators, etc
 
     /**
-     * Validates this configuration.
+     * Deserializes a VcnConfig from a PersistableBundle.
      *
      * @hide
      */
+    @VisibleForTesting(visibility = Visibility.PRIVATE)
+    public VcnConfig(@NonNull PersistableBundle in) {
+        final PersistableBundle gatewayConnectionConfigsBundle =
+                in.getPersistableBundle(GATEWAY_CONNECTION_CONFIGS_KEY);
+        mGatewayConnectionConfigs =
+                new ArraySet<>(
+                        PersistableBundleUtils.toList(
+                                gatewayConnectionConfigsBundle, VcnGatewayConnectionConfig::new));
+
+        validate();
+    }
+
     private void validate() {
-        // TODO: implement validation logic
+        Preconditions.checkCollectionNotEmpty(
+                mGatewayConnectionConfigs, "gatewayConnectionConfigs");
+    }
+
+    /** Retrieves the set of configured tunnels. */
+    @NonNull
+    public Set<VcnGatewayConnectionConfig> getGatewayConnectionConfigs() {
+        return Collections.unmodifiableSet(mGatewayConnectionConfigs);
+    }
+
+    /**
+     * Serializes this object to a PersistableBundle.
+     *
+     * @hide
+     */
+    @NonNull
+    public PersistableBundle toPersistableBundle() {
+        final PersistableBundle result = new PersistableBundle();
+
+        final PersistableBundle gatewayConnectionConfigsBundle =
+                PersistableBundleUtils.fromList(
+                        new ArrayList<>(mGatewayConnectionConfigs),
+                        VcnGatewayConnectionConfig::toPersistableBundle);
+        result.putPersistableBundle(GATEWAY_CONNECTION_CONFIGS_KEY, gatewayConnectionConfigsBundle);
+
+        return result;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(mGatewayConnectionConfigs);
+    }
+
+    @Override
+    public boolean equals(@Nullable Object other) {
+        if (!(other instanceof VcnConfig)) {
+            return false;
+        }
+
+        final VcnConfig rhs = (VcnConfig) other;
+        return mGatewayConnectionConfigs.equals(rhs.mGatewayConnectionConfigs);
     }
 
     // Parcelable methods
@@ -49,15 +123,16 @@
     }
 
     @Override
-    public void writeToParcel(Parcel out, int flags) {}
+    public void writeToParcel(Parcel out, int flags) {
+        out.writeParcelable(toPersistableBundle(), flags);
+    }
 
     @NonNull
     public static final Parcelable.Creator<VcnConfig> CREATOR =
             new Parcelable.Creator<VcnConfig>() {
                 @NonNull
                 public VcnConfig createFromParcel(Parcel in) {
-                    // TODO: Ensure all methods are pulled from the parcels
-                    return new VcnConfig();
+                    return new VcnConfig((PersistableBundle) in.readParcelable(null));
                 }
 
                 @NonNull
@@ -68,7 +143,23 @@
 
     /** This class is used to incrementally build {@link VcnConfig} objects. */
     public static class Builder {
-        // TODO: Implement this builder
+        @NonNull
+        private final Set<VcnGatewayConnectionConfig> mGatewayConnectionConfigs = new ArraySet<>();
+
+        /**
+         * Adds a configuration for an individual gateway connection.
+         *
+         * @param gatewayConnectionConfig the configuration for an individual gateway connection
+         * @return this {@link Builder} instance, for chaining
+         */
+        @NonNull
+        public Builder addGatewayConnectionConfig(
+                @NonNull VcnGatewayConnectionConfig gatewayConnectionConfig) {
+            Objects.requireNonNull(gatewayConnectionConfig, "gatewayConnectionConfig was null");
+
+            mGatewayConnectionConfigs.add(gatewayConnectionConfig);
+            return this;
+        }
 
         /**
          * Builds and validates the VcnConfig.
@@ -77,7 +168,7 @@
          */
         @NonNull
         public VcnConfig build() {
-            return new VcnConfig();
+            return new VcnConfig(mGatewayConnectionConfigs);
         }
     }
 }
diff --git a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
index 8160edc..039360a 100644
--- a/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
+++ b/core/java/android/net/vcn/VcnGatewayConnectionConfig.java
@@ -15,7 +15,27 @@
  */
 package android.net.vcn;
 
+import static android.net.NetworkCapabilities.NetCapability;
+
+import static com.android.internal.annotations.VisibleForTesting.Visibility;
+
+import android.annotation.IntRange;
 import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.net.NetworkCapabilities;
+import android.os.PersistableBundle;
+import android.util.ArraySet;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.util.Preconditions;
+import com.android.server.vcn.util.PersistableBundleUtils;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 /**
  * This class represents a configuration for a connection to a Virtual Carrier Network gateway.
@@ -49,38 +69,399 @@
  *   <li>{@link android.net.NetworkCapabilities.NET_CAPABILITY_MCX}
  * </ul>
  *
+ * <p>The meteredness and roaming of the VCN {@link Network} will be determined by that of the
+ * underlying Network(s).
+ *
  * @hide
  */
 public final class VcnGatewayConnectionConfig {
-    private VcnGatewayConnectionConfig() {
+    // TODO: Use MIN_MTU_V6 once it is public, @hide
+    @VisibleForTesting(visibility = Visibility.PRIVATE)
+    static final int MIN_MTU_V6 = 1280;
+
+    private static final Set<Integer> ALLOWED_CAPABILITIES;
+
+    static {
+        Set<Integer> allowedCaps = new ArraySet<>();
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_MMS);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_SUPL);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_DUN);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_FOTA);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_IMS);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_CBS);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_IA);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_RCS);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_XCAP);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_EIMS);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+        allowedCaps.add(NetworkCapabilities.NET_CAPABILITY_MCX);
+
+        ALLOWED_CAPABILITIES = Collections.unmodifiableSet(allowedCaps);
+    }
+
+    private static final int DEFAULT_MAX_MTU = 1500;
+
+    /**
+     * The maximum number of retry intervals that may be specified.
+     *
+     * <p>Limited to ensure an upper bound on config sizes.
+     */
+    private static final int MAX_RETRY_INTERVAL_COUNT = 10;
+
+    /**
+     * The minimum allowable repeating retry interval
+     *
+     * <p>To ensure the device is not constantly being woken up, this retry interval MUST be greater
+     * than this value.
+     *
+     * @see {@link Builder#setRetryInterval()}
+     */
+    private static final long MINIMUM_REPEATING_RETRY_INTERVAL_MS = TimeUnit.MINUTES.toMillis(15);
+
+    private static final long[] DEFAULT_RETRY_INTERVALS_MS =
+            new long[] {
+                TimeUnit.SECONDS.toMillis(1),
+                TimeUnit.SECONDS.toMillis(2),
+                TimeUnit.SECONDS.toMillis(5),
+                TimeUnit.SECONDS.toMillis(30),
+                TimeUnit.MINUTES.toMillis(1),
+                TimeUnit.MINUTES.toMillis(5),
+                TimeUnit.MINUTES.toMillis(15)
+            };
+
+    private static final String EXPOSED_CAPABILITIES_KEY = "mExposedCapabilities";
+    @NonNull private final Set<Integer> mExposedCapabilities;
+
+    private static final String UNDERLYING_CAPABILITIES_KEY = "mUnderlyingCapabilities";
+    @NonNull private final Set<Integer> mUnderlyingCapabilities;
+
+    // TODO: Add Ike/ChildSessionParams as a subclass - maybe VcnIkeGatewayConnectionConfig
+
+    private static final String MAX_MTU_KEY = "mMaxMtu";
+    private final int mMaxMtu;
+
+    private static final String RETRY_INTERVAL_MS_KEY = "mRetryIntervalsMs";
+    @NonNull private final long[] mRetryIntervalsMs;
+
+    @VisibleForTesting(visibility = Visibility.PRIVATE)
+    public VcnGatewayConnectionConfig(
+            @NonNull Set<Integer> exposedCapabilities,
+            @NonNull Set<Integer> underlyingCapabilities,
+            @NonNull long[] retryIntervalsMs,
+            @IntRange(from = MIN_MTU_V6) int maxMtu) {
+        mExposedCapabilities = exposedCapabilities;
+        mUnderlyingCapabilities = underlyingCapabilities;
+        mRetryIntervalsMs = retryIntervalsMs;
+        mMaxMtu = maxMtu;
+
         validate();
     }
 
-    // TODO: Implement getters, validators, etc
+    /** @hide */
+    @VisibleForTesting(visibility = Visibility.PRIVATE)
+    public VcnGatewayConnectionConfig(@NonNull PersistableBundle in) {
+        final PersistableBundle exposedCapsBundle =
+                in.getPersistableBundle(EXPOSED_CAPABILITIES_KEY);
+        final PersistableBundle underlyingCapsBundle =
+                in.getPersistableBundle(UNDERLYING_CAPABILITIES_KEY);
+
+        mExposedCapabilities = new ArraySet<>(PersistableBundleUtils.toList(
+                exposedCapsBundle, PersistableBundleUtils.INTEGER_DESERIALIZER));
+        mUnderlyingCapabilities = new ArraySet<>(PersistableBundleUtils.toList(
+                underlyingCapsBundle, PersistableBundleUtils.INTEGER_DESERIALIZER));
+        mRetryIntervalsMs = in.getLongArray(RETRY_INTERVAL_MS_KEY);
+        mMaxMtu = in.getInt(MAX_MTU_KEY);
+
+        validate();
+    }
+
+    private void validate() {
+        Preconditions.checkArgument(
+                mExposedCapabilities != null && !mExposedCapabilities.isEmpty(),
+                "exposedCapsBundle was null or empty");
+        for (Integer cap : getAllExposedCapabilities()) {
+            checkValidCapability(cap);
+        }
+
+        Preconditions.checkArgument(
+                mUnderlyingCapabilities != null && !mUnderlyingCapabilities.isEmpty(),
+                "underlyingCapabilities was null or empty");
+        for (Integer cap : getAllUnderlyingCapabilities()) {
+            checkValidCapability(cap);
+        }
+
+        Objects.requireNonNull(mRetryIntervalsMs, "retryIntervalsMs was null");
+        validateRetryInterval(mRetryIntervalsMs);
+
+        Preconditions.checkArgument(
+                mMaxMtu >= MIN_MTU_V6, "maxMtu must be at least IPv6 min MTU (1280)");
+    }
+
+    private static void checkValidCapability(int capability) {
+        Preconditions.checkArgument(
+                ALLOWED_CAPABILITIES.contains(capability),
+                "NetworkCapability " + capability + "out of range");
+    }
+
+    private static void validateRetryInterval(@Nullable long[] retryIntervalsMs) {
+        Preconditions.checkArgument(
+                retryIntervalsMs != null
+                        && retryIntervalsMs.length > 0
+                        && retryIntervalsMs.length <= MAX_RETRY_INTERVAL_COUNT,
+                "retryIntervalsMs was null, empty or exceed max interval count");
+
+        final long repeatingInterval = retryIntervalsMs[retryIntervalsMs.length - 1];
+        if (repeatingInterval < MINIMUM_REPEATING_RETRY_INTERVAL_MS) {
+            throw new IllegalArgumentException(
+                    "Repeating retry interval was too short, must be a minimum of 15 minutes: "
+                            + repeatingInterval);
+        }
+    }
 
     /**
-     * Validates this configuration
+     * Returns all exposed capabilities.
      *
      * @hide
      */
-    private void validate() {
-        // TODO: implement validation logic
+    @NonNull
+    public Set<Integer> getAllExposedCapabilities() {
+        return Collections.unmodifiableSet(mExposedCapabilities);
     }
 
-    // Parcelable methods
+    /**
+     * Checks if this config is configured to support/expose a specific capability.
+     *
+     * @param capability the capability to check for
+     */
+    public boolean hasExposedCapability(@NetCapability int capability) {
+        checkValidCapability(capability);
 
-    /** This class is used to incrementally build {@link VcnGatewayConnectionConfig} objects */
+        return mExposedCapabilities.contains(capability);
+    }
+
+    /**
+     * Returns all capabilities required of underlying networks.
+     *
+     * @hide
+     */
+    @NonNull
+    public Set<Integer> getAllUnderlyingCapabilities() {
+        return Collections.unmodifiableSet(mUnderlyingCapabilities);
+    }
+
+    /**
+     * Checks if this config requires an underlying network to have the specified capability.
+     *
+     * @param capability the capability to check for
+     */
+    public boolean requiresUnderlyingCapability(@NetCapability int capability) {
+        checkValidCapability(capability);
+
+        return mUnderlyingCapabilities.contains(capability);
+    }
+
+    /** Retrieves the configured retry intervals. */
+    @NonNull
+    public long[] getRetryIntervalsMs() {
+        return Arrays.copyOf(mRetryIntervalsMs, mRetryIntervalsMs.length);
+    }
+
+    /** Retrieves the maximum MTU allowed for this Gateway Connection. */
+    @IntRange(from = MIN_MTU_V6)
+    public int getMaxMtu() {
+        return mMaxMtu;
+    }
+
+    /**
+     * Converts this config to a PersistableBundle.
+     *
+     * @hide
+     */
+    @NonNull
+    @VisibleForTesting(visibility = Visibility.PROTECTED)
+    public PersistableBundle toPersistableBundle() {
+        final PersistableBundle result = new PersistableBundle();
+
+        final PersistableBundle exposedCapsBundle =
+                PersistableBundleUtils.fromList(
+                        new ArrayList<>(mExposedCapabilities),
+                        PersistableBundleUtils.INTEGER_SERIALIZER);
+        final PersistableBundle underlyingCapsBundle =
+                PersistableBundleUtils.fromList(
+                        new ArrayList<>(mUnderlyingCapabilities),
+                        PersistableBundleUtils.INTEGER_SERIALIZER);
+
+        result.putPersistableBundle(EXPOSED_CAPABILITIES_KEY, exposedCapsBundle);
+        result.putPersistableBundle(UNDERLYING_CAPABILITIES_KEY, underlyingCapsBundle);
+        result.putLongArray(RETRY_INTERVAL_MS_KEY, mRetryIntervalsMs);
+        result.putInt(MAX_MTU_KEY, mMaxMtu);
+
+        return result;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(
+                mExposedCapabilities,
+                mUnderlyingCapabilities,
+                Arrays.hashCode(mRetryIntervalsMs),
+                mMaxMtu);
+    }
+
+    @Override
+    public boolean equals(@Nullable Object other) {
+        if (!(other instanceof VcnGatewayConnectionConfig)) {
+            return false;
+        }
+
+        final VcnGatewayConnectionConfig rhs = (VcnGatewayConnectionConfig) other;
+        return mExposedCapabilities.equals(rhs.mExposedCapabilities)
+                && mUnderlyingCapabilities.equals(rhs.mUnderlyingCapabilities)
+                && Arrays.equals(mRetryIntervalsMs, rhs.mRetryIntervalsMs)
+                && mMaxMtu == rhs.mMaxMtu;
+    }
+
+    /** This class is used to incrementally build {@link VcnGatewayConnectionConfig} objects. */
     public static class Builder {
-        // TODO: Implement this builder
+        @NonNull private final Set<Integer> mExposedCapabilities = new ArraySet();
+        @NonNull private final Set<Integer> mUnderlyingCapabilities = new ArraySet();
+        @NonNull private long[] mRetryIntervalsMs = DEFAULT_RETRY_INTERVALS_MS;
+        private int mMaxMtu = DEFAULT_MAX_MTU;
+
+        // TODO: (b/175829816) Consider VCN-exposed capabilities that may be transport dependent.
+        //       Consider the case where the VCN might only expose MMS on WiFi, but defer to MMS
+        //       when on Cell.
 
         /**
-         * Builds and validates the VcnGatewayConnectionConfig
+         * Add a capability that this VCN Gateway Connection will support.
+         *
+         * @param exposedCapability the app-facing capability to be exposed by this VCN Gateway
+         *     Connection (i.e., the capabilities that this VCN Gateway Connection will support).
+         * @return this {@link Builder} instance, for chaining
+         * @see VcnGatewayConnectionConfig for a list of capabilities may be exposed by a Gateway
+         *     Connection
+         */
+        public Builder addExposedCapability(@NetCapability int exposedCapability) {
+            checkValidCapability(exposedCapability);
+
+            mExposedCapabilities.add(exposedCapability);
+            return this;
+        }
+
+        /**
+         * Remove a capability that this VCN Gateway Connection will support.
+         *
+         * @param exposedCapability the app-facing capability to not be exposed by this VCN Gateway
+         *     Connection (i.e., the capabilities that this VCN Gateway Connection will support)
+         * @return this {@link Builder} instance, for chaining
+         * @see VcnGatewayConnectionConfig for a list of capabilities may be exposed by a Gateway
+         *     Connection
+         */
+        public Builder removeExposedCapability(@NetCapability int exposedCapability) {
+            checkValidCapability(exposedCapability);
+
+            mExposedCapabilities.remove(exposedCapability);
+            return this;
+        }
+
+        /**
+         * Require a capability for Networks underlying this VCN Gateway Connection.
+         *
+         * @param underlyingCapability the capability that a network MUST have in order to be an
+         *     underlying network for this VCN Gateway Connection.
+         * @return this {@link Builder} instance, for chaining
+         * @see VcnGatewayConnectionConfig for a list of capabilities may be required of underlying
+         *     networks
+         */
+        public Builder addRequiredUnderlyingCapability(@NetCapability int underlyingCapability) {
+            checkValidCapability(underlyingCapability);
+
+            mUnderlyingCapabilities.add(underlyingCapability);
+            return this;
+        }
+
+        /**
+         * Remove a requirement of a capability for Networks underlying this VCN Gateway Connection.
+         *
+         * <p>Calling this method will allow Networks that do NOT have this capability to be
+         * selected as an underlying network for this VCN Gateway Connection. However, underlying
+         * networks MAY still have the removed capability.
+         *
+         * @param underlyingCapability the capability that a network DOES NOT need to have in order
+         *     to be an underlying network for this VCN Gateway Connection.
+         * @return this {@link Builder} instance, for chaining
+         * @see VcnGatewayConnectionConfig for a list of capabilities may be required of underlying
+         *     networks
+         */
+        public Builder removeRequiredUnderlyingCapability(@NetCapability int underlyingCapability) {
+            checkValidCapability(underlyingCapability);
+
+            mUnderlyingCapabilities.remove(underlyingCapability);
+            return this;
+        }
+
+        /**
+         * Set the retry interval between VCN establishment attempts upon successive failures.
+         *
+         * <p>The last retry interval will be repeated until safe mode is entered, or a connection
+         * is successfully established, at which point the retry timers will be reset. For power
+         * reasons, the last (repeated) retry interval MUST be at least 15 minutes.
+         *
+         * <p>Retry intervals MAY be subject to system power saving modes. That is to say that if
+         * the system enters a power saving mode, the retry may not occur until the device leaves
+         * the specified power saving mode. Intervals are sequential, and intervals will NOT be
+         * skipped if system power saving results in delaying retries (even if it exceed multiple
+         * retry intervals).
+         *
+         * <p>Each Gateway Connection will retry according to the retry intervals configured, but if
+         * safe mode is enabled, all Gateway Connection(s) will be disabled.
+         *
+         * @param retryIntervalsMs an array of between 1 and 10 millisecond intervals after which
+         *     the VCN will attempt to retry a session initiation. The last (repeating) retry
+         *     interval must be at least 15 minutes. Defaults to: {@code [1s, 2s, 5s, 30s, 1m, 5m,
+         *     15m]}
+         * @return this {@link Builder} instance, for chaining
+         * @see VcnManager for additional discussion on fail-safe mode
+         */
+        @NonNull
+        public Builder setRetryInterval(@NonNull long[] retryIntervalsMs) {
+            validateRetryInterval(retryIntervalsMs);
+
+            mRetryIntervalsMs = retryIntervalsMs;
+            return this;
+        }
+
+        /**
+         * Sets the maximum MTU allowed for this VCN Gateway Connection.
+         *
+         * <p>This MTU is applied to the VCN Gateway Connection exposed Networks, and represents the
+         * MTU of the virtualized network.
+         *
+         * <p>The system may reduce the MTU below the maximum specified based on signals such as the
+         * MTU of the underlying networks (and adjusted for Gateway Connection overhead).
+         *
+         * @param maxMtu the maximum MTU allowed for this Gateway Connection. Must be greater than
+         *     the IPv6 minimum MTU of 1280. Defaults to 1500.
+         * @return this {@link Builder} instance, for chaining
+         */
+        @NonNull
+        public Builder setMaxMtu(@IntRange(from = MIN_MTU_V6) int maxMtu) {
+            Preconditions.checkArgument(
+                    maxMtu >= MIN_MTU_V6, "maxMtu must be at least IPv6 min MTU (1280)");
+
+            mMaxMtu = maxMtu;
+            return this;
+        }
+
+        /**
+         * Builds and validates the VcnGatewayConnectionConfig.
          *
          * @return an immutable VcnGatewayConnectionConfig instance
          */
         @NonNull
         public VcnGatewayConnectionConfig build() {
-            return new VcnGatewayConnectionConfig();
+            return new VcnGatewayConnectionConfig(
+                    mExposedCapabilities, mUnderlyingCapabilities, mRetryIntervalsMs, mMaxMtu);
         }
     }
 }
diff --git a/core/java/android/net/vcn/VcnManager.java b/core/java/android/net/vcn/VcnManager.java
index 6769b9e..19c183f 100644
--- a/core/java/android/net/vcn/VcnManager.java
+++ b/core/java/android/net/vcn/VcnManager.java
@@ -23,10 +23,37 @@
 import android.content.Context;
 import android.os.ParcelUuid;
 import android.os.RemoteException;
+import android.os.ServiceSpecificException;
+
+import java.io.IOException;
 
 /**
  * VcnManager publishes APIs for applications to configure and manage Virtual Carrier Networks.
  *
+ * <p>A VCN creates a virtualization layer to allow MVNOs to aggregate heterogeneous physical
+ * networks, unifying them as a single carrier network. This enables infrastructure flexibility on
+ * the part of MVNOs without impacting user connectivity, abstracting the physical network
+ * technologies as an implementation detail of their public network.
+ *
+ * <p>Each VCN virtualizes an Carrier's network by building tunnels to a carrier's core network over
+ * carrier-managed physical links and supports a IP mobility layer to ensure seamless transitions
+ * between the underlying networks. Each VCN is configured based on a Subscription Group (see {@link
+ * android.telephony.SubscriptionManager}) and aggregates all networks that are brought up based on
+ * a profile or suggestion in the specified Subscription Group.
+ *
+ * <p>The VCN can be configured to expose one or more {@link android.net.Network}(s), each with
+ * different capabilities, allowing for APN virtualization.
+ *
+ * <p>If a tunnel fails to connect, or otherwise encounters a fatal error, the VCN will attempt to
+ * reestablish the connection. If the tunnel still has not reconnected after a system-determined
+ * timeout, the VCN Safe Mode (see below) will be entered.
+ *
+ * <p>The VCN Safe Mode ensures that users (and carriers) have a fallback to restore system
+ * connectivity to update profiles, diagnose issues, contact support, or perform other remediation
+ * tasks. In Safe Mode, the system will allow underlying cellular networks to be used as default.
+ * Additionally, during Safe Mode, the VCN will continue to retry the connections, and will
+ * automatically exit Safe Mode if all active tunnels connect successfully.
+ *
  * @hide
  */
 @SystemService(Context.VCN_MANAGEMENT_SERVICE)
@@ -63,15 +90,20 @@
      * @param config the configuration parameters for the VCN
      * @throws SecurityException if the caller does not have carrier privileges, or is not running
      *     as the primary user
+     * @throws IOException if the configuration failed to be persisted. A caller encountering this
+     *     exception should attempt to retry (possibly after a delay).
      * @hide
      */
     @RequiresPermission("carrier privileges") // TODO (b/72967236): Define a system-wide constant
-    public void setVcnConfig(@NonNull ParcelUuid subscriptionGroup, @NonNull VcnConfig config) {
+    public void setVcnConfig(@NonNull ParcelUuid subscriptionGroup, @NonNull VcnConfig config)
+            throws IOException {
         requireNonNull(subscriptionGroup, "subscriptionGroup was null");
         requireNonNull(config, "config was null");
 
         try {
             mService.setVcnConfig(subscriptionGroup, config);
+        } catch (ServiceSpecificException e) {
+            throw new IOException(e);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -88,14 +120,18 @@
      * @param subscriptionGroup the subscription group that the configuration should be applied to
      * @throws SecurityException if the caller does not have carrier privileges, or is not running
      *     as the primary user
+     * @throws IOException if the configuration failed to be cleared. A caller encountering this
+     *     exception should attempt to retry (possibly after a delay).
      * @hide
      */
     @RequiresPermission("carrier privileges") // TODO (b/72967236): Define a system-wide constant
-    public void clearVcnConfig(@NonNull ParcelUuid subscriptionGroup) {
+    public void clearVcnConfig(@NonNull ParcelUuid subscriptionGroup) throws IOException {
         requireNonNull(subscriptionGroup, "subscriptionGroup was null");
 
         try {
             mService.clearVcnConfig(subscriptionGroup);
+        } catch (ServiceSpecificException e) {
+            throw new IOException(e);
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
diff --git a/core/java/android/os/BatteryStatsManager.java b/core/java/android/os/BatteryStatsManager.java
index a9585c6..258e58d 100644
--- a/core/java/android/os/BatteryStatsManager.java
+++ b/core/java/android/os/BatteryStatsManager.java
@@ -26,6 +26,7 @@
 import android.content.Context;
 import android.os.connectivity.CellularBatteryStats;
 import android.os.connectivity.WifiBatteryStats;
+import android.telephony.DataConnectionRealTimeInfo;
 
 import com.android.internal.app.IBatteryStats;
 
@@ -376,4 +377,50 @@
             e.rethrowFromSystemServer();
         }
     }
+
+    /**
+     * Indicates that the radio power state has changed.
+     *
+     * @param isActive indicates if the mobile radio is powered.
+     * @param uid Uid of this event. For the active state it represents the uid that was responsible
+     *            for waking the radio, or -1 if the system was responsible for waking the radio.
+     *            For inactive state, the UID should always be -1.
+     * @throws RuntimeException if there are binder remote-invocation errors.
+     */
+    @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
+    public void reportMobileRadioPowerState(boolean isActive, int uid) throws RuntimeException {
+        try {
+            mBatteryStats.noteMobileRadioPowerState(getDataConnectionPowerState(isActive),
+                    SystemClock.elapsedRealtimeNanos(), uid);
+        } catch (RemoteException e) {
+            e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Indicates that the wifi power state has changed.
+     *
+     * @param isActive indicates if the wifi radio is powered.
+     * @param uid Uid of this event. For the active state it represents the uid that was responsible
+     *            for waking the radio, or -1 if the system was responsible for waking the radio.
+     *            For inactive state, the UID should always be -1.
+     * @throws RuntimeException if there are binder remote-invocation errors.
+     */
+    @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
+    public void reportWifiRadioPowerState(boolean isActive, int uid) throws RuntimeException {
+        try {
+            mBatteryStats.noteWifiRadioPowerState(getDataConnectionPowerState(isActive),
+                    SystemClock.elapsedRealtimeNanos(), uid);
+        } catch (RemoteException e) {
+            e.rethrowFromSystemServer();
+        }
+    }
+
+    private static int getDataConnectionPowerState(boolean isActive) {
+        // TODO: DataConnectionRealTimeInfo is under telephony package but the constants are used
+        // for both Wifi and mobile. It would make more sense to separate the constants to a generic
+        // class or move it to generic package.
+        return isActive ? DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH
+                : DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
+    }
 }
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index 25d84ba..33dedda 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -282,8 +282,8 @@
     /**
      * Control network activity of a UID over interfaces with a quota limit.
      */
-    void setUidMeteredNetworkDenylist(int uid, boolean enable);
-    void setUidMeteredNetworkAllowlist(int uid, boolean enable);
+    void setUidOnMeteredNetworkDenylist(int uid, boolean enable);
+    void setUidOnMeteredNetworkAllowlist(int uid, boolean enable);
     boolean setDataSaverModeEnabled(boolean enable);
 
     void setUidCleartextNetworkPolicy(int uid, int policy);
diff --git a/core/java/android/os/IRecoverySystem.aidl b/core/java/android/os/IRecoverySystem.aidl
index 5f8b932..2052883 100644
--- a/core/java/android/os/IRecoverySystem.aidl
+++ b/core/java/android/os/IRecoverySystem.aidl
@@ -30,5 +30,6 @@
     boolean requestLskf(in String packageName, in IntentSender sender);
     boolean clearLskf(in String packageName);
     boolean isLskfCaptured(in String packageName);
+    boolean rebootWithLskfAssumeSlotSwitch(in String packageName, in String reason);
     boolean rebootWithLskf(in String packageName, in String reason, in boolean slotSwitch);
 }
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 189e62b..6713de8 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -687,8 +687,8 @@
     }
 
     /**
-     * Request that the device reboot and apply the update that has been prepared. Callers are
-     * recommended to use {@link #rebootAndApply(Context, String, boolean)} instead.
+     * Request that the device reboot and apply the update that has been prepared. This API is
+     * deprecated, and is expected to be used by OTA only on devices running Android 11.
      *
      * @param context the Context to use.
      * @param updateToken this parameter is deprecated and won't be used. See details in
@@ -699,18 +699,18 @@
      *               unattended reboot or if the {@code updateToken} did not match the previously
      *               given token
      * @hide
+     * @deprecated Use {@link #rebootAndApply(Context, String, boolean)} instead
      */
     @SystemApi
-    @RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
-            android.Manifest.permission.REBOOT})
+    @RequiresPermission(android.Manifest.permission.RECOVERY)
     public static void rebootAndApply(@NonNull Context context, @NonNull String updateToken,
             @NonNull String reason) throws IOException {
         if (updateToken == null) {
             throw new NullPointerException("updateToken == null");
         }
         RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);
-        // OTA is the sole user before S, and a slot switch is required for ota update.
-        if (!rs.rebootWithLskf(context.getPackageName(), reason, true)) {
+        // OTA is the sole user, who expects a slot switch.
+        if (!rs.rebootWithLskfAssumeSlotSwitch(context.getPackageName(), reason)) {
             throw new IOException("system not prepared to apply update");
         }
     }
@@ -738,7 +738,7 @@
      *
      * @param context the Context to use.
      * @param reason the reboot reason to give to the {@link PowerManager}
-     * @param slotSwitch true if the caller intends to switch the slot on an A/B device.
+     * @param slotSwitch true if the caller expects the slot to be switched on A/B devices.
      * @throws IOException if the reboot couldn't proceed because the device wasn't ready for an
      *               unattended reboot.
      * @hide
@@ -1387,6 +1387,21 @@
         }
     }
 
+
+    /**
+     * Calls the recovery system service to reboot and apply update. This is the legacy API and
+     * expects a slot switch for A/B devices.
+     *
+     */
+    private boolean rebootWithLskfAssumeSlotSwitch(String packageName, String reason)
+            throws IOException {
+        try {
+            return mService.rebootWithLskfAssumeSlotSwitch(packageName, reason);
+        } catch (RemoteException e) {
+            throw new IOException("could not reboot for update");
+        }
+    }
+
     /**
      * Internally, recovery treats each line of the command file as a separate
      * argv, so we only need to protect against newlines and nulls.
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index fa1b7d5..38a59f0 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -4305,13 +4305,23 @@
          * <P>
          * Type: INTEGER (A bitmask of CARRIER_PRESENCE_* fields)
          * </P>
+         *
+         * @deprecated The contacts database will only show presence
+         * information on devices where
+         * {@link android.telephony.CarrierConfigManager#KEY_USE_RCS_PRESENCE_BOOL} is true,
+         * otherwise use {@link android.telephony.ims.RcsUceAdapter}.
          */
+        @Deprecated
         public static final String CARRIER_PRESENCE = "carrier_presence";
 
         /**
          * Indicates that the entry is Video Telephony (VT) capable on the
          * current carrier. An allowed bitmask of {@link #CARRIER_PRESENCE}.
+         *
+         * @deprecated Same as {@link DataColumns#CARRIER_PRESENCE}.
+         *
          */
+        @Deprecated
         public static final int CARRIER_PRESENCE_VT_CAPABLE = 0x01;
 
         /**
diff --git a/core/java/android/provider/OWNERS b/core/java/android/provider/OWNERS
index b02102b..cb1509a 100644
--- a/core/java/android/provider/OWNERS
+++ b/core/java/android/provider/OWNERS
@@ -10,6 +10,7 @@
 per-file *Downloads* = file:platform/packages/providers/DownloadProvider:/OWNERS
 
 per-file *DeviceConfig* = file:/packages/SettingsProvider/OWNERS
+per-file *Settings* = file:/packages/SettingsProvider/OWNERS
 
 per-file *Documents* = file:/core/java/android/os/storage/OWNERS
 per-file *Documents* = file:platform/packages/apps/DocumentsUI:/OWNERS
diff --git a/core/java/com/android/internal/net/NetworkUtilsInternal.java b/core/java/com/android/internal/net/NetworkUtilsInternal.java
new file mode 100644
index 0000000..571d7e7
--- /dev/null
+++ b/core/java/com/android/internal/net/NetworkUtilsInternal.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.net;
+
+import static android.system.OsConstants.AF_INET;
+import static android.system.OsConstants.AF_INET6;
+
+import android.annotation.NonNull;
+import android.system.Os;
+
+/** @hide */
+public class NetworkUtilsInternal {
+
+    private static final int[] ADDRESS_FAMILIES = new int[] {AF_INET, AF_INET6};
+
+    /**
+     * Allow/Disallow creating AF_INET/AF_INET6 sockets and DNS lookups for current process.
+     *
+     * @param allowNetworking whether to allow or disallow creating AF_INET/AF_INET6 sockets
+     *                        and DNS lookups.
+     */
+    public static native void setAllowNetworkingForProcess(boolean allowNetworking);
+
+    /**
+     * Returns true if the hostname is weakly validated.
+     * @param hostname Name of host to validate.
+     * @return True if it's a valid-ish hostname.
+     *
+     * @hide
+     */
+    public static boolean isWeaklyValidatedHostname(@NonNull String hostname) {
+        // TODO(b/34953048): Use a validation method that permits more accurate,
+        // but still inexpensive, checking of likely valid DNS hostnames.
+        final String weakHostnameRegex = "^[a-zA-Z0-9_.-]+$";
+        if (!hostname.matches(weakHostnameRegex)) {
+            return false;
+        }
+
+        for (int address_family : ADDRESS_FAMILIES) {
+            if (Os.inet_pton(address_family, hostname) != null) {
+                return false;
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Safely multiple a value by a rational.
+     * <p>
+     * Internally it uses integer-based math whenever possible, but switches
+     * over to double-based math if values would overflow.
+     * @hide
+     */
+    public static long multiplySafeByRational(long value, long num, long den) {
+        if (den == 0) {
+            throw new ArithmeticException("Invalid Denominator");
+        }
+        long x = value;
+        long y = num;
+
+        // Logic shamelessly borrowed from Math.multiplyExact()
+        long r = x * y;
+        long ax = Math.abs(x);
+        long ay = Math.abs(y);
+        if (((ax | ay) >>> 31 != 0)) {
+            // Some bits greater than 2^31 that might cause overflow
+            // Check the result using the divide operator
+            // and check for the special case of Long.MIN_VALUE * -1
+            if (((y != 0) && (r / y != x))
+                    || (x == Long.MIN_VALUE && y == -1)) {
+                // Use double math to avoid overflowing
+                return (long) (((double) num / den) * value);
+            }
+        }
+        return r / den;
+    }
+}
diff --git a/core/java/com/android/internal/net/VpnProfile.java b/core/java/com/android/internal/net/VpnProfile.java
index a17f5f5..b7170d8 100644
--- a/core/java/com/android/internal/net/VpnProfile.java
+++ b/core/java/com/android/internal/net/VpnProfile.java
@@ -28,6 +28,7 @@
 import android.text.TextUtils;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.net.module.util.ProxyUtils;
 
 import java.net.InetAddress;
 import java.nio.charset.StandardCharsets;
@@ -285,10 +286,12 @@
                 String exclList = (values.length > 17) ? values[17] : "";
                 String pacFileUrl = (values.length > 18) ? values[18] : "";
                 if (!host.isEmpty() || !port.isEmpty() || !exclList.isEmpty()) {
-                    profile.proxy = new ProxyInfo(host, port.isEmpty() ?
-                            0 : Integer.parseInt(port), exclList);
+                    profile.proxy =
+                            ProxyInfo.buildDirectProxy(host, port.isEmpty() ?
+                                    0 : Integer.parseInt(port),
+                                    ProxyUtils.exclusionStringAsList(exclList));
                 } else if (!pacFileUrl.isEmpty()) {
-                    profile.proxy = new ProxyInfo(Uri.parse(pacFileUrl));
+                    profile.proxy = ProxyInfo.buildPacProxy(Uri.parse(pacFileUrl));
                 }
             } // else profile.proxy = null
 
@@ -337,8 +340,8 @@
             builder.append(VALUE_DELIMITER).append(proxy.getPort());
             builder.append(VALUE_DELIMITER)
                     .append(
-                            proxy.getExclusionListAsString() != null
-                                    ? proxy.getExclusionListAsString()
+                            ProxyUtils.exclusionListAsString(proxy.getExclusionList()) != null
+                                    ? ProxyUtils.exclusionListAsString(proxy.getExclusionList())
                                     : "");
             builder.append(VALUE_DELIMITER).append(proxy.getPacFileUrl().toString());
         } else {
diff --git a/core/java/com/android/internal/os/KernelWakelockReader.java b/core/java/com/android/internal/os/KernelWakelockReader.java
index e595db3..c416814 100644
--- a/core/java/com/android/internal/os/KernelWakelockReader.java
+++ b/core/java/com/android/internal/os/KernelWakelockReader.java
@@ -78,13 +78,16 @@
         boolean useSystemSuspend = (new File(sSysClassWakeupDir)).exists();
 
         if (useSystemSuspend) {
-            // Get both kernel and native wakelock stats from SystemSuspend
-            updateVersion(staleStats);
-            if (getWakelockStatsFromSystemSuspend(staleStats) == null) {
-                Slog.w(TAG, "Failed to get wakelock stats from SystemSuspend");
-                return null;
+            // static read/write lock protection for sKernelWakelockUpdateVersion
+            synchronized (KernelWakelockReader.class) {
+                // Get both kernel and native wakelock stats from SystemSuspend
+                updateVersion(staleStats);
+                if (getWakelockStatsFromSystemSuspend(staleStats) == null) {
+                    Slog.w(TAG, "Failed to get wakelock stats from SystemSuspend");
+                    return null;
+                }
+                return removeOldStats(staleStats);
             }
-            return removeOldStats(staleStats);
         } else {
             Arrays.fill(mKernelWakelockBuffer, (byte) 0);
             int len = 0;
@@ -141,14 +144,17 @@
                 }
             }
 
-            updateVersion(staleStats);
-            // Get native wakelock stats from SystemSuspend
-            if (getWakelockStatsFromSystemSuspend(staleStats) == null) {
-                Slog.w(TAG, "Failed to get Native wakelock stats from SystemSuspend");
+            // static read/write lock protection for sKernelWakelockUpdateVersion
+            synchronized (KernelWakelockReader.class) {
+                updateVersion(staleStats);
+                // Get native wakelock stats from SystemSuspend
+                if (getWakelockStatsFromSystemSuspend(staleStats) == null) {
+                    Slog.w(TAG, "Failed to get Native wakelock stats from SystemSuspend");
+                }
+                // Get kernel wakelock stats
+                parseProcWakelocks(mKernelWakelockBuffer, len, wakeup_sources, staleStats);
+                return removeOldStats(staleStats);
             }
-            // Get kernel wakelock stats
-            parseProcWakelocks(mKernelWakelockBuffer, len, wakeup_sources, staleStats);
-            return removeOldStats(staleStats);
         }
     }
 
diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java
index 15d4525..0381a75 100644
--- a/core/java/com/android/internal/os/Zygote.java
+++ b/core/java/com/android/internal/os/Zygote.java
@@ -24,7 +24,6 @@
 import android.net.Credentials;
 import android.net.LocalServerSocket;
 import android.net.LocalSocket;
-import android.net.NetworkUtils;
 import android.os.FactoryTest;
 import android.os.IVold;
 import android.os.Process;
@@ -35,6 +34,8 @@
 import android.system.Os;
 import android.util.Log;
 
+import com.android.internal.net.NetworkUtilsInternal;
+
 import dalvik.annotation.optimization.FastNative;
 import dalvik.system.ZygoteHooks;
 
@@ -352,7 +353,7 @@
 
             // If no GIDs were specified, don't make any permissions changes based on groups.
             if (gids != null && gids.length > 0) {
-                NetworkUtils.setAllowNetworkingForProcess(containsInetGid(gids));
+                NetworkUtilsInternal.setAllowNetworkingForProcess(containsInetGid(gids));
             }
         }
 
diff --git a/core/java/com/android/internal/util/OWNERS b/core/java/com/android/internal/util/OWNERS
index 8b9acd3..a045451 100644
--- a/core/java/com/android/internal/util/OWNERS
+++ b/core/java/com/android/internal/util/OWNERS
@@ -2,3 +2,4 @@
 per-file MessageUtils*, Protocol*, RingBuffer*, TokenBucket* = jchalard@google.com, lorenzo@google.com, satk@google.com
 per-file Protocol* = etancohen@google.com, lorenzo@google.com
 per-file State* = jchalard@google.com, lorenzo@google.com, satk@google.com
+per-file DataClass* = eugenesusla@google.com
\ No newline at end of file
diff --git a/core/java/com/android/server/net/BaseNetworkObserver.java b/core/java/com/android/server/net/BaseNetworkObserver.java
index 2a9c0b4..93f89b5 100644
--- a/core/java/com/android/server/net/BaseNetworkObserver.java
+++ b/core/java/com/android/server/net/BaseNetworkObserver.java
@@ -64,7 +64,8 @@
     }
 
     @Override
-    public void interfaceClassDataActivityChanged(String label, boolean active, long tsNanos) {
+    public void interfaceClassDataActivityChanged(int networkType, boolean active, long tsNanos,
+            int uid) {
         // default no-op
     }
 
diff --git a/core/jni/Android.bp b/core/jni/Android.bp
index 1968146..b4572fd 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -182,6 +182,7 @@
                 "android_content_res_Configuration.cpp",
                 "android_security_Scrypt.cpp",
                 "com_android_internal_content_om_OverlayConfig.cpp",
+                "com_android_internal_net_NetworkUtilsInternal.cpp",
                 "com_android_internal_os_ClassLoaderFactory.cpp",
                 "com_android_internal_os_FuseAppLoop.cpp",
                 "com_android_internal_os_KernelCpuUidBpfMapReader.cpp",
diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp
index 7b708ef..3198cb1 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -187,6 +187,7 @@
 extern int register_android_security_Scrypt(JNIEnv *env);
 extern int register_com_android_internal_content_NativeLibraryHelper(JNIEnv *env);
 extern int register_com_android_internal_content_om_OverlayConfig(JNIEnv *env);
+extern int register_com_android_internal_net_NetworkUtilsInternal(JNIEnv* env);
 extern int register_com_android_internal_os_ClassLoaderFactory(JNIEnv* env);
 extern int register_com_android_internal_os_FuseAppLoop(JNIEnv* env);
 extern int register_com_android_internal_os_KernelCpuUidBpfMapReader(JNIEnv *env);
@@ -1520,6 +1521,7 @@
         REG_JNI(register_android_os_SharedMemory),
         REG_JNI(register_android_os_incremental_IncrementalManager),
         REG_JNI(register_com_android_internal_content_om_OverlayConfig),
+        REG_JNI(register_com_android_internal_net_NetworkUtilsInternal),
         REG_JNI(register_com_android_internal_os_ClassLoaderFactory),
         REG_JNI(register_com_android_internal_os_Zygote),
         REG_JNI(register_com_android_internal_os_ZygoteInit),
diff --git a/core/jni/android_media_AudioDeviceAttributes.cpp b/core/jni/android_media_AudioDeviceAttributes.cpp
index e79c95e..2a16dce 100644
--- a/core/jni/android_media_AudioDeviceAttributes.cpp
+++ b/core/jni/android_media_AudioDeviceAttributes.cpp
@@ -31,7 +31,7 @@
                                  const AudioDeviceTypeAddr *devTypeAddr) {
     jint jStatus = (jint)AUDIO_JAVA_SUCCESS;
     jint jNativeType = (jint)devTypeAddr->mType;
-    ScopedLocalRef<jstring> jAddress(env, env->NewStringUTF(devTypeAddr->mAddress.data()));
+    ScopedLocalRef<jstring> jAddress(env, env->NewStringUTF(devTypeAddr->getAddress()));
 
     *jAudioDeviceAttributes = env->NewObject(gAudioDeviceAttributesClass, gAudioDeviceAttributesCstor,
             jNativeType, jAddress.get());
diff --git a/core/jni/android_media_AudioSystem.cpp b/core/jni/android_media_AudioSystem.cpp
index 7493e39..20e64ff 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -172,6 +172,8 @@
     jmethodID postRecordConfigEventFromNative;
 } gAudioPolicyEventHandlerMethods;
 
+static struct { jmethodID add; } gListMethods;
+
 //
 // JNI Initialization for OpenSLES routing
 //
@@ -292,25 +294,30 @@
     return old;
 }
 
-#define check_AudioSystem_Command(status) _check_AudioSystem_Command(__func__, (status))
+#define check_AudioSystem_Command(...) _check_AudioSystem_Command(__func__, __VA_ARGS__)
 
-static int _check_AudioSystem_Command(const char* caller, status_t status)
-{
-    ALOGE_IF(status, "Command failed for %s: %d", caller, status);
+static int _check_AudioSystem_Command(const char *caller, status_t status,
+                                      std::vector<status_t> ignoredErrors = {}) {
+    int jniStatus = kAudioStatusOk;
     switch (status) {
     case DEAD_OBJECT:
-        return kAudioStatusMediaServerDied;
+        jniStatus = kAudioStatusMediaServerDied;
+        break;
     case NO_ERROR:
-        return kAudioStatusOk;
+        break;
     default:
+        if (std::find(begin(ignoredErrors), end(ignoredErrors), status) == end(ignoredErrors)) {
+            jniStatus = kAudioStatusError;
+        }
         break;
     }
-    return kAudioStatusError;
+    ALOGE_IF(jniStatus != kAudioStatusOk, "Command failed for %s: %d", caller, status);
+    return jniStatus;
 }
 
 static jint getVectorOfAudioDeviceTypeAddr(JNIEnv *env, jintArray deviceTypes,
                                            jobjectArray deviceAddresses,
-                                           Vector<AudioDeviceTypeAddr> &audioDeviceTypeAddrVector) {
+                                           AudioDeviceTypeAddrVector &audioDeviceTypeAddrVector) {
     if (deviceTypes == nullptr || deviceAddresses == nullptr) {
         return (jint)AUDIO_JAVA_BAD_VALUE;
     }
@@ -337,7 +344,7 @@
         }
         const char *address = env->GetStringUTFChars((jstring)addrJobj, NULL);
         AudioDeviceTypeAddr dev = AudioDeviceTypeAddr((audio_devices_t)typesPtr[i], address);
-        audioDeviceTypeAddrVector.add(dev);
+        audioDeviceTypeAddrVector.push_back(dev);
         env->ReleaseStringUTFChars((jstring)addrJobj, address);
     }
     env->ReleaseIntArrayElements(deviceTypes, typesPtr, 0);
@@ -2063,7 +2070,7 @@
 
 static jint android_media_AudioSystem_setUidDeviceAffinities(JNIEnv *env, jobject clazz,
         jint uid, jintArray deviceTypes, jobjectArray deviceAddresses) {
-    Vector<AudioDeviceTypeAddr> deviceVector;
+    AudioDeviceTypeAddrVector deviceVector;
     jint results = getVectorOfAudioDeviceTypeAddr(env, deviceTypes, deviceAddresses, deviceVector);
     if (results != NO_ERROR) {
         return results;
@@ -2081,7 +2088,7 @@
 static jint android_media_AudioSystem_setUserIdDeviceAffinities(JNIEnv *env, jobject clazz,
                                                                 jint userId, jintArray deviceTypes,
                                                                 jobjectArray deviceAddresses) {
-    Vector<AudioDeviceTypeAddr> deviceVector;
+    AudioDeviceTypeAddrVector deviceVector;
     jint results = getVectorOfAudioDeviceTypeAddr(env, deviceTypes, deviceAddresses, deviceVector);
     if (results != NO_ERROR) {
         return results;
@@ -2362,48 +2369,124 @@
     return AudioSystem::isCallScreenModeSupported();
 }
 
-static jint
-android_media_AudioSystem_setPreferredDeviceForStrategy(JNIEnv *env, jobject thiz,
-        jint strategy, jint deviceType, jstring deviceAddress) {
-
-    const char *c_address = env->GetStringUTFChars(deviceAddress, NULL);
+static jint android_media_AudioSystem_setDevicesRoleForStrategy(JNIEnv *env, jobject thiz,
+                                                                jint strategy, jint role,
+                                                                jintArray jDeviceTypes,
+                                                                jobjectArray jDeviceAddresses) {
+    AudioDeviceTypeAddrVector nDevices;
+    jint results = getVectorOfAudioDeviceTypeAddr(env, jDeviceTypes, jDeviceAddresses, nDevices);
+    if (results != NO_ERROR) {
+        return results;
+    }
     int status = check_AudioSystem_Command(
-            AudioSystem::setPreferredDeviceForStrategy((product_strategy_t)strategy,
-                                                       AudioDeviceTypeAddr((audio_devices_t)
-                                                                                   deviceType,
-                                                                           c_address)));
-    env->ReleaseStringUTFChars(deviceAddress, c_address);
+            AudioSystem::setDevicesRoleForStrategy((product_strategy_t)strategy,
+                                                   (device_role_t)role, nDevices));
     return (jint) status;
 }
 
-static jint
-android_media_AudioSystem_removePreferredDeviceForStrategy(JNIEnv *env, jobject thiz, jint strategy)
-{
-    return (jint) check_AudioSystem_Command(
-            AudioSystem::removePreferredDeviceForStrategy((product_strategy_t) strategy));
+static jint android_media_AudioSystem_removeDevicesRoleForStrategy(JNIEnv *env, jobject thiz,
+                                                                   jint strategy, jint role) {
+    return (jint)
+            check_AudioSystem_Command(AudioSystem::removeDevicesRoleForStrategy((product_strategy_t)
+                                                                                        strategy,
+                                                                                (device_role_t)
+                                                                                        role),
+                                      {NAME_NOT_FOUND});
 }
 
-static jint
-android_media_AudioSystem_getPreferredDeviceForStrategy(JNIEnv *env, jobject thiz,
-        jint strategy, jobjectArray jDeviceArray)
-{
-    if (jDeviceArray == nullptr || env->GetArrayLength(jDeviceArray) != 1) {
-        ALOGE("%s invalid array to store AudioDeviceAttributes", __FUNCTION__);
-        return (jint)AUDIO_JAVA_BAD_VALUE;
-    }
-
-    AudioDeviceTypeAddr elDevice;
+static jint android_media_AudioSystem_getDevicesForRoleAndStrategy(JNIEnv *env, jobject thiz,
+                                                                   jint strategy, jint role,
+                                                                   jobject jDevices) {
+    AudioDeviceTypeAddrVector nDevices;
     status_t status = check_AudioSystem_Command(
-            AudioSystem::getPreferredDeviceForStrategy((product_strategy_t) strategy, elDevice));
+            AudioSystem::getDevicesForRoleAndStrategy((product_strategy_t)strategy,
+                                                      (device_role_t)role, nDevices));
     if (status != NO_ERROR) {
         return (jint) status;
     }
-    jobject jAudioDeviceAttributes = NULL;
-    jint jStatus = createAudioDeviceAttributesFromNative(env, &jAudioDeviceAttributes, &elDevice);
-    if (jStatus == AUDIO_JAVA_SUCCESS) {
-        env->SetObjectArrayElement(jDeviceArray, 0, jAudioDeviceAttributes);
+    for (const auto &device : nDevices) {
+        jobject jAudioDeviceAttributes = NULL;
+        jint jStatus = createAudioDeviceAttributesFromNative(env, &jAudioDeviceAttributes, &device);
+        if (jStatus != AUDIO_JAVA_SUCCESS) {
+            return jStatus;
+        }
+        env->CallBooleanMethod(jDevices, gListMethods.add, jAudioDeviceAttributes);
+        env->DeleteLocalRef(jAudioDeviceAttributes);
     }
-    return jStatus;
+    return AUDIO_JAVA_SUCCESS;
+}
+
+static jint android_media_AudioSystem_setDevicesRoleForCapturePreset(
+        JNIEnv *env, jobject thiz, jint capturePreset, jint role, jintArray jDeviceTypes,
+        jobjectArray jDeviceAddresses) {
+    AudioDeviceTypeAddrVector nDevices;
+    jint results = getVectorOfAudioDeviceTypeAddr(env, jDeviceTypes, jDeviceAddresses, nDevices);
+    if (results != NO_ERROR) {
+        return results;
+    }
+    int status = check_AudioSystem_Command(
+            AudioSystem::setDevicesRoleForCapturePreset((audio_source_t)capturePreset,
+                                                        (device_role_t)role, nDevices));
+    return (jint)status;
+}
+
+static jint android_media_AudioSystem_addDevicesRoleForCapturePreset(
+        JNIEnv *env, jobject thiz, jint capturePreset, jint role, jintArray jDeviceTypes,
+        jobjectArray jDeviceAddresses) {
+    AudioDeviceTypeAddrVector nDevices;
+    jint results = getVectorOfAudioDeviceTypeAddr(env, jDeviceTypes, jDeviceAddresses, nDevices);
+    if (results != NO_ERROR) {
+        return results;
+    }
+    int status = check_AudioSystem_Command(
+            AudioSystem::addDevicesRoleForCapturePreset((audio_source_t)capturePreset,
+                                                        (device_role_t)role, nDevices));
+    return (jint)status;
+}
+
+static jint android_media_AudioSystem_removeDevicesRoleForCapturePreset(
+        JNIEnv *env, jobject thiz, jint capturePreset, jint role, jintArray jDeviceTypes,
+        jobjectArray jDeviceAddresses) {
+    AudioDeviceTypeAddrVector nDevices;
+    jint results = getVectorOfAudioDeviceTypeAddr(env, jDeviceTypes, jDeviceAddresses, nDevices);
+    if (results != NO_ERROR) {
+        return results;
+    }
+    int status = check_AudioSystem_Command(
+            AudioSystem::removeDevicesRoleForCapturePreset((audio_source_t)capturePreset,
+                                                           (device_role_t)role, nDevices));
+    return (jint)status;
+}
+
+static jint android_media_AudioSystem_clearDevicesRoleForCapturePreset(JNIEnv *env, jobject thiz,
+                                                                       jint capturePreset,
+                                                                       jint role) {
+    return (jint)check_AudioSystem_Command(
+            AudioSystem::clearDevicesRoleForCapturePreset((audio_source_t)capturePreset,
+                                                          (device_role_t)role));
+}
+
+static jint android_media_AudioSystem_getDevicesForRoleAndCapturePreset(JNIEnv *env, jobject thiz,
+                                                                        jint capturePreset,
+                                                                        jint role,
+                                                                        jobject jDevices) {
+    AudioDeviceTypeAddrVector nDevices;
+    status_t status = check_AudioSystem_Command(
+            AudioSystem::getDevicesForRoleAndCapturePreset((audio_source_t)capturePreset,
+                                                           (device_role_t)role, nDevices));
+    if (status != NO_ERROR) {
+        return (jint)status;
+    }
+    for (const auto &device : nDevices) {
+        jobject jAudioDeviceAttributes = NULL;
+        jint jStatus = createAudioDeviceAttributesFromNative(env, &jAudioDeviceAttributes, &device);
+        if (jStatus != AUDIO_JAVA_SUCCESS) {
+            return jStatus;
+        }
+        env->CallBooleanMethod(jDevices, gListMethods.add, jAudioDeviceAttributes);
+        env->DeleteLocalRef(jAudioDeviceAttributes);
+    }
+    return AUDIO_JAVA_SUCCESS;
 }
 
 static jint
@@ -2551,12 +2634,22 @@
          {"setAudioHalPids", "([I)I", (void *)android_media_AudioSystem_setAudioHalPids},
          {"isCallScreeningModeSupported", "()Z",
           (void *)android_media_AudioSystem_isCallScreeningModeSupported},
-         {"setPreferredDeviceForStrategy", "(IILjava/lang/String;)I",
-          (void *)android_media_AudioSystem_setPreferredDeviceForStrategy},
-         {"removePreferredDeviceForStrategy", "(I)I",
-          (void *)android_media_AudioSystem_removePreferredDeviceForStrategy},
-         {"getPreferredDeviceForStrategy", "(I[Landroid/media/AudioDeviceAttributes;)I",
-          (void *)android_media_AudioSystem_getPreferredDeviceForStrategy},
+         {"setDevicesRoleForStrategy", "(II[I[Ljava/lang/String;)I",
+          (void *)android_media_AudioSystem_setDevicesRoleForStrategy},
+         {"removeDevicesRoleForStrategy", "(II)I",
+          (void *)android_media_AudioSystem_removeDevicesRoleForStrategy},
+         {"getDevicesForRoleAndStrategy", "(IILjava/util/List;)I",
+          (void *)android_media_AudioSystem_getDevicesForRoleAndStrategy},
+         {"setDevicesRoleForCapturePreset", "(II[I[Ljava/lang/String;)I",
+          (void *)android_media_AudioSystem_setDevicesRoleForCapturePreset},
+         {"addDevicesRoleForCapturePreset", "(II[I[Ljava/lang/String;)I",
+          (void *)android_media_AudioSystem_addDevicesRoleForCapturePreset},
+         {"removeDevicesRoleForCapturePreset", "(II[I[Ljava/lang/String;)I",
+          (void *)android_media_AudioSystem_removeDevicesRoleForCapturePreset},
+         {"clearDevicesRoleForCapturePreset", "(II)I",
+          (void *)android_media_AudioSystem_clearDevicesRoleForCapturePreset},
+         {"getDevicesForRoleAndCapturePreset", "(IILjava/util/List;)I",
+          (void *)android_media_AudioSystem_getDevicesForRoleAndCapturePreset},
          {"getDevicesForAttributes",
           "(Landroid/media/AudioAttributes;[Landroid/media/AudioDeviceAttributes;)I",
           (void *)android_media_AudioSystem_getDevicesForAttributes},
@@ -2758,6 +2851,9 @@
     gMidAudioRecordRoutingProxy_release =
             android::GetMethodIDOrDie(env, gClsAudioRecordRoutingProxy, "native_release", "()V");
 
+    jclass listClass = FindClassOrDie(env, "java/util/List");
+    gListMethods.add = GetMethodIDOrDie(env, listClass, "add", "(Ljava/lang/Object;)Z");
+
     AudioSystem::addErrorCallback(android_media_AudioSystem_error_callback);
 
     RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
diff --git a/core/jni/android_net_NetUtils.cpp b/core/jni/android_net_NetUtils.cpp
index 8d4c4e5..2155246 100644
--- a/core/jni/android_net_NetUtils.cpp
+++ b/core/jni/android_net_NetUtils.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright 2008, The Android Open Source Project
+ * Copyright 2020, The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -28,7 +28,6 @@
 #include <netinet/udp.h>
 
 #include <DnsProxydProtocol.h> // NETID_USE_LOCAL_NAMESERVERS
-#include <android_runtime/AndroidRuntime.h>
 #include <cutils/properties.h>
 #include <nativehelper/JNIPlatformHelp.h>
 #include <nativehelper/ScopedLocalRef.h>
@@ -226,11 +225,6 @@
             class_Network, ctor, dnsNetId & ~NETID_USE_LOCAL_NAMESERVERS, privateDnsBypass);
 }
 
-static void android_net_utils_setAllowNetworkingForProcess(JNIEnv *env, jobject thiz,
-                                                           jboolean hasConnectivity) {
-    setAllowNetworkingForProcess(hasConnectivity == JNI_TRUE);
-}
-
 static jobject android_net_utils_getTcpRepairWindow(JNIEnv *env, jobject thiz, jobject javaFd) {
     if (javaFd == NULL) {
         jniThrowNullPointerException(env, NULL);
@@ -288,7 +282,6 @@
     { "resNetworkResult", "(Ljava/io/FileDescriptor;)Landroid/net/DnsResolver$DnsResponse;", (void*) android_net_utils_resNetworkResult },
     { "resNetworkCancel", "(Ljava/io/FileDescriptor;)V", (void*) android_net_utils_resNetworkCancel },
     { "getDnsNetwork", "()Landroid/net/Network;", (void*) android_net_utils_getDnsNetwork },
-    { "setAllowNetworkingForProcess", "(Z)V", (void *)android_net_utils_setAllowNetworkingForProcess },
 };
 // clang-format on
 
diff --git a/core/jni/com_android_internal_net_NetworkUtilsInternal.cpp b/core/jni/com_android_internal_net_NetworkUtilsInternal.cpp
new file mode 100644
index 0000000..10fc18d
--- /dev/null
+++ b/core/jni/com_android_internal_net_NetworkUtilsInternal.cpp
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2020, The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "NetdClient.h"
+#include "core_jni_helpers.h"
+#include "jni.h"
+
+namespace android {
+static void android_net_utils_setAllowNetworkingForProcess(JNIEnv *env, jobject thiz,
+                                                           jboolean hasConnectivity) {
+    setAllowNetworkingForProcess(hasConnectivity == JNI_TRUE);
+}
+
+static const JNINativeMethod gNetworkUtilMethods[] = {
+        {"setAllowNetworkingForProcess", "(Z)V",
+         (void *)android_net_utils_setAllowNetworkingForProcess},
+};
+
+int register_com_android_internal_net_NetworkUtilsInternal(JNIEnv *env) {
+    return RegisterMethodsOrDie(env, "com/android/internal/net/NetworkUtilsInternal",
+                                gNetworkUtilMethods, NELEM(gNetworkUtilMethods));
+}
+
+} // namespace android
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java
index 83ff84d..56f7ea8 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java
@@ -309,7 +309,7 @@
         if (parameters != null) {
             for (KeyParameter p : parameters) {
                 if (p.tag == KeymasterDefs.KM_TAG_NONCE) {
-                    returnedIv = p.blob;
+                    returnedIv = p.value.getBlob();
                     break;
                 }
             }
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java
index aab84e3..64da837 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java
@@ -330,7 +330,7 @@
         if (parameters != null) {
             for (KeyParameter p : parameters) {
                 if (p.tag == KeymasterDefs.KM_TAG_NONCE) {
-                    returnedIv = p.blob;
+                    returnedIv = p.value.getBlob();
                     break;
                 }
             }
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java b/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
index 176507c..403da18 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
@@ -366,10 +366,10 @@
         for (Authorization a : response.metadata.authorizations) {
             switch (a.keyParameter.tag) {
                 case KeymasterDefs.KM_TAG_ALGORITHM:
-                    keymasterAlgorithm = a.keyParameter.integer;
+                    keymasterAlgorithm = a.keyParameter.value.getAlgorithm();
                     break;
                 case KeymasterDefs.KM_TAG_DIGEST:
-                    if (keymasterDigest == -1) keymasterDigest = a.keyParameter.integer;
+                    if (keymasterDigest == -1) keymasterDigest = a.keyParameter.value.getDigest();
                     break;
             }
         }
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSecretKeyFactorySpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSecretKeyFactorySpi.java
index 9d3b970..74503e1 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSecretKeyFactorySpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSecretKeyFactorySpi.java
@@ -102,7 +102,8 @@
                         insideSecureHardware =
                                 KeyStore2ParameterUtils.isSecureHardware(a.securityLevel);
                         securityLevel = a.securityLevel;
-                        origin = KeyProperties.Origin.fromKeymaster(a.keyParameter.integer);
+                        origin = KeyProperties.Origin.fromKeymaster(
+                                a.keyParameter.value.getOrigin());
                         break;
                     case KeymasterDefs.KM_TAG_KEY_SIZE:
                         long keySizeUnsigned = KeyStore2ParameterUtils.getUnsignedInt(a);
@@ -113,45 +114,51 @@
                         keySize = (int) keySizeUnsigned;
                         break;
                     case KeymasterDefs.KM_TAG_PURPOSE:
-                        purposes |= KeyProperties.Purpose.fromKeymaster(a.keyParameter.integer);
+                        purposes |= KeyProperties.Purpose.fromKeymaster(
+                                a.keyParameter.value.getKeyPurpose());
                         break;
                     case KeymasterDefs.KM_TAG_PADDING:
+                        int paddingMode = a.keyParameter.value.getPaddingMode();
                         try {
-                            if (a.keyParameter.integer == KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN
-                                    || a.keyParameter.integer == KeymasterDefs.KM_PAD_RSA_PSS) {
+                            if (paddingMode == KeymasterDefs.KM_PAD_RSA_PKCS1_1_5_SIGN
+                                    || paddingMode == KeymasterDefs.KM_PAD_RSA_PSS) {
                                 @KeyProperties.SignaturePaddingEnum String padding =
                                         KeyProperties.SignaturePadding.fromKeymaster(
-                                                a.keyParameter.integer);
+                                                paddingMode);
                                 signaturePaddingsList.add(padding);
                             } else {
                                 @KeyProperties.EncryptionPaddingEnum String jcaPadding =
                                         KeyProperties.EncryptionPadding.fromKeymaster(
-                                                a.keyParameter.integer);
+                                                paddingMode);
                                 encryptionPaddingsList.add(jcaPadding);
                             }
                         } catch (IllegalArgumentException e) {
                             throw new ProviderException("Unsupported padding: "
-                                                + a.keyParameter.integer);
+                                                + paddingMode);
                         }
                         break;
                     case KeymasterDefs.KM_TAG_DIGEST:
-                        digestsList.add(KeyProperties.Digest.fromKeymaster(a.keyParameter.integer));
+                        digestsList.add(KeyProperties.Digest.fromKeymaster(
+                                a.keyParameter.value.getDigest()));
                         break;
                     case KeymasterDefs.KM_TAG_BLOCK_MODE:
                         blockModesList.add(
-                                KeyProperties.BlockMode.fromKeymaster(a.keyParameter.integer)
+                                KeyProperties.BlockMode.fromKeymaster(
+                                        a.keyParameter.value.getBlockMode())
                         );
                         break;
                     case KeymasterDefs.KM_TAG_USER_AUTH_TYPE:
+                        int authenticatorType = a.keyParameter.value.getHardwareAuthenticatorType();
                         if (KeyStore2ParameterUtils.isSecureHardware(a.securityLevel)) {
-                            keymasterHwEnforcedUserAuthenticators = a.keyParameter.integer;
+                            keymasterHwEnforcedUserAuthenticators = authenticatorType;
                         } else {
-                            keymasterSwEnforcedUserAuthenticators = a.keyParameter.integer;
+                            keymasterSwEnforcedUserAuthenticators = authenticatorType;
                         }
                         break;
                     case KeymasterDefs.KM_TAG_USER_SECURE_ID:
                         keymasterSecureUserIds.add(
-                                KeymasterArguments.toUint64(a.keyParameter.longInteger));
+                                KeymasterArguments.toUint64(
+                                        a.keyParameter.value.getLongInteger()));
                         break;
                     case KeymasterDefs.KM_TAG_ACTIVE_DATETIME:
                         keyValidityStart = KeyStore2ParameterUtils.getDate(a);
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
index fd3d289..5c048a1 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
@@ -300,7 +300,7 @@
         if (parameters != null) {
             for (KeyParameter p : parameters) {
                 if (p.tag == KeymasterDefs.KM_TAG_NONCE) {
-                    returnedIv = p.blob;
+                    returnedIv = p.value.getBlob();
                     break;
                 }
             }
diff --git a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
index ae2e475..4c8ab8d 100644
--- a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
+++ b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
@@ -19,7 +19,9 @@
 import android.annotation.NonNull;
 import android.hardware.biometrics.BiometricManager;
 import android.hardware.security.keymint.KeyParameter;
+import android.hardware.security.keymint.KeyParameterValue;
 import android.hardware.security.keymint.SecurityLevel;
+import android.hardware.security.keymint.Tag;
 import android.security.GateKeeper;
 import android.security.keymaster.KeymasterDefs;
 import android.security.keystore.KeyProperties;
@@ -50,7 +52,7 @@
         }
         KeyParameter p = new KeyParameter();
         p.tag = tag;
-        p.boolValue = true;
+        p.value = KeyParameterValue.boolValue(true);
         return p;
     }
 
@@ -62,14 +64,40 @@
      * @hide
      */
     static @NonNull KeyParameter makeEnum(int tag, int v) {
-        int type = KeymasterDefs.getTagType(tag);
-        if (type != KeymasterDefs.KM_ENUM && type != KeymasterDefs.KM_ENUM_REP) {
-            throw new IllegalArgumentException("Not an enum or repeatable enum tag: " + tag);
+        KeyParameter kp = new KeyParameter();
+        kp.tag = tag;
+        switch (tag) {
+            case Tag.PURPOSE:
+                kp.value = KeyParameterValue.keyPurpose(v);
+                break;
+            case Tag.ALGORITHM:
+                kp.value = KeyParameterValue.algorithm(v);
+                break;
+            case Tag.BLOCK_MODE:
+                kp.value = KeyParameterValue.blockMode(v);
+                break;
+            case Tag.DIGEST:
+                kp.value = KeyParameterValue.digest(v);
+                break;
+            case Tag.EC_CURVE:
+                kp.value = KeyParameterValue.ecCurve(v);
+                break;
+            case Tag.ORIGIN:
+                kp.value = KeyParameterValue.origin(v);
+                break;
+            case Tag.PADDING:
+                kp.value = KeyParameterValue.paddingMode(v);
+                break;
+            case Tag.USER_AUTH_TYPE:
+                kp.value = KeyParameterValue.hardwareAuthenticatorType(v);
+                break;
+            case Tag.HARDWARE_TYPE:
+                kp.value = KeyParameterValue.securityLevel(v);
+                break;
+            default:
+                throw new IllegalArgumentException("Not an enum or repeatable enum tag: " + tag);
         }
-        KeyParameter p = new KeyParameter();
-        p.tag = tag;
-        p.integer = v;
-        return p;
+        return kp;
     }
 
     /**
@@ -86,7 +114,7 @@
         }
         KeyParameter p = new KeyParameter();
         p.tag = tag;
-        p.integer = v;
+        p.value = KeyParameterValue.integer(v);
         return p;
     }
 
@@ -104,7 +132,7 @@
         }
         KeyParameter p = new KeyParameter();
         p.tag = tag;
-        p.longInteger = v;
+        p.value = KeyParameterValue.longInteger(v);
         return p;
     }
 
@@ -121,7 +149,7 @@
         }
         KeyParameter p = new KeyParameter();
         p.tag = tag;
-        p.blob = b;
+        p.value = KeyParameterValue.blob(b);
         return p;
     }
 
@@ -138,9 +166,10 @@
         }
         KeyParameter p = new KeyParameter();
         p.tag = tag;
-        p.longInteger = date.getTime();
-        if (p.longInteger < 0) {
-            throw new IllegalArgumentException("Date tag value out of range: " + p.longInteger);
+        p.value = KeyParameterValue.dateTime(date.getTime());
+        if (p.value.getDateTime() < 0) {
+            throw new IllegalArgumentException("Date tag value out of range: "
+                    + p.value.getDateTime());
         }
         return p;
     }
@@ -160,18 +189,18 @@
             throw new IllegalArgumentException("Not an int tag: " + param.keyParameter.tag);
         }
         // KM_UINT is 32 bits wide so we must suppress sign extension.
-        return ((long) param.keyParameter.integer) & 0xffffffffL;
+        return ((long) param.keyParameter.value.getInteger()) & 0xffffffffL;
     }
 
     static @NonNull Date getDate(@NonNull Authorization param) {
         if (KeymasterDefs.getTagType(param.keyParameter.tag) != KeymasterDefs.KM_DATE) {
             throw new IllegalArgumentException("Not a date tag: " + param.keyParameter.tag);
         }
-        if (param.keyParameter.longInteger < 0) {
+        if (param.keyParameter.value.getDateTime() < 0) {
             throw new IllegalArgumentException("Date Value too large: "
-                    + param.keyParameter.longInteger);
+                    + param.keyParameter.value.getDateTime());
         }
-        return new Date(param.keyParameter.longInteger);
+        return new Date(param.keyParameter.value.getDateTime());
     }
 
     static void forEachSetFlag(int flags, Consumer<Integer> consumer) {
diff --git a/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java b/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java
index 3b11854..f87a3d2 100644
--- a/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java
+++ b/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java
@@ -57,7 +57,7 @@
         for (Authorization p : key.getAuthorizations()) {
             switch(p.keyParameter.tag) {
                 case KeymasterDefs.KM_TAG_USER_SECURE_ID:
-                    keySids.add(p.keyParameter.longInteger);
+                    keySids.add(p.keyParameter.value.getLongInteger());
                     break;
                 default:
                     break;
diff --git a/libs/androidfw/AssetManager2.cpp b/libs/androidfw/AssetManager2.cpp
index a545b3d..bec80a7 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -670,7 +670,7 @@
     }
 
     auto entry_flags = type_spec->GetFlagsForEntryIndex(entry_idx);
-    if (UNLIKELY(!entry_flags)) {
+    if (UNLIKELY(!entry_flags.has_value())) {
       return base::unexpected(entry_flags.error());
     }
     type_flags |= entry_flags.value();
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 4010e4e..bce70e2 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -897,12 +897,12 @@
             // Decode the UTF-16 length. This is not used if we're not
             // converting to UTF-16 from UTF-8.
             const base::expected<size_t, IOError> u16len = decodeLength(&str);
-            if (UNLIKELY(!u16len)) {
+            if (UNLIKELY(!u16len.has_value())) {
                 return base::unexpected(u16len.error());
             }
 
             const base::expected<size_t, IOError> u8len = decodeLength(&str);
-            if (UNLIKELY(!u8len)) {
+            if (UNLIKELY(!u8len.has_value())) {
                 return base::unexpected(u8len.error());
             }
 
diff --git a/libs/androidfw/ResourceUtils.cpp b/libs/androidfw/ResourceUtils.cpp
index a34aa72..87fb2c0 100644
--- a/libs/androidfw/ResourceUtils.cpp
+++ b/libs/androidfw/ResourceUtils.cpp
@@ -56,7 +56,8 @@
     .package_len = package_name.size(),
   };
 
-  if (base::expected<StringPiece, NullOrIOError> type_str = type_string_ref.string8()) {
+  if (base::expected<StringPiece, NullOrIOError> type_str = type_string_ref.string8();
+      type_str.ok()) {
     name.type = type_str->data();
     name.type_len = type_str->size();
   } else if (UNLIKELY(IsIOError(type_str))) {
@@ -64,7 +65,8 @@
   }
 
   if (name.type == nullptr) {
-    if (base::expected<StringPiece16, NullOrIOError> type16_str = type_string_ref.string16()) {
+    if (base::expected<StringPiece16, NullOrIOError> type16_str = type_string_ref.string16();
+        type16_str.ok()) {
       name.type16 = type16_str->data();
       name.type_len = type16_str->size();
     } else if (!type16_str.has_value()) {
@@ -72,7 +74,8 @@
     }
   }
 
-  if (base::expected<StringPiece, NullOrIOError> entry_str = entry_string_ref.string8()) {
+  if (base::expected<StringPiece, NullOrIOError> entry_str = entry_string_ref.string8();
+      entry_str.ok()) {
     name.entry = entry_str->data();
     name.entry_len = entry_str->size();
   } else if (UNLIKELY(IsIOError(entry_str))) {
@@ -80,7 +83,8 @@
   }
 
   if (name.entry == nullptr) {
-    if (base::expected<StringPiece16, NullOrIOError> entry16_str = entry_string_ref.string16()) {
+    if (base::expected<StringPiece16, NullOrIOError> entry16_str = entry_string_ref.string16();
+        entry16_str.ok()) {
       name.entry16 = entry16_str->data();
       name.entry_len = entry16_str->size();
     } else if (!entry16_str.has_value()) {
diff --git a/media/java/android/media/AudioDeviceAttributes.java b/media/java/android/media/AudioDeviceAttributes.java
index 0ab62c1..7caac89 100644
--- a/media/java/android/media/AudioDeviceAttributes.java
+++ b/media/java/android/media/AudioDeviceAttributes.java
@@ -72,6 +72,11 @@
     private final @Role int mRole;
 
     /**
+     * The internal audio device type
+     */
+    private final int mNativeType;
+
+    /**
      * @hide
      * Constructor from a valid {@link AudioDeviceInfo}
      * @param deviceInfo the connected audio device from which to obtain the device-identifying
@@ -83,6 +88,7 @@
         mRole = deviceInfo.isSink() ? ROLE_OUTPUT : ROLE_INPUT;
         mType = deviceInfo.getType();
         mAddress = deviceInfo.getAddress();
+        mNativeType = deviceInfo.getInternalType();
     }
 
     /**
@@ -101,9 +107,12 @@
         }
         if (role == ROLE_OUTPUT) {
             AudioDeviceInfo.enforceValidAudioDeviceTypeOut(type);
-        }
-        if (role == ROLE_INPUT) {
+            mNativeType = AudioDeviceInfo.convertDeviceTypeToInternalDevice(type);
+        } else if (role == ROLE_INPUT) {
             AudioDeviceInfo.enforceValidAudioDeviceTypeIn(type);
+            mNativeType = AudioDeviceInfo.convertDeviceTypeToInternalInputDevice(type);
+        } else {
+            mNativeType = AudioSystem.DEVICE_NONE;
         }
 
         mRole = role;
@@ -111,10 +120,17 @@
         mAddress = address;
     }
 
-    /*package*/ AudioDeviceAttributes(int nativeType, @NonNull String address) {
+    /**
+     * @hide
+     * Constructor from internal device type and address
+     * @param type the internal device type, as defined in {@link AudioSystem}
+     * @param address the address of the device, or an empty string for devices without one
+     */
+    public AudioDeviceAttributes(int nativeType, @NonNull String address) {
         mRole = (nativeType & AudioSystem.DEVICE_BIT_IN) != 0 ? ROLE_INPUT : ROLE_OUTPUT;
         mType = AudioDeviceInfo.convertInternalDeviceToDeviceType(nativeType);
         mAddress = address;
+        mNativeType = nativeType;
     }
 
     /**
@@ -147,6 +163,15 @@
         return mAddress;
     }
 
+    /**
+     * @hide
+     * Returns the internal device type of a device
+     * @return the internal device type
+     */
+    public int getInternalType() {
+        return mNativeType;
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(mRole, mType, mAddress);
@@ -172,10 +197,8 @@
     public String toString() {
         return new String("AudioDeviceAttributes:"
                 + " role:" + roleToString(mRole)
-                + " type:" + (mRole == ROLE_OUTPUT ? AudioSystem.getOutputDeviceName(
-                        AudioDeviceInfo.convertDeviceTypeToInternalDevice(mType))
-                        : AudioSystem.getInputDeviceName(
-                                AudioDeviceInfo.convertDeviceTypeToInternalDevice(mType)))
+                + " type:" + (mRole == ROLE_OUTPUT ? AudioSystem.getOutputDeviceName(mNativeType)
+                        : AudioSystem.getInputDeviceName(mNativeType))
                 + " addr:" + mAddress);
     }
 
@@ -189,12 +212,14 @@
         dest.writeInt(mRole);
         dest.writeInt(mType);
         dest.writeString(mAddress);
+        dest.writeInt(mNativeType);
     }
 
     private AudioDeviceAttributes(@NonNull Parcel in) {
         mRole = in.readInt();
         mType = in.readInt();
         mAddress = in.readString();
+        mNativeType = in.readInt();
     }
 
     public static final @NonNull Parcelable.Creator<AudioDeviceAttributes> CREATOR =
diff --git a/media/java/android/media/AudioDeviceInfo.java b/media/java/android/media/AudioDeviceInfo.java
index ff4a2562..f79fc92 100644
--- a/media/java/android/media/AudioDeviceInfo.java
+++ b/media/java/android/media/AudioDeviceInfo.java
@@ -350,6 +350,14 @@
     }
 
     /**
+     * @hide
+     * @return the internal device tyoe
+     */
+    public int getInternalType() {
+        return mPort.type();
+    }
+
+    /**
      * @return The internal device ID.
      */
     public int getId() {
@@ -512,10 +520,21 @@
         return INT_TO_EXT_DEVICE_MAPPING.get(intDevice, TYPE_UNKNOWN);
     }
 
+    /** @hide */
+    public static int convertDeviceTypeToInternalInputDevice(int deviceType) {
+        return EXT_TO_INT_INPUT_DEVICE_MAPPING.get(deviceType, AudioSystem.DEVICE_NONE);
+    }
+
     private static final SparseIntArray INT_TO_EXT_DEVICE_MAPPING;
 
     private static final SparseIntArray EXT_TO_INT_DEVICE_MAPPING;
 
+    /**
+     * EXT_TO_INT_INPUT_DEVICE_MAPPING aims at mapping external device type to internal input device
+     * type.
+     */
+    private static final SparseIntArray EXT_TO_INT_INPUT_DEVICE_MAPPING;
+
     static {
         INT_TO_EXT_DEVICE_MAPPING = new SparseIntArray();
         INT_TO_EXT_DEVICE_MAPPING.put(AudioSystem.DEVICE_OUT_EARPIECE, TYPE_BUILTIN_EARPIECE);
@@ -600,6 +619,32 @@
         EXT_TO_INT_DEVICE_MAPPING.put(TYPE_REMOTE_SUBMIX, AudioSystem.DEVICE_OUT_REMOTE_SUBMIX);
         EXT_TO_INT_DEVICE_MAPPING.put(TYPE_BLE_HEADSET, AudioSystem.DEVICE_OUT_BLE_HEADSET);
         EXT_TO_INT_DEVICE_MAPPING.put(TYPE_BLE_SPEAKER, AudioSystem.DEVICE_OUT_BLE_SPEAKER);
+
+        // privileges mapping to input device
+        EXT_TO_INT_INPUT_DEVICE_MAPPING = new SparseIntArray();
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_BUILTIN_MIC, AudioSystem.DEVICE_IN_BUILTIN_MIC);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(
+                TYPE_BLUETOOTH_SCO, AudioSystem.DEVICE_IN_BLUETOOTH_SCO_HEADSET);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(
+                TYPE_WIRED_HEADSET, AudioSystem.DEVICE_IN_WIRED_HEADSET);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_HDMI, AudioSystem.DEVICE_IN_HDMI);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_TELEPHONY, AudioSystem.DEVICE_IN_TELEPHONY_RX);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_DOCK, AudioSystem.DEVICE_IN_ANLG_DOCK_HEADSET);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(
+                TYPE_USB_ACCESSORY, AudioSystem.DEVICE_IN_USB_ACCESSORY);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_USB_DEVICE, AudioSystem.DEVICE_IN_USB_DEVICE);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_USB_HEADSET, AudioSystem.DEVICE_IN_USB_HEADSET);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_FM_TUNER, AudioSystem.DEVICE_IN_FM_TUNER);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_TV_TUNER, AudioSystem.DEVICE_IN_TV_TUNER);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_LINE_ANALOG, AudioSystem.DEVICE_IN_LINE);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_LINE_DIGITAL, AudioSystem.DEVICE_IN_SPDIF);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(
+                TYPE_BLUETOOTH_A2DP, AudioSystem.DEVICE_IN_BLUETOOTH_A2DP);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_IP, AudioSystem.DEVICE_IN_IP);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_BUS, AudioSystem.DEVICE_IN_BUS);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(
+                TYPE_REMOTE_SUBMIX, AudioSystem.DEVICE_IN_REMOTE_SUBMIX);
+        EXT_TO_INT_INPUT_DEVICE_MAPPING.put(TYPE_BLE_HEADSET, AudioSystem.DEVICE_IN_BLE_HEADSET);
     }
 }
 
diff --git a/media/java/android/media/AudioManager.java b/media/java/android/media/AudioManager.java
index 107d656..7dff0c2 100755
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -75,6 +75,7 @@
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -1598,21 +1599,14 @@
     @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
     public boolean setPreferredDeviceForStrategy(@NonNull AudioProductStrategy strategy,
             @NonNull AudioDeviceAttributes device) {
-        Objects.requireNonNull(strategy);
-        Objects.requireNonNull(device);
-        try {
-            final int status =
-                    getService().setPreferredDeviceForStrategy(strategy.getId(), device);
-            return status == AudioSystem.SUCCESS;
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
+        return setPreferredDevicesForStrategy(strategy, Arrays.asList(device));
     }
 
     /**
      * @hide
-     * Removes the preferred audio device previously set with
-     * {@link #setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceAttributes)}.
+     * Removes the preferred audio device(s) previously set with
+     * {@link #setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceAttributes)} or
+     * {@link #setPreferredDevicesForStrategy(AudioProductStrategy, List<AudioDeviceAttributes>)}.
      * @param strategy the audio strategy whose routing will be affected
      * @return true if the operation was successful, false otherwise (invalid strategy, or no
      *     device set for example)
@@ -1623,7 +1617,7 @@
         Objects.requireNonNull(strategy);
         try {
             final int status =
-                    getService().removePreferredDeviceForStrategy(strategy.getId());
+                    getService().removePreferredDevicesForStrategy(strategy.getId());
             return status == AudioSystem.SUCCESS;
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
@@ -1633,18 +1627,74 @@
     /**
      * @hide
      * Return the preferred device for an audio strategy, previously set with
+     * {@link #setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceAttributes)} or
+     * {@link #setPreferredDevicesForStrategy(AudioProductStrategy, List<AudioDeviceAttributes>)}
+     * @param strategy the strategy to query
+     * @return the preferred device for that strategy, if multiple devices are set as preferred
+     *    devices, the first one in the list will be returned. Null will be returned if none was
+     *    ever set or if the strategy is invalid
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @Nullable
+    public AudioDeviceAttributes getPreferredDeviceForStrategy(
+            @NonNull AudioProductStrategy strategy) {
+        List<AudioDeviceAttributes> devices = getPreferredDevicesForStrategy(strategy);
+        return devices.isEmpty() ? null : devices.get(0);
+    }
+
+    /**
+     * @hide
+     * Set the preferred devices for a given strategy, i.e. the audio routing to be used by
+     * this audio strategy. Note that the devices may not be available at the time the preferred
+     * devices is set, but it will be used once made available.
+     * <p>Use {@link #removePreferredDeviceForStrategy(AudioProductStrategy)} to cancel setting
+     * this preference for this strategy.</p>
+     * Note that the list of devices is not a list ranked by preference, but a list of one or more
+     * devices used simultaneously to output the same audio signal.
+     * @param strategy the audio strategy whose routing will be affected
+     * @param devices a non-empty list of the audio devices to route to when available
+     * @return true if the operation was successful, false otherwise
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    public boolean setPreferredDevicesForStrategy(@NonNull AudioProductStrategy strategy,
+                                                  @NonNull List<AudioDeviceAttributes> devices) {
+        Objects.requireNonNull(strategy);
+        Objects.requireNonNull(devices);
+        if (devices.isEmpty()) {
+            throw new IllegalArgumentException(
+                    "Tried to set preferred devices for strategy with a empty list");
+        }
+        for (AudioDeviceAttributes device : devices) {
+            Objects.requireNonNull(device);
+        }
+        try {
+            final int status =
+                    getService().setPreferredDevicesForStrategy(strategy.getId(), devices);
+            return status == AudioSystem.SUCCESS;
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * @hide
+     * Return the preferred devices for an audio strategy, previously set with
      * {@link #setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceAttributes)}
+     * {@link #setPreferredDevicesForStrategy(AudioProductStrategy, List<AudioDeviceAttributes>)}
      * @param strategy the strategy to query
      * @return the preferred device for that strategy, or null if none was ever set or if the
      *    strategy is invalid
      */
     @SystemApi
     @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
-    public @Nullable AudioDeviceAttributes getPreferredDeviceForStrategy(
+    @NonNull
+    public List<AudioDeviceAttributes> getPreferredDevicesForStrategy(
             @NonNull AudioProductStrategy strategy) {
         Objects.requireNonNull(strategy);
         try {
-            return getService().getPreferredDeviceForStrategy(strategy.getId());
+            return getService().getPreferredDevicesForStrategy(strategy.getId());
         } catch (RemoteException e) {
             throw e.rethrowFromSystemServer();
         }
@@ -1656,6 +1706,7 @@
      * strategy.
      * <p>Note that this listener will only be invoked whenever
      * {@link #setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceAttributes)} or
+     * {@link #setPreferredDevicesForStrategy(AudioProductStrategy, List<AudioDeviceAttributes>)}
      * {@link #removePreferredDeviceForStrategy(AudioProductStrategy)} causes a change in
      * preferred device. It will not be invoked directly after registration with
      * {@link #addOnPreferredDeviceForStrategyChangedListener(Executor, OnPreferredDeviceForStrategyChangedListener)}
@@ -1663,8 +1714,10 @@
      * @see #setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceAttributes)
      * @see #removePreferredDeviceForStrategy(AudioProductStrategy)
      * @see #getPreferredDeviceForStrategy(AudioProductStrategy)
+     * @deprecated use #OnPreferredDevicesForStrategyChangedListener
      */
     @SystemApi
+    @Deprecated
     public interface OnPreferredDeviceForStrategyChangedListener {
         /**
          * Called on the listener to indicate that the preferred audio device for the given
@@ -1679,6 +1732,70 @@
 
     /**
      * @hide
+     * Interface to be notified of changes in the preferred audio devices set for a given audio
+     * strategy.
+     * <p>Note that this listener will only be invoked whenever
+     * {@link #setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceAttributes)} or
+     * {@link #setPreferredDevicesForStrategy(AudioProductStrategy, List<AudioDeviceAttributes>)}
+     * {@link #removePreferredDeviceForStrategy(AudioProductStrategy)} causes a change in
+     * preferred device(s). It will not be invoked directly after registration with
+     * {@link #addOnPreferredDevicesForStrategyChangedListener(
+     * Executor, OnPreferredDevicesForStrategyChangedListener)}
+     * to indicate which strategies had preferred devices at the time of registration.</p>
+     * @see #setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceAttributes)
+     * @see #setPreferredDevicesForStrategy(AudioProductStrategy, List)
+     * @see #removePreferredDeviceForStrategy(AudioProductStrategy)
+     * @see #getPreferredDeviceForStrategy(AudioProductStrategy)
+     * @see #getPreferredDevicesForStrategy(AudioProductStrategy)
+     */
+    @SystemApi
+    public interface OnPreferredDevicesForStrategyChangedListener {
+        /**
+         * Called on the listener to indicate that the preferred audio devices for the given
+         * strategy has changed.
+         * @param strategy the {@link AudioProductStrategy} whose preferred device changed
+         * @param devices a list of newly set preferred audio devices
+         */
+        void onPreferredDevicesForStrategyChanged(@NonNull AudioProductStrategy strategy,
+                                                  @NonNull List<AudioDeviceAttributes> devices);
+    }
+
+    /**
+     * @hide
+     * Adds a listener for being notified of changes to the strategy-preferred audio device.
+     * @param executor
+     * @param listener
+     * @throws SecurityException if the caller doesn't hold the required permission
+     * @deprecated use {@link #addOnPreferredDevicesForStrategyChangedListener(
+     *             Executor, AudioManager.OnPreferredDevicesForStrategyChangedListener)} instead
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @Deprecated
+    public void addOnPreferredDeviceForStrategyChangedListener(
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull OnPreferredDeviceForStrategyChangedListener listener)
+            throws SecurityException {
+        // No-op, the method is deprecated.
+    }
+
+    /**
+     * @hide
+     * Removes a previously added listener of changes to the strategy-preferred audio device.
+     * @param listener
+     * @deprecated use {@link #removeOnPreferredDevicesForStrategyChangedListener(
+     *             AudioManager.OnPreferredDevicesForStrategyChangedListener)} instead
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    @Deprecated
+    public void removeOnPreferredDeviceForStrategyChangedListener(
+            @NonNull OnPreferredDeviceForStrategyChangedListener listener) {
+        // No-op, the method is deprecated.
+    }
+
+    /**
+     * @hide
      * Adds a listener for being notified of changes to the strategy-preferred audio device.
      * @param executor
      * @param listener
@@ -1686,16 +1803,16 @@
      */
     @SystemApi
     @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
-    public void addOnPreferredDeviceForStrategyChangedListener(
+    public void addOnPreferredDevicesForStrategyChangedListener(
             @NonNull @CallbackExecutor Executor executor,
-            @NonNull OnPreferredDeviceForStrategyChangedListener listener)
+            @NonNull OnPreferredDevicesForStrategyChangedListener listener)
             throws SecurityException {
         Objects.requireNonNull(executor);
         Objects.requireNonNull(listener);
         synchronized (mPrefDevListenerLock) {
             if (hasPrefDevListener(listener)) {
                 throw new IllegalArgumentException(
-                        "attempt to call addOnPreferredDeviceForStrategyChangedListener() "
+                        "attempt to call addOnPreferredDevicesForStrategyChangedListener() "
                                 + "on a previously registered listener");
             }
             // lazy initialization of the list of strategy-preferred device listener
@@ -1707,10 +1824,10 @@
             if (oldCbCount == 0 && mPrefDevListeners.size() > 0) {
                 // register binder for callbacks
                 if (mPrefDevDispatcherStub == null) {
-                    mPrefDevDispatcherStub = new StrategyPreferredDeviceDispatcherStub();
+                    mPrefDevDispatcherStub = new StrategyPreferredDevicesDispatcherStub();
                 }
                 try {
-                    getService().registerStrategyPreferredDeviceDispatcher(mPrefDevDispatcherStub);
+                    getService().registerStrategyPreferredDevicesDispatcher(mPrefDevDispatcherStub);
                 } catch (RemoteException e) {
                     throw e.rethrowFromSystemServer();
                 }
@@ -1725,8 +1842,8 @@
      */
     @SystemApi
     @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
-    public void removeOnPreferredDeviceForStrategyChangedListener(
-            @NonNull OnPreferredDeviceForStrategyChangedListener listener) {
+    public void removeOnPreferredDevicesForStrategyChangedListener(
+            @NonNull OnPreferredDevicesForStrategyChangedListener listener) {
         Objects.requireNonNull(listener);
         synchronized (mPrefDevListenerLock) {
             if (!removePrefDevListener(listener)) {
@@ -1737,7 +1854,7 @@
             if (mPrefDevListeners.size() == 0) {
                 // unregister binder for callbacks
                 try {
-                    getService().unregisterStrategyPreferredDeviceDispatcher(
+                    getService().unregisterStrategyPreferredDevicesDispatcher(
                             mPrefDevDispatcherStub);
                 } catch (RemoteException e) {
                     throw e.rethrowFromSystemServer();
@@ -1759,23 +1876,23 @@
     private @Nullable ArrayList<PrefDevListenerInfo> mPrefDevListeners;
 
     private static class PrefDevListenerInfo {
-        final @NonNull OnPreferredDeviceForStrategyChangedListener mListener;
+        final @NonNull OnPreferredDevicesForStrategyChangedListener mListener;
         final @NonNull Executor mExecutor;
-        PrefDevListenerInfo(OnPreferredDeviceForStrategyChangedListener listener, Executor exe) {
+        PrefDevListenerInfo(OnPreferredDevicesForStrategyChangedListener listener, Executor exe) {
             mListener = listener;
             mExecutor = exe;
         }
     }
 
     @GuardedBy("mPrefDevListenerLock")
-    private StrategyPreferredDeviceDispatcherStub mPrefDevDispatcherStub;
+    private StrategyPreferredDevicesDispatcherStub mPrefDevDispatcherStub;
 
-    private final class StrategyPreferredDeviceDispatcherStub
-            extends IStrategyPreferredDeviceDispatcher.Stub {
+    private final class StrategyPreferredDevicesDispatcherStub
+            extends IStrategyPreferredDevicesDispatcher.Stub {
 
         @Override
-        public void dispatchPrefDeviceChanged(int strategyId,
-                                              @Nullable AudioDeviceAttributes device) {
+        public void dispatchPrefDevicesChanged(int strategyId,
+                                               @NonNull List<AudioDeviceAttributes> devices) {
             // make a shallow copy of listeners so callback is not executed under lock
             final ArrayList<PrefDevListenerInfo> prefDevListeners;
             synchronized (mPrefDevListenerLock) {
@@ -1790,7 +1907,7 @@
             try {
                 for (PrefDevListenerInfo info : prefDevListeners) {
                     info.mExecutor.execute(() ->
-                            info.mListener.onPreferredDeviceForStrategyChanged(strategy, device));
+                            info.mListener.onPreferredDevicesForStrategyChanged(strategy, devices));
                 }
             } finally {
                 Binder.restoreCallingIdentity(ident);
@@ -1800,7 +1917,7 @@
 
     @GuardedBy("mPrefDevListenerLock")
     private @Nullable PrefDevListenerInfo getPrefDevListenerInfo(
-            OnPreferredDeviceForStrategyChangedListener listener) {
+            OnPreferredDevicesForStrategyChangedListener listener) {
         if (mPrefDevListeners == null) {
             return null;
         }
@@ -1813,7 +1930,7 @@
     }
 
     @GuardedBy("mPrefDevListenerLock")
-    private boolean hasPrefDevListener(OnPreferredDeviceForStrategyChangedListener listener) {
+    private boolean hasPrefDevListener(OnPreferredDevicesForStrategyChangedListener listener) {
         return getPrefDevListenerInfo(listener) != null;
     }
 
@@ -1821,7 +1938,7 @@
     /**
      * @return true if the listener was removed from the list
      */
-    private boolean removePrefDevListener(OnPreferredDeviceForStrategyChangedListener listener) {
+    private boolean removePrefDevListener(OnPreferredDevicesForStrategyChangedListener listener) {
         final PrefDevListenerInfo infoToRemove = getPrefDevListenerInfo(listener);
         if (infoToRemove != null) {
             mPrefDevListeners.remove(infoToRemove);
@@ -1831,6 +1948,349 @@
     }
 
     //====================================================================
+    // Audio Capture Preset routing
+
+    /**
+     * @hide
+     * Set the preferred device for a given capture preset, i.e. the audio routing to be used by
+     * this capture preset. Note that the device may not be available at the time the preferred
+     * device is set, but it will be used once made available.
+     * <p>Use {@link #clearPreferredDevicesForCapturePreset(int)} to cancel setting this preference
+     * for this capture preset.</p>
+     * @param capturePreset the audio capture preset whose routing will be affected
+     * @param device the audio device to route to when available
+     * @return true if the operation was successful, false otherwise
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    public boolean setPreferredDeviceForCapturePreset(int capturePreset,
+                                                      @NonNull AudioDeviceAttributes device) {
+        return setPreferredDevicesForCapturePreset(capturePreset, Arrays.asList(device));
+    }
+
+    /**
+     * @hide
+     * Remove all the preferred audio devices previously set
+     * @param capturePreset the audio capture preset whose routing will be affected
+     * @return true if the operation was successful, false otherwise (invalid capture preset, or no
+     *     device set for example)
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    public boolean clearPreferredDevicesForCapturePreset(int capturePreset) {
+        if (!MediaRecorder.isValidAudioSource(capturePreset)) {
+            return false;
+        }
+        try {
+            final int status = getService().clearPreferredDevicesForCapturePreset(capturePreset);
+            return status == AudioSystem.SUCCESS;
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * @hide
+     * Return the preferred devices for an audio capture preset, previously set with
+     * {@link #setPreferredDeviceForCapturePreset(int, AudioDeviceAttributes)}
+     * @param capturePreset the capture preset to query
+     * @return a list that contains preferred devices for that capture preset.
+     */
+    @NonNull
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    public List<AudioDeviceAttributes> getPreferredDevicesForCapturePreset(int capturePreset) {
+        if (!MediaRecorder.isValidAudioSource(capturePreset)) {
+            return new ArrayList<AudioDeviceAttributes>();
+        }
+        try {
+            return getService().getPreferredDevicesForCapturePreset(capturePreset);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    private boolean setPreferredDevicesForCapturePreset(
+            int capturePreset, @NonNull List<AudioDeviceAttributes> devices) {
+        Objects.requireNonNull(devices);
+        if (!MediaRecorder.isValidAudioSource(capturePreset)) {
+            return false;
+        }
+        if (devices.size() != 1) {
+            throw new IllegalArgumentException(
+                    "Only support setting one preferred devices for capture preset");
+        }
+        for (AudioDeviceAttributes device : devices) {
+            Objects.requireNonNull(device);
+        }
+        try {
+            final int status =
+                    getService().setPreferredDevicesForCapturePreset(capturePreset, devices);
+            return status == AudioSystem.SUCCESS;
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * @hide
+     * Interface to be notified of changes in the preferred audio devices set for a given capture
+     * preset.
+     * <p>Note that this listener will only be invoked whenever
+     * {@link #setPreferredDeviceForCapturePreset(int, AudioDeviceAttributes)} or
+     * {@link #clearPreferredDevicesForCapturePreset(int)} causes a change in
+     * preferred device. It will not be invoked directly after registration with
+     * {@link #addOnPreferredDevicesForCapturePresetChangedListener(
+     * Executor, OnPreferredDevicesForCapturePresetChangedListener)}
+     * to indicate which strategies had preferred devices at the time of registration.</p>
+     * @see #setPreferredDeviceForCapturePreset(int, AudioDeviceAttributes)
+     * @see #clearPreferredDevicesForCapturePreset(int)
+     * @see #getPreferredDevicesForCapturePreset(int)
+     */
+    @SystemApi
+    public interface OnPreferredDevicesForCapturePresetChangedListener {
+        /**
+         * Called on the listener to indicate that the preferred audio devices for the given
+         * capture preset has changed.
+         * @param capturePreset the capture preset whose preferred device changed
+         * @param devices a list of newly set preferred audio devices
+         */
+        void onPreferredDevicesForCapturePresetChanged(
+                int capturePreset, @NonNull List<AudioDeviceAttributes> devices);
+    }
+
+    /**
+     * @hide
+     * Adds a listener for being notified of changes to the capture-preset-preferred audio device.
+     * @param executor
+     * @param listener
+     * @throws SecurityException if the caller doesn't hold the required permission
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    public void addOnPreferredDevicesForCapturePresetChangedListener(
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull OnPreferredDevicesForCapturePresetChangedListener listener)
+            throws SecurityException {
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(listener);
+        int status = addOnDevRoleForCapturePresetChangedListener(
+                executor, listener, AudioSystem.DEVICE_ROLE_PREFERRED);
+        if (status == AudioSystem.ERROR) {
+            // This must not happen
+            throw new RuntimeException("Unknown error happened");
+        }
+        if (status == AudioSystem.BAD_VALUE) {
+            throw new IllegalArgumentException(
+                    "attempt to call addOnPreferredDevicesForCapturePresetChangedListener() "
+                            + "on a previously registered listener");
+        }
+    }
+
+    /**
+     * @hide
+     * Removes a previously added listener of changes to the capture-preset-preferred audio device.
+     * @param listener
+     */
+    @SystemApi
+    @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+    public void removeOnPreferredDevicesForCapturePresetChangedListener(
+            @NonNull OnPreferredDevicesForCapturePresetChangedListener listener) {
+        Objects.requireNonNull(listener);
+        int status = removeOnDevRoleForCapturePresetChangedListener(
+                listener, AudioSystem.DEVICE_ROLE_PREFERRED);
+        if (status == AudioSystem.ERROR) {
+            // This must not happen
+            throw new RuntimeException("Unknown error happened");
+        }
+        if (status == AudioSystem.BAD_VALUE) {
+            throw new IllegalArgumentException(
+                    "attempt to call removeOnPreferredDevicesForCapturePresetChangedListener() "
+                            + "on an unregistered listener");
+        }
+    }
+
+    private <T> int addOnDevRoleForCapturePresetChangedListener(
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull T listener, int deviceRole) {
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(listener);
+        DevRoleListeners<T> devRoleListeners =
+                (DevRoleListeners<T>) mDevRoleForCapturePresetListeners.get(deviceRole);
+        if (devRoleListeners == null) {
+            return AudioSystem.ERROR;
+        }
+        synchronized (devRoleListeners.mDevRoleListenersLock) {
+            if (devRoleListeners.hasDevRoleListener(listener)) {
+                return AudioSystem.BAD_VALUE;
+            }
+            // lazy initialization of the list of device role listener
+            if (devRoleListeners.mListenerInfos == null) {
+                devRoleListeners.mListenerInfos = new ArrayList<>();
+            }
+            final int oldCbCount = devRoleListeners.mListenerInfos.size();
+            devRoleListeners.mListenerInfos.add(new DevRoleListenerInfo<T>(executor, listener));
+            if (oldCbCount == 0 && devRoleListeners.mListenerInfos.size() > 0) {
+                // register binder for callbacks
+                synchronized (mDevRoleForCapturePresetListenersLock) {
+                    int deviceRoleListenerStatus = mDeviceRoleListenersStatus;
+                    mDeviceRoleListenersStatus |= (1 << deviceRole);
+                    if (deviceRoleListenerStatus != 0) {
+                        // There are already device role changed listeners active.
+                        return AudioSystem.SUCCESS;
+                    }
+                    if (mDevicesRoleForCapturePresetDispatcherStub == null) {
+                        mDevicesRoleForCapturePresetDispatcherStub =
+                                new CapturePresetDevicesRoleDispatcherStub();
+                    }
+                    try {
+                        getService().registerCapturePresetDevicesRoleDispatcher(
+                                mDevicesRoleForCapturePresetDispatcherStub);
+                    } catch (RemoteException e) {
+                        throw e.rethrowFromSystemServer();
+                    }
+                }
+            }
+        }
+        return AudioSystem.SUCCESS;
+    }
+
+    private <T> int removeOnDevRoleForCapturePresetChangedListener(
+            @NonNull T listener, int deviceRole) {
+        Objects.requireNonNull(listener);
+        DevRoleListeners<T> devRoleListeners =
+                (DevRoleListeners<T>) mDevRoleForCapturePresetListeners.get(deviceRole);
+        if (devRoleListeners == null) {
+            return AudioSystem.ERROR;
+        }
+        synchronized (devRoleListeners.mDevRoleListenersLock) {
+            if (!devRoleListeners.removeDevRoleListener(listener)) {
+                return AudioSystem.BAD_VALUE;
+            }
+            if (devRoleListeners.mListenerInfos.size() == 0) {
+                // unregister binder for callbacks
+                synchronized (mDevRoleForCapturePresetListenersLock) {
+                    mDeviceRoleListenersStatus ^= (1 << deviceRole);
+                    if (mDeviceRoleListenersStatus != 0) {
+                        // There are some other device role changed listeners active.
+                        return AudioSystem.SUCCESS;
+                    }
+                    try {
+                        getService().unregisterCapturePresetDevicesRoleDispatcher(
+                                mDevicesRoleForCapturePresetDispatcherStub);
+                    } catch (RemoteException e) {
+                        throw e.rethrowFromSystemServer();
+                    }
+                }
+            }
+        }
+        return AudioSystem.SUCCESS;
+    }
+
+    private final Map<Integer, Object> mDevRoleForCapturePresetListeners = new HashMap<>(){{
+            put(AudioSystem.DEVICE_ROLE_PREFERRED,
+                    new DevRoleListeners<OnPreferredDevicesForCapturePresetChangedListener>());
+        }};
+
+    private class DevRoleListenerInfo<T> {
+        final @NonNull Executor mExecutor;
+        final @NonNull T mListener;
+        DevRoleListenerInfo(Executor executor, T listener) {
+            mExecutor = executor;
+            mListener = listener;
+        }
+    }
+
+    private class DevRoleListeners<T> {
+        private final Object mDevRoleListenersLock = new Object();
+        @GuardedBy("mDevRoleListenersLock")
+        private @Nullable ArrayList<DevRoleListenerInfo<T>> mListenerInfos;
+
+        @GuardedBy("mDevRoleListenersLock")
+        private @Nullable DevRoleListenerInfo<T> getDevRoleListenerInfo(T listener) {
+            if (mListenerInfos == null) {
+                return null;
+            }
+            for (DevRoleListenerInfo<T> listenerInfo : mListenerInfos) {
+                if (listenerInfo.mListener == listener) {
+                    return listenerInfo;
+                }
+            }
+            return null;
+        }
+
+        @GuardedBy("mDevRoleListenersLock")
+        private boolean hasDevRoleListener(T listener) {
+            return getDevRoleListenerInfo(listener) != null;
+        }
+
+        @GuardedBy("mDevRoleListenersLock")
+        private boolean removeDevRoleListener(T listener) {
+            final DevRoleListenerInfo<T> infoToRemove = getDevRoleListenerInfo(listener);
+            if (infoToRemove != null) {
+                mListenerInfos.remove(infoToRemove);
+                return true;
+            }
+            return false;
+        }
+    }
+
+    private final Object mDevRoleForCapturePresetListenersLock = new Object();
+    /**
+     * Record if there is a listener added for device role change. If there is a listener added for
+     * a specified device role change, the bit at position `1 << device_role` is set.
+     */
+    @GuardedBy("mDevRoleForCapturePresetListenersLock")
+    private int mDeviceRoleListenersStatus = 0;
+    @GuardedBy("mDevRoleForCapturePresetListenersLock")
+    private CapturePresetDevicesRoleDispatcherStub mDevicesRoleForCapturePresetDispatcherStub;
+
+    private final class CapturePresetDevicesRoleDispatcherStub
+            extends ICapturePresetDevicesRoleDispatcher.Stub {
+
+        @Override
+        public void dispatchDevicesRoleChanged(
+                int capturePreset, int role, List<AudioDeviceAttributes> devices) {
+            final Object listenersObj = mDevRoleForCapturePresetListeners.get(role);
+            if (listenersObj == null) {
+                return;
+            }
+            switch (role) {
+                case AudioSystem.DEVICE_ROLE_PREFERRED: {
+                    final DevRoleListeners<OnPreferredDevicesForCapturePresetChangedListener>
+                            listeners =
+                            (DevRoleListeners<OnPreferredDevicesForCapturePresetChangedListener>)
+                            listenersObj;
+                    final ArrayList<DevRoleListenerInfo<
+                            OnPreferredDevicesForCapturePresetChangedListener>> prefDevListeners;
+                    synchronized (listeners.mDevRoleListenersLock) {
+                        if (listeners.mListenerInfos.isEmpty()) {
+                            return;
+                        }
+                        prefDevListeners = (ArrayList<DevRoleListenerInfo<
+                                OnPreferredDevicesForCapturePresetChangedListener>>)
+                                listeners.mListenerInfos.clone();
+                    }
+                    final long ident = Binder.clearCallingIdentity();
+                    try {
+                        for (DevRoleListenerInfo<
+                                OnPreferredDevicesForCapturePresetChangedListener> info :
+                                prefDevListeners) {
+                            info.mExecutor.execute(() ->
+                                    info.mListener.onPreferredDevicesForCapturePresetChanged(
+                                            capturePreset, devices));
+                        }
+                    } finally {
+                        Binder.restoreCallingIdentity(ident);
+                    }
+                } break;
+                default:
+                    break;
+            }
+        }
+    }
+
+    //====================================================================
     // Offload query
     /**
      * Returns whether offloaded playback of an audio format is supported on the device.
@@ -5664,6 +6124,29 @@
     }
 
     /**
+     * Returns an {@link AudioDeviceInfo} corresponding to the specified {@link AudioPort} ID.
+     * @param portId The audio port ID to look up for.
+     * @param flags A set of bitflags specifying the criteria to test.
+     * @see #GET_DEVICES_OUTPUTS
+     * @see #GET_DEVICES_INPUTS
+     * @see #GET_DEVICES_ALL
+     * @return An AudioDeviceInfo or null if no device with matching port ID is found.
+     * @hide
+     */
+    public static AudioDeviceInfo getDeviceForPortId(int portId, int flags) {
+        if (portId == 0) {
+            return null;
+        }
+        AudioDeviceInfo[] devices = getDevicesStatic(flags);
+        for (AudioDeviceInfo device : devices) {
+            if (device.getId() == portId) {
+                return device;
+            }
+        }
+        return null;
+    }
+
+    /**
      * Registers an {@link AudioDeviceCallback} object to receive notifications of changes
      * to the set of connected audio devices.
      * @param callback The {@link AudioDeviceCallback} object to receive connect/disconnect
@@ -6206,6 +6689,297 @@
         }
     }
 
+    /**
+     * Selects the audio device that should be used for communication use cases, for instance voice
+     * or video calls. This method can be used by voice or video chat applications to select a
+     * different audio device than the one selected by default by the platform.
+     * <p>The device selection is expressed as an {@link AudioDeviceInfo}, of role sink
+     * ({@link AudioDeviceInfo#isSink()} is <code>true</code>) and of one of the following types:
+     * <ul>
+     *   <li> {@link AudioDeviceInfo#TYPE_BUILTIN_EARPIECE}
+     *   <li> {@link AudioDeviceInfo#TYPE_BUILTIN_SPEAKER}
+     *   <li> {@link AudioDeviceInfo#TYPE_WIRED_HEADSET}
+     *   <li> {@link AudioDeviceInfo#TYPE_BLUETOOTH_SCO}
+     *   <li> {@link AudioDeviceInfo#TYPE_USB_HEADSET}
+     *   <li> {@link AudioDeviceInfo#TYPE_BLE_HEADSET}
+     * </ul>
+     * The selection is active as long as the requesting application lives, until
+     * {@link #clearDeviceForCommunication} is called or until the device is disconnected.
+     * It is therefore important for applications to clear the request when a call ends or the
+     * application is paused.
+     * <p>In case of simultaneous requests by multiple applications the priority is given to the
+     * application currently controlling the audio mode (see {@link #setMode(int)}). This is the
+     * latest application having selected mode {@link #MODE_IN_COMMUNICATION} or mode
+     * {@link #MODE_IN_CALL}. Note that <code>MODE_IN_CALL</code> can only be selected by the main
+     * telephony application with permission
+     * {@link android.Manifest.permission#MODIFY_PHONE_STATE}.
+     * <p> If the requested devices is not currently available, the request will be rejected and
+     * the method will return false.
+     * <p>This API replaces the following deprecated APIs:
+     * <ul>
+     *   <li> {@link #startBluetoothSco()}
+     *   <li> {@link #stopBluetoothSco()}
+     *   <li> {@link #setSpeakerphoneOn(boolean)}
+     * </ul>
+     * <h4>Example</h4>
+     * <p>The example below shows how to enable and disable speakerphone mode.
+     * <pre class="prettyprint">
+     * // Get an AudioManager instance
+     * AudioManager audioManager = Context.getSystemService(AudioManager.class);
+     * try {
+     *     AudioDeviceInfo speakerDevice = null;
+     *     AudioDeviceInfo[] devices = audioManager.getDevices(GET_DEVICES_OUTPUTS);
+     *     for (AudioDeviceInfo device : devices) {
+     *         if (device.getType() == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER) {
+     *             speakerDevice = device;
+     *             break;
+     *         }
+     *     }
+     *     if (speakerDevice != null) {
+     *         // Turn speakerphone ON.
+     *         boolean result = audioManager.setDeviceForCommunication(speakerDevice);
+     *         if (!result) {
+     *             // Handle error.
+     *         }
+     *         // Turn speakerphone OFF.
+     *         audioManager.clearDeviceForCommunication();
+     *     }
+     * } catch (IllegalArgumentException e) {
+     *     // Handle exception.
+     * }
+     * </pre>
+     * @param device the requested audio device.
+     * @return <code>true</code> if the request was accepted, <code>false</code> otherwise.
+     * @throws IllegalArgumentException If an invalid device is specified.
+     */
+    public boolean setDeviceForCommunication(@NonNull AudioDeviceInfo device) {
+        Objects.requireNonNull(device);
+        try {
+            if (device.getId() == 0) {
+                throw new IllegalArgumentException("In valid device: " + device);
+            }
+            return getService().setDeviceForCommunication(mICallBack, device.getId());
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Cancels previous communication device selection made with
+     * {@link #setDeviceForCommunication(AudioDeviceInfo)}.
+     */
+    public void clearDeviceForCommunication() {
+        try {
+            getService().setDeviceForCommunication(mICallBack, 0);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * Returns currently selected audio device for communication.
+     * <p>This API replaces the following deprecated APIs:
+     * <ul>
+     *   <li> {@link #isBluetoothScoOn()}
+     *   <li> {@link #isSpeakerphoneOn()}
+     * </ul>
+     * @return an {@link AudioDeviceInfo} indicating which audio device is
+     * currently selected or communication use cases or null if default selection
+     * is used.
+     */
+    @Nullable
+    public AudioDeviceInfo getDeviceForCommunication() {
+        try {
+            return getDeviceForPortId(
+                    getService().getDeviceForCommunication(), GET_DEVICES_OUTPUTS);
+        } catch (RemoteException e) {
+            throw e.rethrowFromSystemServer();
+        }
+    }
+
+    /**
+     * @hide
+     * Returns an {@link AudioDeviceInfo} corresponding to a connected device of the type provided.
+     * The type must be a valid output type defined in <code>AudioDeviceInfo</code> class,
+     * for instance {@link AudioDeviceInfo#TYPE_BUILTIN_SPEAKER}.
+     * The method will return null if no device of the provided type is connected.
+     * If more than one device of the provided type is connected, an object corresponding to the
+     * first device encountered in the enumeration list will be returned.
+     * @param deviceType The device device for which an <code>AudioDeviceInfo</code>
+     * object is queried.
+     * @return An AudioDeviceInfo object or null if no device with the requested type is connected.
+     * @throws IllegalArgumentException If an invalid device type is specified.
+     */
+    @TestApi
+    @Nullable
+    public static AudioDeviceInfo getDeviceInfoFromType(
+            @AudioDeviceInfo.AudioDeviceTypeOut int deviceType) {
+        AudioDeviceInfo[] devices = getDevicesStatic(GET_DEVICES_OUTPUTS);
+        for (AudioDeviceInfo device : devices) {
+            if (device.getType() == deviceType) {
+                return device;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Listener registered by client to be notified upon communication audio device change.
+     * See {@link #setDeviceForCommunication(AudioDeviceInfo)}.
+     */
+    public interface OnCommunicationDeviceChangedListener {
+        /**
+         * Callback method called upon communication audio device change.
+         * @param device the audio device selected for communication use cases
+         */
+        void onCommunicationDeviceChanged(@Nullable AudioDeviceInfo device);
+    }
+
+    /**
+     * Adds a listener for being notified of changes to the communication audio device.
+     * See {@link #setDeviceForCommunication(AudioDeviceInfo)}.
+     * @param executor
+     * @param listener
+     */
+    public void addOnCommunicationDeviceChangedListener(
+            @NonNull @CallbackExecutor Executor executor,
+            @NonNull OnCommunicationDeviceChangedListener listener) {
+        Objects.requireNonNull(executor);
+        Objects.requireNonNull(listener);
+        synchronized (mCommDevListenerLock) {
+            if (hasCommDevListener(listener)) {
+                throw new IllegalArgumentException(
+                        "attempt to call addOnCommunicationDeviceChangedListener() "
+                                + "on a previously registered listener");
+            }
+            // lazy initialization of the list of strategy-preferred device listener
+            if (mCommDevListeners == null) {
+                mCommDevListeners = new ArrayList<>();
+            }
+            final int oldCbCount = mCommDevListeners.size();
+            mCommDevListeners.add(new CommDevListenerInfo(listener, executor));
+            if (oldCbCount == 0 && mCommDevListeners.size() > 0) {
+                // register binder for callbacks
+                if (mCommDevDispatcherStub == null) {
+                    mCommDevDispatcherStub = new CommunicationDeviceDispatcherStub();
+                }
+                try {
+                    getService().registerCommunicationDeviceDispatcher(mCommDevDispatcherStub);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                }
+            }
+        }
+    }
+
+    /**
+     * Removes a previously added listener of changes to the communication audio device.
+     * See {@link #setDeviceForCommunication(AudioDeviceInfo)}.
+     * @param listener
+     */
+    public void removeOnCommunicationDeviceChangedListener(
+            @NonNull OnCommunicationDeviceChangedListener listener) {
+        Objects.requireNonNull(listener);
+        synchronized (mCommDevListenerLock) {
+            if (!removeCommDevListener(listener)) {
+                throw new IllegalArgumentException(
+                        "attempt to call removeOnCommunicationDeviceChangedListener() "
+                                + "on an unregistered listener");
+            }
+            if (mCommDevListeners.size() == 0) {
+                // unregister binder for callbacks
+                try {
+                    getService().unregisterCommunicationDeviceDispatcher(
+                            mCommDevDispatcherStub);
+                } catch (RemoteException e) {
+                    throw e.rethrowFromSystemServer();
+                } finally {
+                    mCommDevDispatcherStub = null;
+                    mCommDevListeners = null;
+                }
+            }
+        }
+    }
+
+    private final Object mCommDevListenerLock = new Object();
+    /**
+     * List of listeners for preferred device for strategy and their associated Executor.
+     * List is lazy-initialized on first registration
+     */
+    @GuardedBy("mCommDevListenerLock")
+    private @Nullable ArrayList<CommDevListenerInfo> mCommDevListeners;
+
+    private static class CommDevListenerInfo {
+        final @NonNull OnCommunicationDeviceChangedListener mListener;
+        final @NonNull Executor mExecutor;
+
+        CommDevListenerInfo(OnCommunicationDeviceChangedListener listener, Executor exe) {
+            mListener = listener;
+            mExecutor = exe;
+        }
+    }
+
+    @GuardedBy("mCommDevListenerLock")
+    private CommunicationDeviceDispatcherStub mCommDevDispatcherStub;
+
+    private final class CommunicationDeviceDispatcherStub
+            extends ICommunicationDeviceDispatcher.Stub {
+
+        @Override
+        public void dispatchCommunicationDeviceChanged(int portId) {
+            // make a shallow copy of listeners so callback is not executed under lock
+            final ArrayList<CommDevListenerInfo> commDevListeners;
+            synchronized (mCommDevListenerLock) {
+                if (mCommDevListeners == null || mCommDevListeners.size() == 0) {
+                    return;
+                }
+                commDevListeners = (ArrayList<CommDevListenerInfo>) mCommDevListeners.clone();
+            }
+            AudioDeviceInfo device = getDeviceForPortId(portId, GET_DEVICES_OUTPUTS);
+            final long ident = Binder.clearCallingIdentity();
+            try {
+                for (CommDevListenerInfo info : commDevListeners) {
+                    info.mExecutor.execute(() ->
+                            info.mListener.onCommunicationDeviceChanged(device));
+                }
+            } finally {
+                Binder.restoreCallingIdentity(ident);
+            }
+        }
+    }
+
+    @GuardedBy("mCommDevListenerLock")
+    private @Nullable CommDevListenerInfo getCommDevListenerInfo(
+            OnCommunicationDeviceChangedListener listener) {
+        if (mCommDevListeners == null) {
+            return null;
+        }
+        for (CommDevListenerInfo info : mCommDevListeners) {
+            if (info.mListener == listener) {
+                return info;
+            }
+        }
+        return null;
+    }
+
+    @GuardedBy("mCommDevListenerLock")
+    private boolean hasCommDevListener(OnCommunicationDeviceChangedListener listener) {
+        return getCommDevListenerInfo(listener) != null;
+    }
+
+    @GuardedBy("mCommDevListenerLock")
+    /**
+     * @return true if the listener was removed from the list
+     */
+    private boolean removeCommDevListener(OnCommunicationDeviceChangedListener listener) {
+        final CommDevListenerInfo infoToRemove = getCommDevListenerInfo(listener);
+        if (infoToRemove != null) {
+            mCommDevListeners.remove(infoToRemove);
+            return true;
+        }
+        return false;
+    }
+
     //---------------------------------------------------------
     // Inner classes
     //--------------------
diff --git a/media/java/android/media/AudioSystem.java b/media/java/android/media/AudioSystem.java
index f1eb53d..18c8a72 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -28,11 +28,13 @@
 import android.os.Build;
 import android.telephony.TelephonyManager;
 import android.util.Log;
+import android.util.Pair;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
@@ -1371,6 +1373,11 @@
     /** @hide */ public static final int FOR_VIBRATE_RINGING = 7;
     private static final int NUM_FORCE_USE = 8;
 
+    // Device role in audio policy
+    public static final int DEVICE_ROLE_NONE = 0;
+    public static final int DEVICE_ROLE_PREFERRED = 1;
+    public static final int DEVICE_ROLE_DISABLED = 2;
+
     /** @hide */
     public static String forceUseUsageToString(int usage) {
         switch (usage) {
@@ -1691,47 +1698,186 @@
 
     /**
      * @hide
-     * Sets the preferred device to use for a given audio strategy in the audio policy engine
+     * Set device as role for product strategy.
      * @param strategy the id of the strategy to configure
-     * @param device the device type and address to route to when available
+     * @param role the role of the devices
+     * @param devices the list of devices to be set as role for the given strategy
      * @return {@link #SUCCESS} if successfully set
      */
-    public static int setPreferredDeviceForStrategy(
-            int strategy, @NonNull AudioDeviceAttributes device) {
-        return setPreferredDeviceForStrategy(strategy,
-                AudioDeviceInfo.convertDeviceTypeToInternalDevice(device.getType()),
-                device.getAddress());
+    public static int setDevicesRoleForStrategy(
+            int strategy, int role, @NonNull List<AudioDeviceAttributes> devices) {
+        if (devices.isEmpty()) {
+            return BAD_VALUE;
+        }
+        int[] types = new int[devices.size()];
+        String[] addresses = new String[devices.size()];
+        for (int i = 0; i < devices.size(); ++i) {
+            types[i] = devices.get(i).getInternalType();
+            addresses[i] = devices.get(i).getAddress();
+        }
+        return setDevicesRoleForStrategy(strategy, role, types, addresses);
     }
-    /**
-     * @hide
-     * Set device routing per product strategy.
-     * @param strategy the id of the strategy to configure
-     * @param deviceType the native device type, NOT AudioDeviceInfo types
-     * @param deviceAddress the address of the device
-     * @return {@link #SUCCESS} if successfully set
-     */
-    private static native int setPreferredDeviceForStrategy(
-            int strategy, int deviceType, String deviceAddress);
 
     /**
      * @hide
-     * Remove preferred routing for the strategy
+     * Set device as role for product strategy.
      * @param strategy the id of the strategy to configure
+     * @param role the role of the devices
+     * @param types all device types
+     * @param addresses all device addresses
+     * @return {@link #SUCCESS} if successfully set
+     */
+    private static native int setDevicesRoleForStrategy(
+            int strategy, int role, @NonNull int[] types, @NonNull String[] addresses);
+
+    /**
+     * @hide
+     * Remove devices as role for the strategy
+     * @param strategy the id of the strategy to configure
+     * @param role the role of the devices
      * @return {@link #SUCCESS} if successfully removed
      */
-    public static native int removePreferredDeviceForStrategy(int strategy);
+    public static native int removeDevicesRoleForStrategy(int strategy, int role);
 
     /**
      * @hide
-     * Query previously set preferred device for a strategy
+     * Query previously set devices as role for a strategy
      * @param strategy the id of the strategy to query for
-     * @param device an array of size 1 that will contain the preferred device, or null if
-     *               none was set
+     * @param role the role of the devices
+     * @param devices a list that will contain the devices of role
      * @return {@link #SUCCESS} if there is a preferred device and it was successfully retrieved
      *     and written to the array
      */
-    public static native int getPreferredDeviceForStrategy(int strategy,
-                                                           AudioDeviceAttributes[] device);
+    public static native int getDevicesForRoleAndStrategy(
+            int strategy, int role, @NonNull List<AudioDeviceAttributes> devices);
+
+    // use case routing by capture preset
+
+    private static Pair<int[], String[]> populateInputDevicesTypeAndAddress(
+            @NonNull List<AudioDeviceAttributes> devices) {
+        int[] types = new int[devices.size()];
+        String[] addresses = new String[devices.size()];
+        for (int i = 0; i < devices.size(); ++i) {
+            types[i] = devices.get(i).getInternalType();
+            if (types[i] == AudioSystem.DEVICE_NONE) {
+                types[i] = AudioDeviceInfo.convertDeviceTypeToInternalInputDevice(
+                        devices.get(i).getType());
+            }
+            addresses[i] = devices.get(i).getAddress();
+        }
+        return new Pair<int[], String[]>(types, addresses);
+    }
+
+    /**
+     * @hide
+     * Set devices as role for capture preset.
+     * @param capturePreset the capture preset to configure
+     * @param role the role of the devices
+     * @param devices the list of devices to be set as role for the given capture preset
+     * @return {@link #SUCCESS} if successfully set
+     */
+    public static int setDevicesRoleForCapturePreset(
+            int capturePreset, int role, @NonNull List<AudioDeviceAttributes> devices) {
+        if (devices.isEmpty()) {
+            return BAD_VALUE;
+        }
+        Pair<int[], String[]> typeAddresses = populateInputDevicesTypeAndAddress(devices);
+        return setDevicesRoleForCapturePreset(
+                capturePreset, role, typeAddresses.first, typeAddresses.second);
+    }
+
+    /**
+     * @hide
+     * Set devices as role for capture preset.
+     * @param capturePreset the capture preset to configure
+     * @param role the role of the devices
+     * @param types all device types
+     * @param addresses all device addresses
+     * @return {@link #SUCCESS} if successfully set
+     */
+    private static native int setDevicesRoleForCapturePreset(
+            int capturePreset, int role, @NonNull int[] types, @NonNull String[] addresses);
+
+    /**
+     * @hide
+     * Add devices as role for capture preset.
+     * @param capturePreset the capture preset to configure
+     * @param role the role of the devices
+     * @param devices the list of devices to be added as role for the given capture preset
+     * @return {@link #SUCCESS} if successfully add
+     */
+    public static int addDevicesRoleForCapturePreset(
+            int capturePreset, int role, @NonNull List<AudioDeviceAttributes> devices) {
+        if (devices.isEmpty()) {
+            return BAD_VALUE;
+        }
+        Pair<int[], String[]> typeAddresses = populateInputDevicesTypeAndAddress(devices);
+        return addDevicesRoleForCapturePreset(
+                capturePreset, role, typeAddresses.first, typeAddresses.second);
+    }
+
+    /**
+     * @hide
+     * Add devices as role for capture preset.
+     * @param capturePreset the capture preset to configure
+     * @param role the role of the devices
+     * @param types all device types
+     * @param addresses all device addresses
+     * @return {@link #SUCCESS} if successfully set
+     */
+    private static native int addDevicesRoleForCapturePreset(
+            int capturePreset, int role, @NonNull int[] types, @NonNull String[] addresses);
+
+    /**
+     * @hide
+     * Remove devices as role for the capture preset
+     * @param capturePreset the capture preset to configure
+     * @param role the role of the devices
+     * @param devices the devices to be removed
+     * @return {@link #SUCCESS} if successfully removed
+     */
+    public static int removeDevicesRoleForCapturePreset(
+            int capturePreset, int role, @NonNull List<AudioDeviceAttributes> devices) {
+        if (devices.isEmpty()) {
+            return BAD_VALUE;
+        }
+        Pair<int[], String[]> typeAddresses = populateInputDevicesTypeAndAddress(devices);
+        return removeDevicesRoleForCapturePreset(
+                capturePreset, role, typeAddresses.first, typeAddresses.second);
+    }
+
+    /**
+     * @hide
+     * Remove devices as role for capture preset.
+     * @param capturePreset the capture preset to configure
+     * @param role the role of the devices
+     * @param types all device types
+     * @param addresses all device addresses
+     * @return {@link #SUCCESS} if successfully set
+     */
+    private static native int removeDevicesRoleForCapturePreset(
+            int capturePreset, int role, @NonNull int[] types, @NonNull String[] addresses);
+
+    /**
+     * @hide
+     * Remove all devices as role for the capture preset
+     * @param capturePreset the capture preset to configure
+     * @param role the role of the devices
+     * @return {@link #SUCCESS} if successfully removed
+     */
+    public static native int clearDevicesRoleForCapturePreset(int capturePreset, int role);
+
+    /**
+     * @hide
+     * Query previously set devices as role for a capture preset
+     * @param capturePreset the capture preset to query for
+     * @param role the role of the devices
+     * @param devices a list that will contain the devices of role
+     * @return {@link #SUCCESS} if there is a preferred device and it was successfully retrieved
+     *     and written to the array
+     */
+    public static native int getDevicesForRoleAndCapturePreset(
+            int capturePreset, int role, @NonNull List<AudioDeviceAttributes> devices);
 
     // Items shared with audio service
 
diff --git a/media/java/android/media/IAudioService.aidl b/media/java/android/media/IAudioService.aidl
index 78806eb..ebaa316 100755
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -26,10 +26,12 @@
 import android.media.IAudioFocusDispatcher;
 import android.media.IAudioRoutesObserver;
 import android.media.IAudioServerStateDispatcher;
+import android.media.ICapturePresetDevicesRoleDispatcher;
+import android.media.ICommunicationDeviceDispatcher;
 import android.media.IPlaybackConfigDispatcher;
 import android.media.IRecordingConfigDispatcher;
 import android.media.IRingtonePlayer;
-import android.media.IStrategyPreferredDeviceDispatcher;
+import android.media.IStrategyPreferredDevicesDispatcher;
 import android.media.IVolumeController;
 import android.media.IVolumeController;
 import android.media.PlayerBase;
@@ -279,11 +281,11 @@
 
     boolean isCallScreeningModeSupported();
 
-    int setPreferredDeviceForStrategy(in int strategy, in AudioDeviceAttributes device);
+    int setPreferredDevicesForStrategy(in int strategy, in List<AudioDeviceAttributes> device);
 
-    int removePreferredDeviceForStrategy(in int strategy);
+    int removePreferredDevicesForStrategy(in int strategy);
 
-    AudioDeviceAttributes getPreferredDeviceForStrategy(in int strategy);
+    List<AudioDeviceAttributes> getPreferredDevicesForStrategy(in int strategy);
 
     List<AudioDeviceAttributes> getDevicesForAttributes(in AudioAttributes attributes);
 
@@ -291,10 +293,10 @@
 
     int getAllowedCapturePolicy();
 
-    void registerStrategyPreferredDeviceDispatcher(IStrategyPreferredDeviceDispatcher dispatcher);
+    void registerStrategyPreferredDevicesDispatcher(IStrategyPreferredDevicesDispatcher dispatcher);
 
-    oneway void unregisterStrategyPreferredDeviceDispatcher(
-            IStrategyPreferredDeviceDispatcher dispatcher);
+    oneway void unregisterStrategyPreferredDevicesDispatcher(
+            IStrategyPreferredDevicesDispatcher dispatcher);
 
     oneway void setRttEnabled(in boolean rttEnabled);
 
@@ -307,4 +309,25 @@
     // code via IAudioManager.h need to be added to the top section.
 
     oneway void setMultiAudioFocusEnabled(in boolean enabled);
+
+    int setPreferredDevicesForCapturePreset(
+            in int capturePreset, in List<AudioDeviceAttributes> devices);
+
+    int clearPreferredDevicesForCapturePreset(in int capturePreset);
+
+    List<AudioDeviceAttributes> getPreferredDevicesForCapturePreset(in int capturePreset);
+
+    void registerCapturePresetDevicesRoleDispatcher(ICapturePresetDevicesRoleDispatcher dispatcher);
+
+    oneway void unregisterCapturePresetDevicesRoleDispatcher(
+            ICapturePresetDevicesRoleDispatcher dispatcher);
+
+    boolean setDeviceForCommunication(IBinder cb, int portId);
+
+    int getDeviceForCommunication();
+
+    void registerCommunicationDeviceDispatcher(ICommunicationDeviceDispatcher dispatcher);
+
+    oneway void unregisterCommunicationDeviceDispatcher(
+            ICommunicationDeviceDispatcher dispatcher);
 }
diff --git a/media/java/android/media/IStrategyPreferredDeviceDispatcher.aidl b/media/java/android/media/ICapturePresetDevicesRoleDispatcher.aidl
similarity index 74%
copy from media/java/android/media/IStrategyPreferredDeviceDispatcher.aidl
copy to media/java/android/media/ICapturePresetDevicesRoleDispatcher.aidl
index b1f99e6..5e03e63 100644
--- a/media/java/android/media/IStrategyPreferredDeviceDispatcher.aidl
+++ b/media/java/android/media/ICapturePresetDevicesRoleDispatcher.aidl
@@ -19,12 +19,13 @@
 import android.media.AudioDeviceAttributes;
 
 /**
- * AIDL for AudioService to signal audio strategy-preferred device updates.
+ * AIDL for AudioService to signal devices role for capture preset updates.
  *
  * {@hide}
  */
-oneway interface IStrategyPreferredDeviceDispatcher {
+oneway interface ICapturePresetDevicesRoleDispatcher {
 
-    void dispatchPrefDeviceChanged(int strategyId, in AudioDeviceAttributes device);
+    void dispatchDevicesRoleChanged(
+            int capturePreset, int role, in List<AudioDeviceAttributes> devices);
 
 }
diff --git a/wifi/java/android/net/wifi/IScoreUpdateObserver.aidl b/media/java/android/media/ICommunicationDeviceDispatcher.aidl
similarity index 73%
rename from wifi/java/android/net/wifi/IScoreUpdateObserver.aidl
rename to media/java/android/media/ICommunicationDeviceDispatcher.aidl
index 775fed7..429f934 100644
--- a/wifi/java/android/net/wifi/IScoreUpdateObserver.aidl
+++ b/media/java/android/media/ICommunicationDeviceDispatcher.aidl
@@ -14,16 +14,15 @@
  * limitations under the License.
  */
 
-package android.net.wifi;
+package android.media;
 
 /**
- * Interface for Wi-Fi score callback.
+ * AIDL for AudioService to signal audio communication device updates.
  *
- * @hide
+ * {@hide}
  */
-oneway interface IScoreUpdateObserver
-{
-    void notifyScoreUpdate(int sessionId, int score);
+oneway interface ICommunicationDeviceDispatcher {
 
-    void triggerUpdateOfWifiUsabilityStats(int sessionId);
+    void dispatchCommunicationDeviceChanged(int portId);
+
 }
diff --git a/media/java/android/media/IStrategyPreferredDeviceDispatcher.aidl b/media/java/android/media/IStrategyPreferredDevicesDispatcher.aidl
similarity index 82%
rename from media/java/android/media/IStrategyPreferredDeviceDispatcher.aidl
rename to media/java/android/media/IStrategyPreferredDevicesDispatcher.aidl
index b1f99e6..db674c3 100644
--- a/media/java/android/media/IStrategyPreferredDeviceDispatcher.aidl
+++ b/media/java/android/media/IStrategyPreferredDevicesDispatcher.aidl
@@ -19,12 +19,12 @@
 import android.media.AudioDeviceAttributes;
 
 /**
- * AIDL for AudioService to signal audio strategy-preferred device updates.
+ * AIDL for AudioService to signal audio strategy-preferred devices updates.
  *
  * {@hide}
  */
-oneway interface IStrategyPreferredDeviceDispatcher {
+oneway interface IStrategyPreferredDevicesDispatcher {
 
-    void dispatchPrefDeviceChanged(int strategyId, in AudioDeviceAttributes device);
+    void dispatchPrefDevicesChanged(int strategyId, in List<AudioDeviceAttributes> devices);
 
 }
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 73ef315..c61a2eb 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -404,6 +404,32 @@
         }
     }
 
+    /**
+     * @hide
+     * @param source An audio source to test
+     * @return true if the source is a valid one
+     */
+    public static boolean isValidAudioSource(int source) {
+        switch(source) {
+            case AudioSource.MIC:
+            case AudioSource.VOICE_UPLINK:
+            case AudioSource.VOICE_DOWNLINK:
+            case AudioSource.VOICE_CALL:
+            case AudioSource.CAMCORDER:
+            case AudioSource.VOICE_RECOGNITION:
+            case AudioSource.VOICE_COMMUNICATION:
+            case AudioSource.REMOTE_SUBMIX:
+            case AudioSource.UNPROCESSED:
+            case AudioSource.VOICE_PERFORMANCE:
+            case AudioSource.ECHO_REFERENCE:
+            case AudioSource.RADIO_TUNER:
+            case AudioSource.HOTWORD:
+                return true;
+            default:
+                return false;
+        }
+    }
+
     /** @hide */
     public static final String toLogFriendlyAudioSource(int source) {
         switch(source) {
diff --git a/media/java/android/media/OWNERS b/media/java/android/media/OWNERS
index cbc9ab7..cf06fad 100644
--- a/media/java/android/media/OWNERS
+++ b/media/java/android/media/OWNERS
@@ -6,3 +6,4 @@
 olly@google.com
 andrewlewis@google.com
 sungsoo@google.com
+jmtrivi@google.com
diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp
index d55e9d0..0d53ab1 100644
--- a/media/jni/audioeffect/android_media_AudioEffect.cpp
+++ b/media/jni/audioeffect/android_media_AudioEffect.cpp
@@ -333,7 +333,7 @@
     if (deviceType != AUDIO_DEVICE_NONE) {
         device.mType = (audio_devices_t)deviceType;
         ScopedUtfChars address(env, deviceAddress);
-        device.mAddress = address.c_str();
+        device.setAddress(address.c_str());
     }
 
     // create the native AudioEffect object
diff --git a/native/android/OWNERS b/native/android/OWNERS
index 266764a..ac5a895 100644
--- a/native/android/OWNERS
+++ b/native/android/OWNERS
@@ -1,4 +1,3 @@
-set noparent
-
+per-file libandroid_net.map.txt, net.c = set noparent
 per-file libandroid_net.map.txt, net.c = codewiz@google.com, jchalard@google.com, junyulai@google.com
 per-file libandroid_net.map.txt, net.c = lorenzo@google.com, reminv@google.com, satk@google.com
diff --git a/packages/Connectivity/service/Android.bp b/packages/Connectivity/service/Android.bp
new file mode 100644
index 0000000..a26f715
--- /dev/null
+++ b/packages/Connectivity/service/Android.bp
@@ -0,0 +1,79 @@
+//
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+cc_defaults {
+    name: "libservice-connectivity-defaults",
+    // TODO: build against the NDK (sdk_version: "30" for example)
+    cflags: [
+        "-Wall",
+        "-Werror",
+        "-Wno-unused-parameter",
+        "-Wthread-safety",
+    ],
+    srcs: [
+        "jni/com_android_server_TestNetworkService.cpp",
+        "jni/com_android_server_connectivity_Vpn.cpp",
+    ],
+    shared_libs: [
+        "libbase",
+        "liblog",
+        "libnativehelper",
+        // TODO: remove dependency on ifc_[add/del]_address by having Java code to add/delete
+        // addresses, and remove dependency on libnetutils.
+        "libnetutils",
+    ],
+}
+
+cc_library_shared {
+    name: "libservice-connectivity",
+    defaults: ["libservice-connectivity-defaults"],
+    srcs: [
+        "jni/onload.cpp",
+    ],
+    apex_available: [
+        // TODO: move this library to the tethering APEX and remove libservice-connectivity-static
+        // "com.android.tethering",
+    ],
+}
+
+// Static library linked into libservices.core until libservice-connectivity can be loaded from
+// the tethering APEX instead.
+cc_library_static {
+    name: "libservice-connectivity-static",
+    defaults: ["libservice-connectivity-defaults"],
+}
+
+java_library {
+    name: "service-connectivity",
+    srcs: [
+        ":connectivity-service-srcs",
+    ],
+    installable: true,
+    jarjar_rules: "jarjar-rules.txt",
+    libs: [
+        "android.net.ipsec.ike",
+        "services.core",
+        "services.net",
+        "unsupportedappusage",
+    ],
+    static_libs: [
+        "net-utils-device-common",
+        "net-utils-framework-common",
+    ],
+    apex_available: [
+        "//apex_available:platform",
+    ],
+}
diff --git a/packages/Connectivity/service/jarjar-rules.txt b/packages/Connectivity/service/jarjar-rules.txt
new file mode 100644
index 0000000..ef53ebb
--- /dev/null
+++ b/packages/Connectivity/service/jarjar-rules.txt
@@ -0,0 +1 @@
+rule com.android.net.module.util.** com.android.connectivity.util.@1
\ No newline at end of file
diff --git a/services/core/jni/com_android_server_TestNetworkService.cpp b/packages/Connectivity/service/jni/com_android_server_TestNetworkService.cpp
similarity index 100%
rename from services/core/jni/com_android_server_TestNetworkService.cpp
rename to packages/Connectivity/service/jni/com_android_server_TestNetworkService.cpp
diff --git a/services/core/jni/com_android_server_connectivity_Vpn.cpp b/packages/Connectivity/service/jni/com_android_server_connectivity_Vpn.cpp
similarity index 99%
rename from services/core/jni/com_android_server_connectivity_Vpn.cpp
rename to packages/Connectivity/service/jni/com_android_server_connectivity_Vpn.cpp
index 836d6d8..ea5e718 100644
--- a/services/core/jni/com_android_server_connectivity_Vpn.cpp
+++ b/packages/Connectivity/service/jni/com_android_server_connectivity_Vpn.cpp
@@ -34,6 +34,7 @@
 #include <sys/types.h>
 
 #include <log/log.h>
+#include <android/log.h>
 
 #include "netutils/ifc.h"
 
diff --git a/packages/Connectivity/service/jni/onload.cpp b/packages/Connectivity/service/jni/onload.cpp
new file mode 100644
index 0000000..3afcb0e
--- /dev/null
+++ b/packages/Connectivity/service/jni/onload.cpp
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <nativehelper/JNIHelp.h>
+#include <log/log.h>
+
+namespace android {
+
+int register_android_server_connectivity_Vpn(JNIEnv* env);
+int register_android_server_TestNetworkService(JNIEnv* env);
+
+extern "C" jint JNI_OnLoad(JavaVM* vm, void*) {
+    JNIEnv *env;
+    if (vm->GetEnv(reinterpret_cast<void**>(&env), JNI_VERSION_1_6) != JNI_OK) {
+        ALOGE("GetEnv failed");
+        return JNI_ERR;
+    }
+
+    if (register_android_server_connectivity_Vpn(env) < 0
+        || register_android_server_TestNetworkService(env) < 0) {
+        return JNI_ERR;
+    }
+
+    return JNI_VERSION_1_6;
+}
+
+};
\ No newline at end of file
diff --git a/packages/OsuLogin/Android.bp b/packages/OsuLogin/Android.bp
deleted file mode 100644
index 445c81b..0000000
--- a/packages/OsuLogin/Android.bp
+++ /dev/null
@@ -1,18 +0,0 @@
-android_app {
-    name: "OsuLogin",
-    defaults: ["wifi-module-sdk-version-defaults"],
-    static_libs: ["androidx.legacy_legacy-support-v4"],
-    resource_dirs: ["res"],
-    srcs: ["src/**/*.java"],
-    sdk_version: "system_current",
-    certificate: ":com.android.hotspot2.osulogin.certificate",
-    apex_available: [
-        "com.android.wifi",
-        "test_com.android.wifi",
-    ],
-}
-
-android_app_certificate {
-    name: "com.android.hotspot2.osulogin.certificate",
-    certificate: "certs/com.android.hotspot2.osulogin"
-}
diff --git a/packages/OsuLogin/AndroidManifest.xml b/packages/OsuLogin/AndroidManifest.xml
deleted file mode 100644
index a428cb3..0000000
--- a/packages/OsuLogin/AndroidManifest.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
--->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.hotspot2.osulogin">
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
-    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
-    <uses-permission android:name="android.permission.INTERNET"/>
-
-    <application
-        android:networkSecurityConfig="@xml/network_security_config"
-        android:enabled="true"
-        android:label="@string/app_name"
-        android:configChanges="keyboardHidden|orientation|screenSize"
-        android:supportsRtl="true">
-        <activity android:name="com.android.hotspot2.osulogin.OsuLoginActivity"
-                  android:label="@string/action_bar_label"
-                  android:theme="@style/AppTheme"
-                  android:configChanges="keyboardHidden|orientation|screenSize">
-            <intent-filter>
-                <action android:name="android.net.wifi.action.PASSPOINT_LAUNCH_OSU_VIEW"/>
-                <category android:name="android.intent.category.DEFAULT"/>
-            </intent-filter>
-        </activity>
-    </application>
-</manifest>
diff --git a/packages/OsuLogin/OWNERS b/packages/OsuLogin/OWNERS
deleted file mode 100644
index aa7c3e6..0000000
--- a/packages/OsuLogin/OWNERS
+++ /dev/null
@@ -1,2 +0,0 @@
-satk@google.com
-etancohen@google.com
diff --git a/packages/OsuLogin/certs/com.android.hotspot2.osulogin.pk8 b/packages/OsuLogin/certs/com.android.hotspot2.osulogin.pk8
deleted file mode 100644
index 87fd622..0000000
--- a/packages/OsuLogin/certs/com.android.hotspot2.osulogin.pk8
+++ /dev/null
Binary files differ
diff --git a/packages/OsuLogin/certs/com.android.hotspot2.osulogin.x509.pem b/packages/OsuLogin/certs/com.android.hotspot2.osulogin.x509.pem
deleted file mode 100644
index 1dfe701..0000000
--- a/packages/OsuLogin/certs/com.android.hotspot2.osulogin.x509.pem
+++ /dev/null
@@ -1,35 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIGDzCCA/egAwIBAgIUHzkh0UCF/H+1mZZp0ROX4nXKOUowDQYJKoZIhvcNAQEL
-BQAwgZUxCzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQH
-DA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQLDAdBbmRy
-b2lkMREwDwYDVQQDDAhPc3VMb2dpbjEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBh
-bmRyb2lkLmNvbTAgFw0yMDAzMjUwMjQ5MTNaGA80NzU4MDIxOTAyNDkxM1owgZUx
-CzAJBgNVBAYTAlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMRYwFAYDVQQHDA1Nb3Vu
-dGFpbiBWaWV3MRAwDgYDVQQKDAdBbmRyb2lkMRAwDgYDVQQLDAdBbmRyb2lkMREw
-DwYDVQQDDAhPc3VMb2dpbjEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lk
-LmNvbTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMJDnjAeIZ2KUvKc
-ONwxuzIhLvXr6LRm+Uz0ebjz++5IzQJLwr/COPBG9zbIm8izj2acp+l4WVEYT6I4
-Es5LEp556ySCuZx8IjOd0Zd6NCdaKmYouDTjYTrELWUlZjfA7Km2L5x2M6ArnDO5
-zJ1BIsQ06S3C7iR3ktAQ1cFdidg6Ha2gainS0A1JKN3kL9BL1pvHRLzWZX4gsNhB
-C/6Ue3W3Sx2JRQkaaLksDdoKq0QswEk5tGfKbVr9+hHv/pztaaqEXSeV6f305cAx
-Hzd6+QJ8f8AJz2Rhnv43y72UO8b02CSP3laUj8geidR8XXw+R7Kzu8NfFDL7uVIh
-ktPaBxfWPNYtedp3JrGeZhkzljsushY+bVHECEzROhY2CiUZBEn+wwZLWe2W7oee
-VCL1EZBYctK5CfrrV6x0wvbBUF/ViwV+2LQXQNp08xB8bJBqoBn4KZjK0tTN86Dq
-qRALyoVIVh5VDU9Wbi3vrJb0/9TEQtMjuo0DS3hdtnowdRyAyhwbQHO26dqnnzBI
-XtTAve4RkOwnb8QzZde56qvRgweDE9Im1jpx4E+MMGqVYs8Txurmd/t6bCjTvp1P
-4i88crk/zqCoHEQEbiaNdfkULJAWg9wqxPjqPCTVNtOXoJwuHsNymQVSztIUSySz
-ZQ8Trk0ApqQf8yH2mjM6HJJZoNpBAgMBAAGjUzBRMB0GA1UdDgQWBBRdpduh1P+I
-BMbg5S4n1kbj5hQsOzAfBgNVHSMEGDAWgBRdpduh1P+IBMbg5S4n1kbj5hQsOzAP
-BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQB+FzSuoA7LCvn8l86V
-sSI4lH1KLLH+wrXp20w/wYcBY+s4hYPpAJ8YbEMOT9uibK/HpEWYFqiVCqk4gKXr
-Qraxvmtqq0WNSwkjeopTYlZeBzTC/If3UoOCp7KCfMdydIcxvk6LNokMWWqSCNP8
-QiD872XuBvj/uQeBsbHZTqruqPnu+LZwpuHFVRp/Pyj9rT61PsvGitb7q/chW0G7
-7csHOc5q2223LKlNknPsfbcR6nVEg4KfN7kPKny8iJtl2pdbfBjFDp+73nzW8qZU
-5JWO5nWL7cJh4mt5sPGrzpt/Hf8/Dngg69sImRqjv/6/wCV0pEmmNjKJkXcMaZ0T
-2TSs+A7K6l15NYk8exkMymTU7jk+iDud3tnQ68YHf/A9pDu15OCw6U/pTgOgu9co
-rBLLhGV0Tb6XAnsWKe9tsLcumQXU5ZUn9m5VJl58wQHNhUqpT7L0fWtpiTMTStVA
-/yZbndPO4SbjR5rjcAk1xge8lyIIp0WBWmwoQ/1y4DXF/yPaX733wO7uWUljgKuy
-MM/zM4zklB8nFjXfPNf3j24Bzqmy7rqy4XB64enVmYQ2mVNqfwXvINoo2XOrAmj/
-bhSWXiCFltJFM7fmJGOMEEHBt9QfbmCgmM4aoWMgH7P+HxGW+Vc3tGixBbsxNRC+
-/VrPAINQV4x5q8zGYNQBqNFn/A==
------END CERTIFICATE-----
diff --git a/packages/OsuLogin/certs/key.pem b/packages/OsuLogin/certs/key.pem
deleted file mode 100644
index f560a8d..0000000
--- a/packages/OsuLogin/certs/key.pem
+++ /dev/null
@@ -1,52 +0,0 @@
------BEGIN PRIVATE KEY-----
-MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDCQ54wHiGdilLy
-nDjcMbsyIS716+i0ZvlM9Hm48/vuSM0CS8K/wjjwRvc2yJvIs49mnKfpeFlRGE+i
-OBLOSxKeeeskgrmcfCIzndGXejQnWipmKLg042E6xC1lJWY3wOypti+cdjOgK5wz
-ucydQSLENOktwu4kd5LQENXBXYnYOh2toGop0tANSSjd5C/QS9abx0S81mV+ILDY
-QQv+lHt1t0sdiUUJGmi5LA3aCqtELMBJObRnym1a/foR7/6c7WmqhF0nlen99OXA
-MR83evkCfH/ACc9kYZ7+N8u9lDvG9Ngkj95WlI/IHonUfF18Pkeys7vDXxQy+7lS
-IZLT2gcX1jzWLXnadyaxnmYZM5Y7LrIWPm1RxAhM0ToWNgolGQRJ/sMGS1ntlu6H
-nlQi9RGQWHLSuQn661esdML2wVBf1YsFfti0F0DadPMQfGyQaqAZ+CmYytLUzfOg
-6qkQC8qFSFYeVQ1PVm4t76yW9P/UxELTI7qNA0t4XbZ6MHUcgMocG0Bztunap58w
-SF7UwL3uEZDsJ2/EM2XXueqr0YMHgxPSJtY6ceBPjDBqlWLPE8bq5nf7emwo076d
-T+IvPHK5P86gqBxEBG4mjXX5FCyQFoPcKsT46jwk1TbTl6CcLh7DcpkFUs7SFEsk
-s2UPE65NAKakH/Mh9pozOhySWaDaQQIDAQABAoICAGgX7XKhIqgVD59aoIk0yLby
-2wQBdf780ocu1O6LJiqnrdqWF/PCsdnmXN9pHTitJqD4Pm03BL0Uhs9ItqL9zStH
-7vzwY177kSQRY9aEL+AKS3/UP+hvEpF3v09ce+pSIT5LFjYDjGQ+GgQJgh+dYHC8
-XVodAphdzjhZXQCxC4TmlzKLK3ffs4X69r/3XruBd6yfWTDKvTWZdMlcCX5Pt9v6
-7HAWNvzKvuTCO2Xjo6PzStGx7v5SlMhWISJtdARInv80z+m/RdPD3zxd1flXloiD
-h7yyRQPn31cfNLgP7vwMBKmKwbuo/WZhHr/SKBHEGY0jC/CDSQKMqd/dh5ynTnbC
-vi/qjKFIHofmhzgQ+fiHMeMsAO1c9eYs8a6bDeJjhA5qJP1HjSie9Ss9z94mp6Ww
-TRkU93yVX04DU4TCCf0IcFpKdbtKp84i6iLV9lKGh9juM42hSOFUV6bhxmlJ9zvM
-yl7vfhhuFHy1SypmaK/oJ+nwac4vIMaHCX9ifl6hm/z4PrGFSYJGQoJtVOz0vT15
-lSwCJVdHkGAe0LI+3iFn5jJlluD7TqsLmZLxqTTmzDZ3U9WhAslmn5TcZd92mL0i
-ZVTfCkjyl1wUHeif2992oTUH6CFZ1jKd8xwdWvyKkvQcjhiS9GUsm7j6jolR/QI7
-VPQlocM/vCCusrMWnR7xAoIBAQDv9O8kboz6WzN6Xw5UC7MWpi2jZg1bTs/uKcfz
-biAEC96iJQ33YSkYi6QzV4jSaackU99vGkHbQIdaBTkudz+FK5XqH0auImB2xxcR
-Xu9G2j2fhzESchVTtOnotVgjiuv18SLZ/GQoSIccs0QxcisPiTa5Ij9pl8xVoS6J
-sxfqAe15hASqLh+9Ula3+Orb1kCkqK0UwU0nM9nfUH88BKvUwQIMA7kipTA8jJog
-MJOlYPQUGxkltlim8Vip//P336E7CWT6fWbfo62US6IEu6HcC6T8u8jcLjIKsmjJ
-YJyqrepZqAVMPlv2Z+mNhxRR0ct6blfjJSrEZEtxBRn98kZ1AoIBAQDPQJ1z7Mfy
-AOfjSO6Dlfr7V9SWmGvexosH0gu6H8KO+n1/ZPH5fHGt7ORubUDhkNI/fqZK0Hls
-Q9Jwgq1QI9UwMTogF8DgmZ6L6jiXhUScIk0BFhUxOBoplugaI0jdTW350D2quFUJ
-LjYo+VcRapTfXXVehHSjbUh3nmTWj0WboA+//7xq8q9KHPb1Sbiwjf7N1iYD5R8p
-PaaG0DMET+l90bxI+QVX1enwjZGcFjo8VI+qXGGkpB/1zK5yWm29ZWypLw8TZreM
-7rLUdBY1/m7MB54zOaJ2jSsxLQSXIVSGPI1ugkmFr6OxeuLdcCLN4yca3+HYHewa
-w3GCBP3kfYMdAoIBAAxG0slhYpMYgWy8WkZQhuwcum8GtJ48TQUZXCKHOtoaJVzU
-Wn+SmACqfE8oJlblkuiX5fGQPVhTV9lyNPe8oCJXFYdx7DLSjW7mRrbbzZApcEeu
-KgOQlKjAs8r1JDpFTEc7/BV9BT7OXyNHxLBm7+8OjR8xsl7bplenNHNVF18glB7I
-c1ilnXgZM1icQp/WuV3zR0+tiB3+WCJFwwy2DHiJG2qz8g/ktbATXXtSIOuwJyy0
-Kjg0uRppdKjV8Ix5A426sFDkg5PjkujoabSmSOSyL9HCZcdmEadcc2ICMGHHHhtS
-Lls1QY08ycU06QQ6oJd198cmSqbbnsR8h1TnxVUCggEBAI2zF/QSiAImLGVxj+HX
-wWnneyobvGTsSlJmgi4XWOZ4zSU011xEgVTxCp2VhS6z3YwcA4ZTUzF6jX7vWZ/Z
-YAE7JwqaMv1dCtGOqnKuY2J88Tk05/hm6zxUOQzl4wOr1O1gO0lmDn3gYpdRIv59
-aJvvQjgFR9oU9d8TJM6t1mG45gvXxfM5Si/Z7d93MBdGflgteoBfPxbrV9gEsVzZ
-ZkLoC1u5JrYPQ4t8v3mAmQB2sGNCFmCC9ncQIpV8zlsX5VsnGZ+iMwzghtRLKoRw
-GUDWVIuhdDqp+kX9CY5q82d0Lx7HZY1JsRm/cy0DZkhubmYpfDhO/QavagQDdbOr
-POECggEAXOliqX4yFvy6USXihHVM44s63gK+yH0+0iRppqoB3+E5tDyhvvvBMPLZ
-7EBkhd7ILTDXbc0c8nSl8I/556YSlIaOB4Xbf4UQbsmD4fNGEnNWFbCzcEWYOjpQ
-5QyXjIzK/k8eg22OZlC3XNjGHgb/mA5f+v2enGQNuy7WRTl1mKYZB2h/2p6xy+jV
-CGhd4btB2bOu+1XR/B2KFvI5NdtPPti05LmsYgsU00yYJfQkpc7VvOSH5Jyy3eZL
-L9xTAy7NWBQ3LGdIpX+V1jcn3SzVits0m6hOUCtJLT1snMXAKFweTvWAQynuGomc
-VPf88ITMTOBjOH6YC8jKd/n2lVWLjw==
------END PRIVATE KEY-----
diff --git a/packages/OsuLogin/res/layout/osu_web_view.xml b/packages/OsuLogin/res/layout/osu_web_view.xml
deleted file mode 100644
index 4436aab..0000000
--- a/packages/OsuLogin/res/layout/osu_web_view.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-             xmlns:tools="http://schemas.android.com/tools"
-             android:id="@+id/container"
-             android:layout_width="match_parent"
-             android:layout_height="match_parent"
-             tools:context="com.android.hotspot2.osulogin.OsuLoginActivity">
-    <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="match_parent"
-        android:orientation="vertical">
-        <FrameLayout
-            android:layout_width="match_parent"
-            android:layout_height="4dp">
-
-            <!-- Eliminates ProgressBar padding by boxing it into a 4dp high container -->
-            <ProgressBar
-                android:id="@+id/progress_bar"
-                style="@android:style/Widget.Material.Light.ProgressBar.Horizontal"
-                android:indeterminate="false"
-                android:max="100"
-                android:progress="0"
-                android:layout_gravity="center"
-                android:layout_width="match_parent"
-                android:layout_height="wrap_content"/>
-        </FrameLayout>
-        <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
-            android:id="@+id/swipe_refresh"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent">
-        <WebView
-            android:id="@+id/webview"
-            android:layout_width="match_parent"
-            android:layout_height="match_parent"
-            android:layout_alignParentBottom="false"
-            android:layout_alignParentRight="false"/>
-        </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
-    </LinearLayout>
-</FrameLayout>
diff --git a/packages/OsuLogin/res/values-af/strings.xml b/packages/OsuLogin/res/values-af/strings.xml
deleted file mode 100644
index bfeee10..0000000
--- a/packages/OsuLogin/res/values-af/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Sluit aanlyn aan"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Kon nie aanmeld nie"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-am/strings.xml b/packages/OsuLogin/res/values-am/strings.xml
deleted file mode 100644
index e27c578..0000000
--- a/packages/OsuLogin/res/values-am/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"የመስመር ላይ ምዝገባ"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ምዝገባ አልተሳካም"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ar/strings.xml b/packages/OsuLogin/res/values-ar/strings.xml
deleted file mode 100644
index b72d7c1..0000000
--- a/packages/OsuLogin/res/values-ar/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"الاشتراك على الإنترنت"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"تعذّر الاشتراك."</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-as/strings.xml b/packages/OsuLogin/res/values-as/strings.xml
deleted file mode 100644
index 422de32..0000000
--- a/packages/OsuLogin/res/values-as/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"অনলাইনত ছাই আপ কৰক"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ছাইন আপ কৰিব পৰা নগ’ল"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-az/strings.xml b/packages/OsuLogin/res/values-az/strings.xml
deleted file mode 100644
index 977f939..0000000
--- a/packages/OsuLogin/res/values-az/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Onlayn Qeydiyyat"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Qeydiyyat alınmadı"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-b+sr+Latn/strings.xml b/packages/OsuLogin/res/values-b+sr+Latn/strings.xml
deleted file mode 100644
index 6eb2cc1..0000000
--- a/packages/OsuLogin/res/values-b+sr+Latn/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Onlajn registracija"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registracija nije uspela"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-be/strings.xml b/packages/OsuLogin/res/values-be/strings.xml
deleted file mode 100644
index 158c3f2..0000000
--- a/packages/OsuLogin/res/values-be/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Зарэгістравацца ў інтэрнэце"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Не ўдалося зарэгістравацца"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-bg/strings.xml b/packages/OsuLogin/res/values-bg/strings.xml
deleted file mode 100644
index ea3145d..0000000
--- a/packages/OsuLogin/res/values-bg/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Онлайн регистрация"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Регистрацията не бе успешна"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-bn/strings.xml b/packages/OsuLogin/res/values-bn/strings.xml
deleted file mode 100644
index c9f615e..0000000
--- a/packages/OsuLogin/res/values-bn/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"অনলাইনে সাইন-আপ করুন"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"সাইন-আপ করা যায়নি"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-bs/strings.xml b/packages/OsuLogin/res/values-bs/strings.xml
deleted file mode 100644
index e9b9751..0000000
--- a/packages/OsuLogin/res/values-bs/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online registracija"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registracija nije uspjela"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ca/strings.xml b/packages/OsuLogin/res/values-ca/strings.xml
deleted file mode 100644
index 7d93096..0000000
--- a/packages/OsuLogin/res/values-ca/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Registre en línia"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Ha fallat el registre"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-cs/strings.xml b/packages/OsuLogin/res/values-cs/strings.xml
deleted file mode 100644
index b9cb794..0000000
--- a/packages/OsuLogin/res/values-cs/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online registrace"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registrace selhala"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-da/strings.xml b/packages/OsuLogin/res/values-da/strings.xml
deleted file mode 100644
index 68c93b7..0000000
--- a/packages/OsuLogin/res/values-da/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online registrering"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registrering mislykkedes"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-de/strings.xml b/packages/OsuLogin/res/values-de/strings.xml
deleted file mode 100644
index 7e5a310..0000000
--- a/packages/OsuLogin/res/values-de/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online-Registrierung"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registrierung fehlgeschlagen"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-el/strings.xml b/packages/OsuLogin/res/values-el/strings.xml
deleted file mode 100644
index a58e481..0000000
--- a/packages/OsuLogin/res/values-el/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Εγγραφή στο διαδίκτυο"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Αποτυχία εγγραφής"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-en-rAU/strings.xml b/packages/OsuLogin/res/values-en-rAU/strings.xml
deleted file mode 100644
index fbbcab1..0000000
--- a/packages/OsuLogin/res/values-en-rAU/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online sign-up"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Sign-up failed"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-en-rCA/strings.xml b/packages/OsuLogin/res/values-en-rCA/strings.xml
deleted file mode 100644
index fbbcab1..0000000
--- a/packages/OsuLogin/res/values-en-rCA/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online sign-up"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Sign-up failed"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-en-rGB/strings.xml b/packages/OsuLogin/res/values-en-rGB/strings.xml
deleted file mode 100644
index fbbcab1..0000000
--- a/packages/OsuLogin/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online sign-up"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Sign-up failed"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-en-rIN/strings.xml b/packages/OsuLogin/res/values-en-rIN/strings.xml
deleted file mode 100644
index fbbcab1..0000000
--- a/packages/OsuLogin/res/values-en-rIN/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online sign-up"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Sign-up failed"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-en-rXC/strings.xml b/packages/OsuLogin/res/values-en-rXC/strings.xml
deleted file mode 100644
index af7ff67..0000000
--- a/packages/OsuLogin/res/values-en-rXC/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‎‏‎‏‏‏‎‏‏‎‏‎‏‏‏‏‎‎‏‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‏‎‎‎‎‏‎‏‏‎‏‎‎‏‎‏‎OsuLogin‎‏‎‎‏‎"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‏‏‏‏‏‏‎‏‎‎‏‎‏‏‎‎‎‎‏‏‏‏‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‎‏‎‎‏‎‎‏‎‏‎‏‎‏‎Online Sign Up‎‏‎‎‏‎"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‏‏‏‎‎‏‏‏‏‎‎‏‏‎‎‎‏‏‏‎‏‏‏‏‎‏‎‎‎‏‏‎‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‎‏‏‎‏‏‎‎‎‎‎Sign-up failed‎‏‎‎‏‎"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-es-rUS/strings.xml b/packages/OsuLogin/res/values-es-rUS/strings.xml
deleted file mode 100644
index 144804c..0000000
--- a/packages/OsuLogin/res/values-es-rUS/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Registrarse en línea"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Se produjo un error de registro"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-es/strings.xml b/packages/OsuLogin/res/values-es/strings.xml
deleted file mode 100644
index 3ad95cd..0000000
--- a/packages/OsuLogin/res/values-es/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Registro online"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Error al completar el registro"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-et/strings.xml b/packages/OsuLogin/res/values-et/strings.xml
deleted file mode 100644
index 94c5cea..0000000
--- a/packages/OsuLogin/res/values-et/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Veebis registreerimine"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registreerimine ebaõnnestus"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-eu/strings.xml b/packages/OsuLogin/res/values-eu/strings.xml
deleted file mode 100644
index 30caa87..0000000
--- a/packages/OsuLogin/res/values-eu/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Sarean izen-ematea"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Ezin izan da eman izena"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-fa/strings.xml b/packages/OsuLogin/res/values-fa/strings.xml
deleted file mode 100644
index 3005203..0000000
--- a/packages/OsuLogin/res/values-fa/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ثبت‌نام آنلاین"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ثبت‌نام انجام نشد"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-fi/strings.xml b/packages/OsuLogin/res/values-fi/strings.xml
deleted file mode 100644
index 24eac8a..0000000
--- a/packages/OsuLogin/res/values-fi/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Rekisteröidy verkossa"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Rekisteröityminen ei onnistunut"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-fr-rCA/strings.xml b/packages/OsuLogin/res/values-fr-rCA/strings.xml
deleted file mode 100644
index bcaa662..0000000
--- a/packages/OsuLogin/res/values-fr-rCA/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Inscription en ligne"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Échec de l\'inscription"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-fr/strings.xml b/packages/OsuLogin/res/values-fr/strings.xml
deleted file mode 100644
index bcaa662..0000000
--- a/packages/OsuLogin/res/values-fr/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Inscription en ligne"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Échec de l\'inscription"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-gl/strings.xml b/packages/OsuLogin/res/values-gl/strings.xml
deleted file mode 100644
index 5fc4444..0000000
--- a/packages/OsuLogin/res/values-gl/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Rexistro en liña"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Produciuse un erro co rexistro"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-gu/strings.xml b/packages/OsuLogin/res/values-gu/strings.xml
deleted file mode 100644
index 8449963..0000000
--- a/packages/OsuLogin/res/values-gu/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ઑનલાઇન સાઇન અપ કરો"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"સાઇન અપ નિષ્ફળ"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-hi/strings.xml b/packages/OsuLogin/res/values-hi/strings.xml
deleted file mode 100644
index 9e07438..0000000
--- a/packages/OsuLogin/res/values-hi/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ऑनलाइन साइन अप करें"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"साइन अप नहीं किया जा सका"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-hr/strings.xml b/packages/OsuLogin/res/values-hr/strings.xml
deleted file mode 100644
index e9b9751..0000000
--- a/packages/OsuLogin/res/values-hr/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online registracija"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registracija nije uspjela"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-hu/strings.xml b/packages/OsuLogin/res/values-hu/strings.xml
deleted file mode 100644
index cb0e036..0000000
--- a/packages/OsuLogin/res/values-hu/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online regisztráció"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"A regisztráció nem sikerült"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-hy/strings.xml b/packages/OsuLogin/res/values-hy/strings.xml
deleted file mode 100644
index ae1c36a..0000000
--- a/packages/OsuLogin/res/values-hy/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Առցանց գրանցում"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Չհաջողվեց գրանցվել"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-in/strings.xml b/packages/OsuLogin/res/values-in/strings.xml
deleted file mode 100644
index 6aaf694..0000000
--- a/packages/OsuLogin/res/values-in/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Pendaftaran Online"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Pendaftaran gagal"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-is/strings.xml b/packages/OsuLogin/res/values-is/strings.xml
deleted file mode 100644
index f1ae520..0000000
--- a/packages/OsuLogin/res/values-is/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Skráning á netinu"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Skráning mistókst"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-it/strings.xml b/packages/OsuLogin/res/values-it/strings.xml
deleted file mode 100644
index fbff7b0..0000000
--- a/packages/OsuLogin/res/values-it/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Registrazione online"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registrazione non riuscita"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-iw/strings.xml b/packages/OsuLogin/res/values-iw/strings.xml
deleted file mode 100644
index 866ef88..0000000
--- a/packages/OsuLogin/res/values-iw/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"הרשמה אונליין"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ההרשמה נכשלה"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ja/strings.xml b/packages/OsuLogin/res/values-ja/strings.xml
deleted file mode 100644
index 8a220d6..0000000
--- a/packages/OsuLogin/res/values-ja/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"オンライン登録"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"登録できませんでした"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ka/strings.xml b/packages/OsuLogin/res/values-ka/strings.xml
deleted file mode 100644
index bf08006..0000000
--- a/packages/OsuLogin/res/values-ka/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ონლაინ რეგისტრაცია"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"რეგისტრაცია ვერ მოხერხდა"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-kk/strings.xml b/packages/OsuLogin/res/values-kk/strings.xml
deleted file mode 100644
index 8b87356..0000000
--- a/packages/OsuLogin/res/values-kk/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Онлайн тіркелу"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Тіркелмеді."</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-km/strings.xml b/packages/OsuLogin/res/values-km/strings.xml
deleted file mode 100644
index f58ccc3..0000000
--- a/packages/OsuLogin/res/values-km/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ការចុះឈ្មោះ​លើអ៊ីនធឺណិត"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ការចុះឈ្មោះ​មិនបានសម្រេច"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-kn/strings.xml b/packages/OsuLogin/res/values-kn/strings.xml
deleted file mode 100644
index 49a6562..0000000
--- a/packages/OsuLogin/res/values-kn/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ಆನ್‌ಲೈನ್ ಸೈನ್ ಅಪ್"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ಸೈನ್ ಅಪ್ ವಿಫಲವಾಗಿದೆ"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ko/strings.xml b/packages/OsuLogin/res/values-ko/strings.xml
deleted file mode 100644
index e647ca0..0000000
--- a/packages/OsuLogin/res/values-ko/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"온라인 가입"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"가입에 실패했습니다."</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ky/strings.xml b/packages/OsuLogin/res/values-ky/strings.xml
deleted file mode 100644
index 42da248..0000000
--- a/packages/OsuLogin/res/values-ky/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Интернет аркылуу катталуу"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Катталган жоксуз"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-lo/strings.xml b/packages/OsuLogin/res/values-lo/strings.xml
deleted file mode 100644
index 9ff2241..0000000
--- a/packages/OsuLogin/res/values-lo/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ສະໝັກອອນລາຍ"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ສະໝັກບໍ່ສຳເລັດ"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-lt/strings.xml b/packages/OsuLogin/res/values-lt/strings.xml
deleted file mode 100644
index 1a4c06e..0000000
--- a/packages/OsuLogin/res/values-lt/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Internetinis prisiregistravimas"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Nepavyko prisiregistruoti"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-lv/strings.xml b/packages/OsuLogin/res/values-lv/strings.xml
deleted file mode 100644
index 11cdb97..0000000
--- a/packages/OsuLogin/res/values-lv/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Reģistrācija tiešsaistē"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Reģistrācija neizdevās."</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-mk/strings.xml b/packages/OsuLogin/res/values-mk/strings.xml
deleted file mode 100644
index de608e1..0000000
--- a/packages/OsuLogin/res/values-mk/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Онлајн регистрација"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Регистрацијата не успеа"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ml/strings.xml b/packages/OsuLogin/res/values-ml/strings.xml
deleted file mode 100644
index 8e797c8..0000000
--- a/packages/OsuLogin/res/values-ml/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ഓൺലെെൻ സെെൻ അപ്പ്"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"സൈൻ അപ്പ് ചെയ്യാനായില്ല"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-mn/strings.xml b/packages/OsuLogin/res/values-mn/strings.xml
deleted file mode 100644
index 59d79d0..0000000
--- a/packages/OsuLogin/res/values-mn/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Онлайнаар бүртгүүлэх"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Бүртгүүлж чадсангүй"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-mr/strings.xml b/packages/OsuLogin/res/values-mr/strings.xml
deleted file mode 100644
index 15479a6..0000000
--- a/packages/OsuLogin/res/values-mr/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ऑनलाइन साइन अप करा"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"साइन-अप करता आले नाही"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ms/strings.xml b/packages/OsuLogin/res/values-ms/strings.xml
deleted file mode 100644
index 7e1cf95..0000000
--- a/packages/OsuLogin/res/values-ms/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Pendaftaran Dalam Talian"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Pendaftaran gagal"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-my/strings.xml b/packages/OsuLogin/res/values-my/strings.xml
deleted file mode 100644
index 1bd992e..0000000
--- a/packages/OsuLogin/res/values-my/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"အွန်လိုင်း အကောင့်ဖွင့်ရန်"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"အကောင့်ဖွင့်၍ မရပါ"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-nb/strings.xml b/packages/OsuLogin/res/values-nb/strings.xml
deleted file mode 100644
index 2e0c47a1..0000000
--- a/packages/OsuLogin/res/values-nb/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Registrering på nettet"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registreringen mislyktes"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ne/strings.xml b/packages/OsuLogin/res/values-ne/strings.xml
deleted file mode 100644
index 16bd92f..0000000
--- a/packages/OsuLogin/res/values-ne/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"अनलाइन साइन अप"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"साइन अप गर्न सकिएन"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-nl/strings.xml b/packages/OsuLogin/res/values-nl/strings.xml
deleted file mode 100644
index 7cf8bd2..0000000
--- a/packages/OsuLogin/res/values-nl/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online aanmelding"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Aanmelding mislukt"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-or/strings.xml b/packages/OsuLogin/res/values-or/strings.xml
deleted file mode 100644
index e0584d7..0000000
--- a/packages/OsuLogin/res/values-or/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ଅନଲାଇନ୍ ସାଇନ୍ ଅପ୍ କରନ୍ତୁ"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ସାଇନ୍ ଅପ୍ ବିଫଳ ହୋଇଛି"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-pa/strings.xml b/packages/OsuLogin/res/values-pa/strings.xml
deleted file mode 100644
index 7e47d0e..0000000
--- a/packages/OsuLogin/res/values-pa/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ਆਨਲਾਈਨ ਸਾਈਨ-ਅੱਪ ਕਰੋ"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ਸਾਈਨ-ਅੱਪ ਕਰਨਾ ਅਸਫਲ ਰਿਹਾ"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-pl/strings.xml b/packages/OsuLogin/res/values-pl/strings.xml
deleted file mode 100644
index c0722ab..0000000
--- a/packages/OsuLogin/res/values-pl/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Rejestracja online"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Nie udało się zarejestrować"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-pt-rBR/strings.xml b/packages/OsuLogin/res/values-pt-rBR/strings.xml
deleted file mode 100644
index c9fe377..0000000
--- a/packages/OsuLogin/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Inscrição on-line"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Falha na inscrição"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-pt-rPT/strings.xml b/packages/OsuLogin/res/values-pt-rPT/strings.xml
deleted file mode 100644
index 0059281..0000000
--- a/packages/OsuLogin/res/values-pt-rPT/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Inscrição online"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Falha na inscrição."</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-pt/strings.xml b/packages/OsuLogin/res/values-pt/strings.xml
deleted file mode 100644
index c9fe377..0000000
--- a/packages/OsuLogin/res/values-pt/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Inscrição on-line"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Falha na inscrição"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ro/strings.xml b/packages/OsuLogin/res/values-ro/strings.xml
deleted file mode 100644
index eead127..0000000
--- a/packages/OsuLogin/res/values-ro/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Înscriere online"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Nu s-a înscris"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ru/strings.xml b/packages/OsuLogin/res/values-ru/strings.xml
deleted file mode 100644
index a271ef7..0000000
--- a/packages/OsuLogin/res/values-ru/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Регистрация в Интернете"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Не удалось зарегистрироваться."</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-si/strings.xml b/packages/OsuLogin/res/values-si/strings.xml
deleted file mode 100644
index 52e5979..0000000
--- a/packages/OsuLogin/res/values-si/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"සබැඳි ලියාපදිංචිය"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ලියාපදිංචිය අසාර්ථක විය"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-sk/strings.xml b/packages/OsuLogin/res/values-sk/strings.xml
deleted file mode 100644
index f6b9f70..0000000
--- a/packages/OsuLogin/res/values-sk/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online registrácia"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registrácia zlyhala"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-sl/strings.xml b/packages/OsuLogin/res/values-sl/strings.xml
deleted file mode 100644
index 6e6b95c..0000000
--- a/packages/OsuLogin/res/values-sl/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Spletna registracija"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registracija ni uspela"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-sq/strings.xml b/packages/OsuLogin/res/values-sq/strings.xml
deleted file mode 100644
index f67a238..0000000
--- a/packages/OsuLogin/res/values-sq/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Regjistrimi në linjë"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Regjistrimi dështoi"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-sr/strings.xml b/packages/OsuLogin/res/values-sr/strings.xml
deleted file mode 100644
index 14e0828..0000000
--- a/packages/OsuLogin/res/values-sr/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Онлајн регистрација"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Регистрација није успела"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-sv/strings.xml b/packages/OsuLogin/res/values-sv/strings.xml
deleted file mode 100644
index ea5fdfd..0000000
--- a/packages/OsuLogin/res/values-sv/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Registrering online"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registreringen misslyckades"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-sw/strings.xml b/packages/OsuLogin/res/values-sw/strings.xml
deleted file mode 100644
index c20a402..0000000
--- a/packages/OsuLogin/res/values-sw/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Kujisajili Mtandaoni"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Imeshindwa kukusajili"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ta/strings.xml b/packages/OsuLogin/res/values-ta/strings.xml
deleted file mode 100644
index e2eb567..0000000
--- a/packages/OsuLogin/res/values-ta/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ஆன்லைனில் பதிவு செய்"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"பதிவு செய்ய முடியவில்லை"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-te/strings.xml b/packages/OsuLogin/res/values-te/strings.xml
deleted file mode 100644
index 56b0b44..0000000
--- a/packages/OsuLogin/res/values-te/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"ఆన్‌లైన్ సైన్ అప్"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"సైన్-అప్ విఫలమయ్యింది"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-th/strings.xml b/packages/OsuLogin/res/values-th/strings.xml
deleted file mode 100644
index 552dca2..0000000
--- a/packages/OsuLogin/res/values-th/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"การลงชื่อสมัครใช้ออนไลน์"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"ลงชื่อสมัครใช้ไม่สำเร็จ"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-tl/strings.xml b/packages/OsuLogin/res/values-tl/strings.xml
deleted file mode 100644
index ba89e96..0000000
--- a/packages/OsuLogin/res/values-tl/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Pag-sign Up Online"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Hindi nakapag-sign up"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-tr/strings.xml b/packages/OsuLogin/res/values-tr/strings.xml
deleted file mode 100644
index 1d927fe..0000000
--- a/packages/OsuLogin/res/values-tr/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Online Kaydolma"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Kaydolma işlemi başarısız oldu"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-uk/strings.xml b/packages/OsuLogin/res/values-uk/strings.xml
deleted file mode 100644
index 6e60ff0..0000000
--- a/packages/OsuLogin/res/values-uk/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Онлайн-реєстрація"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Не вдалося зареєструватись"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-ur/strings.xml b/packages/OsuLogin/res/values-ur/strings.xml
deleted file mode 100644
index eed7686..0000000
--- a/packages/OsuLogin/res/values-ur/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"آن لائن سائن اپ کریں"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"سائن اپ ناکام ہو گیا"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-uz/strings.xml b/packages/OsuLogin/res/values-uz/strings.xml
deleted file mode 100644
index 152d129..0000000
--- a/packages/OsuLogin/res/values-uz/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Onlayn registratsiya"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Registratsiya qilinmadi"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-vi/strings.xml b/packages/OsuLogin/res/values-vi/strings.xml
deleted file mode 100644
index 84558076..0000000
--- a/packages/OsuLogin/res/values-vi/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Đăng ký trực tuyến"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Không đăng ký được"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-zh-rCN/strings.xml b/packages/OsuLogin/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 7f13647..0000000
--- a/packages/OsuLogin/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"在线注册"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"注册失败"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-zh-rHK/strings.xml b/packages/OsuLogin/res/values-zh-rHK/strings.xml
deleted file mode 100644
index 8731791..0000000
--- a/packages/OsuLogin/res/values-zh-rHK/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"網上申請"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"無法申請"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-zh-rTW/strings.xml b/packages/OsuLogin/res/values-zh-rTW/strings.xml
deleted file mode 100644
index 79208c8..0000000
--- a/packages/OsuLogin/res/values-zh-rTW/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"線上註冊"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"註冊失敗"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values-zu/strings.xml b/packages/OsuLogin/res/values-zu/strings.xml
deleted file mode 100644
index 27ac6bb..0000000
--- a/packages/OsuLogin/res/values-zu/strings.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
-    <string name="app_name" msgid="8288271429327488421">"I-OsuLogin"</string>
-    <string name="action_bar_label" msgid="550995560341508693">"Ukubhalisa Okuku-inthanethi"</string>
-    <string name="sign_up_failed" msgid="837216244603867568">"Ukubhalisa kuhlulekile"</string>
-</resources>
diff --git a/packages/OsuLogin/res/values/dimens.xml b/packages/OsuLogin/res/values/dimens.xml
deleted file mode 100644
index 47c8224..0000000
--- a/packages/OsuLogin/res/values/dimens.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<resources>
-    <!-- Default screen margins, per the Android Design guidelines. -->
-    <dimen name="activity_horizontal_margin">16dp</dimen>
-    <dimen name="activity_vertical_margin">16dp</dimen>
-</resources>
diff --git a/packages/OsuLogin/res/values/strings.xml b/packages/OsuLogin/res/values/strings.xml
deleted file mode 100644
index 14de0f5..0000000
--- a/packages/OsuLogin/res/values/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<resources>
-    <!-- application name [CHAR LIMIT=32] -->
-    <string name="app_name">OsuLogin</string>
-    <!-- action bar label [CHAR LIMIT=32] -->
-    <string name="action_bar_label">Online Sign Up</string>
-    <!-- toast message [CHAR LIMIT=32] -->
-    <string name="sign_up_failed">Sign-up failed</string>
-</resources>
diff --git a/packages/OsuLogin/res/values/styles.xml b/packages/OsuLogin/res/values/styles.xml
deleted file mode 100644
index f6c2339..0000000
--- a/packages/OsuLogin/res/values/styles.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<resources>
-
-    <!--
-        Base application theme, dependent on API level. This theme is replaced
-        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
-    -->
-    <style name="AppBaseTheme" parent="@android:style/Theme.DeviceDefault.Settings">
-        <!--
-            Theme customizations available in newer API levels can go in
-            res/values-vXX/styles.xml, while customizations related to
-            backward-compatibility can go here.
-        -->
-    </style>
-
-    <!-- Application theme. -->
-    <style name="AppTheme" parent="AppBaseTheme">
-        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
-    </style>
-</resources>
diff --git a/packages/OsuLogin/res/xml/network_security_config.xml b/packages/OsuLogin/res/xml/network_security_config.xml
deleted file mode 100644
index 3ef4b84..0000000
--- a/packages/OsuLogin/res/xml/network_security_config.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<network-security-config>
-<base-config cleartextTrafficPermitted="true">
-    <trust-anchors>
-        <certificates src="system" />
-        <certificates src="wfa" />
-    </trust-anchors>
-</base-config>
-</network-security-config>
diff --git a/packages/OsuLogin/src/com/android/hotspot2/osulogin/OsuLoginActivity.java b/packages/OsuLogin/src/com/android/hotspot2/osulogin/OsuLoginActivity.java
deleted file mode 100644
index 9797846..0000000
--- a/packages/OsuLogin/src/com/android/hotspot2/osulogin/OsuLoginActivity.java
+++ /dev/null
@@ -1,281 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.hotspot2.osulogin;
-
-import static android.net.NetworkCapabilities.NET_CAPABILITY_TRUSTED;
-
-import android.app.Activity;
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.net.ConnectivityManager;
-import android.net.Network;
-import android.net.NetworkCapabilities;
-import android.net.NetworkRequest;
-import android.net.wifi.WifiManager;
-import android.os.Bundle;
-import android.util.Log;
-import android.view.KeyEvent;
-import android.view.View;
-import android.webkit.WebChromeClient;
-import android.webkit.WebResourceError;
-import android.webkit.WebResourceRequest;
-import android.webkit.WebSettings;
-import android.webkit.WebView;
-import android.webkit.WebViewClient;
-import android.widget.ProgressBar;
-import android.widget.Toast;
-
-import androidx.annotation.Nullable;
-import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-/**
- * Online Sign Up Login Web View launched during Provision Process of Hotspot 2.0 rel2.
- */
-public class OsuLoginActivity extends Activity {
-    private static final String TAG = "OsuLogin";
-    private static final boolean DBG = true;
-
-    private String mUrl;
-    private String mHostName;
-    private Network mNetwork;
-    private ConnectivityManager mCm;
-    private ConnectivityManager.NetworkCallback mNetworkCallback;
-    private WifiManager mWifiManager;
-    private WebView mWebView;
-    private SwipeRefreshLayout mSwipeRefreshLayout;
-    private ProgressBar mProgressBar;
-    private boolean mForceDisconnect = true;
-    boolean mRedirectResponseReceived = false;
-
-    @Override
-    protected void onCreate(@Nullable Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        if (DBG) {
-            Log.d(TAG, "onCreate: Opening OSU Web View");
-        }
-
-        mWifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
-        if (mWifiManager == null) {
-            Log.e(TAG, "Cannot get wifi service");
-            finishAndRemoveTask();
-            return;
-        }
-
-        if (getIntent() == null) {
-            Log.e(TAG, "Intent is null");
-            finishAndRemoveTask();
-            return;
-        }
-
-        mNetwork = getIntent().getParcelableExtra(WifiManager.EXTRA_OSU_NETWORK);
-        if (mNetwork == null) {
-            Log.e(TAG, "Cannot get the network instance for OSU from intent");
-            finishAndRemoveTask();
-            return;
-        }
-
-        mUrl = getIntent().getStringExtra(WifiManager.EXTRA_URL);
-        if (mUrl == null) {
-            Log.e(TAG, "Cannot get OSU server url from intent");
-            finishAndRemoveTask();
-            return;
-        }
-
-        mHostName = getHost(mUrl);
-        if (mHostName == null) {
-            Log.e(TAG, "Cannot get host from the url");
-            finishAndRemoveTask();
-            return;
-        }
-
-        mCm = (ConnectivityManager) getApplicationContext().getSystemService(
-                Context.CONNECTIVITY_SERVICE);
-        if (mCm == null) {
-            Log.e(TAG, "Cannot get connectivity service");
-            finishAndRemoveTask();
-            return;
-        }
-
-        if (!mCm.bindProcessToNetwork(mNetwork)) {
-            Log.e(TAG, "Network is no longer valid");
-            finishAndRemoveTask();
-            return;
-        }
-
-        final NetworkCapabilities networkCapabilities = mCm.getNetworkCapabilities(mNetwork);
-        if (networkCapabilities == null || !networkCapabilities.hasTransport(
-                NetworkCapabilities.TRANSPORT_WIFI)) {
-            Log.e(TAG, "WiFi is not supported for the Network");
-            finishAndRemoveTask();
-            return;
-        }
-
-        getActionBar().setDisplayShowHomeEnabled(false);
-        getActionBar().setElevation(0); // remove shadow
-        getActionBar().setTitle(getString(R.string.action_bar_label));
-        getActionBar().setSubtitle("");
-        setContentView(R.layout.osu_web_view);
-
-        // Exit this app if network disappeared.
-        mNetworkCallback = new ConnectivityManager.NetworkCallback() {
-            @Override
-            public void onLost(Network network) {
-                if (DBG) {
-                    Log.d(TAG, "Lost for the current Network, close the browser");
-                }
-                mForceDisconnect = false; // It is already disconnected.
-                if (!mRedirectResponseReceived) {
-                    showSignUpFailedToast();
-                }
-                if (mNetwork.equals(network)) {
-                    finishAndRemoveTask();
-                }
-            }
-        };
-
-        mCm.registerNetworkCallback(
-                new NetworkRequest.Builder().addTransportType(
-                        NetworkCapabilities.TRANSPORT_WIFI).removeCapability(
-                        NET_CAPABILITY_TRUSTED).build(),
-                mNetworkCallback);
-
-        mWebView = findViewById(R.id.webview);
-        mWebView.clearCache(true);
-        WebSettings webSettings = mWebView.getSettings();
-        webSettings.setJavaScriptEnabled(true);
-        webSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
-        webSettings.setUseWideViewPort(true);
-        webSettings.setLoadWithOverviewMode(true);
-        webSettings.setSupportZoom(true);
-        webSettings.setBuiltInZoomControls(true);
-        webSettings.setDisplayZoomControls(false);
-        mProgressBar = findViewById(R.id.progress_bar);
-        mWebView.setWebViewClient(new OsuWebViewClient());
-        mWebView.setWebChromeClient(new WebChromeClient() {
-            @Override
-            public void onProgressChanged(WebView view, int newProgress) {
-                mProgressBar.setProgress(newProgress);
-            }
-        });
-
-        if (DBG) {
-            Log.d(TAG, "OSU Web View to " + mUrl);
-        }
-
-        mWebView.loadUrl(mUrl);
-        mSwipeRefreshLayout = findViewById(R.id.swipe_refresh);
-        mSwipeRefreshLayout.setOnRefreshListener(() -> {
-            mWebView.reload();
-            mSwipeRefreshLayout.setRefreshing(true);
-        });
-    }
-
-    @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event) {
-        // Check if the key event was the Back button.
-        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
-            // If there is a history to move back
-            if (mWebView.canGoBack()) {
-                mWebView.goBack();
-                return true;
-            }
-        }
-        return super.onKeyDown(keyCode, event);
-    }
-
-    @Override
-    protected void onDestroy() {
-        if (mNetworkCallback != null) {
-            mCm.unregisterNetworkCallback(mNetworkCallback);
-            mNetworkCallback = null;
-        }
-        if (mWifiManager != null && mForceDisconnect) {
-            mWifiManager.disconnect();
-            mWifiManager = null;
-        }
-        super.onDestroy();
-    }
-
-    private String getHost(String url) {
-        try {
-            return new URL(url).getHost();
-        } catch (MalformedURLException e) {
-            Log.e(TAG, "Invalid URL " + url);
-        }
-        return null;
-    }
-
-    private String getHeaderSubtitle(String urlString) {
-        try {
-            URL url = new URL(urlString);
-            return url.getProtocol() + "://" +  url.getHost();
-        } catch (MalformedURLException e) {
-            Log.e(TAG, "Invalid URL " + urlString);
-        }
-        return "";
-    }
-
-    private void showSignUpFailedToast() {
-        Toast.makeText(getApplicationContext(), R.string.sign_up_failed,
-                Toast.LENGTH_SHORT).show();
-    }
-
-    private class OsuWebViewClient extends WebViewClient {
-        boolean mPageError = false;
-
-        @Override
-        public void onPageStarted(WebView view, String urlString, Bitmap favicon) {
-            String subtitle = getHeaderSubtitle(urlString);
-            getActionBar().setSubtitle(subtitle);
-            mProgressBar.setVisibility(View.VISIBLE);
-        }
-
-        @Override
-        public void onPageFinished(WebView view, String url) {
-            mProgressBar.setVisibility(View.INVISIBLE);
-            mSwipeRefreshLayout.setRefreshing(false);
-
-            // Do not show the page error on UI.
-            if (mPageError) {
-                if (mRedirectResponseReceived) {
-                    // Do not disconnect current connection while provisioning is in progress.
-                    mForceDisconnect = false;
-                }
-                finishAndRemoveTask();
-            }
-        }
-
-        @Override
-        public void onReceivedError(WebView view, WebResourceRequest request,
-                WebResourceError error) {
-            if (request.getUrl().toString().startsWith("http://127.0.0.1")) {
-                mRedirectResponseReceived = true;
-                view.stopLoading();
-            }
-
-            if (request.isForMainFrame()) {
-                // This happens right after getting HTTP redirect response from an OSU server
-                // since no more Http request is allowed to send to the OSU server.
-                mPageError = true;
-                Log.e(TAG, "onReceived Error for MainFrame: " + error.getErrorCode());
-            }
-        }
-    }
-}
diff --git a/packages/PrintSpooler/res/values-fr-rCA/strings.xml b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
index 082c148..3b7775a 100644
--- a/packages/PrintSpooler/res/values-fr-rCA/strings.xml
+++ b/packages/PrintSpooler/res/values-fr-rCA/strings.xml
@@ -57,7 +57,6 @@
     <string name="print_forget_printer" msgid="5035287497291910766">"Supprimer l\'imprimante"</string>
     <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
       <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimante trouvée</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item>
       <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimante trouvées</item>
     </plurals>
     <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> - <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
@@ -78,7 +77,6 @@
     <string name="all_services_title" msgid="5578662754874906455">"Tous les services"</string>
     <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138">
       <item quantity="one">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimante</item>
-      <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item>
       <item quantity="other">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimantes</item>
     </plurals>
     <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de <xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g> en cours…"</string>
diff --git a/packages/PrintSpooler/res/values-fr/strings.xml b/packages/PrintSpooler/res/values-fr/strings.xml
index 560c5dc..f6e901d 100644
--- a/packages/PrintSpooler/res/values-fr/strings.xml
+++ b/packages/PrintSpooler/res/values-fr/strings.xml
@@ -57,7 +57,6 @@
     <string name="print_forget_printer" msgid="5035287497291910766">"Supprimer l\'imprimante"</string>
     <plurals name="print_search_result_count_utterance" formatted="false" msgid="6997663738361080868">
       <item quantity="one"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimante trouvée</item>
-      <item quantity="many"><xliff:g id="COUNT_1">%1$s</xliff:g> printers found</item>
       <item quantity="other"><xliff:g id="COUNT_1">%1$s</xliff:g> imprimantes trouvées</item>
     </plurals>
     <string name="printer_extended_description_template" msgid="1366699227703381874">"<xliff:g id="PRINT_SERVICE_LABEL">%1$s</xliff:g> – <xliff:g id="PRINTER_DESCRIPTION">%2$s</xliff:g>"</string>
@@ -78,7 +77,6 @@
     <string name="all_services_title" msgid="5578662754874906455">"Tous les services"</string>
     <plurals name="print_services_recommendation_subtitle" formatted="false" msgid="5678487708807185138">
       <item quantity="one">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimante</item>
-      <item quantity="many">Install to discover <xliff:g id="COUNT_1">%1$s</xliff:g> printers</item>
       <item quantity="other">Installer pour détecter <xliff:g id="COUNT_1">%1$s</xliff:g> imprimantes</item>
     </plurals>
     <string name="printing_notification_title_template" msgid="295903957762447362">"Impression de \"<xliff:g id="PRINT_JOB_NAME">%1$s</xliff:g>\" en cours…"</string>
diff --git a/packages/SettingsProvider/OWNERS b/packages/SettingsProvider/OWNERS
index b2ac4f4..cf9799c 100644
--- a/packages/SettingsProvider/OWNERS
+++ b/packages/SettingsProvider/OWNERS
@@ -1,3 +1,4 @@
+hackbod@android.com
 hackbod@google.com
 narayan@google.com
 svetoslavganov@google.com
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 2eafc2f..3e858c2 100644
--- a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
@@ -65,7 +65,6 @@
     <string name="kg_wrong_pin" msgid="4160978845968732624">"NIP incorrect"</string>
     <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
       <item quantity="one">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
-      <item quantity="many">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
       <item quantity="other">Réessayer dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
     </plurals>
     <string name="kg_pattern_instructions" msgid="5376036737065051736">"Dessinez votre schéma"</string>
@@ -89,13 +88,11 @@
     <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"NIP de carte SIM incorrect. Vous devez maintenant communiquer avec votre fournisseur de services pour déverrouiller votre appareil."</string>
     <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="7030584350995485026">
       <item quantity="one">Le NIP de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item>
-      <item quantity="many">Incorrect SIM PIN code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
       <item quantity="other">Le NIP de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives.</item>
     </plurals>
     <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"La carte SIM est inutilisable. Communiquez avec votre fournisseur de services."</string>
     <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="3937306685604862886">
       <item quantity="one">Le code PUK de la carte SIM est incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM devienne définitivement inutilisable.</item>
-      <item quantity="many">Incorrect SIM PUK code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item>
       <item quantity="other">Le code PUK de la carte SIM est incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM devienne définitivement inutilisable.</item>
     </plurals>
     <string name="kg_password_pin_failed" msgid="5136259126330604009">"Le déverrouillage par NIP de la carte SIM a échoué."</string>
@@ -117,29 +114,24 @@
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"L\'appareil a été verrouillé manuellement"</string>
     <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="1337428979661197957">
       <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le schéma.</item>
-      <item quantity="many">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm pattern.</item>
       <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le schéma.</item>
     </plurals>
     <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="6444519502336330270">
       <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le NIP.</item>
-      <item quantity="many">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm PIN.</item>
       <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le NIP.</item>
     </plurals>
     <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="5343961527665116914">
       <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le mot de passe.</item>
-      <item quantity="many">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
       <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le mot de passe.</item>
     </plurals>
     <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Doigt non reconnu"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Doigt non reconnu"</string>
     <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
       <item quantity="one">Entrez le NIP de votre carte SIM. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item>
-      <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
       <item quantity="other">Entrez le NIP de votre carte SIM. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives.</item>
     </plurals>
     <plurals name="kg_password_default_puk_message" formatted="false" msgid="571308542462946935">
       <item quantity="one">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item>
-      <item quantity="many">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact carrier for details.</item>
       <item quantity="other">La carte SIM est maintenant désactivée. Entrez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM devienne définitivement inutilisable. Pour obtenir plus de détails, communiquez avec votre fournisseur de services.</item>
     </plurals>
     <string name="clock_title_default" msgid="6342735240617459864">"Par défaut"</string>
diff --git a/packages/SystemUI/res-keyguard/values-fr/strings.xml b/packages/SystemUI/res-keyguard/values-fr/strings.xml
index 824ea41..8551fab 100644
--- a/packages/SystemUI/res-keyguard/values-fr/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-fr/strings.xml
@@ -65,7 +65,6 @@
     <string name="kg_wrong_pin" msgid="4160978845968732624">"Code incorrect"</string>
     <plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="991400408675793914">
       <item quantity="one">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> seconde.</item>
-      <item quantity="many">Try again in <xliff:g id="NUMBER">%d</xliff:g> seconds.</item>
       <item quantity="other">Réessayez dans <xliff:g id="NUMBER">%d</xliff:g> secondes.</item>
     </plurals>
     <string name="kg_pattern_instructions" msgid="5376036737065051736">"Dessinez votre schéma"</string>
@@ -89,13 +88,11 @@
     <string name="kg_password_wrong_pin_code_pukked" msgid="8047350661459040581">"Code PIN de la carte SIM incorrect. Vous devez désormais contacter votre opérateur pour déverrouiller votre appareil."</string>
     <plurals name="kg_password_wrong_pin_code" formatted="false" msgid="7030584350995485026">
       <item quantity="one">Code PIN de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative.</item>
-      <item quantity="many">Incorrect SIM PIN code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
       <item quantity="other">Code PIN de la carte SIM incorrect. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives.</item>
     </plurals>
     <string name="kg_password_wrong_puk_code_dead" msgid="3698285357028468617">"La carte SIM est inutilisable. Contactez votre opérateur."</string>
     <plurals name="kg_password_wrong_puk_code" formatted="false" msgid="3937306685604862886">
       <item quantity="one">Clé PUK de la carte SIM incorrecte. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne devienne définitivement inutilisable.</item>
-      <item quantity="many">Incorrect SIM PUK code, you have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable.</item>
       <item quantity="other">Clé PUK de la carte SIM incorrecte. Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne devienne définitivement inutilisable.</item>
     </plurals>
     <string name="kg_password_pin_failed" msgid="5136259126330604009">"Échec du déverrouillage à l\'aide du code PIN de la carte SIM."</string>
@@ -117,29 +114,24 @@
     <string name="kg_prompt_reason_user_request" msgid="6015774877733717904">"Appareil verrouillé manuellement"</string>
     <plurals name="kg_prompt_reason_time_pattern" formatted="false" msgid="1337428979661197957">
       <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le schéma.</item>
-      <item quantity="many">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm pattern.</item>
       <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le schéma.</item>
     </plurals>
     <plurals name="kg_prompt_reason_time_pin" formatted="false" msgid="6444519502336330270">
       <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le code.</item>
-      <item quantity="many">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm PIN.</item>
       <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le code.</item>
     </plurals>
     <plurals name="kg_prompt_reason_time_password" formatted="false" msgid="5343961527665116914">
       <item quantity="one">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heure. Confirmez le mot de passe.</item>
-      <item quantity="many">Device hasn\'t been unlocked for <xliff:g id="NUMBER_1">%d</xliff:g> hours. Confirm password.</item>
       <item quantity="other">L\'appareil n\'a pas été déverrouillé depuis <xliff:g id="NUMBER_1">%d</xliff:g> heures. Confirmez le mot de passe.</item>
     </plurals>
     <string name="kg_fingerprint_not_recognized" msgid="5982606907039479545">"Non reconnu"</string>
     <string name="kg_face_not_recognized" msgid="7903950626744419160">"Non reconnu"</string>
     <plurals name="kg_password_default_pin_message" formatted="false" msgid="7730152526369857818">
       <item quantity="one">Saisissez le code de la carte SIM. <xliff:g id="NUMBER_1">%d</xliff:g> tentative restante.</item>
-      <item quantity="many">Enter SIM PIN. You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts.</item>
       <item quantity="other">Saisissez le code de la carte SIM. <xliff:g id="NUMBER_1">%d</xliff:g> tentatives restantes.</item>
     </plurals>
     <plurals name="kg_password_default_puk_message" formatted="false" msgid="571308542462946935">
       <item quantity="one">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item>
-      <item quantity="many">SIM is now disabled. Enter PUK code to continue. You have <xliff:g id="_NUMBER_1">%d</xliff:g> remaining attempts before SIM becomes permanently unusable. Contact carrier for details.</item>
       <item quantity="other">La carte SIM est maintenant désactivée. Saisissez le code PUK pour continuer. Il vous reste <xliff:g id="_NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne devienne définitivement inutilisable. Pour de plus amples informations, veuillez contacter votre opérateur.</item>
     </plurals>
     <string name="clock_title_default" msgid="6342735240617459864">"Par défaut"</string>
diff --git a/packages/SystemUI/res-keyguard/values-uz/strings.xml b/packages/SystemUI/res-keyguard/values-uz/strings.xml
index 323fea5..d19f30e 100644
--- a/packages/SystemUI/res-keyguard/values-uz/strings.xml
+++ b/packages/SystemUI/res-keyguard/values-uz/strings.xml
@@ -101,9 +101,9 @@
     <string name="keyguard_carrier_default" msgid="6359808469637388586">"Aloqa yo‘q."</string>
     <string name="accessibility_ime_switch_button" msgid="9082358310194861329">"Matn kiritish usulini almashtirish"</string>
     <string name="airplane_mode" msgid="2528005343938497866">"Parvoz rejimi"</string>
-    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Qurilma o‘chirib yoqilgandan keyin grafik kalit talab qilinadi"</string>
-    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Qurilma o‘chirib yoqilgandan keyin PIN kod talab qilinadi"</string>
-    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Qurilma o‘chirib yoqilgandan keyin parol talab qilinadi"</string>
+    <string name="kg_prompt_reason_restart_pattern" msgid="4720554342633852066">"Qurilma qayta ishga tushganidan keyin grafik kalitni kiritish zarur"</string>
+    <string name="kg_prompt_reason_restart_pin" msgid="1587671566498057656">"Qurilma qayta ishga tushganidan keyin PIN kodni kiritish zarur"</string>
+    <string name="kg_prompt_reason_restart_password" msgid="8061279087240952002">"Qurilma qayta ishga tushganidan keyin parolni kiritish zarur"</string>
     <string name="kg_prompt_reason_timeout_pattern" msgid="9170360502528959889">"Qo‘shimcha xavfsizlik chorasi sifatida grafik kalit talab qilinadi"</string>
     <string name="kg_prompt_reason_timeout_pin" msgid="5945186097160029201">"Qo‘shimcha xavfsizlik chorasi sifatida PIN kod talab qilinadi"</string>
     <string name="kg_prompt_reason_timeout_password" msgid="2258263949430384278">"Qo‘shimcha xavfsizlik chorasi sifatida parol talab qilinadi"</string>
diff --git a/packages/SystemUI/res/values-fr-rCA/strings.xml b/packages/SystemUI/res/values-fr-rCA/strings.xml
index 9e9eb85..6baa848 100644
--- a/packages/SystemUI/res/values-fr-rCA/strings.xml
+++ b/packages/SystemUI/res/values-fr-rCA/strings.xml
@@ -325,7 +325,6 @@
     <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"+ <xliff:g id="NUMBER">%s</xliff:g>"</string>
     <plurals name="notification_group_overflow_description" formatted="false" msgid="91483442850649192">
       <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> autre notification à l\'intérieur.</item>
-      <item quantity="many"><xliff:g id="NUMBER_1">%s</xliff:g> more notifications inside.</item>
       <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> autres notifications à l\'intérieur.</item>
     </plurals>
     <string name="notification_summary_message_format" msgid="5158219088501909966">"<xliff:g id="CONTACT_NAME">%1$s</xliff:g> : <xliff:g id="MESSAGE_CONTENT">%2$s</xliff:g>"</string>
@@ -401,7 +400,6 @@
     <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Écon. données activé"</string>
     <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976">
       <item quantity="one">%d appareil</item>
-      <item quantity="many">%d devices</item>
       <item quantity="other">%d appareils</item>
     </plurals>
     <string name="quick_settings_notifications_label" msgid="3379631363952582758">"Notifications"</string>
@@ -494,7 +492,6 @@
     <string name="user_limit_reached_title" msgid="2429229448830346057">"Limite d\'utilisateurs atteinte"</string>
     <plurals name="user_limit_reached_message" formatted="false" msgid="2573535787802908398">
       <item quantity="one">Vous pouvez ajouter jusqu\'à <xliff:g id="COUNT">%d</xliff:g> utilisateur.</item>
-      <item quantity="many">You can add up to <xliff:g id="COUNT">%d</xliff:g> users.</item>
       <item quantity="other">Vous pouvez ajouter jusqu\'à <xliff:g id="COUNT">%d</xliff:g> utilisateurs.</item>
     </plurals>
     <string name="user_remove_user_title" msgid="9124124694835811874">"Supprimer l\'utilisateur?"</string>
@@ -761,12 +758,10 @@
     <string name="snoozed_for_time" msgid="7586689374860469469">"Reporté pour <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2066838694120718170">
       <item quantity="one">%d heure</item>
-      <item quantity="many">%d hours</item>
       <item quantity="other">%d heures</item>
     </plurals>
     <plurals name="snoozeMinuteOptions" formatted="false" msgid="8998483159208055980">
       <item quantity="one">%d minute</item>
-      <item quantity="many">%d minutes</item>
       <item quantity="other">%d minutes</item>
     </plurals>
     <string name="battery_panel_title" msgid="5931157246673665963">"Utilisation de la pile"</string>
@@ -1045,7 +1040,6 @@
     <string name="controls_providers_title" msgid="6879775889857085056">"Sélectionnez l\'application pour laquelle ajouter des commandes"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
       <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> commande ajoutée.</item>
-      <item quantity="many"><xliff:g id="NUMBER_1">%s</xliff:g> controls added.</item>
       <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> commandes ajoutées.</item>
     </plurals>
     <string name="controls_removed" msgid="3731789252222856959">"Supprimé"</string>
diff --git a/packages/SystemUI/res/values-fr/strings.xml b/packages/SystemUI/res/values-fr/strings.xml
index 5d1b3a1..ad258b2 100644
--- a/packages/SystemUI/res/values-fr/strings.xml
+++ b/packages/SystemUI/res/values-fr/strings.xml
@@ -325,7 +325,6 @@
     <string name="notification_group_overflow_indicator" msgid="7605120293801012648">"<xliff:g id="NUMBER">%s</xliff:g> autres"</string>
     <plurals name="notification_group_overflow_description" formatted="false" msgid="91483442850649192">
       <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> autre notification à l\'intérieur.</item>
-      <item quantity="many"><xliff:g id="NUMBER_1">%s</xliff:g> more notifications inside.</item>
       <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> autres notifications à l\'intérieur.</item>
     </plurals>
     <string name="notification_summary_message_format" msgid="5158219088501909966">"<xliff:g id="CONTACT_NAME">%1$s</xliff:g> : <xliff:g id="MESSAGE_CONTENT">%2$s</xliff:g>"</string>
@@ -401,7 +400,6 @@
     <string name="quick_settings_hotspot_secondary_label_data_saver_enabled" msgid="1280433136266439372">"Écon. données activé"</string>
     <plurals name="quick_settings_hotspot_secondary_label_num_devices" formatted="false" msgid="3142308865165871976">
       <item quantity="one">%d appareil</item>
-      <item quantity="many">%d devices</item>
       <item quantity="other">%d appareils</item>
     </plurals>
     <string name="quick_settings_notifications_label" msgid="3379631363952582758">"Notifications"</string>
@@ -494,7 +492,6 @@
     <string name="user_limit_reached_title" msgid="2429229448830346057">"Limite nombre utilisateurs atteinte"</string>
     <plurals name="user_limit_reached_message" formatted="false" msgid="2573535787802908398">
       <item quantity="one">Vous pouvez ajouter <xliff:g id="COUNT">%d</xliff:g> profil utilisateur.</item>
-      <item quantity="many">You can add up to <xliff:g id="COUNT">%d</xliff:g> users.</item>
       <item quantity="other">Vous pouvez ajouter jusqu\'à <xliff:g id="COUNT">%d</xliff:g> profils utilisateur.</item>
     </plurals>
     <string name="user_remove_user_title" msgid="9124124694835811874">"Supprimer l\'utilisateur ?"</string>
@@ -761,12 +758,10 @@
     <string name="snoozed_for_time" msgid="7586689374860469469">"Répétée après <xliff:g id="TIME_AMOUNT">%1$s</xliff:g>"</string>
     <plurals name="snoozeHourOptions" formatted="false" msgid="2066838694120718170">
       <item quantity="one">%d heure</item>
-      <item quantity="many">%d hours</item>
       <item quantity="other">%d heures</item>
     </plurals>
     <plurals name="snoozeMinuteOptions" formatted="false" msgid="8998483159208055980">
       <item quantity="one">%d minute</item>
-      <item quantity="many">%d minutes</item>
       <item quantity="other">%d minutes</item>
     </plurals>
     <string name="battery_panel_title" msgid="5931157246673665963">"Utilisation batterie"</string>
@@ -1045,7 +1040,6 @@
     <string name="controls_providers_title" msgid="6879775889857085056">"Sélectionnez l\'appli pour laquelle ajouter des commandes"</string>
     <plurals name="controls_number_of_favorites" formatted="false" msgid="1057347832073807380">
       <item quantity="one"><xliff:g id="NUMBER_1">%s</xliff:g> commande ajoutée.</item>
-      <item quantity="many"><xliff:g id="NUMBER_1">%s</xliff:g> controls added.</item>
       <item quantity="other"><xliff:g id="NUMBER_1">%s</xliff:g> commandes ajoutées.</item>
     </plurals>
     <string name="controls_removed" msgid="3731789252222856959">"Supprimé"</string>
diff --git a/packages/SystemUI/res/values-mn/strings.xml b/packages/SystemUI/res/values-mn/strings.xml
index cc8b5fe..f6b71e4 100644
--- a/packages/SystemUI/res/values-mn/strings.xml
+++ b/packages/SystemUI/res/values-mn/strings.xml
@@ -776,7 +776,7 @@
     <string name="keyboard_key_dpad_left" msgid="8329738048908755640">"Зүүн"</string>
     <string name="keyboard_key_dpad_right" msgid="6282105433822321767">"Баруун"</string>
     <string name="keyboard_key_dpad_center" msgid="4079412840715672825">"Гол хэсэг"</string>
-    <string name="keyboard_key_tab" msgid="4592772350906496730">"Чихтэй хуудас"</string>
+    <string name="keyboard_key_tab" msgid="4592772350906496730">"Таб"</string>
     <string name="keyboard_key_space" msgid="6980847564173394012">"Зай"</string>
     <string name="keyboard_key_enter" msgid="8633362970109751646">"Оруулах"</string>
     <string name="keyboard_key_backspace" msgid="4095278312039628074">"Арилгах"</string>
@@ -826,7 +826,7 @@
     <string name="switch_bar_on" msgid="1770868129120096114">"Идэвхтэй"</string>
     <string name="switch_bar_off" msgid="5669805115416379556">"Идэвхгүй"</string>
     <string name="tile_unavailable" msgid="3095879009136616920">"Боломжгүй"</string>
-    <string name="nav_bar" msgid="4642708685386136807">"Навигацийн самбар"</string>
+    <string name="nav_bar" msgid="4642708685386136807">"Навигацын самбар"</string>
     <string name="nav_bar_layout" msgid="4716392484772899544">"Бүдүүвч"</string>
     <string name="left_nav_bar_button_type" msgid="2634852842345192790">"Нэмэлт зүүн товчлуураар шивэх"</string>
     <string name="right_nav_bar_button_type" msgid="4472566498647364715">"Нэмэлт баруун товчлуураар шивэх"</string>
@@ -848,7 +848,7 @@
     <string name="reset" msgid="8715144064608810383">"Шинэчлэх"</string>
     <string name="adjust_button_width" msgid="8313444823666482197">"Товчлуурын өргөнг тохируулах"</string>
     <string name="clipboard" msgid="8517342737534284617">"Түр санах ой"</string>
-    <string name="accessibility_key" msgid="3471162841552818281">"Навигацийн товчлуурыг өөрчлөх"</string>
+    <string name="accessibility_key" msgid="3471162841552818281">"Навигацын товчлуурыг өөрчлөх"</string>
     <string name="left_keycode" msgid="8211040899126637342">"Зүүн түлхүүрийн код"</string>
     <string name="right_keycode" msgid="2480715509844798438">"Баруун түлхүүрийн код"</string>
     <string name="left_icon" msgid="5036278531966897006">"Зүүн дүрс тэмдэг"</string>
diff --git a/packages/SystemUI/res/values-pt-rPT/strings.xml b/packages/SystemUI/res/values-pt-rPT/strings.xml
index 9c69703..555b1c0 100644
--- a/packages/SystemUI/res/values-pt-rPT/strings.xml
+++ b/packages/SystemUI/res/values-pt-rPT/strings.xml
@@ -563,9 +563,9 @@
     <string name="monitoring_description_vpn_settings" msgid="5264167033247632071">"Abrir as definições de VPN"</string>
     <string name="monitoring_description_ca_cert_settings_separator" msgid="7107390013344435439">" "</string>
     <string name="monitoring_description_ca_cert_settings" msgid="8329781950135541003">"Abrir credenciais fidedignas"</string>
-    <string name="monitoring_description_network_logging" msgid="577305979174002252">"O seu gestor ativou os registos de rede, que monitorizam o tráfego no seu dispositivo.\n\nPara obter mais informações, contacte o gestor."</string>
+    <string name="monitoring_description_network_logging" msgid="577305979174002252">"O seu gestor ativou os registos de rede, que monitorizam o tráfego no seu dispositivo.\n\nPara mais informações, contacte o gestor."</string>
     <string name="monitoring_description_vpn" msgid="1685428000684586870">"Concedeu autorização a uma app para configurar uma ligação VPN.\n\nEsta app pode monitorizar a atividade do dispositivo e da rede, incluindo emails, aplicações e Sites."</string>
-    <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu gestor tem a capacidade de monitorizar a sua atividade da rede, incluindo emails, aplicações e Sites.\n\nPara obter mais informações, contacte o gestor.\n\nAlém disso, está ligado a uma VPN, que pode monitorizar a sua atividade da rede."</string>
+    <string name="monitoring_description_vpn_profile_owned" msgid="4964237035412372751">"O seu perfil de trabalho é gerido por <xliff:g id="ORGANIZATION">%1$s</xliff:g>.\n\nO seu gestor tem a capacidade de monitorizar a sua atividade da rede, incluindo emails, aplicações e Sites.\n\nPara mais informações, contacte o gestor.\n\nAlém disso, está ligado a uma VPN, que pode monitorizar a sua atividade da rede."</string>
     <string name="legacy_vpn_name" msgid="4174223520162559145">"VPN"</string>
     <string name="monitoring_description_app" msgid="376868879287922929">"Está associado à app <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a sua atividade de rede, incluindo emails, aplicações e Sites."</string>
     <string name="monitoring_description_app_personal" msgid="1970094872688265987">"Está ligado a <xliff:g id="APPLICATION">%1$s</xliff:g>, que pode monitorizar a atividade da rede pessoal, incluindo emails, aplicações e Sites."</string>
diff --git a/services/core/Android.bp b/services/core/Android.bp
index 77cb125..6adf66c 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -210,17 +210,3 @@
         "java/com/android/server/net/LockdownVpnTracker.java",
     ],
 }
-
-java_library {
-    name: "service-connectivity",
-    srcs: [
-        ":connectivity-service-srcs",
-    ],
-    installable: true,
-    libs: [
-        "android.net.ipsec.ike",
-        "services.core",
-        "services.net",
-        "unsupportedappusage",
-    ],
-}
diff --git a/services/core/java/com/android/server/AlarmManagerService.java b/services/core/java/com/android/server/AlarmManagerService.java
index 651f941..d09f44f 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -3369,7 +3369,9 @@
                     if (mMaxDelayTime < thisDelayTime) {
                         mMaxDelayTime = thisDelayTime;
                     }
-                    deliverAlarmsLocked(mPendingNonWakeupAlarms, nowELAPSED);
+                    ArrayList<Alarm> triggerList =
+                            (ArrayList<Alarm>) mPendingNonWakeupAlarms.clone();
+                    deliverAlarmsLocked(triggerList, nowELAPSED);
                     mPendingNonWakeupAlarms.clear();
                 }
                 if (mNonInteractiveStartTime > 0) {
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 52df42f..fe116d9 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -136,8 +136,6 @@
 import android.net.metrics.NetworkEvent;
 import android.net.netlink.InetDiagMessage;
 import android.net.shared.PrivateDnsConfig;
-import android.net.util.LinkPropertiesUtils.CompareOrUpdateResult;
-import android.net.util.LinkPropertiesUtils.CompareResult;
 import android.net.util.MultinetworkPolicyTracker;
 import android.net.util.NetdService;
 import android.os.Binder;
@@ -192,6 +190,8 @@
 import com.android.internal.util.MessageUtils;
 import com.android.internal.util.XmlUtils;
 import com.android.modules.utils.BasicShellCommandHandler;
+import com.android.net.module.util.LinkPropertiesUtils.CompareOrUpdateResult;
+import com.android.net.module.util.LinkPropertiesUtils.CompareResult;
 import com.android.server.am.BatteryStatsService;
 import com.android.server.connectivity.AutodestructReference;
 import com.android.server.connectivity.DataConnectionStats;
@@ -201,7 +201,6 @@
 import com.android.server.connectivity.KeepaliveTracker;
 import com.android.server.connectivity.LingerMonitor;
 import com.android.server.connectivity.MockableSystemProperties;
-import com.android.server.connectivity.MultipathPolicyTracker;
 import com.android.server.connectivity.NetworkAgentInfo;
 import com.android.server.connectivity.NetworkDiagnostics;
 import com.android.server.connectivity.NetworkNotificationManager;
@@ -442,11 +441,6 @@
     private static final int EVENT_EXPIRE_NET_TRANSITION_WAKELOCK = 24;
 
     /**
-     * Used internally to indicate the system is ready.
-     */
-    private static final int EVENT_SYSTEM_READY = 25;
-
-    /**
      * used to add a network request with a pending intent
      * obj = NetworkRequestInfo
      */
@@ -661,9 +655,6 @@
     final MultinetworkPolicyTracker mMultinetworkPolicyTracker;
 
     @VisibleForTesting
-    final MultipathPolicyTracker mMultipathPolicyTracker;
-
-    @VisibleForTesting
     final Map<IBinder, ConnectivityDiagnosticsCallbackInfo> mConnectivityDiagnosticsCallbacks =
             new HashMap<>();
 
@@ -1167,8 +1158,6 @@
                 mContext, mHandler, () -> rematchForAvoidBadWifiUpdate());
         mMultinetworkPolicyTracker.start();
 
-        mMultipathPolicyTracker = new MultipathPolicyTracker(mContext, mHandler);
-
         mDnsManager = new DnsManager(mContext, mDnsResolver);
         registerPrivateDnsSettingsCallbacks();
     }
@@ -1803,9 +1792,9 @@
 
     private INetworkManagementEventObserver mDataActivityObserver = new BaseNetworkObserver() {
         @Override
-        public void interfaceClassDataActivityChanged(String label, boolean active, long tsNanos) {
-            int deviceType = Integer.parseInt(label);
-            sendDataActivityBroadcast(deviceType, active, tsNanos);
+        public void interfaceClassDataActivityChanged(int networkType, boolean active, long tsNanos,
+                int uid) {
+            sendDataActivityBroadcast(networkType, active, tsNanos);
         }
     };
 
@@ -2314,10 +2303,13 @@
      */
     @VisibleForTesting
     public void systemReadyInternal() {
-        // Let PermissionMonitor#startMonitoring() running in the beginning of the systemReady
-        // before MultipathPolicyTracker.start(). Since mApps in PermissionMonitor needs to be
-        // populated first to ensure that listening network request which is sent by
-        // MultipathPolicyTracker won't be added NET_CAPABILITY_FOREGROUND capability.
+        // Since mApps in PermissionMonitor needs to be populated first to ensure that
+        // listening network request which is sent by MultipathPolicyTracker won't be added
+        // NET_CAPABILITY_FOREGROUND capability. Thus, MultipathPolicyTracker.start() must
+        // be called after PermissionMonitor#startMonitoring().
+        // Calling PermissionMonitor#startMonitoring() in systemReadyInternal() and the
+        // MultipathPolicyTracker.start() is called in NetworkPolicyManagerService#systemReady()
+        // to ensure the tracking will be initialized correctly.
         mPermissionMonitor.startMonitoring();
         mProxyTracker.loadGlobalProxy();
         registerNetdEventCallback();
@@ -2336,8 +2328,6 @@
 
         // Create network requests for always-on networks.
         mHandler.sendMessage(mHandler.obtainMessage(EVENT_CONFIGURE_ALWAYS_ON_NETWORKS));
-
-        mHandler.sendMessage(mHandler.obtainMessage(EVENT_SYSTEM_READY));
     }
 
     /**
@@ -2637,7 +2627,6 @@
         dumpAvoidBadWifiSettings(pw);
 
         pw.println();
-        mMultipathPolicyTracker.dump(pw);
 
         if (ArrayUtils.contains(args, SHORT_ARG) == false) {
             pw.println();
@@ -4185,11 +4174,13 @@
             return ConnectivityManager.MULTIPATH_PREFERENCE_UNMETERED;
         }
 
-        Integer networkPreference = mMultipathPolicyTracker.getMultipathPreference(network);
-        if (networkPreference != null) {
+        final NetworkPolicyManager netPolicyManager =
+                 mContext.getSystemService(NetworkPolicyManager.class);
+
+        final int networkPreference = netPolicyManager.getMultipathPreference(network);
+        if (networkPreference != 0) {
             return networkPreference;
         }
-
         return mMultinetworkPolicyTracker.getMeteredMultipathPreference();
     }
 
@@ -4293,10 +4284,6 @@
                     mKeepaliveTracker.handleStopKeepalive(nai, slot, reason);
                     break;
                 }
-                case EVENT_SYSTEM_READY: {
-                    mMultipathPolicyTracker.start();
-                    break;
-                }
                 case EVENT_REVALIDATE_NETWORK: {
                     handleReportNetworkConnectivity((Network) msg.obj, msg.arg1, toBool(msg.arg2));
                     break;
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index 636da6f..1ea4a89 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -187,10 +187,10 @@
     /** Set of interfaces with active alerts. */
     @GuardedBy("mQuotaLock")
     private HashMap<String, Long> mActiveAlerts = Maps.newHashMap();
-    /** Set of UIDs denylisted on metered networks. */
+    /** Set of UIDs denied on metered networks. */
     @GuardedBy("mRulesLock")
     private SparseBooleanArray mUidRejectOnMetered = new SparseBooleanArray();
-    /** Set of UIDs allowlisted on metered networks. */
+    /** Set of UIDs allowed on metered networks. */
     @GuardedBy("mRulesLock")
     private SparseBooleanArray mUidAllowOnMetered = new SparseBooleanArray();
     /** Set of UIDs with cleartext penalties. */
@@ -396,22 +396,12 @@
      * Notify our observers of a change in the data activity state of the interface
      */
     private void notifyInterfaceClassActivity(int type, boolean isActive, long tsNanos,
-            int uid, boolean fromRadio) {
+            int uid) {
         final boolean isMobile = ConnectivityManager.isNetworkTypeMobile(type);
         int powerState = isActive
                 ? DataConnectionRealTimeInfo.DC_POWER_STATE_HIGH
                 : DataConnectionRealTimeInfo.DC_POWER_STATE_LOW;
         if (isMobile) {
-            if (!fromRadio) {
-                if (mMobileActivityFromRadio) {
-                    // If this call is not coming from a report from the radio itself, but we
-                    // have previously received reports from the radio, then we will take the
-                    // power state to just be whatever the radio last reported.
-                    powerState = mLastPowerStateFromRadio;
-                }
-            } else {
-                mMobileActivityFromRadio = true;
-            }
             if (mLastPowerStateFromRadio != powerState) {
                 mLastPowerStateFromRadio = powerState;
                 try {
@@ -431,15 +421,9 @@
             }
         }
 
-        if (!isMobile || fromRadio || !mMobileActivityFromRadio) {
-            // Report the change in data activity.  We don't do this if this is a change
-            // on the mobile network, that is not coming from the radio itself, and we
-            // have previously seen change reports from the radio.  In that case only
-            // the radio is the authority for the current state.
-            final boolean active = isActive;
-            invokeForAllObservers(o -> o.interfaceClassDataActivityChanged(
-                    Integer.toString(type), active, tsNanos));
-        }
+        final boolean active = isActive;
+        invokeForAllObservers(o -> o.interfaceClassDataActivityChanged(
+                type, active, tsNanos, uid));
 
         boolean report = false;
         synchronized (mIdleTimerLock) {
@@ -577,13 +561,13 @@
             }
             if (uidRejectOnQuota != null) {
                 for (int i = 0; i < uidRejectOnQuota.size(); i++) {
-                    setUidMeteredNetworkDenylist(uidRejectOnQuota.keyAt(i),
+                    setUidOnMeteredNetworkDenylist(uidRejectOnQuota.keyAt(i),
                             uidRejectOnQuota.valueAt(i));
                 }
             }
             if (uidAcceptOnQuota != null) {
                 for (int i = 0; i < uidAcceptOnQuota.size(); i++) {
-                    setUidMeteredNetworkAllowlist(uidAcceptOnQuota.keyAt(i),
+                    setUidOnMeteredNetworkAllowlist(uidAcceptOnQuota.keyAt(i),
                             uidAcceptOnQuota.valueAt(i));
                 }
             }
@@ -671,7 +655,7 @@
                 timestampNanos = timestamp;
             }
             mDaemonHandler.post(() ->
-                    notifyInterfaceClassActivity(label, isActive, timestampNanos, uid, false));
+                    notifyInterfaceClassActivity(label, isActive, timestampNanos, uid));
         }
 
         @Override
@@ -1157,7 +1141,7 @@
                 mNetworkActive = false;
             }
             mDaemonHandler.post(() -> notifyInterfaceClassActivity(type, true,
-                    SystemClock.elapsedRealtimeNanos(), -1, false));
+                    SystemClock.elapsedRealtimeNanos(), -1));
         }
     }
 
@@ -1181,7 +1165,7 @@
             }
             mActiveIdleTimers.remove(iface);
             mDaemonHandler.post(() -> notifyInterfaceClassActivity(params.type, false,
-                    SystemClock.elapsedRealtimeNanos(), -1, false));
+                    SystemClock.elapsedRealtimeNanos(), -1));
         }
     }
 
@@ -1304,14 +1288,14 @@
         }
     }
 
-    private void setUidOnMeteredNetworkList(int uid, boolean denylist, boolean enable) {
+    private void setUidOnMeteredNetworkList(int uid, boolean allowlist, boolean enable) {
         NetworkStack.checkNetworkStackPermission(mContext);
 
         synchronized (mQuotaLock) {
             boolean oldEnable;
             SparseBooleanArray quotaList;
             synchronized (mRulesLock) {
-                quotaList = denylist ? mUidRejectOnMetered : mUidAllowOnMetered;
+                quotaList = allowlist ?  mUidAllowOnMetered : mUidRejectOnMetered;
                 oldEnable = quotaList.get(uid, false);
             }
             if (oldEnable == enable) {
@@ -1321,18 +1305,18 @@
 
             Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "inetd bandwidth");
             try {
-                if (denylist) {
-                    if (enable) {
-                        mNetdService.bandwidthAddNaughtyApp(uid);
-                    } else {
-                        mNetdService.bandwidthRemoveNaughtyApp(uid);
-                    }
-                } else {
+                if (allowlist) {
                     if (enable) {
                         mNetdService.bandwidthAddNiceApp(uid);
                     } else {
                         mNetdService.bandwidthRemoveNiceApp(uid);
                     }
+                } else {
+                    if (enable) {
+                        mNetdService.bandwidthAddNaughtyApp(uid);
+                    } else {
+                        mNetdService.bandwidthRemoveNaughtyApp(uid);
+                    }
                 }
                 synchronized (mRulesLock) {
                     if (enable) {
@@ -1350,13 +1334,13 @@
     }
 
     @Override
-    public void setUidMeteredNetworkDenylist(int uid, boolean enable) {
-        setUidOnMeteredNetworkList(uid, true, enable);
+    public void setUidOnMeteredNetworkDenylist(int uid, boolean enable) {
+        setUidOnMeteredNetworkList(uid, false, enable);
     }
 
     @Override
-    public void setUidMeteredNetworkAllowlist(int uid, boolean enable) {
-        setUidOnMeteredNetworkList(uid, false, enable);
+    public void setUidOnMeteredNetworkAllowlist(int uid, boolean enable) {
+        setUidOnMeteredNetworkList(uid, true, enable);
     }
 
     @Override
@@ -1779,7 +1763,7 @@
             } else {
                 ruleName = "deny";
             }
-        } else { // Denylist mode
+        } else { // Deny mode
             if (rule == FIREWALL_RULE_DENY) {
                 ruleName = "deny";
             } else {
@@ -1866,8 +1850,8 @@
             pw.print("Active alert ifaces: "); pw.println(mActiveAlerts.toString());
             pw.print("Data saver mode: "); pw.println(mDataSaverMode);
             synchronized (mRulesLock) {
-                dumpUidRuleOnQuotaLocked(pw, "denylist", mUidRejectOnMetered);
-                dumpUidRuleOnQuotaLocked(pw, "allowlist", mUidAllowOnMetered);
+                dumpUidRuleOnQuotaLocked(pw, "denied UIDs", mUidRejectOnMetered);
+                dumpUidRuleOnQuotaLocked(pw, "allowed UIDs", mUidAllowOnMetered);
             }
         }
 
@@ -1920,7 +1904,7 @@
     private void dumpUidRuleOnQuotaLocked(PrintWriter pw, String name, SparseBooleanArray list) {
         pw.print("UID bandwith control ");
         pw.print(name);
-        pw.print(" rule: [");
+        pw.print(": [");
         final int size = list.size();
         for (int i = 0; i < size; i++) {
             pw.print(list.keyAt(i));
diff --git a/services/core/java/com/android/server/NsdService.java b/services/core/java/com/android/server/NsdService.java
index 4a1820a..d907505 100644
--- a/services/core/java/com/android/server/NsdService.java
+++ b/services/core/java/com/android/server/NsdService.java
@@ -25,7 +25,6 @@
 import android.net.nsd.INsdManager;
 import android.net.nsd.NsdManager;
 import android.net.nsd.NsdServiceInfo;
-import android.net.util.nsd.DnsSdTxtRecord;
 import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Message;
@@ -42,6 +41,7 @@
 import com.android.internal.util.DumpUtils;
 import com.android.internal.util.State;
 import com.android.internal.util.StateMachine;
+import com.android.net.module.util.DnsSdTxtRecord;
 
 import java.io.FileDescriptor;
 import java.io.PrintWriter;
diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java
index e9f17ff..74e3851 100644
--- a/services/core/java/com/android/server/VcnManagementService.java
+++ b/services/core/java/com/android/server/VcnManagementService.java
@@ -26,32 +26,43 @@
 import android.net.vcn.IVcnManagementService;
 import android.net.vcn.VcnConfig;
 import android.os.Binder;
+import android.os.Handler;
 import android.os.HandlerThread;
 import android.os.Looper;
 import android.os.ParcelUuid;
+import android.os.PersistableBundle;
 import android.os.Process;
+import android.os.ServiceSpecificException;
 import android.os.UserHandle;
 import android.telephony.SubscriptionInfo;
 import android.telephony.SubscriptionManager;
 import android.telephony.TelephonyManager;
+import android.util.ArrayMap;
+import android.util.Slog;
 
+import com.android.internal.annotations.GuardedBy;
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.annotations.VisibleForTesting.Visibility;
+import com.android.server.vcn.util.PersistableBundleUtils;
 
+import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
 
 /**
  * VcnManagementService manages Virtual Carrier Network profiles and lifecycles.
  *
  * <pre>The internal structure of the VCN Management subsystem is as follows:
  *
- * +------------------------+ 1:1                                 +--------------------------------+
- * |  VcnManagementService  | ------------ Creates -------------> |  TelephonySubscriptionManager  |
- * |                        |                                     |                                |
- * | Manages configs and    |                                     | Tracks subscriptions, carrier  |
- * | VcnInstance lifecycles | <--- Notifies of subscription & --- | privilege changes, caches maps |
- * +------------------------+      carrier privilege changes      +--------------------------------+
+ * +-------------------------+ 1:1                                +--------------------------------+
+ * |  VcnManagementService   | ------------ Creates ------------> |  TelephonySubscriptionManager  |
+ * |                         |                                    |                                |
+ * |   Manages configs and   |                                    | Tracks subscriptions, carrier  |
+ * | Vcn instance lifecycles | <--- Notifies of subscription & -- | privilege changes, caches maps |
+ * +-------------------------+      carrier privilege changes     +--------------------------------+
  *      | 1:N          ^
  *      |              |
  *      |              +-------------------------------+
@@ -63,19 +74,19 @@
  *                      |                      mode state changes
  *                      v                              |
  * +-----------------------------------------------------------------------+
- * |                              VcnInstance                              |
+ * |                                  Vcn                                  |
  * |                                                                       |
- * |   Manages tunnel lifecycles based on fulfillable NetworkRequest(s)    |
- * |                        and overall safe-mode                          |
+ * |       Manages GatewayConnection lifecycles based on fulfillable       |
+ * |                NetworkRequest(s) and overall safe-mode                |
  * +-----------------------------------------------------------------------+
  *                      | 1:N                          ^
  *              Creates to fulfill                     |
- *           NetworkRequest(s), tears        Notifies of VcnTunnel
+ *           NetworkRequest(s), tears   Notifies of VcnGatewayConnection
  *          down when no longer needed   teardown (e.g. Network reaped)
  *                      |                 and safe-mode timer changes
  *                      v                              |
  * +-----------------------------------------------------------------------+
- * |                               VcnTunnel                               |
+ * |                          VcnGatewayConnection                         |
  * |                                                                       |
  * |       Manages a single (IKEv2) tunnel session and NetworkAgent,       |
  * |  handles mobility events, (IPsec) Tunnel setup and safe-mode timers   |
@@ -101,20 +112,72 @@
 
     public static final boolean VDBG = false; // STOPSHIP: if true
 
+    @VisibleForTesting(visibility = Visibility.PRIVATE)
+    static final String VCN_CONFIG_FILE = "/data/system/vcn/configs.xml";
+
     /* Binder context for this service */
     @NonNull private final Context mContext;
     @NonNull private final Dependencies mDeps;
 
     @NonNull private final Looper mLooper;
+    @NonNull private final Handler mHandler;
     @NonNull private final VcnNetworkProvider mNetworkProvider;
 
+    @GuardedBy("mLock")
+    @NonNull
+    private final Map<ParcelUuid, VcnConfig> mConfigs = new ArrayMap<>();
+
+    @NonNull private final Object mLock = new Object();
+
+    @NonNull private final PersistableBundleUtils.LockingReadWriteHelper mConfigDiskRwHelper;
+
     @VisibleForTesting(visibility = Visibility.PRIVATE)
     VcnManagementService(@NonNull Context context, @NonNull Dependencies deps) {
         mContext = requireNonNull(context, "Missing context");
         mDeps = requireNonNull(deps, "Missing dependencies");
 
         mLooper = mDeps.getLooper();
+        mHandler = new Handler(mLooper);
         mNetworkProvider = new VcnNetworkProvider(mContext, mLooper);
+
+        mConfigDiskRwHelper = mDeps.newPersistableBundleLockingReadWriteHelper(VCN_CONFIG_FILE);
+
+        // Run on handler to ensure I/O does not block system server startup
+        mHandler.post(() -> {
+            PersistableBundle configBundle = null;
+            try {
+                configBundle = mConfigDiskRwHelper.readFromDisk();
+            } catch (IOException e1) {
+                Slog.e(TAG, "Failed to read configs from disk; retrying", e1);
+
+                // Retry immediately. The IOException may have been transient.
+                try {
+                    configBundle = mConfigDiskRwHelper.readFromDisk();
+                } catch (IOException e2) {
+                    Slog.wtf(TAG, "Failed to read configs from disk", e2);
+                    return;
+                }
+            }
+
+            if (configBundle != null) {
+                final Map<ParcelUuid, VcnConfig> configs =
+                        PersistableBundleUtils.toMap(
+                                configBundle,
+                                PersistableBundleUtils::toParcelUuid,
+                                VcnConfig::new);
+
+                synchronized (mLock) {
+                    for (Entry<ParcelUuid, VcnConfig> entry : configs.entrySet()) {
+                        // Ensure no new configs are overwritten; a carrier app may have added a new
+                        // config.
+                        if (!mConfigs.containsKey(entry.getKey())) {
+                            mConfigs.put(entry.getKey(), entry.getValue());
+                        }
+                    }
+                    // TODO: Trigger re-evaluation of active VCNs; start/stop VCNs as needed.
+                }
+            }
+        });
     }
 
     // Package-visibility for SystemServer to create instances.
@@ -151,12 +214,21 @@
         public int getBinderCallingUid() {
             return Binder.getCallingUid();
         }
+
+        /**
+         * Creates and returns a new {@link PersistableBundle.LockingReadWriteHelper}
+         *
+         * @param path the file path to read/write from/to.
+         * @return the {@link PersistableBundleUtils.LockingReadWriteHelper} instance
+         */
+        public PersistableBundleUtils.LockingReadWriteHelper
+                newPersistableBundleLockingReadWriteHelper(@NonNull String path) {
+            return new PersistableBundleUtils.LockingReadWriteHelper(path);
+        }
     }
 
     /** Notifies the VcnManagementService that external dependencies can be set up. */
     public void systemReady() {
-        // TODO: Retrieve existing profiles from KeyStore
-
         mContext.getSystemService(ConnectivityManager.class)
                 .registerNetworkProvider(mNetworkProvider);
     }
@@ -217,9 +289,15 @@
 
         enforceCallingUserAndCarrierPrivilege(subscriptionGroup);
 
-        // TODO: Clear Binder calling identity
+        synchronized (mLock) {
+            mConfigs.put(subscriptionGroup, config);
 
-        // TODO: Store VCN configuration, trigger startup as necessary
+            // Must be done synchronously to ensure that writes do not happen out-of-order.
+            writeConfigsToDiskLocked();
+        }
+
+        // TODO: Clear Binder calling identity
+        // TODO: Trigger startup as necessary
     }
 
     /**
@@ -233,9 +311,38 @@
 
         enforceCallingUserAndCarrierPrivilege(subscriptionGroup);
 
-        // TODO: Clear Binder calling identity
+        synchronized (mLock) {
+            mConfigs.remove(subscriptionGroup);
 
-        // TODO: Clear VCN configuration, trigger teardown as necessary
+            // Must be done synchronously to ensure that writes do not happen out-of-order.
+            writeConfigsToDiskLocked();
+        }
+
+        // TODO: Clear Binder calling identity
+        // TODO: Trigger teardown as necessary
+    }
+
+    @GuardedBy("mLock")
+    private void writeConfigsToDiskLocked() {
+        try {
+            PersistableBundle bundle =
+                    PersistableBundleUtils.fromMap(
+                            mConfigs,
+                            PersistableBundleUtils::fromParcelUuid,
+                            VcnConfig::toPersistableBundle);
+            mConfigDiskRwHelper.writeToDisk(bundle);
+        } catch (IOException e) {
+            Slog.e(TAG, "Failed to save configs to disk", e);
+            throw new ServiceSpecificException(0, "Failed to save configs");
+        }
+    }
+
+    /** Get current configuration list for testing purposes */
+    @VisibleForTesting(visibility = Visibility.PRIVATE)
+    Map<ParcelUuid, VcnConfig> getConfigs() {
+        synchronized (mLock) {
+            return Collections.unmodifiableMap(mConfigs);
+        }
     }
 
     /**
diff --git a/services/core/java/com/android/server/audio/AudioDeviceBroker.java b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
index 074d3fe..26f5c4c 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceBroker.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceBroker.java
@@ -16,6 +16,7 @@
 package com.android.server.audio;
 
 import android.annotation.NonNull;
+import android.annotation.Nullable;
 import android.bluetooth.BluetoothA2dp;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothHeadset;
@@ -25,19 +26,26 @@
 import android.content.Context;
 import android.content.Intent;
 import android.media.AudioDeviceAttributes;
+import android.media.AudioDeviceInfo;
+import android.media.AudioManager;
 import android.media.AudioRoutesInfo;
 import android.media.AudioSystem;
 import android.media.IAudioRoutesObserver;
-import android.media.IStrategyPreferredDeviceDispatcher;
+import android.media.ICapturePresetDevicesRoleDispatcher;
+import android.media.ICommunicationDeviceDispatcher;
+import android.media.IStrategyPreferredDevicesDispatcher;
 import android.media.MediaMetrics;
+import android.media.audiopolicy.AudioProductStrategy;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Looper;
 import android.os.Message;
 import android.os.PowerManager;
+import android.os.RemoteCallbackList;
 import android.os.RemoteException;
 import android.os.SystemClock;
+import android.os.UserHandle;
 import android.text.TextUtils;
 import android.util.Log;
 import android.util.PrintWriterPrinter;
@@ -45,8 +53,10 @@
 import com.android.internal.annotations.GuardedBy;
 
 import java.io.PrintWriter;
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -70,11 +80,8 @@
     private final @NonNull Context mContext;
 
     /** Forced device usage for communications sent to AudioSystem */
-    private int mForcedUseForComm;
-    /**
-     * Externally reported force device usage state returned by getters: always consistent
-     * with requests by setters */
-    private int mForcedUseForCommExt;
+    private AudioDeviceAttributes mPreferredDeviceforComm;
+    private int mCommunicationStrategyId = -1;
 
     // Manages all connected devices, only ever accessed on the message loop
     private final AudioDeviceInventory mDeviceInventory;
@@ -130,11 +137,23 @@
         init();
     }
 
+    private void initCommunicationStrategyId() {
+        List<AudioProductStrategy> strategies = AudioProductStrategy.getAudioProductStrategies();
+        for (AudioProductStrategy strategy : strategies) {
+            if (strategy.getAudioAttributesForLegacyStreamType(AudioSystem.STREAM_VOICE_CALL)
+                    != null) {
+                mCommunicationStrategyId = strategy.getId();
+                return;
+            }
+        }
+        mCommunicationStrategyId = -1;
+    }
+
     private void init() {
         setupMessaging(mContext);
 
-        mForcedUseForComm = AudioSystem.FORCE_NONE;
-        mForcedUseForCommExt = mForcedUseForComm;
+        mPreferredDeviceforComm = null;
+        initCommunicationStrategyId();
     }
 
     /*package*/ Context getContext() {
@@ -157,15 +176,6 @@
     }
 
     /*package*/ void onAudioServerDied() {
-        // Restore forced usage for communications and record
-        synchronized (mDeviceStateLock) {
-            AudioSystem.setParameters(
-                    "BT_SCO=" + (mForcedUseForComm == AudioSystem.FORCE_BT_SCO ? "on" : "off"));
-            onSetForceUse(AudioSystem.FOR_COMMUNICATION, mForcedUseForComm,
-                          false /*fromA2dp*/, "onAudioServerDied");
-            onSetForceUse(AudioSystem.FOR_RECORD, mForcedUseForComm,
-                          false /*fromA2dp*/, "onAudioServerDied");
-        }
         // restore devices
         sendMsgNoDelay(MSG_RESTORE_DEVICES, SENDMSG_REPLACE);
     }
@@ -217,85 +227,210 @@
      * Turns speakerphone on/off
      * @param on
      * @param eventSource for logging purposes
-     * @return true if speakerphone state changed
      */
-    /*package*/ boolean setSpeakerphoneOn(IBinder cb, int pid, boolean on, String eventSource) {
-        synchronized (mDeviceStateLock) {
-            if (!addSpeakerphoneClient(cb, pid, on)) {
-                return false;
+    /*package*/ void setSpeakerphoneOn(IBinder cb, int pid, boolean on, String eventSource) {
+
+        if (AudioService.DEBUG_COMM_RTE) {
+            Log.v(TAG, "setSpeakerphoneOn, on: " + on + " pid: " + pid);
+        }
+
+        synchronized (mSetModeLock) {
+            synchronized (mDeviceStateLock) {
+                AudioDeviceAttributes device = null;
+                if (on) {
+                    device = new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_SPEAKER, "");
+                } else {
+                    CommunicationRouteClient client = getCommunicationRouteClientForPid(pid);
+                    if (client == null || !client.requestsSpeakerphone()) {
+                        return;
+                    }
+                }
+                setCommunicationRouteForClient(
+                        cb, pid, device, BtHelper.SCO_MODE_UNDEFINED, eventSource);
             }
-            if (on) {
-                // Cancel BT SCO ON request by this same client: speakerphone and BT SCO routes
-                // are mutually exclusive.
-                // See symmetrical operation for startBluetoothScoForClient_Sync().
-                mBtHelper.stopBluetoothScoForPid(pid);
-            }
-            final boolean wasOn = isSpeakerphoneOn();
-            updateSpeakerphoneOn(eventSource);
-            return (wasOn != isSpeakerphoneOn());
         }
     }
 
     /**
-     * Turns speakerphone off for a given pid and update speakerphone state.
-     * @param pid
+     * Select device for use for communication use cases.
+     * @param cb Client binder for death detection
+     * @param pid Client pid
+     * @param device Device selected or null to unselect.
+     * @param eventSource for logging purposes
      */
+    /*package*/ boolean setDeviceForCommunication(
+            IBinder cb, int pid, AudioDeviceInfo device, String eventSource) {
+
+        if (AudioService.DEBUG_COMM_RTE) {
+            Log.v(TAG, "setDeviceForCommunication, device: " + device + ", pid: " + pid);
+        }
+
+        synchronized (mSetModeLock) {
+            synchronized (mDeviceStateLock) {
+                AudioDeviceAttributes deviceAttr = null;
+                if (device != null) {
+                    deviceAttr = new AudioDeviceAttributes(device);
+                } else {
+                    CommunicationRouteClient client = getCommunicationRouteClientForPid(pid);
+                    if (client == null) {
+                        return false;
+                    }
+                }
+                setCommunicationRouteForClient(
+                        cb, pid, deviceAttr, BtHelper.SCO_MODE_UNDEFINED, eventSource);
+            }
+        }
+        return true;
+    }
+
     @GuardedBy("mDeviceStateLock")
-    private void setSpeakerphoneOffForPid(int pid) {
-        SpeakerphoneClient client = getSpeakerphoneClientForPid(pid);
+    /*package*/ void setCommunicationRouteForClient(
+                            IBinder cb, int pid, AudioDeviceAttributes device,
+                            int scoAudioMode, String eventSource) {
+
+        if (AudioService.DEBUG_COMM_RTE) {
+            Log.v(TAG, "setCommunicationRouteForClient: device: " + device);
+        }
+        AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent(
+                                        "setCommunicationRouteForClient for pid: " + pid
+                                        + " device: " + device
+                                        + " from API: " + eventSource)).printLog(TAG));
+
+        final boolean wasBtScoRequested = isBluetoothScoRequested();
+        final boolean wasSpeakerphoneRequested = isSpeakerphoneRequested();
+        CommunicationRouteClient client;
+
+
+        // Save previous client route in case of failure to start BT SCO audio
+        AudioDeviceAttributes prevClientDevice = null;
+        client = getCommunicationRouteClientForPid(pid);
+        if (client != null) {
+            prevClientDevice = client.getDevice();
+        }
+
+        if (device != null) {
+            client = addCommunicationRouteClient(cb, pid, device);
+            if (client == null) {
+                Log.w(TAG, "setCommunicationRouteForClient: could not add client for pid: "
+                        + pid + " and device: " + device);
+            }
+        } else {
+            client = removeCommunicationRouteClient(cb, true);
+        }
         if (client == null) {
             return;
         }
-        client.unregisterDeathRecipient();
-        mSpeakerphoneClients.remove(client);
-        final String eventSource = new StringBuilder("setSpeakerphoneOffForPid(")
-                .append(pid).append(")").toString();
-        updateSpeakerphoneOn(eventSource);
-    }
 
-    @GuardedBy("mDeviceStateLock")
-    private void updateSpeakerphoneOn(String eventSource) {
-        if (isSpeakerphoneOnRequested()) {
-            if (mForcedUseForComm == AudioSystem.FORCE_BT_SCO) {
-                setForceUse_Async(AudioSystem.FOR_RECORD, AudioSystem.FORCE_NONE, eventSource);
+        boolean isBtScoRequested = isBluetoothScoRequested();
+        if (isBtScoRequested && !wasBtScoRequested) {
+            if (!mBtHelper.startBluetoothSco(scoAudioMode, eventSource)) {
+                Log.w(TAG, "setCommunicationRouteForClient: failure to start BT SCO for pid: "
+                        + pid);
+                // clean up or restore previous client selection
+                if (prevClientDevice != null) {
+                    addCommunicationRouteClient(cb, pid, prevClientDevice);
+                } else {
+                    removeCommunicationRouteClient(cb, true);
+                }
+                postBroadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
             }
-            mForcedUseForComm = AudioSystem.FORCE_SPEAKER;
-        } else if (mForcedUseForComm == AudioSystem.FORCE_SPEAKER) {
-            if (mBtHelper.isBluetoothScoOn()) {
-                mForcedUseForComm = AudioSystem.FORCE_BT_SCO;
-                setForceUse_Async(
-                        AudioSystem.FOR_RECORD, AudioSystem.FORCE_BT_SCO, eventSource);
-            } else {
-                mForcedUseForComm = AudioSystem.FORCE_NONE;
+        } else if (!isBtScoRequested && wasBtScoRequested) {
+            mBtHelper.stopBluetoothSco(eventSource);
+        }
+
+        if (wasSpeakerphoneRequested != isSpeakerphoneRequested()) {
+            try {
+                mContext.sendBroadcastAsUser(
+                        new Intent(AudioManager.ACTION_SPEAKERPHONE_STATE_CHANGED)
+                                .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), UserHandle.ALL);
+            } catch (Exception e) {
+                Log.w(TAG, "failed to broadcast ACTION_SPEAKERPHONE_STATE_CHANGED: " + e);
             }
         }
-        mForcedUseForCommExt = mForcedUseForComm;
-        setForceUse_Async(AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, eventSource);
+
+        sendLMsgNoDelay(MSG_L_UPDATE_COMMUNICATION_ROUTE, SENDMSG_QUEUE, eventSource);
     }
 
     /**
-     * Returns if speakerphone is requested ON or OFF.
-     * If the current audio mode owner is in the speakerphone client list, use this preference.
+     * Returns the device currently requested for communication use case.
+     * If the current audio mode owner is in the communication route client list,
+     * use this preference.
      * Otherwise use first client's preference (first client corresponds to latest request).
-     * Speakerphone is requested OFF if no client is in the list.
-     * @return true if speakerphone is requested ON, false otherwise
+     * null is returned if no client is in the list.
+     * @return AudioDeviceAttributes the requested device for communication.
      */
+
     @GuardedBy("mDeviceStateLock")
-    private boolean isSpeakerphoneOnRequested() {
-        if (mSpeakerphoneClients.isEmpty()) {
-            return false;
-        }
-        for (SpeakerphoneClient cl : mSpeakerphoneClients) {
+    private AudioDeviceAttributes requestedCommunicationDevice() {
+        AudioDeviceAttributes device = null;
+        for (CommunicationRouteClient cl : mCommunicationRouteClients) {
             if (cl.getPid() == mModeOwnerPid) {
-                return cl.isOn();
+                device = cl.getDevice();
             }
         }
-        return mSpeakerphoneClients.get(0).isOn();
+        if (!mCommunicationRouteClients.isEmpty() && mModeOwnerPid == 0) {
+            device = mCommunicationRouteClients.get(0).getDevice();
+        }
+
+        if (AudioService.DEBUG_COMM_RTE) {
+            Log.v(TAG, "requestedCommunicationDevice, device: "
+                    + device + " mode owner pid: " + mModeOwnerPid);
+        }
+        return device;
     }
 
-    /*package*/ boolean isSpeakerphoneOn() {
+    /**
+     * Returns the device currently requested for communication use case.
+     * @return AudioDeviceInfo the requested device for communication.
+     */
+    AudioDeviceInfo getDeviceForCommunication() {
         synchronized (mDeviceStateLock) {
-            return (mForcedUseForCommExt == AudioSystem.FORCE_SPEAKER);
+            AudioDeviceAttributes device = requestedCommunicationDevice();
+            if (device == null) {
+                return null;
+            }
+            return AudioManager.getDeviceInfoFromType(device.getType());
+        }
+    }
+
+    /**
+     * Helper method on top of requestedCommunicationDevice() indicating if
+     * speakerphone ON is currently requested or not.
+     * @return true if speakerphone ON requested, false otherwise.
+     */
+
+    private boolean isSpeakerphoneRequested() {
+        synchronized (mDeviceStateLock) {
+            AudioDeviceAttributes device = requestedCommunicationDevice();
+            return device != null
+                    && device.getType()
+                        == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER;
+        }
+    }
+
+    /**
+     * Indicates if active route selection for communication is speakerphone.
+     * @return true if speakerphone is active, false otherwise.
+     */
+    /*package*/ boolean isSpeakerphoneOn() {
+        AudioDeviceAttributes device = getPreferredDeviceForComm();
+        if (device == null) {
+            return false;
+        }
+        return device.getInternalType() == AudioSystem.DEVICE_OUT_SPEAKER;
+    }
+
+    /**
+     * Helper method on top of requestedCommunicationDevice() indicating if
+     * Bluetooth SCO ON is currently requested or not.
+     * @return true if Bluetooth SCO ON is requested, false otherwise.
+     */
+    /*package*/ boolean isBluetoothScoRequested() {
+        synchronized (mDeviceStateLock) {
+            AudioDeviceAttributes device = requestedCommunicationDevice();
+            return device != null
+                    && device.getType()
+                        == AudioDeviceInfo.TYPE_BLUETOOTH_SCO;
         }
     }
 
@@ -346,7 +481,6 @@
         }
     }
 
-
     /*package*/ void postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
             @NonNull BluetoothDevice device, @AudioService.BtProfileConnectionState int state,
             int profile, boolean suppressNoisyIntent, int a2dpVolume) {
@@ -429,42 +563,32 @@
         sendLMsgNoDelay(MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT, SENDMSG_QUEUE, info);
     }
 
-    // never called by system components
-    /*package*/ void setBluetoothScoOnByApp(boolean on) {
-        synchronized (mDeviceStateLock) {
-            mForcedUseForCommExt = on ? AudioSystem.FORCE_BT_SCO : AudioSystem.FORCE_NONE;
-        }
-    }
 
-    /*package*/ boolean isBluetoothScoOnForApp() {
-        synchronized (mDeviceStateLock) {
-            return mForcedUseForCommExt == AudioSystem.FORCE_BT_SCO;
-        }
-    }
+    /**
+     * Current Bluetooth SCO audio active state indicated by BtHelper via setBluetoothScoOn().
+     */
+    private boolean mBluetoothScoOn;
 
     /*package*/ void setBluetoothScoOn(boolean on, String eventSource) {
-        //Log.i(TAG, "setBluetoothScoOn: " + on + " " + eventSource);
-        synchronized (mDeviceStateLock) {
-            if (on) {
-                // do not accept SCO ON if SCO audio is not connected
-                if (!mBtHelper.isBluetoothScoOn()) {
-                    mForcedUseForCommExt = AudioSystem.FORCE_BT_SCO;
-                    return;
-                }
-                mForcedUseForComm = AudioSystem.FORCE_BT_SCO;
-            } else if (mForcedUseForComm == AudioSystem.FORCE_BT_SCO) {
-                mForcedUseForComm = isSpeakerphoneOnRequested()
-                        ? AudioSystem.FORCE_SPEAKER : AudioSystem.FORCE_NONE;
-            }
-            mForcedUseForCommExt = mForcedUseForComm;
-            AudioSystem.setParameters("BT_SCO=" + (on ? "on" : "off"));
-            sendIILMsgNoDelay(MSG_IIL_SET_FORCE_USE, SENDMSG_QUEUE,
-                    AudioSystem.FOR_COMMUNICATION, mForcedUseForComm, eventSource);
-            sendIILMsgNoDelay(MSG_IIL_SET_FORCE_USE, SENDMSG_QUEUE,
-                    AudioSystem.FOR_RECORD, mForcedUseForComm, eventSource);
+        if (AudioService.DEBUG_COMM_RTE) {
+            Log.v(TAG, "setBluetoothScoOn: " + on + " " + eventSource);
         }
-        // Un-mute ringtone stream volume
-        mAudioService.postUpdateRingerModeServiceInt();
+        synchronized (mDeviceStateLock) {
+            mBluetoothScoOn = on;
+            sendLMsgNoDelay(MSG_L_UPDATE_COMMUNICATION_ROUTE, SENDMSG_QUEUE, eventSource);
+        }
+    }
+
+    /**
+     * Indicates if active route selection for communication is Bluetooth SCO.
+     * @return true if Bluetooth SCO is active , false otherwise.
+     */
+    /*package*/ boolean isBluetoothScoOn() {
+        AudioDeviceAttributes device = getPreferredDeviceForComm();
+        if (device == null) {
+            return false;
+        }
+        return AudioSystem.DEVICE_OUT_ALL_SCO_SET.contains(device.getInternalType());
     }
 
     /*package*/ AudioRoutesInfo startWatchingRoutes(IAudioRoutesObserver observer) {
@@ -507,42 +631,125 @@
         sendLMsgNoDelay(MSG_L_A2DP_DEVICE_CONFIG_CHANGE, SENDMSG_QUEUE, device);
     }
 
-    @GuardedBy("mSetModeLock")
-    /*package*/ void startBluetoothScoForClient_Sync(IBinder cb, int scoAudioMode,
+    /*package*/ void startBluetoothScoForClient(IBinder cb, int pid, int scoAudioMode,
                 @NonNull String eventSource) {
-        synchronized (mDeviceStateLock) {
-            // Cancel speakerphone ON request by this same client: speakerphone and BT SCO routes
-            // are mutually exclusive.
-            // See symmetrical operation for setSpeakerphoneOn(true).
-            setSpeakerphoneOffForPid(Binder.getCallingPid());
-            mBtHelper.startBluetoothScoForClient(cb, scoAudioMode, eventSource);
+
+        if (AudioService.DEBUG_COMM_RTE) {
+            Log.v(TAG, "startBluetoothScoForClient_Sync, pid: " + pid);
+        }
+
+        synchronized (mSetModeLock) {
+            synchronized (mDeviceStateLock) {
+                AudioDeviceAttributes device =
+                        new AudioDeviceAttributes(AudioSystem.DEVICE_OUT_BLUETOOTH_SCO, "");
+                setCommunicationRouteForClient(cb, pid, device, scoAudioMode, eventSource);
+            }
         }
     }
 
-    @GuardedBy("mSetModeLock")
-    /*package*/ void stopBluetoothScoForClient_Sync(IBinder cb, @NonNull String eventSource) {
-        synchronized (mDeviceStateLock) {
-            mBtHelper.stopBluetoothScoForClient(cb, eventSource);
+    /*package*/ void stopBluetoothScoForClient(
+                        IBinder cb, int pid, @NonNull String eventSource) {
+
+        if (AudioService.DEBUG_COMM_RTE) {
+            Log.v(TAG, "stopBluetoothScoForClient_Sync, pid: " + pid);
+        }
+
+        synchronized (mSetModeLock) {
+            synchronized (mDeviceStateLock) {
+                CommunicationRouteClient client = getCommunicationRouteClientForPid(pid);
+                if (client == null || !client.requestsBluetoothSco()) {
+                    return;
+                }
+                setCommunicationRouteForClient(
+                        cb, pid, null, BtHelper.SCO_MODE_UNDEFINED, eventSource);
+            }
         }
     }
 
-    /*package*/ int setPreferredDeviceForStrategySync(int strategy,
-                                                      @NonNull AudioDeviceAttributes device) {
-        return mDeviceInventory.setPreferredDeviceForStrategySync(strategy, device);
+    /*package*/ int setPreferredDevicesForStrategySync(int strategy,
+            @NonNull List<AudioDeviceAttributes> devices) {
+        return mDeviceInventory.setPreferredDevicesForStrategySync(strategy, devices);
     }
 
-    /*package*/ int removePreferredDeviceForStrategySync(int strategy) {
-        return mDeviceInventory.removePreferredDeviceForStrategySync(strategy);
+    /*package*/ void postSetPreferredDevicesForStrategy(int strategy,
+            @NonNull List<AudioDeviceAttributes> devices) {
+        sendILMsgNoDelay(MSG_IL_SET_PREF_DEVICES_FOR_STRATEGY, SENDMSG_REPLACE, strategy, devices);
     }
 
-    /*package*/ void registerStrategyPreferredDeviceDispatcher(
-            @NonNull IStrategyPreferredDeviceDispatcher dispatcher) {
-        mDeviceInventory.registerStrategyPreferredDeviceDispatcher(dispatcher);
+    /*package*/ int removePreferredDevicesForStrategySync(int strategy) {
+        return mDeviceInventory.removePreferredDevicesForStrategySync(strategy);
     }
 
-    /*package*/ void unregisterStrategyPreferredDeviceDispatcher(
-            @NonNull IStrategyPreferredDeviceDispatcher dispatcher) {
-        mDeviceInventory.unregisterStrategyPreferredDeviceDispatcher(dispatcher);
+    /*package*/ void postRemovePreferredDevicesForStrategy(int strategy) {
+        sendIMsgNoDelay(MSG_I_REMOVE_PREF_DEVICES_FOR_STRATEGY, SENDMSG_REPLACE, strategy);
+    }
+
+    /*package*/ void registerStrategyPreferredDevicesDispatcher(
+            @NonNull IStrategyPreferredDevicesDispatcher dispatcher) {
+        mDeviceInventory.registerStrategyPreferredDevicesDispatcher(dispatcher);
+    }
+
+    /*package*/ void unregisterStrategyPreferredDevicesDispatcher(
+            @NonNull IStrategyPreferredDevicesDispatcher dispatcher) {
+        mDeviceInventory.unregisterStrategyPreferredDevicesDispatcher(dispatcher);
+    }
+
+    /*package*/ int setPreferredDevicesForCapturePresetSync(int capturePreset,
+            @NonNull List<AudioDeviceAttributes> devices) {
+        return mDeviceInventory.setPreferredDevicesForCapturePresetSync(capturePreset, devices);
+    }
+
+    /*package*/ int clearPreferredDevicesForCapturePresetSync(int capturePreset) {
+        return mDeviceInventory.clearPreferredDevicesForCapturePresetSync(capturePreset);
+    }
+
+    /*package*/ void registerCapturePresetDevicesRoleDispatcher(
+            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) {
+        mDeviceInventory.registerCapturePresetDevicesRoleDispatcher(dispatcher);
+    }
+
+    /*package*/ void unregisterCapturePresetDevicesRoleDispatcher(
+            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) {
+        mDeviceInventory.unregisterCapturePresetDevicesRoleDispatcher(dispatcher);
+    }
+
+    /*package*/ void registerCommunicationDeviceDispatcher(
+            @NonNull ICommunicationDeviceDispatcher dispatcher) {
+        mCommDevDispatchers.register(dispatcher);
+    }
+
+    /*package*/ void unregisterCommunicationDeviceDispatcher(
+            @NonNull ICommunicationDeviceDispatcher dispatcher) {
+        mCommDevDispatchers.unregister(dispatcher);
+    }
+
+    // Monitoring of communication device
+    final RemoteCallbackList<ICommunicationDeviceDispatcher> mCommDevDispatchers =
+            new RemoteCallbackList<ICommunicationDeviceDispatcher>();
+
+    // portId of the device currently selected for communication: avoids broadcasting changes
+    // when same communication route is applied
+    @GuardedBy("mDeviceStateLock")
+    int mCurCommunicationPortId = -1;
+
+    @GuardedBy("mDeviceStateLock")
+    private void dispatchCommunicationDevice() {
+        AudioDeviceInfo device = getDeviceForCommunication();
+        int portId = (getDeviceForCommunication() == null) ? 0 : device.getId();
+        if (portId == mCurCommunicationPortId) {
+            return;
+        }
+        mCurCommunicationPortId = portId;
+
+        final int nbDispatchers = mCommDevDispatchers.beginBroadcast();
+        for (int i = 0; i < nbDispatchers; i++) {
+            try {
+                mCommDevDispatchers.getBroadcastItem(i)
+                        .dispatchCommunicationDeviceChanged(portId);
+            } catch (RemoteException e) {
+            }
+        }
+        mCommDevDispatchers.finishBroadcast();
     }
 
     //---------------------------------------------------------------------
@@ -675,22 +882,29 @@
                 hearingAidProfile);
     }
 
-    /*package*/ void postScoClientDied(Object obj) {
-        sendLMsgNoDelay(MSG_L_SCOCLIENT_DIED, SENDMSG_QUEUE, obj);
+    /*package*/ void postCommunicationRouteClientDied(CommunicationRouteClient client) {
+        sendLMsgNoDelay(MSG_L_COMMUNICATION_ROUTE_CLIENT_DIED, SENDMSG_QUEUE, client);
     }
 
-    /*package*/ void postSpeakerphoneClientDied(Object obj) {
-        sendLMsgNoDelay(MSG_L_SPEAKERPHONE_CLIENT_DIED, SENDMSG_QUEUE, obj);
-    }
-
-    /*package*/ void postSaveSetPreferredDeviceForStrategy(int strategy,
-                                                           AudioDeviceAttributes device)
+    /*package*/ void postSaveSetPreferredDevicesForStrategy(int strategy,
+                                                            List<AudioDeviceAttributes> devices)
     {
-        sendILMsgNoDelay(MSG_IL_SAVE_PREF_DEVICE_FOR_STRATEGY, SENDMSG_QUEUE, strategy, device);
+        sendILMsgNoDelay(MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY, SENDMSG_QUEUE, strategy, devices);
     }
 
-    /*package*/ void postSaveRemovePreferredDeviceForStrategy(int strategy) {
-        sendIMsgNoDelay(MSG_I_SAVE_REMOVE_PREF_DEVICE_FOR_STRATEGY, SENDMSG_QUEUE, strategy);
+    /*package*/ void postSaveRemovePreferredDevicesForStrategy(int strategy) {
+        sendIMsgNoDelay(MSG_I_SAVE_REMOVE_PREF_DEVICES_FOR_STRATEGY, SENDMSG_QUEUE, strategy);
+    }
+
+    /*package*/ void postSaveSetPreferredDevicesForCapturePreset(
+            int capturePreset, List<AudioDeviceAttributes> devices) {
+        sendILMsgNoDelay(
+                MSG_IL_SAVE_PREF_DEVICES_FOR_CAPTURE_PRESET, SENDMSG_QUEUE, capturePreset, devices);
+    }
+
+    /*package*/ void postSaveClearPreferredDevicesForCapturePreset(int capturePreset) {
+        sendIMsgNoDelay(
+                MSG_I_SAVE_CLEAR_PREF_DEVICES_FOR_CAPTURE_PRESET, SENDMSG_QUEUE, capturePreset);
     }
 
     //---------------------------------------------------------------------
@@ -789,15 +1003,17 @@
 
         mDeviceInventory.dump(pw, prefix);
 
-        pw.println("\n" + prefix + "mForcedUseForComm: "
-                +  AudioSystem.forceUseConfigToString(mForcedUseForComm));
-        pw.println(prefix + "mForcedUseForCommExt: "
-                + AudioSystem.forceUseConfigToString(mForcedUseForCommExt));
-        pw.println(prefix + "mModeOwnerPid: " + mModeOwnerPid);
-        pw.println(prefix + "Speakerphone clients:");
-        mSpeakerphoneClients.forEach((cl) -> {
-            pw.println("  " + prefix + "pid: " + cl.getPid() + " on: "
-                        + cl.isOn() + " cb: " + cl.getBinder()); });
+        pw.println("\n" + prefix + "Communication route clients:");
+        mCommunicationRouteClients.forEach((cl) -> {
+            pw.println("  " + prefix + "pid: " + cl.getPid() + " device: "
+                        + cl.getDevice() + " cb: " + cl.getBinder()); });
+
+        pw.println("\n" + prefix + "mPreferredDeviceforComm: "
+                +  mPreferredDeviceforComm);
+        pw.println(prefix + "mCommunicationStrategyId: "
+                +  mCommunicationStrategyId);
+
+        pw.println("\n" + prefix + "mModeOwnerPid: " + mModeOwnerPid);
 
         mBtHelper.dump(pw, prefix);
     }
@@ -820,6 +1036,11 @@
                 .set(MediaMetrics.Property.FORCE_USE_MODE,
                         AudioSystem.forceUseConfigToString(config))
                 .record();
+
+        if (AudioService.DEBUG_COMM_RTE) {
+            Log.v(TAG, "onSetForceUse(useCase<" + useCase + ">, config<" + config + ">, fromA2dp<"
+                    + fromA2dp + ">, eventSource<" + eventSource + ">)");
+        }
         AudioSystem.setForceUse(useCase, config);
     }
 
@@ -885,9 +1106,13 @@
         public void handleMessage(Message msg) {
             switch (msg.what) {
                 case MSG_RESTORE_DEVICES:
-                    synchronized (mDeviceStateLock) {
-                        mDeviceInventory.onRestoreDevices();
-                        mBtHelper.onAudioServerDiedRestoreA2dp();
+                    synchronized (mSetModeLock) {
+                        synchronized (mDeviceStateLock) {
+                            initCommunicationStrategyId();
+                            mDeviceInventory.onRestoreDevices();
+                            mBtHelper.onAudioServerDiedRestoreA2dp();
+                            onUpdateCommunicationRoute("MSG_RESTORE_DEVICES");
+                        }
                     }
                     break;
                 case MSG_L_SET_WIRED_DEVICE_CONNECTION_STATE:
@@ -977,25 +1202,24 @@
                             if (mModeOwnerPid != msg.arg1) {
                                 mModeOwnerPid = msg.arg1;
                                 if (msg.arg2 != AudioSystem.MODE_RINGTONE) {
-                                    updateSpeakerphoneOn("setNewModeOwner");
-                                }
-                                if (mModeOwnerPid != 0) {
-                                    mBtHelper.disconnectBluetoothSco(mModeOwnerPid);
+                                    onUpdateCommunicationRoute("setNewModeOwner");
                                 }
                             }
                         }
                     }
                     break;
-                case MSG_L_SCOCLIENT_DIED:
+                case MSG_L_COMMUNICATION_ROUTE_CLIENT_DIED:
                     synchronized (mSetModeLock) {
                         synchronized (mDeviceStateLock) {
-                            mBtHelper.scoClientDied(msg.obj);
+                            onCommunicationRouteClientDied((CommunicationRouteClient) msg.obj);
                         }
                     }
                     break;
-                case MSG_L_SPEAKERPHONE_CLIENT_DIED:
-                    synchronized (mDeviceStateLock) {
-                        speakerphoneClientDied(msg.obj);
+                case MSG_L_UPDATE_COMMUNICATION_ROUTE:
+                    synchronized (mSetModeLock) {
+                        synchronized (mDeviceStateLock) {
+                            onUpdateCommunicationRoute((String) msg.obj);
+                        }
                     }
                     break;
                 case MSG_TOGGLE_HDMI:
@@ -1084,18 +1308,41 @@
                                 info.mDevice, info.mState, info.mSupprNoisy, info.mMusicDevice);
                     }
                 } break;
-                case MSG_IL_SAVE_PREF_DEVICE_FOR_STRATEGY: {
+                case MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY: {
                     final int strategy = msg.arg1;
-                    final AudioDeviceAttributes device = (AudioDeviceAttributes) msg.obj;
-                    mDeviceInventory.onSaveSetPreferredDevice(strategy, device);
+                    final List<AudioDeviceAttributes> devices =
+                            (List<AudioDeviceAttributes>) msg.obj;
+                    mDeviceInventory.onSaveSetPreferredDevices(strategy, devices);
                 } break;
-                case MSG_I_SAVE_REMOVE_PREF_DEVICE_FOR_STRATEGY: {
+                case MSG_I_SAVE_REMOVE_PREF_DEVICES_FOR_STRATEGY: {
                     final int strategy = msg.arg1;
-                    mDeviceInventory.onSaveRemovePreferredDevice(strategy);
+                    mDeviceInventory.onSaveRemovePreferredDevices(strategy);
+                } break;
+                case MSG_IL_SET_PREF_DEVICES_FOR_STRATEGY: {
+                    final int strategy = msg.arg1;
+                    final List<AudioDeviceAttributes> devices =
+                            (List<AudioDeviceAttributes>) msg.obj;
+                    setPreferredDevicesForStrategySync(strategy, devices);
+
+                } break;
+                case MSG_I_REMOVE_PREF_DEVICES_FOR_STRATEGY: {
+                    final int strategy = msg.arg1;
+                    removePreferredDevicesForStrategySync(strategy);
                 } break;
                 case MSG_CHECK_MUTE_MUSIC:
                     checkMessagesMuteMusic(0);
                     break;
+                case MSG_IL_SAVE_PREF_DEVICES_FOR_CAPTURE_PRESET: {
+                    final int capturePreset = msg.arg1;
+                    final List<AudioDeviceAttributes> devices =
+                            (List<AudioDeviceAttributes>) msg.obj;
+                    mDeviceInventory.onSaveSetPreferredDevicesForCapturePreset(
+                            capturePreset, devices);
+                } break;
+                case MSG_I_SAVE_CLEAR_PREF_DEVICES_FOR_CAPTURE_PRESET: {
+                    final int capturePreset = msg.arg1;
+                    mDeviceInventory.onSaveClearPreferredDevicesForCapturePreset(capturePreset);
+                } break;
                 default:
                     Log.wtf(TAG, "Invalid message " + msg.what);
             }
@@ -1163,15 +1410,19 @@
     // process external command to (dis)connect a hearing aid device
     private static final int MSG_L_HEARING_AID_DEVICE_CONNECTION_CHANGE_EXT = 31;
 
-    // a ScoClient died in BtHelper
-    private static final int MSG_L_SCOCLIENT_DIED = 32;
-    private static final int MSG_IL_SAVE_PREF_DEVICE_FOR_STRATEGY = 33;
-    private static final int MSG_I_SAVE_REMOVE_PREF_DEVICE_FOR_STRATEGY = 34;
+    private static final int MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY = 32;
+    private static final int MSG_I_SAVE_REMOVE_PREF_DEVICES_FOR_STRATEGY = 33;
 
-    private static final int MSG_L_SPEAKERPHONE_CLIENT_DIED = 35;
-    private static final int MSG_CHECK_MUTE_MUSIC = 36;
-    private static final int MSG_REPORT_NEW_ROUTES_A2DP = 37;
+    private static final int MSG_L_COMMUNICATION_ROUTE_CLIENT_DIED = 34;
+    private static final int MSG_CHECK_MUTE_MUSIC = 35;
+    private static final int MSG_REPORT_NEW_ROUTES_A2DP = 36;
 
+    private static final int MSG_IL_SAVE_PREF_DEVICES_FOR_CAPTURE_PRESET = 37;
+    private static final int MSG_I_SAVE_CLEAR_PREF_DEVICES_FOR_CAPTURE_PRESET = 38;
+
+    private static final int MSG_L_UPDATE_COMMUNICATION_ROUTE = 39;
+    private static final int MSG_IL_SET_PREF_DEVICES_FOR_STRATEGY = 40;
+    private static final int MSG_I_REMOVE_PREF_DEVICES_FOR_STRATEGY = 41;
 
     private static boolean isMessageHandledUnderWakelock(int msgId) {
         switch(msgId) {
@@ -1325,14 +1576,20 @@
         }
     }
 
-    private class SpeakerphoneClient implements IBinder.DeathRecipient {
+    // List of applications requesting a specific route for communication.
+    @GuardedBy("mDeviceStateLock")
+    private final @NonNull LinkedList<CommunicationRouteClient> mCommunicationRouteClients =
+            new LinkedList<CommunicationRouteClient>();
+
+    private class CommunicationRouteClient implements IBinder.DeathRecipient {
         private final IBinder mCb;
         private final int mPid;
-        private final boolean mOn;
-        SpeakerphoneClient(IBinder cb, int pid, boolean on) {
+        private AudioDeviceAttributes mDevice;
+
+        CommunicationRouteClient(IBinder cb, int pid, AudioDeviceAttributes device) {
             mCb = cb;
             mPid = pid;
-            mOn = on;
+            mDevice = device;
         }
 
         public boolean registerDeathRecipient() {
@@ -1341,7 +1598,7 @@
                 mCb.linkToDeath(this, 0);
                 status = true;
             } catch (RemoteException e) {
-                Log.w(TAG, "SpeakerphoneClient could not link to " + mCb + " binder death");
+                Log.w(TAG, "CommunicationRouteClient could not link to " + mCb + " binder death");
             }
             return status;
         }
@@ -1350,13 +1607,13 @@
             try {
                 mCb.unlinkToDeath(this, 0);
             } catch (NoSuchElementException e) {
-                Log.w(TAG, "SpeakerphoneClient could not not unregistered to binder");
+                Log.w(TAG, "CommunicationRouteClient could not not unregistered to binder");
             }
         }
 
         @Override
         public void binderDied() {
-            postSpeakerphoneClientDied(this);
+            postCommunicationRouteClientDied(this);
         }
 
         IBinder getBinder() {
@@ -1367,29 +1624,103 @@
             return mPid;
         }
 
-        boolean isOn() {
-            return mOn;
+        AudioDeviceAttributes getDevice() {
+            return mDevice;
+        }
+
+        boolean requestsBluetoothSco() {
+            return mDevice != null
+                    && mDevice.getType()
+                        == AudioDeviceInfo.TYPE_BLUETOOTH_SCO;
+        }
+
+        boolean requestsSpeakerphone() {
+            return mDevice != null
+                    && mDevice.getType()
+                        == AudioDeviceInfo.TYPE_BUILTIN_SPEAKER;
         }
     }
 
+    // @GuardedBy("mSetModeLock")
     @GuardedBy("mDeviceStateLock")
-    private void speakerphoneClientDied(Object obj) {
-        if (obj == null) {
+    private void onCommunicationRouteClientDied(CommunicationRouteClient client) {
+        if (client == null) {
             return;
         }
         Log.w(TAG, "Speaker client died");
-        if (removeSpeakerphoneClient(((SpeakerphoneClient) obj).getBinder(), false) != null) {
-            updateSpeakerphoneOn("speakerphoneClientDied");
+        if (removeCommunicationRouteClient(client.getBinder(), false)
+                != null) {
+            onUpdateCommunicationRoute("onCommunicationRouteClientDied");
         }
     }
 
-    private SpeakerphoneClient removeSpeakerphoneClient(IBinder cb, boolean unregister) {
-        for (SpeakerphoneClient cl : mSpeakerphoneClients) {
+    /**
+     * Determines which forced usage for communication should be sent to audio policy manager
+     * as a function of current SCO audio activation state and active communication route requests.
+     * SCO audio state has the highest priority as it can result from external activation by
+     * telephony service.
+     * @return selected forced usage for communication.
+     */
+    @GuardedBy("mDeviceStateLock")
+    @Nullable private AudioDeviceAttributes getPreferredDeviceForComm() {
+        boolean btSCoOn = mBluetoothScoOn && mBtHelper.isBluetoothScoOn();
+        if (btSCoOn) {
+            // Use the SCO device known to BtHelper so that it matches exactly
+            // what has been communicated to audio policy manager. The device
+            // returned by requestedCommunicationDevice() can be a dummy SCO device if legacy
+            // APIs are used to start SCO audio.
+            AudioDeviceAttributes device = mBtHelper.getHeadsetAudioDevice();
+            if (device != null) {
+                return device;
+            }
+        }
+        AudioDeviceAttributes device = requestedCommunicationDevice();
+        if (device == null
+                || AudioSystem.DEVICE_OUT_ALL_SCO_SET.contains(device.getInternalType())) {
+            // Do not indicate BT SCO selection if SCO is requested but SCO is not ON
+            return null;
+        }
+        return device;
+    }
+
+    /**
+     * Configures audio policy manager and audio HAL according to active communication route.
+     * Always called from message Handler.
+     */
+    // @GuardedBy("mSetModeLock")
+    @GuardedBy("mDeviceStateLock")
+    private void onUpdateCommunicationRoute(String eventSource) {
+        mPreferredDeviceforComm = getPreferredDeviceForComm();
+        if (AudioService.DEBUG_COMM_RTE) {
+            Log.v(TAG, "onUpdateCommunicationRoute, mPreferredDeviceforComm: "
+                    + mPreferredDeviceforComm + " eventSource: " + eventSource);
+        }
+
+        if (mPreferredDeviceforComm == null
+                || !AudioSystem.DEVICE_OUT_ALL_SCO_SET.contains(
+                        mPreferredDeviceforComm.getInternalType())) {
+            AudioSystem.setParameters("BT_SCO=off");
+        } else {
+            AudioSystem.setParameters("BT_SCO=on");
+        }
+        if (mPreferredDeviceforComm == null) {
+            postRemovePreferredDevicesForStrategy(mCommunicationStrategyId);
+        } else {
+            postSetPreferredDevicesForStrategy(
+                    mCommunicationStrategyId, Arrays.asList(mPreferredDeviceforComm));
+        }
+        mAudioService.postUpdateRingerModeServiceInt();
+        dispatchCommunicationDevice();
+    }
+
+    private CommunicationRouteClient removeCommunicationRouteClient(
+                    IBinder cb, boolean unregister) {
+        for (CommunicationRouteClient cl : mCommunicationRouteClients) {
             if (cl.getBinder() == cb) {
                 if (unregister) {
                     cl.unregisterDeathRecipient();
                 }
-                mSpeakerphoneClients.remove(cl);
+                mCommunicationRouteClients.remove(cl);
                 return cl;
             }
         }
@@ -1397,30 +1728,25 @@
     }
 
     @GuardedBy("mDeviceStateLock")
-    private boolean addSpeakerphoneClient(IBinder cb, int pid, boolean on) {
+    private CommunicationRouteClient addCommunicationRouteClient(
+                    IBinder cb, int pid, AudioDeviceAttributes device) {
         // always insert new request at first position
-        removeSpeakerphoneClient(cb, true);
-        SpeakerphoneClient client = new SpeakerphoneClient(cb, pid, on);
+        removeCommunicationRouteClient(cb, true);
+        CommunicationRouteClient client = new CommunicationRouteClient(cb, pid, device);
         if (client.registerDeathRecipient()) {
-            mSpeakerphoneClients.add(0, client);
-            return true;
+            mCommunicationRouteClients.add(0, client);
+            return client;
         }
-        return false;
+        return null;
     }
 
     @GuardedBy("mDeviceStateLock")
-    private SpeakerphoneClient getSpeakerphoneClientForPid(int pid) {
-        for (SpeakerphoneClient cl : mSpeakerphoneClients) {
+    private CommunicationRouteClient getCommunicationRouteClientForPid(int pid) {
+        for (CommunicationRouteClient cl : mCommunicationRouteClients) {
             if (cl.getPid() == pid) {
                 return cl;
             }
         }
         return null;
     }
-
-    // List of clients requesting speakerPhone ON
-    @GuardedBy("mDeviceStateLock")
-    private final @NonNull ArrayList<SpeakerphoneClient> mSpeakerphoneClients =
-            new ArrayList<SpeakerphoneClient>();
-
 }
diff --git a/services/core/java/com/android/server/audio/AudioDeviceInventory.java b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
index 02a846e..82586b8 100644
--- a/services/core/java/com/android/server/audio/AudioDeviceInventory.java
+++ b/services/core/java/com/android/server/audio/AudioDeviceInventory.java
@@ -16,7 +16,6 @@
 package com.android.server.audio;
 
 import android.annotation.NonNull;
-import android.annotation.Nullable;
 import android.app.ActivityManager;
 import android.bluetooth.BluetoothA2dp;
 import android.bluetooth.BluetoothAdapter;
@@ -32,7 +31,8 @@
 import android.media.AudioRoutesInfo;
 import android.media.AudioSystem;
 import android.media.IAudioRoutesObserver;
-import android.media.IStrategyPreferredDeviceDispatcher;
+import android.media.ICapturePresetDevicesRoleDispatcher;
+import android.media.IStrategyPreferredDevicesDispatcher;
 import android.media.MediaMetrics;
 import android.os.Binder;
 import android.os.RemoteCallbackList;
@@ -51,6 +51,7 @@
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Set;
 
 /**
@@ -137,7 +138,12 @@
     private final ArrayMap<Integer, String> mApmConnectedDevices = new ArrayMap<>();
 
     // List of preferred devices for strategies
-    private final ArrayMap<Integer, AudioDeviceAttributes> mPreferredDevices = new ArrayMap<>();
+    private final ArrayMap<Integer, List<AudioDeviceAttributes>> mPreferredDevices =
+            new ArrayMap<>();
+
+    // List of preferred devices of capture preset
+    private final ArrayMap<Integer, List<AudioDeviceAttributes>> mPreferredDevicesForCapturePreset =
+            new ArrayMap<>();
 
     // the wrapper for AudioSystem static methods, allows us to spy AudioSystem
     private final @NonNull AudioSystemAdapter mAudioSystem;
@@ -150,8 +156,12 @@
             new RemoteCallbackList<IAudioRoutesObserver>();
 
     // Monitoring of strategy-preferred device
-    final RemoteCallbackList<IStrategyPreferredDeviceDispatcher> mPrefDevDispatchers =
-            new RemoteCallbackList<IStrategyPreferredDeviceDispatcher>();
+    final RemoteCallbackList<IStrategyPreferredDevicesDispatcher> mPrefDevDispatchers =
+            new RemoteCallbackList<IStrategyPreferredDevicesDispatcher>();
+
+    // Monitoring of devices for role and capture preset
+    final RemoteCallbackList<ICapturePresetDevicesRoleDispatcher> mDevRoleCapturePresetDispatchers =
+            new RemoteCallbackList<ICapturePresetDevicesRoleDispatcher>();
 
     /*package*/ AudioDeviceInventory(@NonNull AudioDeviceBroker broker) {
         mDeviceBroker = broker;
@@ -242,6 +252,9 @@
             pw.println("  " + prefix + " type:0x" + Integer.toHexString(keyType)
                     + " (" + AudioSystem.getDeviceName(keyType)
                     + ") addr:" + valueAddress); });
+        mPreferredDevicesForCapturePreset.forEach((capturePreset, devices) -> {
+            pw.println("  " + prefix + "capturePreset:" + capturePreset
+                    + " devices:" + devices); });
     }
 
     //------------------------------------------------------------
@@ -265,8 +278,12 @@
             }
         }
         synchronized (mPreferredDevices) {
-            mPreferredDevices.forEach((strategy, device) -> {
-                mAudioSystem.setPreferredDeviceForStrategy(strategy, device); });
+            mPreferredDevices.forEach((strategy, devices) -> {
+                mAudioSystem.setDevicesRoleForStrategy(
+                        strategy, AudioSystem.DEVICE_ROLE_PREFERRED, devices); });
+        }
+        synchronized (mPreferredDevicesForCapturePreset) {
+            // TODO: call audiosystem to restore
         }
     }
 
@@ -600,52 +617,108 @@
         mmi.record();
     }
 
-    /*package*/ void onSaveSetPreferredDevice(int strategy, @NonNull AudioDeviceAttributes device) {
-        mPreferredDevices.put(strategy, device);
-        dispatchPreferredDevice(strategy, device);
+    /*package*/ void onSaveSetPreferredDevices(int strategy,
+                                               @NonNull List<AudioDeviceAttributes> devices) {
+        mPreferredDevices.put(strategy, devices);
+        dispatchPreferredDevice(strategy, devices);
     }
 
-    /*package*/ void onSaveRemovePreferredDevice(int strategy) {
+    /*package*/ void onSaveRemovePreferredDevices(int strategy) {
         mPreferredDevices.remove(strategy);
-        dispatchPreferredDevice(strategy, null);
+        dispatchPreferredDevice(strategy, new ArrayList<AudioDeviceAttributes>());
+    }
+
+    /*package*/ void onSaveSetPreferredDevicesForCapturePreset(
+            int capturePreset, @NonNull List<AudioDeviceAttributes> devices) {
+        mPreferredDevicesForCapturePreset.put(capturePreset, devices);
+        dispatchDevicesRoleForCapturePreset(
+                capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
+    }
+
+    /*package*/ void onSaveClearPreferredDevicesForCapturePreset(int capturePreset) {
+        mPreferredDevicesForCapturePreset.remove(capturePreset);
+        dispatchDevicesRoleForCapturePreset(
+                capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED,
+                new ArrayList<AudioDeviceAttributes>());
     }
 
     //------------------------------------------------------------
     //
 
-    /*package*/ int setPreferredDeviceForStrategySync(int strategy,
-                                                      @NonNull AudioDeviceAttributes device) {
+    /*package*/ int setPreferredDevicesForStrategySync(int strategy,
+            @NonNull List<AudioDeviceAttributes> devices) {
         final long identity = Binder.clearCallingIdentity();
-        final int status = mAudioSystem.setPreferredDeviceForStrategy(strategy, device);
+
+        AudioService.sDeviceLogger.log((new AudioEventLogger.StringEvent(
+                                "setPreferredDevicesForStrategySync, strategy: " + strategy
+                                + " devices: " + devices)).printLog(TAG));
+        final int status = mAudioSystem.setDevicesRoleForStrategy(
+                strategy, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
         Binder.restoreCallingIdentity(identity);
 
         if (status == AudioSystem.SUCCESS) {
-            mDeviceBroker.postSaveSetPreferredDeviceForStrategy(strategy, device);
+            mDeviceBroker.postSaveSetPreferredDevicesForStrategy(strategy, devices);
         }
         return status;
     }
 
-    /*package*/ int removePreferredDeviceForStrategySync(int strategy) {
+    /*package*/ int removePreferredDevicesForStrategySync(int strategy) {
         final long identity = Binder.clearCallingIdentity();
-        final int status = mAudioSystem.removePreferredDeviceForStrategy(strategy);
+        final int status = mAudioSystem.removeDevicesRoleForStrategy(
+                strategy, AudioSystem.DEVICE_ROLE_PREFERRED);
         Binder.restoreCallingIdentity(identity);
 
         if (status == AudioSystem.SUCCESS) {
-            mDeviceBroker.postSaveRemovePreferredDeviceForStrategy(strategy);
+            mDeviceBroker.postSaveRemovePreferredDevicesForStrategy(strategy);
         }
         return status;
     }
 
-    /*package*/ void registerStrategyPreferredDeviceDispatcher(
-            @NonNull IStrategyPreferredDeviceDispatcher dispatcher) {
+    /*package*/ void registerStrategyPreferredDevicesDispatcher(
+            @NonNull IStrategyPreferredDevicesDispatcher dispatcher) {
         mPrefDevDispatchers.register(dispatcher);
     }
 
-    /*package*/ void unregisterStrategyPreferredDeviceDispatcher(
-            @NonNull IStrategyPreferredDeviceDispatcher dispatcher) {
+    /*package*/ void unregisterStrategyPreferredDevicesDispatcher(
+            @NonNull IStrategyPreferredDevicesDispatcher dispatcher) {
         mPrefDevDispatchers.unregister(dispatcher);
     }
 
+    /*package*/ int setPreferredDevicesForCapturePresetSync(
+            int capturePreset, @NonNull List<AudioDeviceAttributes> devices) {
+        final long identity = Binder.clearCallingIdentity();
+        final int status = mAudioSystem.setDevicesRoleForCapturePreset(
+                capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
+        Binder.restoreCallingIdentity(identity);
+
+        if (status == AudioSystem.SUCCESS) {
+            mDeviceBroker.postSaveSetPreferredDevicesForCapturePreset(capturePreset, devices);
+        }
+        return status;
+    }
+
+    /*package*/ int clearPreferredDevicesForCapturePresetSync(int capturePreset) {
+        final long identity = Binder.clearCallingIdentity();
+        final int status = mAudioSystem.clearDevicesRoleForCapturePreset(
+                capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED);
+        Binder.restoreCallingIdentity(identity);
+
+        if (status == AudioSystem.SUCCESS) {
+            mDeviceBroker.postSaveClearPreferredDevicesForCapturePreset(capturePreset);
+        }
+        return status;
+    }
+
+    /*package*/ void registerCapturePresetDevicesRoleDispatcher(
+            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) {
+        mDevRoleCapturePresetDispatchers.register(dispatcher);
+    }
+
+    /*package*/ void unregisterCapturePresetDevicesRoleDispatcher(
+            @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) {
+        mDevRoleCapturePresetDispatchers.unregister(dispatcher);
+    }
+
     /**
      * Implements the communication with AudioSystem to (dis)connect a device in the native layers
      * @param connect true if connection
@@ -1288,17 +1361,32 @@
         }
     }
 
-    private void dispatchPreferredDevice(int strategy, @Nullable AudioDeviceAttributes device) {
+    private void dispatchPreferredDevice(int strategy,
+                                         @NonNull List<AudioDeviceAttributes> devices) {
         final int nbDispatchers = mPrefDevDispatchers.beginBroadcast();
         for (int i = 0; i < nbDispatchers; i++) {
             try {
-                mPrefDevDispatchers.getBroadcastItem(i).dispatchPrefDeviceChanged(strategy, device);
+                mPrefDevDispatchers.getBroadcastItem(i).dispatchPrefDevicesChanged(
+                        strategy, devices);
             } catch (RemoteException e) {
             }
         }
         mPrefDevDispatchers.finishBroadcast();
     }
 
+    private void dispatchDevicesRoleForCapturePreset(
+            int capturePreset, int role, @NonNull List<AudioDeviceAttributes> devices) {
+        final int nbDispatchers = mDevRoleCapturePresetDispatchers.beginBroadcast();
+        for (int i = 0; i < nbDispatchers; ++i) {
+            try {
+                mDevRoleCapturePresetDispatchers.getBroadcastItem(i).dispatchDevicesRoleChanged(
+                        capturePreset, role, devices);
+            } catch (RemoteException e) {
+            }
+        }
+        mDevRoleCapturePresetDispatchers.finishBroadcast();
+    }
+
     //----------------------------------------------------------
     // For tests only
 
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index a06f9dd..024dca7 100755
--- a/services/core/java/com/android/server/audio/AudioService.java
+++ b/services/core/java/com/android/server/audio/AudioService.java
@@ -84,10 +84,12 @@
 import android.media.IAudioRoutesObserver;
 import android.media.IAudioServerStateDispatcher;
 import android.media.IAudioService;
+import android.media.ICapturePresetDevicesRoleDispatcher;
+import android.media.ICommunicationDeviceDispatcher;
 import android.media.IPlaybackConfigDispatcher;
 import android.media.IRecordingConfigDispatcher;
 import android.media.IRingtonePlayer;
-import android.media.IStrategyPreferredDeviceDispatcher;
+import android.media.IStrategyPreferredDevicesDispatcher;
 import android.media.IVolumeController;
 import android.media.MediaExtractor;
 import android.media.MediaFormat;
@@ -171,6 +173,7 @@
 import java.util.Set;
 import java.util.concurrent.Executor;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Collectors;
 
 /**
  * The implementation of the audio service for volume, audio focus, device management...
@@ -205,6 +208,9 @@
     /** debug calls to devices APIs */
     protected static final boolean DEBUG_DEVICES = false;
 
+    /** Debug communication route */
+    protected static final boolean DEBUG_COMM_RTE = false;
+
     /** How long to delay before persisting a change in volume/ringer mode. */
     private static final int PERSIST_DELAY = 500;
 
@@ -1850,22 +1856,28 @@
     ///////////////////////////////////////////////////////////////////////////
     // IPC methods
     ///////////////////////////////////////////////////////////////////////////
-    /** @see AudioManager#setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceInfo) */
-    public int setPreferredDeviceForStrategy(int strategy, AudioDeviceAttributes device) {
-        if (device == null) {
+    /**
+     * @see AudioManager#setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceAttributes)
+     * @see AudioManager#setPreferredDevicesForStrategy(AudioProductStrategy,
+     *                                                  List<AudioDeviceAttributes>)
+     */
+    public int setPreferredDevicesForStrategy(int strategy, List<AudioDeviceAttributes> devices) {
+        if (devices == null) {
             return AudioSystem.ERROR;
         }
         enforceModifyAudioRoutingPermission();
         final String logString = String.format(
                 "setPreferredDeviceForStrategy u/pid:%d/%d strat:%d dev:%s",
-                Binder.getCallingUid(), Binder.getCallingPid(), strategy, device.toString());
+                Binder.getCallingUid(), Binder.getCallingPid(), strategy,
+                devices.stream().map(e -> e.toString()).collect(Collectors.joining(",")));
         sDeviceLogger.log(new AudioEventLogger.StringEvent(logString).printLog(TAG));
-        if (device.getRole() == AudioDeviceAttributes.ROLE_INPUT) {
+        if (devices.stream().anyMatch(device ->
+                device.getRole() == AudioDeviceAttributes.ROLE_INPUT)) {
             Log.e(TAG, "Unsupported input routing in " + logString);
             return AudioSystem.ERROR;
         }
 
-        final int status = mDeviceBroker.setPreferredDeviceForStrategySync(strategy, device);
+        final int status = mDeviceBroker.setPreferredDevicesForStrategySync(strategy, devices);
         if (status != AudioSystem.SUCCESS) {
             Log.e(TAG, String.format("Error %d in %s)", status, logString));
         }
@@ -1874,53 +1886,149 @@
     }
 
     /** @see AudioManager#removePreferredDeviceForStrategy(AudioProductStrategy) */
-    public int removePreferredDeviceForStrategy(int strategy) {
+    public int removePreferredDevicesForStrategy(int strategy) {
         enforceModifyAudioRoutingPermission();
         final String logString =
                 String.format("removePreferredDeviceForStrategy strat:%d", strategy);
         sDeviceLogger.log(new AudioEventLogger.StringEvent(logString).printLog(TAG));
 
-        final int status = mDeviceBroker.removePreferredDeviceForStrategySync(strategy);
+        final int status = mDeviceBroker.removePreferredDevicesForStrategySync(strategy);
         if (status != AudioSystem.SUCCESS) {
             Log.e(TAG, String.format("Error %d in %s)", status, logString));
         }
         return status;
     }
 
-    /** @see AudioManager#getPreferredDeviceForStrategy(AudioProductStrategy) */
-    public AudioDeviceAttributes getPreferredDeviceForStrategy(int strategy) {
+    /**
+     * @see AudioManager#getPreferredDeviceForStrategy(AudioProductStrategy)
+     * @see AudioManager#getPreferredDevicesForStrategy(AudioProductStrategy)
+     */
+    public List<AudioDeviceAttributes> getPreferredDevicesForStrategy(int strategy) {
         enforceModifyAudioRoutingPermission();
-        AudioDeviceAttributes[] devices = new AudioDeviceAttributes[1];
+        List<AudioDeviceAttributes> devices = new ArrayList<>();
         final long identity = Binder.clearCallingIdentity();
-        final int status = AudioSystem.getPreferredDeviceForStrategy(strategy, devices);
+        final int status = AudioSystem.getDevicesForRoleAndStrategy(
+                strategy, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
         Binder.restoreCallingIdentity(identity);
         if (status != AudioSystem.SUCCESS) {
             Log.e(TAG, String.format("Error %d in getPreferredDeviceForStrategy(%d)",
                     status, strategy));
-            return null;
+            return new ArrayList<AudioDeviceAttributes>();
         } else {
-            return devices[0];
+            return devices;
         }
     }
 
-    /** @see AudioManager#addOnPreferredDeviceForStrategyChangedListener(Executor, AudioManager.OnPreferredDeviceForStrategyChangedListener) */
-    public void registerStrategyPreferredDeviceDispatcher(
-            @Nullable IStrategyPreferredDeviceDispatcher dispatcher) {
+    /** @see AudioManager#addOnPreferredDevicesForStrategyChangedListener(
+     *               Executor, AudioManager.OnPreferredDevicesForStrategyChangedListener)
+     */
+    public void registerStrategyPreferredDevicesDispatcher(
+            @Nullable IStrategyPreferredDevicesDispatcher dispatcher) {
         if (dispatcher == null) {
             return;
         }
         enforceModifyAudioRoutingPermission();
-        mDeviceBroker.registerStrategyPreferredDeviceDispatcher(dispatcher);
+        mDeviceBroker.registerStrategyPreferredDevicesDispatcher(dispatcher);
     }
 
-    /** @see AudioManager#removeOnPreferredDeviceForStrategyChangedListener(AudioManager.OnPreferredDeviceForStrategyChangedListener) */
-    public void unregisterStrategyPreferredDeviceDispatcher(
-            @Nullable IStrategyPreferredDeviceDispatcher dispatcher) {
+    /** @see AudioManager#removeOnPreferredDevicesForStrategyChangedListener(
+     *               AudioManager.OnPreferredDevicesForStrategyChangedListener)
+     */
+    public void unregisterStrategyPreferredDevicesDispatcher(
+            @Nullable IStrategyPreferredDevicesDispatcher dispatcher) {
         if (dispatcher == null) {
             return;
         }
         enforceModifyAudioRoutingPermission();
-        mDeviceBroker.unregisterStrategyPreferredDeviceDispatcher(dispatcher);
+        mDeviceBroker.unregisterStrategyPreferredDevicesDispatcher(dispatcher);
+    }
+
+    /**
+     * @see AudioManager#setPreferredDeviceForCapturePreset(int, AudioDeviceAttributes)
+     */
+    public int setPreferredDevicesForCapturePreset(
+            int capturePreset, List<AudioDeviceAttributes> devices) {
+        if (devices == null) {
+            return AudioSystem.ERROR;
+        }
+        enforceModifyAudioRoutingPermission();
+        final String logString = String.format(
+                "setPreferredDevicesForCapturePreset u/pid:%d/%d source:%d dev:%s",
+                Binder.getCallingUid(), Binder.getCallingPid(), capturePreset,
+                devices.stream().map(e -> e.toString()).collect(Collectors.joining(",")));
+        sDeviceLogger.log(new AudioEventLogger.StringEvent(logString).printLog(TAG));
+        if (devices.stream().anyMatch(device ->
+                device.getRole() == AudioDeviceAttributes.ROLE_OUTPUT)) {
+            Log.e(TAG, "Unsupported output routing in " + logString);
+            return AudioSystem.ERROR;
+        }
+
+        final int status = mDeviceBroker.setPreferredDevicesForCapturePresetSync(
+                capturePreset, devices);
+        if (status != AudioSystem.SUCCESS) {
+            Log.e(TAG, String.format("Error %d in %s)", status, logString));
+        }
+
+        return status;
+    }
+
+    /** @see AudioManager#clearPreferredDevicesForCapturePreset(int) */
+    public int clearPreferredDevicesForCapturePreset(int capturePreset) {
+        enforceModifyAudioRoutingPermission();
+        final String logString = String.format(
+                "removePreferredDeviceForCapturePreset source:%d", capturePreset);
+        sDeviceLogger.log(new AudioEventLogger.StringEvent(logString).printLog(TAG));
+
+        final int status = mDeviceBroker.clearPreferredDevicesForCapturePresetSync(capturePreset);
+        if (status != AudioSystem.SUCCESS) {
+            Log.e(TAG, String.format("Error %d in %s", status, logString));
+        }
+        return status;
+    }
+
+    /**
+     * @see AudioManager#getPreferredDevicesForCapturePreset(int)
+     */
+    public List<AudioDeviceAttributes> getPreferredDevicesForCapturePreset(int capturePreset) {
+        enforceModifyAudioRoutingPermission();
+        List<AudioDeviceAttributes> devices = new ArrayList<>();
+        final long identity = Binder.clearCallingIdentity();
+        final int status = AudioSystem.getDevicesForRoleAndCapturePreset(
+                capturePreset, AudioSystem.DEVICE_ROLE_PREFERRED, devices);
+        Binder.restoreCallingIdentity(identity);
+        if (status != AudioSystem.SUCCESS) {
+            Log.e(TAG, String.format("Error %d in getPreferredDeviceForCapturePreset(%d)",
+                    status, capturePreset));
+            return new ArrayList<AudioDeviceAttributes>();
+        } else {
+            return devices;
+        }
+    }
+
+    /**
+     * @see AudioManager#addOnPreferredDevicesForCapturePresetChangedListener(
+     *              Executor, OnPreferredDevicesForCapturePresetChangedListener)
+     */
+    public void registerCapturePresetDevicesRoleDispatcher(
+            @Nullable ICapturePresetDevicesRoleDispatcher dispatcher) {
+        if (dispatcher == null) {
+            return;
+        }
+        enforceModifyAudioRoutingPermission();
+        mDeviceBroker.registerCapturePresetDevicesRoleDispatcher(dispatcher);
+    }
+
+    /**
+     * @see AudioManager#removeOnPreferredDevicesForCapturePresetChangedListener(
+     *              AudioManager.OnPreferredDevicesForCapturePresetChangedListener)
+     */
+    public void unregisterCapturePresetDevicesRoleDispatcher(
+            @Nullable ICapturePresetDevicesRoleDispatcher dispatcher) {
+        if (dispatcher == null) {
+            return;
+        }
+        enforceModifyAudioRoutingPermission();
+        mDeviceBroker.unregisterCapturePresetDevicesRoleDispatcher(dispatcher);
     }
 
     /** @see AudioManager#getDevicesForAttributes(AudioAttributes) */
@@ -3585,7 +3693,7 @@
         final boolean ringerModeMute = ringerMode == AudioManager.RINGER_MODE_VIBRATE
                 || ringerMode == AudioManager.RINGER_MODE_SILENT;
         final boolean shouldRingSco = ringerMode == AudioManager.RINGER_MODE_VIBRATE
-                && isBluetoothScoOn();
+                && mDeviceBroker.isBluetoothScoOn();
         // Ask audio policy engine to force use Bluetooth SCO channel if needed
         final String eventSource = "muteRingerModeStreams() from u/pid:" + Binder.getCallingUid()
                 + "/" + Binder.getCallingPid();
@@ -4161,6 +4269,115 @@
         restoreDeviceVolumeBehavior();
     }
 
+    private static final int[] VALID_COMMUNICATION_DEVICE_TYPES = {
+        AudioDeviceInfo.TYPE_BUILTIN_SPEAKER,
+        AudioDeviceInfo.TYPE_BLUETOOTH_SCO,
+        AudioDeviceInfo.TYPE_WIRED_HEADSET,
+        AudioDeviceInfo.TYPE_USB_HEADSET,
+        AudioDeviceInfo.TYPE_BUILTIN_EARPIECE,
+        AudioDeviceInfo.TYPE_WIRED_HEADPHONES,
+        AudioDeviceInfo.TYPE_HEARING_AID,
+        AudioDeviceInfo.TYPE_BLE_HEADSET,
+        AudioDeviceInfo.TYPE_USB_DEVICE,
+        AudioDeviceInfo.TYPE_BLE_SPEAKER,
+        AudioDeviceInfo.TYPE_LINE_ANALOG,
+        AudioDeviceInfo.TYPE_HDMI,
+        AudioDeviceInfo.TYPE_AUX_LINE
+    };
+
+    private boolean isValidCommunicationDevice(AudioDeviceInfo device) {
+        for (int type : VALID_COMMUNICATION_DEVICE_TYPES) {
+            if (device.getType() == type) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** @see AudioManager#setDeviceForCommunication(int) */
+    public boolean setDeviceForCommunication(IBinder cb, int portId) {
+        final int uid = Binder.getCallingUid();
+        final int pid = Binder.getCallingPid();
+
+        AudioDeviceInfo device = null;
+        if (portId != 0) {
+            device = AudioManager.getDeviceForPortId(portId, AudioManager.GET_DEVICES_OUTPUTS);
+            if (device == null) {
+                throw new IllegalArgumentException("invalid portID " + portId);
+            }
+            if (!isValidCommunicationDevice(device)) {
+                throw new IllegalArgumentException("invalid device type " + device.getType());
+            }
+        }
+        final String eventSource = new StringBuilder("setDeviceForCommunication(")
+                .append(") from u/pid:").append(uid).append("/")
+                .append(pid).toString();
+
+        int deviceType = AudioSystem.DEVICE_OUT_DEFAULT;
+        String deviceAddress = null;
+        if (device != null) {
+            deviceType = device.getPort().type();
+            deviceAddress = device.getAddress();
+        } else {
+            AudioDeviceInfo curDevice = mDeviceBroker.getDeviceForCommunication();
+            if (curDevice != null) {
+                deviceType = curDevice.getPort().type();
+                deviceAddress = curDevice.getAddress();
+            }
+        }
+        // do not log metrics if clearing communication device while no communication device
+        // was selected
+        if (deviceType != AudioSystem.DEVICE_OUT_DEFAULT) {
+            new MediaMetrics.Item(MediaMetrics.Name.AUDIO_DEVICE
+                    + MediaMetrics.SEPARATOR + "setDeviceForCommunication")
+                    .set(MediaMetrics.Property.DEVICE,
+                            AudioSystem.getDeviceName(deviceType))
+                    .set(MediaMetrics.Property.ADDRESS, deviceAddress)
+                    .set(MediaMetrics.Property.STATE, device != null
+                            ? MediaMetrics.Value.CONNECTED : MediaMetrics.Value.DISCONNECTED)
+                    .record();
+        }
+
+        final long ident = Binder.clearCallingIdentity();
+        boolean status =
+                mDeviceBroker.setDeviceForCommunication(cb, pid, device, eventSource);
+        Binder.restoreCallingIdentity(ident);
+        return status;
+    }
+
+    /** @see AudioManager#getDeviceForCommunication() */
+    public int getDeviceForCommunication() {
+        final long ident = Binder.clearCallingIdentity();
+        AudioDeviceInfo device = mDeviceBroker.getDeviceForCommunication();
+        Binder.restoreCallingIdentity(ident);
+        if (device == null) {
+            return 0;
+        }
+        return device.getId();
+    }
+
+    /** @see AudioManager#addOnCommunicationDeviceChangedListener(
+     *               Executor, AudioManager.OnCommunicationDeviceChangedListener)
+     */
+    public void registerCommunicationDeviceDispatcher(
+            @Nullable ICommunicationDeviceDispatcher dispatcher) {
+        if (dispatcher == null) {
+            return;
+        }
+        mDeviceBroker.registerCommunicationDeviceDispatcher(dispatcher);
+    }
+
+    /** @see AudioManager#removeOnCommunicationDeviceChangedListener(
+     *               AudioManager.OnCommunicationDeviceChangedListener)
+     */
+    public void unregisterCommunicationDeviceDispatcher(
+            @Nullable ICommunicationDeviceDispatcher dispatcher) {
+        if (dispatcher == null) {
+            return;
+        }
+        mDeviceBroker.unregisterCommunicationDeviceDispatcher(dispatcher);
+    }
+
     /** @see AudioManager#setSpeakerphoneOn(boolean) */
     public void setSpeakerphoneOn(IBinder cb, boolean on) {
         if (!checkAudioSettingsPermission("setSpeakerphoneOn()")) {
@@ -4170,10 +4387,10 @@
         // for logging only
         final int uid = Binder.getCallingUid();
         final int pid = Binder.getCallingPid();
+
         final String eventSource = new StringBuilder("setSpeakerphoneOn(").append(on)
                 .append(") from u/pid:").append(uid).append("/")
                 .append(pid).toString();
-        final boolean stateChanged = mDeviceBroker.setSpeakerphoneOn(cb, pid, on, eventSource);
         new MediaMetrics.Item(MediaMetrics.Name.AUDIO_DEVICE
                 + MediaMetrics.SEPARATOR + "setSpeakerphoneOn")
                 .setUid(uid)
@@ -4181,17 +4398,9 @@
                 .set(MediaMetrics.Property.STATE, on
                         ? MediaMetrics.Value.ON : MediaMetrics.Value.OFF)
                 .record();
-
-        if (stateChanged) {
-            final long ident = Binder.clearCallingIdentity();
-            try {
-                mContext.sendBroadcastAsUser(
-                        new Intent(AudioManager.ACTION_SPEAKERPHONE_STATE_CHANGED)
-                                .setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY), UserHandle.ALL);
-            } finally {
-                Binder.restoreCallingIdentity(ident);
-            }
-        }
+        final long ident = Binder.clearCallingIdentity();
+        mDeviceBroker.setSpeakerphoneOn(cb, pid, on, eventSource);
+        Binder.restoreCallingIdentity(ident);
     }
 
     /** @see AudioManager#isSpeakerphoneOn() */
@@ -4199,6 +4408,11 @@
         return mDeviceBroker.isSpeakerphoneOn();
     }
 
+
+    /** BT SCO audio state seen by apps using the deprecated API setBluetoothScoOn().
+     * @see isBluetoothScoOn() */
+    private boolean mBtScoOnByApp;
+
     /** @see AudioManager#setBluetoothScoOn(boolean) */
     public void setBluetoothScoOn(boolean on) {
         if (!checkAudioSettingsPermission("setBluetoothScoOn()")) {
@@ -4207,7 +4421,7 @@
 
         // Only enable calls from system components
         if (UserHandle.getCallingAppId() >= FIRST_APPLICATION_UID) {
-            mDeviceBroker.setBluetoothScoOnByApp(on);
+            mBtScoOnByApp = on;
             return;
         }
 
@@ -4233,7 +4447,7 @@
      * Note that it doesn't report internal state, but state seen by apps (which may have
      * called setBluetoothScoOn() */
     public boolean isBluetoothScoOn() {
-        return mDeviceBroker.isBluetoothScoOnForApp();
+        return mBtScoOnByApp || mDeviceBroker.isBluetoothScoOn();
     }
 
     // TODO investigate internal users due to deprecation of SDK API
@@ -4280,7 +4494,7 @@
                 .set(MediaMetrics.Property.SCO_AUDIO_MODE,
                         BtHelper.scoAudioModeToString(scoAudioMode))
                 .record();
-        startBluetoothScoInt(cb, scoAudioMode, eventSource);
+        startBluetoothScoInt(cb, pid, scoAudioMode, eventSource);
 
     }
 
@@ -4299,10 +4513,10 @@
                 .set(MediaMetrics.Property.SCO_AUDIO_MODE,
                         BtHelper.scoAudioModeToString(BtHelper.SCO_MODE_VIRTUAL_CALL))
                 .record();
-        startBluetoothScoInt(cb, BtHelper.SCO_MODE_VIRTUAL_CALL, eventSource);
+        startBluetoothScoInt(cb, pid, BtHelper.SCO_MODE_VIRTUAL_CALL, eventSource);
     }
 
-    void startBluetoothScoInt(IBinder cb, int scoAudioMode, @NonNull String eventSource) {
+    void startBluetoothScoInt(IBinder cb, int pid, int scoAudioMode, @NonNull String eventSource) {
         MediaMetrics.Item mmi = new MediaMetrics.Item(MediaMetrics.Name.AUDIO_BLUETOOTH)
                 .set(MediaMetrics.Property.EVENT, "startBluetoothScoInt")
                 .set(MediaMetrics.Property.SCO_AUDIO_MODE,
@@ -4313,9 +4527,9 @@
             mmi.set(MediaMetrics.Property.EARLY_RETURN, "permission or systemReady").record();
             return;
         }
-        synchronized (mDeviceBroker.mSetModeLock) {
-            mDeviceBroker.startBluetoothScoForClient_Sync(cb, scoAudioMode, eventSource);
-        }
+        final long ident = Binder.clearCallingIdentity();
+        mDeviceBroker.startBluetoothScoForClient(cb, pid, scoAudioMode, eventSource);
+        Binder.restoreCallingIdentity(ident);
         mmi.record();
     }
 
@@ -4330,9 +4544,9 @@
         final String eventSource =  new StringBuilder("stopBluetoothSco()")
                 .append(") from u/pid:").append(uid).append("/")
                 .append(pid).toString();
-        synchronized (mDeviceBroker.mSetModeLock) {
-            mDeviceBroker.stopBluetoothScoForClient_Sync(cb, eventSource);
-        }
+        final long ident = Binder.clearCallingIdentity();
+        mDeviceBroker.stopBluetoothScoForClient(cb, pid, eventSource);
+        Binder.restoreCallingIdentity(ident);
         new MediaMetrics.Item(MediaMetrics.Name.AUDIO_BLUETOOTH)
                 .setUid(uid)
                 .setPid(pid)
@@ -4758,8 +4972,7 @@
         switch (mPlatformType) {
         case AudioSystem.PLATFORM_VOICE:
             if (isInCommunication()) {
-                if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION)
-                        == AudioSystem.FORCE_BT_SCO) {
+                if (mDeviceBroker.isBluetoothScoOn()) {
                     // Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO...");
                     return AudioSystem.STREAM_BLUETOOTH_SCO;
                 } else {
@@ -4795,8 +5008,7 @@
             }
         default:
             if (isInCommunication()) {
-                if (AudioSystem.getForceUse(AudioSystem.FOR_COMMUNICATION)
-                        == AudioSystem.FORCE_BT_SCO) {
+                if (mDeviceBroker.isBluetoothScoOn()) {
                     if (DEBUG_VOL) Log.v(TAG, "getActiveStreamType: Forcing STREAM_BLUETOOTH_SCO");
                     return AudioSystem.STREAM_BLUETOOTH_SCO;
                 } else {
@@ -7566,6 +7778,7 @@
         pw.print("  mHasVibrator="); pw.println(mHasVibrator);
         pw.print("  mVolumePolicy="); pw.println(mVolumePolicy);
         pw.print("  mAvrcpAbsVolSupported="); pw.println(mAvrcpAbsVolSupported);
+        pw.print("  mBtScoOnByApp="); pw.println(mBtScoOnByApp);
         pw.print("  mIsSingleVolume="); pw.println(mIsSingleVolume);
         pw.print("  mUseFixedVolume="); pw.println(mUseFixedVolume);
         pw.print("  mFixedVolumeDevices="); pw.println(dumpDeviceTypes(mFixedVolumeDevices));
diff --git a/services/core/java/com/android/server/audio/AudioSystemAdapter.java b/services/core/java/com/android/server/audio/AudioSystemAdapter.java
index e60243f..ae64990 100644
--- a/services/core/java/com/android/server/audio/AudioSystemAdapter.java
+++ b/services/core/java/com/android/server/audio/AudioSystemAdapter.java
@@ -20,6 +20,8 @@
 import android.media.AudioDeviceAttributes;
 import android.media.AudioSystem;
 
+import java.util.List;
+
 /**
  * Provides an adapter to access functionality of the android.media.AudioSystem class for device
  * related functionality.
@@ -77,22 +79,59 @@
     }
 
     /**
-     * Same as {@link AudioSystem#setPreferredDeviceForStrategy(int, AudioDeviceAttributes)}
+     * Same as {@link AudioSystem#setDevicesRoleForStrategy(int, int, List)}
      * @param strategy
-     * @param device
+     * @param role
+     * @param devices
      * @return
      */
-    public int setPreferredDeviceForStrategy(int strategy, @NonNull AudioDeviceAttributes device) {
-        return AudioSystem.setPreferredDeviceForStrategy(strategy, device);
+    public int setDevicesRoleForStrategy(int strategy, int role,
+                                         @NonNull List<AudioDeviceAttributes> devices) {
+        return AudioSystem.setDevicesRoleForStrategy(strategy, role, devices);
     }
 
     /**
-     * Same as {@link AudioSystem#removePreferredDeviceForStrategy(int)}
+     * Same as {@link AudioSystem#removeDevicesRoleForStrategy(int, int)}
      * @param strategy
+     * @param role
      * @return
      */
-    public int removePreferredDeviceForStrategy(int strategy) {
-        return AudioSystem.removePreferredDeviceForStrategy(strategy);
+    public int removeDevicesRoleForStrategy(int strategy, int role) {
+        return AudioSystem.removeDevicesRoleForStrategy(strategy, role);
+    }
+
+    /**
+     * Same as (@link AudioSystem#setDevicesRoleForCapturePreset(int, List))
+     * @param capturePreset
+     * @param role
+     * @param devices
+     * @return
+     */
+    public int setDevicesRoleForCapturePreset(int capturePreset, int role,
+                                              @NonNull List<AudioDeviceAttributes> devices) {
+        return AudioSystem.setDevicesRoleForCapturePreset(capturePreset, role, devices);
+    }
+
+    /**
+     * Same as {@link AudioSystem#removeDevicesRoleForCapturePreset(int, int)}
+     * @param capturePreset
+     * @param role
+     * @param devicesToRemove
+     * @return
+     */
+    public int removeDevicesRoleForCapturePreset(
+            int capturePreset, int role, @NonNull List<AudioDeviceAttributes> devicesToRemove) {
+        return AudioSystem.removeDevicesRoleForCapturePreset(capturePreset, role, devicesToRemove);
+    }
+
+    /**
+     * Same as {@link AudioSystem#}
+     * @param capturePreset
+     * @param role
+     * @return
+     */
+    public int clearDevicesRoleForCapturePreset(int capturePreset, int role) {
+        return AudioSystem.clearDevicesRoleForCapturePreset(capturePreset, role);
     }
 
     /**
diff --git a/services/core/java/com/android/server/audio/BtHelper.java b/services/core/java/com/android/server/audio/BtHelper.java
index 7616557..c9a1fcf 100644
--- a/services/core/java/com/android/server/audio/BtHelper.java
+++ b/services/core/java/com/android/server/audio/BtHelper.java
@@ -27,11 +27,10 @@
 import android.bluetooth.BluetoothHearingAid;
 import android.bluetooth.BluetoothProfile;
 import android.content.Intent;
+import android.media.AudioDeviceAttributes;
 import android.media.AudioManager;
 import android.media.AudioSystem;
 import android.os.Binder;
-import android.os.IBinder;
-import android.os.RemoteException;
 import android.os.UserHandle;
 import android.provider.Settings;
 import android.util.Log;
@@ -39,9 +38,7 @@
 import com.android.internal.annotations.GuardedBy;
 
 import java.io.PrintWriter;
-import java.util.ArrayList;
 import java.util.List;
-import java.util.NoSuchElementException;
 import java.util.Objects;
 
 /**
@@ -58,10 +55,6 @@
         mDeviceBroker = broker;
     }
 
-    // List of clients having issued a SCO start request
-    @GuardedBy("BtHelper.this")
-    private final @NonNull ArrayList<ScoClient> mScoClients = new ArrayList<ScoClient>();
-
     // BluetoothHeadset API to control SCO connection
     private @Nullable BluetoothHeadset mBluetoothHeadset;
 
@@ -301,6 +294,8 @@
     @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
     /*package*/ synchronized void receiveBtEvent(Intent intent) {
         final String action = intent.getAction();
+
+        Log.i(TAG, "receiveBtEvent action: " + action + " mScoAudioState: " + mScoAudioState);
         if (action.equals(BluetoothHeadset.ACTION_ACTIVE_DEVICE_CHANGED)) {
             BluetoothDevice btDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
             setBtScoActiveDevice(btDevice);
@@ -308,20 +303,16 @@
             boolean broadcast = false;
             int scoAudioState = AudioManager.SCO_AUDIO_STATE_ERROR;
             int btState = intent.getIntExtra(BluetoothProfile.EXTRA_STATE, -1);
-            // broadcast intent if the connection was initated by AudioService
-            if (!mScoClients.isEmpty()
-                    && (mScoAudioState == SCO_STATE_ACTIVE_INTERNAL
-                    || mScoAudioState == SCO_STATE_ACTIVATE_REQ
-                    || mScoAudioState == SCO_STATE_DEACTIVATE_REQ
-                    || mScoAudioState == SCO_STATE_DEACTIVATING)) {
-                broadcast = true;
-            }
+            Log.i(TAG, "receiveBtEvent ACTION_AUDIO_STATE_CHANGED: " + btState);
             switch (btState) {
                 case BluetoothHeadset.STATE_AUDIO_CONNECTED:
                     scoAudioState = AudioManager.SCO_AUDIO_STATE_CONNECTED;
                     if (mScoAudioState != SCO_STATE_ACTIVE_INTERNAL
                             && mScoAudioState != SCO_STATE_DEACTIVATE_REQ) {
                         mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL;
+                    } else if (mDeviceBroker.isBluetoothScoRequested()) {
+                        // broadcast intent if the connection was initated by AudioService
+                        broadcast = true;
                     }
                     mDeviceBroker.setBluetoothScoOn(true, "BtHelper.receiveBtEvent");
                     break;
@@ -333,21 +324,21 @@
                     // notified by requestScoState() setting state to SCO_STATE_ACTIVATE_REQ.
                     // 2) If audio was connected then disconnected via Bluetooth APIs and
                     // we still have pending activation requests by apps: this is indicated by
-                    // state SCO_STATE_ACTIVE_EXTERNAL and the mScoClients list not empty.
+                    // state SCO_STATE_ACTIVE_EXTERNAL and BT SCO is requested.
                     if (mScoAudioState == SCO_STATE_ACTIVATE_REQ
                             || (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL
-                                    && !mScoClients.isEmpty())) {
+                                    && mDeviceBroker.isBluetoothScoRequested())) {
                         if (mBluetoothHeadset != null && mBluetoothHeadsetDevice != null
                                 && connectBluetoothScoAudioHelper(mBluetoothHeadset,
                                 mBluetoothHeadsetDevice, mScoAudioMode)) {
                             mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
-                            broadcast = false;
+                            scoAudioState = AudioManager.SCO_AUDIO_STATE_CONNECTING;
+                            broadcast = true;
                             break;
                         }
                     }
-                    // Tear down SCO if disconnected from external
-                    if (mScoAudioState == SCO_STATE_DEACTIVATING) {
-                        clearAllScoClients(0, false);
+                    if (mScoAudioState != SCO_STATE_ACTIVE_EXTERNAL) {
+                        broadcast = true;
                     }
                     mScoAudioState = SCO_STATE_INACTIVE;
                     break;
@@ -356,11 +347,8 @@
                             && mScoAudioState != SCO_STATE_DEACTIVATE_REQ) {
                         mScoAudioState = SCO_STATE_ACTIVE_EXTERNAL;
                     }
-                    broadcast = false;
                     break;
                 default:
-                    // do not broadcast CONNECTING or invalid state
-                    broadcast = false;
                     break;
             }
             if (broadcast) {
@@ -386,81 +374,19 @@
                 == BluetoothHeadset.STATE_AUDIO_CONNECTED;
     }
 
-    /**
-     * Disconnect all SCO connections started by {@link AudioManager} except those started by
-     * {@param exceptPid}
-     *
-     * @param exceptPid pid whose SCO connections through {@link AudioManager} should be kept
-     */
     // @GuardedBy("AudioDeviceBroker.mSetModeLock")
     @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
-    /*package*/ synchronized void disconnectBluetoothSco(int exceptPid) {
-        checkScoAudioState();
-        if (mScoAudioState == SCO_STATE_ACTIVE_EXTERNAL) {
-            return;
-        }
-        clearAllScoClients(exceptPid, true);
-    }
-
-    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
-    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
-    /*package*/ synchronized void startBluetoothScoForClient(IBinder cb, int scoAudioMode,
+    /*package*/ synchronized boolean startBluetoothSco(int scoAudioMode,
                 @NonNull String eventSource) {
-        ScoClient client = getScoClient(cb, true);
-        // The calling identity must be cleared before calling ScoClient.incCount().
-        // inCount() calls requestScoState() which in turn can call BluetoothHeadset APIs
-        // and this must be done on behalf of system server to make sure permissions are granted.
-        // The caller identity must be cleared after getScoClient() because it is needed if a new
-        // client is created.
-        final long ident = Binder.clearCallingIdentity();
-        try {
-            AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(eventSource));
-            client.requestScoState(BluetoothHeadset.STATE_AUDIO_CONNECTED, scoAudioMode);
-        } catch (NullPointerException e) {
-            Log.e(TAG, "Null ScoClient", e);
-        }
-        Binder.restoreCallingIdentity(ident);
-    }
-
-    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
-    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
-    /*package*/ synchronized void stopBluetoothScoForClient(IBinder cb,
-            @NonNull String eventSource) {
-        ScoClient client = getScoClient(cb, false);
-        // The calling identity must be cleared before calling ScoClient.decCount().
-        // decCount() calls requestScoState() which in turn can call BluetoothHeadset APIs
-        // and this must be done on behalf of system server to make sure permissions are granted.
-        final long ident = Binder.clearCallingIdentity();
-        if (client != null) {
-            stopAndRemoveClient(client, eventSource);
-        }
-        Binder.restoreCallingIdentity(ident);
-    }
-
-    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
-    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
-    /*package*/ synchronized void stopBluetoothScoForPid(int pid) {
-        ScoClient client = getScoClientForPid(pid);
-        if (client == null) {
-            return;
-        }
-        final String eventSource = new StringBuilder("stopBluetoothScoForPid(")
-                .append(pid).append(")").toString();
-        stopAndRemoveClient(client, eventSource);
-    }
-
-    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
-    // @GuardedBy("BtHelper.this")
-    private void stopAndRemoveClient(ScoClient client, @NonNull String eventSource) {
         AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(eventSource));
-        client.requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED,
-                SCO_MODE_VIRTUAL_CALL);
-        // If a disconnection is pending, the client will be removed when clearAllScoClients()
-        // is called form receiveBtEvent()
-        if (mScoAudioState != SCO_STATE_DEACTIVATE_REQ
-                && mScoAudioState != SCO_STATE_DEACTIVATING) {
-            client.remove(false /*stop */, true /*unregister*/);
-        }
+        return requestScoState(BluetoothHeadset.STATE_AUDIO_CONNECTED, scoAudioMode);
+    }
+
+    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
+    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
+    /*package*/ synchronized boolean stopBluetoothSco(@NonNull String eventSource) {
+        AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(eventSource));
+        return requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED, SCO_MODE_VIRTUAL_CALL);
     }
 
     /*package*/ synchronized void setHearingAidVolume(int index, int streamType) {
@@ -507,7 +433,6 @@
     // @GuardedBy("AudioDeviceBroker.mSetModeLock")
     @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
     /*package*/ synchronized void resetBluetoothSco() {
-        clearAllScoClients(0, false);
         mScoAudioState = SCO_STATE_INACTIVE;
         broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
         AudioSystem.setParameters("A2dpSuspended=false");
@@ -606,46 +531,64 @@
         mDeviceBroker.postBroadcastScoConnectionState(state);
     }
 
-    private boolean handleBtScoActiveDeviceChange(BluetoothDevice btDevice, boolean isActive) {
-        if (btDevice == null) {
-            return true;
+    @Nullable AudioDeviceAttributes getHeadsetAudioDevice() {
+        if (mBluetoothHeadsetDevice == null) {
+            return null;
         }
+        return btHeadsetDeviceToAudioDevice(mBluetoothHeadsetDevice);
+    }
+
+    private AudioDeviceAttributes btHeadsetDeviceToAudioDevice(BluetoothDevice btDevice) {
         String address = btDevice.getAddress();
+        if (!BluetoothAdapter.checkBluetoothAddress(address)) {
+            address = "";
+        }
         BluetoothClass btClass = btDevice.getBluetoothClass();
-        int inDevice = AudioSystem.DEVICE_IN_BLUETOOTH_SCO_HEADSET;
-        int[] outDeviceTypes = {
-                AudioSystem.DEVICE_OUT_BLUETOOTH_SCO,
-                AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
-                AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT
-        };
+        int nativeType = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO;
         if (btClass != null) {
             switch (btClass.getDeviceClass()) {
                 case BluetoothClass.Device.AUDIO_VIDEO_WEARABLE_HEADSET:
                 case BluetoothClass.Device.AUDIO_VIDEO_HANDSFREE:
-                    outDeviceTypes = new int[] { AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET };
+                    nativeType = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET;
                     break;
                 case BluetoothClass.Device.AUDIO_VIDEO_CAR_AUDIO:
-                    outDeviceTypes = new int[] { AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT };
+                    nativeType = AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT;
                     break;
             }
         }
-        if (!BluetoothAdapter.checkBluetoothAddress(address)) {
-            address = "";
+        if (AudioService.DEBUG_DEVICES) {
+            Log.i(TAG, "btHeadsetDeviceToAudioDevice btDevice: " + btDevice
+                    + " btClass: " + (btClass == null ? "Unknown" : btClass)
+                    + " nativeType: " + nativeType + " address: " + address);
         }
+        return new AudioDeviceAttributes(nativeType, address);
+    }
+
+    private boolean handleBtScoActiveDeviceChange(BluetoothDevice btDevice, boolean isActive) {
+        if (btDevice == null) {
+            return true;
+        }
+        int inDevice = AudioSystem.DEVICE_IN_BLUETOOTH_SCO_HEADSET;
+        AudioDeviceAttributes audioDevice =  btHeadsetDeviceToAudioDevice(btDevice);
         String btDeviceName =  getName(btDevice);
         boolean result = false;
         if (isActive) {
-            result |= mDeviceBroker.handleDeviceConnection(
-                    isActive, outDeviceTypes[0], address, btDeviceName);
+            result |= mDeviceBroker.handleDeviceConnection(isActive, audioDevice.getInternalType(),
+                    audioDevice.getAddress(), btDeviceName);
         } else {
+            int[] outDeviceTypes = {
+                    AudioSystem.DEVICE_OUT_BLUETOOTH_SCO,
+                    AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_HEADSET,
+                    AudioSystem.DEVICE_OUT_BLUETOOTH_SCO_CARKIT
+            };
             for (int outDeviceType : outDeviceTypes) {
                 result |= mDeviceBroker.handleDeviceConnection(
-                        isActive, outDeviceType, address, btDeviceName);
+                        isActive, outDeviceType, audioDevice.getAddress(), btDeviceName);
             }
         }
         // handleDeviceConnection() && result to make sure the method get executed
         result = mDeviceBroker.handleDeviceConnection(
-                isActive, inDevice, address, btDeviceName) && result;
+                isActive, inDevice, audioDevice.getAddress(), btDeviceName) && result;
         return result;
     }
 
@@ -733,195 +676,122 @@
             };
 
     //----------------------------------------------------------------------
+
     // @GuardedBy("AudioDeviceBroker.mSetModeLock")
-    @GuardedBy("AudioDeviceBroker.mDeviceStateLock")
-    /*package*/ synchronized void scoClientDied(Object obj) {
-        final ScoClient client = (ScoClient) obj;
-        client.remove(true /*stop*/, false /*unregister*/);
-        Log.w(TAG, "SCO client died");
-    }
-
-    private class ScoClient implements IBinder.DeathRecipient {
-        private IBinder mCb; // To be notified of client's death
-        private int mCreatorPid;
-
-        ScoClient(IBinder cb) {
-            mCb = cb;
-            mCreatorPid = Binder.getCallingPid();
-        }
-
-        public void registerDeathRecipient() {
-            try {
-                mCb.linkToDeath(this, 0);
-            } catch (RemoteException e) {
-                Log.w(TAG, "ScoClient could not link to " + mCb + " binder death");
-            }
-        }
-
-        public void unregisterDeathRecipient() {
-            try {
-                mCb.unlinkToDeath(this, 0);
-            } catch (NoSuchElementException e) {
-                Log.w(TAG, "ScoClient could not not unregistered to binder");
-            }
-        }
-
-        @Override
-        public void binderDied() {
-            // process this from DeviceBroker's message queue to take the right locks since
-            // this event can impact SCO mode and requires querying audio mode stack
-            mDeviceBroker.postScoClientDied(this);
-        }
-
-        IBinder getBinder() {
-            return mCb;
-        }
-
-        int getPid() {
-            return mCreatorPid;
-        }
-
-        // @GuardedBy("AudioDeviceBroker.mSetModeLock")
-        //@GuardedBy("AudioDeviceBroker.mDeviceStateLock")
-        @GuardedBy("BtHelper.this")
-        private boolean requestScoState(int state, int scoAudioMode) {
-            checkScoAudioState();
-            if (mScoClients.size() != 1) {
-                Log.i(TAG, "requestScoState: state=" + state + ", scoAudioMode=" + scoAudioMode
-                        + ", num SCO clients=" + mScoClients.size());
-                return true;
-            }
-            if (state == BluetoothHeadset.STATE_AUDIO_CONNECTED) {
-                // Make sure that the state transitions to CONNECTING even if we cannot initiate
-                // the connection.
-                broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_CONNECTING);
-                // Accept SCO audio activation only in NORMAL audio mode or if the mode is
-                // currently controlled by the same client process.
-                final int modeOwnerPid =  mDeviceBroker.getModeOwnerPid();
-                if (modeOwnerPid != 0 && (modeOwnerPid != mCreatorPid)) {
-                    Log.w(TAG, "requestScoState: audio mode is not NORMAL and modeOwnerPid "
-                            + modeOwnerPid + " != creatorPid " + mCreatorPid);
+    //@GuardedBy("AudioDeviceBroker.mDeviceStateLock")
+    @GuardedBy("BtHelper.this")
+    private boolean requestScoState(int state, int scoAudioMode) {
+        checkScoAudioState();
+        if (state == BluetoothHeadset.STATE_AUDIO_CONNECTED) {
+            // Make sure that the state transitions to CONNECTING even if we cannot initiate
+            // the connection.
+            broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_CONNECTING);
+            switch (mScoAudioState) {
+                case SCO_STATE_INACTIVE:
+                    mScoAudioMode = scoAudioMode;
+                    if (scoAudioMode == SCO_MODE_UNDEFINED) {
+                        mScoAudioMode = SCO_MODE_VIRTUAL_CALL;
+                        if (mBluetoothHeadsetDevice != null) {
+                            mScoAudioMode = Settings.Global.getInt(
+                                    mDeviceBroker.getContentResolver(),
+                                    "bluetooth_sco_channel_"
+                                            + mBluetoothHeadsetDevice.getAddress(),
+                                    SCO_MODE_VIRTUAL_CALL);
+                            if (mScoAudioMode > SCO_MODE_MAX || mScoAudioMode < 0) {
+                                mScoAudioMode = SCO_MODE_VIRTUAL_CALL;
+                            }
+                        }
+                    }
+                    if (mBluetoothHeadset == null) {
+                        if (getBluetoothHeadset()) {
+                            mScoAudioState = SCO_STATE_ACTIVATE_REQ;
+                        } else {
+                            Log.w(TAG, "requestScoState: getBluetoothHeadset failed during"
+                                    + " connection, mScoAudioMode=" + mScoAudioMode);
+                            broadcastScoConnectionState(
+                                    AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                            return false;
+                        }
+                        break;
+                    }
+                    if (mBluetoothHeadsetDevice == null) {
+                        Log.w(TAG, "requestScoState: no active device while connecting,"
+                                + " mScoAudioMode=" + mScoAudioMode);
+                        broadcastScoConnectionState(
+                                AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                        return false;
+                    }
+                    if (connectBluetoothScoAudioHelper(mBluetoothHeadset,
+                            mBluetoothHeadsetDevice, mScoAudioMode)) {
+                        mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
+                    } else {
+                        Log.w(TAG, "requestScoState: connect to "
+                                + mBluetoothHeadsetDevice
+                                + " failed, mScoAudioMode=" + mScoAudioMode);
+                        broadcastScoConnectionState(
+                                AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                        return false;
+                    }
+                    break;
+                case SCO_STATE_DEACTIVATING:
+                    mScoAudioState = SCO_STATE_ACTIVATE_REQ;
+                    break;
+                case SCO_STATE_DEACTIVATE_REQ:
+                    mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
+                    broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_CONNECTED);
+                    break;
+                case SCO_STATE_ACTIVE_INTERNAL:
+                    Log.w(TAG, "requestScoState: already in ACTIVE mode, simply return");
+                    break;
+                default:
+                    Log.w(TAG, "requestScoState: failed to connect in state "
+                            + mScoAudioState + ", scoAudioMode=" + scoAudioMode);
                     broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
                     return false;
-                }
-                switch (mScoAudioState) {
-                    case SCO_STATE_INACTIVE:
-                        mScoAudioMode = scoAudioMode;
-                        if (scoAudioMode == SCO_MODE_UNDEFINED) {
-                            mScoAudioMode = SCO_MODE_VIRTUAL_CALL;
-                            if (mBluetoothHeadsetDevice != null) {
-                                mScoAudioMode = Settings.Global.getInt(
-                                        mDeviceBroker.getContentResolver(),
-                                        "bluetooth_sco_channel_"
-                                                + mBluetoothHeadsetDevice.getAddress(),
-                                        SCO_MODE_VIRTUAL_CALL);
-                                if (mScoAudioMode > SCO_MODE_MAX || mScoAudioMode < 0) {
-                                    mScoAudioMode = SCO_MODE_VIRTUAL_CALL;
-                                }
-                            }
-                        }
-                        if (mBluetoothHeadset == null) {
-                            if (getBluetoothHeadset()) {
-                                mScoAudioState = SCO_STATE_ACTIVATE_REQ;
-                            } else {
-                                Log.w(TAG, "requestScoState: getBluetoothHeadset failed during"
-                                        + " connection, mScoAudioMode=" + mScoAudioMode);
-                                broadcastScoConnectionState(
-                                        AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
-                                return false;
-                            }
-                            break;
-                        }
-                        if (mBluetoothHeadsetDevice == null) {
-                            Log.w(TAG, "requestScoState: no active device while connecting,"
-                                    + " mScoAudioMode=" + mScoAudioMode);
-                            broadcastScoConnectionState(
-                                    AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
-                            return false;
-                        }
-                        if (connectBluetoothScoAudioHelper(mBluetoothHeadset,
-                                mBluetoothHeadsetDevice, mScoAudioMode)) {
-                            mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
+            }
+        } else if (state == BluetoothHeadset.STATE_AUDIO_DISCONNECTED) {
+            switch (mScoAudioState) {
+                case SCO_STATE_ACTIVE_INTERNAL:
+                    if (mBluetoothHeadset == null) {
+                        if (getBluetoothHeadset()) {
+                            mScoAudioState = SCO_STATE_DEACTIVATE_REQ;
                         } else {
-                            Log.w(TAG, "requestScoState: connect to " + mBluetoothHeadsetDevice
-                                    + " failed, mScoAudioMode=" + mScoAudioMode);
+                            Log.w(TAG, "requestScoState: getBluetoothHeadset failed during"
+                                    + " disconnection, mScoAudioMode=" + mScoAudioMode);
+                            mScoAudioState = SCO_STATE_INACTIVE;
                             broadcastScoConnectionState(
                                     AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
                             return false;
                         }
                         break;
-                    case SCO_STATE_DEACTIVATING:
-                        mScoAudioState = SCO_STATE_ACTIVATE_REQ;
-                        break;
-                    case SCO_STATE_DEACTIVATE_REQ:
-                        mScoAudioState = SCO_STATE_ACTIVE_INTERNAL;
-                        broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_CONNECTED);
-                        break;
-                    case SCO_STATE_ACTIVE_INTERNAL:
-                        Log.w(TAG, "requestScoState: already in ACTIVE mode, simply return");
-                        break;
-                    default:
-                        Log.w(TAG, "requestScoState: failed to connect in state "
-                                + mScoAudioState + ", scoAudioMode=" + scoAudioMode);
-                        broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
-                        return false;
-                }
-            } else if (state == BluetoothHeadset.STATE_AUDIO_DISCONNECTED) {
-                switch (mScoAudioState) {
-                    case SCO_STATE_ACTIVE_INTERNAL:
-                        if (mBluetoothHeadset == null) {
-                            if (getBluetoothHeadset()) {
-                                mScoAudioState = SCO_STATE_DEACTIVATE_REQ;
-                            } else {
-                                Log.w(TAG, "requestScoState: getBluetoothHeadset failed during"
-                                        + " disconnection, mScoAudioMode=" + mScoAudioMode);
-                                mScoAudioState = SCO_STATE_INACTIVE;
-                                broadcastScoConnectionState(
-                                        AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
-                                return false;
-                            }
-                            break;
-                        }
-                        if (mBluetoothHeadsetDevice == null) {
-                            mScoAudioState = SCO_STATE_INACTIVE;
-                            broadcastScoConnectionState(
-                                    AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
-                            break;
-                        }
-                        if (disconnectBluetoothScoAudioHelper(mBluetoothHeadset,
-                                mBluetoothHeadsetDevice, mScoAudioMode)) {
-                            mScoAudioState = SCO_STATE_DEACTIVATING;
-                        } else {
-                            mScoAudioState = SCO_STATE_INACTIVE;
-                            broadcastScoConnectionState(
-                                    AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
-                        }
-                        break;
-                    case SCO_STATE_ACTIVATE_REQ:
+                    }
+                    if (mBluetoothHeadsetDevice == null) {
                         mScoAudioState = SCO_STATE_INACTIVE;
-                        broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                        broadcastScoConnectionState(
+                                AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
                         break;
-                    default:
-                        Log.w(TAG, "requestScoState: failed to disconnect in state "
-                                + mScoAudioState + ", scoAudioMode=" + scoAudioMode);
-                        broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
-                        return false;
-                }
+                    }
+                    if (disconnectBluetoothScoAudioHelper(mBluetoothHeadset,
+                            mBluetoothHeadsetDevice, mScoAudioMode)) {
+                        mScoAudioState = SCO_STATE_DEACTIVATING;
+                    } else {
+                        mScoAudioState = SCO_STATE_INACTIVE;
+                        broadcastScoConnectionState(
+                                AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                    }
+                    break;
+                case SCO_STATE_ACTIVATE_REQ:
+                    mScoAudioState = SCO_STATE_INACTIVE;
+                    broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                    break;
+                default:
+                    Log.w(TAG, "requestScoState: failed to disconnect in state "
+                            + mScoAudioState + ", scoAudioMode=" + scoAudioMode);
+                    broadcastScoConnectionState(AudioManager.SCO_AUDIO_STATE_DISCONNECTED);
+                    return false;
             }
-            return true;
         }
-
-        @GuardedBy("BtHelper.this")
-        void remove(boolean stop, boolean unregister) {
-            if (unregister) {
-                unregisterDeathRecipient();
-            }
-            if (stop) {
-                requestScoState(BluetoothHeadset.STATE_AUDIO_DISCONNECTED,
-                        SCO_MODE_VIRTUAL_CALL);
-            }
-            mScoClients.remove(this);
-        }
+        return true;
     }
 
     //-----------------------------------------------------
@@ -974,49 +844,6 @@
         }
     }
 
-
-    @GuardedBy("BtHelper.this")
-    private ScoClient getScoClient(IBinder cb, boolean create) {
-        for (ScoClient existingClient : mScoClients) {
-            if (existingClient.getBinder() == cb) {
-                return existingClient;
-            }
-        }
-        if (create) {
-            ScoClient newClient = new ScoClient(cb);
-            newClient.registerDeathRecipient();
-            mScoClients.add(newClient);
-            return newClient;
-        }
-        return null;
-    }
-
-    @GuardedBy("BtHelper.this")
-    private ScoClient getScoClientForPid(int pid) {
-        for (ScoClient cl : mScoClients) {
-            if (cl.getPid() == pid) {
-                return cl;
-            }
-        }
-        return null;
-    }
-
-    // @GuardedBy("AudioDeviceBroker.mSetModeLock")
-    //@GuardedBy("AudioDeviceBroker.mDeviceStateLock")
-    @GuardedBy("BtHelper.this")
-    private void clearAllScoClients(int exceptPid, boolean stopSco) {
-        final ArrayList<ScoClient> clients = new ArrayList<ScoClient>();
-        for (ScoClient cl : mScoClients) {
-            if (cl.getPid() != exceptPid) {
-                clients.add(cl);
-            }
-        }
-        for (ScoClient cl : clients) {
-            cl.remove(stopSco, true /*unregister*/);
-        }
-
-    }
-
     private boolean getBluetoothHeadset() {
         boolean result = false;
         BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
@@ -1062,10 +889,6 @@
         pw.println(prefix + "mBluetoothHeadsetDevice: " + mBluetoothHeadsetDevice);
         pw.println(prefix + "mScoAudioState: " + scoAudioStateToString(mScoAudioState));
         pw.println(prefix + "mScoAudioMode: " + scoAudioModeToString(mScoAudioMode));
-        pw.println(prefix + "Sco clients:");
-        mScoClients.forEach((cl) -> {
-            pw.println("  " + prefix + "pid: " + cl.getPid() + " cb: " + cl.getBinder()); });
-
         pw.println("\n" + prefix + "mHearingAid: " + mHearingAid);
         pw.println(prefix + "mA2dp: " + mA2dp);
         pw.println(prefix + "mAvrcpAbsVolSupported: " + mAvrcpAbsVolSupported);
diff --git a/services/core/java/com/android/server/compat/CompatChange.java b/services/core/java/com/android/server/compat/CompatChange.java
index ff31931..a8aa9aa 100644
--- a/services/core/java/com/android/server/compat/CompatChange.java
+++ b/services/core/java/com/android/server/compat/CompatChange.java
@@ -143,6 +143,9 @@
      * @return {@code true} if the change should be enabled for the package.
      */
     boolean isEnabled(ApplicationInfo app) {
+        if (app == null) {
+            return defaultValue();
+        }
         if (mPackageOverrides != null && mPackageOverrides.containsKey(app.packageName)) {
             return mPackageOverrides.get(app.packageName);
         }
@@ -156,6 +159,15 @@
     }
 
     /**
+     * Returns the default value for the change id, assuming there are no overrides.
+     *
+     * @return {@code false} if it's a default disabled change, {@code true} otherwise.
+     */
+    boolean defaultValue() {
+        return !getDisabled();
+    }
+
+    /**
      * Checks whether a change has an override for a package.
      * @param packageName name of the package
      * @return true if there is such override
diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java
index d80c58b..8511118 100644
--- a/services/core/java/com/android/server/compat/CompatConfig.java
+++ b/services/core/java/com/android/server/compat/CompatConfig.java
@@ -392,6 +392,14 @@
         return alreadyKnown;
     }
 
+    boolean defaultChangeIdValue(long changeId) {
+        CompatChange c = mChanges.get(changeId);
+        if (c == null) {
+            return true;
+        }
+        return c.defaultValue();
+    }
+
     @VisibleForTesting
     void clearChanges() {
         synchronized (mChanges) {
diff --git a/services/core/java/com/android/server/compat/PlatformCompat.java b/services/core/java/com/android/server/compat/PlatformCompat.java
index 2c19a2d..aa85f7f 100644
--- a/services/core/java/com/android/server/compat/PlatformCompat.java
+++ b/services/core/java/com/android/server/compat/PlatformCompat.java
@@ -60,7 +60,6 @@
     private final CompatConfig mCompatConfig;
 
     private static int sMinTargetSdk = Build.VERSION_CODES.Q;
-    private static int sMaxTargetSdk = Build.VERSION_CODES.R;
 
     public PlatformCompat(Context context) {
         mContext = context;
@@ -107,17 +106,25 @@
     }
 
     /**
-     * Internal version of the above method. Does not perform costly permission check.
+     * Internal version of the above method, without logging. Does not perform costly permission
+     * check.
+     * TODO(b/167551701): Remove this method and add 'loggability' as a changeid property.
+     */
+    public boolean isChangeEnabledInternalNoLogging(long changeId, ApplicationInfo appInfo) {
+        return mCompatConfig.isChangeEnabled(changeId, appInfo);
+    }
+
+    /**
+     * Internal version of {@link #isChangeEnabled(long, ApplicationInfo)}. Does not perform costly
+     * permission check.
      */
     public boolean isChangeEnabledInternal(long changeId, ApplicationInfo appInfo) {
-        if (mCompatConfig.isChangeEnabled(changeId, appInfo)) {
+        boolean enabled = isChangeEnabledInternalNoLogging(changeId, appInfo);
+        if (appInfo != null) {
             reportChange(changeId, appInfo.uid,
-                    ChangeReporter.STATE_ENABLED);
-            return true;
+                    enabled ? ChangeReporter.STATE_ENABLED : ChangeReporter.STATE_DISABLED);
         }
-        reportChange(changeId, appInfo.uid,
-                ChangeReporter.STATE_DISABLED);
-        return false;
+        return enabled;
     }
 
     @Override
@@ -125,9 +132,6 @@
             @UserIdInt int userId) {
         checkCompatChangeReadAndLogPermission();
         ApplicationInfo appInfo = getApplicationInfo(packageName, userId);
-        if (appInfo == null) {
-            return true;
-        }
         return isChangeEnabled(changeId, appInfo);
     }
 
@@ -136,7 +140,7 @@
         checkCompatChangeReadAndLogPermission();
         String[] packages = mContext.getPackageManager().getPackagesForUid(uid);
         if (packages == null || packages.length == 0) {
-            return true;
+            return mCompatConfig.defaultChangeIdValue(changeId);
         }
         boolean enabled = true;
         for (String packageName : packages) {
@@ -379,8 +383,7 @@
             return false;
         }
         if (change.getEnableSinceTargetSdk() > 0) {
-            if (change.getEnableSinceTargetSdk() < sMinTargetSdk
-                    || change.getEnableSinceTargetSdk() > sMaxTargetSdk) {
+            if (change.getEnableSinceTargetSdk() < sMinTargetSdk) {
                 return false;
             }
         }
diff --git a/services/core/java/com/android/server/connectivity/PacManager.java b/services/core/java/com/android/server/connectivity/PacManager.java
index 198de78..06721ae 100644
--- a/services/core/java/com/android/server/connectivity/PacManager.java
+++ b/services/core/java/com/android/server/connectivity/PacManager.java
@@ -390,7 +390,7 @@
             return;
         }
         if (!mHasSentBroadcast) {
-            sendPacBroadcast(new ProxyInfo(mPacUrl, mLastPort));
+            sendPacBroadcast(ProxyInfo.buildPacProxy(mPacUrl, mLastPort));
             mHasSentBroadcast = true;
         }
     }
diff --git a/services/core/java/com/android/server/connectivity/ProxyTracker.java b/services/core/java/com/android/server/connectivity/ProxyTracker.java
index 5cb3d94..f6ca152 100644
--- a/services/core/java/com/android/server/connectivity/ProxyTracker.java
+++ b/services/core/java/com/android/server/connectivity/ProxyTracker.java
@@ -38,7 +38,9 @@
 import android.util.Log;
 
 import com.android.internal.annotations.GuardedBy;
+import com.android.net.module.util.ProxyUtils;
 
+import java.util.Collections;
 import java.util.Objects;
 
 /**
@@ -163,9 +165,10 @@
         if (!TextUtils.isEmpty(host) || !TextUtils.isEmpty(pacFileUrl)) {
             ProxyInfo proxyProperties;
             if (!TextUtils.isEmpty(pacFileUrl)) {
-                proxyProperties = new ProxyInfo(Uri.parse(pacFileUrl));
+                proxyProperties = ProxyInfo.buildPacProxy(Uri.parse(pacFileUrl));
             } else {
-                proxyProperties = new ProxyInfo(host, port, exclList);
+                proxyProperties = ProxyInfo.buildDirectProxy(host, port,
+                        ProxyUtils.exclusionStringAsList(exclList));
             }
             if (!proxyProperties.isValid()) {
                 if (DBG) Log.d(TAG, "Invalid proxy properties, ignoring: " + proxyProperties);
@@ -204,7 +207,8 @@
                     return false;
                 }
             }
-            final ProxyInfo p = new ProxyInfo(proxyHost, proxyPort, "");
+            final ProxyInfo p = ProxyInfo.buildDirectProxy(proxyHost, proxyPort,
+                    Collections.emptyList());
             setGlobalProxy(p);
             return true;
         }
@@ -219,7 +223,8 @@
      */
     public void sendProxyBroadcast() {
         final ProxyInfo defaultProxy = getDefaultProxy();
-        final ProxyInfo proxyInfo = null != defaultProxy ? defaultProxy : new ProxyInfo("", 0, "");
+        final ProxyInfo proxyInfo = null != defaultProxy ?
+                defaultProxy : ProxyInfo.buildDirectProxy("", 0, Collections.emptyList());
         if (mPacManager.setCurrentProxyScriptUrl(proxyInfo) == PacManager.DONT_SEND_BROADCAST) {
             return;
         }
@@ -261,7 +266,7 @@
                 mGlobalProxy = new ProxyInfo(proxyInfo);
                 host = mGlobalProxy.getHost();
                 port = mGlobalProxy.getPort();
-                exclList = mGlobalProxy.getExclusionListAsString();
+                exclList = ProxyUtils.exclusionListAsString(mGlobalProxy.getExclusionList());
                 pacFileUrl = Uri.EMPTY.equals(proxyInfo.getPacFileUrl())
                         ? "" : proxyInfo.getPacFileUrl().toString();
             } else {
diff --git a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java
index 62630300..fa03e59 100644
--- a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java
+++ b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java
@@ -60,12 +60,12 @@
 import android.net.ipsec.ike.TunnelModeChildSessionParams;
 import android.net.ipsec.ike.exceptions.IkeException;
 import android.net.ipsec.ike.exceptions.IkeProtocolException;
-import android.net.util.IpRange;
 import android.system.OsConstants;
 import android.util.Log;
 
 import com.android.internal.net.VpnProfile;
 import com.android.internal.util.HexDump;
+import com.android.net.module.util.IpRange;
 
 import java.net.Inet4Address;
 import java.net.Inet6Address;
diff --git a/services/core/java/com/android/server/net/IpConfigStore.java b/services/core/java/com/android/server/net/IpConfigStore.java
index 9c5abd4..cc3a002 100644
--- a/services/core/java/com/android/server/net/IpConfigStore.java
+++ b/services/core/java/com/android/server/net/IpConfigStore.java
@@ -30,6 +30,7 @@
 import android.util.SparseArray;
 
 import com.android.internal.annotations.VisibleForTesting;
+import com.android.net.module.util.ProxyUtils;
 
 import java.io.BufferedInputStream;
 import java.io.DataInputStream;
@@ -123,7 +124,8 @@
             switch (config.proxySettings) {
                 case STATIC:
                     ProxyInfo proxyProperties = config.httpProxy;
-                    String exclusionList = proxyProperties.getExclusionListAsString();
+                    String exclusionList = ProxyUtils.exclusionListAsString(
+                            proxyProperties.getExclusionList());
                     out.writeUTF(PROXY_SETTINGS_KEY);
                     out.writeUTF(config.proxySettings.toString());
                     out.writeUTF(PROXY_HOST_KEY);
@@ -370,13 +372,14 @@
 
                     switch (proxySettings) {
                         case STATIC:
-                            ProxyInfo proxyInfo =
-                                    new ProxyInfo(proxyHost, proxyPort, exclusionList);
+                            ProxyInfo proxyInfo = ProxyInfo.buildDirectProxy(proxyHost, proxyPort,
+                                    ProxyUtils.exclusionStringAsList(exclusionList));
                             config.proxySettings = proxySettings;
                             config.httpProxy = proxyInfo;
                             break;
                         case PAC:
-                            ProxyInfo proxyPacProperties = new ProxyInfo(Uri.parse(pacFileUrl));
+                            ProxyInfo proxyPacProperties =
+                                    ProxyInfo.buildPacProxy(Uri.parse(pacFileUrl));
                             config.proxySettings = proxySettings;
                             config.httpProxy = proxyPacProperties;
                             break;
diff --git a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
index 9dd70b7..bd80bef 100644
--- a/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
+++ b/services/core/java/com/android/server/net/NetworkPolicyManagerService.java
@@ -236,6 +236,7 @@
 import com.android.server.LocalServices;
 import com.android.server.ServiceThread;
 import com.android.server.SystemConfig;
+import com.android.server.connectivity.MultipathPolicyTracker;
 import com.android.server.usage.AppStandbyInternal;
 import com.android.server.usage.AppStandbyInternal.AppIdleStateChangeListener;
 
@@ -415,6 +416,7 @@
     private final Clock mClock;
     private final UserManager mUserManager;
     private final CarrierConfigManager mCarrierConfigManager;
+    private final MultipathPolicyTracker mMultipathPolicyTracker;
 
     private IConnectivityManager mConnManager;
     private PowerManagerInternal mPowerManagerInternal;
@@ -655,7 +657,7 @@
         mPolicyFile = new AtomicFile(new File(systemDir, "netpolicy.xml"), "net-policy");
 
         mAppOps = context.getSystemService(AppOpsManager.class);
-
+        mMultipathPolicyTracker = new MultipathPolicyTracker(mContext, mHandler);
         // Expose private service for system components to use.
         LocalServices.addService(NetworkPolicyManagerInternal.class,
                 new NetworkPolicyManagerInternalImpl());
@@ -684,7 +686,7 @@
      * Allows pre-defined apps for restrict background, but only if the user didn't already
      * revoked them.
      *
-     * @return whether any uid has been allowlisted.
+     * @return whether any uid has been added to allowlist.
      */
     @GuardedBy("mUidRulesFirstLock")
     boolean addDefaultRestrictBackgroundAllowlistUidsUL() {
@@ -708,7 +710,7 @@
         for (int i = 0; i < allowDataUsage.size(); i++) {
             final String pkg = allowDataUsage.valueAt(i);
             if (LOGD)
-                Slog.d(TAG, "checking restricted background allowlisting for package " + pkg
+                Slog.d(TAG, "checking restricted background exemption for package " + pkg
                         + " and user " + userId);
             final ApplicationInfo app;
             try {
@@ -923,6 +925,7 @@
             if (!initCompleteSignal.await(30, TimeUnit.SECONDS)) {
                 throw new IllegalStateException("Service " + TAG +" init timeout");
             }
+            mMultipathPolicyTracker.start();
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
             throw new IllegalStateException("Service " + TAG + " init interrupted", e);
@@ -1024,7 +1027,7 @@
                         // user resets app preferences.
                         mMeteredRestrictedUids.remove(userId);
                         if (action == ACTION_USER_ADDED) {
-                            // Add apps that are allowlisted by default.
+                            // Add apps that are allowed by default.
                             addDefaultRestrictBackgroundAllowlistUidsUL(userId);
                         }
                         // Update global restrict for that user
@@ -2230,8 +2233,8 @@
             in.setInput(fis, StandardCharsets.UTF_8.name());
 
              // Must save the <restrict-background> tags and convert them to <uid-policy> later,
-             // to skip UIDs that were explicitly denylisted.
-            final SparseBooleanArray allowlistedRestrictBackground = new SparseBooleanArray();
+             // to skip UIDs that were explicitly denied.
+            final SparseBooleanArray restrictBackgroundAllowedUids = new SparseBooleanArray();
 
             int type;
             int version = VERSION_INIT;
@@ -2389,7 +2392,7 @@
                         insideAllowlist = true;
                     } else if (TAG_RESTRICT_BACKGROUND.equals(tag) && insideAllowlist) {
                         final int uid = readIntAttribute(in, ATTR_UID);
-                        allowlistedRestrictBackground.append(uid, true);
+                        restrictBackgroundAllowedUids.append(uid, true);
                     } else if (TAG_REVOKED_RESTRICT_BACKGROUND.equals(tag) && insideAllowlist) {
                         final int uid = readIntAttribute(in, ATTR_UID);
                         mRestrictBackgroundAllowlistRevokedUids.put(uid, true);
@@ -2402,9 +2405,9 @@
                 }
             }
 
-            final int size = allowlistedRestrictBackground.size();
+            final int size = restrictBackgroundAllowedUids.size();
             for (int i = 0; i < size; i++) {
-                final int uid = allowlistedRestrictBackground.keyAt(i);
+                final int uid = restrictBackgroundAllowedUids.keyAt(i);
                 final int policy = mUidPolicy.get(uid, POLICY_NONE);
                 if ((policy & POLICY_REJECT_METERED_BACKGROUND) != 0) {
                     Slog.w(TAG, "ignoring restrict-background-allowlist for " + uid
@@ -2671,13 +2674,13 @@
         if (!isUidValidForAllowlistRulesUL(uid)) {
             notifyApp = false;
         } else {
-            final boolean wasDenylisted = oldPolicy == POLICY_REJECT_METERED_BACKGROUND;
-            final boolean isDenylisted = policy == POLICY_REJECT_METERED_BACKGROUND;
-            final boolean wasAllowlisted = oldPolicy == POLICY_ALLOW_METERED_BACKGROUND;
-            final boolean isAllowlisted = policy == POLICY_ALLOW_METERED_BACKGROUND;
-            final boolean wasBlocked = wasDenylisted || (mRestrictBackground && !wasAllowlisted);
-            final boolean isBlocked = isDenylisted || (mRestrictBackground && !isAllowlisted);
-            if ((wasAllowlisted && (!isAllowlisted || isDenylisted))
+            final boolean wasDenied = oldPolicy == POLICY_REJECT_METERED_BACKGROUND;
+            final boolean isDenied = policy == POLICY_REJECT_METERED_BACKGROUND;
+            final boolean wasAllowed = oldPolicy == POLICY_ALLOW_METERED_BACKGROUND;
+            final boolean isAllowed = policy == POLICY_ALLOW_METERED_BACKGROUND;
+            final boolean wasBlocked = wasDenied || (mRestrictBackground && !wasAllowed);
+            final boolean isBlocked = isDenied || (mRestrictBackground && !isAllowed);
+            if ((wasAllowed && (!isAllowed || isDenied))
                     && mDefaultRestrictBackgroundAllowlistUids.get(uid)
                     && !mRestrictBackgroundAllowlistRevokedUids.get(uid)) {
                 if (LOGD)
@@ -2962,7 +2965,7 @@
             Slog.d(TAG, "setRestrictBackgroundUL(): " + restrictBackground + "; reason: " + reason);
             final boolean oldRestrictBackground = mRestrictBackground;
             mRestrictBackground = restrictBackground;
-            // Must allowlist foreground apps before turning data saver mode on.
+            // Must allow foreground apps before turning data saver mode on.
             // TODO: there is no need to iterate through all apps here, just those in the foreground,
             // so it could call AM to get the UIDs of such apps, and iterate through them instead.
             updateRulesForRestrictBackgroundUL();
@@ -3015,7 +3018,7 @@
                 Binder.restoreCallingIdentity(token);
             }
             if (policy == POLICY_REJECT_METERED_BACKGROUND) {
-                // App is denylisted.
+                // App is restricted.
                 return RESTRICT_BACKGROUND_STATUS_ENABLED;
             }
             if (!mRestrictBackground) {
@@ -3458,6 +3461,17 @@
         }
     }
 
+    /**
+     * Get multipath preference value for the given network.
+     */
+    public int getMultipathPreference(Network network) {
+        final Integer preference = mMultipathPolicyTracker.getMultipathPreference(network);
+        if (preference != null) {
+            return preference;
+        }
+        return 0;
+    }
+
     @Override
     protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) {
         if (!DumpUtils.checkDumpPermission(mContext, TAG, writer)) return;
@@ -3678,6 +3692,8 @@
                 mLogger.dumpLogs(fout);
             }
         }
+        fout.println();
+        mMultipathPolicyTracker.dump(fout);
     }
 
     @Override
@@ -4294,9 +4310,9 @@
      * <ul>
      * <li>@{code bw_penalty_box}: UIDs added to this chain do not have access (denylist).
      * <li>@{code bw_happy_box}: UIDs added to this chain have access (allowlist), unless they're
-     *     also denylisted.
+     *     also in denylist.
      * <li>@{code bw_data_saver}: when enabled (through {@link #setRestrictBackground(boolean)}),
-     *     no UIDs other than those allowlisted will have access.
+     *     no UIDs other than those in allowlist will have access.
      * <ul>
      *
      * <p>The @{code bw_penalty_box} and @{code bw_happy_box} are primarily managed through the
@@ -4311,7 +4327,8 @@
      * <ul>
      * <li>When Data Saver mode is on, the foreground app should be temporarily added to
      *     {@code bw_happy_box} before the @{code bw_data_saver} chain is enabled.
-     * <li>If the foreground app is denylisted by the user, it should be temporarily removed from
+     * <li>If the foreground app was restricted by the user (i.e. has the policy
+     *     {@code POLICY_REJECT_METERED_BACKGROUND}), it should be temporarily removed from
      *     {@code bw_penalty_box}.
      * <li>When the app leaves foreground state, the temporary changes above should be reverted.
      * </ul>
@@ -4346,8 +4363,8 @@
         final boolean isForeground = isUidForegroundOnRestrictBackgroundUL(uid);
         final boolean isRestrictedByAdmin = isRestrictedByAdminUL(uid);
 
-        final boolean isDenylisted = (uidPolicy & POLICY_REJECT_METERED_BACKGROUND) != 0;
-        final boolean isAllowlisted = (uidPolicy & POLICY_ALLOW_METERED_BACKGROUND) != 0;
+        final boolean isDenied = (uidPolicy & POLICY_REJECT_METERED_BACKGROUND) != 0;
+        final boolean isAllowed = (uidPolicy & POLICY_ALLOW_METERED_BACKGROUND) != 0;
         final int oldRule = oldUidRules & MASK_METERED_NETWORKS;
         int newRule = RULE_NONE;
 
@@ -4355,15 +4372,15 @@
         if (isRestrictedByAdmin) {
             newRule = RULE_REJECT_METERED;
         } else if (isForeground) {
-            if (isDenylisted || (mRestrictBackground && !isAllowlisted)) {
+            if (isDenied || (mRestrictBackground && !isAllowed)) {
                 newRule = RULE_TEMPORARY_ALLOW_METERED;
-            } else if (isAllowlisted) {
+            } else if (isAllowed) {
                 newRule = RULE_ALLOW_METERED;
             }
         } else {
-            if (isDenylisted) {
+            if (isDenied) {
                 newRule = RULE_REJECT_METERED;
-            } else if (mRestrictBackground && isAllowlisted) {
+            } else if (mRestrictBackground && isAllowed) {
                 newRule = RULE_ALLOW_METERED;
             }
         }
@@ -4372,8 +4389,8 @@
         if (LOGV) {
             Log.v(TAG, "updateRuleForRestrictBackgroundUL(" + uid + ")"
                     + ": isForeground=" +isForeground
-                    + ", isDenylisted=" + isDenylisted
-                    + ", isAllowlisted=" + isAllowlisted
+                    + ", isDenied=" + isDenied
+                    + ", isAllowed=" + isAllowed
                     + ", isRestrictedByAdmin=" + isRestrictedByAdmin
                     + ", oldRule=" + uidRulesToString(oldRule)
                     + ", newRule=" + uidRulesToString(newRule)
@@ -4390,49 +4407,49 @@
         // Second step: apply bw changes based on change of state.
         if (newRule != oldRule) {
             if (hasRule(newRule, RULE_TEMPORARY_ALLOW_METERED)) {
-                // Temporarily allowlist foreground app, removing from denylist if necessary
+                // Temporarily allow foreground app, removing from denylist if necessary
                 // (since bw_penalty_box prevails over bw_happy_box).
 
                 setMeteredNetworkAllowlist(uid, true);
                 // TODO: if statement below is used to avoid an unnecessary call to netd / iptables,
                 // but ideally it should be just:
-                //    setMeteredNetworkDenylist(uid, isDenylisted);
-                if (isDenylisted) {
+                //    setMeteredNetworkDenylist(uid, isDenied);
+                if (isDenied) {
                     setMeteredNetworkDenylist(uid, false);
                 }
             } else if (hasRule(oldRule, RULE_TEMPORARY_ALLOW_METERED)) {
-                // Remove temporary allowlist from app that is not on foreground anymore.
+                // Remove temporary exemption from app that is not on foreground anymore.
 
                 // TODO: if statements below are used to avoid unnecessary calls to netd / iptables,
                 // but ideally they should be just:
-                //    setMeteredNetworkAllowlist(uid, isAllowlisted);
-                //    setMeteredNetworkDenylist(uid, isDenylisted);
-                if (!isAllowlisted) {
+                //    setMeteredNetworkAllowlist(uid, isAllowed);
+                //    setMeteredNetworkDenylist(uid, isDenied);
+                if (!isAllowed) {
                     setMeteredNetworkAllowlist(uid, false);
                 }
-                if (isDenylisted || isRestrictedByAdmin) {
+                if (isDenied || isRestrictedByAdmin) {
                     setMeteredNetworkDenylist(uid, true);
                 }
             } else if (hasRule(newRule, RULE_REJECT_METERED)
                     || hasRule(oldRule, RULE_REJECT_METERED)) {
                 // Flip state because app was explicitly added or removed to denylist.
-                setMeteredNetworkDenylist(uid, (isDenylisted || isRestrictedByAdmin));
-                if (hasRule(oldRule, RULE_REJECT_METERED) && isAllowlisted) {
-                    // Since denylist prevails over allowlist, we need to handle the special case
-                    // where app is allowlisted and denylisted at the same time (although such
-                    // scenario should be blocked by the UI), then denylist is removed.
-                    setMeteredNetworkAllowlist(uid, isAllowlisted);
+                setMeteredNetworkDenylist(uid, (isDenied || isRestrictedByAdmin));
+                if (hasRule(oldRule, RULE_REJECT_METERED) && isAllowed) {
+                    // Since denial prevails over allowance, we need to handle the special case
+                    // where app is allowed and denied at the same time (although such
+                    // scenario should be blocked by the UI), then it is removed from the denylist.
+                    setMeteredNetworkAllowlist(uid, isAllowed);
                 }
             } else if (hasRule(newRule, RULE_ALLOW_METERED)
                     || hasRule(oldRule, RULE_ALLOW_METERED)) {
                 // Flip state because app was explicitly added or removed to allowlist.
-                setMeteredNetworkAllowlist(uid, isAllowlisted);
+                setMeteredNetworkAllowlist(uid, isAllowed);
             } else {
                 // All scenarios should have been covered above.
                 Log.wtf(TAG, "Unexpected change of metered UID state for " + uid
                         + ": foreground=" + isForeground
-                        + ", allowlisted=" + isAllowlisted
-                        + ", denylisted=" + isDenylisted
+                        + ", allowlisted=" + isAllowed
+                        + ", denylisted=" + isDenied
                         + ", isRestrictedByAdmin=" + isRestrictedByAdmin
                         + ", newRule=" + uidRulesToString(newUidRules)
                         + ", oldRule=" + uidRulesToString(oldUidRules));
@@ -4448,7 +4465,7 @@
      * listeners in case of change.
      * <p>
      * There are 3 power-related rules that affects whether an app has background access on
-     * non-metered networks, and when the condition applies and the UID is not allowlisted for power
+     * non-metered networks, and when the condition applies and the UID is not allowed for power
      * restriction, it's added to the equivalent firewall chain:
      * <ul>
      * <li>App is idle: {@code fw_standby} firewall chain.
@@ -4913,7 +4930,7 @@
     private void setMeteredNetworkDenylist(int uid, boolean enable) {
         if (LOGV) Slog.v(TAG, "setMeteredNetworkDenylist " + uid + ": " + enable);
         try {
-            mNetworkManager.setUidMeteredNetworkDenylist(uid, enable);
+            mNetworkManager.setUidOnMeteredNetworkDenylist(uid, enable);
         } catch (IllegalStateException e) {
             Log.wtf(TAG, "problem setting denylist (" + enable + ") rules for " + uid, e);
         } catch (RemoteException e) {
@@ -4924,7 +4941,7 @@
     private void setMeteredNetworkAllowlist(int uid, boolean enable) {
         if (LOGV) Slog.v(TAG, "setMeteredNetworkAllowlist " + uid + ": " + enable);
         try {
-            mNetworkManager.setUidMeteredNetworkAllowlist(uid, enable);
+            mNetworkManager.setUidOnMeteredNetworkAllowlist(uid, enable);
         } catch (IllegalStateException e) {
             Log.wtf(TAG, "problem setting allowlist (" + enable + ") rules for " + uid, e);
         } catch (RemoteException e) {
@@ -5046,8 +5063,8 @@
             mNetworkManager.setFirewallUidRule(FIREWALL_CHAIN_STANDBY, uid, FIREWALL_RULE_DEFAULT);
             mNetworkManager
                     .setFirewallUidRule(FIREWALL_CHAIN_POWERSAVE, uid, FIREWALL_RULE_DEFAULT);
-            mNetworkManager.setUidMeteredNetworkAllowlist(uid, false);
-            mNetworkManager.setUidMeteredNetworkDenylist(uid, false);
+            mNetworkManager.setUidOnMeteredNetworkAllowlist(uid, false);
+            mNetworkManager.setUidOnMeteredNetworkDenylist(uid, false);
         } catch (IllegalStateException e) {
             Log.wtf(TAG, "problem resetting firewall uid rules for " + uid, e);
         } catch (RemoteException e) {
diff --git a/services/core/java/com/android/server/net/NetworkStatsCollection.java b/services/core/java/com/android/server/net/NetworkStatsCollection.java
index 342a11b..c4beddd4 100644
--- a/services/core/java/com/android/server/net/NetworkStatsCollection.java
+++ b/services/core/java/com/android/server/net/NetworkStatsCollection.java
@@ -28,9 +28,9 @@
 import static android.net.NetworkStats.TAG_NONE;
 import static android.net.NetworkStats.UID_ALL;
 import static android.net.TrafficStats.UID_REMOVED;
-import static android.net.NetworkUtils.multiplySafeByRational;
 import static android.text.format.DateUtils.WEEK_IN_MILLIS;
 
+import static com.android.internal.net.NetworkUtilsInternal.multiplySafeByRational;
 import static com.android.server.net.NetworkStatsService.TAG;
 
 import android.net.NetworkIdentity;
diff --git a/services/core/java/com/android/server/pm/ApexManager.java b/services/core/java/com/android/server/pm/ApexManager.java
index f116a24..c6a55b4 100644
--- a/services/core/java/com/android/server/pm/ApexManager.java
+++ b/services/core/java/com/android/server/pm/ApexManager.java
@@ -323,9 +323,9 @@
      * Copies the CE apex data directory for the given {@code userId} to a backup location, for use
      * in case of rollback.
      *
-     * @return long inode for the snapshot directory if the snapshot was successful, or -1 if not
+     * @return boolean true if the snapshot was successful
      */
-    public abstract long snapshotCeData(int userId, int rollbackId, String apexPackageName);
+    public abstract boolean snapshotCeData(int userId, int rollbackId, String apexPackageName);
 
     /**
      * Restores the snapshot of the CE apex data directory for the given {@code userId}.
@@ -826,7 +826,7 @@
         }
 
         @Override
-        public long snapshotCeData(int userId, int rollbackId, String apexPackageName) {
+        public boolean snapshotCeData(int userId, int rollbackId, String apexPackageName) {
             String apexModuleName;
             synchronized (mLock) {
                 Preconditions.checkState(mPackageNameToApexModuleName != null,
@@ -835,13 +835,14 @@
             }
             if (apexModuleName == null) {
                 Slog.e(TAG, "Invalid apex package name: " + apexPackageName);
-                return -1;
+                return false;
             }
             try {
-                return waitForApexService().snapshotCeData(userId, rollbackId, apexModuleName);
+                waitForApexService().snapshotCeData(userId, rollbackId, apexModuleName);
+                return true;
             } catch (Exception e) {
                 Slog.e(TAG, e.getMessage(), e);
-                return -1;
+                return false;
             }
         }
 
@@ -1124,7 +1125,7 @@
         }
 
         @Override
-        public long snapshotCeData(int userId, int rollbackId, String apexPackageName) {
+        public boolean snapshotCeData(int userId, int rollbackId, String apexPackageName) {
             throw new UnsupportedOperationException();
         }
 
diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java
index 069a00f..f221802 100644
--- a/services/core/java/com/android/server/pm/AppsFilter.java
+++ b/services/core/java/com/android/server/pm/AppsFilter.java
@@ -290,7 +290,8 @@
 
         private void updateEnabledState(@NonNull AndroidPackage pkg) {
             // TODO(b/135203078): Do not use toAppInfo
-            final boolean enabled = mInjector.getCompatibility().isChangeEnabledInternal(
+            // TODO(b/167551701): Make changeId non-logging
+            final boolean enabled = mInjector.getCompatibility().isChangeEnabledInternalNoLogging(
                     PackageManager.FILTER_APPLICATION_QUERY, pkg.toAppInfoWithoutState());
             if (enabled) {
                 mDisabledPackages.remove(pkg.getPackageName());
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
index 990055e..5c01e43 100644
--- a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
+++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
@@ -32,6 +32,8 @@
 import android.os.ResultReceiver;
 import android.os.ShellCallback;
 import android.os.SystemProperties;
+import android.util.ArrayMap;
+import android.util.ArraySet;
 import android.util.Slog;
 
 import com.android.internal.annotations.GuardedBy;
@@ -49,10 +51,6 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
 
 /**
  * The recovery system service is responsible for coordinating recovery related
@@ -84,9 +82,9 @@
     private final Context mContext;
 
     @GuardedBy("this")
-    private final Map<String, IntentSender> mCallerPendingRequest = new HashMap<>();
+    private final ArrayMap<String, IntentSender> mCallerPendingRequest = new ArrayMap<>();
     @GuardedBy("this")
-    private final Set<String> mCallerPreparedForReboot = new HashSet<>();
+    private final ArraySet<String> mCallerPreparedForReboot = new ArraySet<>();
 
     /**
      * Need to prepare for resume on reboot.
@@ -121,7 +119,7 @@
     @IntDef({ ROR_NEED_PREPARATION,
             ROR_SKIP_PREPARATION_AND_NOTIFY,
             ROR_SKIP_PREPARATION_NOT_NOTIFY })
-    @interface ResumeOnRebootActionsOnRequest {}
+    private @interface ResumeOnRebootActionsOnRequest {}
 
     /**
      * The action to perform upon resume on reboot clear request for a given client.
@@ -129,7 +127,7 @@
     @IntDef({ROR_NOT_REQUESTED,
             ROR_REQUESTED_NEED_CLEAR,
             ROR_REQUESTED_SKIP_CLEAR})
-    @interface ResumeOnRebootActionsOnClear{}
+    private @interface ResumeOnRebootActionsOnClear{}
 
     static class Injector {
         protected final Context mContext;
@@ -342,9 +340,8 @@
                 != PackageManager.PERMISSION_GRANTED
                 && mContext.checkCallingOrSelfPermission(android.Manifest.permission.REBOOT)
                         != PackageManager.PERMISSION_GRANTED) {
-            throw new SecurityException("Caller or self must have "
-                    + android.Manifest.permission.RECOVERY + " or "
-                    + android.Manifest.permission.REBOOT + " for resume on reboot.");
+            throw new SecurityException("Caller must have " + android.Manifest.permission.RECOVERY
+                    + " or " + android.Manifest.permission.REBOOT + " for resume on reboot.");
         }
     }
 
@@ -414,10 +411,14 @@
             Slog.w(TAG, "onPreparedForReboot called when some clients have prepared.");
         }
 
+        if (mCallerPendingRequest.isEmpty()) {
+            Slog.w(TAG, "onPreparedForReboot called but no client has requested.");
+        }
+
         // Send intents to notify callers
-        for (Map.Entry<String, IntentSender> entry : mCallerPendingRequest.entrySet()) {
-            sendPreparedForRebootIntentIfNeeded(entry.getValue());
-            mCallerPreparedForReboot.add(entry.getKey());
+        for (int i = 0; i < mCallerPendingRequest.size(); i++) {
+            sendPreparedForRebootIntentIfNeeded(mCallerPendingRequest.valueAt(i));
+            mCallerPreparedForReboot.add(mCallerPendingRequest.keyAt(i));
         }
         mCallerPendingRequest.clear();
     }
@@ -475,9 +476,7 @@
         return needClear ? ROR_REQUESTED_NEED_CLEAR : ROR_REQUESTED_SKIP_CLEAR;
     }
 
-    @Override // Binder call
-    public boolean rebootWithLskf(String packageName, String reason, boolean slotSwitch) {
-        enforcePermissionForResumeOnReboot();
+    private boolean rebootWithLskfImpl(String packageName, String reason, boolean slotSwitch) {
         if (packageName == null) {
             Slog.w(TAG, "Missing packageName when rebooting with lskf.");
             return false;
@@ -498,11 +497,29 @@
         return true;
     }
 
+    @Override // Binder call for the legacy rebootWithLskf
+    public boolean rebootWithLskfAssumeSlotSwitch(String packageName, String reason) {
+        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);
+        return rebootWithLskfImpl(packageName, reason, true);
+    }
+
     @Override // Binder call
-    public synchronized boolean isLskfCaptured(String packageName) {
+    public boolean rebootWithLskf(String packageName, String reason, boolean slotSwitch) {
         enforcePermissionForResumeOnReboot();
-        if (!mCallerPreparedForReboot.contains(packageName)) {
-            Slog.i(TAG, "Reboot requested before prepare completed for caller " + packageName);
+        return rebootWithLskfImpl(packageName, reason, slotSwitch);
+    }
+
+    @Override // Binder call
+    public boolean isLskfCaptured(String packageName) {
+        enforcePermissionForResumeOnReboot();
+        boolean captured;
+        synchronized (this) {
+            captured = mCallerPreparedForReboot.contains(packageName);
+        }
+
+        if (!captured) {
+            Slog.i(TAG, "Reboot requested before prepare completed for caller "
+                    + packageName);
             return false;
         }
         return true;
diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
index 524ae54..0213cc6 100644
--- a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
+++ b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
@@ -129,13 +129,8 @@
         if (packageRollbackInfo.isApex()) {
             // For APEX, only snapshot CE here
             if ((flags & Installer.FLAG_STORAGE_CE) != 0) {
-                long ceSnapshotInode = mApexManager.snapshotCeData(
+                return mApexManager.snapshotCeData(
                         userId, rollbackId, packageRollbackInfo.getPackageName());
-                if (ceSnapshotInode > 0) {
-                    packageRollbackInfo.putCeSnapshotInode(userId, ceSnapshotInode);
-                } else {
-                    return false;
-                }
             }
         } else {
             // APK
diff --git a/services/core/java/com/android/server/vcn/Android.bp b/services/core/java/com/android/server/vcn/Android.bp
new file mode 100644
index 0000000..5ed204f
--- /dev/null
+++ b/services/core/java/com/android/server/vcn/Android.bp
@@ -0,0 +1,4 @@
+filegroup {
+    name: "framework-vcn-util-sources",
+    srcs: ["util/**/*.java"],
+}
\ No newline at end of file
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index da9d321..4f95696 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -43,7 +43,6 @@
         "com_android_server_stats_pull_StatsPullAtomService.cpp",
         "com_android_server_storage_AppFuseBridge.cpp",
         "com_android_server_SystemServer.cpp",
-        "com_android_server_TestNetworkService.cpp",
         "com_android_server_tv_TvUinputBridge.cpp",
         "com_android_server_tv_TvInputHal.cpp",
         "com_android_server_vr_VrManagerService.cpp",
@@ -59,8 +58,6 @@
         "com_android_server_pm_PackageManagerShellCommandDataLoader.cpp",
         "onload.cpp",
         ":lib_networkStatsFactory_native",
-        // TODO: move the file below to the connectivity APEX
-        "com_android_server_connectivity_Vpn.cpp",
     ],
 
     include_dirs: [
@@ -171,6 +168,7 @@
 
     static_libs: [
         "android.hardware.broadcastradio@common-utils-1x-lib",
+        "libservice-connectivity-static",
     ],
 
     product_variables: {
diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
index faf3f06..43537d0 100644
--- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
+++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java
@@ -195,7 +195,6 @@
 import android.media.IAudioService;
 import android.net.ConnectivityManager;
 import android.net.IIpConnectivityMetrics;
-import android.net.NetworkUtils;
 import android.net.ProxyInfo;
 import android.net.Uri;
 import android.net.metrics.IpConnectivityLog;
@@ -267,6 +266,7 @@
 import com.android.internal.compat.IPlatformCompat;
 import com.android.internal.logging.MetricsLogger;
 import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
+import com.android.internal.net.NetworkUtilsInternal;
 import com.android.internal.notification.SystemNotificationChannels;
 import com.android.internal.os.BackgroundThread;
 import com.android.internal.statusbar.IStatusBarService;
@@ -285,6 +285,7 @@
 import com.android.internal.widget.LockSettingsInternal;
 import com.android.internal.widget.LockscreenCredential;
 import com.android.internal.widget.PasswordValidationError;
+import com.android.net.module.util.ProxyUtils;
 import com.android.server.LocalServices;
 import com.android.server.LockGuard;
 import com.android.server.PersistentDataBlockManagerInternal;
@@ -7759,7 +7760,8 @@
         }
         exclusionList = exclusionList.trim();
 
-        ProxyInfo proxyProperties = new ProxyInfo(data[0], proxyPort, exclusionList);
+        ProxyInfo proxyProperties = ProxyInfo.buildDirectProxy(data[0], proxyPort,
+                ProxyUtils.exclusionStringAsList(exclusionList));
         if (!proxyProperties.isValid()) {
             Slog.e(LOG_TAG, "Invalid proxy properties, ignoring: " + proxyProperties.toString());
             return;
@@ -15540,7 +15542,7 @@
                 return PRIVATE_DNS_SET_NO_ERROR;
             case PRIVATE_DNS_MODE_PROVIDER_HOSTNAME:
                 if (TextUtils.isEmpty(privateDnsHost)
-                        || !NetworkUtils.isWeaklyValidatedHostname(privateDnsHost)) {
+                        || !NetworkUtilsInternal.isWeaklyValidatedHostname(privateDnsHost)) {
                     throw new IllegalArgumentException(
                             String.format("Provided hostname %s is not valid", privateDnsHost));
                 }
diff --git a/services/net/Android.bp b/services/net/Android.bp
index ae9bd41..eaf177e 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -57,6 +57,8 @@
     visibility: [
         "//frameworks/opt/net/wifi/service",
         "//frameworks/opt/net/wifi/tests/wifitests",
+        "//packages/modules/Wifi/service",
+        "//packages/modules/Wifi/service/tests/wifitests",
     ],
 }
 
diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/OWNERS b/services/tests/mockingservicestests/src/com/android/server/pm/OWNERS
new file mode 100644
index 0000000..d825dfd
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/pm/OWNERS
@@ -0,0 +1 @@
+include /services/core/java/com/android/server/pm/OWNERS
diff --git a/services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowlisted-restrict-background-off.xml b/services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowed-restrict-background-off.xml
similarity index 100%
rename from services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowlisted-restrict-background-off.xml
rename to services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowed-restrict-background-off.xml
diff --git a/services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowlisted-restrict-background-on.xml b/services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowed-restrict-background-on.xml
similarity index 100%
rename from services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowlisted-restrict-background-on.xml
rename to services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowed-restrict-background-on.xml
diff --git a/services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denylisted-restrict-background-off.xml b/services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denied-restrict-background-off.xml
similarity index 100%
rename from services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denylisted-restrict-background-off.xml
rename to services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denied-restrict-background-off.xml
diff --git a/services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denylisted-restrict-background-on.xml b/services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denied-restrict-background-on.xml
similarity index 100%
rename from services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denylisted-restrict-background-on.xml
rename to services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denied-restrict-background-on.xml
diff --git a/services/tests/servicestests/src/com/android/server/audio/NoOpAudioSystemAdapter.java b/services/tests/servicestests/src/com/android/server/audio/NoOpAudioSystemAdapter.java
index a9cef20..8d706cb 100644
--- a/services/tests/servicestests/src/com/android/server/audio/NoOpAudioSystemAdapter.java
+++ b/services/tests/servicestests/src/com/android/server/audio/NoOpAudioSystemAdapter.java
@@ -21,6 +21,8 @@
 import android.media.AudioSystem;
 import android.util.Log;
 
+import java.util.List;
+
 /**
  * Provides an adapter for AudioSystem that does nothing.
  * Overridden methods can be configured.
@@ -66,13 +68,30 @@
     }
 
     @Override
-    public int setPreferredDeviceForStrategy(int strategy,
-            @NonNull AudioDeviceAttributes device) {
+    public int setDevicesRoleForStrategy(int strategy, int role,
+            @NonNull List<AudioDeviceAttributes> devices) {
         return AudioSystem.AUDIO_STATUS_OK;
     }
 
     @Override
-    public int removePreferredDeviceForStrategy(int strategy) {
+    public int removeDevicesRoleForStrategy(int strategy, int role) {
+        return AudioSystem.AUDIO_STATUS_OK;
+    }
+
+    @Override
+    public int setDevicesRoleForCapturePreset(int capturePreset, int role,
+                                              @NonNull List<AudioDeviceAttributes> devices) {
+        return AudioSystem.AUDIO_STATUS_OK;
+    }
+
+    @Override
+    public int removeDevicesRoleForCapturePreset(
+            int capturePreset, int role, @NonNull List<AudioDeviceAttributes> devicesToRemove) {
+        return AudioSystem.AUDIO_STATUS_OK;
+    }
+
+    @Override
+    public int clearDevicesRoleForCapturePreset(int capturePreset, int role) {
         return AudioSystem.AUDIO_STATUS_OK;
     }
 
diff --git a/services/tests/servicestests/src/com/android/server/audio/OWNERS b/services/tests/servicestests/src/com/android/server/audio/OWNERS
new file mode 100644
index 0000000..894a1f5
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/audio/OWNERS
@@ -0,0 +1 @@
+include /services/core/java/com/android/server/audio/OWNERS
diff --git a/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java b/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java
index e588370..8c63bfc 100644
--- a/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java
+++ b/services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java
@@ -190,6 +190,22 @@
     }
 
     @Test
+    public void testIsChangeEnabledForInvalidApp() throws Exception {
+        final long disabledChangeId = 1234L;
+        final long enabledChangeId = 1235L;
+        final long targetSdkChangeId = 1236L;
+        CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext)
+                .addEnabledChangeWithId(enabledChangeId)
+                .addDisabledChangeWithId(disabledChangeId)
+                .addEnableSinceSdkChangeWithId(42, targetSdkChangeId)
+                .build();
+
+        assertThat(compatConfig.isChangeEnabled(enabledChangeId, null)).isTrue();
+        assertThat(compatConfig.isChangeEnabled(disabledChangeId, null)).isFalse();
+        assertThat(compatConfig.isChangeEnabled(targetSdkChangeId, null)).isTrue();
+    }
+
+    @Test
     public void testPreventAddOverride() throws Exception {
         final long changeId = 1234L;
         CompatConfig compatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext)
diff --git a/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java b/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java
index 64014ba..1d3b643 100644
--- a/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java
+++ b/services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java
@@ -107,18 +107,20 @@
         mCompatConfig = CompatConfigBuilder.create(mBuildClassifier, mContext)
                 .addEnabledChangeWithId(1L)
                 .addDisabledChangeWithIdAndName(2L, "change2")
-                .addEnableAfterSdkChangeWithIdAndDescription(Build.VERSION_CODES.O, 3L, "desc")
-                .addEnableAfterSdkChangeWithId(Build.VERSION_CODES.P, 4L)
-                .addEnableAfterSdkChangeWithId(Build.VERSION_CODES.Q, 5L)
-                .addEnableAfterSdkChangeWithId(Build.VERSION_CODES.R, 6L)
+                .addEnableSinceSdkChangeWithIdAndDescription(Build.VERSION_CODES.O, 3L, "desc")
+                .addEnableSinceSdkChangeWithId(Build.VERSION_CODES.P, 4L)
+                .addEnableSinceSdkChangeWithId(Build.VERSION_CODES.Q, 5L)
+                .addEnableSinceSdkChangeWithId(Build.VERSION_CODES.R, 6L)
                 .addLoggingOnlyChangeWithId(7L)
                 .build();
         mPlatformCompat = new PlatformCompat(mContext, mCompatConfig);
         assertThat(mPlatformCompat.listUIChanges()).asList().containsExactly(
                 new CompatibilityChangeInfo(1L, "", -1, -1, false, false, ""),
                 new CompatibilityChangeInfo(2L, "change2", -1, -1, true, false, ""),
-                new CompatibilityChangeInfo(4L, "", Build.VERSION_CODES.P, -1, false, false, ""),
-                new CompatibilityChangeInfo(5L, "", Build.VERSION_CODES.Q, -1, false, false, ""));
+                new CompatibilityChangeInfo(5L, "", /*enableAfter*/ -1,
+                        /*enableSince*/ Build.VERSION_CODES.Q, false, false, ""),
+                new CompatibilityChangeInfo(6L, "", /*enableAfter*/ -1,
+                        /*enableSince*/ Build.VERSION_CODES.R, false, false, ""));
     }
 
     @Test
diff --git a/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java b/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java
index 9d300a6..401d6e3 100644
--- a/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java
@@ -39,6 +39,7 @@
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Arrays;
 
 /**
  * Unit tests for {@link IpConfigStore}
@@ -82,7 +83,8 @@
         staticIpConfiguration.dnsServers.add(InetAddresses.parseNumericAddress(DNS_IP_ADDR_1));
         staticIpConfiguration.dnsServers.add(InetAddresses.parseNumericAddress(DNS_IP_ADDR_2));
 
-        ProxyInfo proxyInfo = new ProxyInfo("10.10.10.10", 88, "host1,host2");
+        ProxyInfo proxyInfo =
+                ProxyInfo.buildDirectProxy("10.10.10.10", 88, Arrays.asList("host1", "host2"));
 
         IpConfiguration expectedConfig1 = new IpConfiguration(IpAssignment.STATIC,
                 ProxySettings.STATIC, staticIpConfiguration, proxyInfo);
diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
index f8043fa..fec0273 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java
@@ -479,7 +479,7 @@
     }
 
     /**
-     * Adds allowlist when restrict background is on - app should receive an intent.
+     * Adds an app to allowlist when restrict background is on - app should receive an intent.
      */
     @Test
     @NetPolicyXml("restrict-background-on.xml")
@@ -490,7 +490,7 @@
     }
 
     /**
-     * Adds allowlist when restrict background is off - app should not receive an intent.
+     * Adds an app to allowlist when restrict background is off - app should not receive an intent.
      */
     @Test
     public void testAddRestrictBackgroundAllowlist_restrictBackgroundOff() throws Exception {
@@ -499,7 +499,7 @@
     }
 
     private void addRestrictBackgroundAllowlist(boolean expectIntent) throws Exception {
-        assertAllowlistUids();
+        assertRestrictBackgroundAllowedUids();
         assertUidPolicy(UID_A, POLICY_NONE);
 
         final FutureIntent futureIntent = newRestrictBackgroundChangedFuture();
@@ -507,7 +507,7 @@
 
         mService.setUidPolicy(UID_A, POLICY_ALLOW_METERED_BACKGROUND);
 
-        assertAllowlistUids(UID_A);
+        assertRestrictBackgroundAllowedUids(UID_A);
         assertUidPolicy(UID_A, POLICY_ALLOW_METERED_BACKGROUND);
         mPolicyListener.waitAndVerify()
                 .onUidPoliciesChanged(APP_ID_A, POLICY_ALLOW_METERED_BACKGROUND);
@@ -519,10 +519,10 @@
     }
 
     /**
-     * Removes allowlist when restrict background is on - app should receive an intent.
+     * Removes an app from allowlist when restrict background is on - app should receive an intent.
      */
     @Test
-    @NetPolicyXml("uidA-allowlisted-restrict-background-on.xml")
+    @NetPolicyXml("uidA-allowed-restrict-background-on.xml")
     public void testRemoveRestrictBackgroundAllowlist_restrictBackgroundOn() throws Exception {
         assertRestrictBackgroundOn();
         assertRestrictBackgroundChangedReceived(mFutureIntent, null);
@@ -530,10 +530,11 @@
     }
 
     /**
-     * Removes allowlist when restrict background is off - app should not receive an intent.
+     * Removes an app from allowlist when restrict background is off - app should not
+     * receive an intent.
      */
     @Test
-    @NetPolicyXml("uidA-allowlisted-restrict-background-off.xml")
+    @NetPolicyXml("uidA-allowed-restrict-background-off.xml")
     public void testRemoveRestrictBackgroundAllowlist_restrictBackgroundOff() throws Exception {
         assertRestrictBackgroundOff();
         removeRestrictBackgroundAllowlist(false);
@@ -688,7 +689,7 @@
     }
 
     private void removeRestrictBackgroundAllowlist(boolean expectIntent) throws Exception {
-        assertAllowlistUids(UID_A);
+        assertRestrictBackgroundAllowedUids(UID_A);
         assertUidPolicy(UID_A, POLICY_ALLOW_METERED_BACKGROUND);
 
         final FutureIntent futureIntent = newRestrictBackgroundChangedFuture();
@@ -696,7 +697,7 @@
 
         mService.setUidPolicy(UID_A, POLICY_NONE);
 
-        assertAllowlistUids();
+        assertRestrictBackgroundAllowedUids();
         assertUidPolicy(UID_A, POLICY_NONE);
         mPolicyListener.waitAndVerify().onUidPoliciesChanged(APP_ID_A, POLICY_NONE);
         if (expectIntent) {
@@ -707,7 +708,7 @@
     }
 
     /**
-     * Adds denylist when restrict background is on - app should not receive an intent.
+     * Adds an app to denylist when restrict background is on - app should not receive an intent.
      */
     @Test
     @NetPolicyXml("restrict-background-on.xml")
@@ -718,7 +719,7 @@
     }
 
     /**
-     * Adds denylist when restrict background is off - app should receive an intent.
+     * Adds an app to denylist when restrict background is off - app should receive an intent.
      */
     @Test
     public void testAddRestrictBackgroundDenylist_restrictBackgroundOff() throws Exception {
@@ -744,10 +745,11 @@
     }
 
     /**
-     * Removes denylist when restrict background is on - app should not receive an intent.
+     * Removes an app from denylist when restrict background is on - app should not
+     * receive an intent.
      */
     @Test
-    @NetPolicyXml("uidA-denylisted-restrict-background-on.xml")
+    @NetPolicyXml("uidA-denied-restrict-background-on.xml")
     public void testRemoveRestrictBackgroundDenylist_restrictBackgroundOn() throws Exception {
         assertRestrictBackgroundOn();
         assertRestrictBackgroundChangedReceived(mFutureIntent, null);
@@ -755,10 +757,11 @@
     }
 
     /**
-     * Removes denylist when restrict background is off - app should receive an intent.
+     * Removes an app from denylist when restrict background is off - app should
+     * receive an intent.
      */
     @Test
-    @NetPolicyXml("uidA-denylisted-restrict-background-off.xml")
+    @NetPolicyXml("uidA-denied-restrict-background-off.xml")
     public void testRemoveRestrictBackgroundDenylist_restrictBackgroundOff() throws Exception {
         assertRestrictBackgroundOff();
         removeRestrictBackgroundDenylist(true);
@@ -782,8 +785,8 @@
     }
 
     @Test
-    @NetPolicyXml("uidA-denylisted-restrict-background-on.xml")
-    public void testDenylistedAppIsNotNotifiedWhenRestrictBackgroundIsOn() throws Exception {
+    @NetPolicyXml("uidA-denied-restrict-background-on.xml")
+    public void testDeniedAppIsNotNotifiedWhenRestrictBackgroundIsOn() throws Exception {
         assertRestrictBackgroundOn();
         assertRestrictBackgroundChangedReceived(mFutureIntent, null);
         assertUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND);
@@ -794,11 +797,11 @@
     }
 
     @Test
-    @NetPolicyXml("uidA-allowlisted-restrict-background-on.xml")
-    public void testAllowlistedAppIsNotNotifiedWhenRestrictBackgroundIsOn() throws Exception {
+    @NetPolicyXml("uidA-allowed-restrict-background-on.xml")
+    public void testAllowedAppIsNotNotifiedWhenRestrictBackgroundIsOn() throws Exception {
         assertRestrictBackgroundOn();
         assertRestrictBackgroundChangedReceived(mFutureIntent, null);
-        assertAllowlistUids(UID_A);
+        assertRestrictBackgroundAllowedUids(UID_A);
 
         final FutureIntent futureIntent = newRestrictBackgroundChangedFuture();
         setRestrictBackground(true);
@@ -806,11 +809,11 @@
     }
 
     @Test
-    @NetPolicyXml("uidA-allowlisted-restrict-background-on.xml")
-    public void testAllowlistedAppIsNotifiedWhenDenylisted() throws Exception {
+    @NetPolicyXml("uidA-allowed-restrict-background-on.xml")
+    public void testAllowedAppIsNotifiedWhenDenylisted() throws Exception {
         assertRestrictBackgroundOn();
         assertRestrictBackgroundChangedReceived(mFutureIntent, null);
-        assertAllowlistUids(UID_A);
+        assertRestrictBackgroundAllowedUids(UID_A);
 
         final FutureIntent futureIntent = newRestrictBackgroundChangedFuture();
         mService.setUidPolicy(UID_A, POLICY_REJECT_METERED_BACKGROUND);
@@ -830,33 +833,33 @@
     }
 
     private void restrictBackgroundListsTest() throws Exception {
-        // UIds that are allowlisted.
-        assertAllowlistUids(UID_A, UID_B, UID_C);
+        // UIds that are in allowlist.
+        assertRestrictBackgroundAllowedUids(UID_A, UID_B, UID_C);
         assertUidPolicy(UID_A, POLICY_ALLOW_METERED_BACKGROUND);
         assertUidPolicy(UID_B, POLICY_ALLOW_METERED_BACKGROUND);
         assertUidPolicy(UID_C, POLICY_ALLOW_METERED_BACKGROUND);
 
-        // UIDs that are denylisted.
+        // UIDs that are in denylist.
         assertUidPolicy(UID_D, POLICY_NONE);
         assertUidPolicy(UID_E, POLICY_REJECT_METERED_BACKGROUND);
 
         // UIDS that have legacy policies.
         assertUidPolicy(UID_F, 2); // POLICY_ALLOW_BACKGROUND_BATTERY_SAVE
 
-        // Remove allowlist.
+        // Remove an uid from allowlist.
         mService.setUidPolicy(UID_A, POLICY_NONE);
         assertUidPolicy(UID_A, POLICY_NONE);
-        assertAllowlistUids(UID_B, UID_C);
+        assertRestrictBackgroundAllowedUids(UID_B, UID_C);
 
-        // Add allowlist when denylisted.
+        // Add an app to allowlist which is currently in denylist.
         mService.setUidPolicy(UID_E, POLICY_ALLOW_METERED_BACKGROUND);
         assertUidPolicy(UID_E, POLICY_ALLOW_METERED_BACKGROUND);
-        assertAllowlistUids(UID_B, UID_C, UID_E);
+        assertRestrictBackgroundAllowedUids(UID_B, UID_C, UID_E);
 
-        // Add denylist when allowlisted.
+        // Add an app to denylist when is currently in allowlist.
         mService.setUidPolicy(UID_B, POLICY_REJECT_METERED_BACKGROUND);
         assertUidPolicy(UID_B, POLICY_REJECT_METERED_BACKGROUND);
-        assertAllowlistUids(UID_C, UID_E);
+        assertRestrictBackgroundAllowedUids(UID_C, UID_E);
     }
 
     /**
@@ -865,7 +868,7 @@
     @Test
     @NetPolicyXml("restrict-background-lists-mixed-format.xml")
     public void testRestrictBackgroundLists_mixedFormat() throws Exception {
-        assertAllowlistUids(UID_A, UID_C, UID_D);
+        assertRestrictBackgroundAllowedUids(UID_A, UID_C, UID_D);
         assertUidPolicy(UID_A, POLICY_ALLOW_METERED_BACKGROUND);
         assertUidPolicy(UID_B, POLICY_REJECT_METERED_BACKGROUND); // Denylist prevails.
         assertUidPolicy(UID_C, (POLICY_ALLOW_METERED_BACKGROUND | 2));
@@ -2040,7 +2043,7 @@
         }
     }
 
-    private void assertAllowlistUids(int... uids) {
+    private void assertRestrictBackgroundAllowedUids(int... uids) {
         assertContainsInAnyOrder(mService.getUidsWithPolicy(POLICY_ALLOW_METERED_BACKGROUND), uids);
     }
 
diff --git a/telephony/java/android/telephony/AccessNetworkUtils.java b/telephony/java/android/telephony/AccessNetworkUtils.java
index 981ed450..7661a32 100644
--- a/telephony/java/android/telephony/AccessNetworkUtils.java
+++ b/telephony/java/android/telephony/AccessNetworkUtils.java
@@ -5,8 +5,11 @@
 import static android.telephony.ServiceState.DUPLEX_MODE_UNKNOWN;
 
 import android.telephony.AccessNetworkConstants.EutranBand;
+import android.telephony.AccessNetworkConstants.GeranBand;
+import android.telephony.AccessNetworkConstants.UtranBand;
 import android.telephony.ServiceState.DuplexMode;
 
+import java.util.Arrays;
 
 /**
  * Utilities to map between radio constants.
@@ -20,6 +23,9 @@
 
     public static final int INVALID_BAND = -1;
 
+    /** ISO country code of Japan. */
+    private static final String JAPAN_ISO_COUNTRY_CODE = "jp";
+
     /**
      * Gets the duplex mode for the given EUTRAN operating band.
      *
@@ -50,7 +56,7 @@
     /**
      * Gets the EUTRAN Operating band for a given downlink EARFCN.
      *
-     * <p>See 3GPP 36.101 sec 5.7.3-1 for calculation.
+     * <p>See 3GPP TS 36.101 clause 5.7.3-1 for calculation.
      *
      * @param earfcn The downlink EARFCN
      * @return Operating band number, or {@link #INVALID_BAND} if no corresponding band exists
@@ -198,4 +204,125 @@
 
         return INVALID_BAND;
     }
+
+    /**
+     * Gets the GERAN Operating band for a given ARFCN.
+     *
+     * <p>See 3GPP TS 45.005 clause 2 for calculation.
+     *
+     * @param arfcn The ARFCN
+     * @return Operating band number, or {@link #INVALID_BAND} if no corresponding band exists
+     */
+    public static int getOperatingBandForArfcn(int arfcn) {
+        if (arfcn >= 0 && arfcn <= 124) {
+            return GeranBand.BAND_E900;
+        } else if (arfcn >= 128 && arfcn <= 251) {
+            return GeranBand.BAND_850;
+        } else if (arfcn >= 259 && arfcn <= 293) {
+            return GeranBand.BAND_450;
+        } else if (arfcn >= 306 && arfcn <= 340) {
+            return GeranBand.BAND_480;
+        } else if (arfcn >= 438 && arfcn <= 511) {
+            return GeranBand.BAND_750;
+        } else if (arfcn >= 512 && arfcn <= 885) {
+            // ARFCN between 512 and 810 are also part of BAND_PCS1900.
+            // Returning BAND_DCS1800 in both cases.
+            return GeranBand.BAND_DCS1800;
+        } else if (arfcn >= 940 && arfcn <= 974) {
+            return GeranBand.BAND_ER900;
+        } else if (arfcn >= 975 && arfcn <= 1023) {
+            return GeranBand.BAND_E900;
+        }
+        return INVALID_BAND;
+    }
+
+    /**
+     * Gets the UTRAN Operating band for a given downlink UARFCN.
+     *
+     * <p>See 3GPP TS 25.101 clause 5.4.4 for calculation.
+     *
+     * @param uarfcn The downlink UARFCN
+     * @return Operating band number, or {@link #INVALID_BAND} if no corresponding band exists
+     */
+    public static int getOperatingBandForUarfcn(int uarfcn) {
+        // List of additional bands defined in TS 25.101.
+        int[] addlBand2 = {412, 437, 462, 487, 512, 537, 562, 587, 612, 637, 662, 687};
+        int[] addlBand4 = {1887, 1912, 1937, 1962, 1987, 2012, 2037, 2062, 2087};
+        int[] addlBand5 = {1007, 1012, 1032, 1037, 1062, 1087};
+        int[] addlBand6 = {1037, 1062};
+        int[] addlBand7 =
+                {2587, 2612, 2637, 2662, 2687, 2712, 2737, 2762, 2787, 2812, 2837, 2862,
+                2887, 2912};
+        int[] addlBand10 =
+                {3412, 3437, 3462, 3487, 3512, 3537, 3562, 3587, 3612, 3637, 3662, 3687};
+        int[] addlBand12 = {3932, 3957, 3962, 3987, 3992};
+        int[] addlBand13 = {4067, 4092};
+        int[] addlBand14 = {4167, 4192};
+        int[] addlBand19 = {787, 812, 837};
+        int[] addlBand25 =
+                {6292, 6317, 6342, 6367, 6392, 6417, 6442, 6467, 6492, 6517, 6542, 6567, 6592};
+        int[] addlBand26 = {5937, 5962, 5987, 5992, 6012, 6017, 6037, 6042, 6062, 6067, 6087};
+
+        if (uarfcn >= 10562 && uarfcn <= 10838) {
+            return UtranBand.BAND_1;
+        } else if ((uarfcn >= 9662 && uarfcn <= 9938)
+                || Arrays.binarySearch(addlBand2, uarfcn) >= 0) {
+            return UtranBand.BAND_2;
+        } else if (uarfcn >= 1162 && uarfcn <= 1513) {
+            return UtranBand.BAND_3;
+        } else if ((uarfcn >= 1537 && uarfcn <= 1738)
+                || Arrays.binarySearch(addlBand4, uarfcn) >= 0) {
+            return UtranBand.BAND_4;
+        } else if (uarfcn >= 4387 && uarfcn <= 4413) {
+            // Band 6 is a subset of band 5. Only Japan uses band 6 and Japan does not have band 5.
+            String country = TelephonyManager.getDefault().getNetworkCountryIso();
+            if (JAPAN_ISO_COUNTRY_CODE.compareToIgnoreCase(country) == 0) {
+                return UtranBand.BAND_6;
+            } else {
+                return UtranBand.BAND_5;
+            }
+        } else if ((uarfcn >= 4357 && uarfcn <= 4458)
+                || Arrays.binarySearch(addlBand5, uarfcn) >= 0) {
+            return UtranBand.BAND_5;
+        } else if (Arrays.binarySearch(addlBand6, uarfcn) >= 0) {
+            return UtranBand.BAND_6;
+        } else if ((uarfcn >= 2237 && uarfcn <= 2563)
+                || Arrays.binarySearch(addlBand7, uarfcn) >= 0) {
+            return UtranBand.BAND_7;
+        } else if (uarfcn >= 2937 && uarfcn <= 3088) {
+            return UtranBand.BAND_8;
+        } else if (uarfcn >= 9237 && uarfcn <= 9387) {
+            return UtranBand.BAND_9;
+        } else if ((uarfcn >= 3112 && uarfcn <= 3388)
+                || Arrays.binarySearch(addlBand10, uarfcn) >= 0) {
+            return UtranBand.BAND_10;
+        } else if (uarfcn >= 3712 && uarfcn <= 3787) {
+            return UtranBand.BAND_11;
+        } else if ((uarfcn >= 3842 && uarfcn <= 3903)
+                || Arrays.binarySearch(addlBand12, uarfcn) >= 0) {
+            return UtranBand.BAND_12;
+        } else if ((uarfcn >= 4017 && uarfcn <= 4043)
+                || Arrays.binarySearch(addlBand13, uarfcn) >= 0) {
+            return UtranBand.BAND_13;
+        } else if ((uarfcn >= 4117 && uarfcn <= 4143)
+                || Arrays.binarySearch(addlBand14, uarfcn) >= 0) {
+            return UtranBand.BAND_14;
+        } else if ((uarfcn >= 712 && uarfcn <= 763)
+                || Arrays.binarySearch(addlBand19, uarfcn) >= 0) {
+            return UtranBand.BAND_19;
+        } else if (uarfcn >= 4512 && uarfcn <= 4638) {
+            return UtranBand.BAND_20;
+        } else if (uarfcn >= 862 && uarfcn <= 912) {
+            return UtranBand.BAND_21;
+        } else if (uarfcn >= 4662 && uarfcn <= 5038) {
+            return UtranBand.BAND_22;
+        } else if ((uarfcn >= 5112 && uarfcn <= 5413)
+                || Arrays.binarySearch(addlBand25, uarfcn) >= 0) {
+            return UtranBand.BAND_25;
+        } else if ((uarfcn >= 5762 && uarfcn <= 5913)
+                || Arrays.binarySearch(addlBand26, uarfcn) >= 0) {
+            return UtranBand.BAND_26;
+        }
+        return INVALID_BAND;
+    }
 }
diff --git a/telephony/java/android/telephony/CarrierConfigManager.java b/telephony/java/android/telephony/CarrierConfigManager.java
index 11bb867..4e9e6a8 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -2046,7 +2046,13 @@
      * via {@link android.telecom.PhoneAccount#CAPABILITY_VIDEO_CALLING_RELIES_ON_PRESENCE}
      * and can choose to hide or show the video calling icon based on whether a contact supports
      * video.
+     *
+     * @deprecated No longer used in framework code, however it may still be used by applications
+     * that have not updated their code. This config should still be set to {@code true} if
+     * {@link Ims#KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL} is set to {@code true} and
+     * {@link Ims#KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL} is set to {@code true}.
      */
+    @Deprecated
     public static final String KEY_USE_RCS_PRESENCE_BOOL = "use_rcs_presence_bool";
 
     /**
@@ -3862,13 +3868,51 @@
          * <p>
          * If this key's value is set to false, the procedure for RCS contact capability exchange
          * via SIP SUBSCRIBE/NOTIFY will also be disabled internally, and
-         * {@link #KEY_USE_RCS_PRESENCE_BOOL} must also be set to false to ensure apps do not
-         * improperly think that capability exchange via SIP PUBLISH is enabled.
+         * {@link Ims#KEY_ENABLE_PRESENCE_PUBLISH_BOOL} must also be set to false to ensure
+         * apps do not improperly think that capability exchange via SIP PUBLISH is enabled.
          * <p> The default value for this key is {@code false}.
          */
         public static final String KEY_ENABLE_PRESENCE_PUBLISH_BOOL =
                 KEY_PREFIX + "enable_presence_publish_bool";
 
+        /**
+         * Flag indicating whether or not this carrier supports the exchange of phone numbers with
+         * the carrier's RCS presence server in order to retrieve the RCS capabilities of requested
+         * contacts used in the RCS User Capability Exchange (UCE) procedure. See RCC.71, section 3
+         * for more information.
+         * <p>
+         * When presence is supported, the device uses the SIP SUBSCRIBE/NOTIFY procedure internally
+         * to retrieve the requested RCS capabilities. See
+         * {@link android.telephony.ims.RcsUceAdapter} for more information on how RCS capabilities
+         * can be retrieved from the carrier's network.
+         */
+        public static final String KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL =
+                KEY_PREFIX + "enable_presence_capability_exchange_bool";
+
+
+        /**
+         * Flag indicating whether or not the carrier expects the RCS UCE service to periodically
+         * refresh the RCS capabilities cache of the user's contacts as well as request the
+         * capabilities of call contacts when the SIM card is first inserted or when a new contact
+         * is added, removed, or modified. This corresponds to the RCC.07 A.19
+         * "DISABLE INITIAL ADDRESS BOOK SCAN" parameter.
+         * <p>
+         * If this flag is disabled, the capabilities cache will not be refreshed internally at all
+         * and will only be updated if the cached capabilities are stale when an application
+         * requests them.
+         */
+        public static final String KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL =
+                KEY_PREFIX + "rcs_bulk_capability_exchange_bool";
+
+        /**
+         * Flag indicating whether or not the carrier supports capability exchange with a list of
+         * contacts. When {@code true}, the device will batch together multiple requests and
+         * construct a RLMI document in the SIP SUBSCRIBE request (see RFC 4662). If {@code false},
+         * the request will be split up into one SIP SUBSCRIBE request per contact.
+         */
+        public static final String KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL =
+                KEY_PREFIX + "enable_presence_group_subscribe_bool";
+
         private Ims() {}
 
         private static PersistableBundle getDefaults() {
@@ -3876,6 +3920,9 @@
             defaults.putInt(KEY_WIFI_OFF_DEFERRING_TIME_MILLIS_INT, 4000);
             defaults.putBoolean(KEY_IMS_SINGLE_REGISTRATION_REQUIRED_BOOL, false);
             defaults.putBoolean(KEY_ENABLE_PRESENCE_PUBLISH_BOOL, false);
+            defaults.putBoolean(KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL, false);
+            defaults.putBoolean(KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL, false);
+            defaults.putBoolean(KEY_ENABLE_PRESENCE_GROUP_SUBSCRIBE_BOOL, true);
             return defaults;
         }
     }
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 81d78d6..7d3cef5 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -9367,10 +9367,9 @@
      * @return true if mobile data is enabled.
      */
     @RequiresPermission(anyOf = {android.Manifest.permission.ACCESS_NETWORK_STATE,
-            android.Manifest.permission.MODIFY_PHONE_STATE,
-            android.Manifest.permission.READ_PHONE_STATE})
+            android.Manifest.permission.MODIFY_PHONE_STATE})
     public boolean isDataEnabled() {
-        return isDataEnabledForReason(DATA_ENABLED_REASON_USER);
+        return getDataEnabled(getSubId(SubscriptionManager.getDefaultDataSubscriptionId()));
     }
 
     /**
@@ -9615,7 +9614,7 @@
     @SystemApi
     public boolean getDataEnabled(int subId) {
         try {
-            return isDataEnabledForReason(subId, DATA_ENABLED_REASON_USER);
+            return isDataEnabledForReason(DATA_ENABLED_REASON_USER);
         } catch (RuntimeException e) {
             Log.e(TAG, "Error calling isDataEnabledForReason e:" + e);
         }
@@ -12330,23 +12329,15 @@
     @NonNull
     public Map<Integer, List<EmergencyNumber>> getEmergencyNumberList(
             @EmergencyServiceCategories int categories) {
-        Map<Integer, List<EmergencyNumber>> emergencyNumberList = new HashMap<>();
+        Map<Integer, List<EmergencyNumber>> emergencyNumberListForCategories = new HashMap<>();
         try {
             ITelephony telephony = getITelephony();
             if (telephony != null) {
-                emergencyNumberList = telephony.getEmergencyNumberList(
-                        mContext.getOpPackageName(), mContext.getAttributionTag());
-                if (emergencyNumberList != null) {
-                    for (Integer subscriptionId : emergencyNumberList.keySet()) {
-                        List<EmergencyNumber> numberList = emergencyNumberList.get(subscriptionId);
-                        for (EmergencyNumber number : numberList) {
-                            if (!number.isInEmergencyServiceCategories(categories)) {
-                                numberList.remove(number);
-                            }
-                        }
-                    }
-                }
-                return emergencyNumberList;
+                Map<Integer, List<EmergencyNumber>> emergencyNumberList =
+                        telephony.getEmergencyNumberList(mContext.getOpPackageName(),
+                                mContext.getAttributionTag());
+                emergencyNumberListForCategories =
+                        filterEmergencyNumbersByCategories(emergencyNumberList, categories);
             } else {
                 throw new IllegalStateException("telephony service is null.");
             }
@@ -12354,7 +12345,34 @@
             Log.e(TAG, "getEmergencyNumberList with Categories RemoteException", ex);
             ex.rethrowAsRuntimeException();
         }
-        return emergencyNumberList;
+        return emergencyNumberListForCategories;
+    }
+
+    /**
+     * Filter emergency numbers with categories.
+     *
+     * @hide
+     */
+    @VisibleForTesting
+    public Map<Integer, List<EmergencyNumber>> filterEmergencyNumbersByCategories(
+            Map<Integer, List<EmergencyNumber>> emergencyNumberList,
+                    @EmergencyServiceCategories int categories) {
+        Map<Integer, List<EmergencyNumber>> emergencyNumberListForCategories = new HashMap<>();
+        if (emergencyNumberList != null) {
+            for (Integer subscriptionId : emergencyNumberList.keySet()) {
+                List<EmergencyNumber> allNumbersForSub = emergencyNumberList.get(
+                        subscriptionId);
+                List<EmergencyNumber> numbersForCategoriesPerSub = new ArrayList<>();
+                for (EmergencyNumber number : allNumbersForSub) {
+                    if (number.isInEmergencyServiceCategories(categories)) {
+                        numbersForCategoriesPerSub.add(number);
+                    }
+                }
+                emergencyNumberListForCategories.put(
+                        subscriptionId, numbersForCategoriesPerSub);
+            }
+        }
+        return emergencyNumberListForCategories;
     }
 
     /**
diff --git a/telephony/java/android/telephony/ims/ImsRcsManager.java b/telephony/java/android/telephony/ims/ImsRcsManager.java
index 0d8e5bc..bd623e0 100644
--- a/telephony/java/android/telephony/ims/ImsRcsManager.java
+++ b/telephony/java/android/telephony/ims/ImsRcsManager.java
@@ -30,7 +30,6 @@
 import android.provider.Settings;
 import android.telephony.AccessNetworkConstants;
 import android.telephony.BinderCacheManager;
-import android.telephony.CarrierConfigManager;
 import android.telephony.TelephonyFrameworkInitializer;
 import android.telephony.ims.aidl.IImsCapabilityCallback;
 import android.telephony.ims.aidl.IImsRcsController;
@@ -62,9 +61,10 @@
      * been enabled by the user can be queried using {@link RcsUceAdapter#isUceSettingEnabled()}.
      * <p>
      * This intent will always be handled by the system, however the application should only send
-     * this Intent if the carrier supports RCS contact discovery, which can be queried using the key
-     * {@link CarrierConfigManager#KEY_USE_RCS_PRESENCE_BOOL}. Otherwise, the RCS contact discovery
-     * opt-in dialog will not be shown.
+     * this Intent if the carrier supports bulk RCS contact exchange, which will be true if either
+     * key {@link android.telephony.CarrierConfigManager.Ims#KEY_RCS_BULK_CAPABILITY_EXCHANGE_BOOL}
+     * or {@link android.telephony.CarrierConfigManager#KEY_USE_RCS_PRESENCE_BOOL} is set to true.
+     * Otherwise, the RCS contact discovery opt-in dialog will not be shown.
      * <p>
      * Input: A mandatory {@link Settings#EXTRA_SUB_ID} extra containing the subscription that the
      * setting will be be shown for.
@@ -396,6 +396,7 @@
      * rather the subscription is capable of this service over IMS.
      * @see #isAvailable(int)
      * @see android.telephony.CarrierConfigManager#KEY_USE_RCS_PRESENCE_BOOL
+     * @see android.telephony.CarrierConfigManager.Ims#KEY_ENABLE_PRESENCE_CAPABILITY_EXCHANGE_BOOL
      * @throws ImsException if the IMS service is not available when calling this method.
      * See {@link ImsException#getCode()} for more information on the error codes.
      * @hide
diff --git a/tests/net/common/java/android/net/NetworkProviderTest.kt b/tests/net/common/java/android/net/NetworkProviderTest.kt
index 77e9f12..bcc9072 100644
--- a/tests/net/common/java/android/net/NetworkProviderTest.kt
+++ b/tests/net/common/java/android/net/NetworkProviderTest.kt
@@ -29,6 +29,7 @@
 import com.android.net.module.util.ArrayTrackRecord
 import com.android.testutils.DevSdkIgnoreRule.IgnoreUpTo
 import com.android.testutils.DevSdkIgnoreRunner
+import com.android.testutils.isDevSdkInRange
 import org.junit.After
 import org.junit.Before
 import org.junit.Test
@@ -173,10 +174,12 @@
     @Test
     fun testDeclareNetworkRequestUnfulfillable() {
         val mockContext = mock(Context::class.java)
-        val provider = createNetworkProvider(mockContext)
-        // ConnectivityManager not required at creation time
-        verifyNoMoreInteractions(mockContext)
         doReturn(mCm).`when`(mockContext).getSystemService(Context.CONNECTIVITY_SERVICE)
+        val provider = createNetworkProvider(mockContext)
+        // ConnectivityManager not required at creation time after R
+        if (!isDevSdkInRange(0, Build.VERSION_CODES.R)) {
+            verifyNoMoreInteractions(mockContext)
+        }
 
         mCm.registerNetworkProvider(provider)
 
diff --git a/tests/net/java/android/net/Ikev2VpnProfileTest.java b/tests/net/java/android/net/Ikev2VpnProfileTest.java
index ada5494..076e41d 100644
--- a/tests/net/java/android/net/Ikev2VpnProfileTest.java
+++ b/tests/net/java/android/net/Ikev2VpnProfileTest.java
@@ -29,6 +29,7 @@
 import androidx.test.runner.AndroidJUnit4;
 
 import com.android.internal.net.VpnProfile;
+import com.android.net.module.util.ProxyUtils;
 import com.android.org.bouncycastle.x509.X509V1CertificateGenerator;
 
 import org.junit.Before;
@@ -67,7 +68,8 @@
                     return "fooPackage";
                 }
             };
-    private final ProxyInfo mProxy = new ProxyInfo(SERVER_ADDR_STRING, -1, EXCL_LIST);
+    private final ProxyInfo mProxy = ProxyInfo.buildDirectProxy(
+            SERVER_ADDR_STRING, -1, ProxyUtils.exclusionStringAsList(EXCL_LIST));
 
     private X509Certificate mUserCert;
     private X509Certificate mServerRootCa;
diff --git a/tests/net/java/android/net/MacAddressTest.java b/tests/net/java/android/net/MacAddressTest.java
index 91c9a2a..6de31f6 100644
--- a/tests/net/java/android/net/MacAddressTest.java
+++ b/tests/net/java/android/net/MacAddressTest.java
@@ -22,11 +22,11 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-import android.net.util.MacAddressUtils;
-
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.net.module.util.MacAddressUtils;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
diff --git a/tests/net/java/android/net/NetworkUtilsTest.java b/tests/net/java/android/net/NetworkUtilsTest.java
index 3158cc8..7748288 100644
--- a/tests/net/java/android/net/NetworkUtilsTest.java
+++ b/tests/net/java/android/net/NetworkUtilsTest.java
@@ -16,24 +16,10 @@
 
 package android.net;
 
-import static android.system.OsConstants.AF_INET;
-import static android.system.OsConstants.AF_INET6;
-import static android.system.OsConstants.AF_UNIX;
-import static android.system.OsConstants.EPERM;
-import static android.system.OsConstants.SOCK_DGRAM;
-import static android.system.OsConstants.SOCK_STREAM;
-
 import static junit.framework.Assert.assertEquals;
 
-import static org.junit.Assert.fail;
-
-import android.system.ErrnoException;
-import android.system.Os;
-
 import androidx.test.runner.AndroidJUnit4;
 
-import libcore.io.IoUtils;
-
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -139,50 +125,4 @@
         assertEquals(BigInteger.valueOf(7l - 4 + 4 + 16 + 65536),
                 NetworkUtils.routedIPv6AddressCount(set));
     }
-
-    private static void expectSocketSuccess(String msg, int domain, int type) {
-        try {
-            IoUtils.closeQuietly(Os.socket(domain, type, 0));
-        } catch (ErrnoException e) {
-            fail(msg + e.getMessage());
-        }
-    }
-
-    private static void expectSocketPemissionError(String msg, int domain, int type) {
-        try {
-            IoUtils.closeQuietly(Os.socket(domain, type, 0));
-            fail(msg);
-        } catch (ErrnoException e) {
-            assertEquals(msg, e.errno, EPERM);
-        }
-    }
-
-    private static void expectHasNetworking() {
-        expectSocketSuccess("Creating a UNIX socket should not have thrown ErrnoException",
-                AF_UNIX, SOCK_STREAM);
-        expectSocketSuccess("Creating a AF_INET socket shouldn't have thrown ErrnoException",
-                AF_INET, SOCK_DGRAM);
-        expectSocketSuccess("Creating a AF_INET6 socket shouldn't have thrown ErrnoException",
-                AF_INET6, SOCK_DGRAM);
-    }
-
-    private static void expectNoNetworking() {
-        expectSocketSuccess("Creating a UNIX socket should not have thrown ErrnoException",
-                AF_UNIX, SOCK_STREAM);
-        expectSocketPemissionError(
-                "Creating a AF_INET socket should have thrown ErrnoException(EPERM)",
-                AF_INET, SOCK_DGRAM);
-        expectSocketPemissionError(
-                "Creating a AF_INET6 socket should have thrown ErrnoException(EPERM)",
-                AF_INET6, SOCK_DGRAM);
-    }
-
-    @Test
-    public void testSetAllowNetworkingForProcess() {
-        expectHasNetworking();
-        NetworkUtils.setAllowNetworkingForProcess(false);
-        expectNoNetworking();
-        NetworkUtils.setAllowNetworkingForProcess(true);
-        expectHasNetworking();
-    }
 }
diff --git a/tests/net/java/com/android/internal/net/NetworkUtilsInternalTest.java b/tests/net/java/com/android/internal/net/NetworkUtilsInternalTest.java
new file mode 100644
index 0000000..3cfecd5
--- /dev/null
+++ b/tests/net/java/com/android/internal/net/NetworkUtilsInternalTest.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.internal.net;
+
+import static android.system.OsConstants.AF_INET;
+import static android.system.OsConstants.AF_INET6;
+import static android.system.OsConstants.AF_UNIX;
+import static android.system.OsConstants.EPERM;
+import static android.system.OsConstants.SOCK_DGRAM;
+import static android.system.OsConstants.SOCK_STREAM;
+
+import static junit.framework.Assert.assertEquals;
+
+import static org.junit.Assert.fail;
+
+import android.system.ErrnoException;
+import android.system.Os;
+
+import androidx.test.runner.AndroidJUnit4;
+
+import libcore.io.IoUtils;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@androidx.test.filters.SmallTest
+public class NetworkUtilsInternalTest {
+
+    private static void expectSocketSuccess(String msg, int domain, int type) {
+        try {
+            IoUtils.closeQuietly(Os.socket(domain, type, 0));
+        } catch (ErrnoException e) {
+            fail(msg + e.getMessage());
+        }
+    }
+
+    private static void expectSocketPemissionError(String msg, int domain, int type) {
+        try {
+            IoUtils.closeQuietly(Os.socket(domain, type, 0));
+            fail(msg);
+        } catch (ErrnoException e) {
+            assertEquals(msg, e.errno, EPERM);
+        }
+    }
+
+    private static void expectHasNetworking() {
+        expectSocketSuccess("Creating a UNIX socket should not have thrown ErrnoException",
+                AF_UNIX, SOCK_STREAM);
+        expectSocketSuccess("Creating a AF_INET socket shouldn't have thrown ErrnoException",
+                AF_INET, SOCK_DGRAM);
+        expectSocketSuccess("Creating a AF_INET6 socket shouldn't have thrown ErrnoException",
+                AF_INET6, SOCK_DGRAM);
+    }
+
+    private static void expectNoNetworking() {
+        expectSocketSuccess("Creating a UNIX socket should not have thrown ErrnoException",
+                AF_UNIX, SOCK_STREAM);
+        expectSocketPemissionError(
+                "Creating a AF_INET socket should have thrown ErrnoException(EPERM)",
+                AF_INET, SOCK_DGRAM);
+        expectSocketPemissionError(
+                "Creating a AF_INET6 socket should have thrown ErrnoException(EPERM)",
+                AF_INET6, SOCK_DGRAM);
+    }
+
+    @Test
+    public void testSetAllowNetworkingForProcess() {
+        expectHasNetworking();
+        NetworkUtilsInternal.setAllowNetworkingForProcess(false);
+        expectNoNetworking();
+        NetworkUtilsInternal.setAllowNetworkingForProcess(true);
+        expectHasNetworking();
+    }
+}
diff --git a/tests/net/java/com/android/server/ConnectivityServiceTest.java b/tests/net/java/com/android/server/ConnectivityServiceTest.java
index a68044a..a613e5e 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -4742,11 +4742,9 @@
 
     @Test
     public void testNetworkCallbackMaximum() {
-        // We can only have 99 callbacks, because MultipathPolicyTracker is
-        // already one of them.
-        final int MAX_REQUESTS = 99;
+        final int MAX_REQUESTS = 100;
         final int CALLBACKS = 89;
-        final int INTENTS = 10;
+        final int INTENTS = 11;
         assertEquals(MAX_REQUESTS, CALLBACKS + INTENTS);
 
         NetworkRequest networkRequest = new NetworkRequest.Builder().build();
diff --git a/tests/net/java/com/android/server/NetworkManagementServiceTest.java b/tests/net/java/com/android/server/NetworkManagementServiceTest.java
index ea763d2..13516d7 100644
--- a/tests/net/java/com/android/server/NetworkManagementServiceTest.java
+++ b/tests/net/java/com/android/server/NetworkManagementServiceTest.java
@@ -68,11 +68,12 @@
 @SmallTest
 public class NetworkManagementServiceTest {
     private NetworkManagementService mNMService;
-
     @Mock private Context mContext;
     @Mock private IBatteryStats.Stub mBatteryStatsService;
     @Mock private INetd.Stub mNetdService;
 
+    private static final int TEST_UID = 111;
+
     @NonNull
     @Captor
     private ArgumentCaptor<INetdUnsolicitedEventListener> mUnsolListenerCaptor;
@@ -165,14 +166,14 @@
         /**
          * Interface class activity.
          */
-        unsolListener.onInterfaceClassActivityChanged(true, 1, 1234, 0);
-        expectSoon(observer).interfaceClassDataActivityChanged("1", true, 1234);
+        unsolListener.onInterfaceClassActivityChanged(true, 1, 1234, TEST_UID);
+        expectSoon(observer).interfaceClassDataActivityChanged(1, true, 1234, TEST_UID);
 
-        unsolListener.onInterfaceClassActivityChanged(false, 9, 5678, 0);
-        expectSoon(observer).interfaceClassDataActivityChanged("9", false, 5678);
+        unsolListener.onInterfaceClassActivityChanged(false, 9, 5678, TEST_UID);
+        expectSoon(observer).interfaceClassDataActivityChanged(9, false, 5678, TEST_UID);
 
-        unsolListener.onInterfaceClassActivityChanged(false, 9, 4321, 0);
-        expectSoon(observer).interfaceClassDataActivityChanged("9", false, 4321);
+        unsolListener.onInterfaceClassActivityChanged(false, 9, 4321, TEST_UID);
+        expectSoon(observer).interfaceClassDataActivityChanged(9, false, 4321, TEST_UID);
 
         /**
          * IP address changes.
@@ -222,8 +223,6 @@
         assertFalse(mNMService.isFirewallEnabled());
     }
 
-    private static final int TEST_UID = 111;
-
     @Test
     public void testNetworkRestrictedDefault() {
         assertFalse(mNMService.isNetworkRestricted(TEST_UID));
@@ -235,23 +234,23 @@
         doReturn(true).when(mNetdService).bandwidthEnableDataSaver(anyBoolean());
 
         // Restrict usage of mobile data in background
-        mNMService.setUidMeteredNetworkDenylist(TEST_UID, true);
+        mNMService.setUidOnMeteredNetworkDenylist(TEST_UID, true);
         assertTrue("Should be true since mobile data usage is restricted",
                 mNMService.isNetworkRestricted(TEST_UID));
 
         mNMService.setDataSaverModeEnabled(true);
         verify(mNetdService).bandwidthEnableDataSaver(true);
 
-        mNMService.setUidMeteredNetworkDenylist(TEST_UID, false);
+        mNMService.setUidOnMeteredNetworkDenylist(TEST_UID, false);
         assertTrue("Should be true since data saver is on and the uid is not allowlisted",
                 mNMService.isNetworkRestricted(TEST_UID));
 
-        mNMService.setUidMeteredNetworkAllowlist(TEST_UID, true);
+        mNMService.setUidOnMeteredNetworkAllowlist(TEST_UID, true);
         assertFalse("Should be false since data saver is on and the uid is allowlisted",
                 mNMService.isNetworkRestricted(TEST_UID));
 
         // remove uid from allowlist and turn datasaver off again
-        mNMService.setUidMeteredNetworkAllowlist(TEST_UID, false);
+        mNMService.setUidOnMeteredNetworkAllowlist(TEST_UID, false);
         mNMService.setDataSaverModeEnabled(false);
         verify(mNetdService).bandwidthEnableDataSaver(false);
         assertFalse("Network should not be restricted when data saver is off",
diff --git a/tests/net/java/com/android/server/net/NetworkStatsCollectionTest.java b/tests/net/java/com/android/server/net/NetworkStatsCollectionTest.java
index fb0cfc0..89146f9 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsCollectionTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsCollectionTest.java
@@ -23,11 +23,11 @@
 import static android.net.NetworkStats.UID_ALL;
 import static android.net.NetworkStatsHistory.FIELD_ALL;
 import static android.net.NetworkTemplate.buildTemplateMobileAll;
-import static android.net.NetworkUtils.multiplySafeByRational;
 import static android.os.Process.myUid;
 import static android.text.format.DateUtils.HOUR_IN_MILLIS;
 import static android.text.format.DateUtils.MINUTE_IN_MILLIS;
 
+import static com.android.internal.net.NetworkUtilsInternal.multiplySafeByRational;
 import static com.android.testutils.MiscAsserts.assertThrows;
 
 import static org.junit.Assert.assertArrayEquals;
diff --git a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
index cd9406c..c783629 100644
--- a/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
+++ b/tests/net/java/com/android/server/net/NetworkStatsServiceTest.java
@@ -23,6 +23,7 @@
 import static android.net.ConnectivityManager.TYPE_WIFI;
 import static android.net.ConnectivityManager.TYPE_WIMAX;
 import static android.net.NetworkStats.DEFAULT_NETWORK_ALL;
+import static android.net.NetworkStats.DEFAULT_NETWORK_NO;
 import static android.net.NetworkStats.DEFAULT_NETWORK_YES;
 import static android.net.NetworkStats.IFACE_ALL;
 import static android.net.NetworkStats.INTERFACES_ALL;
@@ -917,7 +918,8 @@
     public void testMetered() throws Exception {
         // pretend that network comes online
         expectDefaultSettings();
-        NetworkState[] states = new NetworkState[] {buildWifiState(true /* isMetered */)};
+        NetworkState[] states =
+                new NetworkState[] {buildWifiState(true /* isMetered */, TEST_IFACE)};
         expectNetworkStatsSummary(buildEmptyStats());
         expectNetworkStatsUidDetail(buildEmptyStats());
 
@@ -1146,7 +1148,8 @@
     public void testStatsProviderUpdateStats() throws Exception {
         // Pretend that network comes online.
         expectDefaultSettings();
-        final NetworkState[] states = new NetworkState[]{buildWifiState(true /* isMetered */)};
+        final NetworkState[] states =
+                new NetworkState[]{buildWifiState(true /* isMetered */, TEST_IFACE)};
         expectNetworkStatsSummary(buildEmptyStats());
         expectNetworkStatsUidDetail(buildEmptyStats());
 
@@ -1206,7 +1209,8 @@
     public void testStatsProviderSetAlert() throws Exception {
         // Pretend that network comes online.
         expectDefaultSettings();
-        NetworkState[] states = new NetworkState[]{buildWifiState(true /* isMetered */)};
+        NetworkState[] states =
+                new NetworkState[]{buildWifiState(true /* isMetered */, TEST_IFACE)};
         mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states), new VpnInfo[0]);
 
         // Register custom provider and retrieve callback.
@@ -1319,6 +1323,47 @@
         assertUidTotal(templateAll, UID_RED, 22L + 35L, 26L + 29L, 19L + 7L, 5L + 11L, 1);
     }
 
+    @Test
+    public void testOperationCount_nonDefault_traffic() throws Exception {
+        // Pretend mobile network comes online, but wifi is the default network.
+        expectDefaultSettings();
+        NetworkState[] states = new NetworkState[]{
+                buildWifiState(true /*isMetered*/, TEST_IFACE2), buildMobile3gState(IMSI_1)};
+        expectNetworkStatsUidDetail(buildEmptyStats());
+        mService.forceUpdateIfaces(NETWORKS_WIFI, states, getActiveIface(states), new VpnInfo[0]);
+
+        // Create some traffic on mobile network.
+        incrementCurrentTime(HOUR_IN_MILLIS);
+        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 4)
+                .insertEntry(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
+                        DEFAULT_NETWORK_NO, 2L, 1L, 3L, 4L, 0L)
+                .insertEntry(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, METERED_NO, ROAMING_NO,
+                        DEFAULT_NETWORK_YES, 1L, 3L, 2L, 1L, 0L)
+                .insertEntry(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, 5L, 4L, 1L, 4L, 0L));
+        // Increment operation count, which must have a specific tag.
+        mService.incrementOperationCount(UID_RED, 0xF00D, 2);
+        forcePollAndWaitForIdle();
+
+        // Verify mobile summary is not changed by the operation count.
+        final NetworkTemplate templateMobile =
+                buildTemplateMobileWithRatType(null, NETWORK_TYPE_ALL);
+        final NetworkStats statsMobile = mSession.getSummaryForAllUid(
+                templateMobile, Long.MIN_VALUE, Long.MAX_VALUE, true);
+        assertValues(statsMobile, IFACE_ALL, UID_RED, SET_ALL, TAG_NONE, METERED_ALL, ROAMING_ALL,
+                DEFAULT_NETWORK_ALL, 3L, 4L, 5L, 5L, 0);
+        assertValues(statsMobile, IFACE_ALL, UID_RED, SET_ALL, 0xF00D, METERED_ALL, ROAMING_ALL,
+                DEFAULT_NETWORK_ALL, 5L, 4L, 1L, 4L, 0);
+
+        // Verify the operation count is blamed onto the default network.
+        // TODO: Blame onto the default network is not very reasonable. Consider blame onto the
+        //  network that generates the traffic.
+        final NetworkTemplate templateWifi = buildTemplateWifiWildcard();
+        final NetworkStats statsWifi = mSession.getSummaryForAllUid(
+                templateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
+        assertValues(statsWifi, IFACE_ALL, UID_RED, SET_ALL, 0xF00D, METERED_ALL, ROAMING_ALL,
+                DEFAULT_NETWORK_ALL, 0L, 0L, 0L, 0L, 2);
+    }
+
     private static File getBaseDir(File statsDir) {
         File baseDir = new File(statsDir, "netstats");
         baseDir.mkdirs();
@@ -1446,14 +1491,14 @@
     }
 
     private static NetworkState buildWifiState() {
-        return buildWifiState(false);
+        return buildWifiState(false, TEST_IFACE);
     }
 
-    private static NetworkState buildWifiState(boolean isMetered) {
+    private static NetworkState buildWifiState(boolean isMetered, @NonNull String iface) {
         final NetworkInfo info = new NetworkInfo(TYPE_WIFI, 0, null, null);
         info.setDetailedState(DetailedState.CONNECTED, null, null);
         final LinkProperties prop = new LinkProperties();
-        prop.setInterfaceName(TEST_IFACE);
+        prop.setInterfaceName(iface);
         final NetworkCapabilities capabilities = new NetworkCapabilities();
         capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, !isMetered);
         capabilities.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, true);
diff --git a/tests/vcn/java/android/net/vcn/VcnConfigTest.java b/tests/vcn/java/android/net/vcn/VcnConfigTest.java
new file mode 100644
index 0000000..77944de
--- /dev/null
+++ b/tests/vcn/java/android/net/vcn/VcnConfigTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.vcn;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import android.os.Parcel;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.Collections;
+import java.util.Set;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class VcnConfigTest {
+    private static final Set<VcnGatewayConnectionConfig> GATEWAY_CONNECTION_CONFIGS =
+            Collections.singleton(VcnGatewayConnectionConfigTest.buildTestConfig());
+
+    // Public visibility for VcnManagementServiceTest
+    public static VcnConfig buildTestConfig() {
+        VcnConfig.Builder builder = new VcnConfig.Builder();
+
+        for (VcnGatewayConnectionConfig gatewayConnectionConfig : GATEWAY_CONNECTION_CONFIGS) {
+            builder.addGatewayConnectionConfig(gatewayConnectionConfig);
+        }
+
+        return builder.build();
+    }
+
+    @Test
+    public void testBuilderRequiresGatewayConnectionConfig() {
+        try {
+            new VcnConfig.Builder().build();
+            fail("Expected exception due to no VcnGatewayConnectionConfigs provided");
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    @Test
+    public void testBuilderAndGetters() {
+        final VcnConfig config = buildTestConfig();
+
+        assertEquals(GATEWAY_CONNECTION_CONFIGS, config.getGatewayConnectionConfigs());
+    }
+
+    @Test
+    public void testPersistableBundle() {
+        final VcnConfig config = buildTestConfig();
+
+        assertEquals(config, new VcnConfig(config.toPersistableBundle()));
+    }
+
+    @Test
+    public void testParceling() {
+        final VcnConfig config = buildTestConfig();
+
+        Parcel parcel = Parcel.obtain();
+        config.writeToParcel(parcel, 0);
+        parcel.setDataPosition(0);
+
+        assertEquals(config, VcnConfig.CREATOR.createFromParcel(parcel));
+    }
+}
diff --git a/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
new file mode 100644
index 0000000..e98b6ef
--- /dev/null
+++ b/tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java
@@ -0,0 +1,143 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.net.vcn;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+import android.net.NetworkCapabilities;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.TimeUnit;
+
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class VcnGatewayConnectionConfigTest {
+    private static final int[] EXPOSED_CAPS =
+            new int[] {
+                NetworkCapabilities.NET_CAPABILITY_INTERNET, NetworkCapabilities.NET_CAPABILITY_MMS
+            };
+    private static final int[] UNDERLYING_CAPS = new int[] {NetworkCapabilities.NET_CAPABILITY_DUN};
+    private static final long[] RETRY_INTERVALS_MS =
+            new long[] {
+                TimeUnit.SECONDS.toMillis(5),
+                TimeUnit.SECONDS.toMillis(30),
+                TimeUnit.MINUTES.toMillis(1),
+                TimeUnit.MINUTES.toMillis(5),
+                TimeUnit.MINUTES.toMillis(15),
+                TimeUnit.MINUTES.toMillis(30)
+            };
+    private static final int MAX_MTU = 1360;
+
+    // Package protected for use in VcnConfigTest
+    static VcnGatewayConnectionConfig buildTestConfig() {
+        final VcnGatewayConnectionConfig.Builder builder =
+                new VcnGatewayConnectionConfig.Builder()
+                        .setRetryInterval(RETRY_INTERVALS_MS)
+                        .setMaxMtu(MAX_MTU);
+
+        for (int caps : EXPOSED_CAPS) {
+            builder.addExposedCapability(caps);
+        }
+
+        for (int caps : UNDERLYING_CAPS) {
+            builder.addRequiredUnderlyingCapability(caps);
+        }
+
+        return builder.build();
+    }
+
+    @Test
+    public void testBuilderRequiresNonEmptyExposedCaps() {
+        try {
+            new VcnGatewayConnectionConfig.Builder()
+                    .addRequiredUnderlyingCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                    .build();
+
+            fail("Expected exception due to invalid exposed capabilities");
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    @Test
+    public void testBuilderRequiresNonEmptyUnderlyingCaps() {
+        try {
+            new VcnGatewayConnectionConfig.Builder()
+                    .addExposedCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
+                    .build();
+
+            fail("Expected exception due to invalid required underlying capabilities");
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    @Test
+    public void testBuilderRequiresNonNullRetryInterval() {
+        try {
+            new VcnGatewayConnectionConfig.Builder().setRetryInterval(null);
+            fail("Expected exception due to invalid retryIntervalMs");
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    @Test
+    public void testBuilderRequiresNonEmptyRetryInterval() {
+        try {
+            new VcnGatewayConnectionConfig.Builder().setRetryInterval(new long[0]);
+            fail("Expected exception due to invalid retryIntervalMs");
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    @Test
+    public void testBuilderRequiresValidMtu() {
+        try {
+            new VcnGatewayConnectionConfig.Builder()
+                    .setMaxMtu(VcnGatewayConnectionConfig.MIN_MTU_V6 - 1);
+            fail("Expected exception due to invalid mtu");
+        } catch (IllegalArgumentException e) {
+        }
+    }
+
+    @Test
+    public void testBuilderAndGetters() {
+        final VcnGatewayConnectionConfig config = buildTestConfig();
+
+        for (int cap : EXPOSED_CAPS) {
+            config.hasExposedCapability(cap);
+        }
+        for (int cap : UNDERLYING_CAPS) {
+            config.requiresUnderlyingCapability(cap);
+        }
+
+        assertArrayEquals(RETRY_INTERVALS_MS, config.getRetryIntervalsMs());
+        assertEquals(MAX_MTU, config.getMaxMtu());
+    }
+
+    @Test
+    public void testPersistableBundle() {
+        final VcnGatewayConnectionConfig config = buildTestConfig();
+
+        assertEquals(config, new VcnGatewayConnectionConfig(config.toPersistableBundle()));
+    }
+}
diff --git a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
index 633cf64..1cc9532 100644
--- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
+++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
@@ -16,6 +16,9 @@
 
 package com.android.server;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.doReturn;
@@ -26,7 +29,9 @@
 import android.content.Context;
 import android.net.ConnectivityManager;
 import android.net.vcn.VcnConfig;
+import android.net.vcn.VcnConfigTest;
 import android.os.ParcelUuid;
+import android.os.PersistableBundle;
 import android.os.Process;
 import android.os.UserHandle;
 import android.os.test.TestLooper;
@@ -37,10 +42,14 @@
 import androidx.test.filters.SmallTest;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.server.vcn.util.PersistableBundleUtils;
+
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.io.FileNotFoundException;
 import java.util.Collections;
+import java.util.Map;
 import java.util.UUID;
 
 /** Tests for {@link VcnManagementService}. */
@@ -48,6 +57,11 @@
 @SmallTest
 public class VcnManagementServiceTest {
     private static final ParcelUuid TEST_UUID_1 = new ParcelUuid(new UUID(0, 0));
+    private static final ParcelUuid TEST_UUID_2 = new ParcelUuid(new UUID(1, 1));
+    private static final VcnConfig TEST_VCN_CONFIG = VcnConfigTest.buildTestConfig();
+    private static final Map<ParcelUuid, VcnConfig> TEST_VCN_CONFIG_MAP =
+            Collections.unmodifiableMap(Collections.singletonMap(TEST_UUID_1, TEST_VCN_CONFIG));
+
     private static final SubscriptionInfo TEST_SUBSCRIPTION_INFO =
             new SubscriptionInfo(
                     1 /* id */,
@@ -79,6 +93,8 @@
     private final TelephonyManager mTelMgr = mock(TelephonyManager.class);
     private final SubscriptionManager mSubMgr = mock(SubscriptionManager.class);
     private final VcnManagementService mVcnMgmtSvc;
+    private final PersistableBundleUtils.LockingReadWriteHelper mConfigReadWriteHelper =
+            mock(PersistableBundleUtils.LockingReadWriteHelper.class);
 
     public VcnManagementServiceTest() throws Exception {
         setupSystemService(mConnMgr, Context.CONNECTIVITY_SERVICE, ConnectivityManager.class);
@@ -88,6 +104,16 @@
 
         doReturn(mTestLooper.getLooper()).when(mMockDeps).getLooper();
         doReturn(Process.FIRST_APPLICATION_UID).when(mMockDeps).getBinderCallingUid();
+        doReturn(mConfigReadWriteHelper)
+                .when(mMockDeps)
+                .newPersistableBundleLockingReadWriteHelper(any());
+
+        final PersistableBundle bundle =
+                PersistableBundleUtils.fromMap(
+                        TEST_VCN_CONFIG_MAP,
+                        PersistableBundleUtils::fromParcelUuid,
+                        VcnConfig::toPersistableBundle);
+        doReturn(bundle).when(mConfigReadWriteHelper).readFromDisk();
 
         setupMockedCarrierPrivilege(true);
         mVcnMgmtSvc = new VcnManagementService(mMockContext, mMockDeps);
@@ -116,11 +142,41 @@
     }
 
     @Test
+    public void testNonSystemServerRealConfigFileAccessPermission() throws Exception {
+        // Attempt to build a real instance of the dependencies, and verify we cannot write to the
+        // file.
+        VcnManagementService.Dependencies deps = new VcnManagementService.Dependencies();
+        PersistableBundleUtils.LockingReadWriteHelper configReadWriteHelper =
+                deps.newPersistableBundleLockingReadWriteHelper(
+                        VcnManagementService.VCN_CONFIG_FILE);
+
+        // Even tests should not be able to read/write configs from disk; SELinux policies restrict
+        // it to only the system server.
+        // Reading config should always return null since the file "does not exist", and writing
+        // should throw an IOException.
+        assertNull(configReadWriteHelper.readFromDisk());
+
+        try {
+            configReadWriteHelper.writeToDisk(new PersistableBundle());
+            fail("Expected IOException due to SELinux policy");
+        } catch (FileNotFoundException expected) {
+        }
+    }
+
+    @Test
+    public void testLoadVcnConfigsOnStartup() throws Exception {
+        mTestLooper.dispatchAll();
+
+        assertEquals(TEST_VCN_CONFIG_MAP, mVcnMgmtSvc.getConfigs());
+        verify(mConfigReadWriteHelper).readFromDisk();
+    }
+
+    @Test
     public void testSetVcnConfigRequiresNonSystemServer() throws Exception {
         doReturn(Process.SYSTEM_UID).when(mMockDeps).getBinderCallingUid();
 
         try {
-            mVcnMgmtSvc.setVcnConfig(TEST_UUID_1, new VcnConfig.Builder().build());
+            mVcnMgmtSvc.setVcnConfig(TEST_UUID_1, VcnConfigTest.buildTestConfig());
             fail("Expected IllegalStateException exception for system server");
         } catch (IllegalStateException expected) {
         }
@@ -133,7 +189,7 @@
                 .getBinderCallingUid();
 
         try {
-            mVcnMgmtSvc.setVcnConfig(TEST_UUID_1, new VcnConfig.Builder().build());
+            mVcnMgmtSvc.setVcnConfig(TEST_UUID_1, VcnConfigTest.buildTestConfig());
             fail("Expected security exception for non system user");
         } catch (SecurityException expected) {
         }
@@ -144,13 +200,21 @@
         setupMockedCarrierPrivilege(false);
 
         try {
-            mVcnMgmtSvc.setVcnConfig(TEST_UUID_1, new VcnConfig.Builder().build());
+            mVcnMgmtSvc.setVcnConfig(TEST_UUID_1, VcnConfigTest.buildTestConfig());
             fail("Expected security exception for missing carrier privileges");
         } catch (SecurityException expected) {
         }
     }
 
     @Test
+    public void testSetVcnConfig() throws Exception {
+        // Use a different UUID to simulate a new VCN config.
+        mVcnMgmtSvc.setVcnConfig(TEST_UUID_2, TEST_VCN_CONFIG);
+        assertEquals(TEST_VCN_CONFIG, mVcnMgmtSvc.getConfigs().get(TEST_UUID_2));
+        verify(mConfigReadWriteHelper).writeToDisk(any(PersistableBundle.class));
+    }
+
+    @Test
     public void testClearVcnConfigRequiresNonSystemServer() throws Exception {
         doReturn(Process.SYSTEM_UID).when(mMockDeps).getBinderCallingUid();
 
@@ -184,4 +248,11 @@
         } catch (SecurityException expected) {
         }
     }
+
+    @Test
+    public void testClearVcnConfig() throws Exception {
+        mVcnMgmtSvc.clearVcnConfig(TEST_UUID_1);
+        assertTrue(mVcnMgmtSvc.getConfigs().isEmpty());
+        verify(mConfigReadWriteHelper).writeToDisk(any(PersistableBundle.class));
+    }
 }
diff --git a/tools/aapt2/util/Util.cpp b/tools/aapt2/util/Util.cpp
index ef33c34..793a236 100644
--- a/tools/aapt2/util/Util.cpp
+++ b/tools/aapt2/util/Util.cpp
@@ -531,14 +531,14 @@
 }
 
 StringPiece16 GetString16(const android::ResStringPool& pool, size_t idx) {
-  if (auto str = pool.stringAt(idx)) {
+  if (auto str = pool.stringAt(idx); str.ok()) {
     return *str;
   }
   return StringPiece16();
 }
 
 std::string GetString(const android::ResStringPool& pool, size_t idx) {
-  if (auto str = pool.string8At(idx)) {
+  if (auto str = pool.string8At(idx); str.ok()) {
     return ModifiedUtf8ToUtf8(str->to_string());
   }
   return Utf16ToUtf8(GetString16(pool, idx));
diff --git a/wifi/Android.bp b/wifi/Android.bp
deleted file mode 100644
index 8b89959..0000000
--- a/wifi/Android.bp
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright (C) 2019 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-java_defaults {
-    name: "wifi-module-sdk-version-defaults",
-    min_sdk_version: "30",
-    target_sdk_version: "30",
-}
-
-filegroup {
-    name: "framework-wifi-updatable-exported-aidl-sources",
-    srcs: ["aidl-export/**/*.aidl"],
-    path: "aidl-export",
-    visibility: ["//visibility:private"],
-}
-
-filegroup {
-    name: "framework-wifi-updatable-java-sources",
-    srcs: [
-        "java/**/*.java",
-        "java/**/*.aidl",
-    ],
-    exclude_srcs: [
-        ":framework-wifi-non-updatable-sources"
-    ],
-    path: "java",
-    visibility: ["//visibility:private"],
-}
-
-filegroup {
-    name: "framework-wifi-updatable-sources",
-    srcs: [
-        ":framework-wifi-updatable-java-sources",
-        ":framework-wifi-updatable-exported-aidl-sources",
-    ],
-}
-
-filegroup {
-    name: "framework-wifi-non-updatable-sources",
-    srcs: [
-        // TODO(b/146011398) package android.net.wifi is now split amongst 2 jars: framework.jar and
-        // framework-wifi.jar. This is not a good idea, should move WifiNetworkScoreCache
-        // to a separate package.
-        "java/android/net/wifi/SoftApConfToXmlMigrationUtil.java",
-        "java/android/net/wifi/WifiNetworkScoreCache.java",
-        "java/android/net/wifi/WifiMigration.java",
-        "java/android/net/wifi/nl80211/*.java",
-        ":libwificond_ipc_aidl",
-    ],
-}
-
-filegroup {
-    name: "framework-wifi-annotations",
-    srcs: ["java/android/net/wifi/WifiAnnotations.java"],
-}
-
-// list of tests that are allowed to access @hide APIs from framework-wifi
-test_access_hidden_api_whitelist = [
-    "//frameworks/base/wifi/tests",
-    "//frameworks/opt/net/wifi/tests/wifitests:__subpackages__",
-
-    "//external/robolectric-shadows:__subpackages__",
-    "//frameworks/base/packages/SettingsLib/tests/integ",
-    "//external/sl4a:__subpackages__",
-    "//packages/apps/Settings/tests/robotests", // TODO(b/161767237): remove
-]
-
-// defaults shared between `framework-wifi` & `framework-wifi-pre-jarjar`
-// java_sdk_library `framework-wifi` needs sources to generate stubs, so it cannot reuse
-// `framework-wifi-pre-jarjar`
-java_defaults {
-    name: "framework-wifi-defaults",
-    defaults: ["wifi-module-sdk-version-defaults"],
-    static_libs: [
-        "framework-wifi-util-lib",
-        "android.hardware.wifi-V1.0-java-constants",
-        "modules-utils-build",
-    ],
-    libs: [
-        "unsupportedappusage", // for android.compat.annotation.UnsupportedAppUsage
-    ],
-    srcs: [
-        ":framework-wifi-updatable-sources",
-        ":framework-wifi-util-lib-aidls",
-    ],
-}
-
-// wifi-service needs pre-jarjared version of framework-wifi so it can reference copied utility
-// classes before they are renamed.
-java_library {
-    name: "framework-wifi-pre-jarjar",
-    defaults: ["framework-wifi-defaults"],
-    sdk_version: "module_current",
-    libs: ["framework-annotations-lib"],
-    // java_api_finder must accompany `srcs` (`srcs` defined in `framework-wifi-defaults`)
-    plugins: ["java_api_finder"],
-    installable: false,
-    visibility: [
-        "//frameworks/opt/net/wifi/service",
-        "//frameworks/opt/net/wifi/tests/wifitests",
-    ],
-}
-
-// post-jarjar version of framework-wifi
-java_sdk_library {
-    name: "framework-wifi",
-    defaults: [
-        "framework-module-defaults",
-        "framework-wifi-defaults",
-    ],
-
-    jarjar_rules: ":wifi-jarjar-rules",
-
-    installable: true,
-    optimize: {
-        enabled: false
-    },
-    hostdex: true, // for hiddenapi check
-
-    // Restrict access to implementation library.
-    impl_library_visibility: [
-        "//frameworks/opt/net/wifi/service:__subpackages__",
-    ] + test_access_hidden_api_whitelist,
-
-    apex_available: [
-        "com.android.wifi",
-        "test_com.android.wifi",
-    ],
-    permitted_packages: [
-        "android.hardware.wifi",
-        "android.net.wifi",
-        // Created by jarjar rules.
-        "com.android.wifi.x",
-    ],
-}
-
-// defaults for tests that need to build against framework-wifi's @hide APIs
-java_defaults {
-    name: "framework-wifi-test-defaults",
-    sdk_version: "core_platform", // tests can use @CorePlatformApi's
-    libs: [
-        // order matters: classes in framework-wifi are resolved before framework, meaning
-        // @hide APIs in framework-wifi are resolved before @SystemApi stubs in framework
-        "framework-wifi.impl",
-        "framework",
-
-        // if sdk_version="" this gets automatically included, but here we need to add manually.
-        "framework-res",
-    ],
-    visibility: test_access_hidden_api_whitelist,
-}
-
-filegroup {
-    name: "wifi-jarjar-rules",
-    srcs: ["jarjar-rules.txt"],
-}
diff --git a/wifi/aidl-export/android/net/wifi/ScanResult.aidl b/wifi/aidl-export/android/net/wifi/ScanResult.aidl
deleted file mode 100644
index b30689c..0000000
--- a/wifi/aidl-export/android/net/wifi/ScanResult.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2008, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); 
- * you may not use this file except in compliance with the License. 
- * You may obtain a copy of the License at 
- *
- *     http://www.apache.org/licenses/LICENSE-2.0 
- *
- * Unless required by applicable law or agreed to in writing, software 
- * distributed under the License is distributed on an "AS IS" BASIS, 
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- * See the License for the specific language governing permissions and 
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-@JavaOnlyStableParcelable parcelable ScanResult;
diff --git a/wifi/aidl-export/android/net/wifi/SoftApCapability.aidl b/wifi/aidl-export/android/net/wifi/SoftApCapability.aidl
deleted file mode 100644
index bf30709..0000000
--- a/wifi/aidl-export/android/net/wifi/SoftApCapability.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable SoftApCapability;
diff --git a/wifi/aidl-export/android/net/wifi/SoftApConfiguration.aidl b/wifi/aidl-export/android/net/wifi/SoftApConfiguration.aidl
deleted file mode 100644
index 1d06f45..0000000
--- a/wifi/aidl-export/android/net/wifi/SoftApConfiguration.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable SoftApConfiguration;
\ No newline at end of file
diff --git a/wifi/aidl-export/android/net/wifi/SoftApInfo.aidl b/wifi/aidl-export/android/net/wifi/SoftApInfo.aidl
deleted file mode 100644
index d4551cf..0000000
--- a/wifi/aidl-export/android/net/wifi/SoftApInfo.aidl
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable SoftApInfo;
-
diff --git a/wifi/aidl-export/android/net/wifi/WifiClient.aidl b/wifi/aidl-export/android/net/wifi/WifiClient.aidl
deleted file mode 100644
index accdadd..0000000
--- a/wifi/aidl-export/android/net/wifi/WifiClient.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-@JavaOnlyStableParcelable parcelable WifiClient;
\ No newline at end of file
diff --git a/wifi/aidl-export/android/net/wifi/WifiConfiguration.aidl b/wifi/aidl-export/android/net/wifi/WifiConfiguration.aidl
deleted file mode 100644
index 237a74d..0000000
--- a/wifi/aidl-export/android/net/wifi/WifiConfiguration.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2008, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); 
- * you may not use this file except in compliance with the License. 
- * You may obtain a copy of the License at 
- *
- *     http://www.apache.org/licenses/LICENSE-2.0 
- *
- * Unless required by applicable law or agreed to in writing, software 
- * distributed under the License is distributed on an "AS IS" BASIS, 
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- * See the License for the specific language governing permissions and 
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable WifiConfiguration;
diff --git a/wifi/aidl-export/android/net/wifi/WifiEnterpriseConfig.aidl b/wifi/aidl-export/android/net/wifi/WifiEnterpriseConfig.aidl
deleted file mode 100644
index b0f5f84..0000000
--- a/wifi/aidl-export/android/net/wifi/WifiEnterpriseConfig.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2013, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); 
- * you may not use this file except in compliance with the License. 
- * You may obtain a copy of the License at 
- *
- *     http://www.apache.org/licenses/LICENSE-2.0 
- *
- * Unless required by applicable law or agreed to in writing, software 
- * distributed under the License is distributed on an "AS IS" BASIS, 
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- * See the License for the specific language governing permissions and 
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable WifiEnterpriseConfig;
diff --git a/wifi/aidl-export/android/net/wifi/WifiInfo.aidl b/wifi/aidl-export/android/net/wifi/WifiInfo.aidl
deleted file mode 100644
index db47f0b..0000000
--- a/wifi/aidl-export/android/net/wifi/WifiInfo.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2008, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); 
- * you may not use this file except in compliance with the License. 
- * You may obtain a copy of the License at 
- *
- *     http://www.apache.org/licenses/LICENSE-2.0 
- *
- * Unless required by applicable law or agreed to in writing, software 
- * distributed under the License is distributed on an "AS IS" BASIS, 
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- * See the License for the specific language governing permissions and 
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable WifiInfo;
diff --git a/wifi/aidl-export/android/net/wifi/WifiNetworkConnectionStatistics.aidl b/wifi/aidl-export/android/net/wifi/WifiNetworkConnectionStatistics.aidl
deleted file mode 100644
index 5f497e2..0000000
--- a/wifi/aidl-export/android/net/wifi/WifiNetworkConnectionStatistics.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2014, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); 
- * you may not use this file except in compliance with the License. 
- * You may obtain a copy of the License at 
- *
- *     http://www.apache.org/licenses/LICENSE-2.0 
- *
- * Unless required by applicable law or agreed to in writing, software 
- * distributed under the License is distributed on an "AS IS" BASIS, 
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
- * See the License for the specific language governing permissions and 
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable WifiNetworkConnectionStatistics;
diff --git a/wifi/aidl-export/android/net/wifi/WifiNetworkSuggestion.aidl b/wifi/aidl-export/android/net/wifi/WifiNetworkSuggestion.aidl
deleted file mode 100644
index eb6995f..0000000
--- a/wifi/aidl-export/android/net/wifi/WifiNetworkSuggestion.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2018, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable WifiNetworkSuggestion;
diff --git a/wifi/aidl-export/android/net/wifi/WifiUsabilityStatsEntry.aidl b/wifi/aidl-export/android/net/wifi/WifiUsabilityStatsEntry.aidl
deleted file mode 100644
index 839af54..0000000
--- a/wifi/aidl-export/android/net/wifi/WifiUsabilityStatsEntry.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable WifiUsabilityStatsEntry;
diff --git a/wifi/aidl-export/android/net/wifi/WpsInfo.aidl b/wifi/aidl-export/android/net/wifi/WpsInfo.aidl
deleted file mode 100644
index f5e4ebe..0000000
--- a/wifi/aidl-export/android/net/wifi/WpsInfo.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2011, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable WpsInfo;
diff --git a/wifi/aidl-export/android/net/wifi/aware/Characteristics.aidl b/wifi/aidl-export/android/net/wifi/aware/Characteristics.aidl
deleted file mode 100644
index 77305e9..0000000
--- a/wifi/aidl-export/android/net/wifi/aware/Characteristics.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-parcelable Characteristics;
diff --git a/wifi/aidl-export/android/net/wifi/aware/PublishConfig.aidl b/wifi/aidl-export/android/net/wifi/aware/PublishConfig.aidl
deleted file mode 100644
index 2e6dd00..0000000
--- a/wifi/aidl-export/android/net/wifi/aware/PublishConfig.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-parcelable PublishConfig;
diff --git a/wifi/aidl-export/android/net/wifi/aware/SubscribeConfig.aidl b/wifi/aidl-export/android/net/wifi/aware/SubscribeConfig.aidl
deleted file mode 100644
index bd73d5e..0000000
--- a/wifi/aidl-export/android/net/wifi/aware/SubscribeConfig.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-parcelable SubscribeConfig;
diff --git a/wifi/aidl-export/android/net/wifi/hotspot2/OsuProvider.aidl b/wifi/aidl-export/android/net/wifi/hotspot2/OsuProvider.aidl
deleted file mode 100644
index 23d0f22..0000000
--- a/wifi/aidl-export/android/net/wifi/hotspot2/OsuProvider.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi.hotspot2;
-
-parcelable OsuProvider;
diff --git a/wifi/aidl-export/android/net/wifi/hotspot2/PasspointConfiguration.aidl b/wifi/aidl-export/android/net/wifi/hotspot2/PasspointConfiguration.aidl
deleted file mode 100644
index 6b1cea8..0000000
--- a/wifi/aidl-export/android/net/wifi/hotspot2/PasspointConfiguration.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2;
-
-parcelable PasspointConfiguration;
diff --git a/wifi/aidl-export/android/net/wifi/hotspot2/pps/Credential.aidl b/wifi/aidl-export/android/net/wifi/hotspot2/pps/Credential.aidl
deleted file mode 100644
index 3d8e833..0000000
--- a/wifi/aidl-export/android/net/wifi/hotspot2/pps/Credential.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.pps;
-
-parcelable Credential;
diff --git a/wifi/aidl-export/android/net/wifi/hotspot2/pps/HomeSp.aidl b/wifi/aidl-export/android/net/wifi/hotspot2/pps/HomeSp.aidl
deleted file mode 100644
index 6d343bd..0000000
--- a/wifi/aidl-export/android/net/wifi/hotspot2/pps/HomeSp.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.pps;
-
-parcelable HomeSp;
diff --git a/wifi/aidl-export/android/net/wifi/p2p/WifiP2pConfig.aidl b/wifi/aidl-export/android/net/wifi/p2p/WifiP2pConfig.aidl
deleted file mode 100644
index ea3b280..0000000
--- a/wifi/aidl-export/android/net/wifi/p2p/WifiP2pConfig.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2011, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-parcelable WifiP2pConfig;
diff --git a/wifi/aidl-export/android/net/wifi/p2p/WifiP2pDevice.aidl b/wifi/aidl-export/android/net/wifi/p2p/WifiP2pDevice.aidl
deleted file mode 100644
index 8790c6f..0000000
--- a/wifi/aidl-export/android/net/wifi/p2p/WifiP2pDevice.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2011, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-parcelable WifiP2pDevice;
diff --git a/wifi/aidl-export/android/net/wifi/p2p/WifiP2pDeviceList.aidl b/wifi/aidl-export/android/net/wifi/p2p/WifiP2pDeviceList.aidl
deleted file mode 100644
index 6c79009..0000000
--- a/wifi/aidl-export/android/net/wifi/p2p/WifiP2pDeviceList.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2011, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-parcelable WifiP2pDeviceList;
diff --git a/wifi/aidl-export/android/net/wifi/p2p/WifiP2pGroup.aidl b/wifi/aidl-export/android/net/wifi/p2p/WifiP2pGroup.aidl
deleted file mode 100644
index 403f2b1..0000000
--- a/wifi/aidl-export/android/net/wifi/p2p/WifiP2pGroup.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2011, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-parcelable WifiP2pGroup;
diff --git a/wifi/aidl-export/android/net/wifi/p2p/WifiP2pInfo.aidl b/wifi/aidl-export/android/net/wifi/p2p/WifiP2pInfo.aidl
deleted file mode 100644
index a347148..0000000
--- a/wifi/aidl-export/android/net/wifi/p2p/WifiP2pInfo.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/**
- * Copyright (c) 2011, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-parcelable WifiP2pInfo;
diff --git a/wifi/aidl-export/android/net/wifi/p2p/nsd/WifiP2pServiceInfo.aidl b/wifi/aidl-export/android/net/wifi/p2p/nsd/WifiP2pServiceInfo.aidl
deleted file mode 100644
index 57055f7..0000000
--- a/wifi/aidl-export/android/net/wifi/p2p/nsd/WifiP2pServiceInfo.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-parcelable WifiP2pServiceInfo;
diff --git a/wifi/aidl-export/android/net/wifi/p2p/nsd/WifiP2pServiceRequest.aidl b/wifi/aidl-export/android/net/wifi/p2p/nsd/WifiP2pServiceRequest.aidl
deleted file mode 100644
index e4d28bb..0000000
--- a/wifi/aidl-export/android/net/wifi/p2p/nsd/WifiP2pServiceRequest.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-parcelable WifiP2pServiceRequest;
diff --git a/wifi/aidl-export/android/net/wifi/rtt/RangingRequest.aidl b/wifi/aidl-export/android/net/wifi/rtt/RangingRequest.aidl
deleted file mode 100644
index 8053c94..0000000
--- a/wifi/aidl-export/android/net/wifi/rtt/RangingRequest.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-parcelable RangingRequest;
diff --git a/wifi/aidl-export/android/net/wifi/rtt/RangingResult.aidl b/wifi/aidl-export/android/net/wifi/rtt/RangingResult.aidl
deleted file mode 100644
index ae295a6..0000000
--- a/wifi/aidl-export/android/net/wifi/rtt/RangingResult.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-parcelable RangingResult;
diff --git a/wifi/aidl-export/android/net/wifi/rtt/ResponderConfig.aidl b/wifi/aidl-export/android/net/wifi/rtt/ResponderConfig.aidl
deleted file mode 100644
index fd3988a..0000000
--- a/wifi/aidl-export/android/net/wifi/rtt/ResponderConfig.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-parcelable ResponderConfig;
diff --git a/wifi/api/current.txt b/wifi/api/current.txt
deleted file mode 100644
index 53c3b33..0000000
--- a/wifi/api/current.txt
+++ /dev/null
@@ -1,1199 +0,0 @@
-// Signature format: 2.0
-package android.net.wifi {
-
-  public abstract class EasyConnectStatusCallback {
-    field public static final int EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION = -2; // 0xfffffffe
-    field public static final int EASY_CONNECT_EVENT_FAILURE_BUSY = -5; // 0xfffffffb
-    field public static final int EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK = -10; // 0xfffffff6
-    field public static final int EASY_CONNECT_EVENT_FAILURE_CONFIGURATION = -4; // 0xfffffffc
-    field public static final int EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION = -11; // 0xfffffff5
-    field public static final int EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION = -12; // 0xfffffff4
-    field public static final int EASY_CONNECT_EVENT_FAILURE_GENERIC = -7; // 0xfffffff9
-    field public static final int EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK = -9; // 0xfffffff7
-    field public static final int EASY_CONNECT_EVENT_FAILURE_INVALID_URI = -1; // 0xffffffff
-    field public static final int EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE = -3; // 0xfffffffd
-    field public static final int EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED = -8; // 0xfffffff8
-    field public static final int EASY_CONNECT_EVENT_FAILURE_TIMEOUT = -6; // 0xfffffffa
-  }
-
-  public final class ScanResult implements android.os.Parcelable {
-    ctor public ScanResult(@NonNull android.net.wifi.ScanResult);
-    ctor public ScanResult();
-    method public int describeContents();
-    method @NonNull public java.util.List<android.net.wifi.ScanResult.InformationElement> getInformationElements();
-    method public int getWifiStandard();
-    method public boolean is80211mcResponder();
-    method public boolean isPasspointNetwork();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public String BSSID;
-    field public static final int CHANNEL_WIDTH_160MHZ = 3; // 0x3
-    field public static final int CHANNEL_WIDTH_20MHZ = 0; // 0x0
-    field public static final int CHANNEL_WIDTH_40MHZ = 1; // 0x1
-    field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2
-    field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.ScanResult> CREATOR;
-    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;
-    field public int channelWidth;
-    field public int frequency;
-    field public int level;
-    field public CharSequence operatorFriendlyName;
-    field public long timestamp;
-    field public CharSequence venueName;
-  }
-
-  public static class ScanResult.InformationElement {
-    ctor public ScanResult.InformationElement(@NonNull android.net.wifi.ScanResult.InformationElement);
-    method @NonNull public java.nio.ByteBuffer getBytes();
-    method public int getId();
-    method public int getIdExt();
-  }
-
-  public final class SoftApConfiguration implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public android.net.MacAddress getBssid();
-    method @Nullable public String getPassphrase();
-    method public int getSecurityType();
-    method @Nullable public String getSsid();
-    method public boolean isHiddenSsid();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApConfiguration> CREATOR;
-    field public static final int SECURITY_TYPE_OPEN = 0; // 0x0
-    field public static final int SECURITY_TYPE_WPA2_PSK = 1; // 0x1
-    field public static final int SECURITY_TYPE_WPA3_SAE = 3; // 0x3
-    field public static final int SECURITY_TYPE_WPA3_SAE_TRANSITION = 2; // 0x2
-  }
-
-  public enum SupplicantState implements android.os.Parcelable {
-    method public int describeContents();
-    method public static boolean isValidState(android.net.wifi.SupplicantState);
-    method public void writeToParcel(android.os.Parcel, int);
-    enum_constant public static final android.net.wifi.SupplicantState ASSOCIATED;
-    enum_constant public static final android.net.wifi.SupplicantState ASSOCIATING;
-    enum_constant public static final android.net.wifi.SupplicantState AUTHENTICATING;
-    enum_constant public static final android.net.wifi.SupplicantState COMPLETED;
-    enum_constant public static final android.net.wifi.SupplicantState DISCONNECTED;
-    enum_constant public static final android.net.wifi.SupplicantState DORMANT;
-    enum_constant public static final android.net.wifi.SupplicantState FOUR_WAY_HANDSHAKE;
-    enum_constant public static final android.net.wifi.SupplicantState GROUP_HANDSHAKE;
-    enum_constant public static final android.net.wifi.SupplicantState INACTIVE;
-    enum_constant public static final android.net.wifi.SupplicantState INTERFACE_DISABLED;
-    enum_constant public static final android.net.wifi.SupplicantState INVALID;
-    enum_constant public static final android.net.wifi.SupplicantState SCANNING;
-    enum_constant public static final android.net.wifi.SupplicantState UNINITIALIZED;
-  }
-
-  @Deprecated public class WifiConfiguration implements android.os.Parcelable {
-    ctor @Deprecated public WifiConfiguration();
-    ctor @Deprecated public WifiConfiguration(@NonNull android.net.wifi.WifiConfiguration);
-    method public int describeContents();
-    method @Deprecated public android.net.ProxyInfo getHttpProxy();
-    method @Deprecated @NonNull public String getKey();
-    method @Deprecated @NonNull public android.net.MacAddress getRandomizedMacAddress();
-    method @Deprecated public boolean isPasspoint();
-    method @Deprecated public void setHttpProxy(android.net.ProxyInfo);
-    method @Deprecated public void setSecurityParams(int);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated public String BSSID;
-    field @Deprecated public String FQDN;
-    field @Deprecated public static final int SECURITY_TYPE_EAP = 3; // 0x3
-    field @Deprecated public static final int SECURITY_TYPE_EAP_SUITE_B = 5; // 0x5
-    field @Deprecated public static final int SECURITY_TYPE_OPEN = 0; // 0x0
-    field @Deprecated public static final int SECURITY_TYPE_OWE = 6; // 0x6
-    field @Deprecated public static final int SECURITY_TYPE_PSK = 2; // 0x2
-    field @Deprecated public static final int SECURITY_TYPE_SAE = 4; // 0x4
-    field @Deprecated public static final int SECURITY_TYPE_WAPI_CERT = 8; // 0x8
-    field @Deprecated public static final int SECURITY_TYPE_WAPI_PSK = 7; // 0x7
-    field @Deprecated public static final int SECURITY_TYPE_WEP = 1; // 0x1
-    field @Deprecated public String SSID;
-    field @Deprecated @NonNull public java.util.BitSet allowedAuthAlgorithms;
-    field @Deprecated @NonNull public java.util.BitSet allowedGroupCiphers;
-    field @Deprecated @NonNull public java.util.BitSet allowedGroupManagementCiphers;
-    field @Deprecated @NonNull public java.util.BitSet allowedKeyManagement;
-    field @Deprecated @NonNull public java.util.BitSet allowedPairwiseCiphers;
-    field @Deprecated @NonNull public java.util.BitSet allowedProtocols;
-    field @Deprecated @NonNull public java.util.BitSet allowedSuiteBCiphers;
-    field @Deprecated public android.net.wifi.WifiEnterpriseConfig enterpriseConfig;
-    field @Deprecated public boolean hiddenSSID;
-    field @Deprecated public boolean isHomeProviderNetwork;
-    field @Deprecated public int networkId;
-    field @Deprecated public String preSharedKey;
-    field @Deprecated public int priority;
-    field @Deprecated public String providerFriendlyName;
-    field @Deprecated public long[] roamingConsortiumIds;
-    field @Deprecated public int status;
-    field @Deprecated public String[] wepKeys;
-    field @Deprecated public int wepTxKeyIndex;
-  }
-
-  @Deprecated public static class WifiConfiguration.AuthAlgorithm {
-    field @Deprecated public static final int LEAP = 2; // 0x2
-    field @Deprecated public static final int OPEN = 0; // 0x0
-    field @Deprecated public static final int SAE = 3; // 0x3
-    field @Deprecated public static final int SHARED = 1; // 0x1
-    field @Deprecated public static final String[] strings;
-    field @Deprecated public static final String varName = "auth_alg";
-  }
-
-  @Deprecated public static class WifiConfiguration.GroupCipher {
-    field @Deprecated public static final int CCMP = 3; // 0x3
-    field @Deprecated public static final int GCMP_256 = 5; // 0x5
-    field @Deprecated public static final int SMS4 = 6; // 0x6
-    field @Deprecated public static final int TKIP = 2; // 0x2
-    field @Deprecated public static final int WEP104 = 1; // 0x1
-    field @Deprecated public static final int WEP40 = 0; // 0x0
-    field @Deprecated public static final String[] strings;
-    field @Deprecated public static final String varName = "group";
-  }
-
-  @Deprecated public static class WifiConfiguration.GroupMgmtCipher {
-    field @Deprecated public static final int BIP_CMAC_256 = 0; // 0x0
-    field @Deprecated public static final int BIP_GMAC_128 = 1; // 0x1
-    field @Deprecated public static final int BIP_GMAC_256 = 2; // 0x2
-  }
-
-  @Deprecated public static class WifiConfiguration.KeyMgmt {
-    field @Deprecated public static final int IEEE8021X = 3; // 0x3
-    field @Deprecated public static final int NONE = 0; // 0x0
-    field @Deprecated public static final int OWE = 9; // 0x9
-    field @Deprecated public static final int SAE = 8; // 0x8
-    field @Deprecated public static final int SUITE_B_192 = 10; // 0xa
-    field @Deprecated public static final int WPA_EAP = 2; // 0x2
-    field @Deprecated public static final int WPA_PSK = 1; // 0x1
-    field @Deprecated public static final String[] strings;
-    field @Deprecated public static final String varName = "key_mgmt";
-  }
-
-  @Deprecated public static class WifiConfiguration.PairwiseCipher {
-    field @Deprecated public static final int CCMP = 2; // 0x2
-    field @Deprecated public static final int GCMP_256 = 3; // 0x3
-    field @Deprecated public static final int NONE = 0; // 0x0
-    field @Deprecated public static final int SMS4 = 4; // 0x4
-    field @Deprecated public static final int TKIP = 1; // 0x1
-    field @Deprecated public static final String[] strings;
-    field @Deprecated public static final String varName = "pairwise";
-  }
-
-  @Deprecated public static class WifiConfiguration.Protocol {
-    field @Deprecated public static final int RSN = 1; // 0x1
-    field @Deprecated public static final int WAPI = 3; // 0x3
-    field @Deprecated public static final int WPA = 0; // 0x0
-    field @Deprecated public static final String[] strings;
-    field @Deprecated public static final String varName = "proto";
-  }
-
-  @Deprecated public static class WifiConfiguration.Status {
-    field @Deprecated public static final int CURRENT = 0; // 0x0
-    field @Deprecated public static final int DISABLED = 1; // 0x1
-    field @Deprecated public static final int ENABLED = 2; // 0x2
-    field @Deprecated public static final String[] strings;
-  }
-
-  public class WifiEnterpriseConfig implements android.os.Parcelable {
-    ctor public WifiEnterpriseConfig();
-    ctor public WifiEnterpriseConfig(android.net.wifi.WifiEnterpriseConfig);
-    method public int describeContents();
-    method public String getAltSubjectMatch();
-    method public String getAnonymousIdentity();
-    method @Nullable public java.security.cert.X509Certificate getCaCertificate();
-    method @Nullable public java.security.cert.X509Certificate[] getCaCertificates();
-    method public java.security.cert.X509Certificate getClientCertificate();
-    method @Nullable public java.security.cert.X509Certificate[] getClientCertificateChain();
-    method @Nullable public java.security.PrivateKey getClientPrivateKey();
-    method public String getDomainSuffixMatch();
-    method public int getEapMethod();
-    method public String getIdentity();
-    method public String getPassword();
-    method public int getPhase2Method();
-    method public String getPlmn();
-    method public String getRealm();
-    method @Deprecated public String getSubjectMatch();
-    method public boolean isAuthenticationSimBased();
-    method public void setAltSubjectMatch(String);
-    method public void setAnonymousIdentity(String);
-    method public void setCaCertificate(@Nullable java.security.cert.X509Certificate);
-    method public void setCaCertificates(@Nullable java.security.cert.X509Certificate[]);
-    method public void setClientKeyEntry(java.security.PrivateKey, java.security.cert.X509Certificate);
-    method public void setClientKeyEntryWithCertificateChain(java.security.PrivateKey, java.security.cert.X509Certificate[]);
-    method public void setDomainSuffixMatch(String);
-    method public void setEapMethod(int);
-    method public void setIdentity(String);
-    method public void setPassword(String);
-    method public void setPhase2Method(int);
-    method public void setPlmn(String);
-    method public void setRealm(String);
-    method @Deprecated public void setSubjectMatch(String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiEnterpriseConfig> CREATOR;
-    field public static final String EXTRA_WAPI_AS_CERTIFICATE_DATA = "android.net.wifi.extra.WAPI_AS_CERTIFICATE_DATA";
-    field public static final String EXTRA_WAPI_AS_CERTIFICATE_NAME = "android.net.wifi.extra.WAPI_AS_CERTIFICATE_NAME";
-    field public static final String EXTRA_WAPI_USER_CERTIFICATE_DATA = "android.net.wifi.extra.WAPI_USER_CERTIFICATE_DATA";
-    field public static final String EXTRA_WAPI_USER_CERTIFICATE_NAME = "android.net.wifi.extra.WAPI_USER_CERTIFICATE_NAME";
-    field public static final String WAPI_AS_CERTIFICATE = "WAPIAS_";
-    field public static final String WAPI_USER_CERTIFICATE = "WAPIUSR_";
-  }
-
-  public static final class WifiEnterpriseConfig.Eap {
-    field public static final int AKA = 5; // 0x5
-    field public static final int AKA_PRIME = 6; // 0x6
-    field public static final int NONE = -1; // 0xffffffff
-    field public static final int PEAP = 0; // 0x0
-    field public static final int PWD = 3; // 0x3
-    field public static final int SIM = 4; // 0x4
-    field public static final int TLS = 1; // 0x1
-    field public static final int TTLS = 2; // 0x2
-    field public static final int UNAUTH_TLS = 7; // 0x7
-    field public static final int WAPI_CERT = 8; // 0x8
-  }
-
-  public static final class WifiEnterpriseConfig.Phase2 {
-    field public static final int AKA = 6; // 0x6
-    field public static final int AKA_PRIME = 7; // 0x7
-    field public static final int GTC = 4; // 0x4
-    field public static final int MSCHAP = 2; // 0x2
-    field public static final int MSCHAPV2 = 3; // 0x3
-    field public static final int NONE = 0; // 0x0
-    field public static final int PAP = 1; // 0x1
-    field public static final int SIM = 5; // 0x5
-  }
-
-  public class WifiInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method public String getBSSID();
-    method public static android.net.NetworkInfo.DetailedState getDetailedStateOf(android.net.wifi.SupplicantState);
-    method public int getFrequency();
-    method public boolean getHiddenSSID();
-    method public int getIpAddress();
-    method public int getLinkSpeed();
-    method public String getMacAddress();
-    method public int getMaxSupportedRxLinkSpeedMbps();
-    method public int getMaxSupportedTxLinkSpeedMbps();
-    method public int getNetworkId();
-    method @Nullable public String getPasspointFqdn();
-    method @Nullable public String getPasspointProviderFriendlyName();
-    method public int getRssi();
-    method @IntRange(from=0xffffffff) public int getRxLinkSpeedMbps();
-    method public String getSSID();
-    method public android.net.wifi.SupplicantState getSupplicantState();
-    method @IntRange(from=0xffffffff) public int getTxLinkSpeedMbps();
-    method public int getWifiStandard();
-    method public void writeToParcel(android.os.Parcel, int);
-    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
-  }
-
-  public static final class WifiInfo.Builder {
-    ctor public WifiInfo.Builder();
-    method @NonNull public android.net.wifi.WifiInfo build();
-    method @NonNull public android.net.wifi.WifiInfo.Builder setBssid(@NonNull String);
-    method @NonNull public android.net.wifi.WifiInfo.Builder setNetworkId(int);
-    method @NonNull public android.net.wifi.WifiInfo.Builder setRssi(int);
-    method @NonNull public android.net.wifi.WifiInfo.Builder setSsid(@NonNull byte[]);
-  }
-
-  public class WifiManager {
-    method @Deprecated public int addNetwork(android.net.wifi.WifiConfiguration);
-    method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public int addNetworkSuggestions(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>);
-    method public void addOrUpdatePasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
-    method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE}) public void addSuggestionConnectionStatusListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.SuggestionConnectionStatusListener);
-    method @Deprecated public static int calculateSignalLevel(int, int);
-    method @IntRange(from=0) public int calculateSignalLevel(int);
-    method @Deprecated public void cancelWps(android.net.wifi.WifiManager.WpsCallback);
-    method public static int compareSignalLevel(int, int);
-    method public android.net.wifi.WifiManager.MulticastLock createMulticastLock(String);
-    method public android.net.wifi.WifiManager.WifiLock createWifiLock(int, String);
-    method @Deprecated public android.net.wifi.WifiManager.WifiLock createWifiLock(String);
-    method @Deprecated public boolean disableNetwork(int);
-    method @Deprecated public boolean disconnect();
-    method @Deprecated public boolean enableNetwork(int, boolean);
-    method @Deprecated @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE}) public java.util.List<android.net.wifi.WifiConfiguration> getConfiguredNetworks();
-    method public android.net.wifi.WifiInfo getConnectionInfo();
-    method public android.net.DhcpInfo getDhcpInfo();
-    method public int getMaxNumberOfNetworkSuggestionsPerApp();
-    method @IntRange(from=0) public int getMaxSignalLevel();
-    method @NonNull @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public java.util.List<android.net.wifi.WifiNetworkSuggestion> getNetworkSuggestions();
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.net.wifi.hotspot2.PasspointConfiguration> getPasspointConfigurations();
-    method public java.util.List<android.net.wifi.ScanResult> getScanResults();
-    method public int getWifiState();
-    method public boolean is5GHzBandSupported();
-    method public boolean is6GHzBandSupported();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isAutoWakeupEnabled();
-    method @Deprecated public boolean isDeviceToApRttSupported();
-    method public boolean isEasyConnectSupported();
-    method public boolean isEnhancedOpenSupported();
-    method public boolean isEnhancedPowerReportingSupported();
-    method public boolean isP2pSupported();
-    method public boolean isPreferredNetworkOffloadSupported();
-    method @Deprecated public boolean isScanAlwaysAvailable();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isScanThrottleEnabled();
-    method public boolean isStaApConcurrencySupported();
-    method public boolean isTdlsSupported();
-    method public boolean isWapiSupported();
-    method public boolean isWifiEnabled();
-    method public boolean isWifiStandardSupported(int);
-    method public boolean isWpa3SaeSupported();
-    method public boolean isWpa3SuiteBSupported();
-    method @Deprecated public boolean pingSupplicant();
-    method @Deprecated public boolean reassociate();
-    method @Deprecated public boolean reconnect();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void registerScanResultsCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.ScanResultsCallback);
-    method @Deprecated public boolean removeNetwork(int);
-    method @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public int removeNetworkSuggestions(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_CARRIER_PROVISIONING}) public void removePasspointConfiguration(String);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void removeSuggestionConnectionStatusListener(@NonNull android.net.wifi.WifiManager.SuggestionConnectionStatusListener);
-    method @Deprecated public boolean saveConfiguration();
-    method public void setTdlsEnabled(java.net.InetAddress, boolean);
-    method public void setTdlsEnabledWithMacAddress(String, boolean);
-    method @Deprecated public boolean setWifiEnabled(boolean);
-    method @RequiresPermission(allOf={android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.ACCESS_FINE_LOCATION}) public void startLocalOnlyHotspot(android.net.wifi.WifiManager.LocalOnlyHotspotCallback, @Nullable android.os.Handler);
-    method @Deprecated public boolean startScan();
-    method @Deprecated public void startWps(android.net.wifi.WpsInfo, android.net.wifi.WifiManager.WpsCallback);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void unregisterScanResultsCallback(@NonNull android.net.wifi.WifiManager.ScanResultsCallback);
-    method @Deprecated public int updateNetwork(android.net.wifi.WifiConfiguration);
-    field public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
-    field public static final String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE = "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
-    field public static final String ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION = "android.net.wifi.action.WIFI_NETWORK_SUGGESTION_POST_CONNECTION";
-    field public static final String ACTION_WIFI_SCAN_AVAILABILITY_CHANGED = "android.net.wifi.action.WIFI_SCAN_AVAILABILITY_CHANGED";
-    field @Deprecated public static final int ERROR_AUTHENTICATING = 1; // 0x1
-    field @Deprecated public static final String EXTRA_BSSID = "bssid";
-    field public static final String EXTRA_NETWORK_INFO = "networkInfo";
-    field public static final String EXTRA_NETWORK_SUGGESTION = "android.net.wifi.extra.NETWORK_SUGGESTION";
-    field public static final String EXTRA_NEW_RSSI = "newRssi";
-    field @Deprecated public static final String EXTRA_NEW_STATE = "newState";
-    field public static final String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
-    field public static final String EXTRA_RESULTS_UPDATED = "resultsUpdated";
-    field public static final String EXTRA_SCAN_AVAILABLE = "android.net.wifi.extra.SCAN_AVAILABLE";
-    field @Deprecated public static final String EXTRA_SUPPLICANT_CONNECTED = "connected";
-    field @Deprecated public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError";
-    field @Deprecated public static final String EXTRA_WIFI_INFO = "wifiInfo";
-    field public static final String EXTRA_WIFI_STATE = "wifi_state";
-    field public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
-    field public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE";
-    field public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED";
-    field public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
-    field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE = 3; // 0x3
-    field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_EXCEEDS_MAX_PER_APP = 4; // 0x4
-    field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_INVALID = 7; // 0x7
-    field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_NOT_ALLOWED = 6; // 0x6
-    field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_APP_DISALLOWED = 2; // 0x2
-    field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_INTERNAL = 1; // 0x1
-    field public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID = 5; // 0x5
-    field public static final int STATUS_NETWORK_SUGGESTIONS_SUCCESS = 0; // 0x0
-    field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_ASSOCIATION = 1; // 0x1
-    field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_AUTHENTICATION = 2; // 0x2
-    field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_IP_PROVISIONING = 3; // 0x3
-    field public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_UNKNOWN = 0; // 0x0
-    field @Deprecated public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION = "android.net.wifi.supplicant.CONNECTION_CHANGE";
-    field @Deprecated public static final String SUPPLICANT_STATE_CHANGED_ACTION = "android.net.wifi.supplicant.STATE_CHANGE";
-    field public static final String UNKNOWN_SSID = "<unknown ssid>";
-    field @Deprecated public static final int WIFI_MODE_FULL = 1; // 0x1
-    field public static final int WIFI_MODE_FULL_HIGH_PERF = 3; // 0x3
-    field public static final int WIFI_MODE_FULL_LOW_LATENCY = 4; // 0x4
-    field @Deprecated public static final int WIFI_MODE_SCAN_ONLY = 2; // 0x2
-    field public static final String WIFI_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_STATE_CHANGED";
-    field public static final int WIFI_STATE_DISABLED = 1; // 0x1
-    field public static final int WIFI_STATE_DISABLING = 0; // 0x0
-    field public static final int WIFI_STATE_ENABLED = 3; // 0x3
-    field public static final int WIFI_STATE_ENABLING = 2; // 0x2
-    field public static final int WIFI_STATE_UNKNOWN = 4; // 0x4
-    field @Deprecated public static final int WPS_AUTH_FAILURE = 6; // 0x6
-    field @Deprecated public static final int WPS_OVERLAP_ERROR = 3; // 0x3
-    field @Deprecated public static final int WPS_TIMED_OUT = 7; // 0x7
-    field @Deprecated public static final int WPS_TKIP_ONLY_PROHIBITED = 5; // 0x5
-    field @Deprecated public static final int WPS_WEP_PROHIBITED = 4; // 0x4
-  }
-
-  public static class WifiManager.LocalOnlyHotspotCallback {
-    ctor public WifiManager.LocalOnlyHotspotCallback();
-    method public void onFailed(int);
-    method public void onStarted(android.net.wifi.WifiManager.LocalOnlyHotspotReservation);
-    method public void onStopped();
-    field public static final int ERROR_GENERIC = 2; // 0x2
-    field public static final int ERROR_INCOMPATIBLE_MODE = 3; // 0x3
-    field public static final int ERROR_NO_CHANNEL = 1; // 0x1
-    field public static final int ERROR_TETHERING_DISALLOWED = 4; // 0x4
-  }
-
-  public class WifiManager.LocalOnlyHotspotReservation implements java.lang.AutoCloseable {
-    method public void close();
-    method @NonNull public android.net.wifi.SoftApConfiguration getSoftApConfiguration();
-    method @Deprecated @Nullable public android.net.wifi.WifiConfiguration getWifiConfiguration();
-  }
-
-  public class WifiManager.MulticastLock {
-    method public void acquire();
-    method public boolean isHeld();
-    method public void release();
-    method public void setReferenceCounted(boolean);
-  }
-
-  public abstract static class WifiManager.ScanResultsCallback {
-    ctor public WifiManager.ScanResultsCallback();
-    method public abstract void onScanResultsAvailable();
-  }
-
-  public static interface WifiManager.SuggestionConnectionStatusListener {
-    method public void onConnectionStatus(@NonNull android.net.wifi.WifiNetworkSuggestion, int);
-  }
-
-  public class WifiManager.WifiLock {
-    method public void acquire();
-    method public boolean isHeld();
-    method public void release();
-    method public void setReferenceCounted(boolean);
-    method public void setWorkSource(android.os.WorkSource);
-  }
-
-  @Deprecated public abstract static class WifiManager.WpsCallback {
-    ctor @Deprecated public WifiManager.WpsCallback();
-    method @Deprecated public abstract void onFailed(int);
-    method @Deprecated public abstract void onStarted(String);
-    method @Deprecated public abstract void onSucceeded();
-  }
-
-  public final class WifiNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkSpecifier> CREATOR;
-  }
-
-  public static final class WifiNetworkSpecifier.Builder {
-    ctor public WifiNetworkSpecifier.Builder();
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier build();
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setBssid(@NonNull android.net.MacAddress);
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setBssidPattern(@NonNull android.net.MacAddress, @NonNull android.net.MacAddress);
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setIsEnhancedOpen(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setIsHiddenSsid(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setSsid(@NonNull String);
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setSsidPattern(@NonNull android.os.PatternMatcher);
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa2Passphrase(@NonNull String);
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
-    method @NonNull public android.net.wifi.WifiNetworkSpecifier.Builder setWpa3Passphrase(@NonNull String);
-  }
-
-  public final class WifiNetworkSuggestion implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public android.net.MacAddress getBssid();
-    method @Nullable public android.net.wifi.WifiEnterpriseConfig getEnterpriseConfig();
-    method @Nullable public String getPassphrase();
-    method @Nullable public android.net.wifi.hotspot2.PasspointConfiguration getPasspointConfig();
-    method @IntRange(from=0) public int getPriority();
-    method @Nullable public String getSsid();
-    method public boolean isAppInteractionRequired();
-    method public boolean isCredentialSharedWithUser();
-    method public boolean isEnhancedOpen();
-    method public boolean isHiddenSsid();
-    method public boolean isInitialAutojoinEnabled();
-    method public boolean isMetered();
-    method public boolean isUntrusted();
-    method public boolean isUserInteractionRequired();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkSuggestion> CREATOR;
-  }
-
-  public static final class WifiNetworkSuggestion.Builder {
-    ctor public WifiNetworkSuggestion.Builder();
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion build();
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setBssid(@NonNull android.net.MacAddress);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setCredentialSharedWithUser(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsAppInteractionRequired(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsEnhancedOpen(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsHiddenSsid(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsInitialAutojoinEnabled(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsMetered(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setIsUserInteractionRequired(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setPasspointConfig(@NonNull android.net.wifi.hotspot2.PasspointConfiguration);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setPriority(@IntRange(from=0) int);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setSsid(@NonNull String);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setUntrusted(boolean);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWapiEnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWapiPassphrase(@NonNull String);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa2Passphrase(@NonNull String);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa3EnterpriseConfig(@NonNull android.net.wifi.WifiEnterpriseConfig);
-    method @NonNull public android.net.wifi.WifiNetworkSuggestion.Builder setWpa3Passphrase(@NonNull String);
-  }
-
-  public class WpsInfo implements android.os.Parcelable {
-    ctor public WpsInfo();
-    ctor public WpsInfo(android.net.wifi.WpsInfo);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public String BSSID;
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WpsInfo> CREATOR;
-    field public static final int DISPLAY = 1; // 0x1
-    field public static final int INVALID = 4; // 0x4
-    field public static final int KEYPAD = 2; // 0x2
-    field public static final int LABEL = 3; // 0x3
-    field public static final int PBC = 0; // 0x0
-    field public String pin;
-    field public int setup;
-  }
-
-}
-
-package android.net.wifi.aware {
-
-  public class AttachCallback {
-    ctor public AttachCallback();
-    method public void onAttachFailed();
-    method public void onAttached(android.net.wifi.aware.WifiAwareSession);
-  }
-
-  public final class Characteristics implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getMaxMatchFilterLength();
-    method public int getMaxServiceNameLength();
-    method public int getMaxServiceSpecificInfoLength();
-    method public int getSupportedCipherSuites();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.Characteristics> CREATOR;
-    field public static final int WIFI_AWARE_CIPHER_SUITE_NCS_SK_128 = 1; // 0x1
-    field public static final int WIFI_AWARE_CIPHER_SUITE_NCS_SK_256 = 2; // 0x2
-  }
-
-  public class DiscoverySession implements java.lang.AutoCloseable {
-    method public void close();
-    method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierOpen(@NonNull android.net.wifi.aware.PeerHandle);
-    method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(@NonNull android.net.wifi.aware.PeerHandle, @NonNull String);
-    method public void sendMessage(@NonNull android.net.wifi.aware.PeerHandle, int, @Nullable byte[]);
-  }
-
-  public class DiscoverySessionCallback {
-    ctor public DiscoverySessionCallback();
-    method public void onMessageReceived(android.net.wifi.aware.PeerHandle, byte[]);
-    method public void onMessageSendFailed(int);
-    method public void onMessageSendSucceeded(int);
-    method public void onPublishStarted(@NonNull android.net.wifi.aware.PublishDiscoverySession);
-    method public void onServiceDiscovered(android.net.wifi.aware.PeerHandle, byte[], java.util.List<byte[]>);
-    method public void onServiceDiscoveredWithinRange(android.net.wifi.aware.PeerHandle, byte[], java.util.List<byte[]>, int);
-    method public void onSessionConfigFailed();
-    method public void onSessionConfigUpdated();
-    method public void onSessionTerminated();
-    method public void onSubscribeStarted(@NonNull android.net.wifi.aware.SubscribeDiscoverySession);
-  }
-
-  public class IdentityChangedListener {
-    ctor public IdentityChangedListener();
-    method public void onIdentityChanged(byte[]);
-  }
-
-  public final class ParcelablePeerHandle extends android.net.wifi.aware.PeerHandle implements android.os.Parcelable {
-    ctor public ParcelablePeerHandle(@NonNull android.net.wifi.aware.PeerHandle);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.ParcelablePeerHandle> CREATOR;
-  }
-
-  public class PeerHandle {
-  }
-
-  public final class PublishConfig implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.PublishConfig> CREATOR;
-    field public static final int PUBLISH_TYPE_SOLICITED = 1; // 0x1
-    field public static final int PUBLISH_TYPE_UNSOLICITED = 0; // 0x0
-  }
-
-  public static final class PublishConfig.Builder {
-    ctor public PublishConfig.Builder();
-    method public android.net.wifi.aware.PublishConfig build();
-    method public android.net.wifi.aware.PublishConfig.Builder setMatchFilter(@Nullable java.util.List<byte[]>);
-    method public android.net.wifi.aware.PublishConfig.Builder setPublishType(int);
-    method public android.net.wifi.aware.PublishConfig.Builder setRangingEnabled(boolean);
-    method public android.net.wifi.aware.PublishConfig.Builder setServiceName(@NonNull String);
-    method public android.net.wifi.aware.PublishConfig.Builder setServiceSpecificInfo(@Nullable byte[]);
-    method public android.net.wifi.aware.PublishConfig.Builder setTerminateNotificationEnabled(boolean);
-    method public android.net.wifi.aware.PublishConfig.Builder setTtlSec(int);
-  }
-
-  public class PublishDiscoverySession extends android.net.wifi.aware.DiscoverySession {
-    method public void updatePublish(@NonNull android.net.wifi.aware.PublishConfig);
-  }
-
-  public final class SubscribeConfig implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.SubscribeConfig> CREATOR;
-    field public static final int SUBSCRIBE_TYPE_ACTIVE = 1; // 0x1
-    field public static final int SUBSCRIBE_TYPE_PASSIVE = 0; // 0x0
-  }
-
-  public static final class SubscribeConfig.Builder {
-    ctor public SubscribeConfig.Builder();
-    method public android.net.wifi.aware.SubscribeConfig build();
-    method public android.net.wifi.aware.SubscribeConfig.Builder setMatchFilter(@Nullable java.util.List<byte[]>);
-    method public android.net.wifi.aware.SubscribeConfig.Builder setMaxDistanceMm(int);
-    method public android.net.wifi.aware.SubscribeConfig.Builder setMinDistanceMm(int);
-    method public android.net.wifi.aware.SubscribeConfig.Builder setServiceName(@NonNull String);
-    method public android.net.wifi.aware.SubscribeConfig.Builder setServiceSpecificInfo(@Nullable byte[]);
-    method public android.net.wifi.aware.SubscribeConfig.Builder setSubscribeType(int);
-    method public android.net.wifi.aware.SubscribeConfig.Builder setTerminateNotificationEnabled(boolean);
-    method public android.net.wifi.aware.SubscribeConfig.Builder setTtlSec(int);
-  }
-
-  public class SubscribeDiscoverySession extends android.net.wifi.aware.DiscoverySession {
-    method public void updateSubscribe(@NonNull android.net.wifi.aware.SubscribeConfig);
-  }
-
-  public class WifiAwareManager {
-    method public void attach(@NonNull android.net.wifi.aware.AttachCallback, @Nullable android.os.Handler);
-    method public void attach(@NonNull android.net.wifi.aware.AttachCallback, @NonNull android.net.wifi.aware.IdentityChangedListener, @Nullable android.os.Handler);
-    method public android.net.wifi.aware.Characteristics getCharacteristics();
-    method public boolean isAvailable();
-    field public static final String ACTION_WIFI_AWARE_STATE_CHANGED = "android.net.wifi.aware.action.WIFI_AWARE_STATE_CHANGED";
-    field public static final int WIFI_AWARE_DATA_PATH_ROLE_INITIATOR = 0; // 0x0
-    field public static final int WIFI_AWARE_DATA_PATH_ROLE_RESPONDER = 1; // 0x1
-  }
-
-  public final class WifiAwareNetworkInfo implements android.os.Parcelable android.net.TransportInfo {
-    method public int describeContents();
-    method @Nullable public java.net.Inet6Address getPeerIpv6Addr();
-    method public int getPort();
-    method public int getTransportProtocol();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.WifiAwareNetworkInfo> CREATOR;
-  }
-
-  public final class WifiAwareNetworkSpecifier extends android.net.NetworkSpecifier implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.aware.WifiAwareNetworkSpecifier> CREATOR;
-  }
-
-  public static final class WifiAwareNetworkSpecifier.Builder {
-    ctor public WifiAwareNetworkSpecifier.Builder(@NonNull android.net.wifi.aware.DiscoverySession, @NonNull android.net.wifi.aware.PeerHandle);
-    method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier build();
-    method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setPmk(@NonNull byte[]);
-    method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setPort(@IntRange(from=0, to=65535) int);
-    method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setPskPassphrase(@NonNull String);
-    method @NonNull public android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder setTransportProtocol(@IntRange(from=0, to=255) int);
-  }
-
-  public class WifiAwareSession implements java.lang.AutoCloseable {
-    method public void close();
-    method public android.net.NetworkSpecifier createNetworkSpecifierOpen(int, @NonNull byte[]);
-    method public android.net.NetworkSpecifier createNetworkSpecifierPassphrase(int, @NonNull byte[], @NonNull String);
-    method public void publish(@NonNull android.net.wifi.aware.PublishConfig, @NonNull android.net.wifi.aware.DiscoverySessionCallback, @Nullable android.os.Handler);
-    method public void subscribe(@NonNull android.net.wifi.aware.SubscribeConfig, @NonNull android.net.wifi.aware.DiscoverySessionCallback, @Nullable android.os.Handler);
-  }
-
-}
-
-package android.net.wifi.hotspot2 {
-
-  public final class ConfigParser {
-    method public static android.net.wifi.hotspot2.PasspointConfiguration parsePasspointConfig(String, byte[]);
-  }
-
-  public final class PasspointConfiguration implements android.os.Parcelable {
-    ctor public PasspointConfiguration();
-    ctor public PasspointConfiguration(android.net.wifi.hotspot2.PasspointConfiguration);
-    method public int describeContents();
-    method public android.net.wifi.hotspot2.pps.Credential getCredential();
-    method public android.net.wifi.hotspot2.pps.HomeSp getHomeSp();
-    method public long getSubscriptionExpirationTimeMillis();
-    method @NonNull public String getUniqueId();
-    method public boolean isOsuProvisioned();
-    method public void setCredential(android.net.wifi.hotspot2.pps.Credential);
-    method public void setHomeSp(android.net.wifi.hotspot2.pps.HomeSp);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.PasspointConfiguration> CREATOR;
-  }
-
-}
-
-package android.net.wifi.hotspot2.omadm {
-
-  public final class PpsMoParser {
-    method public static android.net.wifi.hotspot2.PasspointConfiguration parseMoText(String);
-  }
-
-}
-
-package android.net.wifi.hotspot2.pps {
-
-  public final class Credential implements android.os.Parcelable {
-    ctor public Credential();
-    ctor public Credential(android.net.wifi.hotspot2.pps.Credential);
-    method public int describeContents();
-    method public java.security.cert.X509Certificate getCaCertificate();
-    method public android.net.wifi.hotspot2.pps.Credential.CertificateCredential getCertCredential();
-    method public java.security.cert.X509Certificate[] getClientCertificateChain();
-    method public java.security.PrivateKey getClientPrivateKey();
-    method public String getRealm();
-    method public android.net.wifi.hotspot2.pps.Credential.SimCredential getSimCredential();
-    method public android.net.wifi.hotspot2.pps.Credential.UserCredential getUserCredential();
-    method public void setCaCertificate(java.security.cert.X509Certificate);
-    method public void setCertCredential(android.net.wifi.hotspot2.pps.Credential.CertificateCredential);
-    method public void setClientCertificateChain(java.security.cert.X509Certificate[]);
-    method public void setClientPrivateKey(java.security.PrivateKey);
-    method public void setRealm(String);
-    method public void setSimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential);
-    method public void setUserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential> CREATOR;
-  }
-
-  public static final class Credential.CertificateCredential implements android.os.Parcelable {
-    ctor public Credential.CertificateCredential();
-    ctor public Credential.CertificateCredential(android.net.wifi.hotspot2.pps.Credential.CertificateCredential);
-    method public int describeContents();
-    method public byte[] getCertSha256Fingerprint();
-    method public String getCertType();
-    method public void setCertSha256Fingerprint(byte[]);
-    method public void setCertType(String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.CertificateCredential> CREATOR;
-  }
-
-  public static final class Credential.SimCredential implements android.os.Parcelable {
-    ctor public Credential.SimCredential();
-    ctor public Credential.SimCredential(android.net.wifi.hotspot2.pps.Credential.SimCredential);
-    method public int describeContents();
-    method public int getEapType();
-    method public String getImsi();
-    method public void setEapType(int);
-    method public void setImsi(String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.SimCredential> CREATOR;
-  }
-
-  public static final class Credential.UserCredential implements android.os.Parcelable {
-    ctor public Credential.UserCredential();
-    ctor public Credential.UserCredential(android.net.wifi.hotspot2.pps.Credential.UserCredential);
-    method public int describeContents();
-    method public int getEapType();
-    method public String getNonEapInnerMethod();
-    method public String getPassword();
-    method public String getUsername();
-    method public void setEapType(int);
-    method public void setNonEapInnerMethod(String);
-    method public void setPassword(String);
-    method public void setUsername(String);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.Credential.UserCredential> CREATOR;
-  }
-
-  public final class HomeSp implements android.os.Parcelable {
-    ctor public HomeSp();
-    ctor public HomeSp(android.net.wifi.hotspot2.pps.HomeSp);
-    method public int describeContents();
-    method public String getFqdn();
-    method public String getFriendlyName();
-    method public long[] getRoamingConsortiumOis();
-    method public void setFqdn(String);
-    method public void setFriendlyName(String);
-    method public void setRoamingConsortiumOis(long[]);
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.pps.HomeSp> CREATOR;
-  }
-
-}
-
-package android.net.wifi.p2p {
-
-  public class WifiP2pConfig implements android.os.Parcelable {
-    ctor public WifiP2pConfig();
-    ctor public WifiP2pConfig(android.net.wifi.p2p.WifiP2pConfig);
-    method public int describeContents();
-    method public int getGroupOwnerBand();
-    method public int getNetworkId();
-    method @Nullable public String getNetworkName();
-    method @Nullable public String getPassphrase();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pConfig> CREATOR;
-    field public static final int GROUP_OWNER_BAND_2GHZ = 1; // 0x1
-    field public static final int GROUP_OWNER_BAND_5GHZ = 2; // 0x2
-    field public static final int GROUP_OWNER_BAND_AUTO = 0; // 0x0
-    field public static final int GROUP_OWNER_INTENT_AUTO = -1; // 0xffffffff
-    field public static final int GROUP_OWNER_INTENT_MAX = 15; // 0xf
-    field public static final int GROUP_OWNER_INTENT_MIN = 0; // 0x0
-    field public String deviceAddress;
-    field @IntRange(from=0, to=15) public int groupOwnerIntent;
-    field public android.net.wifi.WpsInfo wps;
-  }
-
-  public static final class WifiP2pConfig.Builder {
-    ctor public WifiP2pConfig.Builder();
-    method @NonNull public android.net.wifi.p2p.WifiP2pConfig build();
-    method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder enablePersistentMode(boolean);
-    method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder setDeviceAddress(@Nullable android.net.MacAddress);
-    method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder setGroupOperatingBand(int);
-    method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder setGroupOperatingFrequency(int);
-    method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder setNetworkName(@NonNull String);
-    method @NonNull public android.net.wifi.p2p.WifiP2pConfig.Builder setPassphrase(@NonNull String);
-  }
-
-  public class WifiP2pDevice implements android.os.Parcelable {
-    ctor public WifiP2pDevice();
-    ctor public WifiP2pDevice(android.net.wifi.p2p.WifiP2pDevice);
-    method public int describeContents();
-    method @Nullable public android.net.wifi.p2p.WifiP2pWfdInfo getWfdInfo();
-    method public boolean isGroupOwner();
-    method public boolean isServiceDiscoveryCapable();
-    method public void update(@NonNull android.net.wifi.p2p.WifiP2pDevice);
-    method public boolean wpsDisplaySupported();
-    method public boolean wpsKeypadSupported();
-    method public boolean wpsPbcSupported();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int AVAILABLE = 3; // 0x3
-    field public static final int CONNECTED = 0; // 0x0
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pDevice> CREATOR;
-    field public static final int FAILED = 2; // 0x2
-    field public static final int INVITED = 1; // 0x1
-    field public static final int UNAVAILABLE = 4; // 0x4
-    field public String deviceAddress;
-    field public String deviceName;
-    field public String primaryDeviceType;
-    field public String secondaryDeviceType;
-    field public int status;
-  }
-
-  public class WifiP2pDeviceList implements android.os.Parcelable {
-    ctor public WifiP2pDeviceList();
-    ctor public WifiP2pDeviceList(android.net.wifi.p2p.WifiP2pDeviceList);
-    method public int describeContents();
-    method public android.net.wifi.p2p.WifiP2pDevice get(String);
-    method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getDeviceList();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pDeviceList> CREATOR;
-  }
-
-  public class WifiP2pGroup implements android.os.Parcelable {
-    ctor public WifiP2pGroup();
-    ctor public WifiP2pGroup(android.net.wifi.p2p.WifiP2pGroup);
-    method public int describeContents();
-    method public java.util.Collection<android.net.wifi.p2p.WifiP2pDevice> getClientList();
-    method public int getFrequency();
-    method public String getInterface();
-    method public int getNetworkId();
-    method public String getNetworkName();
-    method public android.net.wifi.p2p.WifiP2pDevice getOwner();
-    method public String getPassphrase();
-    method public boolean isGroupOwner();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pGroup> CREATOR;
-    field public static final int NETWORK_ID_PERSISTENT = -2; // 0xfffffffe
-    field public static final int NETWORK_ID_TEMPORARY = -1; // 0xffffffff
-  }
-
-  public class WifiP2pInfo implements android.os.Parcelable {
-    ctor public WifiP2pInfo();
-    ctor public WifiP2pInfo(android.net.wifi.p2p.WifiP2pInfo);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pInfo> CREATOR;
-    field public boolean groupFormed;
-    field public java.net.InetAddress groupOwnerAddress;
-    field public boolean isGroupOwner;
-  }
-
-  public class WifiP2pManager {
-    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void addLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method public void addServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method public void cancelConnect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method public void clearLocalServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method public void clearServiceRequests(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void connect(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pConfig, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void createGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void createGroup(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pConfig, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void discoverPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void discoverServices(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method public android.net.wifi.p2p.WifiP2pManager.Channel initialize(android.content.Context, android.os.Looper, android.net.wifi.p2p.WifiP2pManager.ChannelListener);
-    method public void removeGroup(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method public void removeLocalService(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceInfo, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method public void removeServiceRequest(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.nsd.WifiP2pServiceRequest, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method public void requestConnectionInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestDeviceInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DeviceInfoListener);
-    method public void requestDiscoveryState(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.DiscoveryStateListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestGroupInfo(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.GroupInfoListener);
-    method public void requestNetworkInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.NetworkInfoListener);
-    method public void requestP2pState(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pManager.P2pStateListener);
-    method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public void requestPeers(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.PeerListListener);
-    method public void setDnsSdResponseListeners(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.DnsSdServiceResponseListener, android.net.wifi.p2p.WifiP2pManager.DnsSdTxtRecordListener);
-    method public void setServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ServiceResponseListener);
-    method public void setUpnpServiceResponseListener(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.UpnpServiceResponseListener);
-    method public void stopPeerDiscovery(android.net.wifi.p2p.WifiP2pManager.Channel, android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    field public static final int BUSY = 2; // 0x2
-    field public static final int ERROR = 0; // 0x0
-    field public static final String EXTRA_DISCOVERY_STATE = "discoveryState";
-    field public static final String EXTRA_NETWORK_INFO = "networkInfo";
-    field public static final String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList";
-    field public static final String EXTRA_WIFI_P2P_DEVICE = "wifiP2pDevice";
-    field public static final String EXTRA_WIFI_P2P_GROUP = "p2pGroupInfo";
-    field public static final String EXTRA_WIFI_P2P_INFO = "wifiP2pInfo";
-    field public static final String EXTRA_WIFI_STATE = "wifi_p2p_state";
-    field public static final int NO_SERVICE_REQUESTS = 3; // 0x3
-    field public static final int P2P_UNSUPPORTED = 1; // 0x1
-    field public static final String WIFI_P2P_CONNECTION_CHANGED_ACTION = "android.net.wifi.p2p.CONNECTION_STATE_CHANGE";
-    field public static final String WIFI_P2P_DISCOVERY_CHANGED_ACTION = "android.net.wifi.p2p.DISCOVERY_STATE_CHANGE";
-    field public static final int WIFI_P2P_DISCOVERY_STARTED = 2; // 0x2
-    field public static final int WIFI_P2P_DISCOVERY_STOPPED = 1; // 0x1
-    field public static final String WIFI_P2P_PEERS_CHANGED_ACTION = "android.net.wifi.p2p.PEERS_CHANGED";
-    field public static final String WIFI_P2P_STATE_CHANGED_ACTION = "android.net.wifi.p2p.STATE_CHANGED";
-    field public static final int WIFI_P2P_STATE_DISABLED = 1; // 0x1
-    field public static final int WIFI_P2P_STATE_ENABLED = 2; // 0x2
-    field public static final String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION = "android.net.wifi.p2p.THIS_DEVICE_CHANGED";
-  }
-
-  public static interface WifiP2pManager.ActionListener {
-    method public void onFailure(int);
-    method public void onSuccess();
-  }
-
-  public static class WifiP2pManager.Channel implements java.lang.AutoCloseable {
-    method public void close();
-  }
-
-  public static interface WifiP2pManager.ChannelListener {
-    method public void onChannelDisconnected();
-  }
-
-  public static interface WifiP2pManager.ConnectionInfoListener {
-    method public void onConnectionInfoAvailable(android.net.wifi.p2p.WifiP2pInfo);
-  }
-
-  public static interface WifiP2pManager.DeviceInfoListener {
-    method public void onDeviceInfoAvailable(@Nullable android.net.wifi.p2p.WifiP2pDevice);
-  }
-
-  public static interface WifiP2pManager.DiscoveryStateListener {
-    method public void onDiscoveryStateAvailable(int);
-  }
-
-  public static interface WifiP2pManager.DnsSdServiceResponseListener {
-    method public void onDnsSdServiceAvailable(String, String, android.net.wifi.p2p.WifiP2pDevice);
-  }
-
-  public static interface WifiP2pManager.DnsSdTxtRecordListener {
-    method public void onDnsSdTxtRecordAvailable(String, java.util.Map<java.lang.String,java.lang.String>, android.net.wifi.p2p.WifiP2pDevice);
-  }
-
-  public static interface WifiP2pManager.GroupInfoListener {
-    method public void onGroupInfoAvailable(android.net.wifi.p2p.WifiP2pGroup);
-  }
-
-  public static interface WifiP2pManager.NetworkInfoListener {
-    method public void onNetworkInfoAvailable(@NonNull android.net.NetworkInfo);
-  }
-
-  public static interface WifiP2pManager.P2pStateListener {
-    method public void onP2pStateAvailable(int);
-  }
-
-  public static interface WifiP2pManager.PeerListListener {
-    method public void onPeersAvailable(android.net.wifi.p2p.WifiP2pDeviceList);
-  }
-
-  public static interface WifiP2pManager.ServiceResponseListener {
-    method public void onServiceAvailable(int, byte[], android.net.wifi.p2p.WifiP2pDevice);
-  }
-
-  public static interface WifiP2pManager.UpnpServiceResponseListener {
-    method public void onUpnpServiceAvailable(java.util.List<java.lang.String>, android.net.wifi.p2p.WifiP2pDevice);
-  }
-
-  public final class WifiP2pWfdInfo implements android.os.Parcelable {
-    ctor public WifiP2pWfdInfo();
-    ctor public WifiP2pWfdInfo(@Nullable android.net.wifi.p2p.WifiP2pWfdInfo);
-    method public int describeContents();
-    method public int getControlPort();
-    method public int getDeviceType();
-    method public int getMaxThroughput();
-    method public boolean isContentProtectionSupported();
-    method public boolean isEnabled();
-    method public boolean isSessionAvailable();
-    method public void setContentProtectionSupported(boolean);
-    method public void setControlPort(@IntRange(from=0) int);
-    method public boolean setDeviceType(int);
-    method public void setEnabled(boolean);
-    method public void setMaxThroughput(@IntRange(from=0) int);
-    method public void setSessionAvailable(boolean);
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pWfdInfo> CREATOR;
-    field public static final int DEVICE_TYPE_PRIMARY_SINK = 1; // 0x1
-    field public static final int DEVICE_TYPE_SECONDARY_SINK = 2; // 0x2
-    field public static final int DEVICE_TYPE_SOURCE_OR_PRIMARY_SINK = 3; // 0x3
-    field public static final int DEVICE_TYPE_WFD_SOURCE = 0; // 0x0
-  }
-
-}
-
-package android.net.wifi.p2p.nsd {
-
-  public class WifiP2pDnsSdServiceInfo extends android.net.wifi.p2p.nsd.WifiP2pServiceInfo {
-    method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo newInstance(String, String, java.util.Map<java.lang.String,java.lang.String>);
-  }
-
-  public class WifiP2pDnsSdServiceRequest extends android.net.wifi.p2p.nsd.WifiP2pServiceRequest {
-    method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance();
-    method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(String);
-    method public static android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest newInstance(String, String);
-  }
-
-  public class WifiP2pServiceInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int SERVICE_TYPE_ALL = 0; // 0x0
-    field public static final int SERVICE_TYPE_BONJOUR = 1; // 0x1
-    field public static final int SERVICE_TYPE_UPNP = 2; // 0x2
-    field public static final int SERVICE_TYPE_VENDOR_SPECIFIC = 255; // 0xff
-  }
-
-  public class WifiP2pServiceRequest implements android.os.Parcelable {
-    method public int describeContents();
-    method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int, String);
-    method public static android.net.wifi.p2p.nsd.WifiP2pServiceRequest newInstance(int);
-    method public void writeToParcel(android.os.Parcel, int);
-  }
-
-  public class WifiP2pUpnpServiceInfo extends android.net.wifi.p2p.nsd.WifiP2pServiceInfo {
-    method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo newInstance(String, String, java.util.List<java.lang.String>);
-  }
-
-  public class WifiP2pUpnpServiceRequest extends android.net.wifi.p2p.nsd.WifiP2pServiceRequest {
-    method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance();
-    method public static android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest newInstance(String);
-  }
-
-}
-
-package android.net.wifi.rtt {
-
-  public class CivicLocationKeys {
-    field public static final int ADDITIONAL_CODE = 32; // 0x20
-    field public static final int APT = 26; // 0x1a
-    field public static final int BOROUGH = 4; // 0x4
-    field public static final int BRANCH_ROAD_NAME = 36; // 0x24
-    field public static final int BUILDING = 25; // 0x19
-    field public static final int CITY = 3; // 0x3
-    field public static final int COUNTY = 2; // 0x2
-    field public static final int DESK = 33; // 0x21
-    field public static final int FLOOR = 27; // 0x1b
-    field public static final int GROUP_OF_STREETS = 6; // 0x6
-    field public static final int HNO = 19; // 0x13
-    field public static final int HNS = 20; // 0x14
-    field public static final int LANGUAGE = 0; // 0x0
-    field public static final int LMK = 21; // 0x15
-    field public static final int LOC = 22; // 0x16
-    field public static final int NAM = 23; // 0x17
-    field public static final int NEIGHBORHOOD = 5; // 0x5
-    field public static final int PCN = 30; // 0x1e
-    field public static final int POD = 17; // 0x11
-    field public static final int POSTAL_CODE = 24; // 0x18
-    field public static final int PO_BOX = 31; // 0x1f
-    field public static final int PRD = 16; // 0x10
-    field public static final int PRIMARY_ROAD_NAME = 34; // 0x22
-    field public static final int ROAD_SECTION = 35; // 0x23
-    field public static final int ROOM = 28; // 0x1c
-    field public static final int SCRIPT = 128; // 0x80
-    field public static final int STATE = 1; // 0x1
-    field public static final int STREET_NAME_POST_MODIFIER = 39; // 0x27
-    field public static final int STREET_NAME_PRE_MODIFIER = 38; // 0x26
-    field public static final int STS = 18; // 0x12
-    field public static final int SUBBRANCH_ROAD_NAME = 37; // 0x25
-    field public static final int TYPE_OF_PLACE = 29; // 0x1d
-  }
-
-  public final class RangingRequest implements android.os.Parcelable {
-    method public int describeContents();
-    method public static int getMaxPeers();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.rtt.RangingRequest> CREATOR;
-  }
-
-  public static final class RangingRequest.Builder {
-    ctor public RangingRequest.Builder();
-    method public android.net.wifi.rtt.RangingRequest.Builder addAccessPoint(@NonNull android.net.wifi.ScanResult);
-    method public android.net.wifi.rtt.RangingRequest.Builder addAccessPoints(@NonNull java.util.List<android.net.wifi.ScanResult>);
-    method public android.net.wifi.rtt.RangingRequest.Builder addWifiAwarePeer(@NonNull android.net.MacAddress);
-    method public android.net.wifi.rtt.RangingRequest.Builder addWifiAwarePeer(@NonNull android.net.wifi.aware.PeerHandle);
-    method public android.net.wifi.rtt.RangingRequest build();
-  }
-
-  public final class RangingResult implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getDistanceMm();
-    method public int getDistanceStdDevMm();
-    method @Nullable public android.net.MacAddress getMacAddress();
-    method public int getNumAttemptedMeasurements();
-    method public int getNumSuccessfulMeasurements();
-    method @Nullable public android.net.wifi.aware.PeerHandle getPeerHandle();
-    method public long getRangingTimestampMillis();
-    method public int getRssi();
-    method public int getStatus();
-    method @Nullable public android.net.wifi.rtt.ResponderLocation getUnverifiedResponderLocation();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.rtt.RangingResult> CREATOR;
-    field public static final int STATUS_FAIL = 1; // 0x1
-    field public static final int STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC = 2; // 0x2
-    field public static final int STATUS_SUCCESS = 0; // 0x0
-  }
-
-  public abstract class RangingResultCallback {
-    ctor public RangingResultCallback();
-    method public abstract void onRangingFailure(int);
-    method public abstract void onRangingResults(@NonNull java.util.List<android.net.wifi.rtt.RangingResult>);
-    field public static final int STATUS_CODE_FAIL = 1; // 0x1
-    field public static final int STATUS_CODE_FAIL_RTT_NOT_AVAILABLE = 2; // 0x2
-  }
-
-  public final class ResponderLocation implements android.os.Parcelable {
-    method public int describeContents();
-    method public double getAltitude();
-    method public int getAltitudeType();
-    method public double getAltitudeUncertainty();
-    method public java.util.List<android.net.MacAddress> getColocatedBssids();
-    method public int getDatum();
-    method public int getExpectedToMove();
-    method public double getFloorNumber();
-    method public double getHeightAboveFloorMeters();
-    method public double getHeightAboveFloorUncertaintyMeters();
-    method public double getLatitude();
-    method public double getLatitudeUncertainty();
-    method public int getLciVersion();
-    method public double getLongitude();
-    method public double getLongitudeUncertainty();
-    method @Nullable public String getMapImageMimeType();
-    method @Nullable public android.net.Uri getMapImageUri();
-    method public boolean getRegisteredLocationAgreementIndication();
-    method public boolean isLciSubelementValid();
-    method public boolean isZaxisSubelementValid();
-    method @Nullable public android.location.Address toCivicLocationAddress();
-    method @Nullable public android.util.SparseArray<java.lang.String> toCivicLocationSparseArray();
-    method @NonNull public android.location.Location toLocation();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int ALTITUDE_FLOORS = 2; // 0x2
-    field public static final int ALTITUDE_METERS = 1; // 0x1
-    field public static final int ALTITUDE_UNDEFINED = 0; // 0x0
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.rtt.ResponderLocation> CREATOR;
-    field public static final int DATUM_NAD83_MLLW = 3; // 0x3
-    field public static final int DATUM_NAD83_NAV88 = 2; // 0x2
-    field public static final int DATUM_UNDEFINED = 0; // 0x0
-    field public static final int DATUM_WGS84 = 1; // 0x1
-    field public static final int LCI_VERSION_1 = 1; // 0x1
-    field public static final int LOCATION_FIXED = 0; // 0x0
-    field public static final int LOCATION_MOVEMENT_UNKNOWN = 2; // 0x2
-    field public static final int LOCATION_RESERVED = 3; // 0x3
-    field public static final int LOCATION_VARIABLE = 1; // 0x1
-  }
-
-  public class WifiRttManager {
-    method public boolean isAvailable();
-    method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.ACCESS_WIFI_STATE}) public void startRanging(@NonNull android.net.wifi.rtt.RangingRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.rtt.RangingResultCallback);
-    field public static final String ACTION_WIFI_RTT_STATE_CHANGED = "android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED";
-  }
-
-}
-
diff --git a/wifi/api/lint-baseline.txt b/wifi/api/lint-baseline.txt
deleted file mode 100644
index 892411f..0000000
--- a/wifi/api/lint-baseline.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-// Baseline format: 1.0
-GenericException: android.net.wifi.WifiManager.LocalOnlyHotspotReservation#finalize():
-    Methods must not throw generic exceptions (`java.lang.Throwable`)
-GenericException: android.net.wifi.WifiManager.MulticastLock#finalize():
-    Methods must not throw generic exceptions (`java.lang.Throwable`)
-GenericException: android.net.wifi.WifiManager.WifiLock#finalize():
-    Methods must not throw generic exceptions (`java.lang.Throwable`)
-
-
-VisiblySynchronized: PsiThisExpression:WifiManager.this:
-    Internal locks must not be exposed (synchronizing on this or class is still externally observable): method android.net.wifi.WifiManager.WifiLock.finalize()
-VisiblySynchronized: android.net.wifi.WifiManager.WifiLock#finalize():
-    Internal locks must not be exposed (synchronizing on this or class is still externally observable): method android.net.wifi.WifiManager.WifiLock.finalize()
diff --git a/wifi/api/module-lib-current.txt b/wifi/api/module-lib-current.txt
deleted file mode 100644
index d802177..0000000
--- a/wifi/api/module-lib-current.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/wifi/api/module-lib-removed.txt b/wifi/api/module-lib-removed.txt
deleted file mode 100644
index d802177..0000000
--- a/wifi/api/module-lib-removed.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/wifi/api/removed.txt b/wifi/api/removed.txt
deleted file mode 100644
index d802177..0000000
--- a/wifi/api/removed.txt
+++ /dev/null
@@ -1 +0,0 @@
-// Signature format: 2.0
diff --git a/wifi/api/system-current.txt b/wifi/api/system-current.txt
deleted file mode 100644
index 07793c1..0000000
--- a/wifi/api/system-current.txt
+++ /dev/null
@@ -1,939 +0,0 @@
-// Signature format: 2.0
-package android.net.wifi {
-
-  public abstract class EasyConnectStatusCallback {
-    ctor public EasyConnectStatusCallback();
-    method public abstract void onConfiguratorSuccess(int);
-    method public abstract void onEnrolleeSuccess(int);
-    method public void onFailure(int);
-    method public void onFailure(int, @Nullable String, @NonNull android.util.SparseArray<int[]>, @NonNull int[]);
-    method public abstract void onProgress(int);
-    field public static final int EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS = 0; // 0x0
-    field public static final int EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_ACCEPTED = 3; // 0x3
-    field public static final int EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_SENT_WAITING_RESPONSE = 2; // 0x2
-    field public static final int EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING = 1; // 0x1
-    field public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED = 1; // 0x1
-    field public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT = 0; // 0x0
-  }
-
-  @Deprecated public class RttManager {
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void disableResponder(android.net.wifi.RttManager.ResponderCallback);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void enableResponder(android.net.wifi.RttManager.ResponderCallback);
-    method @Deprecated public android.net.wifi.RttManager.Capabilities getCapabilities();
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public android.net.wifi.RttManager.RttCapabilities getRttCapabilities();
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startRanging(android.net.wifi.RttManager.RttParams[], android.net.wifi.RttManager.RttListener);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopRanging(android.net.wifi.RttManager.RttListener);
-    field @Deprecated public static final int BASE = 160256; // 0x27200
-    field @Deprecated public static final int CMD_OP_ABORTED = 160260; // 0x27204
-    field @Deprecated public static final int CMD_OP_DISABLE_RESPONDER = 160262; // 0x27206
-    field @Deprecated public static final int CMD_OP_ENABLE_RESPONDER = 160261; // 0x27205
-    field @Deprecated public static final int CMD_OP_ENALBE_RESPONDER_FAILED = 160264; // 0x27208
-    field @Deprecated public static final int CMD_OP_ENALBE_RESPONDER_SUCCEEDED = 160263; // 0x27207
-    field @Deprecated public static final int CMD_OP_FAILED = 160258; // 0x27202
-    field @Deprecated public static final int CMD_OP_START_RANGING = 160256; // 0x27200
-    field @Deprecated public static final int CMD_OP_STOP_RANGING = 160257; // 0x27201
-    field @Deprecated public static final int CMD_OP_SUCCEEDED = 160259; // 0x27203
-    field @Deprecated public static final String DESCRIPTION_KEY = "android.net.wifi.RttManager.Description";
-    field @Deprecated public static final int PREAMBLE_HT = 2; // 0x2
-    field @Deprecated public static final int PREAMBLE_LEGACY = 1; // 0x1
-    field @Deprecated public static final int PREAMBLE_VHT = 4; // 0x4
-    field @Deprecated public static final int REASON_INITIATOR_NOT_ALLOWED_WHEN_RESPONDER_ON = -6; // 0xfffffffa
-    field @Deprecated public static final int REASON_INVALID_LISTENER = -3; // 0xfffffffd
-    field @Deprecated public static final int REASON_INVALID_REQUEST = -4; // 0xfffffffc
-    field @Deprecated public static final int REASON_NOT_AVAILABLE = -2; // 0xfffffffe
-    field @Deprecated public static final int REASON_PERMISSION_DENIED = -5; // 0xfffffffb
-    field @Deprecated public static final int REASON_UNSPECIFIED = -1; // 0xffffffff
-    field @Deprecated public static final int RTT_BW_10_SUPPORT = 2; // 0x2
-    field @Deprecated public static final int RTT_BW_160_SUPPORT = 32; // 0x20
-    field @Deprecated public static final int RTT_BW_20_SUPPORT = 4; // 0x4
-    field @Deprecated public static final int RTT_BW_40_SUPPORT = 8; // 0x8
-    field @Deprecated public static final int RTT_BW_5_SUPPORT = 1; // 0x1
-    field @Deprecated public static final int RTT_BW_80_SUPPORT = 16; // 0x10
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_10 = 6; // 0x6
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_160 = 3; // 0x3
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_20 = 0; // 0x0
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_40 = 1; // 0x1
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_5 = 5; // 0x5
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_80 = 2; // 0x2
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_80P80 = 4; // 0x4
-    field @Deprecated public static final int RTT_CHANNEL_WIDTH_UNSPECIFIED = -1; // 0xffffffff
-    field @Deprecated public static final int RTT_PEER_NAN = 5; // 0x5
-    field @Deprecated public static final int RTT_PEER_P2P_CLIENT = 4; // 0x4
-    field @Deprecated public static final int RTT_PEER_P2P_GO = 3; // 0x3
-    field @Deprecated public static final int RTT_PEER_TYPE_AP = 1; // 0x1
-    field @Deprecated public static final int RTT_PEER_TYPE_STA = 2; // 0x2
-    field @Deprecated public static final int RTT_PEER_TYPE_UNSPECIFIED = 0; // 0x0
-    field @Deprecated public static final int RTT_STATUS_ABORTED = 8; // 0x8
-    field @Deprecated public static final int RTT_STATUS_FAILURE = 1; // 0x1
-    field @Deprecated public static final int RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL = 6; // 0x6
-    field @Deprecated public static final int RTT_STATUS_FAIL_BUSY_TRY_LATER = 12; // 0xc
-    field @Deprecated public static final int RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE = 15; // 0xf
-    field @Deprecated public static final int RTT_STATUS_FAIL_INVALID_TS = 9; // 0x9
-    field @Deprecated public static final int RTT_STATUS_FAIL_NOT_SCHEDULED_YET = 4; // 0x4
-    field @Deprecated public static final int RTT_STATUS_FAIL_NO_CAPABILITY = 7; // 0x7
-    field @Deprecated public static final int RTT_STATUS_FAIL_NO_RSP = 2; // 0x2
-    field @Deprecated public static final int RTT_STATUS_FAIL_PROTOCOL = 10; // 0xa
-    field @Deprecated public static final int RTT_STATUS_FAIL_REJECTED = 3; // 0x3
-    field @Deprecated public static final int RTT_STATUS_FAIL_SCHEDULE = 11; // 0xb
-    field @Deprecated public static final int RTT_STATUS_FAIL_TM_TIMEOUT = 5; // 0x5
-    field @Deprecated public static final int RTT_STATUS_INVALID_REQ = 13; // 0xd
-    field @Deprecated public static final int RTT_STATUS_NO_WIFI = 14; // 0xe
-    field @Deprecated public static final int RTT_STATUS_SUCCESS = 0; // 0x0
-    field @Deprecated public static final int RTT_TYPE_11_MC = 4; // 0x4
-    field @Deprecated public static final int RTT_TYPE_11_V = 2; // 0x2
-    field @Deprecated public static final int RTT_TYPE_ONE_SIDED = 1; // 0x1
-    field @Deprecated public static final int RTT_TYPE_TWO_SIDED = 2; // 0x2
-    field @Deprecated public static final int RTT_TYPE_UNSPECIFIED = 0; // 0x0
-  }
-
-  @Deprecated public class RttManager.Capabilities {
-    ctor @Deprecated public RttManager.Capabilities();
-    field @Deprecated public int supportedPeerType;
-    field @Deprecated public int supportedType;
-  }
-
-  @Deprecated public static class RttManager.ParcelableRttParams implements android.os.Parcelable {
-    field @Deprecated @NonNull public android.net.wifi.RttManager.RttParams[] mParams;
-  }
-
-  @Deprecated public static class RttManager.ParcelableRttResults implements android.os.Parcelable {
-    ctor @Deprecated public RttManager.ParcelableRttResults(android.net.wifi.RttManager.RttResult[]);
-    field @Deprecated public android.net.wifi.RttManager.RttResult[] mResults;
-  }
-
-  @Deprecated public abstract static class RttManager.ResponderCallback {
-    ctor @Deprecated public RttManager.ResponderCallback();
-    method @Deprecated public abstract void onResponderEnableFailure(int);
-    method @Deprecated public abstract void onResponderEnabled(android.net.wifi.RttManager.ResponderConfig);
-  }
-
-  @Deprecated public static class RttManager.ResponderConfig implements android.os.Parcelable {
-    ctor @Deprecated public RttManager.ResponderConfig();
-    method @Deprecated public int describeContents();
-    method @Deprecated public void writeToParcel(android.os.Parcel, int);
-    field @Deprecated @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.RttManager.ResponderConfig> CREATOR;
-    field @Deprecated public int centerFreq0;
-    field @Deprecated public int centerFreq1;
-    field @Deprecated public int channelWidth;
-    field @Deprecated public int frequency;
-    field @Deprecated public String macAddress;
-    field @Deprecated public int preamble;
-  }
-
-  @Deprecated public static class RttManager.RttCapabilities implements android.os.Parcelable {
-    ctor @Deprecated public RttManager.RttCapabilities();
-    field @Deprecated public int bwSupported;
-    field @Deprecated public boolean lciSupported;
-    field @Deprecated public boolean lcrSupported;
-    field @Deprecated public int mcVersion;
-    field @Deprecated public boolean oneSidedRttSupported;
-    field @Deprecated public int preambleSupported;
-    field @Deprecated public boolean responderSupported;
-    field @Deprecated public boolean secureRttSupported;
-    field @Deprecated public boolean supportedPeerType;
-    field @Deprecated public boolean supportedType;
-    field @Deprecated public boolean twoSided11McRttSupported;
-  }
-
-  @Deprecated public static interface RttManager.RttListener {
-    method @Deprecated public void onAborted();
-    method @Deprecated public void onFailure(int, String);
-    method @Deprecated public void onSuccess(android.net.wifi.RttManager.RttResult[]);
-  }
-
-  @Deprecated public static class RttManager.RttParams {
-    ctor @Deprecated public RttManager.RttParams();
-    field @Deprecated public boolean LCIRequest;
-    field @Deprecated public boolean LCRRequest;
-    field @Deprecated public int bandwidth;
-    field @Deprecated public String bssid;
-    field @Deprecated public int burstTimeout;
-    field @Deprecated public int centerFreq0;
-    field @Deprecated public int centerFreq1;
-    field @Deprecated public int channelWidth;
-    field @Deprecated public int deviceType;
-    field @Deprecated public int frequency;
-    field @Deprecated public int interval;
-    field @Deprecated public int numRetriesPerFTMR;
-    field @Deprecated public int numRetriesPerMeasurementFrame;
-    field @Deprecated public int numSamplesPerBurst;
-    field @Deprecated public int num_retries;
-    field @Deprecated public int num_samples;
-    field @Deprecated public int numberBurst;
-    field @Deprecated public int preamble;
-    field @Deprecated public int requestType;
-    field @Deprecated public boolean secure;
-  }
-
-  @Deprecated public static class RttManager.RttResult {
-    ctor @Deprecated public RttManager.RttResult();
-    field @Deprecated public android.net.wifi.RttManager.WifiInformationElement LCI;
-    field @Deprecated public android.net.wifi.RttManager.WifiInformationElement LCR;
-    field @Deprecated public String bssid;
-    field @Deprecated public int burstDuration;
-    field @Deprecated public int burstNumber;
-    field @Deprecated public int distance;
-    field @Deprecated public int distanceSpread;
-    field @Deprecated public int distanceStandardDeviation;
-    field @Deprecated public int distance_cm;
-    field @Deprecated public int distance_sd_cm;
-    field @Deprecated public int distance_spread_cm;
-    field @Deprecated public int frameNumberPerBurstPeer;
-    field @Deprecated public int measurementFrameNumber;
-    field @Deprecated public int measurementType;
-    field @Deprecated public int negotiatedBurstNum;
-    field @Deprecated public int requestType;
-    field @Deprecated public int retryAfterDuration;
-    field @Deprecated public int rssi;
-    field @Deprecated public int rssiSpread;
-    field @Deprecated public int rssi_spread;
-    field @Deprecated public long rtt;
-    field @Deprecated public long rttSpread;
-    field @Deprecated public long rttStandardDeviation;
-    field @Deprecated public long rtt_ns;
-    field @Deprecated public long rtt_sd_ns;
-    field @Deprecated public long rtt_spread_ns;
-    field @Deprecated public int rxRate;
-    field @Deprecated public boolean secure;
-    field @Deprecated public int status;
-    field @Deprecated public int successMeasurementFrameNumber;
-    field @Deprecated public long ts;
-    field @Deprecated public int txRate;
-    field @Deprecated public int tx_rate;
-  }
-
-  @Deprecated public static class RttManager.WifiInformationElement {
-    ctor @Deprecated public RttManager.WifiInformationElement();
-    field @Deprecated public byte[] data;
-    field @Deprecated public byte id;
-  }
-
-  public final class ScanResult implements android.os.Parcelable {
-    field public static final int CIPHER_CCMP = 3; // 0x3
-    field public static final int CIPHER_GCMP_256 = 4; // 0x4
-    field public static final int CIPHER_NONE = 0; // 0x0
-    field public static final int CIPHER_NO_GROUP_ADDRESSED = 1; // 0x1
-    field public static final int CIPHER_SMS4 = 5; // 0x5
-    field public static final int CIPHER_TKIP = 2; // 0x2
-    field public static final int KEY_MGMT_EAP = 2; // 0x2
-    field public static final int KEY_MGMT_EAP_SHA256 = 6; // 0x6
-    field public static final int KEY_MGMT_EAP_SUITE_B_192 = 10; // 0xa
-    field public static final int KEY_MGMT_FT_EAP = 4; // 0x4
-    field public static final int KEY_MGMT_FT_PSK = 3; // 0x3
-    field public static final int KEY_MGMT_FT_SAE = 11; // 0xb
-    field public static final int KEY_MGMT_NONE = 0; // 0x0
-    field public static final int KEY_MGMT_OSEN = 7; // 0x7
-    field public static final int KEY_MGMT_OWE = 9; // 0x9
-    field public static final int KEY_MGMT_OWE_TRANSITION = 12; // 0xc
-    field public static final int KEY_MGMT_PSK = 1; // 0x1
-    field public static final int KEY_MGMT_PSK_SHA256 = 5; // 0x5
-    field public static final int KEY_MGMT_SAE = 8; // 0x8
-    field public static final int KEY_MGMT_WAPI_CERT = 14; // 0xe
-    field public static final int KEY_MGMT_WAPI_PSK = 13; // 0xd
-    field public static final int PROTOCOL_NONE = 0; // 0x0
-    field public static final int PROTOCOL_OSEN = 3; // 0x3
-    field public static final int PROTOCOL_RSN = 2; // 0x2
-    field public static final int PROTOCOL_WAPI = 4; // 0x4
-    field public static final int PROTOCOL_WPA = 1; // 0x1
-  }
-
-  public final class SoftApCapability implements android.os.Parcelable {
-    method public boolean areFeaturesSupported(long);
-    method public int describeContents();
-    method public int getMaxSupportedClients();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApCapability> CREATOR;
-    field public static final long SOFTAP_FEATURE_ACS_OFFLOAD = 1L; // 0x1L
-    field public static final long SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT = 2L; // 0x2L
-    field public static final long SOFTAP_FEATURE_WPA3_SAE = 4L; // 0x4L
-  }
-
-  public final class SoftApConfiguration implements android.os.Parcelable {
-    method @NonNull public java.util.List<android.net.MacAddress> getAllowedClientList();
-    method public int getBand();
-    method @NonNull public java.util.List<android.net.MacAddress> getBlockedClientList();
-    method public int getChannel();
-    method public int getMaxNumberOfClients();
-    method public long getShutdownTimeoutMillis();
-    method public boolean isAutoShutdownEnabled();
-    method public boolean isClientControlByUserEnabled();
-    method @Nullable public android.net.wifi.WifiConfiguration toWifiConfiguration();
-    field public static final int BAND_2GHZ = 1; // 0x1
-    field public static final int BAND_5GHZ = 2; // 0x2
-    field public static final int BAND_6GHZ = 4; // 0x4
-    field public static final int BAND_ANY = 7; // 0x7
-  }
-
-  public static final class SoftApConfiguration.Builder {
-    ctor public SoftApConfiguration.Builder();
-    ctor public SoftApConfiguration.Builder(@NonNull android.net.wifi.SoftApConfiguration);
-    method @NonNull public android.net.wifi.SoftApConfiguration build();
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setAllowedClientList(@NonNull java.util.List<android.net.MacAddress>);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setAutoShutdownEnabled(boolean);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setBand(int);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setBlockedClientList(@NonNull java.util.List<android.net.MacAddress>);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setBssid(@Nullable android.net.MacAddress);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setChannel(int, int);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setClientControlByUserEnabled(boolean);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setHiddenSsid(boolean);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setMaxNumberOfClients(@IntRange(from=0) int);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setPassphrase(@Nullable String, int);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setShutdownTimeoutMillis(@IntRange(from=0) long);
-    method @NonNull public android.net.wifi.SoftApConfiguration.Builder setSsid(@Nullable String);
-  }
-
-  public final class SoftApInfo implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getBandwidth();
-    method public int getFrequency();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field public static final int CHANNEL_WIDTH_160MHZ = 6; // 0x6
-    field public static final int CHANNEL_WIDTH_20MHZ = 2; // 0x2
-    field public static final int CHANNEL_WIDTH_20MHZ_NOHT = 1; // 0x1
-    field public static final int CHANNEL_WIDTH_40MHZ = 3; // 0x3
-    field public static final int CHANNEL_WIDTH_80MHZ = 4; // 0x4
-    field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 5; // 0x5
-    field public static final int CHANNEL_WIDTH_INVALID = 0; // 0x0
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.SoftApInfo> CREATOR;
-  }
-
-  public final class WifiClient implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public android.net.MacAddress getMacAddress();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiClient> CREATOR;
-  }
-
-  @Deprecated public class WifiConfiguration implements android.os.Parcelable {
-    method @Deprecated public int getAuthType();
-    method @Deprecated @NonNull public android.net.IpConfiguration getIpConfiguration();
-    method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus getNetworkSelectionStatus();
-    method @Deprecated @NonNull public String getPrintableSsid();
-    method @Deprecated public int getRecentFailureReason();
-    method @Deprecated public boolean hasNoInternetAccess();
-    method @Deprecated public boolean isEphemeral();
-    method @Deprecated public static boolean isMetered(@Nullable android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiInfo);
-    method @Deprecated public boolean isNoInternetAccessExpected();
-    method @Deprecated public void setIpConfiguration(@Nullable android.net.IpConfiguration);
-    method @Deprecated public void setNetworkSelectionStatus(@NonNull android.net.wifi.WifiConfiguration.NetworkSelectionStatus);
-    field @Deprecated public static final int INVALID_NETWORK_ID = -1; // 0xffffffff
-    field @Deprecated public static final int METERED_OVERRIDE_METERED = 1; // 0x1
-    field @Deprecated public static final int METERED_OVERRIDE_NONE = 0; // 0x0
-    field @Deprecated public static final int METERED_OVERRIDE_NOT_METERED = 2; // 0x2
-    field @Deprecated public static final int RANDOMIZATION_NONE = 0; // 0x0
-    field @Deprecated public static final int RANDOMIZATION_PERSISTENT = 1; // 0x1
-    field @Deprecated public static final int RECENT_FAILURE_AP_UNABLE_TO_HANDLE_NEW_STA = 17; // 0x11
-    field @Deprecated public static final int RECENT_FAILURE_NONE = 0; // 0x0
-    field @Deprecated public boolean allowAutojoin;
-    field @Deprecated public int carrierId;
-    field @Deprecated public String creatorName;
-    field @Deprecated public int creatorUid;
-    field @Deprecated public boolean fromWifiNetworkSpecifier;
-    field @Deprecated public boolean fromWifiNetworkSuggestion;
-    field @Deprecated public String lastUpdateName;
-    field @Deprecated public int lastUpdateUid;
-    field @Deprecated public int macRandomizationSetting;
-    field @Deprecated public boolean meteredHint;
-    field @Deprecated public int meteredOverride;
-    field @Deprecated public int numAssociation;
-    field @Deprecated public int numScorerOverride;
-    field @Deprecated public int numScorerOverrideAndSwitchedNetwork;
-    field @Deprecated public boolean requirePmf;
-    field @Deprecated public boolean shared;
-    field @Deprecated public boolean useExternalScores;
-  }
-
-  @Deprecated public static class WifiConfiguration.KeyMgmt {
-    field @Deprecated public static final int WAPI_CERT = 14; // 0xe
-    field @Deprecated public static final int WAPI_PSK = 13; // 0xd
-    field @Deprecated public static final int WPA2_PSK = 4; // 0x4
-  }
-
-  @Deprecated public static class WifiConfiguration.NetworkSelectionStatus {
-    method @Deprecated public int getDisableReasonCounter(int);
-    method @Deprecated public long getDisableTime();
-    method @Deprecated public static int getMaxNetworkSelectionDisableReason();
-    method @Deprecated public int getNetworkSelectionDisableReason();
-    method @Deprecated @Nullable public static String getNetworkSelectionDisableReasonString(int);
-    method @Deprecated public int getNetworkSelectionStatus();
-    method @Deprecated @NonNull public String getNetworkStatusString();
-    method @Deprecated public boolean hasEverConnected();
-    field @Deprecated public static final int DISABLED_ASSOCIATION_REJECTION = 1; // 0x1
-    field @Deprecated public static final int DISABLED_AUTHENTICATION_FAILURE = 2; // 0x2
-    field @Deprecated public static final int DISABLED_AUTHENTICATION_NO_CREDENTIALS = 5; // 0x5
-    field @Deprecated public static final int DISABLED_AUTHENTICATION_NO_SUBSCRIPTION = 9; // 0x9
-    field @Deprecated public static final int DISABLED_BY_WIFI_MANAGER = 7; // 0x7
-    field @Deprecated public static final int DISABLED_BY_WRONG_PASSWORD = 8; // 0x8
-    field @Deprecated public static final int DISABLED_DHCP_FAILURE = 3; // 0x3
-    field @Deprecated public static final int DISABLED_NONE = 0; // 0x0
-    field @Deprecated public static final int DISABLED_NO_INTERNET_PERMANENT = 6; // 0x6
-    field @Deprecated public static final int DISABLED_NO_INTERNET_TEMPORARY = 4; // 0x4
-    field @Deprecated public static final int NETWORK_SELECTION_ENABLED = 0; // 0x0
-    field @Deprecated public static final int NETWORK_SELECTION_PERMANENTLY_DISABLED = 2; // 0x2
-    field @Deprecated public static final int NETWORK_SELECTION_TEMPORARY_DISABLED = 1; // 0x1
-  }
-
-  @Deprecated public static final class WifiConfiguration.NetworkSelectionStatus.Builder {
-    ctor @Deprecated public WifiConfiguration.NetworkSelectionStatus.Builder();
-    method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus build();
-    method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus.Builder setNetworkSelectionDisableReason(int);
-    method @Deprecated @NonNull public android.net.wifi.WifiConfiguration.NetworkSelectionStatus.Builder setNetworkSelectionStatus(int);
-  }
-
-  public class WifiEnterpriseConfig implements android.os.Parcelable {
-    method @Nullable public String[] getCaCertificateAliases();
-    method @NonNull public String getCaPath();
-    method @NonNull public String getClientCertificateAlias();
-    method public int getOcsp();
-    method @NonNull public String getWapiCertSuite();
-    method public void setCaCertificateAliases(@Nullable String[]);
-    method public void setCaPath(@NonNull String);
-    method public void setClientCertificateAlias(@NonNull String);
-    method public void setOcsp(int);
-    method public void setWapiCertSuite(@NonNull String);
-    field public static final int OCSP_NONE = 0; // 0x0
-    field public static final int OCSP_REQUEST_CERT_STATUS = 1; // 0x1
-    field public static final int OCSP_REQUIRE_ALL_NON_TRUSTED_CERTS_STATUS = 3; // 0x3
-    field public static final int OCSP_REQUIRE_CERT_STATUS = 2; // 0x2
-  }
-
-  public class WifiFrameworkInitializer {
-    method public static void registerServiceWrappers();
-  }
-
-  public class WifiInfo implements android.os.Parcelable {
-    method public double getLostTxPacketsPerSecond();
-    method @Nullable public String getRequestingPackageName();
-    method public double getRetriedTxPacketsPerSecond();
-    method public int getScore();
-    method public double getSuccessfulRxPacketsPerSecond();
-    method public double getSuccessfulTxPacketsPerSecond();
-    method public boolean isEphemeral();
-    method public boolean isOsuAp();
-    method public boolean isPasspointAp();
-    method @Nullable public static String sanitizeSsid(@Nullable String);
-    field public static final String DEFAULT_MAC_ADDRESS = "02:00:00:00:00:00";
-    field public static final int INVALID_RSSI = -127; // 0xffffff81
-  }
-
-  public class WifiManager {
-    method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void addOnWifiUsabilityStatsListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.OnWifiUsabilityStatsListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void allowAutojoin(int, boolean);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void allowAutojoinGlobal(boolean);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void allowAutojoinPasspoint(@NonNull String, boolean);
-    method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void clearWifiConnectedNetworkScorer();
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void connect(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void connect(int, @Nullable android.net.wifi.WifiManager.ActionListener);
-    method @Deprecated @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void disable(int, @Nullable android.net.wifi.WifiManager.ActionListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK}) public void disableEphemeralNetwork(@NonNull String);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void factoryReset();
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void forget(int, @Nullable android.net.wifi.WifiManager.ActionListener);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.util.Pair<android.net.wifi.WifiConfiguration,java.util.Map<java.lang.Integer,java.util.List<android.net.wifi.ScanResult>>>> getAllMatchingWifiConfigs(@NonNull java.util.List<android.net.wifi.ScanResult>);
-    method @Nullable @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public String getCountryCode();
-    method @Nullable @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public android.net.Network getCurrentNetwork();
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public String[] getFactoryMacAddresses();
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,java.util.List<android.net.wifi.ScanResult>> getMatchingOsuProviders(@Nullable java.util.List<android.net.wifi.ScanResult>);
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.Map<android.net.wifi.hotspot2.OsuProvider,android.net.wifi.hotspot2.PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(@NonNull java.util.Set<android.net.wifi.hotspot2.OsuProvider>);
-    method @NonNull @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE}) public java.util.Map<android.net.wifi.WifiNetworkSuggestion,java.util.List<android.net.wifi.ScanResult>> getMatchingScanResults(@NonNull java.util.List<android.net.wifi.WifiNetworkSuggestion>, @Nullable java.util.List<android.net.wifi.ScanResult>);
-    method @RequiresPermission(allOf={android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_WIFI_STATE, android.Manifest.permission.READ_WIFI_CREDENTIAL}) public java.util.List<android.net.wifi.WifiConfiguration> getPrivilegedConfiguredNetworks();
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public android.net.wifi.SoftApConfiguration getSoftApConfiguration();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public void getWifiActivityEnergyInfoAsync(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.OnWifiActivityEnergyInfoListener);
-    method @Deprecated @Nullable @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public android.net.wifi.WifiConfiguration getWifiApConfiguration();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public int getWifiApState();
-    method @NonNull @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public java.util.List<android.net.wifi.WifiConfiguration> getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(@NonNull java.util.List<android.net.wifi.ScanResult>);
-    method public boolean isApMacRandomizationSupported();
-    method public boolean isConnectedMacRandomizationSupported();
-    method @Deprecated public boolean isDeviceToDeviceRttSupported();
-    method public boolean isPortableHotspotSupported();
-    method public boolean isVerboseLoggingEnabled();
-    method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isWifiApEnabled();
-    method public boolean isWifiScannerSupported();
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerNetworkRequestMatchCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.NetworkRequestMatchCallback);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerSoftApCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.SoftApCallback);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerTrafficStateCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.TrafficStateCallback);
-    method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void removeOnWifiUsabilityStatsListener(@NonNull android.net.wifi.WifiManager.OnWifiUsabilityStatsListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void restoreBackupData(@NonNull byte[]);
-    method @Nullable @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public android.net.wifi.SoftApConfiguration restoreSoftApBackupData(@NonNull byte[]);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void restoreSupplicantBackupData(@NonNull byte[], @NonNull byte[]);
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public byte[] retrieveBackupData();
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public byte[] retrieveSoftApBackupData();
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD, android.Manifest.permission.NETWORK_STACK}) public void save(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setAutoWakeupEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.WIFI_SET_DEVICE_MOBILITY_STATE) public void setDeviceMobilityState(int);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setMacRandomizationSettingPasspointEnabled(@NonNull String, boolean);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setPasspointMeteredOverride(@NonNull String, int);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setScanAlwaysAvailable(boolean);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setScanThrottleEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public boolean setSoftApConfiguration(@NonNull android.net.wifi.SoftApConfiguration);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void setVerboseLoggingEnabled(boolean);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE) public boolean setWifiApConfiguration(android.net.wifi.WifiConfiguration);
-    method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public boolean setWifiConnectedNetworkScorer(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiManager.WifiConnectedNetworkScorer);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startEasyConnectAsConfiguratorInitiator(@NonNull String, int, int, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.EasyConnectStatusCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startEasyConnectAsEnrolleeInitiator(@NonNull String, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.EasyConnectStatusCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startLocalOnlyHotspot(@NonNull android.net.wifi.SoftApConfiguration, @Nullable java.util.concurrent.Executor, @Nullable android.net.wifi.WifiManager.LocalOnlyHotspotCallback);
-    method @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS) public boolean startScan(android.os.WorkSource);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void startSubscriptionProvisioning(@NonNull android.net.wifi.hotspot2.OsuProvider, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.hotspot2.ProvisioningCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public boolean startTetheredHotspot(@Nullable android.net.wifi.SoftApConfiguration);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_SETUP_WIZARD}) public void stopEasyConnectSession();
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public boolean stopSoftAp();
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void unregisterNetworkRequestMatchCallback(@NonNull android.net.wifi.WifiManager.NetworkRequestMatchCallback);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void unregisterSoftApCallback(@NonNull android.net.wifi.WifiManager.SoftApCallback);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void unregisterTrafficStateCallback(@NonNull android.net.wifi.WifiManager.TrafficStateCallback);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_STACK, android.net.NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK}) public void updateInterfaceIpState(@Nullable String, int);
-    method @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE) public void updateWifiUsabilityScore(int, int, int);
-    field public static final String ACTION_LINK_CONFIGURATION_CHANGED = "android.net.wifi.LINK_CONFIGURATION_CHANGED";
-    field @RequiresPermission(android.Manifest.permission.NETWORK_CARRIER_PROVISIONING) public static final String ACTION_NETWORK_SETTINGS_RESET = "android.net.wifi.action.NETWORK_SETTINGS_RESET";
-    field public static final String ACTION_PASSPOINT_LAUNCH_OSU_VIEW = "android.net.wifi.action.PASSPOINT_LAUNCH_OSU_VIEW";
-    field public static final String ACTION_REQUEST_DISABLE = "android.net.wifi.action.REQUEST_DISABLE";
-    field public static final String ACTION_REQUEST_ENABLE = "android.net.wifi.action.REQUEST_ENABLE";
-    field public static final int CHANGE_REASON_ADDED = 0; // 0x0
-    field public static final int CHANGE_REASON_CONFIG_CHANGE = 2; // 0x2
-    field public static final int CHANGE_REASON_REMOVED = 1; // 0x1
-    field public static final String CONFIGURED_NETWORKS_CHANGED_ACTION = "android.net.wifi.CONFIGURED_NETWORKS_CHANGE";
-    field public static final int DEVICE_MOBILITY_STATE_HIGH_MVMT = 1; // 0x1
-    field public static final int DEVICE_MOBILITY_STATE_LOW_MVMT = 2; // 0x2
-    field public static final int DEVICE_MOBILITY_STATE_STATIONARY = 3; // 0x3
-    field public static final int DEVICE_MOBILITY_STATE_UNKNOWN = 0; // 0x0
-    field public static final int EASY_CONNECT_NETWORK_ROLE_AP = 1; // 0x1
-    field public static final int EASY_CONNECT_NETWORK_ROLE_STA = 0; // 0x0
-    field public static final String EXTRA_CHANGE_REASON = "changeReason";
-    field public static final String EXTRA_LINK_PROPERTIES = "android.net.wifi.extra.LINK_PROPERTIES";
-    field public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges";
-    field public static final String EXTRA_OSU_NETWORK = "android.net.wifi.extra.OSU_NETWORK";
-    field public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
-    field public static final String EXTRA_URL = "android.net.wifi.extra.URL";
-    field public static final String EXTRA_WIFI_AP_FAILURE_REASON = "android.net.wifi.extra.WIFI_AP_FAILURE_REASON";
-    field public static final String EXTRA_WIFI_AP_INTERFACE_NAME = "android.net.wifi.extra.WIFI_AP_INTERFACE_NAME";
-    field public static final String EXTRA_WIFI_AP_MODE = "android.net.wifi.extra.WIFI_AP_MODE";
-    field public static final String EXTRA_WIFI_AP_STATE = "wifi_state";
-    field public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration";
-    field public static final String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et";
-    field public static final String EXTRA_WIFI_CREDENTIAL_SSID = "ssid";
-    field public static final int IFACE_IP_MODE_CONFIGURATION_ERROR = 0; // 0x0
-    field public static final int IFACE_IP_MODE_LOCAL_ONLY = 2; // 0x2
-    field public static final int IFACE_IP_MODE_TETHERED = 1; // 0x1
-    field public static final int IFACE_IP_MODE_UNSPECIFIED = -1; // 0xffffffff
-    field public static final int PASSPOINT_HOME_NETWORK = 0; // 0x0
-    field public static final int PASSPOINT_ROAMING_NETWORK = 1; // 0x1
-    field public static final int SAP_CLIENT_BLOCK_REASON_CODE_BLOCKED_BY_USER = 0; // 0x0
-    field public static final int SAP_CLIENT_BLOCK_REASON_CODE_NO_MORE_STAS = 1; // 0x1
-    field public static final int SAP_START_FAILURE_GENERAL = 0; // 0x0
-    field public static final int SAP_START_FAILURE_NO_CHANNEL = 1; // 0x1
-    field public static final int SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION = 2; // 0x2
-    field public static final String WIFI_AP_STATE_CHANGED_ACTION = "android.net.wifi.WIFI_AP_STATE_CHANGED";
-    field public static final int WIFI_AP_STATE_DISABLED = 11; // 0xb
-    field public static final int WIFI_AP_STATE_DISABLING = 10; // 0xa
-    field public static final int WIFI_AP_STATE_ENABLED = 13; // 0xd
-    field public static final int WIFI_AP_STATE_ENABLING = 12; // 0xc
-    field public static final int WIFI_AP_STATE_FAILED = 14; // 0xe
-    field public static final String WIFI_CREDENTIAL_CHANGED_ACTION = "android.net.wifi.WIFI_CREDENTIAL_CHANGED";
-    field public static final int WIFI_CREDENTIAL_FORGOT = 1; // 0x1
-    field public static final int WIFI_CREDENTIAL_SAVED = 0; // 0x0
-  }
-
-  public static interface WifiManager.ActionListener {
-    method public void onFailure(int);
-    method public void onSuccess();
-  }
-
-  public static interface WifiManager.NetworkRequestMatchCallback {
-    method public default void onAbort();
-    method public default void onMatch(@NonNull java.util.List<android.net.wifi.ScanResult>);
-    method public default void onUserSelectionCallbackRegistration(@NonNull android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback);
-    method public default void onUserSelectionConnectFailure(@NonNull android.net.wifi.WifiConfiguration);
-    method public default void onUserSelectionConnectSuccess(@NonNull android.net.wifi.WifiConfiguration);
-  }
-
-  public static interface WifiManager.NetworkRequestUserSelectionCallback {
-    method public default void reject();
-    method public default void select(@NonNull android.net.wifi.WifiConfiguration);
-  }
-
-  public static interface WifiManager.OnWifiActivityEnergyInfoListener {
-    method public void onWifiActivityEnergyInfo(@Nullable android.os.connectivity.WifiActivityEnergyInfo);
-  }
-
-  public static interface WifiManager.OnWifiUsabilityStatsListener {
-    method public void onWifiUsabilityStats(int, boolean, @NonNull android.net.wifi.WifiUsabilityStatsEntry);
-  }
-
-  public static interface WifiManager.ScoreUpdateObserver {
-    method public void notifyScoreUpdate(int, int);
-    method public void triggerUpdateOfWifiUsabilityStats(int);
-  }
-
-  public static interface WifiManager.SoftApCallback {
-    method public default void onBlockedClientConnecting(@NonNull android.net.wifi.WifiClient, int);
-    method public default void onCapabilityChanged(@NonNull android.net.wifi.SoftApCapability);
-    method public default void onConnectedClientsChanged(@NonNull java.util.List<android.net.wifi.WifiClient>);
-    method public default void onInfoChanged(@NonNull android.net.wifi.SoftApInfo);
-    method public default void onStateChanged(int, int);
-  }
-
-  public static interface WifiManager.TrafficStateCallback {
-    method public void onStateChanged(int);
-    field public static final int DATA_ACTIVITY_IN = 1; // 0x1
-    field public static final int DATA_ACTIVITY_INOUT = 3; // 0x3
-    field public static final int DATA_ACTIVITY_NONE = 0; // 0x0
-    field public static final int DATA_ACTIVITY_OUT = 2; // 0x2
-  }
-
-  public static interface WifiManager.WifiConnectedNetworkScorer {
-    method public void onSetScoreUpdateObserver(@NonNull android.net.wifi.WifiManager.ScoreUpdateObserver);
-    method public void onStart(int);
-    method public void onStop(int);
-  }
-
-  public class WifiNetworkConnectionStatistics implements android.os.Parcelable {
-    ctor public WifiNetworkConnectionStatistics(int, int);
-    ctor public WifiNetworkConnectionStatistics();
-    ctor public WifiNetworkConnectionStatistics(android.net.wifi.WifiNetworkConnectionStatistics);
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiNetworkConnectionStatistics> CREATOR;
-    field public int numConnection;
-    field public int numUsage;
-  }
-
-  public final class WifiNetworkSuggestion implements android.os.Parcelable {
-    method @NonNull public android.net.wifi.WifiConfiguration getWifiConfiguration();
-  }
-
-  public static final class WifiNetworkSuggestion.Builder {
-    method @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_CARRIER_PROVISIONING) public android.net.wifi.WifiNetworkSuggestion.Builder setCarrierId(int);
-  }
-
-  public class WifiScanner {
-    method @Deprecated public void configureWifiChange(int, int, int, int, int, android.net.wifi.WifiScanner.BssidInfo[]);
-    method @Deprecated public void configureWifiChange(android.net.wifi.WifiScanner.WifiChangeSettings);
-    method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public java.util.List<java.lang.Integer> getAvailableChannels(int);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public boolean getScanResults();
-    method @NonNull @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public java.util.List<android.net.wifi.ScanResult> getSingleScanResults();
-    method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void registerScanListener(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.WifiScanner.ScanListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public void setScanningEnabled(boolean);
-    method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startBackgroundScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource);
-    method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener);
-    method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void startScan(android.net.wifi.WifiScanner.ScanSettings, android.net.wifi.WifiScanner.ScanListener, android.os.WorkSource);
-    method @Deprecated public void startTrackingBssids(android.net.wifi.WifiScanner.BssidInfo[], int, android.net.wifi.WifiScanner.BssidListener);
-    method @Deprecated public void startTrackingWifiChange(android.net.wifi.WifiScanner.WifiChangeListener);
-    method @Deprecated @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopBackgroundScan(android.net.wifi.WifiScanner.ScanListener);
-    method @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE) public void stopScan(android.net.wifi.WifiScanner.ScanListener);
-    method @Deprecated public void stopTrackingBssids(android.net.wifi.WifiScanner.BssidListener);
-    method @Deprecated public void stopTrackingWifiChange(android.net.wifi.WifiScanner.WifiChangeListener);
-    method public void unregisterScanListener(@NonNull android.net.wifi.WifiScanner.ScanListener);
-    field public static final int MAX_SCAN_PERIOD_MS = 1024000; // 0xfa000
-    field public static final int MIN_SCAN_PERIOD_MS = 1000; // 0x3e8
-    field public static final int REASON_DUPLICATE_REQEUST = -5; // 0xfffffffb
-    field public static final int REASON_INVALID_LISTENER = -2; // 0xfffffffe
-    field public static final int REASON_INVALID_REQUEST = -3; // 0xfffffffd
-    field public static final int REASON_NOT_AUTHORIZED = -4; // 0xfffffffc
-    field public static final int REASON_SUCCEEDED = 0; // 0x0
-    field public static final int REASON_UNSPECIFIED = -1; // 0xffffffff
-    field @Deprecated public static final int REPORT_EVENT_AFTER_BUFFER_FULL = 0; // 0x0
-    field public static final int REPORT_EVENT_AFTER_EACH_SCAN = 1; // 0x1
-    field public static final int REPORT_EVENT_FULL_SCAN_RESULT = 2; // 0x2
-    field public static final int REPORT_EVENT_NO_BATCH = 4; // 0x4
-    field public static final int SCAN_TYPE_HIGH_ACCURACY = 2; // 0x2
-    field public static final int SCAN_TYPE_LOW_LATENCY = 0; // 0x0
-    field public static final int SCAN_TYPE_LOW_POWER = 1; // 0x1
-    field public static final int WIFI_BAND_24_5_6_GHZ = 11; // 0xb
-    field public static final int WIFI_BAND_24_5_WITH_DFS_6_GHZ = 15; // 0xf
-    field public static final int WIFI_BAND_24_GHZ = 1; // 0x1
-    field public static final int WIFI_BAND_5_GHZ = 2; // 0x2
-    field public static final int WIFI_BAND_5_GHZ_DFS_ONLY = 4; // 0x4
-    field public static final int WIFI_BAND_5_GHZ_WITH_DFS = 6; // 0x6
-    field public static final int WIFI_BAND_6_GHZ = 8; // 0x8
-    field public static final int WIFI_BAND_BOTH = 3; // 0x3
-    field public static final int WIFI_BAND_BOTH_WITH_DFS = 7; // 0x7
-    field public static final int WIFI_BAND_UNSPECIFIED = 0; // 0x0
-  }
-
-  public static interface WifiScanner.ActionListener {
-    method public void onFailure(int, String);
-    method public void onSuccess();
-  }
-
-  @Deprecated public static class WifiScanner.BssidInfo {
-    ctor @Deprecated public WifiScanner.BssidInfo();
-    field @Deprecated public String bssid;
-    field @Deprecated public int frequencyHint;
-    field @Deprecated public int high;
-    field @Deprecated public int low;
-  }
-
-  @Deprecated public static interface WifiScanner.BssidListener extends android.net.wifi.WifiScanner.ActionListener {
-    method @Deprecated public void onFound(android.net.wifi.ScanResult[]);
-    method @Deprecated public void onLost(android.net.wifi.ScanResult[]);
-  }
-
-  public static class WifiScanner.ChannelSpec {
-    ctor public WifiScanner.ChannelSpec(int);
-    field public int frequency;
-  }
-
-  @Deprecated public static class WifiScanner.HotlistSettings implements android.os.Parcelable {
-    ctor @Deprecated public WifiScanner.HotlistSettings();
-    field @Deprecated public int apLostThreshold;
-    field @Deprecated public android.net.wifi.WifiScanner.BssidInfo[] bssidInfos;
-  }
-
-  public static class WifiScanner.ParcelableScanData implements android.os.Parcelable {
-    ctor public WifiScanner.ParcelableScanData(android.net.wifi.WifiScanner.ScanData[]);
-    method public android.net.wifi.WifiScanner.ScanData[] getResults();
-    field public android.net.wifi.WifiScanner.ScanData[] mResults;
-  }
-
-  public static class WifiScanner.ParcelableScanResults implements android.os.Parcelable {
-    ctor public WifiScanner.ParcelableScanResults(android.net.wifi.ScanResult[]);
-    method public android.net.wifi.ScanResult[] getResults();
-    field public android.net.wifi.ScanResult[] mResults;
-  }
-
-  public static class WifiScanner.ScanData implements android.os.Parcelable {
-    ctor public WifiScanner.ScanData(int, int, android.net.wifi.ScanResult[]);
-    ctor public WifiScanner.ScanData(android.net.wifi.WifiScanner.ScanData);
-    method public int getFlags();
-    method public int getId();
-    method public android.net.wifi.ScanResult[] getResults();
-  }
-
-  public static interface WifiScanner.ScanListener extends android.net.wifi.WifiScanner.ActionListener {
-    method public void onFullResult(android.net.wifi.ScanResult);
-    method @Deprecated public void onPeriodChanged(int);
-    method public void onResults(android.net.wifi.WifiScanner.ScanData[]);
-  }
-
-  public static class WifiScanner.ScanSettings implements android.os.Parcelable {
-    ctor public WifiScanner.ScanSettings();
-    field public int band;
-    field public android.net.wifi.WifiScanner.ChannelSpec[] channels;
-    field @NonNull @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public final java.util.List<android.net.wifi.WifiScanner.ScanSettings.HiddenNetwork> hiddenNetworks;
-    field public boolean hideFromAppOps;
-    field public boolean ignoreLocationSettings;
-    field @Deprecated public int maxPeriodInMs;
-    field @Deprecated public int maxScansToCache;
-    field @Deprecated public int numBssidsPerScan;
-    field @Deprecated public int periodInMs;
-    field @Deprecated public int reportEvents;
-    field @Deprecated public int stepCount;
-    field @RequiresPermission(android.Manifest.permission.NETWORK_STACK) public int type;
-  }
-
-  public static class WifiScanner.ScanSettings.HiddenNetwork {
-    ctor public WifiScanner.ScanSettings.HiddenNetwork(@NonNull String);
-    field @NonNull public final String ssid;
-  }
-
-  @Deprecated public static interface WifiScanner.WifiChangeListener extends android.net.wifi.WifiScanner.ActionListener {
-    method @Deprecated public void onChanging(android.net.wifi.ScanResult[]);
-    method @Deprecated public void onQuiescence(android.net.wifi.ScanResult[]);
-  }
-
-  @Deprecated public static class WifiScanner.WifiChangeSettings implements android.os.Parcelable {
-    ctor @Deprecated public WifiScanner.WifiChangeSettings();
-    field @Deprecated public android.net.wifi.WifiScanner.BssidInfo[] bssidInfos;
-    field @Deprecated public int lostApSampleSize;
-    field @Deprecated public int minApsBreachingThreshold;
-    field @Deprecated public int periodInMs;
-    field @Deprecated public int rssiSampleSize;
-    field @Deprecated public int unchangedSampleSize;
-  }
-
-  public final class WifiUsabilityStatsEntry implements android.os.Parcelable {
-    method public int describeContents();
-    method public int getCellularDataNetworkType();
-    method public int getCellularSignalStrengthDb();
-    method public int getCellularSignalStrengthDbm();
-    method public int getLinkSpeedMbps();
-    method public int getProbeElapsedTimeSinceLastUpdateMillis();
-    method public int getProbeMcsRateSinceLastUpdate();
-    method public int getProbeStatusSinceLastUpdate();
-    method public int getRssi();
-    method public int getRxLinkSpeedMbps();
-    method public long getTimeStampMillis();
-    method public long getTotalBackgroundScanTimeMillis();
-    method public long getTotalBeaconRx();
-    method public long getTotalCcaBusyFreqTimeMillis();
-    method public long getTotalHotspot2ScanTimeMillis();
-    method public long getTotalNanScanTimeMillis();
-    method public long getTotalPnoScanTimeMillis();
-    method public long getTotalRadioOnFreqTimeMillis();
-    method public long getTotalRadioOnTimeMillis();
-    method public long getTotalRadioRxTimeMillis();
-    method public long getTotalRadioTxTimeMillis();
-    method public long getTotalRoamScanTimeMillis();
-    method public long getTotalRxSuccess();
-    method public long getTotalScanTimeMillis();
-    method public long getTotalTxBad();
-    method public long getTotalTxRetries();
-    method public long getTotalTxSuccess();
-    method public boolean isSameRegisteredCell();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.WifiUsabilityStatsEntry> CREATOR;
-    field public static final int PROBE_STATUS_FAILURE = 3; // 0x3
-    field public static final int PROBE_STATUS_NO_PROBE = 1; // 0x1
-    field public static final int PROBE_STATUS_SUCCESS = 2; // 0x2
-    field public static final int PROBE_STATUS_UNKNOWN = 0; // 0x0
-  }
-
-}
-
-package android.net.wifi.aware {
-
-  public class DiscoverySession implements java.lang.AutoCloseable {
-    method @Deprecated public android.net.NetworkSpecifier createNetworkSpecifierPmk(@NonNull android.net.wifi.aware.PeerHandle, @NonNull byte[]);
-  }
-
-  public class WifiAwareSession implements java.lang.AutoCloseable {
-    method public android.net.NetworkSpecifier createNetworkSpecifierPmk(int, @NonNull byte[], @NonNull byte[]);
-  }
-
-}
-
-package android.net.wifi.hotspot2 {
-
-  public final class OsuProvider implements android.os.Parcelable {
-    method public int describeContents();
-    method @Nullable public String getFriendlyName();
-    method @Nullable public android.net.Uri getServerUri();
-    method public void writeToParcel(android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.hotspot2.OsuProvider> CREATOR;
-  }
-
-  public final class PasspointConfiguration implements android.os.Parcelable {
-    method public int getMeteredOverride();
-    method public boolean isAutojoinEnabled();
-    method public boolean isMacRandomizationEnabled();
-  }
-
-  public abstract class ProvisioningCallback {
-    ctor public ProvisioningCallback();
-    method public abstract void onProvisioningComplete();
-    method public abstract void onProvisioningFailure(int);
-    method public abstract void onProvisioningStatus(int);
-    field public static final int OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION = 22; // 0x16
-    field public static final int OSU_FAILURE_AP_CONNECTION = 1; // 0x1
-    field public static final int OSU_FAILURE_INVALID_URL_FORMAT_FOR_OSU = 8; // 0x8
-    field public static final int OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE = 17; // 0x11
-    field public static final int OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE = 21; // 0x15
-    field public static final int OSU_FAILURE_NO_OSU_ACTIVITY_FOUND = 14; // 0xe
-    field public static final int OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE = 19; // 0x13
-    field public static final int OSU_FAILURE_NO_PPS_MO = 16; // 0x10
-    field public static final int OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE = 18; // 0x12
-    field public static final int OSU_FAILURE_OSU_PROVIDER_NOT_FOUND = 23; // 0x17
-    field public static final int OSU_FAILURE_PROVISIONING_ABORTED = 6; // 0x6
-    field public static final int OSU_FAILURE_PROVISIONING_NOT_AVAILABLE = 7; // 0x7
-    field public static final int OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES = 20; // 0x14
-    field public static final int OSU_FAILURE_SERVER_CONNECTION = 3; // 0x3
-    field public static final int OSU_FAILURE_SERVER_URL_INVALID = 2; // 0x2
-    field public static final int OSU_FAILURE_SERVER_VALIDATION = 4; // 0x4
-    field public static final int OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION = 5; // 0x5
-    field public static final int OSU_FAILURE_SOAP_MESSAGE_EXCHANGE = 11; // 0xb
-    field public static final int OSU_FAILURE_START_REDIRECT_LISTENER = 12; // 0xc
-    field public static final int OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER = 13; // 0xd
-    field public static final int OSU_FAILURE_UNEXPECTED_COMMAND_TYPE = 9; // 0x9
-    field public static final int OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS = 15; // 0xf
-    field public static final int OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE = 10; // 0xa
-    field public static final int OSU_STATUS_AP_CONNECTED = 2; // 0x2
-    field public static final int OSU_STATUS_AP_CONNECTING = 1; // 0x1
-    field public static final int OSU_STATUS_INIT_SOAP_EXCHANGE = 6; // 0x6
-    field public static final int OSU_STATUS_REDIRECT_RESPONSE_RECEIVED = 8; // 0x8
-    field public static final int OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS = 11; // 0xb
-    field public static final int OSU_STATUS_SECOND_SOAP_EXCHANGE = 9; // 0x9
-    field public static final int OSU_STATUS_SERVER_CONNECTED = 5; // 0x5
-    field public static final int OSU_STATUS_SERVER_CONNECTING = 3; // 0x3
-    field public static final int OSU_STATUS_SERVER_VALIDATED = 4; // 0x4
-    field public static final int OSU_STATUS_THIRD_SOAP_EXCHANGE = 10; // 0xa
-    field public static final int OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE = 7; // 0x7
-  }
-
-}
-
-package android.net.wifi.p2p {
-
-  public final class WifiP2pGroupList implements android.os.Parcelable {
-    method public int describeContents();
-    method @NonNull public java.util.List<android.net.wifi.p2p.WifiP2pGroup> getGroupList();
-    method public void writeToParcel(@NonNull android.os.Parcel, int);
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.p2p.WifiP2pGroupList> CREATOR;
-  }
-
-  public class WifiP2pManager {
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public void deletePersistentGroup(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, int, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void factoryReset(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.READ_WIFI_CREDENTIAL}) public void requestPersistentGroupInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.PersistentGroupInfoListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public void setDeviceName(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull String, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY) public void setMiracastMode(int);
-    method @RequiresPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY) public void setWfdInfo(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @NonNull android.net.wifi.p2p.WifiP2pWfdInfo, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(anyOf={android.Manifest.permission.NETWORK_SETTINGS, android.Manifest.permission.NETWORK_STACK, android.Manifest.permission.OVERRIDE_WIFI_CONFIG}) public void setWifiP2pChannels(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, int, int, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void startListening(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    method @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void stopListening(@NonNull android.net.wifi.p2p.WifiP2pManager.Channel, @Nullable android.net.wifi.p2p.WifiP2pManager.ActionListener);
-    field public static final String ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED = "android.net.wifi.p2p.action.WIFI_P2P_PERSISTENT_GROUPS_CHANGED";
-    field public static final int MIRACAST_DISABLED = 0; // 0x0
-    field public static final int MIRACAST_SINK = 2; // 0x2
-    field public static final int MIRACAST_SOURCE = 1; // 0x1
-  }
-
-  public static interface WifiP2pManager.PersistentGroupInfoListener {
-    method public void onPersistentGroupInfoAvailable(@NonNull android.net.wifi.p2p.WifiP2pGroupList);
-  }
-
-}
-
-package android.net.wifi.rtt {
-
-  public static final class RangingRequest.Builder {
-    method public android.net.wifi.rtt.RangingRequest.Builder addResponder(@NonNull android.net.wifi.rtt.ResponderConfig);
-  }
-
-  public final class RangingResult implements android.os.Parcelable {
-    method @NonNull public byte[] getLci();
-    method @NonNull public byte[] getLcr();
-  }
-
-  public final class ResponderConfig implements android.os.Parcelable {
-    ctor public ResponderConfig(@NonNull android.net.MacAddress, int, boolean, int, int, int, int, int);
-    ctor public ResponderConfig(@NonNull android.net.wifi.aware.PeerHandle, int, boolean, int, int, int, int, int);
-    method public int describeContents();
-    method public static android.net.wifi.rtt.ResponderConfig fromScanResult(android.net.wifi.ScanResult);
-    method public static android.net.wifi.rtt.ResponderConfig fromWifiAwarePeerHandleWithDefaults(android.net.wifi.aware.PeerHandle);
-    method public static android.net.wifi.rtt.ResponderConfig fromWifiAwarePeerMacAddressWithDefaults(android.net.MacAddress);
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final int CHANNEL_WIDTH_160MHZ = 3; // 0x3
-    field public static final int CHANNEL_WIDTH_20MHZ = 0; // 0x0
-    field public static final int CHANNEL_WIDTH_40MHZ = 1; // 0x1
-    field public static final int CHANNEL_WIDTH_80MHZ = 2; // 0x2
-    field public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4; // 0x4
-    field @NonNull public static final android.os.Parcelable.Creator<android.net.wifi.rtt.ResponderConfig> CREATOR;
-    field public static final int PREAMBLE_HE = 3; // 0x3
-    field public static final int PREAMBLE_HT = 1; // 0x1
-    field public static final int PREAMBLE_LEGACY = 0; // 0x0
-    field public static final int PREAMBLE_VHT = 2; // 0x2
-    field public static final int RESPONDER_AP = 0; // 0x0
-    field public static final int RESPONDER_AWARE = 4; // 0x4
-    field public static final int RESPONDER_P2P_CLIENT = 3; // 0x3
-    field public static final int RESPONDER_P2P_GO = 2; // 0x2
-    field public static final int RESPONDER_STA = 1; // 0x1
-    field public final int centerFreq0;
-    field public final int centerFreq1;
-    field public final int channelWidth;
-    field public final int frequency;
-    field public final android.net.MacAddress macAddress;
-    field public final android.net.wifi.aware.PeerHandle peerHandle;
-    field public final int preamble;
-    field public final int responderType;
-    field public final boolean supports80211mc;
-  }
-
-  public final class ResponderLocation implements android.os.Parcelable {
-    method public boolean getExtraInfoOnAssociationIndication();
-  }
-
-  public class WifiRttManager {
-    method @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE}) public void cancelRanging(@Nullable android.os.WorkSource);
-    method @RequiresPermission(allOf={android.Manifest.permission.LOCATION_HARDWARE, android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.CHANGE_WIFI_STATE, android.Manifest.permission.ACCESS_WIFI_STATE}) public void startRanging(@Nullable android.os.WorkSource, @NonNull android.net.wifi.rtt.RangingRequest, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.rtt.RangingResultCallback);
-  }
-
-}
-
diff --git a/wifi/api/system-lint-baseline.txt b/wifi/api/system-lint-baseline.txt
deleted file mode 100644
index 6547ee8..0000000
--- a/wifi/api/system-lint-baseline.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-// Baseline format: 1.0
-MissingGetterMatchingBuilder: android.net.wifi.rtt.RangingRequest.Builder#addResponder(android.net.wifi.rtt.ResponderConfig):
-    android.net.wifi.rtt.RangingRequest does not declare a `getResponders()` method matching method android.net.wifi.rtt.RangingRequest.Builder.addResponder(android.net.wifi.rtt.ResponderConfig)
-
-MissingNullability: android.net.wifi.rtt.RangingRequest.Builder#addResponder(android.net.wifi.rtt.ResponderConfig):
-
diff --git a/wifi/api/system-removed.txt b/wifi/api/system-removed.txt
deleted file mode 100644
index a2d0dff..0000000
--- a/wifi/api/system-removed.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-// Signature format: 2.0
-package android.net.wifi {
-
-  @Deprecated public class BatchedScanResult implements android.os.Parcelable {
-    ctor public BatchedScanResult();
-    ctor public BatchedScanResult(android.net.wifi.BatchedScanResult);
-    field public final java.util.List<android.net.wifi.ScanResult> scanResults;
-    field public boolean truncated;
-  }
-
-  public final class ScanResult implements android.os.Parcelable {
-    field public boolean untrusted;
-  }
-
-}
-
diff --git a/wifi/jarjar-rules.txt b/wifi/jarjar-rules.txt
deleted file mode 100644
index 4099c27..0000000
--- a/wifi/jarjar-rules.txt
+++ /dev/null
@@ -1,125 +0,0 @@
-## used by service-wifi ##
-
-# Network Stack AIDL interface.
-rule android.net.DataStallReportParcelable* com.android.wifi.x.@0
-rule android.net.DhcpResultsParcelable* com.android.wifi.x.@0
-rule android.net.IIpMemoryStore* com.android.wifi.x.@0
-rule android.net.IIpMemoryStoreCallbacks* com.android.wifi.x.@0
-rule android.net.INetd* com.android.wifi.x.@0
-rule android.net.INetdUnsolicitedEventListener* com.android.wifi.x.@0
-rule android.net.INetworkStackConnector* com.android.wifi.x.@0
-rule android.net.InformationElementParcelable* com.android.wifi.x.@0
-rule android.net.InitialConfigurationParcelable* com.android.wifi.x.@0
-rule android.net.InterfaceConfigurationParcel* com.android.wifi.x.@0
-rule android.net.Layer2InformationParcelable* com.android.wifi.x.@0
-rule android.net.Layer2PacketParcelable* com.android.wifi.x.@0
-rule android.net.MarkMaskParcel* com.android.wifi.x.@0
-rule android.net.NattKeepalivePacketDataParcelable* com.android.wifi.x.@0
-rule android.net.NetworkTestResultParcelable* com.android.wifi.x.@0
-rule android.net.PrivateDnsConfigParcel* com.android.wifi.x.@0
-rule android.net.ProvisioningConfigurationParcelable* com.android.wifi.x.@0
-rule android.net.ResolverParamsParcel* com.android.wifi.x.@0
-rule android.net.RouteInfoParcel* com.android.wifi.x.@0
-rule android.net.ScanResultInfoParcelable* com.android.wifi.x.@0
-rule android.net.TcpKeepalivePacketDataParcelable* com.android.wifi.x.@0
-rule android.net.TetherConfigParcel* com.android.wifi.x.@0
-rule android.net.TetherOffloadRuleParcel* com.android.wifi.x.@0
-rule android.net.TetherStatsParcel* com.android.wifi.x.@0
-rule android.net.UidRangeParcel* com.android.wifi.x.@0
-rule android.net.dhcp.DhcpLeaseParcelable* com.android.wifi.x.@0
-rule android.net.dhcp.DhcpServingParamsParcel* com.android.wifi.x.@0
-rule android.net.ip.IIpClient* com.android.wifi.x.@0
-rule android.net.ip.IIpClientCallbacks* com.android.wifi.x.@0
-rule android.net.ipmemorystore.Blob* com.android.wifi.x.@0
-rule android.net.ipmemorystore.IOnBlobRetrievedListener* com.android.wifi.x.@0
-rule android.net.ipmemorystore.IOnStatusAndCountListener* com.android.wifi.x.@0
-rule android.net.ipmemorystore.IOnStatusListener* com.android.wifi.x.@0
-rule android.net.ipmemorystore.NetworkAttributesParcelable* com.android.wifi.x.@0
-rule android.net.ipmemorystore.SameL3NetworkResponseParcelable* com.android.wifi.x.@0
-rule android.net.ipmemorystore.StatusParcelable* com.android.wifi.x.@0
-rule android.net.networkstack.aidl.** com.android.wifi.x.@0
-
-# Net utils (includes Network Stack helper classes).
-rule android.net.DhcpResults* com.android.wifi.x.@0
-rule android.net.InterfaceConfiguration* com.android.wifi.x.@0
-rule android.net.IpMemoryStore* com.android.wifi.x.@0
-rule android.net.NetworkMonitorManager* com.android.wifi.x.@0
-rule android.net.NetworkFactory* com.android.wifi.x.@0
-rule android.net.ip.IpClientCallbacks* com.android.wifi.x.@0
-rule android.net.ip.IpClientManager* com.android.wifi.x.@0
-rule android.net.ip.IpClientUtil* com.android.wifi.x.@0
-rule android.net.ipmemorystore.NetworkAttributes* com.android.wifi.x.@0
-rule android.net.ipmemorystore.OnBlobRetrievedListener* com.android.wifi.x.@0
-rule android.net.ipmemorystore.OnDeleteStatusListener* com.android.wifi.x.@0
-rule android.net.ipmemorystore.OnStatusListener* com.android.wifi.x.@0
-rule android.net.ipmemorystore.Status* com.android.wifi.x.@0
-rule android.net.networkstack.ModuleNetworkStackClient* com.android.wifi.x.@0
-rule android.net.networkstack.NetworkStackClientBase* com.android.wifi.x.@0
-rule android.net.shared.InetAddressUtils* com.android.wifi.x.@0
-rule android.net.shared.InitialConfiguration* com.android.wifi.x.@0
-rule android.net.shared.IpConfigurationParcelableUtil* com.android.wifi.x.@0
-rule android.net.shared.Layer2Information* com.android.wifi.x.@0
-rule android.net.shared.LinkPropertiesParcelableUtil* com.android.wifi.x.@0
-rule android.net.shared.NetdUtils* com.android.wifi.x.@0
-rule android.net.shared.NetworkMonitorUtils* com.android.wifi.x.@0
-rule android.net.shared.ParcelableUtil* com.android.wifi.x.@0
-rule android.net.shared.PrivateDnsConfig* com.android.wifi.x.@0
-rule android.net.shared.ProvisioningConfiguration* com.android.wifi.x.@0
-rule android.net.shared.RouteUtils* com.android.wifi.x.@0
-rule android.net.util.KeepalivePacketDataUtil* com.android.wifi.x.@0
-rule android.net.util.NetworkConstants* com.android.wifi.x.@0
-rule android.net.util.InterfaceParams* com.android.wifi.x.@0
-rule android.net.util.SharedLog* com.android.wifi.x.@0
-rule android.net.util.NetUtils* com.android.wifi.x.@0
-
-rule androidx.annotation.** com.android.wifi.x.@0
-
-# We don't jar-jar the entire package because, we still use some classes (like
-# AsyncChannel in com.android.internal.util) from these packages which are not
-# inside our jar (currently in framework.jar, but will be in wifisdk.jar in the future).
-rule com.android.internal.util.FastXmlSerializer* com.android.wifi.x.@0
-rule com.android.internal.util.HexDump* com.android.wifi.x.@0
-rule com.android.internal.util.IState* com.android.wifi.x.@0
-rule com.android.internal.util.MessageUtils* com.android.wifi.x.@0
-rule com.android.internal.util.State* com.android.wifi.x.@0
-rule com.android.internal.util.StateMachine* com.android.wifi.x.@0
-rule com.android.internal.util.WakeupMessage* com.android.wifi.x.@0
-
-rule android.util.BackupUtils* com.android.wifi.x.@0
-rule android.util.LocalLog* com.android.wifi.x.@0
-rule android.util.Rational* com.android.wifi.x.@0
-
-# Use our statically linked bouncy castle library
-rule org.bouncycastle.** com.android.wifi.x.@0
-# Use our statically linked protobuf library
-rule com.google.protobuf.** com.android.wifi.x.@0
-# use statically linked SystemMessageProto
-rule com.android.internal.messages.SystemMessageProto* com.android.wifi.x.@0
-# Use our statically linked PlatformProperties library
-rule android.sysprop.** com.android.wifi.x.@0
-# Use our statically linked HIDL stubs
-# Note: android.hardware.wifi.** is used by various wifi feature flags. This unfortunately is also the namespace
-# used by vendor HAL stubs. So, this rule is intentionally weird to try and filter the vendor HAL stubs only.
-rule android.hardware.wifi.V** com.android.wifi.x.@0
-rule android.hardware.wifi.supplicant.** com.android.wifi.x.@0
-rule android.hardware.wifi.hostapd.** com.android.wifi.x.@0
-rule android.hidl.** com.android.wifi.x.@0
-# Use our statically linked ksoap2
-rule org.ksoap2.** com.android.wifi.x.@0
-# Use our statically linked nanohttpd
-rule fi.iki.elonen.** com.android.wifi.x.@0
-
-## used by both framework-wifi and service-wifi ##
-rule android.content.pm.BaseParceledListSlice* com.android.wifi.x.@0
-rule android.content.pm.ParceledListSlice* com.android.wifi.x.@0
-rule android.net.util.MacAddressUtils* com.android.wifi.x.@0
-rule android.net.util.nsd.DnsSdTxtRecord* com.android.wifi.x.@0
-rule android.os.HandlerExecutor* com.android.wifi.x.@0
-rule android.telephony.Annotation* com.android.wifi.x.@0
-rule com.android.internal.util.AsyncChannel* com.android.wifi.x.@0
-rule com.android.internal.util.AsyncService* com.android.wifi.x.@0
-rule com.android.internal.util.Preconditions* com.android.wifi.x.@0
-rule com.android.internal.util.Protocol* com.android.wifi.x.@0
-
-rule com.android.net.module.util.** com.android.wifi.x.@0
-rule com.android.modules.utils.** com.android.wifi.x.@0
diff --git a/wifi/java/android/net/wifi/AnqpInformationElement.java b/wifi/java/android/net/wifi/AnqpInformationElement.java
deleted file mode 100644
index 47b7129..0000000
--- a/wifi/java/android/net/wifi/AnqpInformationElement.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-/**
- * This object contains the payload of an ANQP element.
- * Vendor id is the vendor ID for the element, or 0 if it is an 802.11(u) element.
- * Hotspot 2.0 uses the WFA Vendor ID which is 0x506f9a
- * The payload contains the bytes of the payload, starting after the length octet(s).
- * @hide
- */
-public class AnqpInformationElement {
-    public static final int HOTSPOT20_VENDOR_ID = 0x506f9a;
-
-    public static final int ANQP_QUERY_LIST = 256;
-    public static final int ANQP_CAPABILITY_LIST = 257;
-    public static final int ANQP_VENUE_NAME = 258;
-    public static final int ANQP_EMERGENCY_NUMBER = 259;
-    public static final int ANQP_NWK_AUTH_TYPE = 260;
-    public static final int ANQP_ROAMING_CONSORTIUM = 261;
-    public static final int ANQP_IP_ADDR_AVAILABILITY = 262;
-    public static final int ANQP_NAI_REALM = 263;
-    public static final int ANQP_3GPP_NETWORK = 264;
-    public static final int ANQP_GEO_LOC = 265;
-    public static final int ANQP_CIVIC_LOC = 266;
-    public static final int ANQP_LOC_URI = 267;
-    public static final int ANQP_DOM_NAME = 268;
-    public static final int ANQP_EMERGENCY_ALERT = 269;
-    public static final int ANQP_TDLS_CAP = 270;
-    public static final int ANQP_EMERGENCY_NAI = 271;
-    public static final int ANQP_NEIGHBOR_REPORT = 272;
-    public static final int ANQP_VENDOR_SPEC = 56797;
-
-    public static final int HS_QUERY_LIST = 1;
-    public static final int HS_CAPABILITY_LIST = 2;
-    public static final int HS_FRIENDLY_NAME = 3;
-    public static final int HS_WAN_METRICS = 4;
-    public static final int HS_CONN_CAPABILITY = 5;
-    public static final int HS_NAI_HOME_REALM_QUERY = 6;
-    public static final int HS_OPERATING_CLASS = 7;
-    public static final int HS_OSU_PROVIDERS = 8;
-    public static final int HS_ICON_REQUEST = 10;
-    public static final int HS_ICON_FILE = 11;
-
-    private final int mVendorId;
-    private final int mElementId;
-    private final byte[] mPayload;
-
-    public AnqpInformationElement(int vendorId, int elementId, byte[] payload) {
-        mVendorId = vendorId;
-        mElementId = elementId;
-        mPayload = payload;
-    }
-
-    public int getVendorId() {
-        return mVendorId;
-    }
-
-    public int getElementId() {
-        return mElementId;
-    }
-
-    public byte[] getPayload() {
-        return mPayload;
-    }
-}
diff --git a/wifi/java/android/net/wifi/BatchedScanResult.java b/wifi/java/android/net/wifi/BatchedScanResult.java
deleted file mode 100644
index ed8845dd..0000000
--- a/wifi/java/android/net/wifi/BatchedScanResult.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.os.Parcelable;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Describes the Results of a batched set of wifi scans where the firmware performs many
- * scans and stores the timestamped results without waking the main processor each time.
- * @hide
- * @removed
- */
-@Deprecated
-@SystemApi
-public class BatchedScanResult implements Parcelable {
-    private static final String TAG = "BatchedScanResult";
-
-    /** Inidcates this scan was interrupted and may only have partial results. */
-    public boolean truncated;
-
-    /** The result of this particular scan. */
-    public final List<ScanResult> scanResults = new ArrayList<ScanResult>();
-
-
-    public BatchedScanResult() {
-    }
-
-    public BatchedScanResult(BatchedScanResult source) {
-        truncated = source.truncated;
-        for (ScanResult s : source.scanResults) scanResults.add(new ScanResult(s));
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sb = new StringBuffer();
-
-        sb.append("BatchedScanResult: ").
-                append("truncated: ").append(String.valueOf(truncated)).
-                append("scanResults: [");
-        for (ScanResult s : scanResults) {
-            sb.append(" <").append(s.toString()).append("> ");
-        }
-        sb.append(" ]");
-        return sb.toString();
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(truncated ? 1 : 0);
-        dest.writeInt(scanResults.size());
-        for (ScanResult s : scanResults) {
-            s.writeToParcel(dest, flags);
-        }
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public static final @android.annotation.NonNull Creator<BatchedScanResult> CREATOR =
-        new Creator<BatchedScanResult>() {
-            public BatchedScanResult createFromParcel(Parcel in) {
-                BatchedScanResult result = new BatchedScanResult();
-                result.truncated = (in.readInt() == 1);
-                int count = in.readInt();
-                while (count-- > 0) {
-                    result.scanResults.add(ScanResult.CREATOR.createFromParcel(in));
-                }
-                return result;
-            }
-
-            public BatchedScanResult[] newArray(int size) {
-                return new BatchedScanResult[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/EAPConstants.java b/wifi/java/android/net/wifi/EAPConstants.java
deleted file mode 100644
index b5f7c94..0000000
--- a/wifi/java/android/net/wifi/EAPConstants.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-/**
- * Utility class containing EAP (Extensible Authentication Protocol) Related constants.
- *
- * @hide
- */
-public final class EAPConstants {
-    // Constant definition for EAP types. Refer to
-    // http://www.iana.org/assignments/eap-numbers/eap-numbers.xhtml for more info.
-    public static final int EAP_MD5 = 4;
-    public static final int EAP_OTP = 5;
-    public static final int EAP_RSA = 9;
-    public static final int EAP_KEA = 11;
-    public static final int EAP_KEA_VALIDATE = 12;
-    public static final int EAP_TLS = 13;
-    public static final int EAP_LEAP = 17;
-    public static final int EAP_SIM = 18;
-    public static final int EAP_TTLS = 21;
-    public static final int EAP_AKA = 23;
-    public static final int EAP_3Com = 24;
-    public static final int EAP_MSCHAPv2 = 26;
-    public static final int EAP_PEAP = 29;
-    public static final int EAP_POTP = 32;
-    public static final int EAP_ActiontecWireless = 35;
-    public static final int EAP_HTTPDigest = 38;
-    public static final int EAP_SPEKE = 41;
-    public static final int EAP_MOBAC = 42;
-    public static final int EAP_FAST = 43;
-    public static final int EAP_ZLXEAP = 44;
-    public static final int EAP_Link = 45;
-    public static final int EAP_PAX = 46;
-    public static final int EAP_PSK = 47;
-    public static final int EAP_SAKE = 48;
-    public static final int EAP_IKEv2 = 49;
-    public static final int EAP_AKA_PRIME = 50;
-    public static final int EAP_GPSK = 51;
-    public static final int EAP_PWD = 52;
-    public static final int EAP_EKE = 53;
-    public static final int EAP_TEAP = 55;
-}
diff --git a/wifi/java/android/net/wifi/EasyConnectStatusCallback.java b/wifi/java/android/net/wifi/EasyConnectStatusCallback.java
deleted file mode 100644
index 6c2e6dd..0000000
--- a/wifi/java/android/net/wifi/EasyConnectStatusCallback.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.util.SparseArray;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.concurrent.Executor;
-
-/**
- * Easy Connect (DPP) Status Callback. Use this callback to get status updates (success, failure,
- * progress) from the Easy Connect operations.
- */
-public abstract class EasyConnectStatusCallback {
-    /**
-     * Easy Connect R1 Success event: Configuration sent (Configurator mode). This is the last
-     * and final Easy Connect event when either the local device or remote device implement R1.
-     * If both devices implement R2, this event will never be received, and the
-     * {@link #EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED} will be received.
-     * @hide
-     */
-    @SystemApi
-    public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT = 0;
-
-    /**
-     * Easy Connect R2 Success event: Configuration applied by Enrollee (Configurator mode).
-     * This is the last and final Easy Connect event when both the local device and remote device
-     * implement R2. If either the local device or remote device implement R1, this event will never
-     * be received, and the {@link #EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT} will be received.
-     * @hide
-     */
-    @SystemApi
-    public static final int EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED = 1;
-
-    /** @hide */
-    @IntDef(prefix = {"EASY_CONNECT_EVENT_SUCCESS_"}, value = {
-            EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_SENT,
-            EASY_CONNECT_EVENT_SUCCESS_CONFIGURATION_APPLIED,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface EasyConnectSuccessStatusCode {
-    }
-
-    /**
-     * Easy Connect Progress event: Initial authentication with peer succeeded.
-     * @hide
-     */
-    @SystemApi
-    public static final int EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS = 0;
-
-    /**
-     * Easy Connect Progress event: Peer requires more time to process bootstrapping.
-     * @hide
-     */
-    @SystemApi
-    public static final int EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING = 1;
-
-    /**
-     * Easy Connect R2 Progress event: Configuration sent to Enrollee, waiting for response
-     * @hide
-     */
-    @SystemApi
-    public static final int EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_SENT_WAITING_RESPONSE = 2;
-
-    /**
-     * Easy Connect R2 Progress event: Configuration accepted by Enrollee, waiting for response
-     * @hide
-     */
-    @SystemApi
-    public static final int EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_ACCEPTED = 3;
-
-    /** @hide */
-    @IntDef(prefix = {"EASY_CONNECT_EVENT_PROGRESS_"}, value = {
-            EASY_CONNECT_EVENT_PROGRESS_AUTHENTICATION_SUCCESS,
-            EASY_CONNECT_EVENT_PROGRESS_RESPONSE_PENDING,
-            EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_SENT_WAITING_RESPONSE,
-            EASY_CONNECT_EVENT_PROGRESS_CONFIGURATION_ACCEPTED,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface EasyConnectProgressStatusCode {
-    }
-
-    /**
-     * Easy Connect Failure event: Scanned QR code is either not a Easy Connect URI, or the Easy
-     * Connect URI has errors.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_INVALID_URI = -1;
-
-    /**
-     * Easy Connect Failure event: Bootstrapping/Authentication initialization process failure.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION = -2;
-
-    /**
-     * Easy Connect Failure event: Both devices are implementing the same role and are incompatible.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE = -3;
-
-    /**
-     * Easy Connect Failure event: Configuration process has failed due to malformed message.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_CONFIGURATION = -4;
-
-    /**
-     * Easy Connect Failure event: Easy Connect request while in another Easy Connect exchange.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_BUSY = -5;
-
-    /**
-     * Easy Connect Failure event: No response from the peer.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_TIMEOUT = -6;
-
-    /**
-     * Easy Connect Failure event: General protocol failure.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_GENERIC = -7;
-
-    /**
-     * Easy Connect Failure event: Feature or option is not supported.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED = -8;
-
-    /**
-     * Easy Connect Failure event: Invalid network provided to Easy Connect configurator.
-     * Network must either be WPA3-Personal (SAE) or WPA2-Personal (PSK).
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK = -9;
-
-    /**
-     * Easy Connect R2 Failure event: Enrollee cannot find the network.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK = -10;
-
-    /**
-     * Easy Connect R2 Failure event: Enrollee failed to authenticate with the network.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION = -11;
-
-    /**
-     * Easy Connect R2 Failure event: Enrollee rejected the configuration.
-     */
-    public static final int EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION = -12;
-
-    /** @hide */
-    @IntDef(prefix = {"EASY_CONNECT_EVENT_FAILURE_"}, value = {
-            EASY_CONNECT_EVENT_FAILURE_INVALID_URI,
-            EASY_CONNECT_EVENT_FAILURE_AUTHENTICATION,
-            EASY_CONNECT_EVENT_FAILURE_NOT_COMPATIBLE,
-            EASY_CONNECT_EVENT_FAILURE_CONFIGURATION,
-            EASY_CONNECT_EVENT_FAILURE_BUSY,
-            EASY_CONNECT_EVENT_FAILURE_TIMEOUT,
-            EASY_CONNECT_EVENT_FAILURE_GENERIC,
-            EASY_CONNECT_EVENT_FAILURE_NOT_SUPPORTED,
-            EASY_CONNECT_EVENT_FAILURE_INVALID_NETWORK,
-            EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK,
-            EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION,
-            EASY_CONNECT_EVENT_FAILURE_ENROLLEE_REJECTED_CONFIGURATION,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface EasyConnectFailureStatusCode {
-    }
-
-    /** @hide */
-    @SystemApi
-    public EasyConnectStatusCallback() {
-        // Fully-static utility classes must not have constructor
-    }
-
-    /**
-     * Called when local Easy Connect Enrollee successfully receives a new Wi-Fi configuration from
-     * the
-     * peer Easy Connect configurator. This callback marks the successful end of the Easy Connect
-     * current Easy Connect
-     * session, and no further callbacks will be called. This callback is the successful outcome
-     * of a Easy Connect flow starting with
-     * {@link WifiManager#startEasyConnectAsEnrolleeInitiator(String, Executor,
-     * EasyConnectStatusCallback)} .
-     *
-     * @param newNetworkId New Wi-Fi configuration with a network ID received from the configurator
-     * @hide
-     */
-    @SystemApi
-    public abstract void onEnrolleeSuccess(int newNetworkId);
-
-    /**
-     * Called when a Easy Connect success event takes place, except for when configuration is
-     * received from an external Configurator. The callback onSuccessConfigReceived will be used in
-     * this case. This callback marks the successful end of the current Easy Connect session, and no
-     * further callbacks will be called. This callback is the successful outcome of a Easy Connect
-     * flow starting with {@link WifiManager#startEasyConnectAsConfiguratorInitiator(String, int,
-     * int, Executor,EasyConnectStatusCallback)}.
-     *
-     * @param code Easy Connect success status code.
-     * @hide
-     */
-    @SystemApi
-    public abstract void onConfiguratorSuccess(@EasyConnectSuccessStatusCode int code);
-
-    /**
-     * Called when a Easy Connect Failure event takes place. This callback marks the unsuccessful
-     * end of the current Easy Connect session, and no further callbacks will be called.
-     *
-     * @param code Easy Connect failure status code.
-     * @hide
-     */
-    @SystemApi
-    public void onFailure(@EasyConnectFailureStatusCode int code) {}
-
-    /**
-     * Called when a Easy Connect Failure event takes place. This callback marks the unsuccessful
-     * end of the current Easy Connect session, and no further callbacks will be called.
-     *
-     * Note: Easy Connect (DPP) R2, provides additional details for the Configurator when the
-     * remote Enrollee is unable to connect to a network. The ssid, channelList and bandList
-     * inputs are initialized only for the EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK failure
-     * code, and the ssid and bandList are initialized for the
-     * EASY_CONNECT_EVENT_FAILURE_ENROLLEE_AUTHENTICATION failure code.
-     *
-     * @param code Easy Connect failure status code.
-     * @param ssid SSID of the network the Enrollee tried to connect to.
-     * @param channelListArray List of Global Operating classes and channel sets the Enrollee used
-     *                         to scan to find the network, see the "DPP Connection Status Object"
-     *                         section in the specification for the format, and Table E-4 in
-     *                         IEEE Std 802.11-2016 - Global operating classes for more details.
-     *                         The sparse array key is the Global Operating class, and the value
-     *                         is an integer array of Wi-Fi channels.
-     * @param operatingClassArray Array of bands the Enrollee supports as expressed as the Global
-     *                            Operating Class, see Table E-4 in IEEE Std 802.11-2016 - Global
-     *                            operating classes.
-     * @hide
-     */
-    @SystemApi
-    public void onFailure(@EasyConnectFailureStatusCode int code, @Nullable String ssid,
-            @NonNull SparseArray<int[]> channelListArray, @NonNull int[] operatingClassArray) {
-        onFailure(code);
-    }
-
-    /**
-     * Called when Easy Connect events that indicate progress take place. Can be used by UI elements
-     * to show progress.
-     *
-     * @param code Easy Connect progress status code.
-     * @hide
-     */
-    @SystemApi
-    public abstract void onProgress(@EasyConnectProgressStatusCode int code);
-}
diff --git a/wifi/java/android/net/wifi/IActionListener.aidl b/wifi/java/android/net/wifi/IActionListener.aidl
deleted file mode 100644
index faa0901..0000000
--- a/wifi/java/android/net/wifi/IActionListener.aidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-/**
- * Interface for generic wifi callbacks.
- * @hide
- */
-oneway interface IActionListener
-{
-    void onSuccess();
-    void onFailure(int reason);
-}
diff --git a/wifi/java/android/net/wifi/IDppCallback.aidl b/wifi/java/android/net/wifi/IDppCallback.aidl
deleted file mode 100644
index d7a958a..0000000
--- a/wifi/java/android/net/wifi/IDppCallback.aidl
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-/**
- * Interface for DPP callback.
- *
- * @hide
- */
-oneway interface IDppCallback
-{
-    /**
-     * Called when local DPP Enrollee successfully receives a new Wi-Fi configuratrion from the
-     * peer DPP configurator.
-     */
-    void onSuccessConfigReceived(int newNetworkId);
-
-    /**
-     * Called when DPP success events take place, except for when configuration is received from
-     * an external Configurator. The callback onSuccessConfigReceived will be used in this case.
-     */
-    void onSuccess(int status);
-
-    /**
-     * Called when DPP Failure events take place.
-     */
-    void onFailure(int status, String ssid, String channelList, in int[] bandArray);
-
-    /**
-     * Called when DPP events that indicate progress take place. Can be used by UI elements
-     * to show progress.
-     */
-    void onProgress(int status);
-}
diff --git a/wifi/java/android/net/wifi/ILocalOnlyHotspotCallback.aidl b/wifi/java/android/net/wifi/ILocalOnlyHotspotCallback.aidl
deleted file mode 100644
index b567f29..0000000
--- a/wifi/java/android/net/wifi/ILocalOnlyHotspotCallback.aidl
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Copyright (c) 2019, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.net.wifi.SoftApConfiguration;
-
-/**
- * Communicates LOHS status back to the application process.
- *
- * @hide
- */
-oneway interface ILocalOnlyHotspotCallback {
-    void onHotspotStarted(in SoftApConfiguration config);
-    void onHotspotStopped();
-    void onHotspotFailed(int reason);
-}
diff --git a/wifi/java/android/net/wifi/INetworkRequestMatchCallback.aidl b/wifi/java/android/net/wifi/INetworkRequestMatchCallback.aidl
deleted file mode 100644
index d14ec57..0000000
--- a/wifi/java/android/net/wifi/INetworkRequestMatchCallback.aidl
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.net.wifi.INetworkRequestUserSelectionCallback;
-import android.net.wifi.ScanResult;
-import android.net.wifi.WifiConfiguration;
-
-/**
- * Interface for network request match callback.
- *
- * @hide
- */
-oneway interface INetworkRequestMatchCallback
-{
-   void onUserSelectionCallbackRegistration(in INetworkRequestUserSelectionCallback userSelectionCallback);
-
-   void onAbort();
-
-   void onMatch(in List<ScanResult> scanResults);
-
-   void onUserSelectionConnectSuccess(in WifiConfiguration wificonfiguration);
-
-   void onUserSelectionConnectFailure(in WifiConfiguration wificonfiguration);
-}
diff --git a/wifi/java/android/net/wifi/INetworkRequestUserSelectionCallback.aidl b/wifi/java/android/net/wifi/INetworkRequestUserSelectionCallback.aidl
deleted file mode 100644
index 524cefb..0000000
--- a/wifi/java/android/net/wifi/INetworkRequestUserSelectionCallback.aidl
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.net.wifi.WifiConfiguration;
-
-/**
- * Interface for providing user selection in response to
- * network request match callback.
- * @hide
- */
-oneway interface INetworkRequestUserSelectionCallback
-{
-   void select(in WifiConfiguration wificonfiguration);
-
-   void reject();
-}
diff --git a/wifi/java/android/net/wifi/IOnWifiActivityEnergyInfoListener.aidl b/wifi/java/android/net/wifi/IOnWifiActivityEnergyInfoListener.aidl
deleted file mode 100644
index 7e25fd8a..0000000
--- a/wifi/java/android/net/wifi/IOnWifiActivityEnergyInfoListener.aidl
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.os.connectivity.WifiActivityEnergyInfo;
-
-/**
- * Interface for Wi-Fi activity energy info listener.
- *
- * @hide
- */
-oneway interface IOnWifiActivityEnergyInfoListener
-{
-    /**
-     * Service to manager callback providing current Wi-Fi activity energy info.
-     * @param info the Wi-Fi activity energy info
-     */
-    void onWifiActivityEnergyInfo(in WifiActivityEnergyInfo info);
-}
diff --git a/wifi/java/android/net/wifi/IOnWifiUsabilityStatsListener.aidl b/wifi/java/android/net/wifi/IOnWifiUsabilityStatsListener.aidl
deleted file mode 100644
index 4687f30..0000000
--- a/wifi/java/android/net/wifi/IOnWifiUsabilityStatsListener.aidl
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.net.wifi.WifiUsabilityStatsEntry;
-
-/**
- * Interface for Wi-Fi usability stats listener.
- *
- * @hide
- */
-oneway interface IOnWifiUsabilityStatsListener
-{
-    /**
-     * Service to manager callback providing current Wi-Fi usability stats.
-     *
-     * @param seqNum The sequence number of stats, used to derive the timing of updated Wi-Fi
-     *               usability statistics, set by framework and shall be incremented by one
-     *               after each update.
-     * @param isSameBssidAndFreq The flag to indicate whether the BSSID and the frequency of
-     *                           network stays the same or not relative to the last update of
-     *                           Wi-Fi usability stats.
-     * @param stats The updated Wi-Fi usability statistics.
-     */
-    void onWifiUsabilityStats(int seqNum, boolean isSameBssidAndFreq,
-            in WifiUsabilityStatsEntry stats);
-}
diff --git a/wifi/java/android/net/wifi/IScanResultsCallback.aidl b/wifi/java/android/net/wifi/IScanResultsCallback.aidl
deleted file mode 100644
index 56f6025..0000000
--- a/wifi/java/android/net/wifi/IScanResultsCallback.aidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-/**
- * Interface for Wi-Fi scan result available callback.
- *
- * @hide
- */
-oneway interface IScanResultsCallback
-{
-    void onScanResultsAvailable();
-}
diff --git a/wifi/java/android/net/wifi/IScanResultsListener.aidl b/wifi/java/android/net/wifi/IScanResultsListener.aidl
deleted file mode 100644
index e7eaddd..0000000
--- a/wifi/java/android/net/wifi/IScanResultsListener.aidl
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-/** @hide */
-
-oneway interface IScanResultsListener
-{
-    void onScanResultsAvailable();
-}
diff --git a/wifi/java/android/net/wifi/ISoftApCallback.aidl b/wifi/java/android/net/wifi/ISoftApCallback.aidl
deleted file mode 100644
index f81bcb9..0000000
--- a/wifi/java/android/net/wifi/ISoftApCallback.aidl
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-import android.net.wifi.SoftApCapability;
-import android.net.wifi.SoftApInfo;
-
-import android.net.wifi.WifiClient;
-
-/**
- * Interface for Soft AP callback.
- *
- * @hide
- */
-oneway interface ISoftApCallback
-{
-    /**
-     * Service to manager callback providing current soft AP state. The possible
-     * parameter values listed are defined in WifiManager.java
-     *
-     * @param state new AP state. One of WIFI_AP_STATE_DISABLED,
-     *        WIFI_AP_STATE_DISABLING, WIFI_AP_STATE_ENABLED,
-     *        WIFI_AP_STATE_ENABLING, WIFI_AP_STATE_FAILED
-     * @param failureReason reason when in failed state. One of
-     *        SAP_START_FAILURE_GENERAL, SAP_START_FAILURE_NO_CHANNEL
-     */
-    void onStateChanged(int state, int failureReason);
-
-    /**
-     * Service to manager callback providing connected client's information.
-     *
-     * @param clients the currently connected clients
-     */
-    void onConnectedClientsChanged(in List<WifiClient> clients);
-
-    /**
-     * Service to manager callback providing information of softap.
-     *
-     * @param softApInfo is the softap information. {@link SoftApInfo}
-     */
-    void onInfoChanged(in SoftApInfo softApInfo);
-
-
-    /**
-     * Service to manager callback providing capability of softap.
-     *
-     * @param capability is the softap capability. {@link SoftApCapability}
-     */
-    void onCapabilityChanged(in SoftApCapability capability);
-
-    /**
-     * Service to manager callback providing blocked client of softap with specific reason code.
-     *
-     * @param client the currently blocked client.
-     * @param blockedReason one of blocked reason from {@link WifiManager.SapClientBlockedReason}
-     */
-    void onBlockedClientConnecting(in WifiClient client, int blockedReason);
-}
diff --git a/wifi/java/android/net/wifi/ISuggestionConnectionStatusListener.aidl b/wifi/java/android/net/wifi/ISuggestionConnectionStatusListener.aidl
deleted file mode 100644
index b49e49b..0000000
--- a/wifi/java/android/net/wifi/ISuggestionConnectionStatusListener.aidl
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.net.wifi.WifiNetworkSuggestion;
-
-/**
- * Interface for suggestion network connection listener.
- *
- * @hide
- */
-oneway interface ISuggestionConnectionStatusListener
-{
-   void onConnectionStatus(in WifiNetworkSuggestion wifiNetworkSuggestion, int failureReason);
-}
diff --git a/wifi/java/android/net/wifi/ITrafficStateCallback.aidl b/wifi/java/android/net/wifi/ITrafficStateCallback.aidl
deleted file mode 100644
index 0c8e777..0000000
--- a/wifi/java/android/net/wifi/ITrafficStateCallback.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-/**
- * Interface for Traffic state callback.
- *
- * @hide
- */
-oneway interface ITrafficStateCallback
-{
-   /**
-    * Callback invoked to inform clients about the current traffic state.
-    *
-    * @param state One of the values: {@link #DATA_ACTIVITY_NONE}, {@link #DATA_ACTIVITY_IN},
-    * {@link #DATA_ACTIVITY_OUT} & {@link #DATA_ACTIVITY_INOUT}.
-    * @hide
-    */
-   void onStateChanged(int state);
-}
diff --git a/wifi/java/android/net/wifi/ITxPacketCountListener.aidl b/wifi/java/android/net/wifi/ITxPacketCountListener.aidl
deleted file mode 100644
index 9105bd0..0000000
--- a/wifi/java/android/net/wifi/ITxPacketCountListener.aidl
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-/**
- * Interface for tx packet counter callback.
- * @deprecated no longer used, remove once removed from BaseWifiService
- * @hide
- */
-oneway interface ITxPacketCountListener
-{
-    void onSuccess(int count);
-    void onFailure(int reason);
-}
diff --git a/wifi/java/android/net/wifi/IWifiConnectedNetworkScorer.aidl b/wifi/java/android/net/wifi/IWifiConnectedNetworkScorer.aidl
deleted file mode 100644
index f96d037c..0000000
--- a/wifi/java/android/net/wifi/IWifiConnectedNetworkScorer.aidl
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.net.wifi.IScoreUpdateObserver;
-
-/**
- * Interface for Wi-Fi connected network scorer.
- *
- * @hide
- */
-oneway interface IWifiConnectedNetworkScorer
-{
-    void onStart(int sessionId);
-
-    void onStop(int sessionId);
-
-    void onSetScoreUpdateObserver(IScoreUpdateObserver observerImpl);
-}
diff --git a/wifi/java/android/net/wifi/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
deleted file mode 100644
index 3f79364..0000000
--- a/wifi/java/android/net/wifi/IWifiManager.aidl
+++ /dev/null
@@ -1,278 +0,0 @@
-/**
- * Copyright (c) 2008, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.content.pm.ParceledListSlice;
-
-import android.net.wifi.hotspot2.OsuProvider;
-import android.net.wifi.hotspot2.PasspointConfiguration;
-import android.net.wifi.hotspot2.IProvisioningCallback;
-
-import android.net.DhcpInfo;
-import android.net.Network;
-import android.net.wifi.IActionListener;
-import android.net.wifi.IDppCallback;
-import android.net.wifi.ILocalOnlyHotspotCallback;
-import android.net.wifi.INetworkRequestMatchCallback;
-import android.net.wifi.IOnWifiActivityEnergyInfoListener;
-import android.net.wifi.IOnWifiUsabilityStatsListener;
-import android.net.wifi.IScanResultsCallback;
-import android.net.wifi.ISoftApCallback;
-import android.net.wifi.ISuggestionConnectionStatusListener;
-import android.net.wifi.ITrafficStateCallback;
-import android.net.wifi.IWifiConnectedNetworkScorer;
-import android.net.wifi.ScanResult;
-import android.net.wifi.SoftApConfiguration;
-import android.net.wifi.WifiConfiguration;
-import android.net.wifi.WifiInfo;
-import android.net.wifi.WifiNetworkSuggestion;
-
-import android.os.Messenger;
-import android.os.ResultReceiver;
-import android.os.WorkSource;
-
-/**
- * Interface that allows controlling and querying Wi-Fi connectivity.
- *
- * {@hide}
- */
-interface IWifiManager
-{
-    long getSupportedFeatures();
-
-    oneway void getWifiActivityEnergyInfoAsync(in IOnWifiActivityEnergyInfoListener listener);
-
-    ParceledListSlice getConfiguredNetworks(String packageName, String featureId);
-
-    ParceledListSlice getPrivilegedConfiguredNetworks(String packageName, String featureId);
-
-    Map getAllMatchingFqdnsForScanResults(in List<ScanResult> scanResult);
-
-    Map getMatchingOsuProviders(in List<ScanResult> scanResult);
-
-    Map getMatchingPasspointConfigsForOsuProviders(in List<OsuProvider> osuProviders);
-
-    int addOrUpdateNetwork(in WifiConfiguration config, String packageName);
-
-    boolean addOrUpdatePasspointConfiguration(in PasspointConfiguration config, String packageName);
-
-    boolean removePasspointConfiguration(in String fqdn, String packageName);
-
-    List<PasspointConfiguration> getPasspointConfigurations(in String packageName);
-
-    List<WifiConfiguration> getWifiConfigsForPasspointProfiles(in List<String> fqdnList);
-
-    void queryPasspointIcon(long bssid, String fileName);
-
-    int matchProviderWithCurrentNetwork(String fqdn);
-
-    void deauthenticateNetwork(long holdoff, boolean ess);
-
-    boolean removeNetwork(int netId, String packageName);
-
-    boolean enableNetwork(int netId, boolean disableOthers, String packageName);
-
-    boolean disableNetwork(int netId, String packageName);
-
-    void allowAutojoinGlobal(boolean choice);
-
-    void allowAutojoin(int netId, boolean choice);
-
-    void allowAutojoinPasspoint(String fqdn, boolean enableAutoJoin);
-
-    void setMacRandomizationSettingPasspointEnabled(String fqdn, boolean enable);
-
-    void setPasspointMeteredOverride(String fqdn, int meteredOverride);
-
-    boolean startScan(String packageName, String featureId);
-
-    List<ScanResult> getScanResults(String callingPackage, String callingFeatureId);
-
-    boolean disconnect(String packageName);
-
-    boolean reconnect(String packageName);
-
-    boolean reassociate(String packageName);
-
-    WifiInfo getConnectionInfo(String callingPackage, String callingFeatureId);
-
-    boolean setWifiEnabled(String packageName, boolean enable);
-
-    int getWifiEnabledState();
-
-    String getCountryCode();
-
-    boolean is5GHzBandSupported();
-
-    boolean is6GHzBandSupported();
-
-    boolean isWifiStandardSupported(int standard);
-
-    DhcpInfo getDhcpInfo();
-
-    void setScanAlwaysAvailable(boolean isAvailable);
-
-    boolean isScanAlwaysAvailable();
-
-    boolean acquireWifiLock(IBinder lock, int lockType, String tag, in WorkSource ws);
-
-    void updateWifiLockWorkSource(IBinder lock, in WorkSource ws);
-
-    boolean releaseWifiLock(IBinder lock);
-
-    void initializeMulticastFiltering();
-
-    boolean isMulticastEnabled();
-
-    void acquireMulticastLock(IBinder binder, String tag);
-
-    void releaseMulticastLock(String tag);
-
-    void updateInterfaceIpState(String ifaceName, int mode);
-
-    boolean startSoftAp(in WifiConfiguration wifiConfig);
-
-    boolean startTetheredHotspot(in SoftApConfiguration softApConfig);
-
-    boolean stopSoftAp();
-
-    int startLocalOnlyHotspot(in ILocalOnlyHotspotCallback callback, String packageName,
-                              String featureId, in SoftApConfiguration customConfig);
-
-    void stopLocalOnlyHotspot();
-
-    void startWatchLocalOnlyHotspot(in ILocalOnlyHotspotCallback callback);
-
-    void stopWatchLocalOnlyHotspot();
-
-    @UnsupportedAppUsage
-    int getWifiApEnabledState();
-
-    @UnsupportedAppUsage
-    WifiConfiguration getWifiApConfiguration();
-
-    SoftApConfiguration getSoftApConfiguration();
-
-    boolean setWifiApConfiguration(in WifiConfiguration wifiConfig, String packageName);
-
-    boolean setSoftApConfiguration(in SoftApConfiguration softApConfig, String packageName);
-
-    void notifyUserOfApBandConversion(String packageName);
-
-    void enableTdls(String remoteIPAddress, boolean enable);
-
-    void enableTdlsWithMacAddress(String remoteMacAddress, boolean enable);
-
-    String getCurrentNetworkWpsNfcConfigurationToken();
-
-    void enableVerboseLogging(int verbose);
-
-    int getVerboseLoggingLevel();
-
-    void disableEphemeralNetwork(String SSID, String packageName);
-
-    void factoryReset(String packageName);
-
-    @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553)
-    Network getCurrentNetwork();
-
-    byte[] retrieveBackupData();
-
-    void restoreBackupData(in byte[] data);
-
-    byte[] retrieveSoftApBackupData();
-
-    SoftApConfiguration restoreSoftApBackupData(in byte[] data);
-
-    void restoreSupplicantBackupData(in byte[] supplicantData, in byte[] ipConfigData);
-
-    void startSubscriptionProvisioning(in OsuProvider provider, in IProvisioningCallback callback);
-
-    void registerSoftApCallback(in IBinder binder, in ISoftApCallback callback, int callbackIdentifier);
-
-    void unregisterSoftApCallback(int callbackIdentifier);
-
-    void addOnWifiUsabilityStatsListener(in IBinder binder, in IOnWifiUsabilityStatsListener listener, int listenerIdentifier);
-
-    void removeOnWifiUsabilityStatsListener(int listenerIdentifier);
-
-    void registerTrafficStateCallback(in IBinder binder, in ITrafficStateCallback callback, int callbackIdentifier);
-
-    void unregisterTrafficStateCallback(int callbackIdentifier);
-
-    void registerNetworkRequestMatchCallback(in IBinder binder, in INetworkRequestMatchCallback callback, int callbackIdentifier);
-
-    void unregisterNetworkRequestMatchCallback(int callbackIdentifier);
-
-    int addNetworkSuggestions(in List<WifiNetworkSuggestion> networkSuggestions, in String packageName,
-        in String featureId);
-
-    int removeNetworkSuggestions(in List<WifiNetworkSuggestion> networkSuggestions, in String packageName);
-
-    List<WifiNetworkSuggestion> getNetworkSuggestions(in String packageName);
-
-    String[] getFactoryMacAddresses();
-
-    void setDeviceMobilityState(int state);
-
-    void startDppAsConfiguratorInitiator(in IBinder binder, in String enrolleeUri,
-        int selectedNetworkId, int netRole, in IDppCallback callback);
-
-    void startDppAsEnrolleeInitiator(in IBinder binder, in String configuratorUri,
-        in IDppCallback callback);
-
-    void stopDppSession();
-
-    void updateWifiUsabilityScore(int seqNum, int score, int predictionHorizonSec);
-
-    oneway void connect(in WifiConfiguration config, int netId, in IBinder binder, in IActionListener listener, int callbackIdentifier);
-
-    oneway void save(in WifiConfiguration config, in IBinder binder, in IActionListener listener, int callbackIdentifier);
-
-    oneway void forget(int netId, in IBinder binder, in IActionListener listener, int callbackIdentifier);
-
-    void registerScanResultsCallback(in IScanResultsCallback callback);
-
-    void unregisterScanResultsCallback(in IScanResultsCallback callback);
-
-    void registerSuggestionConnectionStatusListener(in IBinder binder, in ISuggestionConnectionStatusListener listener, int listenerIdentifier, String packageName, String featureId);
-
-    void unregisterSuggestionConnectionStatusListener(int listenerIdentifier, String packageName);
-
-    int calculateSignalLevel(int rssi);
-
-    List<WifiConfiguration> getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(in List<ScanResult> scanResults);
-
-    boolean setWifiConnectedNetworkScorer(in IBinder binder, in IWifiConnectedNetworkScorer scorer);
-
-    void clearWifiConnectedNetworkScorer();
-
-    /**
-     * Return the Map of {@link WifiNetworkSuggestion} and the list of <ScanResult>
-     */
-    Map getMatchingScanResults(in List<WifiNetworkSuggestion> networkSuggestions, in List<ScanResult> scanResults, String callingPackage, String callingFeatureId);
-
-    void setScanThrottleEnabled(boolean enable);
-
-    boolean isScanThrottleEnabled();
-
-    Map getAllMatchingPasspointProfilesForScanResults(in List<ScanResult> scanResult);
-
-    void setAutoWakeupEnabled(boolean enable);
-
-    boolean isAutoWakeupEnabled();
-}
diff --git a/wifi/java/android/net/wifi/IWifiScanner.aidl b/wifi/java/android/net/wifi/IWifiScanner.aidl
deleted file mode 100644
index 485f5ce..0000000
--- a/wifi/java/android/net/wifi/IWifiScanner.aidl
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.os.Messenger;
-import android.os.Bundle;
-
-/**
- * {@hide}
- */
-interface IWifiScanner
-{
-    Messenger getMessenger();
-
-    Bundle getAvailableChannels(int band, String packageName, String featureId);
-}
diff --git a/wifi/java/android/net/wifi/ParcelUtil.java b/wifi/java/android/net/wifi/ParcelUtil.java
deleted file mode 100644
index a26877d..0000000
--- a/wifi/java/android/net/wifi/ParcelUtil.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.os.Parcel;
-
-import java.io.ByteArrayInputStream;
-import java.security.KeyFactory;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509Certificate;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.PKCS8EncodedKeySpec;
-
-/**
- * Provides utilities for writing/reading a non-Parcelable objects to/from
- * a Parcel object.
- *
- * @hide
- */
-public class ParcelUtil {
-    /**
-     * Write a PrivateKey object |key| to the specified Parcel |dest|.
-     *
-     * Below is the data format:
-     * |algorithm|     -> String of algorithm name
-     * |endcodedKey|  -> byte[] of key data
-     *
-     * For a null PrivateKey object, a null string will be written to |algorithm| and
-     * |encodedKey| will be skipped. Since a PrivateKey can only be constructed with
-     * a valid algorithm String.
-     *
-     * @param dest Parcel object to write to
-     * @param key PrivateKey object to read from.
-     */
-    public static void writePrivateKey(Parcel dest, PrivateKey key) {
-        if (key == null) {
-            dest.writeString(null);
-            return;
-        }
-
-        dest.writeString(key.getAlgorithm());
-        dest.writeByteArray(key.getEncoded());
-    }
-
-    /**
-     * Read/create a PrivateKey object from a specified Parcel object |in|.
-     *
-     * Refer to the function above for the expected data format.
-     *
-     * @param in Parcel object to read from
-     * @return a PrivateKey object or null
-     */
-    public static PrivateKey readPrivateKey(Parcel in) {
-        String algorithm = in.readString();
-        if (algorithm == null) {
-            return null;
-        }
-
-        byte[] userKeyBytes = in.createByteArray();
-        try {
-            KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
-            return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(userKeyBytes));
-       } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
-            return null;
-       }
-    }
-
-    /**
-     * Write a X509Certificate object |cert| to a Parcel object |dest|.
-     * The data being written to the Parcel is just a byte[] of the encoded certificate data.
-     *
-     * @param dest Parcel object to write to
-     * @param cert X509Certificate object to read from
-     */
-    public static void writeCertificate(Parcel dest, X509Certificate cert) {
-        byte[] certBytes = null;
-        if (cert != null) {
-            try {
-                certBytes = cert.getEncoded();
-            } catch (CertificateEncodingException e) {
-                /* empty, write null. */
-            }
-        }
-        dest.writeByteArray(certBytes);
-    }
-
-    /**
-     * Read/create a X509Certificate object from a specified Parcel object |in|.
-     *
-     * @param in Parcel object to read from
-     * @return a X509Certficate object or null
-     */
-    public static X509Certificate readCertificate(Parcel in) {
-        byte[] certBytes = in.createByteArray();
-        if (certBytes == null) {
-            return null;
-        }
-
-        try {
-            CertificateFactory cFactory = CertificateFactory.getInstance("X.509");
-            return (X509Certificate) cFactory
-                    .generateCertificate(new ByteArrayInputStream(certBytes));
-        } catch (CertificateException e) {
-            return null;
-        }
-    }
-
-    /**
-     * Write an array of X509Certificate objects |certs| to a Parcel object |dest|.
-     * The data being written to the Parcel are consist of an integer indicating
-     * the size of the array and the certificates data.  Certificates data will be
-     * skipped for a null array or size of 0 array.
-     *
-     * @param dest Parcel object to write to
-     * @param certs array of X509Certificate objects to read from
-     */
-    public static void writeCertificates(Parcel dest, X509Certificate[] certs) {
-        if (certs == null || certs.length == 0) {
-            dest.writeInt(0);
-            return;
-        }
-
-        dest.writeInt(certs.length);
-        for (int i = 0; i < certs.length; i++) {
-            writeCertificate(dest, certs[i]);
-        }
-    }
-
-    /**
-     * Read/create an array of X509Certificate objects from a specified Parcel object |in|.
-     *
-     * @param in Parcel object to read from
-     * @return X509Certficate[] or null
-     */
-    public static X509Certificate[] readCertificates(Parcel in) {
-        int length = in.readInt();
-        if (length == 0) {
-            return null;
-        }
-
-        X509Certificate[] certs = new X509Certificate[length];
-        for (int i = 0; i < length; i++) {
-            certs[i] = readCertificate(in);
-        }
-        return certs;
-    }
-}
diff --git a/wifi/java/android/net/wifi/RttManager.aidl b/wifi/java/android/net/wifi/RttManager.aidl
deleted file mode 100644
index 9479cf0..0000000
--- a/wifi/java/android/net/wifi/RttManager.aidl
+++ /dev/null
@@ -1,21 +0,0 @@
-/**
- * Copyright (c) 2015, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-parcelable RttManager.RttCapabilities;
-parcelable RttManager.ParcelableRttResults;
-parcelable RttManager.ParcelableRttParams;
diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java
deleted file mode 100644
index 034defb..0000000
--- a/wifi/java/android/net/wifi/RttManager.java
+++ /dev/null
@@ -1,1233 +0,0 @@
-package android.net.wifi;
-
-import android.Manifest;
-import android.annotation.NonNull;
-import android.annotation.RequiresPermission;
-import android.annotation.SuppressLint;
-import android.annotation.SystemApi;
-import android.annotation.SystemService;
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.net.wifi.rtt.RangingRequest;
-import android.net.wifi.rtt.RangingResult;
-import android.net.wifi.rtt.RangingResultCallback;
-import android.net.wifi.rtt.WifiRttManager;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.SystemClock;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.Protocol;
-
-import java.util.List;
-
-/** @hide */
-@SystemApi
-@Deprecated
-@SystemService(Context.WIFI_RTT_SERVICE)
-public class RttManager {
-
-    private static final boolean DBG = false;
-    private static final String TAG = "RttManager";
-
-    /** @deprecated It is Not supported anymore. */
-    @Deprecated
-    public static final int RTT_TYPE_UNSPECIFIED        = 0;
-
-    public static final int RTT_TYPE_ONE_SIDED          = 1;
-    public static final int RTT_TYPE_TWO_SIDED          = 2;
-
-    /** @deprecated It is not supported anymore. */
-    @Deprecated
-    public static final int RTT_TYPE_11_V               = 2;
-
-    /** @deprecated It is not supported anymore. */
-    @Deprecated
-    public static final int RTT_TYPE_11_MC              = 4;
-
-    /** @deprecated It is not supported anymore. */
-    @Deprecated
-    public static final int RTT_PEER_TYPE_UNSPECIFIED    = 0;
-
-    public static final int RTT_PEER_TYPE_AP             = 1;
-    public static final int RTT_PEER_TYPE_STA            = 2;       /* requires NAN */
-    public static final int RTT_PEER_P2P_GO              = 3;
-    public static final int RTT_PEER_P2P_CLIENT          = 4;
-    public static final int RTT_PEER_NAN                 = 5;
-
-    /**
-     * @deprecated It is not supported anymore.
-     * Use {@link android.net.wifi.RttManager#RTT_BW_20_SUPPORT} API.
-     */
-    @Deprecated
-    public static final int RTT_CHANNEL_WIDTH_20      = 0;
-
-    /**
-     * @deprecated It is not supported anymore.
-     * Use {@link android.net.wifi.RttManager#RTT_BW_40_SUPPORT} API.
-     */
-    @Deprecated
-    public static final int RTT_CHANNEL_WIDTH_40      = 1;
-
-    /**
-     * @deprecated It is not supported anymore.
-     * Use {@link android.net.wifi.RttManager#RTT_BW_80_SUPPORT} API.
-     */
-    @Deprecated
-    public static final int RTT_CHANNEL_WIDTH_80      = 2;
-
-    /**@deprecated It is not supported anymore.
-     * Use {@link android.net.wifi.RttManager#RTT_BW_160_SUPPORT} API.
-     */
-    @Deprecated
-    public static final int RTT_CHANNEL_WIDTH_160     = 3;
-
-    /**@deprecated not supported anymore*/
-    @Deprecated
-    public static final int RTT_CHANNEL_WIDTH_80P80   = 4;
-
-    /**@deprecated It is not supported anymore.
-     * Use {@link android.net.wifi.RttManager#RTT_BW_5_SUPPORT} API.
-     */
-    @Deprecated
-    public static final int RTT_CHANNEL_WIDTH_5       = 5;
-
-    /**@deprecated It is not supported anymore.
-     * Use {@link android.net.wifi.RttManager#RTT_BW_10_SUPPORT} API.
-     */
-    @Deprecated
-    public static final int RTT_CHANNEL_WIDTH_10      = 6;
-
-    /** @deprecated channel info must be specified. */
-    @Deprecated
-    public static final int RTT_CHANNEL_WIDTH_UNSPECIFIED = -1;
-
-    public static final int RTT_STATUS_SUCCESS                  = 0;
-    /** General failure*/
-    public static final int RTT_STATUS_FAILURE                  = 1;
-    /** Destination does not respond to RTT request*/
-    public static final int RTT_STATUS_FAIL_NO_RSP              = 2;
-    /** RTT request is rejected by the destination. Double side RTT only*/
-    public static final int RTT_STATUS_FAIL_REJECTED            = 3;
-    /** */
-    public static final int RTT_STATUS_FAIL_NOT_SCHEDULED_YET   = 4;
-    /** Timing measurement timeout*/
-    public static final int RTT_STATUS_FAIL_TM_TIMEOUT          = 5;
-    /** Destination is on a different channel from the RTT Request*/
-    public static final int RTT_STATUS_FAIL_AP_ON_DIFF_CHANNEL  = 6;
-    /** This type of Ranging is not support by Hardware*/
-    public static final int RTT_STATUS_FAIL_NO_CAPABILITY       = 7;
-    /** Request abort fro uncertain reason*/
-    public static final int RTT_STATUS_ABORTED                  = 8;
-    /** The T1-T4 or TOD/TOA Timestamp is illegal*/
-    public static final int RTT_STATUS_FAIL_INVALID_TS          = 9;
-    /** 11mc protocol level failed, eg, unrecognized FTMR/FTM frame*/
-    public static final int RTT_STATUS_FAIL_PROTOCOL            = 10;
-    /** Request can not be scheduled by hardware*/
-    public static final int RTT_STATUS_FAIL_SCHEDULE            = 11;
-    /** destination is busy now, you can try after a specified time from destination*/
-    public static final int RTT_STATUS_FAIL_BUSY_TRY_LATER      = 12;
-    /** Bad Request argument*/
-    public static final int RTT_STATUS_INVALID_REQ              = 13;
-    /** Wifi is not enabled*/
-    public static final int RTT_STATUS_NO_WIFI                  = 14;
-    /** Responder overrides param info, cannot range with new params 2-side RTT only*/
-    public static final int RTT_STATUS_FAIL_FTM_PARAM_OVERRIDE  = 15;
-
-    public static final int REASON_UNSPECIFIED              = -1;
-    public static final int REASON_NOT_AVAILABLE            = -2;
-    public static final int REASON_INVALID_LISTENER         = -3;
-    public static final int REASON_INVALID_REQUEST          = -4;
-    /** Do not have required permission */
-    public static final int REASON_PERMISSION_DENIED        = -5;
-    /** Ranging failed because responder role is enabled in STA mode.*/
-    public static final int
-            REASON_INITIATOR_NOT_ALLOWED_WHEN_RESPONDER_ON  = -6;
-
-    public static final String DESCRIPTION_KEY  = "android.net.wifi.RttManager.Description";
-
-    /**
-     * RTT BW supported bit mask, used as RTT param bandWidth too
-     */
-    public static final int RTT_BW_5_SUPPORT   = 0x01;
-    public static final int RTT_BW_10_SUPPORT  = 0x02;
-    public static final int RTT_BW_20_SUPPORT  = 0x04;
-    public static final int RTT_BW_40_SUPPORT  = 0x08;
-    public static final int RTT_BW_80_SUPPORT  = 0x10;
-    public static final int RTT_BW_160_SUPPORT = 0x20;
-
-    /**
-     * RTT Preamble Support bit mask
-     */
-    public static final int PREAMBLE_LEGACY  = 0x01;
-    public static final int PREAMBLE_HT      = 0x02;
-    public static final int PREAMBLE_VHT     = 0x04;
-
-    /** @deprecated Use the new {@link android.net.wifi.RttManager.RttCapabilities} API */
-    @Deprecated
-    public class Capabilities {
-        public int supportedType;
-        public int supportedPeerType;
-    }
-
-    /** @deprecated Use the new {@link android.net.wifi.RttManager#getRttCapabilities()} API.*/
-    @Deprecated
-    @SuppressLint("RequiresPermission")
-    public Capabilities getCapabilities() {
-        throw new UnsupportedOperationException(
-                "getCapabilities is not supported in the adaptation layer");
-    }
-
-    /**
-     * This class describe the RTT capability of the Hardware
-     */
-    @Deprecated
-    public static class RttCapabilities implements Parcelable {
-        /** @deprecated It is not supported*/
-        @Deprecated
-        public boolean supportedType;
-        /** @deprecated It is not supported*/
-        @Deprecated
-        public boolean supportedPeerType;
-        //1-sided rtt measurement is supported
-        public boolean oneSidedRttSupported;
-        //11mc 2-sided rtt measurement is supported
-        public boolean twoSided11McRttSupported;
-        //location configuration information supported
-        public boolean lciSupported;
-        //location civic records supported
-        public boolean lcrSupported;
-        //preamble supported, see bit mask definition above
-        public int preambleSupported;
-        //RTT bandwidth supported
-        public int bwSupported;
-        // Whether STA responder role is supported.
-        public boolean responderSupported;
-
-        /** Whether the secure RTT protocol is supported. */
-        public boolean secureRttSupported;
-
-        /** Draft 11mc version supported, including major and minor version. e.g, draft 4.3 is 43 */
-        public int mcVersion;
-
-        @NonNull
-        @Override
-        public String toString() {
-            StringBuffer sb = new StringBuffer();
-            sb.append("oneSidedRtt ").
-            append(oneSidedRttSupported ? "is Supported. " : "is not supported. ").
-            append("twoSided11McRtt ").
-            append(twoSided11McRttSupported ? "is Supported. " : "is not supported. ").
-            append("lci ").
-            append(lciSupported ? "is Supported. " : "is not supported. ").
-            append("lcr ").
-            append(lcrSupported ? "is Supported. " : "is not supported. ");
-
-            if ((preambleSupported & PREAMBLE_LEGACY) != 0) {
-                sb.append("Legacy ");
-            }
-
-            if ((preambleSupported & PREAMBLE_HT) != 0) {
-                sb.append("HT ");
-            }
-
-            if ((preambleSupported & PREAMBLE_VHT) != 0) {
-                sb.append("VHT ");
-            }
-
-            sb.append("is supported. ");
-
-            if ((bwSupported & RTT_BW_5_SUPPORT) != 0) {
-                sb.append("5 MHz ");
-            }
-
-            if ((bwSupported & RTT_BW_10_SUPPORT) != 0) {
-                sb.append("10 MHz ");
-            }
-
-            if ((bwSupported & RTT_BW_20_SUPPORT) != 0) {
-                sb.append("20 MHz ");
-            }
-
-            if ((bwSupported & RTT_BW_40_SUPPORT) != 0) {
-                sb.append("40 MHz ");
-            }
-
-            if ((bwSupported & RTT_BW_80_SUPPORT) != 0) {
-                sb.append("80 MHz ");
-            }
-
-            if ((bwSupported & RTT_BW_160_SUPPORT) != 0) {
-                sb.append("160 MHz ");
-            }
-
-            sb.append("is supported.");
-
-            sb.append(" STA responder role is ")
-                    .append(responderSupported ? "supported" : "not supported");
-            sb.append(" Secure RTT protocol is ")
-                    .append(secureRttSupported ? "supported" : "not supported");
-            sb.append(" 11mc version is " + mcVersion);
-
-            return sb.toString();
-        }
-        /** Implement the Parcelable interface {@hide} */
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeInt(oneSidedRttSupported ? 1 : 0);
-            dest.writeInt(twoSided11McRttSupported ? 1 : 0);
-            dest.writeInt(lciSupported ? 1 : 0);
-            dest.writeInt(lcrSupported ? 1 : 0);
-            dest.writeInt(preambleSupported);
-            dest.writeInt(bwSupported);
-            dest.writeInt(responderSupported ? 1 : 0);
-            dest.writeInt(secureRttSupported ? 1 : 0);
-            dest.writeInt(mcVersion);
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @android.annotation.NonNull Creator<RttCapabilities> CREATOR =
-            new Creator<RttCapabilities>() {
-            @Override
-            public RttCapabilities createFromParcel(Parcel in) {
-                RttCapabilities capabilities = new RttCapabilities();
-                capabilities.oneSidedRttSupported = (in.readInt() == 1);
-                capabilities.twoSided11McRttSupported = (in.readInt() == 1);
-                capabilities.lciSupported = (in.readInt() == 1);
-                capabilities.lcrSupported = (in.readInt() == 1);
-                capabilities.preambleSupported = in.readInt();
-                capabilities.bwSupported = in.readInt();
-                capabilities.responderSupported = (in.readInt() == 1);
-                capabilities.secureRttSupported = (in.readInt() == 1);
-                capabilities.mcVersion = in.readInt();
-                return capabilities;
-            }
-                /** Implement the Parcelable interface {@hide} */
-                @Override
-                public RttCapabilities[] newArray(int size) {
-                    return new RttCapabilities[size];
-                }
-             };
-    }
-
-    /**
-     * This method is deprecated. Please use the {@link WifiRttManager} API.
-     */
-    @RequiresPermission(Manifest.permission.LOCATION_HARDWARE)
-    public RttCapabilities getRttCapabilities() {
-        return mRttCapabilities;
-    }
-
-    /** specifies parameters for RTT request */
-    @Deprecated
-    public static class RttParams {
-        /**
-         * type of destination device being ranged
-         * currently only support RTT_PEER_TYPE_AP
-         * Range:RTT_PEER_TYPE_xxxx Default value:RTT_PEER_TYPE_AP
-         */
-        public int deviceType;
-
-        /**
-         * type of RTT measurement method. Need check scan result and RttCapabilities first
-         * Range: RTT_TYPE_ONE_SIDED or RTT_TYPE_TWO_SIDED
-         * Default value: RTT_TYPE_ONE_SIDED
-         */
-        public int requestType;
-
-        /**
-         * Whether the secure RTT protocol needs to be used for ranging this peer device.
-         */
-        public boolean secure;
-
-        /**
-         * mac address of the device being ranged
-         * Default value: null
-         */
-        public String bssid;
-
-        /**
-         * The primary control channel over which the client is
-         * communicating with the AP.Same as ScanResult.frequency
-         * Default value: 0
-         */
-        public int frequency;
-
-        /**
-         * channel width of the destination AP. Same as ScanResult.channelWidth
-         * Default value: 0
-         */
-        public int channelWidth;
-
-        /**
-         * Not used if the AP bandwidth is 20 MHz
-         * If the AP use 40, 80 or 160 MHz, this is the center frequency
-         * if the AP use 80 + 80 MHz, this is the center frequency of the first segment
-         * same as ScanResult.centerFreq0
-         * Default value: 0
-         */
-         public int centerFreq0;
-
-         /**
-          * Only used if the AP bandwidth is 80 + 80 MHz
-          * if the AP use 80 + 80 MHz, this is the center frequency of the second segment
-          * same as ScanResult.centerFreq1
-          * Default value: 0
-          */
-          public int centerFreq1;
-
-        /**
-         * number of samples to be taken
-         * @deprecated Use the new {@link android.net.wifi.RttManager.RttParams#numSamplesPerBurst}
-         */
-        @Deprecated
-        public int num_samples;
-
-        /**
-         * number of retries if a sample fails
-         * @deprecated
-         * Use {@link android.net.wifi.RttManager.RttParams#numRetriesPerMeasurementFrame} API.
-         */
-        @Deprecated
-        public int num_retries;
-
-        /** Number of burst in exp , 2^x. 0 means single shot measurement, range 0-15
-         * Currently only single shot is supported
-         * Default value: 0
-         */
-        public int numberBurst;
-
-        /**
-         * valid only if numberBurst > 1, interval between burst(100ms).
-         * Range : 0-31, 0--means no specific
-         * Default value: 0
-         */
-        public int interval;
-
-        /**
-         * number of samples to be taken in one burst
-         * Range: 1-31
-         * Default value: 8
-         */
-        public int numSamplesPerBurst;
-
-        /** number of retries for each measurement frame if a sample fails
-         *  Only used by single side RTT,
-         *  Range 0 - 3 Default value: 0
-         */
-        public int numRetriesPerMeasurementFrame;
-
-        /**
-         * number of retries for FTMR frame (control frame) if it fails.
-         * Only used by 80211MC double side RTT
-         * Range: 0-3  Default Value : 0
-         */
-        public int numRetriesPerFTMR;
-
-        /**
-         * Request LCI information, only available when choose double side RTT measurement
-         * need check RttCapabilties first.
-         * Default value: false
-         * */
-        public boolean LCIRequest;
-
-        /**
-         * Request LCR information, only available when choose double side RTT measurement
-         * need check RttCapabilties first.
-         * Default value: false
-         * */
-        public boolean LCRRequest;
-
-        /**
-         * Timeout for each burst, (250 * 2^x) us,
-         * Range 1-11 and 15. 15 means no control Default value: 15
-         * */
-        public int burstTimeout;
-
-        /** preamble used for RTT measurement
-         *  Range: PREAMBLE_LEGACY, PREAMBLE_HT, PREAMBLE_VHT
-         *  Default value: PREAMBLE_HT
-         */
-        public int preamble;
-
-        /** bandWidth used for RTT measurement.User need verify the highest BW the destination
-         * support (from scan result etc) before set this value. Wider channels result usually give
-         * better accuracy. However, the frame loss can increase too.
-         * should be one of RTT_BW_5_SUPPORT to RTT_BW_160_SUPPORT. However, need check
-         * RttCapabilities firstto verify HW support this bandwidth.
-         * Default value:RTT_BW_20_SUPPORT
-         */
-        public int bandwidth;
-
-        public RttParams() {
-            //provide initial value for RttParams
-            deviceType = RTT_PEER_TYPE_AP;
-            requestType = RTT_TYPE_ONE_SIDED;
-            numberBurst = 0;
-            numSamplesPerBurst = 8;
-            numRetriesPerMeasurementFrame  = 0;
-            numRetriesPerFTMR = 0;
-            burstTimeout = 15;
-            preamble = PREAMBLE_HT;
-            bandwidth = RTT_BW_20_SUPPORT;
-        }
-
-        /**
-         * {@hide}
-         */
-        public String toString() {
-            StringBuilder sb = new StringBuilder();
-            sb.append("deviceType=" + deviceType);
-            sb.append(", requestType=" + requestType);
-            sb.append(", secure=" + secure);
-            sb.append(", bssid=" + bssid);
-            sb.append(", frequency=" + frequency);
-            sb.append(", channelWidth=" + channelWidth);
-            sb.append(", centerFreq0=" + centerFreq0);
-            sb.append(", centerFreq1=" + centerFreq1);
-            sb.append(", num_samples=" + num_samples);
-            sb.append(", num_retries=" + num_retries);
-            sb.append(", numberBurst=" + numberBurst);
-            sb.append(", interval=" + interval);
-            sb.append(", numSamplesPerBurst=" + numSamplesPerBurst);
-            sb.append(", numRetriesPerMeasurementFrame=" + numRetriesPerMeasurementFrame);
-            sb.append(", numRetriesPerFTMR=" + numRetriesPerFTMR);
-            sb.append(", LCIRequest=" + LCIRequest);
-            sb.append(", LCRRequest=" + LCRRequest);
-            sb.append(", burstTimeout=" + burstTimeout);
-            sb.append(", preamble=" + preamble);
-            sb.append(", bandwidth=" + bandwidth);
-            return sb.toString();
-        }
-    }
-
-    /** pseudo-private class used to parcel arguments */
-    @Deprecated
-    public static class ParcelableRttParams implements Parcelable {
-
-        @NonNull
-        public RttParams mParams[];
-
-        /**
-         * @hide
-         */
-        @VisibleForTesting
-        public ParcelableRttParams(RttParams[] params) {
-            mParams = (params == null ? new RttParams[0] : params);
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeInt(mParams.length);
-
-            for (RttParams params : mParams) {
-                dest.writeInt(params.deviceType);
-                dest.writeInt(params.requestType);
-                dest.writeByte(params.secure ? (byte) 1 : 0);
-                dest.writeString(params.bssid);
-                dest.writeInt(params.channelWidth);
-                dest.writeInt(params.frequency);
-                dest.writeInt(params.centerFreq0);
-                dest.writeInt(params.centerFreq1);
-                dest.writeInt(params.numberBurst);
-                dest.writeInt(params.interval);
-                dest.writeInt(params.numSamplesPerBurst);
-                dest.writeInt(params.numRetriesPerMeasurementFrame);
-                dest.writeInt(params.numRetriesPerFTMR);
-                dest.writeInt(params.LCIRequest ? 1 : 0);
-                dest.writeInt(params.LCRRequest ? 1 : 0);
-                dest.writeInt(params.burstTimeout);
-                dest.writeInt(params.preamble);
-                dest.writeInt(params.bandwidth);
-            }
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @android.annotation.NonNull Creator<ParcelableRttParams> CREATOR =
-                new Creator<ParcelableRttParams>() {
-                    @Override
-                    public ParcelableRttParams createFromParcel(Parcel in) {
-
-                        int num = in.readInt();
-                        RttParams params[] = new RttParams[num];
-                        for (int i = 0; i < num; i++) {
-                            params[i] = new RttParams();
-                            params[i].deviceType = in.readInt();
-                            params[i].requestType = in.readInt();
-                            params[i].secure = (in.readByte() != 0);
-                            params[i].bssid = in.readString();
-                            params[i].channelWidth = in.readInt();
-                            params[i].frequency = in.readInt();
-                            params[i].centerFreq0 = in.readInt();
-                            params[i].centerFreq1 = in.readInt();
-                            params[i].numberBurst = in.readInt();
-                            params[i].interval = in.readInt();
-                            params[i].numSamplesPerBurst = in.readInt();
-                            params[i].numRetriesPerMeasurementFrame = in.readInt();
-                            params[i].numRetriesPerFTMR = in.readInt();
-                            params[i].LCIRequest = (in.readInt() == 1);
-                            params[i].LCRRequest = (in.readInt() == 1);
-                            params[i].burstTimeout = in.readInt();
-                            params[i].preamble = in.readInt();
-                            params[i].bandwidth = in.readInt();
-                        }
-
-                        ParcelableRttParams parcelableParams = new ParcelableRttParams(params);
-                        return parcelableParams;
-                    }
-
-                    @Override
-                    public ParcelableRttParams[] newArray(int size) {
-                        return new ParcelableRttParams[size];
-                    }
-                };
-    }
-
-    @Deprecated
-    public static class WifiInformationElement {
-        /** Information Element ID 0xFF means element is invalid. */
-        public byte id;
-        public byte[] data;
-    }
-    /** specifies RTT results */
-    @Deprecated
-    public static class RttResult {
-        /** mac address of the device being ranged. */
-        public String bssid;
-
-        /** # of burst for this measurement. */
-        public int burstNumber;
-
-        /** total number of measurement frames attempted in this measurement. */
-        public int measurementFrameNumber;
-
-        /** total successful number of measurement frames in this measurement. */
-        public int successMeasurementFrameNumber;
-
-        /**
-         * Maximum number of frames per burst supported by peer. Two side RTT only
-         * Valid only if less than request
-         */
-        public int frameNumberPerBurstPeer;
-
-        /** status of the request */
-        public int status;
-
-        /**
-         * type of the request used
-         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#measurementType}
-         */
-        @Deprecated
-        public int requestType;
-
-        /** RTT measurement method type used, should be one of RTT_TYPE_ONE_SIDED or
-         *  RTT_TYPE_TWO_SIDED.
-         */
-        public int measurementType;
-
-        /**
-         * only valid when status ==  RTT_STATUS_FAIL_BUSY_TRY_LATER
-         * please retry RTT measurement after this duration since peer indicate busy at ths moment
-         *  Unit S  Range:1-31
-         */
-        public int retryAfterDuration;
-
-        /** timestamp of completion, in microsecond since boot. */
-        public long ts;
-
-        /** average RSSI observed, unit of 0.5 dB. */
-        public int rssi;
-
-        /**
-         * RSSI spread (i.e. max - min)
-         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#rssiSpread} API.
-         */
-        @Deprecated
-        public int rssi_spread;
-
-        /**RSSI spread (i.e. max - min), unit of 0.5 dB. */
-        public int rssiSpread;
-
-        /**
-         * average transmit rate
-         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#txRate} API.
-         */
-        @Deprecated
-        public int tx_rate;
-
-        /** average transmit rate. Unit (kbps). */
-        public int txRate;
-
-        /** average receiving rate Unit (kbps). */
-        public int rxRate;
-
-       /**
-        * average round trip time in nano second
-        * @deprecated  Use {@link android.net.wifi.RttManager.RttResult#rtt} API.
-        */
-        @Deprecated
-        public long rtt_ns;
-
-        /** average round trip time in picoseconds. */
-        public long rtt;
-
-        /**
-         * standard deviation observed in round trip time
-         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#rttStandardDeviation} API.
-         */
-        @Deprecated
-        public long rtt_sd_ns;
-
-        /** standard deviation of RTT in picoseconds. */
-        public long rttStandardDeviation;
-
-        /**
-         * spread (i.e. max - min) round trip time
-         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#rttSpread} API.
-         */
-        @Deprecated
-        public long rtt_spread_ns;
-
-        /** spread (i.e. max - min) RTT in picoseconds. */
-        public long rttSpread;
-
-        /**
-         * average distance in centimeter, computed based on rtt_ns
-         * @deprecated use {@link android.net.wifi.RttManager.RttResult#distance} API.
-         */
-        @Deprecated
-        public int distance_cm;
-
-        /** average distance in cm, computed based on rtt. */
-        public int distance;
-
-        /**
-         * standard deviation observed in distance
-         * @deprecated
-         * Use {@link .android.net.wifi.RttManager.RttResult#distanceStandardDeviation} API.
-         */
-        @Deprecated
-        public int distance_sd_cm;
-
-        /** standard deviation observed in distance in cm. */
-        public int distanceStandardDeviation;
-
-        /**
-         * spread (i.e. max - min) distance
-         * @deprecated Use {@link android.net.wifi.RttManager.RttResult#distanceSpread} API.
-         */
-        @Deprecated
-        public int distance_spread_cm;
-
-        /** spread (i.e. max - min) distance in cm. */
-        public int distanceSpread;
-
-        /** the duration of this measurement burst, unit ms. */
-        public int burstDuration;
-
-        /** Burst number supported by peer after negotiation, 2side RTT only*/
-        public int negotiatedBurstNum;
-
-        /** LCI information Element, only available for double side RTT. */
-        public WifiInformationElement LCI;
-
-        /** LCR information Element, only available to double side RTT. */
-        public WifiInformationElement LCR;
-
-        /**
-         * Whether the secure RTT protocol was used for ranging.
-         */
-        public boolean secure;
-    }
-
-
-    /** pseudo-private class used to parcel results. */
-    @Deprecated
-    public static class ParcelableRttResults implements Parcelable {
-
-        public RttResult mResults[];
-
-        public ParcelableRttResults(RttResult[] results) {
-            mResults = results;
-        }
-
-        /**
-         * {@hide}
-         */
-        public String toString() {
-            StringBuilder sb = new StringBuilder();
-            for (int i = 0; i < mResults.length; ++i) {
-                sb.append("[" + i + "]: ");
-                sb.append("bssid=" + mResults[i].bssid);
-                sb.append(", burstNumber=" + mResults[i].burstNumber);
-                sb.append(", measurementFrameNumber=" + mResults[i].measurementFrameNumber);
-                sb.append(", successMeasurementFrameNumber="
-                        + mResults[i].successMeasurementFrameNumber);
-                sb.append(", frameNumberPerBurstPeer=" + mResults[i].frameNumberPerBurstPeer);
-                sb.append(", status=" + mResults[i].status);
-                sb.append(", requestType=" + mResults[i].requestType);
-                sb.append(", measurementType=" + mResults[i].measurementType);
-                sb.append(", retryAfterDuration=" + mResults[i].retryAfterDuration);
-                sb.append(", ts=" + mResults[i].ts);
-                sb.append(", rssi=" + mResults[i].rssi);
-                sb.append(", rssi_spread=" + mResults[i].rssi_spread);
-                sb.append(", rssiSpread=" + mResults[i].rssiSpread);
-                sb.append(", tx_rate=" + mResults[i].tx_rate);
-                sb.append(", txRate=" + mResults[i].txRate);
-                sb.append(", rxRate=" + mResults[i].rxRate);
-                sb.append(", rtt_ns=" + mResults[i].rtt_ns);
-                sb.append(", rtt=" + mResults[i].rtt);
-                sb.append(", rtt_sd_ns=" + mResults[i].rtt_sd_ns);
-                sb.append(", rttStandardDeviation=" + mResults[i].rttStandardDeviation);
-                sb.append(", rtt_spread_ns=" + mResults[i].rtt_spread_ns);
-                sb.append(", rttSpread=" + mResults[i].rttSpread);
-                sb.append(", distance_cm=" + mResults[i].distance_cm);
-                sb.append(", distance=" + mResults[i].distance);
-                sb.append(", distance_sd_cm=" + mResults[i].distance_sd_cm);
-                sb.append(", distanceStandardDeviation=" + mResults[i].distanceStandardDeviation);
-                sb.append(", distance_spread_cm=" + mResults[i].distance_spread_cm);
-                sb.append(", distanceSpread=" + mResults[i].distanceSpread);
-                sb.append(", burstDuration=" + mResults[i].burstDuration);
-                sb.append(", negotiatedBurstNum=" + mResults[i].negotiatedBurstNum);
-                sb.append(", LCI=" + mResults[i].LCI);
-                sb.append(", LCR=" + mResults[i].LCR);
-                sb.append(", secure=" + mResults[i].secure);
-            }
-            return sb.toString();
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            if (mResults != null) {
-                dest.writeInt(mResults.length);
-                for (RttResult result : mResults) {
-                    dest.writeString(result.bssid);
-                    dest.writeInt(result.burstNumber);
-                    dest.writeInt(result.measurementFrameNumber);
-                    dest.writeInt(result.successMeasurementFrameNumber);
-                    dest.writeInt(result.frameNumberPerBurstPeer);
-                    dest.writeInt(result.status);
-                    dest.writeInt(result.measurementType);
-                    dest.writeInt(result.retryAfterDuration);
-                    dest.writeLong(result.ts);
-                    dest.writeInt(result.rssi);
-                    dest.writeInt(result.rssiSpread);
-                    dest.writeInt(result.txRate);
-                    dest.writeLong(result.rtt);
-                    dest.writeLong(result.rttStandardDeviation);
-                    dest.writeLong(result.rttSpread);
-                    dest.writeInt(result.distance);
-                    dest.writeInt(result.distanceStandardDeviation);
-                    dest.writeInt(result.distanceSpread);
-                    dest.writeInt(result.burstDuration);
-                    dest.writeInt(result.negotiatedBurstNum);
-                    dest.writeByte(result.LCI.id);
-                    if (result.LCI.id != (byte) 0xFF) {
-                        dest.writeByte((byte)result.LCI.data.length);
-                        dest.writeByteArray(result.LCI.data);
-                    }
-                    dest.writeByte(result.LCR.id);
-                    if (result.LCR.id != (byte) 0xFF) {
-                        dest.writeByte((byte) result.LCR.data.length);
-                        dest.writeByteArray(result.LCR.data);
-                    }
-                    dest.writeByte(result.secure ? (byte) 1 : 0);
-                }
-            } else {
-                dest.writeInt(0);
-            }
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @android.annotation.NonNull Creator<ParcelableRttResults> CREATOR =
-                new Creator<ParcelableRttResults>() {
-                    @Override
-                    public ParcelableRttResults createFromParcel(Parcel in) {
-
-                        int num = in.readInt();
-
-                        if (num == 0) {
-                            return new ParcelableRttResults(null);
-                        }
-
-                        RttResult results[] = new RttResult[num];
-                        for (int i = 0; i < num; i++) {
-                            results[i] = new RttResult();
-                            results[i].bssid = in.readString();
-                            results[i].burstNumber = in.readInt();
-                            results[i].measurementFrameNumber = in.readInt();
-                            results[i].successMeasurementFrameNumber = in.readInt();
-                            results[i].frameNumberPerBurstPeer = in.readInt();
-                            results[i].status = in.readInt();
-                            results[i].measurementType = in.readInt();
-                            results[i].retryAfterDuration = in.readInt();
-                            results[i].ts = in.readLong();
-                            results[i].rssi = in.readInt();
-                            results[i].rssiSpread = in.readInt();
-                            results[i].txRate = in.readInt();
-                            results[i].rtt = in.readLong();
-                            results[i].rttStandardDeviation = in.readLong();
-                            results[i].rttSpread = in.readLong();
-                            results[i].distance = in.readInt();
-                            results[i].distanceStandardDeviation = in.readInt();
-                            results[i].distanceSpread = in.readInt();
-                            results[i].burstDuration = in.readInt();
-                            results[i].negotiatedBurstNum = in.readInt();
-                            results[i].LCI = new WifiInformationElement();
-                            results[i].LCI.id = in.readByte();
-                            if (results[i].LCI.id != (byte) 0xFF) {
-                                byte length = in.readByte();
-                                results[i].LCI.data = new byte[length];
-                                in.readByteArray(results[i].LCI.data);
-                            }
-                            results[i].LCR = new WifiInformationElement();
-                            results[i].LCR.id = in.readByte();
-                            if (results[i].LCR.id != (byte) 0xFF) {
-                                byte length = in.readByte();
-                                results[i].LCR.data = new byte[length];
-                                in.readByteArray(results[i].LCR.data);
-                            }
-                            results[i].secure = (in.readByte() != 0);
-                        }
-
-                        ParcelableRttResults parcelableResults = new ParcelableRttResults(results);
-                        return parcelableResults;
-                    }
-
-                    @Override
-                    public ParcelableRttResults[] newArray(int size) {
-                        return new ParcelableRttResults[size];
-                    }
-                };
-    }
-
-    @Deprecated
-    public static interface RttListener {
-        public void onSuccess(RttResult[] results);
-        public void onFailure(int reason, String description);
-        public void onAborted();
-    }
-
-    /**
-     * Request to start an RTT ranging
-     * <p>
-     * This method is deprecated. Please use the
-     * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)}
-     * API.
-     *
-     * @param params  -- RTT request Parameters
-     * @param listener -- Call back to inform RTT result
-     * @exception throw IllegalArgumentException when params are illegal
-     *            throw IllegalStateException when RttCapabilities do not exist
-     */
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void startRanging(RttParams[] params, RttListener listener) {
-        Log.i(TAG, "Send RTT request to RTT Service");
-
-        if (!mNewService.isAvailable()) {
-            listener.onFailure(REASON_NOT_AVAILABLE, "");
-            return;
-        }
-
-        RangingRequest.Builder builder = new RangingRequest.Builder();
-        for (RttParams rttParams : params) {
-            if (rttParams.deviceType != RTT_PEER_TYPE_AP) {
-                listener.onFailure(REASON_INVALID_REQUEST, "Only AP peers are supported");
-                return;
-            }
-
-            ScanResult reconstructed = new ScanResult();
-            reconstructed.BSSID = rttParams.bssid;
-            if (rttParams.requestType == RTT_TYPE_TWO_SIDED) {
-                reconstructed.setFlag(ScanResult.FLAG_80211mc_RESPONDER);
-            }
-            reconstructed.channelWidth = rttParams.channelWidth;
-            reconstructed.frequency = rttParams.frequency;
-            reconstructed.centerFreq0 = rttParams.centerFreq0;
-            reconstructed.centerFreq1 = rttParams.centerFreq1;
-            builder.addResponder(
-                    android.net.wifi.rtt.ResponderConfig.fromScanResult(reconstructed));
-        }
-        try {
-            mNewService.startRanging(builder.build(),
-                    mContext.getMainExecutor(),
-                    new RangingResultCallback() {
-                @Override
-                public void onRangingFailure(int code) {
-                    int localCode = REASON_UNSPECIFIED;
-                    if (code == STATUS_CODE_FAIL_RTT_NOT_AVAILABLE) {
-                        localCode = REASON_NOT_AVAILABLE;
-                    }
-                    listener.onFailure(localCode, "");
-                }
-
-                @Override
-                public void onRangingResults(List<RangingResult> results) {
-                    RttResult[] legacyResults = new RttResult[results.size()];
-                    int i = 0;
-                    for (RangingResult result : results) {
-                        legacyResults[i] = new RttResult();
-                        legacyResults[i].status = result.getStatus();
-                        legacyResults[i].bssid = result.getMacAddress().toString();
-                        if (result.getStatus() == RangingResult.STATUS_SUCCESS) {
-                            legacyResults[i].distance = result.getDistanceMm() / 10;
-                            legacyResults[i].distanceStandardDeviation =
-                                    result.getDistanceStdDevMm() / 10;
-                            legacyResults[i].rssi = result.getRssi() * -2;
-                            legacyResults[i].ts = result.getRangingTimestampMillis() * 1000;
-                            legacyResults[i].measurementFrameNumber =
-                                    result.getNumAttemptedMeasurements();
-                            legacyResults[i].successMeasurementFrameNumber =
-                                    result.getNumSuccessfulMeasurements();
-                        } else {
-                            // just in case legacy API needed some relatively real timestamp
-                            legacyResults[i].ts = SystemClock.elapsedRealtime() * 1000;
-                        }
-                        i++;
-                    }
-                    listener.onSuccess(legacyResults);
-                }
-            });
-        } catch (IllegalArgumentException e) {
-            Log.e(TAG, "startRanging: invalid arguments - " + e);
-            listener.onFailure(REASON_INVALID_REQUEST, e.getMessage());
-        } catch (SecurityException e) {
-            Log.e(TAG, "startRanging: security exception - " + e);
-            listener.onFailure(REASON_PERMISSION_DENIED, e.getMessage());
-        }
-    }
-
-    /**
-     * This method is deprecated and performs no function. Please use the {@link WifiRttManager}
-     * API.
-     */
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void stopRanging(RttListener listener) {
-        Log.e(TAG, "stopRanging: unsupported operation - nop");
-    }
-
-    /**
-     * Callbacks for responder operations.
-     * <p>
-     * A {@link ResponderCallback} is the handle to the calling client. {@link RttManager} will keep
-     * a reference to the callback for the entire period when responder is enabled. The same
-     * callback as used in enabling responder needs to be passed for disabling responder.
-     * The client can freely destroy or reuse the callback after {@link RttManager#disableResponder}
-     * is called.
-     */
-    @Deprecated
-    public abstract static class ResponderCallback {
-        /** Callback when responder is enabled. */
-        public abstract void onResponderEnabled(ResponderConfig config);
-        /** Callback when enabling responder failed. */
-        public abstract void onResponderEnableFailure(int reason);
-        // TODO: consider adding onResponderAborted once it's supported.
-    }
-
-    /**
-     * Enable Wi-Fi RTT responder mode on the device. The enabling result will be delivered via
-     * {@code callback}.
-     * <p>
-     * Note calling this method with the same callback when the responder is already enabled won't
-     * change the responder state, a cached {@link ResponderConfig} from the last enabling will be
-     * returned through the callback.
-     * <p>
-     * This method is deprecated and will throw an {@link UnsupportedOperationException}
-     * exception. Please use the {@link WifiRttManager} API to perform a Wi-Fi Aware peer-to-peer
-     * ranging.
-     *
-     * @param callback Callback for responder enabling/disabling result.
-     * @throws IllegalArgumentException If {@code callback} is null.
-     */
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void enableResponder(ResponderCallback callback) {
-        throw new UnsupportedOperationException(
-                "enableResponder is not supported in the adaptation layer");
-    }
-
-    /**
-     * Disable Wi-Fi RTT responder mode on the device. The {@code callback} needs to be the
-     * same one used in {@link #enableResponder(ResponderCallback)}.
-     * <p>
-     * Calling this method when responder isn't enabled won't have any effect. The callback can be
-     * reused for enabling responder after this method is called.
-     * <p>
-     * This method is deprecated and will throw an {@link UnsupportedOperationException}
-     * exception. Please use the {@link WifiRttManager} API to perform a Wi-Fi Aware peer-to-peer
-     * ranging.
-     *
-     * @param callback The same callback used for enabling responder.
-     * @throws IllegalArgumentException If {@code callback} is null.
-     */
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void disableResponder(ResponderCallback callback) {
-        throw new UnsupportedOperationException(
-                "disableResponder is not supported in the adaptation layer");
-    }
-
-    /**
-     * Configuration used for RTT responder mode. The configuration information can be used by a
-     * peer device to range the responder.
-     *
-     * @see ScanResult
-     */
-    @Deprecated
-    public static class ResponderConfig implements Parcelable {
-
-        // TODO: make all fields final once we can get mac address from responder HAL APIs.
-        /**
-         * Wi-Fi mac address used for responder mode.
-         */
-        public String macAddress = "";
-
-        /**
-         * The primary 20 MHz frequency (in MHz) of the channel where responder is enabled.
-         * @see ScanResult#frequency
-         */
-        public int frequency;
-
-        /**
-         * Center frequency of the channel where responder is enabled on. Only in use when channel
-         * width is at least 40MHz.
-         * @see ScanResult#centerFreq0
-         */
-        public int centerFreq0;
-
-        /**
-         * Center frequency of the second segment when channel width is 80 + 80 MHz.
-         * @see ScanResult#centerFreq1
-         */
-        public int centerFreq1;
-
-        /**
-         * Width of the channel where responder is enabled on.
-         * @see ScanResult#channelWidth
-         */
-        public int channelWidth;
-
-        /**
-         * Preamble supported by responder.
-         */
-        public int preamble;
-
-        @NonNull
-        @Override
-        public String toString() {
-            StringBuilder builder = new StringBuilder();
-            builder.append("macAddress = ").append(macAddress)
-                    .append(" frequency = ").append(frequency)
-                    .append(" centerFreq0 = ").append(centerFreq0)
-                    .append(" centerFreq1 = ").append(centerFreq1)
-                    .append(" channelWidth = ").append(channelWidth)
-                    .append(" preamble = ").append(preamble);
-            return builder.toString();
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeString(macAddress);
-            dest.writeInt(frequency);
-            dest.writeInt(centerFreq0);
-            dest.writeInt(centerFreq1);
-            dest.writeInt(channelWidth);
-            dest.writeInt(preamble);
-        }
-
-        /** Implement {@link Parcelable} interface */
-        public static final @android.annotation.NonNull Parcelable.Creator<ResponderConfig> CREATOR =
-                new Parcelable.Creator<ResponderConfig>() {
-            @Override
-            public ResponderConfig createFromParcel(Parcel in) {
-                ResponderConfig config = new ResponderConfig();
-                config.macAddress = in.readString();
-                config.frequency = in.readInt();
-                config.centerFreq0 = in.readInt();
-                config.centerFreq1 = in.readInt();
-                config.channelWidth = in.readInt();
-                config.preamble = in.readInt();
-                return config;
-            }
-
-            @Override
-            public ResponderConfig[] newArray(int size) {
-                return new ResponderConfig[size];
-            }
-        };
-
-    }
-
-    /* private methods */
-    public static final int BASE = Protocol.BASE_WIFI_RTT_MANAGER;
-
-    public static final int CMD_OP_START_RANGING        = BASE + 0;
-    public static final int CMD_OP_STOP_RANGING         = BASE + 1;
-    public static final int CMD_OP_FAILED               = BASE + 2;
-    public static final int CMD_OP_SUCCEEDED            = BASE + 3;
-    public static final int CMD_OP_ABORTED              = BASE + 4;
-    public static final int CMD_OP_ENABLE_RESPONDER     = BASE + 5;
-    public static final int CMD_OP_DISABLE_RESPONDER    = BASE + 6;
-    public static final int
-            CMD_OP_ENALBE_RESPONDER_SUCCEEDED           = BASE + 7;
-    public static final int
-            CMD_OP_ENALBE_RESPONDER_FAILED              = BASE + 8;
-    /** @hide */
-    public static final int CMD_OP_REG_BINDER           = BASE + 9;
-
-    private final WifiRttManager mNewService;
-    private final Context mContext;
-    private RttCapabilities mRttCapabilities;
-
-    /**
-     * Create a new WifiScanner instance.
-     * Applications will almost always want to use
-     * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
-     * the standard {@link android.content.Context#WIFI_RTT_SERVICE Context.WIFI_RTT_SERVICE}.
-     * @param service the new WifiRttManager service
-     *
-     * @hide
-     */
-    public RttManager(@NonNull Context context, @NonNull WifiRttManager service) {
-        mNewService = service;
-        mContext = context;
-
-        boolean rttSupported = context.getPackageManager().hasSystemFeature(
-                PackageManager.FEATURE_WIFI_RTT);
-
-        mRttCapabilities = new RttCapabilities();
-        mRttCapabilities.oneSidedRttSupported = rttSupported;
-        mRttCapabilities.twoSided11McRttSupported = rttSupported;
-        mRttCapabilities.lciSupported = false;
-        mRttCapabilities.lcrSupported = false;
-        mRttCapabilities.preambleSupported = PREAMBLE_HT | PREAMBLE_VHT;
-        mRttCapabilities.bwSupported = RTT_BW_40_SUPPORT | RTT_BW_80_SUPPORT;
-        mRttCapabilities.responderSupported = false;
-        mRttCapabilities.secureRttSupported = false;
-    }
-}
-
diff --git a/wifi/java/android/net/wifi/ScanResult.java b/wifi/java/android/net/wifi/ScanResult.java
deleted file mode 100644
index 5589bd13..0000000
--- a/wifi/java/android/net/wifi/ScanResult.java
+++ /dev/null
@@ -1,1160 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.net.wifi.WifiAnnotations.ChannelWidth;
-import android.net.wifi.WifiAnnotations.WifiStandard;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Describes information about a detected access point. In addition
- * to the attributes described here, the supplicant keeps track of
- * {@code quality}, {@code noise}, and {@code maxbitrate} attributes,
- * but does not currently report them to external clients.
- */
-public final class ScanResult implements Parcelable {
-    /**
-     * The network name.
-     */
-    public String SSID;
-
-    /**
-     * Ascii encoded SSID. This will replace SSID when we deprecate it. @hide
-     */
-    @UnsupportedAppUsage
-    public WifiSsid wifiSsid;
-
-    /**
-     * The address of the access point.
-     */
-    public String BSSID;
-
-    /**
-     * The HESSID from the beacon.
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public long hessid;
-
-    /**
-     * The ANQP Domain ID from the Hotspot 2.0 Indication element, if present.
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public int anqpDomainId;
-
-    /*
-     * This field is equivalent to the |flags|, rather than the |capabilities| field
-     * of the per-BSS scan results returned by WPA supplicant. See the definition of
-     * |struct wpa_bss| in wpa_supplicant/bss.h for more details.
-     */
-    /**
-     * Describes the authentication, key management, and encryption schemes
-     * supported by the access point.
-     */
-    public String capabilities;
-
-    /**
-     * @hide
-     * No security protocol.
-     */
-    @SystemApi
-    public static final int PROTOCOL_NONE = 0;
-    /**
-     * @hide
-     * Security protocol type: WPA version 1.
-     */
-    @SystemApi
-    public static final int PROTOCOL_WPA = 1;
-    /**
-     * @hide
-     * Security protocol type: RSN, for WPA version 2, and version 3.
-     */
-    @SystemApi
-    public static final int PROTOCOL_RSN = 2;
-    /**
-     * @hide
-     * Security protocol type:
-     * OSU Server-only authenticated layer 2 Encryption Network.
-     * Used for Hotspot 2.0.
-     */
-    @SystemApi
-    public static final int PROTOCOL_OSEN = 3;
-
-    /**
-     * @hide
-     * Security protocol type: WAPI.
-     */
-    @SystemApi
-    public static final int PROTOCOL_WAPI = 4;
-
-    /**
-     * @hide
-     * No security key management scheme.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_NONE = 0;
-    /**
-     * @hide
-     * Security key management scheme: PSK.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_PSK = 1;
-    /**
-     * @hide
-     * Security key management scheme: EAP.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_EAP = 2;
-    /**
-     * @hide
-     * Security key management scheme: FT_PSK.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_FT_PSK = 3;
-    /**
-     * @hide
-     * Security key management scheme: FT_EAP.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_FT_EAP = 4;
-    /**
-     * @hide
-     * Security key management scheme: PSK_SHA256
-     */
-    @SystemApi
-    public static final int KEY_MGMT_PSK_SHA256 = 5;
-    /**
-     * @hide
-     * Security key management scheme: EAP_SHA256.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_EAP_SHA256 = 6;
-    /**
-     * @hide
-     * Security key management scheme: OSEN.
-     * Used for Hotspot 2.0.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_OSEN = 7;
-     /**
-     * @hide
-     * Security key management scheme: SAE.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_SAE = 8;
-    /**
-     * @hide
-     * Security key management scheme: OWE.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_OWE = 9;
-    /**
-     * @hide
-     * Security key management scheme: SUITE_B_192.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_EAP_SUITE_B_192 = 10;
-    /**
-     * @hide
-     * Security key management scheme: FT_SAE.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_FT_SAE = 11;
-    /**
-     * @hide
-     * Security key management scheme: OWE in transition mode.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_OWE_TRANSITION = 12;
-    /**
-     * @hide
-     * Security key management scheme: WAPI_PSK.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_WAPI_PSK = 13;
-    /**
-     * @hide
-     * Security key management scheme: WAPI_CERT.
-     */
-    @SystemApi
-    public static final int KEY_MGMT_WAPI_CERT = 14;
-
-    /**
-     * @hide
-     * Security key management scheme: FILS_SHA256.
-     */
-    public static final int KEY_MGMT_FILS_SHA256 = 15;
-    /**
-     * @hide
-     * Security key management scheme: FILS_SHA384.
-     */
-    public static final int KEY_MGMT_FILS_SHA384 = 16;
-    /**
-     * @hide
-     * No cipher suite.
-     */
-    @SystemApi
-    public static final int CIPHER_NONE = 0;
-    /**
-     * @hide
-     * No group addressed, only used for group data cipher.
-     */
-    @SystemApi
-    public static final int CIPHER_NO_GROUP_ADDRESSED = 1;
-    /**
-     * @hide
-     * Cipher suite: TKIP
-     */
-    @SystemApi
-    public static final int CIPHER_TKIP = 2;
-    /**
-     * @hide
-     * Cipher suite: CCMP
-     */
-    @SystemApi
-    public static final int CIPHER_CCMP = 3;
-    /**
-     * @hide
-     * Cipher suite: GCMP
-     */
-    @SystemApi
-    public static final int CIPHER_GCMP_256 = 4;
-    /**
-     * @hide
-     * Cipher suite: SMS4
-     */
-    @SystemApi
-    public static final int CIPHER_SMS4 = 5;
-
-    /**
-     * The detected signal level in dBm, also known as the RSSI.
-     *
-     * <p>Use {@link android.net.wifi.WifiManager#calculateSignalLevel} to convert this number into
-     * an absolute signal level which can be displayed to a user.
-     */
-    public int level;
-    /**
-     * The primary 20 MHz frequency (in MHz) of the channel over which the client is communicating
-     * with the access point.
-     */
-    public int frequency;
-
-   /**
-    * AP Channel bandwidth is 20 MHZ
-    */
-    public static final int CHANNEL_WIDTH_20MHZ = 0;
-   /**
-    * AP Channel bandwidth is 40 MHZ
-    */
-    public static final int CHANNEL_WIDTH_40MHZ = 1;
-   /**
-    * AP Channel bandwidth is 80 MHZ
-    */
-    public static final int CHANNEL_WIDTH_80MHZ = 2;
-   /**
-    * AP Channel bandwidth is 160 MHZ
-    */
-    public static final int CHANNEL_WIDTH_160MHZ = 3;
-   /**
-    * AP Channel bandwidth is 160 MHZ, but 80MHZ + 80MHZ
-    */
-    public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4;
-
-    /**
-     * 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;
-
-    /**
-     * 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 @ChannelWidth int channelWidth;
-
-    /**
-     * Not used if the AP bandwidth is 20 MHz
-     * If the AP use 40, 80 or 160 MHz, this is the center frequency (in MHz)
-     * if the AP use 80 + 80 MHz, this is the center frequency of the first segment (in MHz)
-     */
-    public int centerFreq0;
-
-    /**
-     * Only used if the AP bandwidth is 80 + 80 MHz
-     * if the AP use 80 + 80 MHz, this is the center frequency of the second segment (in MHz)
-     */
-    public int centerFreq1;
-
-    /**
-     * @deprecated use is80211mcResponder() instead
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public boolean is80211McRTTResponder;
-
-    /**
-     * timestamp in microseconds (since boot) when
-     * this result was last seen.
-     */
-    public long timestamp;
-
-    /**
-     * Timestamp representing date when this result was last seen, in milliseconds from 1970
-     * {@hide}
-     */
-    @UnsupportedAppUsage
-    public long seen;
-
-    /**
-     * On devices with multiple hardware radio chains, this class provides metadata about
-     * each radio chain that was used to receive this scan result (probe response or beacon).
-     * {@hide}
-     */
-    public static class RadioChainInfo {
-        /** Vendor defined id for a radio chain. */
-        public int id;
-        /** Detected signal level in dBm (also known as the RSSI) on this radio chain. */
-        public int level;
-
-        @Override
-        public String toString() {
-            return "RadioChainInfo: id=" + id + ", level=" + level;
-        }
-
-        @Override
-        public boolean equals(Object otherObj) {
-            if (this == otherObj) {
-                return true;
-            }
-            if (!(otherObj instanceof RadioChainInfo)) {
-                return false;
-            }
-            RadioChainInfo other = (RadioChainInfo) otherObj;
-            return id == other.id && level == other.level;
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(id, level);
-        }
-    };
-
-    /**
-     * Information about the list of the radio chains used to receive this scan result
-     * (probe response or beacon).
-     *
-     * For Example: On devices with 2 hardware radio chains, this list could hold 1 or 2
-     * entries based on whether this scan result was received using one or both the chains.
-     * {@hide}
-     */
-    public RadioChainInfo[] radioChainInfos;
-
-    /**
-     * Status indicating the scan result does not correspond to a user's saved configuration
-     * @hide
-     * @removed
-     */
-    @SystemApi
-    public boolean untrusted;
-
-    /**
-     * Number of time autojoin used it
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public int numUsage;
-
-    /**
-     * The approximate distance to the AP in centimeter, if available.  Else
-     * {@link UNSPECIFIED}.
-     * {@hide}
-     */
-    @UnsupportedAppUsage
-    public int distanceCm;
-
-    /**
-     * The standard deviation of the distance to the access point, if available.
-     * Else {@link UNSPECIFIED}.
-     * {@hide}
-     */
-    @UnsupportedAppUsage
-    public int distanceSdCm;
-
-    /** {@hide} */
-    public static final long FLAG_PASSPOINT_NETWORK               = 0x0000000000000001;
-
-    /** {@hide} */
-    public static final long FLAG_80211mc_RESPONDER               = 0x0000000000000002;
-
-    /*
-     * These flags are specific to the ScanResult class, and are not related to the |flags|
-     * field of the per-BSS scan results from WPA supplicant.
-     */
-    /**
-     * Defines flags; such as {@link #FLAG_PASSPOINT_NETWORK}.
-     * {@hide}
-     */
-    @UnsupportedAppUsage
-    public long flags;
-
-    /**
-     * sets a flag in {@link #flags} field
-     * @param flag flag to set
-     * @hide
-     */
-    public void setFlag(long flag) {
-        flags |= flag;
-    }
-
-    /**
-     * clears a flag in {@link #flags} field
-     * @param flag flag to set
-     * @hide
-     */
-    public void clearFlag(long flag) {
-        flags &= ~flag;
-    }
-
-    public boolean is80211mcResponder() {
-        return (flags & FLAG_80211mc_RESPONDER) != 0;
-    }
-
-    public boolean isPasspointNetwork() {
-        return (flags & FLAG_PASSPOINT_NETWORK) != 0;
-    }
-
-    /**
-     * Indicates venue name (such as 'San Francisco Airport') published by access point; only
-     * available on Passpoint network and if published by access point.
-     */
-    public CharSequence venueName;
-
-    /**
-     * Indicates Passpoint operator name published by access point.
-     */
-    public CharSequence operatorFriendlyName;
-
-    /**
-     * {@hide}
-     */
-    public final static int UNSPECIFIED = -1;
-
-    /**
-     * 2.4 GHz band first channel number
-     * @hide
-     */
-    public static final int BAND_24_GHZ_FIRST_CH_NUM = 1;
-    /**
-     * 2.4 GHz band last channel number
-     * @hide
-     */
-    public static final int BAND_24_GHZ_LAST_CH_NUM = 14;
-    /**
-     * 2.4 GHz band frequency of first channel in MHz
-     * @hide
-     */
-    public static final int BAND_24_GHZ_START_FREQ_MHZ = 2412;
-    /**
-     * 2.4 GHz band frequency of last channel in MHz
-     * @hide
-     */
-    public static final int BAND_24_GHZ_END_FREQ_MHZ = 2484;
-
-    /**
-     * 5 GHz band first channel number
-     * @hide
-     */
-    public static final int BAND_5_GHZ_FIRST_CH_NUM = 32;
-    /**
-     * 5 GHz band last channel number
-     * @hide
-     */
-    public static final int BAND_5_GHZ_LAST_CH_NUM = 173;
-    /**
-     * 5 GHz band frequency of first channel in MHz
-     * @hide
-     */
-    public static final int BAND_5_GHZ_START_FREQ_MHZ = 5160;
-    /**
-     * 5 GHz band frequency of last channel in MHz
-     * @hide
-     */
-    public static final int BAND_5_GHZ_END_FREQ_MHZ = 5865;
-
-    /**
-     * 6 GHz band first channel number
-     * @hide
-     */
-    public static final int BAND_6_GHZ_FIRST_CH_NUM = 1;
-    /**
-     * 6 GHz band last channel number
-     * @hide
-     */
-    public static final int BAND_6_GHZ_LAST_CH_NUM = 233;
-    /**
-     * 6 GHz band frequency of first channel in MHz
-     * @hide
-     */
-    public static final int BAND_6_GHZ_START_FREQ_MHZ = 5955;
-    /**
-     * 6 GHz band frequency of last channel in MHz
-     * @hide
-     */
-    public static final int BAND_6_GHZ_END_FREQ_MHZ = 7115;
-
-    /**
-     * 6 GHz band operating class 136 channel 2 center frequency in MHz
-     * @hide
-     */
-    public static final int BAND_6_GHZ_OP_CLASS_136_CH_2_FREQ_MHZ = 5935;
-
-    /**
-     * Utility function to check if a frequency within 2.4 GHz band
-     * @param freqMhz frequency in MHz
-     * @return true if within 2.4GHz, false otherwise
-     *
-     * @hide
-     */
-    public static boolean is24GHz(int freqMhz) {
-        return freqMhz >= BAND_24_GHZ_START_FREQ_MHZ && freqMhz <= BAND_24_GHZ_END_FREQ_MHZ;
-    }
-
-    /**
-     * Utility function to check if a frequency within 5 GHz band
-     * @param freqMhz frequency in MHz
-     * @return true if within 5GHz, false otherwise
-     *
-     * @hide
-     */
-    public static boolean is5GHz(int freqMhz) {
-        return freqMhz >=  BAND_5_GHZ_START_FREQ_MHZ && freqMhz <= BAND_5_GHZ_END_FREQ_MHZ;
-    }
-
-    /**
-     * Utility function to check if a frequency within 6 GHz band
-     * @param freqMhz
-     * @return true if within 6GHz, false otherwise
-     *
-     * @hide
-     */
-    public static boolean is6GHz(int freqMhz) {
-        if (freqMhz == BAND_6_GHZ_OP_CLASS_136_CH_2_FREQ_MHZ) {
-            return true;
-        }
-        return (freqMhz >= BAND_6_GHZ_START_FREQ_MHZ && freqMhz <= BAND_6_GHZ_END_FREQ_MHZ);
-    }
-
-    /**
-     * Utility function to convert channel number/band to frequency in MHz
-     * @param channel number to convert
-     * @param band of channel to convert
-     * @return center frequency in Mhz of the channel, {@link UNSPECIFIED} if no match
-     *
-     * @hide
-     */
-    public static int convertChannelToFrequencyMhz(int channel, @WifiScanner.WifiBand int band) {
-        if (band == WifiScanner.WIFI_BAND_24_GHZ) {
-            // Special case
-            if (channel == 14) {
-                return 2484;
-            } else if (channel >= BAND_24_GHZ_FIRST_CH_NUM && channel <= BAND_24_GHZ_LAST_CH_NUM) {
-                return ((channel - BAND_24_GHZ_FIRST_CH_NUM) * 5) + BAND_24_GHZ_START_FREQ_MHZ;
-            } else {
-                return UNSPECIFIED;
-            }
-        }
-        if (band == WifiScanner.WIFI_BAND_5_GHZ) {
-            if (channel >= BAND_5_GHZ_FIRST_CH_NUM && channel <= BAND_5_GHZ_LAST_CH_NUM) {
-                return ((channel - BAND_5_GHZ_FIRST_CH_NUM) * 5) + BAND_5_GHZ_START_FREQ_MHZ;
-            } else {
-                return UNSPECIFIED;
-            }
-        }
-        if (band == WifiScanner.WIFI_BAND_6_GHZ) {
-            if (channel >= BAND_6_GHZ_FIRST_CH_NUM && channel <= BAND_6_GHZ_LAST_CH_NUM) {
-                if (channel == 2) {
-                    return BAND_6_GHZ_OP_CLASS_136_CH_2_FREQ_MHZ;
-                }
-                return ((channel - BAND_6_GHZ_FIRST_CH_NUM) * 5) + BAND_6_GHZ_START_FREQ_MHZ;
-            } else {
-                return UNSPECIFIED;
-            }
-        }
-        return UNSPECIFIED;
-    }
-
-    /**
-     * Utility function to convert frequency in MHz to channel number
-     * @param freqMhz frequency in MHz
-     * @return channel number associated with given frequency, {@link UNSPECIFIED} if no match
-     *
-     * @hide
-     */
-    public static int convertFrequencyMhzToChannel(int freqMhz) {
-        // Special case
-        if (freqMhz == 2484) {
-            return 14;
-        } else if (is24GHz(freqMhz)) {
-            return (freqMhz - BAND_24_GHZ_START_FREQ_MHZ) / 5 + BAND_24_GHZ_FIRST_CH_NUM;
-        } else if (is5GHz(freqMhz)) {
-            return ((freqMhz - BAND_5_GHZ_START_FREQ_MHZ) / 5) + BAND_5_GHZ_FIRST_CH_NUM;
-        } else if (is6GHz(freqMhz)) {
-            if (freqMhz == BAND_6_GHZ_OP_CLASS_136_CH_2_FREQ_MHZ) {
-                return 2;
-            }
-            return ((freqMhz - BAND_6_GHZ_START_FREQ_MHZ) / 5) + BAND_6_GHZ_FIRST_CH_NUM;
-        }
-
-        return UNSPECIFIED;
-    }
-
-    /**
-     * @hide
-     */
-    public boolean is24GHz() {
-        return ScanResult.is24GHz(frequency);
-    }
-
-    /**
-     * @hide
-     */
-    public boolean is5GHz() {
-        return ScanResult.is5GHz(frequency);
-    }
-
-    /**
-     * @hide
-     */
-    public boolean is6GHz() {
-        return ScanResult.is6GHz(frequency);
-    }
-
-    /**
-     *  @hide
-     * anqp lines from supplicant BSS response
-     */
-    @UnsupportedAppUsage
-    public List<String> anqpLines;
-
-    /**
-     * information elements from beacon.
-     */
-    public static class InformationElement {
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_SSID = 0;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_SUPPORTED_RATES = 1;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_TIM = 5;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_BSS_LOAD = 11;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_ERP = 42;
-        /** @hide */
-        public static final int EID_HT_CAPABILITIES = 45;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_RSN = 48;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_EXTENDED_SUPPORTED_RATES = 50;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_HT_OPERATION = 61;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_INTERWORKING = 107;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_ROAMING_CONSORTIUM = 111;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_EXTENDED_CAPS = 127;
-        /** @hide */
-        public static final int EID_VHT_CAPABILITIES = 191;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_VHT_OPERATION = 192;
-        /** @hide */
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        public static final int EID_VSA = 221;
-        /** @hide */
-        public static final int EID_EXTENSION_PRESENT = 255;
-
-        // Extension IDs
-        /** @hide */
-        public static final int EID_EXT_HE_CAPABILITIES = 35;
-        /** @hide */
-        public static final int EID_EXT_HE_OPERATION = 36;
-
-        /** @hide */
-        @UnsupportedAppUsage
-        public int id;
-        /** @hide */
-        public int idExt;
-
-        /** @hide */
-        @UnsupportedAppUsage
-        public byte[] bytes;
-
-        /** @hide */
-        public InformationElement() {
-        }
-
-        public InformationElement(@NonNull InformationElement rhs) {
-            this.id = rhs.id;
-            this.idExt = rhs.idExt;
-            this.bytes = rhs.bytes.clone();
-        }
-
-        /**
-         * The element ID of the information element. Defined in the IEEE 802.11-2016 spec
-         * Table 9-77.
-         */
-        public int getId() {
-            return id;
-        }
-
-        /**
-         * The element ID Extension of the information element. Defined in the IEEE 802.11-2016 spec
-         * Table 9-77.
-         */
-        public int getIdExt() {
-            return idExt;
-        }
-
-        /**
-         * Get the specific content of the information element.
-         */
-        @NonNull
-        public ByteBuffer getBytes() {
-            return ByteBuffer.wrap(bytes).asReadOnlyBuffer();
-        }
-    }
-
-    /**
-     * information elements found in the beacon.
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public InformationElement[] informationElements;
-    /**
-     * Get all information elements found in the beacon.
-     */
-    @NonNull
-    public List<InformationElement> getInformationElements() {
-        return Collections.unmodifiableList(Arrays.asList(informationElements));
-    }
-
-    /** ANQP response elements.
-     * @hide
-     */
-    public AnqpInformationElement[] anqpElements;
-
-    /** {@hide} */
-    public ScanResult(WifiSsid wifiSsid, String BSSID, long hessid, int anqpDomainId,
-            byte[] osuProviders, String caps, int level, int frequency, long tsf) {
-        this.wifiSsid = wifiSsid;
-        this.SSID = (wifiSsid != null) ? wifiSsid.toString() : WifiManager.UNKNOWN_SSID;
-        this.BSSID = BSSID;
-        this.hessid = hessid;
-        this.anqpDomainId = anqpDomainId;
-        if (osuProviders != null) {
-            this.anqpElements = new AnqpInformationElement[1];
-            this.anqpElements[0] =
-                    new AnqpInformationElement(AnqpInformationElement.HOTSPOT20_VENDOR_ID,
-                            AnqpInformationElement.HS_OSU_PROVIDERS, osuProviders);
-        }
-        this.capabilities = caps;
-        this.level = level;
-        this.frequency = frequency;
-        this.timestamp = tsf;
-        this.distanceCm = UNSPECIFIED;
-        this.distanceSdCm = UNSPECIFIED;
-        this.channelWidth = UNSPECIFIED;
-        this.centerFreq0 = UNSPECIFIED;
-        this.centerFreq1 = UNSPECIFIED;
-        this.flags = 0;
-        this.radioChainInfos = null;
-        this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
-    }
-
-    /** {@hide} */
-    public ScanResult(WifiSsid wifiSsid, String BSSID, String caps, int level, int frequency,
-            long tsf, int distCm, int distSdCm) {
-        this.wifiSsid = wifiSsid;
-        this.SSID = (wifiSsid != null) ? wifiSsid.toString() : WifiManager.UNKNOWN_SSID;
-        this.BSSID = BSSID;
-        this.capabilities = caps;
-        this.level = level;
-        this.frequency = frequency;
-        this.timestamp = tsf;
-        this.distanceCm = distCm;
-        this.distanceSdCm = distSdCm;
-        this.channelWidth = UNSPECIFIED;
-        this.centerFreq0 = UNSPECIFIED;
-        this.centerFreq1 = UNSPECIFIED;
-        this.flags = 0;
-        this.radioChainInfos = null;
-        this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
-    }
-
-    /** {@hide} */
-    public ScanResult(String Ssid, String BSSID, long hessid, int anqpDomainId, String caps,
-            int level, int frequency,
-            long tsf, int distCm, int distSdCm, int channelWidth, int centerFreq0, int centerFreq1,
-            boolean is80211McRTTResponder) {
-        this.SSID = Ssid;
-        this.BSSID = BSSID;
-        this.hessid = hessid;
-        this.anqpDomainId = anqpDomainId;
-        this.capabilities = caps;
-        this.level = level;
-        this.frequency = frequency;
-        this.timestamp = tsf;
-        this.distanceCm = distCm;
-        this.distanceSdCm = distSdCm;
-        this.channelWidth = channelWidth;
-        this.centerFreq0 = centerFreq0;
-        this.centerFreq1 = centerFreq1;
-        if (is80211McRTTResponder) {
-            this.flags = FLAG_80211mc_RESPONDER;
-        } else {
-            this.flags = 0;
-        }
-        this.radioChainInfos = null;
-        this.mWifiStandard = WIFI_STANDARD_UNKNOWN;
-    }
-
-    /** {@hide} */
-    public ScanResult(WifiSsid wifiSsid, String Ssid, String BSSID, long hessid, int anqpDomainId,
-                  String caps, int level,
-                  int frequency, long tsf, int distCm, int distSdCm, int channelWidth,
-                  int centerFreq0, int centerFreq1, boolean is80211McRTTResponder) {
-        this(Ssid, BSSID, hessid, anqpDomainId, caps, level, frequency, tsf, distCm,
-                distSdCm, channelWidth, centerFreq0, centerFreq1, is80211McRTTResponder);
-        this.wifiSsid = wifiSsid;
-    }
-
-    /** copy constructor */
-    public ScanResult(@NonNull ScanResult source) {
-        if (source != null) {
-            wifiSsid = source.wifiSsid;
-            SSID = source.SSID;
-            BSSID = source.BSSID;
-            hessid = source.hessid;
-            anqpDomainId = source.anqpDomainId;
-            informationElements = source.informationElements;
-            anqpElements = source.anqpElements;
-            capabilities = source.capabilities;
-            level = source.level;
-            frequency = source.frequency;
-            channelWidth = source.channelWidth;
-            centerFreq0 = source.centerFreq0;
-            centerFreq1 = source.centerFreq1;
-            timestamp = source.timestamp;
-            distanceCm = source.distanceCm;
-            distanceSdCm = source.distanceSdCm;
-            seen = source.seen;
-            untrusted = source.untrusted;
-            numUsage = source.numUsage;
-            venueName = source.venueName;
-            operatorFriendlyName = source.operatorFriendlyName;
-            flags = source.flags;
-            radioChainInfos = source.radioChainInfos;
-            this.mWifiStandard = source.mWifiStandard;
-        }
-    }
-
-    /** Construct an empty scan result. */
-    public ScanResult() {
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sb = new StringBuffer();
-        String none = "<none>";
-
-        sb.append("SSID: ")
-                .append(wifiSsid == null ? WifiManager.UNKNOWN_SSID : wifiSsid)
-                .append(", BSSID: ")
-                .append(BSSID == null ? none : BSSID)
-                .append(", capabilities: ")
-                .append(capabilities == null ? none : capabilities)
-                .append(", level: ")
-                .append(level)
-                .append(", frequency: ")
-                .append(frequency)
-                .append(", timestamp: ")
-                .append(timestamp);
-        sb.append(", distance: ").append((distanceCm != UNSPECIFIED ? distanceCm : "?")).
-                append("(cm)");
-        sb.append(", distanceSd: ").append((distanceSdCm != UNSPECIFIED ? distanceSdCm : "?")).
-                append("(cm)");
-
-        sb.append(", passpoint: ");
-        sb.append(((flags & FLAG_PASSPOINT_NETWORK) != 0) ? "yes" : "no");
-        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(", Radio Chain Infos: ").append(Arrays.toString(radioChainInfos));
-        return sb.toString();
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public void writeToParcel(Parcel dest, int flags) {
-        if (wifiSsid != null) {
-            dest.writeInt(1);
-            wifiSsid.writeToParcel(dest, flags);
-        } else {
-            dest.writeInt(0);
-        }
-        dest.writeString(SSID);
-        dest.writeString(BSSID);
-        dest.writeLong(hessid);
-        dest.writeInt(anqpDomainId);
-        dest.writeString(capabilities);
-        dest.writeInt(level);
-        dest.writeInt(frequency);
-        dest.writeLong(timestamp);
-        dest.writeInt(distanceCm);
-        dest.writeInt(distanceSdCm);
-        dest.writeInt(channelWidth);
-        dest.writeInt(centerFreq0);
-        dest.writeInt(centerFreq1);
-        dest.writeInt(mWifiStandard);
-        dest.writeLong(seen);
-        dest.writeInt(untrusted ? 1 : 0);
-        dest.writeInt(numUsage);
-        dest.writeString((venueName != null) ? venueName.toString() : "");
-        dest.writeString((operatorFriendlyName != null) ? operatorFriendlyName.toString() : "");
-        dest.writeLong(this.flags);
-
-        if (informationElements != null) {
-            dest.writeInt(informationElements.length);
-            for (int i = 0; i < informationElements.length; i++) {
-                dest.writeInt(informationElements[i].id);
-                dest.writeInt(informationElements[i].idExt);
-                dest.writeInt(informationElements[i].bytes.length);
-                dest.writeByteArray(informationElements[i].bytes);
-            }
-        } else {
-            dest.writeInt(0);
-        }
-
-        if (anqpLines != null) {
-            dest.writeInt(anqpLines.size());
-            for (int i = 0; i < anqpLines.size(); i++) {
-                dest.writeString(anqpLines.get(i));
-            }
-        }
-        else {
-            dest.writeInt(0);
-        }
-        if (anqpElements != null) {
-            dest.writeInt(anqpElements.length);
-            for (AnqpInformationElement element : anqpElements) {
-                dest.writeInt(element.getVendorId());
-                dest.writeInt(element.getElementId());
-                dest.writeInt(element.getPayload().length);
-                dest.writeByteArray(element.getPayload());
-            }
-        } else {
-            dest.writeInt(0);
-        }
-
-        if (radioChainInfos != null) {
-            dest.writeInt(radioChainInfos.length);
-            for (int i = 0; i < radioChainInfos.length; i++) {
-                dest.writeInt(radioChainInfos[i].id);
-                dest.writeInt(radioChainInfos[i].level);
-            }
-        } else {
-            dest.writeInt(0);
-        }
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @NonNull Creator<ScanResult> CREATOR =
-        new Creator<ScanResult>() {
-            public ScanResult createFromParcel(Parcel in) {
-                WifiSsid wifiSsid = null;
-                if (in.readInt() == 1) {
-                    wifiSsid = WifiSsid.CREATOR.createFromParcel(in);
-                }
-                ScanResult sr = new ScanResult(
-                        wifiSsid,
-                        in.readString(),                    /* SSID  */
-                        in.readString(),                    /* BSSID */
-                        in.readLong(),                      /* HESSID */
-                        in.readInt(),                       /* ANQP Domain ID */
-                        in.readString(),                    /* capabilities */
-                        in.readInt(),                       /* level */
-                        in.readInt(),                       /* frequency */
-                        in.readLong(),                      /* timestamp */
-                        in.readInt(),                       /* distanceCm */
-                        in.readInt(),                       /* distanceSdCm */
-                        in.readInt(),                       /* channelWidth */
-                        in.readInt(),                       /* centerFreq0 */
-                        in.readInt(),                       /* centerFreq1 */
-                        false                               /* rtt responder,
-                                                               fixed with flags below */
-                );
-
-                sr.mWifiStandard = in.readInt();
-                sr.seen = in.readLong();
-                sr.untrusted = in.readInt() != 0;
-                sr.numUsage = in.readInt();
-                sr.venueName = in.readString();
-                sr.operatorFriendlyName = in.readString();
-                sr.flags = in.readLong();
-                int n = in.readInt();
-                if (n != 0) {
-                    sr.informationElements = new InformationElement[n];
-                    for (int i = 0; i < n; i++) {
-                        sr.informationElements[i] = new InformationElement();
-                        sr.informationElements[i].id = in.readInt();
-                        sr.informationElements[i].idExt = in.readInt();
-                        int len = in.readInt();
-                        sr.informationElements[i].bytes = new byte[len];
-                        in.readByteArray(sr.informationElements[i].bytes);
-                    }
-                }
-
-                n = in.readInt();
-                if (n != 0) {
-                    sr.anqpLines = new ArrayList<String>();
-                    for (int i = 0; i < n; i++) {
-                        sr.anqpLines.add(in.readString());
-                    }
-                }
-                n = in.readInt();
-                if (n != 0) {
-                    sr.anqpElements = new AnqpInformationElement[n];
-                    for (int i = 0; i < n; i++) {
-                        int vendorId = in.readInt();
-                        int elementId = in.readInt();
-                        int len = in.readInt();
-                        byte[] payload = new byte[len];
-                        in.readByteArray(payload);
-                        sr.anqpElements[i] =
-                                new AnqpInformationElement(vendorId, elementId, payload);
-                    }
-                }
-                n = in.readInt();
-                if (n != 0) {
-                    sr.radioChainInfos = new RadioChainInfo[n];
-                    for (int i = 0; i < n; i++) {
-                        sr.radioChainInfos[i] = new RadioChainInfo();
-                        sr.radioChainInfos[i].id = in.readInt();
-                        sr.radioChainInfos[i].level = in.readInt();
-                    }
-                }
-                return sr;
-            }
-
-            public ScanResult[] newArray(int size) {
-                return new ScanResult[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/SoftApCapability.java b/wifi/java/android/net/wifi/SoftApCapability.java
deleted file mode 100644
index dcb57ec..0000000
--- a/wifi/java/android/net/wifi/SoftApCapability.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.LongDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Objects;
-
-/**
- * A class representing capability of the SoftAp.
- * {@see WifiManager}
- *
- * @hide
- */
-@SystemApi
-public final class SoftApCapability implements Parcelable {
-
-    /**
-     * Support for automatic channel selection in driver (ACS).
-     * Driver will auto select best channel based on interference to optimize performance.
-     *
-     * flag when {@link R.bool.config_wifi_softap_acs_supported)} is true.
-     *
-     * <p>
-     * Use {@link WifiManager.SoftApCallback#onInfoChanged(SoftApInfo)} and
-     * {@link SoftApInfo#getFrequency} and {@link SoftApInfo#getBandwidth} to get
-     * driver channel selection result.
-     */
-    public static final long SOFTAP_FEATURE_ACS_OFFLOAD = 1 << 0;
-
-    /**
-     * Support for client force disconnect.
-     * flag when {@link R.bool.config_wifi_sofap_client_force_disconnect_supported)} is true
-     *
-     * <p>
-     * Several Soft AP client control features, e.g. specifying the maximum number of
-     * Soft AP clients, only work when this feature support is present.
-     * Check feature support before invoking
-     * {@link SoftApConfiguration.Builder#setMaxNumberOfClients(int)}
-     */
-    public static final long SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT = 1 << 1;
-
-
-    /**
-     * Support for WPA3 Simultaneous Authentication of Equals (WPA3-SAE).
-     *
-     * flag when {@link config_wifi_softap_sae_supported)} is true.
-     */
-    public static final long SOFTAP_FEATURE_WPA3_SAE = 1 << 2;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @LongDef(flag = true, prefix = { "SOFTAP_FEATURE_" }, value = {
-            SOFTAP_FEATURE_ACS_OFFLOAD,
-            SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT,
-            SOFTAP_FEATURE_WPA3_SAE,
-    })
-    public @interface HotspotFeatures {}
-
-    private @HotspotFeatures long mSupportedFeatures = 0;
-
-    private int mMaximumSupportedClientNumber;
-
-    /**
-     * Get the maximum supported client numbers which AP resides on.
-     */
-    public int getMaxSupportedClients() {
-        return mMaximumSupportedClientNumber;
-    }
-
-    /**
-     * Set the maximum supported client numbers which AP resides on.
-     *
-     * @param maxClient maximum supported client numbers for the softap.
-     * @hide
-     */
-    public void setMaxSupportedClients(int maxClient) {
-        mMaximumSupportedClientNumber = maxClient;
-    }
-
-    /**
-     * Returns true when all of the queried features are supported, otherwise false.
-     *
-     * @param features One or combination of the following features:
-     * {@link #SOFTAP_FEATURE_ACS_OFFLOAD}, {@link #SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT} or
-     * {@link #SOFTAP_FEATURE_WPA3_SAE}.
-     */
-    public boolean areFeaturesSupported(@HotspotFeatures long features) {
-        return (mSupportedFeatures & features) == features;
-    }
-
-    /**
-     * @hide
-     */
-    public SoftApCapability(@Nullable SoftApCapability source) {
-        if (source != null) {
-            mSupportedFeatures = source.mSupportedFeatures;
-            mMaximumSupportedClientNumber = source.mMaximumSupportedClientNumber;
-        }
-    }
-
-    /**
-     * Constructor with combination of the feature.
-     * Zero to no supported feature.
-     *
-     * @param features One or combination of the following features:
-     * {@link #SOFTAP_FEATURE_ACS_OFFLOAD}, {@link #SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT} or
-     * {@link #SOFTAP_FEATURE_WPA3_SAE}.
-     * @hide
-     */
-    public SoftApCapability(@HotspotFeatures long features) {
-        mSupportedFeatures = features;
-    }
-
-    @Override
-    /** Implement the Parcelable interface. */
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    /** Implement the Parcelable interface */
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeLong(mSupportedFeatures);
-        dest.writeInt(mMaximumSupportedClientNumber);
-    }
-
-    @NonNull
-    /** Implement the Parcelable interface */
-    public static final Creator<SoftApCapability> CREATOR = new Creator<SoftApCapability>() {
-        public SoftApCapability createFromParcel(Parcel in) {
-            long supportedFeatures = in.readLong();
-            SoftApCapability capability = new SoftApCapability(supportedFeatures);
-            capability.mMaximumSupportedClientNumber = in.readInt();
-            return capability;
-        }
-
-        public SoftApCapability[] newArray(int size) {
-            return new SoftApCapability[size];
-        }
-    };
-
-    @NonNull
-    @Override
-    public String toString() {
-        StringBuilder sbuf = new StringBuilder();
-        sbuf.append("SupportedFeatures=").append(mSupportedFeatures);
-        sbuf.append("MaximumSupportedClientNumber=").append(mMaximumSupportedClientNumber);
-        return sbuf.toString();
-    }
-
-    @Override
-    public boolean equals(@NonNull Object o) {
-        if (this == o) return true;
-        if (!(o instanceof SoftApCapability)) return false;
-        SoftApCapability capability = (SoftApCapability) o;
-        return mSupportedFeatures == capability.mSupportedFeatures
-                && mMaximumSupportedClientNumber == capability.mMaximumSupportedClientNumber;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mSupportedFeatures, mMaximumSupportedClientNumber);
-    }
-}
diff --git a/wifi/java/android/net/wifi/SoftApConfiguration.java b/wifi/java/android/net/wifi/SoftApConfiguration.java
deleted file mode 100644
index d2ff658..0000000
--- a/wifi/java/android/net/wifi/SoftApConfiguration.java
+++ /dev/null
@@ -1,973 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.IntDef;
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.net.MacAddress;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.internal.util.Preconditions;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Configuration for a soft access point (a.k.a. Soft AP, SAP, Hotspot).
- *
- * This is input for the framework provided by a client app, i.e. it exposes knobs to instruct the
- * framework how it should configure a hotspot.
- *
- * System apps can use this to configure a tethered hotspot using
- * {@code WifiManager#startTetheredHotspot(SoftApConfiguration)} and
- * {@code WifiManager#setSoftApConfiguration(SoftApConfiguration)}
- * or local-only hotspot using
- * {@code WifiManager#startLocalOnlyHotspot(SoftApConfiguration, Executor,
- * WifiManager.LocalOnlyHotspotCallback)}.
- *
- * Instances of this class are immutable; use {@link SoftApConfiguration.Builder} and its methods to
- * create a new instance.
- *
- */
-public final class SoftApConfiguration implements Parcelable {
-
-    private static final String TAG = "SoftApConfiguration";
-
-    @VisibleForTesting
-    static final int PSK_MIN_LEN = 8;
-
-    @VisibleForTesting
-    static final int PSK_MAX_LEN = 63;
-
-    /**
-     * 2GHz band.
-     * @hide
-     */
-    @SystemApi
-    public static final int BAND_2GHZ = 1 << 0;
-
-    /**
-     * 5GHz band.
-     * @hide
-     */
-    @SystemApi
-    public static final int BAND_5GHZ = 1 << 1;
-
-    /**
-     * 6GHz band.
-     * @hide
-     */
-    @SystemApi
-    public static final int BAND_6GHZ = 1 << 2;
-
-    /**
-     * Device is allowed to choose the optimal band (2Ghz, 5Ghz, 6Ghz) based on device capability,
-     * operating country code and current radio conditions.
-     * @hide
-     */
-    @SystemApi
-    public static final int BAND_ANY = BAND_2GHZ | BAND_5GHZ | BAND_6GHZ;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(flag = true, prefix = { "BAND_TYPE_" }, value = {
-            BAND_2GHZ,
-            BAND_5GHZ,
-            BAND_6GHZ,
-    })
-    public @interface BandType {}
-
-    private static boolean isBandValid(@BandType int band) {
-        return ((band != 0) && ((band & ~BAND_ANY) == 0));
-    }
-
-    private static final int MIN_CH_2G_BAND = 1;
-    private static final int MAX_CH_2G_BAND = 14;
-    private static final int MIN_CH_5G_BAND = 34;
-    private static final int MAX_CH_5G_BAND = 196;
-    private static final int MIN_CH_6G_BAND = 1;
-    private static final int MAX_CH_6G_BAND = 253;
-
-
-
-    private static boolean isChannelBandPairValid(int channel, @BandType int band) {
-        switch (band) {
-            case BAND_2GHZ:
-                if (channel < MIN_CH_2G_BAND || channel >  MAX_CH_2G_BAND) {
-                    return false;
-                }
-                break;
-
-            case BAND_5GHZ:
-                if (channel < MIN_CH_5G_BAND || channel >  MAX_CH_5G_BAND) {
-                    return false;
-                }
-                break;
-
-            case BAND_6GHZ:
-                if (channel < MIN_CH_6G_BAND || channel >  MAX_CH_6G_BAND) {
-                    return false;
-                }
-                break;
-            default:
-                return false;
-        }
-        return true;
-    }
-
-    /**
-     * SSID for the AP, or null for a framework-determined SSID.
-     */
-    private final @Nullable String mSsid;
-
-    /**
-     * BSSID for the AP, or null to use a framework-determined BSSID.
-     */
-    private final @Nullable MacAddress mBssid;
-
-    /**
-     * Pre-shared key for WPA2-PSK or WPA3-SAE-Transition or WPA3-SAE encryption which depends on
-     * the security type.
-     */
-    private final @Nullable String mPassphrase;
-
-    /**
-     * This is a network that does not broadcast its SSID, so an
-     * SSID-specific probe request must be used for scans.
-     */
-    private final boolean mHiddenSsid;
-
-    /**
-     * The operating band of the AP.
-     * One or combination of the following band type:
-     * {@link #BAND_2GHZ}, {@link #BAND_5GHZ}, {@link #BAND_6GHZ}.
-     */
-    private final @BandType int mBand;
-
-    /**
-     * The operating channel of the AP.
-     */
-    private final int mChannel;
-
-    /**
-     * The maximim allowed number of clients that can associate to the AP.
-     */
-    private final int mMaxNumberOfClients;
-
-    /**
-     * The operating security type of the AP.
-     * One of the following security types:
-     * {@link #SECURITY_TYPE_OPEN},
-     * {@link #SECURITY_TYPE_WPA2_PSK},
-     * {@link #SECURITY_TYPE_WPA3_SAE_TRANSITION},
-     * {@link #SECURITY_TYPE_WPA3_SAE}
-     */
-    private final @SecurityType int mSecurityType;
-
-    /**
-     * The flag to indicate client need to authorize by user
-     * when client is connecting to AP.
-     */
-    private final boolean mClientControlByUser;
-
-    /**
-     * The list of blocked client that can't associate to the AP.
-     */
-    private final List<MacAddress> mBlockedClientList;
-
-    /**
-     * The list of allowed client that can associate to the AP.
-     */
-    private final List<MacAddress> mAllowedClientList;
-
-    /**
-     * Whether auto shutdown of soft AP is enabled or not.
-     */
-    private final boolean mAutoShutdownEnabled;
-
-    /**
-     * Delay in milliseconds before shutting down soft AP when
-     * there are no connected devices.
-     */
-    private final long mShutdownTimeoutMillis;
-
-    /**
-     * THe definition of security type OPEN.
-     */
-    public static final int SECURITY_TYPE_OPEN = 0;
-
-    /**
-     * The definition of security type WPA2-PSK.
-     */
-    public static final int SECURITY_TYPE_WPA2_PSK = 1;
-
-    /**
-     * The definition of security type WPA3-SAE Transition mode.
-     */
-    public static final int SECURITY_TYPE_WPA3_SAE_TRANSITION = 2;
-
-    /**
-     * The definition of security type WPA3-SAE.
-     */
-    public static final int SECURITY_TYPE_WPA3_SAE = 3;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = { "SECURITY_TYPE_" }, value = {
-        SECURITY_TYPE_OPEN,
-        SECURITY_TYPE_WPA2_PSK,
-        SECURITY_TYPE_WPA3_SAE_TRANSITION,
-        SECURITY_TYPE_WPA3_SAE,
-    })
-    public @interface SecurityType {}
-
-    /** Private constructor for Builder and Parcelable implementation. */
-    private SoftApConfiguration(@Nullable String ssid, @Nullable MacAddress bssid,
-            @Nullable String passphrase, boolean hiddenSsid, @BandType int band, int channel,
-            @SecurityType int securityType, int maxNumberOfClients, boolean shutdownTimeoutEnabled,
-            long shutdownTimeoutMillis, boolean clientControlByUser,
-            @NonNull List<MacAddress> blockedList, @NonNull List<MacAddress> allowedList) {
-        mSsid = ssid;
-        mBssid = bssid;
-        mPassphrase = passphrase;
-        mHiddenSsid = hiddenSsid;
-        mBand = band;
-        mChannel = channel;
-        mSecurityType = securityType;
-        mMaxNumberOfClients = maxNumberOfClients;
-        mAutoShutdownEnabled = shutdownTimeoutEnabled;
-        mShutdownTimeoutMillis = shutdownTimeoutMillis;
-        mClientControlByUser = clientControlByUser;
-        mBlockedClientList = new ArrayList<>(blockedList);
-        mAllowedClientList = new ArrayList<>(allowedList);
-    }
-
-    @Override
-    public boolean equals(Object otherObj) {
-        if (this == otherObj) {
-            return true;
-        }
-        if (!(otherObj instanceof SoftApConfiguration)) {
-            return false;
-        }
-        SoftApConfiguration other = (SoftApConfiguration) otherObj;
-        return Objects.equals(mSsid, other.mSsid)
-                && Objects.equals(mBssid, other.mBssid)
-                && Objects.equals(mPassphrase, other.mPassphrase)
-                && mHiddenSsid == other.mHiddenSsid
-                && mBand == other.mBand
-                && mChannel == other.mChannel
-                && mSecurityType == other.mSecurityType
-                && mMaxNumberOfClients == other.mMaxNumberOfClients
-                && mAutoShutdownEnabled == other.mAutoShutdownEnabled
-                && mShutdownTimeoutMillis == other.mShutdownTimeoutMillis
-                && mClientControlByUser == other.mClientControlByUser
-                && Objects.equals(mBlockedClientList, other.mBlockedClientList)
-                && Objects.equals(mAllowedClientList, other.mAllowedClientList);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mSsid, mBssid, mPassphrase, mHiddenSsid,
-                mBand, mChannel, mSecurityType, mMaxNumberOfClients, mAutoShutdownEnabled,
-                mShutdownTimeoutMillis, mClientControlByUser, mBlockedClientList,
-                mAllowedClientList);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sbuf = new StringBuilder();
-        sbuf.append("ssid=").append(mSsid);
-        if (mBssid != null) sbuf.append(" \n bssid=").append(mBssid.toString());
-        sbuf.append(" \n Passphrase =").append(
-                TextUtils.isEmpty(mPassphrase) ? "<empty>" : "<non-empty>");
-        sbuf.append(" \n HiddenSsid =").append(mHiddenSsid);
-        sbuf.append(" \n Band =").append(mBand);
-        sbuf.append(" \n Channel =").append(mChannel);
-        sbuf.append(" \n SecurityType=").append(getSecurityType());
-        sbuf.append(" \n MaxClient=").append(mMaxNumberOfClients);
-        sbuf.append(" \n AutoShutdownEnabled=").append(mAutoShutdownEnabled);
-        sbuf.append(" \n ShutdownTimeoutMillis=").append(mShutdownTimeoutMillis);
-        sbuf.append(" \n ClientControlByUser=").append(mClientControlByUser);
-        sbuf.append(" \n BlockedClientList=").append(mBlockedClientList);
-        sbuf.append(" \n AllowedClientList=").append(mAllowedClientList);
-        return sbuf.toString();
-    }
-
-    @Override
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeString(mSsid);
-        dest.writeParcelable(mBssid, flags);
-        dest.writeString(mPassphrase);
-        dest.writeBoolean(mHiddenSsid);
-        dest.writeInt(mBand);
-        dest.writeInt(mChannel);
-        dest.writeInt(mSecurityType);
-        dest.writeInt(mMaxNumberOfClients);
-        dest.writeBoolean(mAutoShutdownEnabled);
-        dest.writeLong(mShutdownTimeoutMillis);
-        dest.writeBoolean(mClientControlByUser);
-        dest.writeTypedList(mBlockedClientList);
-        dest.writeTypedList(mAllowedClientList);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @NonNull
-    public static final Creator<SoftApConfiguration> CREATOR = new Creator<SoftApConfiguration>() {
-        @Override
-        public SoftApConfiguration createFromParcel(Parcel in) {
-            return new SoftApConfiguration(
-                    in.readString(),
-                    in.readParcelable(MacAddress.class.getClassLoader()),
-                    in.readString(), in.readBoolean(), in.readInt(), in.readInt(), in.readInt(),
-                    in.readInt(), in.readBoolean(), in.readLong(), in.readBoolean(),
-                    in.createTypedArrayList(MacAddress.CREATOR),
-                    in.createTypedArrayList(MacAddress.CREATOR));
-        }
-
-        @Override
-        public SoftApConfiguration[] newArray(int size) {
-            return new SoftApConfiguration[size];
-        }
-    };
-
-    /**
-     * Return String set to be the SSID for the AP.
-     * {@link Builder#setSsid(String)}.
-     */
-    @Nullable
-    public String getSsid() {
-        return mSsid;
-    }
-
-    /**
-     * Returns MAC address set to be BSSID for the AP.
-     * {@link Builder#setBssid(MacAddress)}.
-     */
-    @Nullable
-    public MacAddress getBssid() {
-        return mBssid;
-    }
-
-    /**
-     * Returns String set to be passphrase for current AP.
-     * {@link Builder#setPassphrase(String, int)}.
-     */
-    @Nullable
-    public String getPassphrase() {
-        return mPassphrase;
-    }
-
-    /**
-     * Returns Boolean set to be indicate hidden (true: doesn't broadcast its SSID) or
-     * not (false: broadcasts its SSID) for the AP.
-     * {@link Builder#setHiddenSsid(boolean)}.
-     */
-    public boolean isHiddenSsid() {
-        return mHiddenSsid;
-    }
-
-    /**
-     * Returns band type set to be the band for the AP.
-     *
-     * One or combination of the following band type:
-     * {@link #BAND_2GHZ}, {@link #BAND_5GHZ}, {@link #BAND_6GHZ}.
-     *
-     * {@link Builder#setBand(int)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public @BandType int getBand() {
-        return mBand;
-    }
-
-    /**
-     * Returns Integer set to be the channel for the AP.
-     * {@link Builder#setChannel(int)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public int getChannel() {
-        return mChannel;
-    }
-
-    /**
-     * Get security type params which depends on which security passphrase to set.
-     *
-     * @return One of:
-     * {@link #SECURITY_TYPE_OPEN},
-     * {@link #SECURITY_TYPE_WPA2_PSK},
-     * {@link #SECURITY_TYPE_WPA3_SAE_TRANSITION},
-     * {@link #SECURITY_TYPE_WPA3_SAE}
-     */
-    public @SecurityType int getSecurityType() {
-        return mSecurityType;
-    }
-
-    /**
-     * Returns the maximum number of clients that can associate to the AP.
-     * {@link Builder#setMaxNumberOfClients(int)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public int getMaxNumberOfClients() {
-        return mMaxNumberOfClients;
-    }
-
-    /**
-     * Returns whether auto shutdown is enabled or not.
-     * The Soft AP will shutdown when there are no devices associated to it for
-     * the timeout duration. See {@link Builder#setAutoShutdownEnabled(boolean)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public boolean isAutoShutdownEnabled() {
-        return mAutoShutdownEnabled;
-    }
-
-    /**
-     * Returns the shutdown timeout in milliseconds.
-     * The Soft AP will shutdown when there are no devices associated to it for
-     * the timeout duration. See {@link Builder#setShutdownTimeoutMillis(long)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public long getShutdownTimeoutMillis() {
-        return mShutdownTimeoutMillis;
-    }
-
-    /**
-     * Returns a flag indicating whether clients need to be pre-approved by the user.
-     * (true: authorization required) or not (false: not required).
-     * {@link Builder#setClientControlByUserEnabled(Boolean)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public boolean isClientControlByUserEnabled() {
-        return mClientControlByUser;
-    }
-
-    /**
-     * Returns List of clients which aren't allowed to associate to the AP.
-     *
-     * Clients are configured using {@link Builder#setBlockedClientList(List)}
-     *
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    public List<MacAddress> getBlockedClientList() {
-        return mBlockedClientList;
-    }
-
-    /**
-     * List of clients which are allowed to associate to the AP.
-     * Clients are configured using {@link Builder#setAllowedClientList(List)}
-     *
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    public List<MacAddress> getAllowedClientList() {
-        return mAllowedClientList;
-    }
-
-    /**
-     * Returns a {@link WifiConfiguration} representation of this {@link SoftApConfiguration}.
-     * Note that SoftApConfiguration may contain configuration which is cannot be represented
-     * by the legacy WifiConfiguration, in such cases a null will be returned.
-     *
-     * <li> SoftAp band in {@link WifiConfiguration.apBand} only supports
-     * 2GHz, 5GHz, 2GHz+5GHz bands, so conversion is limited to these bands. </li>
-     *
-     * <li> SoftAp security type in {@link WifiConfiguration.KeyMgmt} only supports
-     * NONE, WPA2_PSK, so conversion is limited to these security type.</li>
-     * @hide
-     */
-    @Nullable
-    @SystemApi
-    public WifiConfiguration toWifiConfiguration() {
-        WifiConfiguration wifiConfig = new WifiConfiguration();
-        wifiConfig.SSID = mSsid;
-        wifiConfig.preSharedKey = mPassphrase;
-        wifiConfig.hiddenSSID = mHiddenSsid;
-        wifiConfig.apChannel = mChannel;
-        switch (mSecurityType) {
-            case SECURITY_TYPE_OPEN:
-                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-                break;
-            case SECURITY_TYPE_WPA2_PSK:
-            case SECURITY_TYPE_WPA3_SAE_TRANSITION:
-                wifiConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA2_PSK);
-                break;
-            default:
-                Log.e(TAG, "Convert fail, unsupported security type :" + mSecurityType);
-                return null;
-        }
-
-        switch (mBand) {
-            case BAND_2GHZ:
-                wifiConfig.apBand  = WifiConfiguration.AP_BAND_2GHZ;
-                break;
-            case BAND_5GHZ:
-                wifiConfig.apBand  = WifiConfiguration.AP_BAND_5GHZ;
-                break;
-            case BAND_2GHZ | BAND_5GHZ:
-                wifiConfig.apBand  = WifiConfiguration.AP_BAND_ANY;
-                break;
-            case BAND_ANY:
-                wifiConfig.apBand  = WifiConfiguration.AP_BAND_ANY;
-                break;
-            default:
-                Log.e(TAG, "Convert fail, unsupported band setting :" + mBand);
-                return null;
-        }
-        return wifiConfig;
-    }
-
-    /**
-     * Builds a {@link SoftApConfiguration}, which allows an app to configure various aspects of a
-     * Soft AP.
-     *
-     * All fields are optional. By default, SSID and BSSID are automatically chosen by the
-     * framework, and an open network is created.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final class Builder {
-        private String mSsid;
-        private MacAddress mBssid;
-        private String mPassphrase;
-        private boolean mHiddenSsid;
-        private int mBand;
-        private int mChannel;
-        private int mMaxNumberOfClients;
-        private int mSecurityType;
-        private boolean mAutoShutdownEnabled;
-        private long mShutdownTimeoutMillis;
-        private boolean mClientControlByUser;
-        private List<MacAddress> mBlockedClientList;
-        private List<MacAddress> mAllowedClientList;
-
-        /**
-         * Constructs a Builder with default values (see {@link Builder}).
-         */
-        public Builder() {
-            mSsid = null;
-            mBssid = null;
-            mPassphrase = null;
-            mHiddenSsid = false;
-            mBand = BAND_2GHZ;
-            mChannel = 0;
-            mMaxNumberOfClients = 0;
-            mSecurityType = SECURITY_TYPE_OPEN;
-            mAutoShutdownEnabled = true; // enabled by default.
-            mShutdownTimeoutMillis = 0;
-            mClientControlByUser = false;
-            mBlockedClientList = new ArrayList<>();
-            mAllowedClientList = new ArrayList<>();
-        }
-
-        /**
-         * Constructs a Builder initialized from an existing {@link SoftApConfiguration} instance.
-         */
-        public Builder(@NonNull SoftApConfiguration other) {
-            Objects.requireNonNull(other);
-
-            mSsid = other.mSsid;
-            mBssid = other.mBssid;
-            mPassphrase = other.mPassphrase;
-            mHiddenSsid = other.mHiddenSsid;
-            mBand = other.mBand;
-            mChannel = other.mChannel;
-            mMaxNumberOfClients = other.mMaxNumberOfClients;
-            mSecurityType = other.mSecurityType;
-            mAutoShutdownEnabled = other.mAutoShutdownEnabled;
-            mShutdownTimeoutMillis = other.mShutdownTimeoutMillis;
-            mClientControlByUser = other.mClientControlByUser;
-            mBlockedClientList = new ArrayList<>(other.mBlockedClientList);
-            mAllowedClientList = new ArrayList<>(other.mAllowedClientList);
-        }
-
-        /**
-         * Builds the {@link SoftApConfiguration}.
-         *
-         * @return A new {@link SoftApConfiguration}, as configured by previous method calls.
-         */
-        @NonNull
-        public SoftApConfiguration build() {
-            for (MacAddress client : mAllowedClientList) {
-                if (mBlockedClientList.contains(client)) {
-                    throw new IllegalArgumentException("A MacAddress exist in both client list");
-                }
-            }
-            return new SoftApConfiguration(mSsid, mBssid, mPassphrase,
-                    mHiddenSsid, mBand, mChannel, mSecurityType, mMaxNumberOfClients,
-                    mAutoShutdownEnabled, mShutdownTimeoutMillis, mClientControlByUser,
-                    mBlockedClientList, mAllowedClientList);
-        }
-
-        /**
-         * Specifies an SSID for the AP.
-         * <p>
-         * Null SSID only support when configure a local-only hotspot.
-         * <p>
-         * <li>If not set, defaults to null.</li>
-         *
-         * @param ssid SSID of valid Unicode characters, or null to have the SSID automatically
-         *             chosen by the framework.
-         * @return Builder for chaining.
-         * @throws IllegalArgumentException when the SSID is empty or not valid Unicode.
-         */
-        @NonNull
-        public Builder setSsid(@Nullable String ssid) {
-            if (ssid != null) {
-                Preconditions.checkStringNotEmpty(ssid);
-                Preconditions.checkArgument(StandardCharsets.UTF_8.newEncoder().canEncode(ssid));
-            }
-            mSsid = ssid;
-            return this;
-        }
-
-        /**
-         * Specifies a BSSID for the AP.
-         * <p>
-         * <li>If not set, defaults to null.</li>
-         * @param bssid BSSID, or null to have the BSSID chosen by the framework. The caller is
-         *              responsible for avoiding collisions.
-         * @return Builder for chaining.
-         * @throws IllegalArgumentException when the given BSSID is the all-zero or broadcast MAC
-         *                                  address.
-         */
-        @NonNull
-        public Builder setBssid(@Nullable MacAddress bssid) {
-            if (bssid != null) {
-                Preconditions.checkArgument(!bssid.equals(WifiManager.ALL_ZEROS_MAC_ADDRESS));
-                Preconditions.checkArgument(!bssid.equals(MacAddress.BROADCAST_ADDRESS));
-            }
-            mBssid = bssid;
-            return this;
-        }
-
-        /**
-         * Specifies that this AP should use specific security type with the given ASCII passphrase.
-         *
-         * @param securityType One of the following security types:
-         * {@link #SECURITY_TYPE_OPEN},
-         * {@link #SECURITY_TYPE_WPA2_PSK},
-         * {@link #SECURITY_TYPE_WPA3_SAE_TRANSITION},
-         * {@link #SECURITY_TYPE_WPA3_SAE}.
-         * @param passphrase The passphrase to use for sepcific {@code securityType} configuration
-         * or null with {@link #SECURITY_TYPE_OPEN}.
-         *
-         * @return Builder for chaining.
-         * @throws IllegalArgumentException when the passphrase length is invalid and
-         *         {@code securityType} is not {@link #SECURITY_TYPE_OPEN}
-         *         or non-null passphrase and {@code securityType} is
-         *         {@link #SECURITY_TYPE_OPEN}.
-         */
-        @NonNull
-        public Builder setPassphrase(@Nullable String passphrase, @SecurityType int securityType) {
-            if (securityType == SECURITY_TYPE_OPEN) {
-                if (passphrase != null) {
-                    throw new IllegalArgumentException(
-                            "passphrase should be null when security type is open");
-                }
-            } else {
-                Preconditions.checkStringNotEmpty(passphrase);
-                final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
-                if (!asciiEncoder.canEncode(passphrase)) {
-                    throw new IllegalArgumentException("passphrase not ASCII encodable");
-                }
-                if (securityType == SECURITY_TYPE_WPA2_PSK
-                        || securityType == SECURITY_TYPE_WPA3_SAE_TRANSITION) {
-                    if (passphrase.length() < PSK_MIN_LEN || passphrase.length() > PSK_MAX_LEN) {
-                        throw new IllegalArgumentException(
-                                "Password size must be at least " + PSK_MIN_LEN
-                                + " and no more than " + PSK_MAX_LEN
-                                + " for WPA2_PSK and WPA3_SAE_TRANSITION Mode");
-                    }
-                }
-            }
-            mSecurityType = securityType;
-            mPassphrase = passphrase;
-            return this;
-        }
-
-        /**
-         * Specifies whether the AP is hidden (doesn't broadcast its SSID) or
-         * not (broadcasts its SSID).
-         * <p>
-         * <li>If not set, defaults to false (i.e not a hidden network).</li>
-         *
-         * @param hiddenSsid true for a hidden SSID, false otherwise.
-         * @return Builder for chaining.
-         */
-        @NonNull
-        public Builder setHiddenSsid(boolean hiddenSsid) {
-            mHiddenSsid = hiddenSsid;
-            return this;
-        }
-
-        /**
-         * Specifies the band for the AP.
-         * <p>
-         * <li>If not set, defaults to {@link #BAND_2GHZ}.</li>
-         *
-         * @param band One or combination of the following band type:
-         * {@link #BAND_2GHZ}, {@link #BAND_5GHZ}, {@link #BAND_6GHZ}.
-         * @return Builder for chaining.
-         */
-        @NonNull
-        public Builder setBand(@BandType int band) {
-            if (!isBandValid(band)) {
-                throw new IllegalArgumentException("Invalid band type");
-            }
-            mBand = band;
-            // Since band preference is specified, no specific channel is selected.
-            mChannel = 0;
-            return this;
-        }
-
-        /**
-         * Specifies the channel and associated band for the AP.
-         *
-         * The channel which AP resides on. Valid channels are country dependent.
-         * <p>
-         * The default for the channel is a the special value 0 to have the framework
-         * auto-select a valid channel from the band configured with
-         * {@link #setBand(int)}.
-         *
-         * The channel auto selection will offload to driver when
-         * {@link SoftApCapability#areFeaturesSupported(
-         * SoftApCapability.SOFTAP_FEATURE_ACS_OFFLOAD)}
-         * return true. Driver will auto select best channel which based on environment
-         * interference to get best performance. Check {@link SoftApCapability} to get more detail.
-         *
-         * Note, since 6GHz band use the same channel numbering of 2.4GHz and 5GHZ bands,
-         * the caller needs to pass the band containing the selected channel.
-         *
-         * <p>
-         * <li>If not set, defaults to 0.</li>
-         * @param channel operating channel of the AP.
-         * @param band containing this channel.
-         * @return Builder for chaining.
-         */
-        @NonNull
-        public Builder setChannel(int channel, @BandType int band) {
-            if (!isChannelBandPairValid(channel, band)) {
-                throw new IllegalArgumentException("Invalid band type");
-            }
-            mBand = band;
-            mChannel = channel;
-            return this;
-        }
-
-        /**
-         * Specifies the maximum number of clients that can associate to the AP.
-         *
-         * The maximum number of clients (STAs) which can associate to the AP.
-         * The AP will reject association from any clients above this number.
-         * Specify a value of 0 to have the framework automatically use the maximum number
-         * which the device can support (based on hardware and carrier constraints).
-         * <p>
-         * Use {@link WifiManager.SoftApCallback#onCapabilityChanged(SoftApCapability)} and
-         * {@link SoftApCapability#getMaxSupportedClients} to get the maximum number of clients
-         * which the device supports (based on hardware and carrier constraints).
-         *
-         * <p>
-         * <li>If not set, defaults to 0.</li>
-         *
-         * This method requires hardware support. If the method is used to set a
-         * non-zero {@code maxNumberOfClients} value then
-         * {@link WifiManager#startTetheredHotspot} will report error code
-         * {@link WifiManager#SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION}.
-         *
-         * <p>
-         * Use {@link WifiManager.SoftApCallback#onCapabilityChanged(SoftApCapability)} and
-         * {@link SoftApCapability#areFeaturesSupported(int)}
-         * with {@link SoftApCapability.SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT} to determine whether
-         * or not this feature is supported.
-         *
-         * @param maxNumberOfClients maximum client number of the AP.
-         * @return Builder for chaining.
-         */
-        @NonNull
-        public Builder setMaxNumberOfClients(@IntRange(from = 0) int maxNumberOfClients) {
-            if (maxNumberOfClients < 0) {
-                throw new IllegalArgumentException("maxNumberOfClients should be not negative");
-            }
-            mMaxNumberOfClients = maxNumberOfClients;
-            return this;
-        }
-
-        /**
-         * Specifies whether auto shutdown is enabled or not.
-         * The Soft AP will shut down when there are no devices connected to it for
-         * the timeout duration.
-         *
-         * <p>
-         * <li>If not set, defaults to true</li>
-         *
-         * @param enable true to enable, false to disable.
-         * @return Builder for chaining.
-         *
-         * @see #setShutdownTimeoutMillis(long)
-         */
-        @NonNull
-        public Builder setAutoShutdownEnabled(boolean enable) {
-            mAutoShutdownEnabled = enable;
-            return this;
-        }
-
-        /**
-         * Specifies the shutdown timeout in milliseconds.
-         * The Soft AP will shut down when there are no devices connected to it for
-         * the timeout duration.
-         *
-         * Specify a value of 0 to have the framework automatically use default timeout
-         * setting which defined in {@link R.integer.config_wifi_framework_soft_ap_timeout_delay}
-         *
-         * <p>
-         * <li>If not set, defaults to 0</li>
-         * <li>The shut down timeout will apply when {@link #setAutoShutdownEnabled(boolean)} is
-         * set to true</li>
-         *
-         * @param timeoutMillis milliseconds of the timeout delay.
-         * @return Builder for chaining.
-         *
-         * @see #setAutoShutdownEnabled(boolean)
-         */
-        @NonNull
-        public Builder setShutdownTimeoutMillis(@IntRange(from = 0) long timeoutMillis) {
-            if (timeoutMillis < 0) {
-                throw new IllegalArgumentException("Invalid timeout value");
-            }
-            mShutdownTimeoutMillis = timeoutMillis;
-            return this;
-        }
-
-        /**
-         * Configure the Soft AP to require manual user control of client association.
-         * If disabled (the default) then any client which isn't in the blocked list
-         * {@link #getBlockedClientList()} can associate to this Soft AP using the
-         * correct credentials until the Soft AP capacity is reached (capacity is hardware, carrier,
-         * or user limited - using {@link #setMaxNumberOfClients(int)}).
-         *
-         * If manual user control is enabled then clients will be accepted, rejected, or require
-         * a user approval based on the configuration provided by
-         * {@link #setBlockedClientList(List)} and {@link #setAllowedClientList(List)}.
-         *
-         * <p>
-         * This method requires hardware support. Hardware support can be determined using
-         * {@link WifiManager.SoftApCallback#onCapabilityChanged(SoftApCapability)} and
-         * {@link SoftApCapability#areFeaturesSupported(int)}
-         * with {@link SoftApCapability.SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT}
-         *
-         * <p>
-         * If the method is called on a device without hardware support then starting the soft AP
-         * using {@link WifiManager#startTetheredHotspot(SoftApConfiguration)} will fail with
-         * {@link WifiManager#SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION}.
-         *
-         * <p>
-         * <li>If not set, defaults to false (i.e The authoriztion is not required).</li>
-         *
-         * @param enabled true for enabling the control by user, false otherwise.
-         * @return Builder for chaining.
-         */
-        @NonNull
-        public Builder setClientControlByUserEnabled(boolean enabled) {
-            mClientControlByUser = enabled;
-            return this;
-        }
-
-
-        /**
-         * This method together with {@link setClientControlByUserEnabled(boolean)} control client
-         * connections to the AP. If client control by user is disabled using the above method then
-         * this API has no effect and clients are allowed to associate to the AP (within limit of
-         * max number of clients).
-         *
-         * If client control by user is enabled then this API configures the list of clients
-         * which are explicitly allowed. These are auto-accepted.
-         *
-         * All other clients which attempt to associate, whose MAC addresses are on neither list,
-         * are:
-         * <ul>
-         * <li>Rejected</li>
-         * <li>A callback {@link WifiManager.SoftApCallback#onBlockedClientConnecting(WifiClient)}
-         * is issued (which allows the user to add them to the allowed client list if desired).<li>
-         * </ul>
-         *
-         * @param allowedClientList list of clients which are allowed to associate to the AP
-         *                          without user pre-approval.
-         * @return Builder for chaining.
-         */
-        @NonNull
-        public Builder setAllowedClientList(@NonNull List<MacAddress> allowedClientList) {
-            mAllowedClientList = new ArrayList<>(allowedClientList);
-            return this;
-        }
-
-        /**
-         * This API configures the list of clients which are blocked and cannot associate
-         * to the Soft AP.
-         *
-         * <p>
-         * This method requires hardware support. Hardware support can be determined using
-         * {@link WifiManager.SoftApCallback#onCapabilityChanged(SoftApCapability)} and
-         * {@link SoftApCapability#areFeaturesSupported(int)}
-         * with {@link SoftApCapability.SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT}
-         *
-         * <p>
-         * If the method is called on a device without hardware support then starting the soft AP
-         * using {@link WifiManager#startTetheredHotspot(SoftApConfiguration)} will fail with
-         * {@link WifiManager#SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION}.
-         *
-         * @param blockedClientList list of clients which are not allowed to associate to the AP.
-         * @return Builder for chaining.
-         */
-        @NonNull
-        public Builder setBlockedClientList(@NonNull List<MacAddress> blockedClientList) {
-            mBlockedClientList = new ArrayList<>(blockedClientList);
-            return this;
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/SoftApInfo.java b/wifi/java/android/net/wifi/SoftApInfo.java
deleted file mode 100644
index 24ed8ef..0000000
--- a/wifi/java/android/net/wifi/SoftApInfo.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Objects;
-
-/**
- * A class representing information about SoftAp.
- * {@see WifiManager}
- *
- * @hide
- */
-@SystemApi
-public final class SoftApInfo implements Parcelable {
-
-    /**
-     * AP Channel bandwidth is invalid.
-     *
-     * @see #getBandwidth()
-     */
-    public static final int CHANNEL_WIDTH_INVALID = 0;
-
-    /**
-     * AP Channel bandwidth is 20 MHZ but no HT.
-     *
-     * @see #getBandwidth()
-     */
-    public static final int CHANNEL_WIDTH_20MHZ_NOHT = 1;
-
-    /**
-     * AP Channel bandwidth is 20 MHZ.
-     *
-     * @see #getBandwidth()
-     */
-    public static final int CHANNEL_WIDTH_20MHZ = 2;
-
-    /**
-     * AP Channel bandwidth is 40 MHZ.
-     *
-     * @see #getBandwidth()
-     */
-    public static final int CHANNEL_WIDTH_40MHZ = 3;
-
-    /**
-     * AP Channel bandwidth is 80 MHZ.
-     *
-     * @see #getBandwidth()
-     */
-    public static final int CHANNEL_WIDTH_80MHZ = 4;
-
-    /**
-     * AP Channel bandwidth is 160 MHZ, but 80MHZ + 80MHZ.
-     *
-     * @see #getBandwidth()
-     */
-    public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 5;
-
-    /**
-     * AP Channel bandwidth is 160 MHZ.
-     *
-     * @see #getBandwidth()
-     */
-    public static final int CHANNEL_WIDTH_160MHZ = 6;
-
-
-
-    /** The frequency which AP resides on.  */
-    private int mFrequency = 0;
-
-    @WifiAnnotations.Bandwidth
-    private int mBandwidth = CHANNEL_WIDTH_INVALID;
-
-    /**
-     * Get the frequency which AP resides on.
-     */
-    public int getFrequency() {
-        return mFrequency;
-    }
-
-    /**
-     * Set the frequency which AP resides on.
-     * @hide
-     */
-    public void setFrequency(int freq) {
-        mFrequency = freq;
-    }
-
-    /**
-     * Get AP Channel bandwidth.
-     *
-     * @return One of {@link #CHANNEL_WIDTH_20MHZ}, {@link #CHANNEL_WIDTH_40MHZ},
-     * {@link #CHANNEL_WIDTH_80MHZ}, {@link #CHANNEL_WIDTH_160MHZ},
-     * {@link #CHANNEL_WIDTH_80MHZ_PLUS_MHZ} or {@link #CHANNEL_WIDTH_INVALID}.
-     */
-    @WifiAnnotations.Bandwidth
-    public int getBandwidth() {
-        return mBandwidth;
-    }
-
-    /**
-     * Set AP Channel bandwidth.
-     * @hide
-     */
-    public void setBandwidth(@WifiAnnotations.Bandwidth int bandwidth) {
-        mBandwidth = bandwidth;
-    }
-
-    /**
-     * @hide
-     */
-    public SoftApInfo(@Nullable SoftApInfo source) {
-        if (source != null) {
-            mFrequency = source.mFrequency;
-            mBandwidth = source.mBandwidth;
-        }
-    }
-
-    /**
-     * @hide
-     */
-    public SoftApInfo() {
-    }
-
-    @Override
-    /** Implement the Parcelable interface. */
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    /** Implement the Parcelable interface */
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeInt(mFrequency);
-        dest.writeInt(mBandwidth);
-    }
-
-    @NonNull
-    /** Implement the Parcelable interface */
-    public static final Creator<SoftApInfo> CREATOR = new Creator<SoftApInfo>() {
-        public SoftApInfo createFromParcel(Parcel in) {
-            SoftApInfo info = new SoftApInfo();
-            info.mFrequency = in.readInt();
-            info.mBandwidth = in.readInt();
-            return info;
-        }
-
-        public SoftApInfo[] newArray(int size) {
-            return new SoftApInfo[size];
-        }
-    };
-
-    @NonNull
-    @Override
-    public String toString() {
-        return "SoftApInfo{"
-                + "bandwidth= " + mBandwidth
-                + ",frequency= " + mFrequency
-                + '}';
-    }
-
-    @Override
-    public boolean equals(@NonNull Object o) {
-        if (this == o) return true;
-        if (!(o instanceof SoftApInfo)) return false;
-        SoftApInfo softApInfo = (SoftApInfo) o;
-        return mFrequency == softApInfo.mFrequency
-                && mBandwidth == softApInfo.mBandwidth;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mFrequency, mBandwidth);
-    }
-}
diff --git a/wifi/java/android/net/wifi/SupplicantState.java b/wifi/java/android/net/wifi/SupplicantState.java
deleted file mode 100644
index de7e2b5..0000000
--- a/wifi/java/android/net/wifi/SupplicantState.java
+++ /dev/null
@@ -1,265 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * From <code>defs.h</code> in <code>wpa_supplicant</code>.
- * <p/>
- * These enumeration values are used to indicate the current wpa_supplicant
- * state. This is more fine-grained than most users will be interested in.
- * In general, it is better to use
- * {@link android.net.NetworkInfo.State NetworkInfo.State}.
- * <p/>
- * Note, the order of these enum constants must match the numerical values of the
- * state constants in <code>defs.h</code> in <code>wpa_supplicant</code>.
- */
-public enum SupplicantState implements Parcelable {
-    /**
-     * This state indicates that client is not associated, but is likely to
-     * start looking for an access point. This state is entered when a
-     * connection is lost.
-     */
-    DISCONNECTED,
-
-    /**
-     * Interface is disabled
-     * <p/>
-     * This state is entered if the network interface is disabled.
-     * wpa_supplicant refuses any new operations that would
-     * use the radio until the interface has been enabled.
-     */
-    INTERFACE_DISABLED,
-
-    /**
-     * Inactive state (wpa_supplicant disabled).
-     * <p/>
-     * This state is entered if there are no enabled networks in the
-     * configuration. wpa_supplicant is not trying to associate with a new
-     * network and external interaction (e.g., ctrl_iface call to add or
-     * enable a network) is needed to start association.
-     */
-    INACTIVE,
-
-    /**
-     * Scanning for a network.
-     * <p/>
-     * This state is entered when wpa_supplicant starts scanning for a
-     * network.
-     */
-    SCANNING,
-
-    /**
-     * Trying to authenticate with a BSS/SSID
-     * <p/>
-     * This state is entered when wpa_supplicant has found a suitable BSS
-     * to authenticate with and the driver is configured to try to
-     * authenticate with this BSS.
-     */
-    AUTHENTICATING,
-
-    /**
-     * Trying to associate with a BSS/SSID.
-     * <p/>
-     * This state is entered when wpa_supplicant has found a suitable BSS
-     * to associate with and the driver is configured to try to associate
-     * with this BSS in ap_scan=1 mode. When using ap_scan=2 mode, this
-     * state is entered when the driver is configured to try to associate
-     * with a network using the configured SSID and security policy.
-     */
-    ASSOCIATING,
-
-    /**
-     * Association completed.
-     * <p/>
-     * This state is entered when the driver reports that association has
-     * been successfully completed with an AP. If IEEE 802.1X is used
-     * (with or without WPA/WPA2), wpa_supplicant remains in this state
-     * until the IEEE 802.1X/EAPOL authentication has been completed.
-     */
-    ASSOCIATED,
-
-    /**
-     * WPA 4-Way Key Handshake in progress.
-     * <p/>
-     * This state is entered when WPA/WPA2 4-Way Handshake is started. In
-     * case of WPA-PSK, this happens when receiving the first EAPOL-Key
-     * frame after association. In case of WPA-EAP, this state is entered
-     * when the IEEE 802.1X/EAPOL authentication has been completed.
-     */
-    FOUR_WAY_HANDSHAKE,
-
-    /**
-     * WPA Group Key Handshake in progress.
-     * <p/>
-     * This state is entered when 4-Way Key Handshake has been completed
-     * (i.e., when the supplicant sends out message 4/4) and when Group
-     * Key rekeying is started by the AP (i.e., when supplicant receives
-     * message 1/2).
-     */
-    GROUP_HANDSHAKE,
-
-    /**
-     * All authentication completed.
-     * <p/>
-     * This state is entered when the full authentication process is
-     * completed. In case of WPA2, this happens when the 4-Way Handshake is
-     * successfully completed. With WPA, this state is entered after the
-     * Group Key Handshake; with IEEE 802.1X (non-WPA) connection is
-     * completed after dynamic keys are received (or if not used, after
-     * the EAP authentication has been completed). With static WEP keys and
-     * plaintext connections, this state is entered when an association
-     * has been completed.
-     * <p/>
-     * This state indicates that the supplicant has completed its
-     * processing for the association phase and that data connection is
-     * fully configured. Note, however, that there may not be any IP
-     * address associated with the connection yet. Typically, a DHCP
-     * request needs to be sent at this point to obtain an address.
-     */
-    COMPLETED,
-
-    /**
-     * An Android-added state that is reported when a client issues an
-     * explicit DISCONNECT command. In such a case, the supplicant is
-     * not only dissociated from the current access point (as for the
-     * DISCONNECTED state above), but it also does not attempt to connect
-     * to any access point until a RECONNECT or REASSOCIATE command
-     * is issued by the client.
-     */
-    DORMANT,
-
-    /**
-     * No connection to wpa_supplicant.
-     * <p/>
-     * This is an additional pseudo-state to handle the case where
-     * wpa_supplicant is not running and/or we have not been able
-     * to establish a connection to it.
-     */
-    UNINITIALIZED,
-
-    /**
-     * A pseudo-state that should normally never be seen.
-     */
-    INVALID;
-
-    /**
-     * Returns {@code true} if the supplicant state is valid and {@code false}
-     * otherwise.
-     * @param state The supplicant state
-     * @return {@code true} if the supplicant state is valid and {@code false}
-     * otherwise.
-     */
-    public static boolean isValidState(SupplicantState state) {
-        return state != UNINITIALIZED && state != INVALID;
-    }
-
-
-    /** Supplicant associating or authenticating is considered a handshake state {@hide} */
-    public static boolean isHandshakeState(SupplicantState state) {
-        switch(state) {
-            case AUTHENTICATING:
-            case ASSOCIATING:
-            case ASSOCIATED:
-            case FOUR_WAY_HANDSHAKE:
-            case GROUP_HANDSHAKE:
-                return true;
-            case COMPLETED:
-            case DISCONNECTED:
-            case INTERFACE_DISABLED:
-            case INACTIVE:
-            case SCANNING:
-            case DORMANT:
-            case UNINITIALIZED:
-            case INVALID:
-                return false;
-            default:
-                throw new IllegalArgumentException("Unknown supplicant state");
-        }
-    }
-
-    /** @hide */
-    public static boolean isConnecting(SupplicantState state) {
-        switch(state) {
-            case AUTHENTICATING:
-            case ASSOCIATING:
-            case ASSOCIATED:
-            case FOUR_WAY_HANDSHAKE:
-            case GROUP_HANDSHAKE:
-            case COMPLETED:
-                return true;
-            case DISCONNECTED:
-            case INTERFACE_DISABLED:
-            case INACTIVE:
-            case SCANNING:
-            case DORMANT:
-            case UNINITIALIZED:
-            case INVALID:
-                return false;
-            default:
-                throw new IllegalArgumentException("Unknown supplicant state");
-        }
-    }
-
-    /** @hide */
-    public static boolean isDriverActive(SupplicantState state) {
-        switch(state) {
-            case DISCONNECTED:
-            case DORMANT:
-            case INACTIVE:
-            case AUTHENTICATING:
-            case ASSOCIATING:
-            case ASSOCIATED:
-            case SCANNING:
-            case FOUR_WAY_HANDSHAKE:
-            case GROUP_HANDSHAKE:
-            case COMPLETED:
-                return true;
-            case INTERFACE_DISABLED:
-            case UNINITIALIZED:
-            case INVALID:
-                return false;
-            default:
-                throw new IllegalArgumentException("Unknown supplicant state");
-        }
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(name());
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public static final @android.annotation.NonNull Creator<SupplicantState> CREATOR =
-        new Creator<SupplicantState>() {
-            public SupplicantState createFromParcel(Parcel in) {
-                return SupplicantState.valueOf(in.readString());
-            }
-
-            public SupplicantState[] newArray(int size) {
-                return new SupplicantState[size];
-            }
-        };
-
-}
diff --git a/wifi/java/android/net/wifi/SynchronousExecutor.java b/wifi/java/android/net/wifi/SynchronousExecutor.java
deleted file mode 100644
index 9926b1b..0000000
--- a/wifi/java/android/net/wifi/SynchronousExecutor.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.net.wifi;
-
-import java.util.concurrent.Executor;
-
-/**
- * An executor implementation that runs synchronously on the current thread.
- * @hide
- */
-public class SynchronousExecutor implements Executor {
-    @Override
-    public void execute(Runnable r) {
-        r.run();
-    }
-}
diff --git a/wifi/java/android/net/wifi/WifiAnnotations.java b/wifi/java/android/net/wifi/WifiAnnotations.java
deleted file mode 100644
index acda7e0..0000000
--- a/wifi/java/android/net/wifi/WifiAnnotations.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.IntDef;
-import android.annotation.StringDef;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Wifi annotations meant to be statically linked into client modules, since they cannot be
- * exposed as @SystemApi.
- *
- * e.g. {@link IntDef}, {@link StringDef}
- *
- * @hide
- */
-public final class WifiAnnotations {
-    private WifiAnnotations() {}
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"SCAN_TYPE_"}, value = {
-            WifiScanner.SCAN_TYPE_LOW_LATENCY,
-            WifiScanner.SCAN_TYPE_LOW_POWER,
-            WifiScanner.SCAN_TYPE_HIGH_ACCURACY})
-    public @interface ScanType {}
-
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"WIFI_BAND_"}, value = {
-            WifiScanner.WIFI_BAND_UNSPECIFIED,
-            WifiScanner.WIFI_BAND_24_GHZ,
-            WifiScanner.WIFI_BAND_5_GHZ,
-            WifiScanner.WIFI_BAND_5_GHZ_DFS_ONLY,
-            WifiScanner.WIFI_BAND_6_GHZ})
-    public @interface WifiBandBasic {}
-
-    @IntDef(prefix = { "CHANNEL_WIDTH_" }, value = {
-            SoftApInfo.CHANNEL_WIDTH_INVALID,
-            SoftApInfo.CHANNEL_WIDTH_20MHZ_NOHT,
-            SoftApInfo.CHANNEL_WIDTH_20MHZ,
-            SoftApInfo.CHANNEL_WIDTH_40MHZ,
-            SoftApInfo.CHANNEL_WIDTH_80MHZ,
-            SoftApInfo.CHANNEL_WIDTH_80MHZ_PLUS_MHZ,
-            SoftApInfo.CHANNEL_WIDTH_160MHZ,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface Bandwidth {}
-
-    @IntDef(prefix = { "CHANNEL_WIDTH_" }, value = {
-            ScanResult.CHANNEL_WIDTH_20MHZ,
-            ScanResult.CHANNEL_WIDTH_40MHZ,
-            ScanResult.CHANNEL_WIDTH_80MHZ,
-            ScanResult.CHANNEL_WIDTH_160MHZ,
-            ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface ChannelWidth{}
-
-    @IntDef(prefix = { "WIFI_STANDARD_" }, value = {
-            ScanResult.WIFI_STANDARD_UNKNOWN,
-            ScanResult.WIFI_STANDARD_LEGACY,
-            ScanResult.WIFI_STANDARD_11N,
-            ScanResult.WIFI_STANDARD_11AC,
-            ScanResult.WIFI_STANDARD_11AX,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface WifiStandard{}
-
-    @IntDef(prefix = { "PROTOCOL_" }, value = {
-            ScanResult.PROTOCOL_NONE,
-            ScanResult.PROTOCOL_WPA,
-            ScanResult.PROTOCOL_RSN,
-            ScanResult.PROTOCOL_OSEN,
-            ScanResult.PROTOCOL_WAPI
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface Protocol {}
-
-    @IntDef(prefix = { "KEY_MGMT_" }, value = {
-        ScanResult.KEY_MGMT_NONE,
-        ScanResult.KEY_MGMT_PSK,
-        ScanResult.KEY_MGMT_EAP,
-        ScanResult.KEY_MGMT_FT_PSK,
-        ScanResult.KEY_MGMT_FT_EAP,
-        ScanResult.KEY_MGMT_PSK_SHA256,
-        ScanResult.KEY_MGMT_EAP_SHA256,
-        ScanResult.KEY_MGMT_OSEN,
-        ScanResult.KEY_MGMT_SAE,
-        ScanResult.KEY_MGMT_OWE,
-        ScanResult.KEY_MGMT_EAP_SUITE_B_192,
-        ScanResult.KEY_MGMT_FT_SAE,
-        ScanResult.KEY_MGMT_OWE_TRANSITION,
-        ScanResult.KEY_MGMT_WAPI_PSK,
-        ScanResult.KEY_MGMT_WAPI_CERT
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface KeyMgmt {}
-
-    @IntDef(prefix = { "CIPHER_" }, value = {
-        ScanResult.CIPHER_NONE,
-        ScanResult.CIPHER_NO_GROUP_ADDRESSED,
-        ScanResult.CIPHER_TKIP,
-        ScanResult.CIPHER_CCMP,
-        ScanResult.CIPHER_GCMP_256,
-        ScanResult.CIPHER_SMS4
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface Cipher {}
-}
diff --git a/wifi/java/android/net/wifi/WifiClient.java b/wifi/java/android/net/wifi/WifiClient.java
deleted file mode 100644
index 3794566..0000000
--- a/wifi/java/android/net/wifi/WifiClient.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.NonNull;
-import android.annotation.SystemApi;
-import android.net.MacAddress;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Objects;
-
-/** @hide */
-@SystemApi
-public final class WifiClient implements Parcelable {
-
-    private final MacAddress mMacAddress;
-
-    /**
-     * The mac address of this client.
-     */
-    @NonNull
-    public MacAddress getMacAddress() {
-        return mMacAddress;
-    }
-
-    private WifiClient(Parcel in) {
-        mMacAddress = in.readParcelable(null);
-    }
-
-    /** @hide */
-    public WifiClient(@NonNull MacAddress macAddress) {
-        Objects.requireNonNull(macAddress, "mMacAddress must not be null.");
-
-        this.mMacAddress = macAddress;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeParcelable(mMacAddress, flags);
-    }
-
-    @NonNull
-    public static final Creator<WifiClient> CREATOR = new Creator<WifiClient>() {
-        public WifiClient createFromParcel(Parcel in) {
-            return new WifiClient(in);
-        }
-
-        public WifiClient[] newArray(int size) {
-            return new WifiClient[size];
-        }
-    };
-
-    @NonNull
-    @Override
-    public String toString() {
-        return "WifiClient{"
-                + "mMacAddress=" + mMacAddress
-                + '}';
-    }
-
-    @Override
-    public boolean equals(@NonNull Object o) {
-        if (this == o) return true;
-        if (!(o instanceof WifiClient)) return false;
-        WifiClient client = (WifiClient) o;
-        return mMacAddress.equals(client.mMacAddress);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mMacAddress);
-    }
-}
-
-
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
deleted file mode 100644
index 8c32d18..0000000
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ /dev/null
@@ -1,2987 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.content.pm.PackageManager;
-import android.net.IpConfiguration;
-import android.net.IpConfiguration.ProxySettings;
-import android.net.MacAddress;
-import android.net.NetworkSpecifier;
-import android.net.ProxyInfo;
-import android.net.StaticIpConfiguration;
-import android.net.Uri;
-import android.net.util.MacAddressUtils;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.SystemClock;
-import android.os.UserHandle;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Arrays;
-import java.util.BitSet;
-import java.util.Calendar;
-import java.util.HashMap;
-
-/**
- * A class representing a configured Wi-Fi network, including the
- * security configuration.
- *
- * @deprecated Use {@link WifiNetworkSpecifier.Builder} to create {@link NetworkSpecifier} and
- * {@link WifiNetworkSuggestion.Builder} to create {@link WifiNetworkSuggestion}. This will become a
- * system use only object in the future.
- */
-@Deprecated
-public class WifiConfiguration implements Parcelable {
-    private static final String TAG = "WifiConfiguration";
-    /**
-     * Current Version of the Backup Serializer.
-    */
-    private static final int BACKUP_VERSION = 3;
-    /** {@hide} */
-    public static final String ssidVarName = "ssid";
-    /** {@hide} */
-    public static final String bssidVarName = "bssid";
-    /** {@hide} */
-    public static final String pskVarName = "psk";
-    /** {@hide} */
-    @Deprecated
-    @UnsupportedAppUsage
-    public static final String[] wepKeyVarNames = { "wep_key0", "wep_key1", "wep_key2", "wep_key3" };
-    /** {@hide} */
-    @Deprecated
-    public static final String wepTxKeyIdxVarName = "wep_tx_keyidx";
-    /** {@hide} */
-    public static final String priorityVarName = "priority";
-    /** {@hide} */
-    public static final String hiddenSSIDVarName = "scan_ssid";
-    /** {@hide} */
-    public static final String pmfVarName = "ieee80211w";
-    /** {@hide} */
-    public static final String updateIdentiferVarName = "update_identifier";
-    /**
-     * The network ID for an invalid network.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int INVALID_NETWORK_ID = -1;
-    /** {@hide} */
-    public static final int LOCAL_ONLY_NETWORK_ID = -2;
-
-    /** {@hide} */
-    private String mPasspointManagementObjectTree;
-    /** {@hide} */
-    private static final int MAXIMUM_RANDOM_MAC_GENERATION_RETRY = 3;
-
-    /**
-     * Recognized key management schemes.
-     */
-    public static class KeyMgmt {
-        private KeyMgmt() { }
-
-        /** @hide */
-        @Retention(RetentionPolicy.SOURCE)
-        @IntDef(value = {
-                NONE,
-                WPA_PSK,
-                WPA_EAP,
-                IEEE8021X,
-                WPA2_PSK,
-                OSEN,
-                FT_PSK,
-                FT_EAP,
-                SAE,
-                OWE,
-                SUITE_B_192,
-                WPA_PSK_SHA256,
-                WPA_EAP_SHA256,
-                WAPI_PSK,
-                WAPI_CERT,
-                FILS_SHA256,
-                FILS_SHA384})
-        public @interface KeyMgmtScheme {}
-
-        /** WPA is not used; plaintext or static WEP could be used. */
-        public static final int NONE = 0;
-        /** WPA pre-shared key (requires {@code preSharedKey} to be specified). */
-        public static final int WPA_PSK = 1;
-        /** WPA using EAP authentication. Generally used with an external authentication server. */
-        public static final int WPA_EAP = 2;
-        /**
-         * IEEE 802.1X using EAP authentication and (optionally) dynamically
-         * generated WEP keys.
-         */
-        public static final int IEEE8021X = 3;
-
-        /**
-         * WPA2 pre-shared key for use with soft access point
-         * (requires {@code preSharedKey} to be specified).
-         * @hide
-         */
-        @SystemApi
-        public static final int WPA2_PSK = 4;
-        /**
-         * Hotspot 2.0 r2 OSEN:
-         * @hide
-         */
-        public static final int OSEN = 5;
-
-        /**
-         * IEEE 802.11r Fast BSS Transition with PSK authentication.
-         * @hide
-         */
-        public static final int FT_PSK = 6;
-
-        /**
-         * IEEE 802.11r Fast BSS Transition with EAP authentication.
-         * @hide
-         */
-        public static final int FT_EAP = 7;
-
-        /**
-         * Simultaneous Authentication of Equals
-         */
-        public static final int SAE = 8;
-
-        /**
-         * Opportunististic Wireless Encryption
-         */
-        public static final int OWE = 9;
-
-        /**
-         * SUITE_B_192 192 bit level
-         */
-        public static final int SUITE_B_192 = 10;
-
-        /**
-         * WPA pre-shared key with stronger SHA256-based algorithms.
-         * @hide
-         */
-        public static final int WPA_PSK_SHA256 = 11;
-
-        /**
-         * WPA using EAP authentication with stronger SHA256-based algorithms.
-         * @hide
-         */
-        public static final int WPA_EAP_SHA256 = 12;
-
-        /**
-         * WAPI pre-shared key (requires {@code preSharedKey} to be specified).
-         * @hide
-         */
-        @SystemApi
-        public static final int WAPI_PSK = 13;
-
-        /**
-         * WAPI certificate to be specified.
-         * @hide
-         */
-        @SystemApi
-        public static final int WAPI_CERT = 14;
-
-        /**
-        * IEEE 802.11ai FILS SK with SHA256
-         * @hide
-        */
-        public static final int FILS_SHA256 = 15;
-        /**
-         * IEEE 802.11ai FILS SK with SHA384:
-         * @hide
-         */
-        public static final int FILS_SHA384 = 16;
-
-        public static final String varName = "key_mgmt";
-
-        public static final String[] strings = { "NONE", "WPA_PSK", "WPA_EAP",
-                "IEEE8021X", "WPA2_PSK", "OSEN", "FT_PSK", "FT_EAP",
-                "SAE", "OWE", "SUITE_B_192", "WPA_PSK_SHA256", "WPA_EAP_SHA256",
-                "WAPI_PSK", "WAPI_CERT", "FILS_SHA256", "FILS_SHA384" };
-    }
-
-    /**
-     * Recognized security protocols.
-     */
-    public static class Protocol {
-        private Protocol() { }
-
-        /** WPA/IEEE 802.11i/D3.0
-         * @deprecated Due to security and performance limitations, use of WPA-1 networks
-         * is discouraged. WPA-2 (RSN) should be used instead. */
-        @Deprecated
-        public static final int WPA = 0;
-        /** RSN WPA2/WPA3/IEEE 802.11i */
-        public static final int RSN = 1;
-        /** HS2.0 r2 OSEN
-         * @hide
-         */
-        public static final int OSEN = 2;
-
-        /**
-         * WAPI Protocol
-         */
-        public static final int WAPI = 3;
-
-        public static final String varName = "proto";
-
-        public static final String[] strings = { "WPA", "RSN", "OSEN", "WAPI" };
-    }
-
-    /**
-     * Recognized IEEE 802.11 authentication algorithms.
-     */
-    public static class AuthAlgorithm {
-        private AuthAlgorithm() { }
-
-        /** Open System authentication (required for WPA/WPA2) */
-        public static final int OPEN = 0;
-        /** Shared Key authentication (requires static WEP keys)
-         * @deprecated Due to security and performance limitations, use of WEP networks
-         * is discouraged. */
-        @Deprecated
-        public static final int SHARED = 1;
-        /** LEAP/Network EAP (only used with LEAP) */
-        public static final int LEAP = 2;
-
-        /** SAE (Used only for WPA3-Personal) */
-        public static final int SAE = 3;
-
-        public static final String varName = "auth_alg";
-
-        public static final String[] strings = { "OPEN", "SHARED", "LEAP", "SAE" };
-    }
-
-    /**
-     * Recognized pairwise ciphers for WPA.
-     */
-    public static class PairwiseCipher {
-        private PairwiseCipher() { }
-
-        /** Use only Group keys (deprecated) */
-        public static final int NONE = 0;
-        /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
-         * @deprecated Due to security and performance limitations, use of WPA-1 networks
-         * is discouraged. WPA-2 (RSN) should be used instead. */
-        @Deprecated
-        public static final int TKIP = 1;
-        /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */
-        public static final int CCMP = 2;
-        /**
-         * AES in Galois/Counter Mode
-         */
-        public static final int GCMP_256 = 3;
-        /**
-         * SMS4 cipher for WAPI
-         */
-        public static final int SMS4 = 4;
-
-        public static final String varName = "pairwise";
-
-        public static final String[] strings = { "NONE", "TKIP", "CCMP", "GCMP_256", "SMS4" };
-    }
-
-    /**
-     * Recognized group ciphers.
-     * <pre>
-     * CCMP = AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0]
-     * TKIP = Temporal Key Integrity Protocol [IEEE 802.11i/D7.0]
-     * WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key
-     * WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11)
-     * GCMP_256 = AES in Galois/Counter Mode
-     * </pre>
-     */
-    public static class GroupCipher {
-        private GroupCipher() { }
-
-        /** WEP40 = WEP (Wired Equivalent Privacy) with 40-bit key (original 802.11)
-         * @deprecated Due to security and performance limitations, use of WEP networks
-         * is discouraged. */
-        @Deprecated
-        public static final int WEP40 = 0;
-        /** WEP104 = WEP (Wired Equivalent Privacy) with 104-bit key
-         * @deprecated Due to security and performance limitations, use of WEP networks
-         * is discouraged. */
-        @Deprecated
-        public static final int WEP104 = 1;
-        /** Temporal Key Integrity Protocol [IEEE 802.11i/D7.0] */
-        public static final int TKIP = 2;
-        /** AES in Counter mode with CBC-MAC [RFC 3610, IEEE 802.11i/D7.0] */
-        public static final int CCMP = 3;
-        /** Hotspot 2.0 r2 OSEN
-         * @hide
-         */
-        public static final int GTK_NOT_USED = 4;
-        /**
-         * AES in Galois/Counter Mode
-         */
-        public static final int GCMP_256 = 5;
-        /**
-         * SMS4 cipher for WAPI
-         */
-        public static final int SMS4 = 6;
-
-        public static final String varName = "group";
-
-        public static final String[] strings =
-                { /* deprecated */ "WEP40", /* deprecated */ "WEP104",
-                        "TKIP", "CCMP", "GTK_NOT_USED", "GCMP_256",
-                        "SMS4" };
-    }
-
-    /**
-     * Recognized group management ciphers.
-     * <pre>
-     * BIP_CMAC_256 = Cipher-based Message Authentication Code 256 bits
-     * BIP_GMAC_128 = Galois Message Authentication Code 128 bits
-     * BIP_GMAC_256 = Galois Message Authentication Code 256 bits
-     * </pre>
-     */
-    public static class GroupMgmtCipher {
-        private GroupMgmtCipher() { }
-
-        /** CMAC-256 = Cipher-based Message Authentication Code */
-        public static final int BIP_CMAC_256 = 0;
-
-        /** GMAC-128 = Galois Message Authentication Code */
-        public static final int BIP_GMAC_128 = 1;
-
-        /** GMAC-256 = Galois Message Authentication Code */
-        public static final int BIP_GMAC_256 = 2;
-
-        private static final String varName = "groupMgmt";
-
-        private static final String[] strings = { "BIP_CMAC_256",
-                "BIP_GMAC_128", "BIP_GMAC_256"};
-    }
-
-    /**
-     * Recognized suiteB ciphers.
-     * <pre>
-     * ECDHE_ECDSA
-     * ECDHE_RSA
-     * </pre>
-     * @hide
-     */
-    public static class SuiteBCipher {
-        private SuiteBCipher() { }
-
-        /** Diffie-Hellman with Elliptic Curve_ECDSA signature */
-        public static final int ECDHE_ECDSA = 0;
-
-        /** Diffie-Hellman with_RSA signature */
-        public static final int ECDHE_RSA = 1;
-
-        private static final String varName = "SuiteB";
-
-        private static final String[] strings = { "ECDHE_ECDSA", "ECDHE_RSA" };
-    }
-
-    /** Possible status of a network configuration. */
-    public static class Status {
-        private Status() { }
-
-        /** this is the network we are currently connected to */
-        public static final int CURRENT = 0;
-        /** supplicant will not attempt to use this network */
-        public static final int DISABLED = 1;
-        /** supplicant will consider this network available for association */
-        public static final int ENABLED = 2;
-
-        public static final String[] strings = { "current", "disabled", "enabled" };
-    }
-
-    /** Security type for an open network. */
-    public static final int SECURITY_TYPE_OPEN = 0;
-    /** Security type for a WEP network. */
-    public static final int SECURITY_TYPE_WEP = 1;
-    /** Security type for a PSK network. */
-    public static final int SECURITY_TYPE_PSK = 2;
-    /** Security type for an EAP network. */
-    public static final int SECURITY_TYPE_EAP = 3;
-    /** Security type for an SAE network. */
-    public static final int SECURITY_TYPE_SAE = 4;
-    /** Security type for an EAP Suite B network. */
-    public static final int SECURITY_TYPE_EAP_SUITE_B = 5;
-    /** Security type for an OWE network. */
-    public static final int SECURITY_TYPE_OWE = 6;
-    /** Security type for a WAPI PSK network. */
-    public static final int SECURITY_TYPE_WAPI_PSK = 7;
-    /** Security type for a WAPI Certificate network. */
-    public static final int SECURITY_TYPE_WAPI_CERT = 8;
-
-    /**
-     * Security types we support.
-     * @hide
-     */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = { "SECURITY_TYPE_" }, value = {
-            SECURITY_TYPE_OPEN,
-            SECURITY_TYPE_WEP,
-            SECURITY_TYPE_PSK,
-            SECURITY_TYPE_EAP,
-            SECURITY_TYPE_SAE,
-            SECURITY_TYPE_EAP_SUITE_B,
-            SECURITY_TYPE_OWE,
-            SECURITY_TYPE_WAPI_PSK,
-            SECURITY_TYPE_WAPI_CERT
-    })
-    public @interface SecurityType {}
-
-    /**
-     * Set the various security params to correspond to the provided security type.
-     * This is accomplished by setting the various BitSets exposed in WifiConfiguration.
-     *
-     * @param securityType One of the following security types:
-     * {@link #SECURITY_TYPE_OPEN},
-     * {@link #SECURITY_TYPE_WEP},
-     * {@link #SECURITY_TYPE_PSK},
-     * {@link #SECURITY_TYPE_EAP},
-     * {@link #SECURITY_TYPE_SAE},
-     * {@link #SECURITY_TYPE_EAP_SUITE_B},
-     * {@link #SECURITY_TYPE_OWE},
-     * {@link #SECURITY_TYPE_WAPI_PSK}, or
-     * {@link #SECURITY_TYPE_WAPI_CERT}
-     */
-    public void setSecurityParams(@SecurityType int securityType) {
-        // Clear all the bitsets.
-        allowedKeyManagement.clear();
-        allowedProtocols.clear();
-        allowedAuthAlgorithms.clear();
-        allowedPairwiseCiphers.clear();
-        allowedGroupCiphers.clear();
-        allowedGroupManagementCiphers.clear();
-        allowedSuiteBCiphers.clear();
-
-        switch (securityType) {
-            case SECURITY_TYPE_OPEN:
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-                break;
-            case SECURITY_TYPE_WEP:
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-                allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
-                allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
-                break;
-            case SECURITY_TYPE_PSK:
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-                break;
-            case SECURITY_TYPE_EAP:
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
-                break;
-            case SECURITY_TYPE_SAE:
-                allowedProtocols.set(WifiConfiguration.Protocol.RSN);
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SAE);
-                allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
-                allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.GCMP_256);
-                allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
-                allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
-                requirePmf = true;
-                break;
-            case SECURITY_TYPE_EAP_SUITE_B:
-                allowedProtocols.set(WifiConfiguration.Protocol.RSN);
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.SUITE_B_192);
-                allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.GCMP_256);
-                allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
-                allowedGroupManagementCiphers.set(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256);
-                // Note: allowedSuiteBCiphers bitset will be set by the service once the
-                // certificates are attached to this profile
-                requirePmf = true;
-                break;
-            case SECURITY_TYPE_OWE:
-                allowedProtocols.set(WifiConfiguration.Protocol.RSN);
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.OWE);
-                allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
-                allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.GCMP_256);
-                allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
-                allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
-                requirePmf = true;
-                break;
-            case SECURITY_TYPE_WAPI_PSK:
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WAPI_PSK);
-                allowedProtocols.set(WifiConfiguration.Protocol.WAPI);
-                allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.SMS4);
-                allowedGroupCiphers.set(WifiConfiguration.GroupCipher.SMS4);
-                break;
-            case SECURITY_TYPE_WAPI_CERT:
-                allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WAPI_CERT);
-                allowedProtocols.set(WifiConfiguration.Protocol.WAPI);
-                allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.SMS4);
-                allowedGroupCiphers.set(WifiConfiguration.GroupCipher.SMS4);
-                break;
-            default:
-                throw new IllegalArgumentException("unknown security type " + securityType);
-        }
-    }
-
-    /** @hide */
-    public static final int UNKNOWN_UID = -1;
-
-    /**
-     * The ID number that the supplicant uses to identify this
-     * network configuration entry. This must be passed as an argument
-     * to most calls into the supplicant.
-     */
-    public int networkId;
-
-    // Fixme We need remove this field to use only Quality network selection status only
-    /**
-     * The current status of this network configuration entry.
-     * @see Status
-     */
-    public int status;
-
-    /**
-     * The network's SSID. Can either be a UTF-8 string,
-     * which must be enclosed in double quotation marks
-     * (e.g., {@code "MyNetwork"}), or a string of
-     * hex digits, which are not enclosed in quotes
-     * (e.g., {@code 01a243f405}).
-     */
-    public String SSID;
-
-    /**
-     * When set, this network configuration entry should only be used when
-     * associating with the AP having the specified BSSID. The value is
-     * a string in the format of an Ethernet MAC address, e.g.,
-     * <code>XX:XX:XX:XX:XX:XX</code> where each <code>X</code> is a hex digit.
-     */
-    public String BSSID;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"AP_BAND_"}, value = {
-            AP_BAND_2GHZ,
-            AP_BAND_5GHZ,
-            AP_BAND_ANY})
-    public @interface ApBand {}
-
-    /**
-     * 2GHz band.
-     * @hide
-     */
-    public static final int AP_BAND_2GHZ = 0;
-
-    /**
-     * 5GHz band.
-     * @hide
-     */
-    public static final int AP_BAND_5GHZ = 1;
-
-    /**
-     * Device is allowed to choose the optimal band (2Ghz or 5Ghz) based on device capability,
-     * operating country code and current radio conditions.
-     * @hide
-     */
-    public static final int AP_BAND_ANY = -1;
-
-    /**
-     * The band which the AP resides on.
-     * One of {@link #AP_BAND_2GHZ}, {@link #AP_BAND_5GHZ}, or {@link #AP_BAND_ANY}.
-     * By default, {@link #AP_BAND_2GHZ} is chosen.
-     *
-     * @hide
-     */
-    @UnsupportedAppUsage
-    @ApBand
-    public int apBand = AP_BAND_2GHZ;
-
-    /**
-     * The channel which AP resides on,currently, US only
-     * 2G  1-11
-     * 5G  36,40,44,48,149,153,157,161,165
-     * 0 - find a random available channel according to the apBand
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public int apChannel = 0;
-
-    /**
-     * Pre-shared key for use with WPA-PSK. Either an ASCII string enclosed in
-     * double quotation marks (e.g., {@code "abcdefghij"} for PSK passphrase or
-     * a string of 64 hex digits for raw PSK.
-     * <p/>
-     * When the value of this key is read, the actual key is
-     * not returned, just a "*" if the key has a value, or the null
-     * string otherwise.
-     */
-    public String preSharedKey;
-
-    /**
-     * Four WEP keys. For each of the four values, provide either an ASCII
-     * string enclosed in double quotation marks (e.g., {@code "abcdef"}),
-     * a string of hex digits (e.g., {@code 0102030405}), or an empty string
-     * (e.g., {@code ""}).
-     * <p/>
-     * When the value of one of these keys is read, the actual key is
-     * not returned, just a "*" if the key has a value, or the null
-     * string otherwise.
-     * @deprecated Due to security and performance limitations, use of WEP networks
-     * is discouraged.
-     */
-    @Deprecated
-    public String[] wepKeys;
-
-    /** Default WEP key index, ranging from 0 to 3.
-     * @deprecated Due to security and performance limitations, use of WEP networks
-     * is discouraged. */
-    @Deprecated
-    public int wepTxKeyIndex;
-
-    /**
-     * Priority determines the preference given to a network by {@code wpa_supplicant}
-     * when choosing an access point with which to associate.
-     * @deprecated This field does not exist anymore.
-     */
-    @Deprecated
-    public int priority;
-
-    /**
-     * This is a network that does not broadcast its SSID, so an
-     * SSID-specific probe request must be used for scans.
-     */
-    public boolean hiddenSSID;
-
-    /**
-     * True if the network requires Protected Management Frames (PMF), false otherwise.
-     * @hide
-     */
-    @SystemApi
-    public boolean requirePmf;
-
-    /**
-     * Update identifier, for Passpoint network.
-     * @hide
-     */
-    public String updateIdentifier;
-
-    /**
-     * The set of key management protocols supported by this configuration.
-     * See {@link KeyMgmt} for descriptions of the values.
-     * Defaults to WPA-PSK WPA-EAP.
-     */
-    @NonNull
-    public BitSet allowedKeyManagement;
-    /**
-     * The set of security protocols supported by this configuration.
-     * See {@link Protocol} for descriptions of the values.
-     * Defaults to WPA RSN.
-     */
-    @NonNull
-    public BitSet allowedProtocols;
-    /**
-     * The set of authentication protocols supported by this configuration.
-     * See {@link AuthAlgorithm} for descriptions of the values.
-     * Defaults to automatic selection.
-     */
-    @NonNull
-    public BitSet allowedAuthAlgorithms;
-    /**
-     * The set of pairwise ciphers for WPA supported by this configuration.
-     * See {@link PairwiseCipher} for descriptions of the values.
-     * Defaults to CCMP TKIP.
-     */
-    @NonNull
-    public BitSet allowedPairwiseCiphers;
-    /**
-     * The set of group ciphers supported by this configuration.
-     * See {@link GroupCipher} for descriptions of the values.
-     * Defaults to CCMP TKIP WEP104 WEP40.
-     */
-    @NonNull
-    public BitSet allowedGroupCiphers;
-    /**
-     * The set of group management ciphers supported by this configuration.
-     * See {@link GroupMgmtCipher} for descriptions of the values.
-     */
-    @NonNull
-    public BitSet allowedGroupManagementCiphers;
-    /**
-     * The set of SuiteB ciphers supported by this configuration.
-     * To be used for WPA3-Enterprise mode. Set automatically by the framework based on the
-     * certificate type that is used in this configuration.
-     */
-    @NonNull
-    public BitSet allowedSuiteBCiphers;
-    /**
-     * The enterprise configuration details specifying the EAP method,
-     * certificates and other settings associated with the EAP.
-     */
-    public WifiEnterpriseConfig enterpriseConfig;
-
-    /**
-     * Fully qualified domain name of a Passpoint configuration
-     */
-    public String FQDN;
-
-    /**
-     * Name of Passpoint credential provider
-     */
-    public String providerFriendlyName;
-
-    /**
-     * Flag indicating if this network is provided by a home Passpoint provider or a roaming
-     * Passpoint provider.  This flag will be {@code true} if this network is provided by
-     * a home Passpoint provider and {@code false} if is provided by a roaming Passpoint provider
-     * or is a non-Passpoint network.
-     */
-    public boolean isHomeProviderNetwork;
-
-    /**
-     * Roaming Consortium Id list for Passpoint credential; identifies a set of networks where
-     * Passpoint credential will be considered valid
-     */
-    public long[] roamingConsortiumIds;
-
-    /**
-     * True if this network configuration is visible to and usable by other users on the
-     * same device, false otherwise.
-     *
-     * @hide
-     */
-    @SystemApi
-    public boolean shared;
-
-    /**
-     * @hide
-     */
-    @NonNull
-    @UnsupportedAppUsage
-    private IpConfiguration mIpConfiguration;
-
-    /**
-     * @hide
-     * dhcp server MAC address if known
-     */
-    public String dhcpServer;
-
-    /**
-     * @hide
-     * default Gateway MAC address if known
-     */
-    @UnsupportedAppUsage
-    public String defaultGwMacAddress;
-
-    /**
-     * @hide
-     * last time we connected, this configuration had validated internet access
-     */
-    @UnsupportedAppUsage
-    public boolean validatedInternetAccess;
-
-    /**
-     * @hide
-     * The number of beacon intervals between Delivery Traffic Indication Maps (DTIM)
-     * This value is populated from scan results that contain Beacon Frames, which are infrequent.
-     * The value is not guaranteed to be set or current (Although it SHOULDNT change once set)
-     * Valid values are from 1 - 255. Initialized here as 0, use this to check if set.
-     */
-    public int dtimInterval = 0;
-
-    /**
-     * Flag indicating if this configuration represents a legacy Passpoint configuration
-     * (Release N or older).  This is used for migrating Passpoint configuration from N to O.
-     * This will no longer be needed after O.
-     * @hide
-     */
-    public boolean isLegacyPasspointConfig = false;
-    /**
-     * @hide
-     * Uid of app creating the configuration
-     */
-    @SystemApi
-    public int creatorUid;
-
-    /**
-     * @hide
-     * Uid of last app issuing a connection related command
-     */
-    @UnsupportedAppUsage
-    public int lastConnectUid;
-
-    /**
-     * @hide
-     * Uid of last app modifying the configuration
-     */
-    @SystemApi
-    public int lastUpdateUid;
-
-    /**
-     * @hide
-     * Universal name for app creating the configuration
-     *    see {@link PackageManager#getNameForUid(int)}
-     */
-    @SystemApi
-    public String creatorName;
-
-    /**
-     * @hide
-     * Universal name for app updating the configuration
-     *    see {@link PackageManager#getNameForUid(int)}
-     */
-    @SystemApi
-    public String lastUpdateName;
-
-    /**
-     * The carrier ID identifies the operator who provides this network configuration.
-     *    see {@link TelephonyManager#getSimCarrierId()}
-     * @hide
-     */
-    @SystemApi
-    public int carrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
-
-    /**
-     * @hide
-     * Auto-join is allowed by user for this network.
-     * Default true.
-     */
-    @SystemApi
-    public boolean allowAutojoin = true;
-
-    /** @hide **/
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
-    public static int INVALID_RSSI = -127;
-
-    /**
-     * @hide
-     * Number of reports indicating no Internet Access
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public int numNoInternetAccessReports;
-
-    /**
-     * @hide
-     * The WiFi configuration is considered to have no internet access for purpose of autojoining
-     * if there has been a report of it having no internet access, and, it never have had
-     * internet access in the past.
-     */
-    @SystemApi
-    public boolean hasNoInternetAccess() {
-        return numNoInternetAccessReports > 0 && !validatedInternetAccess;
-    }
-
-    /**
-     * The WiFi configuration is expected not to have Internet access (e.g., a wireless printer, a
-     * Chromecast hotspot, etc.). This will be set if the user explicitly confirms a connection to
-     * this configuration and selects "don't ask again".
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public boolean noInternetAccessExpected;
-
-    /**
-     * The WiFi configuration is expected not to have Internet access (e.g., a wireless printer, a
-     * Chromecast hotspot, etc.). This will be set if the user explicitly confirms a connection to
-     * this configuration and selects "don't ask again".
-     * @hide
-     */
-    @SystemApi
-    public boolean isNoInternetAccessExpected() {
-        return noInternetAccessExpected;
-    }
-
-    /**
-     * This Wifi configuration is expected for OSU(Online Sign Up) of Passpoint Release 2.
-     * @hide
-     */
-    public boolean osu;
-
-    /**
-     * @hide
-     * Last time the system was connected to this configuration.
-     */
-    public long lastConnected;
-
-    /**
-     * @hide
-     * Last time the system was disconnected to this configuration.
-     */
-    public long lastDisconnected;
-
-    /**
-     * Set if the configuration was self added by the framework
-     * This boolean is cleared if we get a connect/save/ update or
-     * any wifiManager command that indicate the user interacted with the configuration
-     * since we will now consider that the configuration belong to him.
-     * @deprecated only kept for @UnsupportedAppUsage
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public boolean selfAdded;
-
-    /**
-     * Peer WifiConfiguration this WifiConfiguration was added for
-     * @hide
-     */
-    public String peerWifiConfiguration;
-
-    /**
-     * @hide
-     * Indicate that a WifiConfiguration is temporary and should not be saved
-     * nor considered by AutoJoin.
-     */
-    public boolean ephemeral;
-
-    /**
-     * @hide
-     * Indicate that a WifiConfiguration is temporary and should not be saved
-     * nor considered by AutoJoin.
-     */
-    @SystemApi
-    public boolean isEphemeral() {
-      return ephemeral;
-    }
-
-    /**
-     * Indicate whether the network is trusted or not. Networks are considered trusted
-     * if the user explicitly allowed this network connection.
-     * This bit can be used by suggestion network, see
-     * {@link WifiNetworkSuggestion.Builder#setUntrusted(boolean)}
-     * @hide
-     */
-    public boolean trusted;
-
-    /**
-     * True if this Wifi configuration is created from a {@link WifiNetworkSuggestion},
-     * false otherwise.
-     *
-     * @hide
-     */
-    @SystemApi
-    public boolean fromWifiNetworkSuggestion;
-
-    /**
-     * True if this Wifi configuration is created from a {@link WifiNetworkSpecifier},
-     * false otherwise.
-     *
-     * @hide
-     */
-    @SystemApi
-    public boolean fromWifiNetworkSpecifier;
-
-    /**
-     * True if the creator of this configuration has expressed that it
-     * should be considered metered, false otherwise.
-     *
-     * @see #isMetered(WifiConfiguration, WifiInfo)
-     *
-     * @hide
-     */
-    @SystemApi
-    public boolean meteredHint;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"METERED_OVERRIDE_"}, value = {
-            METERED_OVERRIDE_NONE,
-            METERED_OVERRIDE_METERED,
-            METERED_OVERRIDE_NOT_METERED})
-    public @interface MeteredOverride {}
-
-    /**
-     * No metered override.
-     * @hide
-     */
-    @SystemApi
-    public static final int METERED_OVERRIDE_NONE = 0;
-    /**
-     * Override network to be metered.
-     * @hide
-     */
-    @SystemApi
-    public static final int METERED_OVERRIDE_METERED = 1;
-    /**
-     * Override network to be unmetered.
-     * @hide
-     */
-    @SystemApi
-    public static final int METERED_OVERRIDE_NOT_METERED = 2;
-
-    /**
-     * Indicates if the end user has expressed an explicit opinion about the
-     * meteredness of this network, such as through the Settings app.
-     * This value is one of {@link #METERED_OVERRIDE_NONE}, {@link #METERED_OVERRIDE_METERED},
-     * or {@link #METERED_OVERRIDE_NOT_METERED}.
-     * <p>
-     * This should always override any values from {@link #meteredHint} or
-     * {@link WifiInfo#getMeteredHint()}.
-     *
-     * By default this field is set to {@link #METERED_OVERRIDE_NONE}.
-     *
-     * @see #isMetered(WifiConfiguration, WifiInfo)
-     * @hide
-     */
-    @SystemApi
-    @MeteredOverride
-    public int meteredOverride = METERED_OVERRIDE_NONE;
-
-    /**
-     * Blend together all the various opinions to decide if the given network
-     * should be considered metered or not.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static boolean isMetered(@Nullable WifiConfiguration config, @Nullable WifiInfo info) {
-        boolean metered = false;
-        if (info != null && info.getMeteredHint()) {
-            metered = true;
-        }
-        if (config != null && config.meteredHint) {
-            metered = true;
-        }
-        if (config != null
-                && config.meteredOverride == WifiConfiguration.METERED_OVERRIDE_METERED) {
-            metered = true;
-        }
-        if (config != null
-                && config.meteredOverride == WifiConfiguration.METERED_OVERRIDE_NOT_METERED) {
-            metered = false;
-        }
-        return metered;
-    }
-
-    /**
-     * @hide
-     * Returns true if this WiFi config is for an open network.
-     */
-    public boolean isOpenNetwork() {
-        final int cardinality = allowedKeyManagement.cardinality();
-        final boolean hasNoKeyMgmt = cardinality == 0
-                || (cardinality == 1 && (allowedKeyManagement.get(KeyMgmt.NONE)
-                || allowedKeyManagement.get(KeyMgmt.OWE)));
-
-        boolean hasNoWepKeys = true;
-        if (wepKeys != null) {
-            for (int i = 0; i < wepKeys.length; i++) {
-                if (wepKeys[i] != null) {
-                    hasNoWepKeys = false;
-                    break;
-                }
-            }
-        }
-
-        return hasNoKeyMgmt && hasNoWepKeys;
-    }
-
-    /**
-     * @hide
-     * Setting this value will force scan results associated with this configuration to
-     * be included in the bucket of networks that are externally scored.
-     * If not set, associated scan results will be treated as legacy saved networks and
-     * will take precedence over networks in the scored category.
-     */
-    @SystemApi
-    public boolean useExternalScores;
-
-    /**
-     * @hide
-     * Number of time the scorer overrode a the priority based choice, when comparing two
-     * WifiConfigurations, note that since comparing WifiConfiguration happens very often
-     * potentially at every scan, this number might become very large, even on an idle
-     * system.
-     */
-    @SystemApi
-    public int numScorerOverride;
-
-    /**
-     * @hide
-     * Number of time the scorer overrode a the priority based choice, and the comparison
-     * triggered a network switch
-     */
-    @SystemApi
-    public int numScorerOverrideAndSwitchedNetwork;
-
-    /**
-     * @hide
-     * Number of time we associated to this configuration.
-     */
-    @SystemApi
-    public int numAssociation;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"RANDOMIZATION_"}, value = {
-            RANDOMIZATION_NONE,
-            RANDOMIZATION_PERSISTENT})
-    public @interface MacRandomizationSetting {}
-
-    /**
-     * Use factory MAC when connecting to this network
-     * @hide
-     */
-    @SystemApi
-    public static final int RANDOMIZATION_NONE = 0;
-    /**
-     * Generate a randomized MAC once and reuse it for all connections to this network
-     * @hide
-     */
-    @SystemApi
-    public static final int RANDOMIZATION_PERSISTENT = 1;
-
-    /**
-     * Level of MAC randomization for this network.
-     * One of {@link #RANDOMIZATION_NONE} or {@link #RANDOMIZATION_PERSISTENT}.
-     * By default this field is set to {@link #RANDOMIZATION_PERSISTENT}.
-     * @hide
-     */
-    @SystemApi
-    @MacRandomizationSetting
-    public int macRandomizationSetting = RANDOMIZATION_PERSISTENT;
-
-    /**
-     * @hide
-     * Randomized MAC address to use with this particular network
-     */
-    @NonNull
-    private MacAddress mRandomizedMacAddress;
-
-    /**
-     * @hide
-     * The wall clock time of when |mRandomizedMacAddress| should be re-randomized in aggressive
-     * randomization mode.
-     */
-    public long randomizedMacExpirationTimeMs = 0;
-
-    /**
-     * @hide
-     * Checks if the given MAC address can be used for Connected Mac Randomization
-     * by verifying that it is non-null, unicast, locally assigned, and not default mac.
-     * @param mac MacAddress to check
-     * @return true if mac is good to use
-     */
-    public static boolean isValidMacAddressForRandomization(MacAddress mac) {
-        return mac != null && !MacAddressUtils.isMulticastAddress(mac) && mac.isLocallyAssigned()
-                && !MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS).equals(mac);
-    }
-
-    /**
-     * Returns MAC address set to be the local randomized MAC address.
-     * Depending on user preference, the device may or may not use the returned MAC address for
-     * connections to this network.
-     * <p>
-     * Information is restricted to Device Owner, Profile Owner, and Carrier apps
-     * (which will only obtain addresses for configurations which they create). Other callers
-     * will receive a default "02:00:00:00:00:00" MAC address.
-     */
-    public @NonNull MacAddress getRandomizedMacAddress() {
-        return mRandomizedMacAddress;
-    }
-
-    /**
-     * @hide
-     * @param mac MacAddress to change into
-     */
-    public void setRandomizedMacAddress(@NonNull MacAddress mac) {
-        if (mac == null) {
-            Log.e(TAG, "setRandomizedMacAddress received null MacAddress.");
-            return;
-        }
-        mRandomizedMacAddress = mac;
-    }
-
-    /** @hide
-     * Boost given to RSSI on a home network for the purpose of calculating the score
-     * This adds stickiness to home networks, as defined by:
-     * - less than 4 known BSSIDs
-     * - PSK only
-     * - TODO: add a test to verify that all BSSIDs are behind same gateway
-     ***/
-    public static final int HOME_NETWORK_RSSI_BOOST = 5;
-
-    /**
-     * This class is used to contain all the information and API used for quality network selection.
-     * @hide
-     */
-    @SystemApi
-    public static class NetworkSelectionStatus {
-        /** @hide */
-        @Retention(RetentionPolicy.SOURCE)
-        @IntDef(prefix = "NETWORK_SELECTION_",
-                value = {
-                NETWORK_SELECTION_ENABLED,
-                NETWORK_SELECTION_TEMPORARY_DISABLED,
-                NETWORK_SELECTION_PERMANENTLY_DISABLED})
-        public @interface NetworkEnabledStatus {}
-        /**
-         * This network will be considered as a potential candidate to connect to during network
-         * selection.
-         */
-        public static final int NETWORK_SELECTION_ENABLED = 0;
-        /**
-         * This network was temporary disabled. May be re-enabled after a time out.
-         */
-        public static final int NETWORK_SELECTION_TEMPORARY_DISABLED = 1;
-        /**
-         * This network was permanently disabled.
-         */
-        public static final int NETWORK_SELECTION_PERMANENTLY_DISABLED = 2;
-        /**
-         * Maximum Network selection status
-         * @hide
-         */
-        public static final int NETWORK_SELECTION_STATUS_MAX = 3;
-
-        /**
-         * Quality network selection status String (for debug purpose). Use Quality network
-         * selection status value as index to extec the corresponding debug string
-         * @hide
-         */
-        public static final String[] QUALITY_NETWORK_SELECTION_STATUS = {
-                "NETWORK_SELECTION_ENABLED",
-                "NETWORK_SELECTION_TEMPORARY_DISABLED",
-                "NETWORK_SELECTION_PERMANENTLY_DISABLED"};
-
-        /** @hide */
-        @Retention(RetentionPolicy.SOURCE)
-        @IntDef(prefix = "DISABLED_", value = {
-                DISABLED_NONE,
-                DISABLED_ASSOCIATION_REJECTION,
-                DISABLED_AUTHENTICATION_FAILURE,
-                DISABLED_DHCP_FAILURE,
-                DISABLED_NO_INTERNET_TEMPORARY,
-                DISABLED_AUTHENTICATION_NO_CREDENTIALS,
-                DISABLED_NO_INTERNET_PERMANENT,
-                DISABLED_BY_WIFI_MANAGER,
-                DISABLED_BY_WRONG_PASSWORD,
-                DISABLED_AUTHENTICATION_NO_SUBSCRIPTION})
-        public @interface NetworkSelectionDisableReason {}
-
-        // Quality Network disabled reasons
-        /** Default value. Means not disabled. */
-        public static final int DISABLED_NONE = 0;
-        /**
-         * The starting index for network selection disabled reasons.
-         * @hide
-         */
-        public static final int NETWORK_SELECTION_DISABLED_STARTING_INDEX = 1;
-        /**
-         * The starting index for network selection temporarily disabled reasons.
-         * @hide
-         */
-        public static final int TEMPORARILY_DISABLED_STARTING_INDEX = 1;
-        /** This network is disabled because of multiple association rejections. */
-        public static final int DISABLED_ASSOCIATION_REJECTION = 1;
-        /** This network is disabled because of multiple authentication failure. */
-        public static final int DISABLED_AUTHENTICATION_FAILURE = 2;
-        /** This network is disabled because of multiple DHCP failure. */
-        public static final int DISABLED_DHCP_FAILURE = 3;
-        /** This network is temporarily disabled because it has no Internet access. */
-        public static final int DISABLED_NO_INTERNET_TEMPORARY = 4;
-        /**
-         * The starting index for network selection permanently disabled reasons.
-         * @hide
-         */
-        public static final int PERMANENTLY_DISABLED_STARTING_INDEX = 5;
-        /** This network is disabled due to absence of user credentials */
-        public static final int DISABLED_AUTHENTICATION_NO_CREDENTIALS = 5;
-        /**
-         * This network is permanently disabled because it has no Internet access and the user does
-         * not want to stay connected.
-         */
-        public static final int DISABLED_NO_INTERNET_PERMANENT = 6;
-        /** This network is disabled due to WifiManager disabling it explicitly. */
-        public static final int DISABLED_BY_WIFI_MANAGER = 7;
-        /** This network is disabled due to wrong password. */
-        public static final int DISABLED_BY_WRONG_PASSWORD = 8;
-        /** This network is disabled because service is not subscribed. */
-        public static final int DISABLED_AUTHENTICATION_NO_SUBSCRIPTION = 9;
-        /**
-         * All other disable reasons should be strictly less than this value.
-         * @hide
-         */
-        public static final int NETWORK_SELECTION_DISABLED_MAX = 10;
-
-        /**
-         * Get an integer that is equal to the maximum integer value of all the
-         * DISABLED_* reasons
-         * e.g. {@link #DISABLED_NONE}, {@link #DISABLED_ASSOCIATION_REJECTION}, etc.
-         *
-         * All DISABLED_* constants will be contiguous in the range
-         * 0, 1, 2, 3, ..., getMaxNetworkSelectionDisableReasons()
-         *
-         * <br />
-         * For example, this can be used to iterate through all the network selection
-         * disable reasons like so:
-         * <pre>{@code
-         * for (int reason = 0; reason <= getMaxNetworkSelectionDisableReasons(); reason++) {
-         *     ...
-         * }
-         * }</pre>
-         */
-        public static int getMaxNetworkSelectionDisableReason() {
-            return NETWORK_SELECTION_DISABLED_MAX - 1;
-        }
-
-        /**
-         * Contains info about disable reasons.
-         * @hide
-         */
-        public static final class DisableReasonInfo {
-            /**
-             * String representation for the disable reason.
-             * Note that these strings are persisted in
-             * {@link
-             * com.android.server.wifi.util.XmlUtil.NetworkSelectionStatusXmlUtil#writeToXml},
-             * so do not change the string values to maintain backwards compatibility.
-             */
-            public final String mReasonStr;
-            /**
-             * Network Selection disable reason threshold, used to debounce network failures before
-             * we disable them.
-             */
-            public final int mDisableThreshold;
-            /**
-             * Network Selection disable timeout for the error. After the timeout milliseconds,
-             * enable the network again.
-             */
-            public final int mDisableTimeoutMillis;
-
-            /**
-             * Constructor
-             * @param reasonStr string representation of the error
-             * @param disableThreshold number of failures before we disable the network
-             * @param disableTimeoutMillis the timeout, in milliseconds, before we re-enable the
-             *                             network after disabling it
-             */
-            public DisableReasonInfo(String reasonStr, int disableThreshold,
-                    int disableTimeoutMillis) {
-                mReasonStr = reasonStr;
-                mDisableThreshold = disableThreshold;
-                mDisableTimeoutMillis = disableTimeoutMillis;
-            }
-        }
-
-        /**
-         * Quality network selection disable reason infos.
-         * @hide
-         */
-        public static final SparseArray<DisableReasonInfo> DISABLE_REASON_INFOS =
-                buildDisableReasonInfos();
-
-        private static SparseArray<DisableReasonInfo> buildDisableReasonInfos() {
-            SparseArray<DisableReasonInfo> reasons = new SparseArray<>();
-
-            reasons.append(DISABLED_NONE,
-                    new DisableReasonInfo(
-                            // Note that these strings are persisted in
-                            // XmlUtil.NetworkSelectionStatusXmlUtil#writeToXml,
-                            // so do not change the string values to maintain backwards
-                            // compatibility.
-                            "NETWORK_SELECTION_ENABLE",
-                            -1,
-                            Integer.MAX_VALUE));
-
-            reasons.append(DISABLED_ASSOCIATION_REJECTION,
-                    new DisableReasonInfo(
-                            // Note that there is a space at the end of this string. Cannot fix
-                            // since this string is persisted.
-                            "NETWORK_SELECTION_DISABLED_ASSOCIATION_REJECTION ",
-                            5,
-                            5 * 60 * 1000));
-
-            reasons.append(DISABLED_AUTHENTICATION_FAILURE,
-                    new DisableReasonInfo(
-                            "NETWORK_SELECTION_DISABLED_AUTHENTICATION_FAILURE",
-                            5,
-                            5 * 60 * 1000));
-
-            reasons.append(DISABLED_DHCP_FAILURE,
-                    new DisableReasonInfo(
-                            "NETWORK_SELECTION_DISABLED_DHCP_FAILURE",
-                            5,
-                            5 * 60 * 1000));
-
-            reasons.append(DISABLED_NO_INTERNET_TEMPORARY,
-                    new DisableReasonInfo(
-                            "NETWORK_SELECTION_DISABLED_NO_INTERNET_TEMPORARY",
-                            1,
-                            10 * 60 * 1000));
-
-            reasons.append(DISABLED_AUTHENTICATION_NO_CREDENTIALS,
-                    new DisableReasonInfo(
-                            "NETWORK_SELECTION_DISABLED_AUTHENTICATION_NO_CREDENTIALS",
-                            1,
-                            Integer.MAX_VALUE));
-
-            reasons.append(DISABLED_NO_INTERNET_PERMANENT,
-                    new DisableReasonInfo(
-                            "NETWORK_SELECTION_DISABLED_NO_INTERNET_PERMANENT",
-                            1,
-                            Integer.MAX_VALUE));
-
-            reasons.append(DISABLED_BY_WIFI_MANAGER,
-                    new DisableReasonInfo(
-                            "NETWORK_SELECTION_DISABLED_BY_WIFI_MANAGER",
-                            1,
-                            Integer.MAX_VALUE));
-
-            reasons.append(DISABLED_BY_WRONG_PASSWORD,
-                    new DisableReasonInfo(
-                            "NETWORK_SELECTION_DISABLED_BY_WRONG_PASSWORD",
-                            1,
-                            Integer.MAX_VALUE));
-
-            reasons.append(DISABLED_AUTHENTICATION_NO_SUBSCRIPTION,
-                    new DisableReasonInfo(
-                            "NETWORK_SELECTION_DISABLED_AUTHENTICATION_NO_SUBSCRIPTION",
-                            1,
-                            Integer.MAX_VALUE));
-
-            return reasons;
-        }
-
-        /**
-         * Get the {@link NetworkSelectionDisableReason} int code by its string value.
-         * @return the NetworkSelectionDisableReason int code corresponding to the reason string,
-         * or -1 if the reason string is unrecognized.
-         * @hide
-         */
-        @NetworkSelectionDisableReason
-        public static int getDisableReasonByString(@NonNull String reasonString) {
-            for (int i = 0; i < DISABLE_REASON_INFOS.size(); i++) {
-                int key = DISABLE_REASON_INFOS.keyAt(i);
-                DisableReasonInfo value = DISABLE_REASON_INFOS.valueAt(i);
-                if (value != null && TextUtils.equals(reasonString, value.mReasonStr)) {
-                    return key;
-                }
-            }
-            Log.e(TAG, "Unrecognized network disable reason: " + reasonString);
-            return -1;
-        }
-
-        /**
-         * Invalid time stamp for network selection disable
-         * @hide
-         */
-        public static final long INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP = -1L;
-
-        /**
-         * This constant indicates the current configuration has connect choice set
-         */
-        private static final int CONNECT_CHOICE_EXISTS = 1;
-
-        /**
-         * This constant indicates the current configuration does not have connect choice set
-         */
-        private static final int CONNECT_CHOICE_NOT_EXISTS = -1;
-
-        // fields for QualityNetwork Selection
-        /**
-         * Network selection status, should be in one of three status: enable, temporaily disabled
-         * or permanently disabled
-         */
-        @NetworkEnabledStatus
-        private int mStatus;
-
-        /**
-         * Reason for disable this network
-         */
-        @NetworkSelectionDisableReason
-        private int mNetworkSelectionDisableReason;
-
-        /**
-         * Last time we temporarily disabled the configuration
-         */
-        private long mTemporarilyDisabledTimestamp = INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP;
-
-        /**
-         * counter for each Network selection disable reason
-         */
-        private int[] mNetworkSeclectionDisableCounter = new int[NETWORK_SELECTION_DISABLED_MAX];
-
-        /**
-         * Connect Choice over this configuration
-         *
-         * When current wifi configuration is visible to the user but user explicitly choose to
-         * connect to another network X, the another networks X's configure key will be stored here.
-         * We will consider user has a preference of X over this network. And in the future,
-         * network selection will always give X a higher preference over this configuration.
-         * configKey is : "SSID"-WEP-WPA_PSK-WPA_EAP
-         */
-        private String mConnectChoice;
-
-        /**
-         * Used to cache the temporary candidate during the network selection procedure. It will be
-         * kept updating once a new scan result has a higher score than current one
-         */
-        private ScanResult mCandidate;
-
-        /**
-         * Used to cache the score of the current temporary candidate during the network
-         * selection procedure.
-         */
-        private int mCandidateScore;
-
-        /**
-         * Indicate whether this network is visible in latest Qualified Network Selection. This
-         * means there is scan result found related to this Configuration and meet the minimum
-         * requirement. The saved network need not join latest Qualified Network Selection. For
-         * example, it is disabled. True means network is visible in latest Qualified Network
-         * Selection and false means network is invisible
-         */
-        private boolean mSeenInLastQualifiedNetworkSelection;
-
-        /**
-         * Boolean indicating if we have ever successfully connected to this network.
-         *
-         * This value will be set to true upon a successful connection.
-         * This value will be set to false if a previous value was not stored in the config or if
-         * the credentials are updated (ex. a password change).
-         */
-        private boolean mHasEverConnected;
-
-        /**
-         * set whether this network is visible in latest Qualified Network Selection
-         * @param seen value set to candidate
-         * @hide
-         */
-        public void setSeenInLastQualifiedNetworkSelection(boolean seen) {
-            mSeenInLastQualifiedNetworkSelection =  seen;
-        }
-
-        /**
-         * get whether this network is visible in latest Qualified Network Selection
-         * @return returns true -- network is visible in latest Qualified Network Selection
-         *         false -- network is invisible in latest Qualified Network Selection
-         * @hide
-         */
-        public boolean getSeenInLastQualifiedNetworkSelection() {
-            return mSeenInLastQualifiedNetworkSelection;
-        }
-        /**
-         * set the temporary candidate of current network selection procedure
-         * @param scanCandidate {@link ScanResult} the candidate set to mCandidate
-         * @hide
-         */
-        public void setCandidate(ScanResult scanCandidate) {
-            mCandidate = scanCandidate;
-        }
-
-        /**
-         * get the temporary candidate of current network selection procedure
-         * @return  returns {@link ScanResult} temporary candidate of current network selection
-         * procedure
-         * @hide
-         */
-        public ScanResult getCandidate() {
-            return mCandidate;
-        }
-
-        /**
-         * set the score of the temporary candidate of current network selection procedure
-         * @param score value set to mCandidateScore
-         * @hide
-         */
-        public void setCandidateScore(int score) {
-            mCandidateScore = score;
-        }
-
-        /**
-         * get the score of the temporary candidate of current network selection procedure
-         * @return returns score of the temporary candidate of current network selection procedure
-         * @hide
-         */
-        public int getCandidateScore() {
-            return mCandidateScore;
-        }
-
-        /**
-         * get user preferred choice over this configuration
-         * @return returns configKey of user preferred choice over this configuration
-         * @hide
-         */
-        public String getConnectChoice() {
-            return mConnectChoice;
-        }
-
-        /**
-         * set user preferred choice over this configuration
-         * @param newConnectChoice, the configKey of user preferred choice over this configuration
-         * @hide
-         */
-        public void setConnectChoice(String newConnectChoice) {
-            mConnectChoice = newConnectChoice;
-        }
-
-        /** Get the current Quality network selection status as a String (for debugging). */
-        @NonNull
-        public String getNetworkStatusString() {
-            return QUALITY_NETWORK_SELECTION_STATUS[mStatus];
-        }
-
-        /** @hide */
-        public void setHasEverConnected(boolean value) {
-            mHasEverConnected = value;
-        }
-
-        /** True if the device has ever connected to this network, false otherwise. */
-        public boolean hasEverConnected() {
-            return mHasEverConnected;
-        }
-
-        /** @hide */
-        public NetworkSelectionStatus() {
-            // previously stored configs will not have this parameter, so we default to false.
-            mHasEverConnected = false;
-        }
-
-        /**
-         * NetworkSelectionStatus exports an immutable public API.
-         * However, test code has a need to construct a NetworkSelectionStatus in a specific state.
-         * (Note that mocking using Mockito does not work if the object needs to be parceled and
-         * unparceled.)
-         * Export a @SystemApi Builder to allow tests to construct a NetworkSelectionStatus object
-         * in the desired state, without sacrificing NetworkSelectionStatus's immutability.
-         */
-        @VisibleForTesting
-        public static final class Builder {
-            private final NetworkSelectionStatus mNetworkSelectionStatus =
-                    new NetworkSelectionStatus();
-
-            /**
-             * Set the current network selection status.
-             * One of:
-             * {@link #NETWORK_SELECTION_ENABLED},
-             * {@link #NETWORK_SELECTION_TEMPORARY_DISABLED},
-             * {@link #NETWORK_SELECTION_PERMANENTLY_DISABLED}
-             * @see NetworkSelectionStatus#getNetworkSelectionStatus()
-             */
-            @NonNull
-            public Builder setNetworkSelectionStatus(@NetworkEnabledStatus int status) {
-                mNetworkSelectionStatus.setNetworkSelectionStatus(status);
-                return this;
-            }
-
-            /**
-             *
-             * Set the current network's disable reason.
-             * One of the {@link #DISABLED_NONE} or DISABLED_* constants.
-             * e.g. {@link #DISABLED_ASSOCIATION_REJECTION}.
-             * @see NetworkSelectionStatus#getNetworkSelectionDisableReason()
-             */
-            @NonNull
-            public Builder setNetworkSelectionDisableReason(
-                    @NetworkSelectionDisableReason int reason) {
-                mNetworkSelectionStatus.setNetworkSelectionDisableReason(reason);
-                return this;
-            }
-
-            /**
-             * Build a NetworkSelectionStatus object.
-             */
-            @NonNull
-            public NetworkSelectionStatus build() {
-                NetworkSelectionStatus status = new NetworkSelectionStatus();
-                status.copy(mNetworkSelectionStatus);
-                return status;
-            }
-        }
-
-        /**
-         * Get the network disable reason string for a reason code (for debugging).
-         * @param reason specific error reason. One of the {@link #DISABLED_NONE} or
-         *               DISABLED_* constants e.g. {@link #DISABLED_ASSOCIATION_REJECTION}.
-         * @return network disable reason string, or null if the reason is invalid.
-         */
-        @Nullable
-        public static String getNetworkSelectionDisableReasonString(
-                @NetworkSelectionDisableReason int reason) {
-            DisableReasonInfo info = DISABLE_REASON_INFOS.get(reason);
-            if (info == null) {
-                return null;
-            } else {
-                return info.mReasonStr;
-            }
-        }
-        /**
-         * get current network disable reason
-         * @return current network disable reason in String (for debug purpose)
-         * @hide
-         */
-        public String getNetworkSelectionDisableReasonString() {
-            return getNetworkSelectionDisableReasonString(mNetworkSelectionDisableReason);
-        }
-
-        /**
-         * Get the current network network selection status.
-         * One of:
-         * {@link #NETWORK_SELECTION_ENABLED},
-         * {@link #NETWORK_SELECTION_TEMPORARY_DISABLED},
-         * {@link #NETWORK_SELECTION_PERMANENTLY_DISABLED}
-         */
-        @NetworkEnabledStatus
-        public int getNetworkSelectionStatus() {
-            return mStatus;
-        }
-
-        /**
-         * True if the current network is enabled to join network selection, false otherwise.
-         * @hide
-         */
-        public boolean isNetworkEnabled() {
-            return mStatus == NETWORK_SELECTION_ENABLED;
-        }
-
-        /**
-         * @return whether current network is temporary disabled
-         * @hide
-         */
-        public boolean isNetworkTemporaryDisabled() {
-            return mStatus == NETWORK_SELECTION_TEMPORARY_DISABLED;
-        }
-
-        /**
-         * True if the current network is permanently disabled, false otherwise.
-         * @hide
-         */
-        public boolean isNetworkPermanentlyDisabled() {
-            return mStatus == NETWORK_SELECTION_PERMANENTLY_DISABLED;
-        }
-
-        /**
-         * set current network selection status
-         * @param status network selection status to set
-         * @hide
-         */
-        public void setNetworkSelectionStatus(int status) {
-            if (status >= 0 && status < NETWORK_SELECTION_STATUS_MAX) {
-                mStatus = status;
-            }
-        }
-
-        /**
-         * Returns the current network's disable reason.
-         * One of the {@link #DISABLED_NONE} or DISABLED_* constants
-         * e.g. {@link #DISABLED_ASSOCIATION_REJECTION}.
-         */
-        @NetworkSelectionDisableReason
-        public int getNetworkSelectionDisableReason() {
-            return mNetworkSelectionDisableReason;
-        }
-
-        /**
-         * set Network disable reason
-         * @param reason Network disable reason
-         * @hide
-         */
-        public void setNetworkSelectionDisableReason(@NetworkSelectionDisableReason int reason) {
-            if (reason >= 0 && reason < NETWORK_SELECTION_DISABLED_MAX) {
-                mNetworkSelectionDisableReason = reason;
-            } else {
-                throw new IllegalArgumentException("Illegal reason value: " + reason);
-            }
-        }
-
-        /**
-         * @param timeStamp Set when current network is disabled in millisecond since January 1,
-         * 1970 00:00:00.0 UTC
-         * @hide
-         */
-        public void setDisableTime(long timeStamp) {
-            mTemporarilyDisabledTimestamp = timeStamp;
-        }
-
-        /**
-         * Returns when the current network was disabled, in milliseconds since January 1,
-         * 1970 00:00:00.0 UTC.
-         */
-        public long getDisableTime() {
-            return mTemporarilyDisabledTimestamp;
-        }
-
-        /**
-         * Get the disable counter of a specific reason.
-         * @param reason specific failure reason. One of the {@link #DISABLED_NONE} or
-         *              DISABLED_* constants e.g. {@link #DISABLED_ASSOCIATION_REJECTION}.
-         * @exception IllegalArgumentException for invalid reason
-         * @return counter number for specific error reason.
-         */
-        public int getDisableReasonCounter(@NetworkSelectionDisableReason int reason) {
-            if (reason >= DISABLED_NONE && reason < NETWORK_SELECTION_DISABLED_MAX) {
-                return mNetworkSeclectionDisableCounter[reason];
-            } else {
-                throw new IllegalArgumentException("Illegal reason value: " + reason);
-            }
-        }
-
-        /**
-         * set the counter of a specific failure reason
-         * @param reason reason for disable error
-         * @param value the counter value for this specific reason
-         * @exception throw IllegalArgumentException for illegal input
-         * @hide
-         */
-        public void setDisableReasonCounter(int reason, int value) {
-            if (reason >= DISABLED_NONE && reason < NETWORK_SELECTION_DISABLED_MAX) {
-                mNetworkSeclectionDisableCounter[reason] = value;
-            } else {
-                throw new IllegalArgumentException("Illegal reason value: " + reason);
-            }
-        }
-
-        /**
-         * increment the counter of a specific failure reason
-         * @param reason a specific failure reason
-         * @exception throw IllegalArgumentException for illegal input
-         * @hide
-         */
-        public void incrementDisableReasonCounter(int reason) {
-            if (reason >= DISABLED_NONE && reason < NETWORK_SELECTION_DISABLED_MAX) {
-                mNetworkSeclectionDisableCounter[reason]++;
-            } else {
-                throw new IllegalArgumentException("Illegal reason value: " + reason);
-            }
-        }
-
-        /**
-         * clear the counter of a specific failure reason
-         * @param reason a specific failure reason
-         * @exception throw IllegalArgumentException for illegal input
-         * @hide
-         */
-        public void clearDisableReasonCounter(int reason) {
-            if (reason >= DISABLED_NONE && reason < NETWORK_SELECTION_DISABLED_MAX) {
-                mNetworkSeclectionDisableCounter[reason] = DISABLED_NONE;
-            } else {
-                throw new IllegalArgumentException("Illegal reason value: " + reason);
-            }
-        }
-
-        /**
-         * clear all the failure reason counters
-         * @hide
-         */
-        public void clearDisableReasonCounter() {
-            Arrays.fill(mNetworkSeclectionDisableCounter, DISABLED_NONE);
-        }
-
-        /**
-         * BSSID for connection to this network (through network selection procedure)
-         */
-        private String mNetworkSelectionBSSID;
-
-        /**
-         * get current network Selection BSSID
-         * @return current network Selection BSSID
-         * @hide
-         */
-        public String getNetworkSelectionBSSID() {
-            return mNetworkSelectionBSSID;
-        }
-
-        /**
-         * set network Selection BSSID
-         * @param bssid The target BSSID for assocaition
-         * @hide
-         */
-        public void setNetworkSelectionBSSID(String bssid) {
-            mNetworkSelectionBSSID = bssid;
-        }
-
-        /** @hide */
-        public void copy(NetworkSelectionStatus source) {
-            mStatus = source.mStatus;
-            mNetworkSelectionDisableReason = source.mNetworkSelectionDisableReason;
-            for (int index = DISABLED_NONE; index < NETWORK_SELECTION_DISABLED_MAX;
-                    index++) {
-                mNetworkSeclectionDisableCounter[index] =
-                        source.mNetworkSeclectionDisableCounter[index];
-            }
-            mTemporarilyDisabledTimestamp = source.mTemporarilyDisabledTimestamp;
-            mNetworkSelectionBSSID = source.mNetworkSelectionBSSID;
-            setSeenInLastQualifiedNetworkSelection(source.getSeenInLastQualifiedNetworkSelection());
-            setCandidate(source.getCandidate());
-            setCandidateScore(source.getCandidateScore());
-            setConnectChoice(source.getConnectChoice());
-            setHasEverConnected(source.hasEverConnected());
-        }
-
-        /** @hide */
-        public void writeToParcel(Parcel dest) {
-            dest.writeInt(getNetworkSelectionStatus());
-            dest.writeInt(getNetworkSelectionDisableReason());
-            for (int index = DISABLED_NONE; index < NETWORK_SELECTION_DISABLED_MAX;
-                    index++) {
-                dest.writeInt(getDisableReasonCounter(index));
-            }
-            dest.writeLong(getDisableTime());
-            dest.writeString(getNetworkSelectionBSSID());
-            if (getConnectChoice() != null) {
-                dest.writeInt(CONNECT_CHOICE_EXISTS);
-                dest.writeString(getConnectChoice());
-            } else {
-                dest.writeInt(CONNECT_CHOICE_NOT_EXISTS);
-            }
-            dest.writeInt(hasEverConnected() ? 1 : 0);
-        }
-
-        /** @hide */
-        public void readFromParcel(Parcel in) {
-            setNetworkSelectionStatus(in.readInt());
-            setNetworkSelectionDisableReason(in.readInt());
-            for (int index = DISABLED_NONE; index < NETWORK_SELECTION_DISABLED_MAX;
-                    index++) {
-                setDisableReasonCounter(index, in.readInt());
-            }
-            setDisableTime(in.readLong());
-            setNetworkSelectionBSSID(in.readString());
-            if (in.readInt() == CONNECT_CHOICE_EXISTS) {
-                setConnectChoice(in.readString());
-            } else {
-                setConnectChoice(null);
-            }
-            setHasEverConnected(in.readInt() != 0);
-        }
-    }
-
-    /**
-     * @hide
-     * network selection related member
-     */
-    private NetworkSelectionStatus mNetworkSelectionStatus = new NetworkSelectionStatus();
-
-    /**
-     * This class is intended to store extra failure reason information for the most recent
-     * connection attempt, so that it may be surfaced to the settings UI
-     * @hide
-     */
-    // TODO(b/148626966): called by SUW via reflection, remove once SUW is updated
-    public static class RecentFailure {
-
-        private RecentFailure() {}
-
-        /**
-         * Association Rejection Status code (NONE for success/non-association-rejection-fail)
-         */
-        @RecentFailureReason
-        private int mAssociationStatus = RECENT_FAILURE_NONE;
-
-        /**
-         * @param status the association status code for the recent failure
-         */
-        public void setAssociationStatus(@RecentFailureReason int status) {
-            mAssociationStatus = status;
-        }
-        /**
-         * Sets the RecentFailure to NONE
-         */
-        public void clear() {
-            mAssociationStatus = RECENT_FAILURE_NONE;
-        }
-        /**
-         * Get the recent failure code. One of {@link #RECENT_FAILURE_NONE} or
-         * {@link #RECENT_FAILURE_AP_UNABLE_TO_HANDLE_NEW_STA}.
-         */
-        @RecentFailureReason
-        public int getAssociationStatus() {
-            return mAssociationStatus;
-        }
-    }
-
-    /**
-     * RecentFailure member
-     * @hide
-     */
-    // TODO(b/148626966): called by SUW via reflection, once SUW is updated, make private and
-    //  rename to mRecentFailure
-    @NonNull
-    public final RecentFailure recentFailure = new RecentFailure();
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = "RECENT_FAILURE_", value = {
-            RECENT_FAILURE_NONE,
-            RECENT_FAILURE_AP_UNABLE_TO_HANDLE_NEW_STA})
-    public @interface RecentFailureReason {}
-
-    /**
-     * No recent failure, or no specific reason given for the recent connection failure
-     * @hide
-     */
-    @SystemApi
-    public static final int RECENT_FAILURE_NONE = 0;
-    /**
-     * Connection to this network recently failed due to Association Rejection Status 17
-     * (AP is full)
-     * @hide
-     */
-    @SystemApi
-    public static final int RECENT_FAILURE_AP_UNABLE_TO_HANDLE_NEW_STA = 17;
-
-    /**
-     * Get the failure reason for the most recent connection attempt, or
-     * {@link #RECENT_FAILURE_NONE} if there was no failure.
-     *
-     * Failure reasons include:
-     * {@link #RECENT_FAILURE_AP_UNABLE_TO_HANDLE_NEW_STA}
-     *
-     * @hide
-     */
-    @RecentFailureReason
-    @SystemApi
-    public int getRecentFailureReason() {
-        return recentFailure.getAssociationStatus();
-    }
-
-    /**
-     * Get the network selection status.
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    public NetworkSelectionStatus getNetworkSelectionStatus() {
-        return mNetworkSelectionStatus;
-    }
-
-    /**
-     * Set the network selection status.
-     * @hide
-     */
-    @SystemApi
-    public void setNetworkSelectionStatus(@NonNull NetworkSelectionStatus status) {
-        mNetworkSelectionStatus = status;
-    }
-
-    /**
-     * @hide
-     * Linked Configurations: represent the set of Wificonfigurations that are equivalent
-     * regarding roaming and auto-joining.
-     * The linked configuration may or may not have same SSID, and may or may not have same
-     * credentials.
-     * For instance, linked configurations will have same defaultGwMacAddress or same dhcp server.
-     */
-    public HashMap<String, Integer>  linkedConfigurations;
-
-    public WifiConfiguration() {
-        networkId = INVALID_NETWORK_ID;
-        SSID = null;
-        BSSID = null;
-        FQDN = null;
-        roamingConsortiumIds = new long[0];
-        priority = 0;
-        hiddenSSID = false;
-        allowedKeyManagement = new BitSet();
-        allowedProtocols = new BitSet();
-        allowedAuthAlgorithms = new BitSet();
-        allowedPairwiseCiphers = new BitSet();
-        allowedGroupCiphers = new BitSet();
-        allowedGroupManagementCiphers = new BitSet();
-        allowedSuiteBCiphers = new BitSet();
-        wepKeys = new String[4];
-        for (int i = 0; i < wepKeys.length; i++) {
-            wepKeys[i] = null;
-        }
-        enterpriseConfig = new WifiEnterpriseConfig();
-        ephemeral = false;
-        osu = false;
-        trusted = true; // Networks are considered trusted by default.
-        fromWifiNetworkSuggestion = false;
-        fromWifiNetworkSpecifier = false;
-        meteredHint = false;
-        meteredOverride = METERED_OVERRIDE_NONE;
-        useExternalScores = false;
-        validatedInternetAccess = false;
-        mIpConfiguration = new IpConfiguration();
-        lastUpdateUid = -1;
-        creatorUid = -1;
-        shared = true;
-        dtimInterval = 0;
-        mRandomizedMacAddress = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
-    }
-
-    /**
-     * Identify if this configuration represents a Passpoint network
-     */
-    public boolean isPasspoint() {
-        return !TextUtils.isEmpty(FQDN)
-                && !TextUtils.isEmpty(providerFriendlyName)
-                && enterpriseConfig != null
-                && enterpriseConfig.getEapMethod() != WifiEnterpriseConfig.Eap.NONE
-                && !TextUtils.isEmpty(mPasspointUniqueId);
-    }
-
-    /**
-     * Helper function, identify if a configuration is linked
-     * @hide
-     */
-    public boolean isLinked(WifiConfiguration config) {
-        if (config != null) {
-            if (config.linkedConfigurations != null && linkedConfigurations != null) {
-                if (config.linkedConfigurations.get(getKey()) != null
-                        && linkedConfigurations.get(config.getKey()) != null) {
-                    return true;
-                }
-            }
-        }
-        return  false;
-    }
-
-    /**
-     * Helper function, idenfity if a configuration should be treated as an enterprise network
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public boolean isEnterprise() {
-        return (allowedKeyManagement.get(KeyMgmt.WPA_EAP)
-                || allowedKeyManagement.get(KeyMgmt.IEEE8021X)
-                || allowedKeyManagement.get(KeyMgmt.SUITE_B_192)
-                || allowedKeyManagement.get(KeyMgmt.WAPI_CERT))
-                && enterpriseConfig != null
-                && enterpriseConfig.getEapMethod() != WifiEnterpriseConfig.Eap.NONE;
-    }
-
-    private static String logTimeOfDay(long millis) {
-        Calendar c = Calendar.getInstance();
-        if (millis >= 0) {
-            c.setTimeInMillis(millis);
-            return String.format("%tm-%td %tH:%tM:%tS.%tL", c, c, c, c, c, c);
-        } else {
-            return Long.toString(millis);
-        }
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sbuf = new StringBuilder();
-        if (this.status == WifiConfiguration.Status.CURRENT) {
-            sbuf.append("* ");
-        } else if (this.status == WifiConfiguration.Status.DISABLED) {
-            sbuf.append("- DSBLE ");
-        }
-        sbuf.append("ID: ").append(this.networkId).append(" SSID: ").append(this.SSID).
-                append(" PROVIDER-NAME: ").append(this.providerFriendlyName).
-                append(" BSSID: ").append(this.BSSID).append(" FQDN: ").append(this.FQDN)
-                .append(" HOME-PROVIDER-NETWORK: ").append(this.isHomeProviderNetwork)
-                .append(" PRIO: ").append(this.priority)
-                .append(" HIDDEN: ").append(this.hiddenSSID)
-                .append(" PMF: ").append(this.requirePmf)
-                .append("CarrierId: ").append(this.carrierId)
-                .append('\n');
-
-
-        sbuf.append(" NetworkSelectionStatus ")
-                .append(mNetworkSelectionStatus.getNetworkStatusString())
-                .append("\n");
-        if (mNetworkSelectionStatus.getNetworkSelectionDisableReason() > 0) {
-            sbuf.append(" mNetworkSelectionDisableReason ")
-                    .append(mNetworkSelectionStatus.getNetworkSelectionDisableReasonString())
-                    .append("\n");
-
-            for (int index = NetworkSelectionStatus.DISABLED_NONE;
-                    index < NetworkSelectionStatus.NETWORK_SELECTION_DISABLED_MAX; index++) {
-                if (mNetworkSelectionStatus.getDisableReasonCounter(index) != 0) {
-                    sbuf.append(
-                            NetworkSelectionStatus.getNetworkSelectionDisableReasonString(index))
-                            .append(" counter:")
-                            .append(mNetworkSelectionStatus.getDisableReasonCounter(index))
-                            .append("\n");
-                }
-            }
-        }
-        if (mNetworkSelectionStatus.getConnectChoice() != null) {
-            sbuf.append(" connect choice: ").append(mNetworkSelectionStatus.getConnectChoice());
-        }
-        sbuf.append(" hasEverConnected: ")
-                .append(mNetworkSelectionStatus.hasEverConnected()).append("\n");
-
-        if (this.numAssociation > 0) {
-            sbuf.append(" numAssociation ").append(this.numAssociation).append("\n");
-        }
-        if (this.numNoInternetAccessReports > 0) {
-            sbuf.append(" numNoInternetAccessReports ");
-            sbuf.append(this.numNoInternetAccessReports).append("\n");
-        }
-        if (this.validatedInternetAccess) sbuf.append(" validatedInternetAccess");
-        if (this.ephemeral) sbuf.append(" ephemeral");
-        if (this.osu) sbuf.append(" osu");
-        if (this.trusted) sbuf.append(" trusted");
-        if (this.fromWifiNetworkSuggestion) sbuf.append(" fromWifiNetworkSuggestion");
-        if (this.fromWifiNetworkSpecifier) sbuf.append(" fromWifiNetworkSpecifier");
-        if (this.meteredHint) sbuf.append(" meteredHint");
-        if (this.useExternalScores) sbuf.append(" useExternalScores");
-        if (this.validatedInternetAccess || this.ephemeral || this.trusted
-                || this.fromWifiNetworkSuggestion || this.fromWifiNetworkSpecifier
-                || this.meteredHint || this.useExternalScores) {
-            sbuf.append("\n");
-        }
-        if (this.meteredOverride != METERED_OVERRIDE_NONE) {
-            sbuf.append(" meteredOverride ").append(meteredOverride).append("\n");
-        }
-        sbuf.append(" macRandomizationSetting: ").append(macRandomizationSetting).append("\n");
-        sbuf.append(" mRandomizedMacAddress: ").append(mRandomizedMacAddress).append("\n");
-        sbuf.append(" randomizedMacExpirationTimeMs: ")
-                .append(randomizedMacExpirationTimeMs == 0 ? "<none>"
-                        : logTimeOfDay(randomizedMacExpirationTimeMs)).append("\n");
-        sbuf.append(" KeyMgmt:");
-        for (int k = 0; k < this.allowedKeyManagement.size(); k++) {
-            if (this.allowedKeyManagement.get(k)) {
-                sbuf.append(" ");
-                if (k < KeyMgmt.strings.length) {
-                    sbuf.append(KeyMgmt.strings[k]);
-                } else {
-                    sbuf.append("??");
-                }
-            }
-        }
-        sbuf.append(" Protocols:");
-        for (int p = 0; p < this.allowedProtocols.size(); p++) {
-            if (this.allowedProtocols.get(p)) {
-                sbuf.append(" ");
-                if (p < Protocol.strings.length) {
-                    sbuf.append(Protocol.strings[p]);
-                } else {
-                    sbuf.append("??");
-                }
-            }
-        }
-        sbuf.append('\n');
-        sbuf.append(" AuthAlgorithms:");
-        for (int a = 0; a < this.allowedAuthAlgorithms.size(); a++) {
-            if (this.allowedAuthAlgorithms.get(a)) {
-                sbuf.append(" ");
-                if (a < AuthAlgorithm.strings.length) {
-                    sbuf.append(AuthAlgorithm.strings[a]);
-                } else {
-                    sbuf.append("??");
-                }
-            }
-        }
-        sbuf.append('\n');
-        sbuf.append(" PairwiseCiphers:");
-        for (int pc = 0; pc < this.allowedPairwiseCiphers.size(); pc++) {
-            if (this.allowedPairwiseCiphers.get(pc)) {
-                sbuf.append(" ");
-                if (pc < PairwiseCipher.strings.length) {
-                    sbuf.append(PairwiseCipher.strings[pc]);
-                } else {
-                    sbuf.append("??");
-                }
-            }
-        }
-        sbuf.append('\n');
-        sbuf.append(" GroupCiphers:");
-        for (int gc = 0; gc < this.allowedGroupCiphers.size(); gc++) {
-            if (this.allowedGroupCiphers.get(gc)) {
-                sbuf.append(" ");
-                if (gc < GroupCipher.strings.length) {
-                    sbuf.append(GroupCipher.strings[gc]);
-                } else {
-                    sbuf.append("??");
-                }
-            }
-        }
-        sbuf.append('\n');
-        sbuf.append(" GroupMgmtCiphers:");
-        for (int gmc = 0; gmc < this.allowedGroupManagementCiphers.size(); gmc++) {
-            if (this.allowedGroupManagementCiphers.get(gmc)) {
-                sbuf.append(" ");
-                if (gmc < GroupMgmtCipher.strings.length) {
-                    sbuf.append(GroupMgmtCipher.strings[gmc]);
-                } else {
-                    sbuf.append("??");
-                }
-            }
-        }
-        sbuf.append('\n');
-        sbuf.append(" SuiteBCiphers:");
-        for (int sbc = 0; sbc < this.allowedSuiteBCiphers.size(); sbc++) {
-            if (this.allowedSuiteBCiphers.get(sbc)) {
-                sbuf.append(" ");
-                if (sbc < SuiteBCipher.strings.length) {
-                    sbuf.append(SuiteBCipher.strings[sbc]);
-                } else {
-                    sbuf.append("??");
-                }
-            }
-        }
-        sbuf.append('\n').append(" PSK/SAE: ");
-        if (this.preSharedKey != null) {
-            sbuf.append('*');
-        }
-
-        sbuf.append("\nEnterprise config:\n");
-        sbuf.append(enterpriseConfig);
-
-        sbuf.append("IP config:\n");
-        sbuf.append(mIpConfiguration.toString());
-
-        if (mNetworkSelectionStatus.getNetworkSelectionBSSID() != null) {
-            sbuf.append(" networkSelectionBSSID="
-                    + mNetworkSelectionStatus.getNetworkSelectionBSSID());
-        }
-        long now_ms = SystemClock.elapsedRealtime();
-        if (mNetworkSelectionStatus.getDisableTime() != NetworkSelectionStatus
-                .INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP) {
-            sbuf.append('\n');
-            long diff = now_ms - mNetworkSelectionStatus.getDisableTime();
-            if (diff <= 0) {
-                sbuf.append(" blackListed since <incorrect>");
-            } else {
-                sbuf.append(" blackListed: ").append(Long.toString(diff / 1000)).append("sec ");
-            }
-        }
-        if (creatorUid != 0) sbuf.append(" cuid=" + creatorUid);
-        if (creatorName != null) sbuf.append(" cname=" + creatorName);
-        if (lastUpdateUid != 0) sbuf.append(" luid=" + lastUpdateUid);
-        if (lastUpdateName != null) sbuf.append(" lname=" + lastUpdateName);
-        if (updateIdentifier != null) sbuf.append(" updateIdentifier=" + updateIdentifier);
-        sbuf.append(" lcuid=" + lastConnectUid);
-        sbuf.append(" allowAutojoin=" + allowAutojoin);
-        sbuf.append(" noInternetAccessExpected=" + noInternetAccessExpected);
-        sbuf.append(" mostRecentlyConnected=" + isMostRecentlyConnected);
-
-        sbuf.append(" ");
-
-        if (this.lastConnected != 0) {
-            sbuf.append('\n');
-            sbuf.append("lastConnected: ").append(logTimeOfDay(this.lastConnected));
-            sbuf.append(" ");
-        }
-        sbuf.append('\n');
-        if (this.linkedConfigurations != null) {
-            for (String key : this.linkedConfigurations.keySet()) {
-                sbuf.append(" linked: ").append(key);
-                sbuf.append('\n');
-            }
-        }
-        sbuf.append("recentFailure: ").append("Association Rejection code: ")
-                .append(recentFailure.getAssociationStatus()).append("\n");
-        return sbuf.toString();
-    }
-
-    /**
-     * Get the SSID in a human-readable format, with all additional formatting removed
-     * e.g. quotation marks around the SSID, "P" prefix
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    public String getPrintableSsid() {
-        if (SSID == null) return "";
-        final int length = SSID.length();
-        if (length > 2 && (SSID.charAt(0) == '"') && SSID.charAt(length - 1) == '"') {
-            return SSID.substring(1, length - 1);
-        }
-
-        /* The ascii-encoded string format is P"<ascii-encoded-string>"
-         * The decoding is implemented in the supplicant for a newly configured
-         * network.
-         */
-        if (length > 3 && (SSID.charAt(0) == 'P') && (SSID.charAt(1) == '"') &&
-                (SSID.charAt(length-1) == '"')) {
-            WifiSsid wifiSsid = WifiSsid.createFromAsciiEncoded(
-                    SSID.substring(2, length - 1));
-            return wifiSsid.toString();
-        }
-        return SSID;
-    }
-
-    /**
-     * Get an identifier for associating credentials with this config
-     * @param current configuration contains values for additional fields
-     *                that are not part of this configuration. Used
-     *                when a config with some fields is passed by an application.
-     * @throws IllegalStateException if config is invalid for key id generation
-     * @hide
-     */
-    public String getKeyIdForCredentials(WifiConfiguration current) {
-        String keyMgmt = "";
-
-        try {
-            // Get current config details for fields that are not initialized
-            if (TextUtils.isEmpty(SSID)) SSID = current.SSID;
-            if (allowedKeyManagement.cardinality() == 0) {
-                allowedKeyManagement = current.allowedKeyManagement;
-            }
-            if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
-                keyMgmt += KeyMgmt.strings[KeyMgmt.WPA_EAP];
-            }
-            if (allowedKeyManagement.get(KeyMgmt.OSEN)) {
-                keyMgmt += KeyMgmt.strings[KeyMgmt.OSEN];
-            }
-            if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
-                keyMgmt += KeyMgmt.strings[KeyMgmt.IEEE8021X];
-            }
-            if (allowedKeyManagement.get(KeyMgmt.SUITE_B_192)) {
-                keyMgmt += KeyMgmt.strings[KeyMgmt.SUITE_B_192];
-            }
-            if (allowedKeyManagement.get(KeyMgmt.WAPI_CERT)) {
-                keyMgmt += KeyMgmt.strings[KeyMgmt.WAPI_CERT];
-            }
-
-            if (TextUtils.isEmpty(keyMgmt)) {
-                throw new IllegalStateException("Not an EAP network");
-            }
-            String keyId = trimStringForKeyId(SSID) + "_" + keyMgmt + "_"
-                    + trimStringForKeyId(enterpriseConfig.getKeyId(current != null
-                    ? current.enterpriseConfig : null));
-
-            if (!fromWifiNetworkSuggestion) {
-                return keyId;
-            }
-            return keyId + "_" + trimStringForKeyId(BSSID) + "_" + trimStringForKeyId(creatorName);
-        } catch (NullPointerException e) {
-            throw new IllegalStateException("Invalid config details");
-        }
-    }
-
-    private String trimStringForKeyId(String string) {
-        if (string == null) {
-            return "";
-        }
-        // Remove quotes and spaces
-        return string.replace("\"", "").replace(" ", "");
-    }
-
-    private static BitSet readBitSet(Parcel src) {
-        int cardinality = src.readInt();
-
-        BitSet set = new BitSet();
-        for (int i = 0; i < cardinality; i++) {
-            set.set(src.readInt());
-        }
-
-        return set;
-    }
-
-    private static void writeBitSet(Parcel dest, BitSet set) {
-        int nextSetBit = -1;
-
-        dest.writeInt(set.cardinality());
-
-        while ((nextSetBit = set.nextSetBit(nextSetBit + 1)) != -1) {
-            dest.writeInt(nextSetBit);
-        }
-    }
-
-    /**
-     * Get the authentication type of the network.
-     * @return One of the {@link KeyMgmt} constants. e.g. {@link KeyMgmt#WPA2_PSK}.
-     * @hide
-     */
-    @SystemApi
-    @KeyMgmt.KeyMgmtScheme
-    public int getAuthType() {
-        if (allowedKeyManagement.cardinality() > 1) {
-            throw new IllegalStateException("More than one auth type set");
-        }
-        if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
-            return KeyMgmt.WPA_PSK;
-        } else if (allowedKeyManagement.get(KeyMgmt.WPA2_PSK)) {
-            return KeyMgmt.WPA2_PSK;
-        } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)) {
-            return KeyMgmt.WPA_EAP;
-        } else if (allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
-            return KeyMgmt.IEEE8021X;
-        } else if (allowedKeyManagement.get(KeyMgmt.SAE)) {
-            return KeyMgmt.SAE;
-        } else if (allowedKeyManagement.get(KeyMgmt.OWE)) {
-            return KeyMgmt.OWE;
-        } else if (allowedKeyManagement.get(KeyMgmt.SUITE_B_192)) {
-            return KeyMgmt.SUITE_B_192;
-        } else if (allowedKeyManagement.get(KeyMgmt.WAPI_PSK)) {
-            return KeyMgmt.WAPI_PSK;
-        } else if (allowedKeyManagement.get(KeyMgmt.WAPI_CERT)) {
-            return KeyMgmt.WAPI_CERT;
-        }
-        return KeyMgmt.NONE;
-    }
-
-    /**
-     * Return a String that can be used to uniquely identify this WifiConfiguration.
-     * <br />
-     * Note: Do not persist this value! This value is not guaranteed to remain backwards compatible.
-     */
-    @NonNull
-    public String getKey() {
-        // Passpoint ephemeral networks have their unique identifier set. Return it as is to be
-        // able to match internally.
-        if (mPasspointUniqueId != null) {
-            return mPasspointUniqueId;
-        }
-
-        String key = getSsidAndSecurityTypeString();
-        if (!shared) {
-            key += "-" + UserHandle.getUserHandleForUid(creatorUid).getIdentifier();
-        }
-
-        return key;
-    }
-
-    /** @hide
-     *  return the SSID + security type in String format.
-     */
-    public String getSsidAndSecurityTypeString() {
-        String key;
-        if (allowedKeyManagement.get(KeyMgmt.WPA_PSK)) {
-            key = SSID + KeyMgmt.strings[KeyMgmt.WPA_PSK];
-        } else if (allowedKeyManagement.get(KeyMgmt.WPA_EAP)
-                || allowedKeyManagement.get(KeyMgmt.IEEE8021X)) {
-            key = SSID + KeyMgmt.strings[KeyMgmt.WPA_EAP];
-        } else if (wepTxKeyIndex >= 0 && wepTxKeyIndex < wepKeys.length
-                && wepKeys[wepTxKeyIndex] != null) {
-            key = SSID + "WEP";
-        } else if (allowedKeyManagement.get(KeyMgmt.OWE)) {
-            key = SSID + KeyMgmt.strings[KeyMgmt.OWE];
-        } else if (allowedKeyManagement.get(KeyMgmt.SAE)) {
-            key = SSID + KeyMgmt.strings[KeyMgmt.SAE];
-        } else if (allowedKeyManagement.get(KeyMgmt.SUITE_B_192)) {
-            key = SSID + KeyMgmt.strings[KeyMgmt.SUITE_B_192];
-        } else if (allowedKeyManagement.get(KeyMgmt.WAPI_PSK)) {
-            key = SSID + KeyMgmt.strings[KeyMgmt.WAPI_PSK];
-        } else if (allowedKeyManagement.get(KeyMgmt.WAPI_CERT)) {
-            key = SSID + KeyMgmt.strings[KeyMgmt.WAPI_CERT];
-        } else if (allowedKeyManagement.get(KeyMgmt.OSEN)) {
-            key = SSID + KeyMgmt.strings[KeyMgmt.OSEN];
-        } else {
-            key = SSID + KeyMgmt.strings[KeyMgmt.NONE];
-        }
-        return key;
-    }
-
-    /**
-     * Get the IpConfiguration object associated with this WifiConfiguration.
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    public IpConfiguration getIpConfiguration() {
-        return new IpConfiguration(mIpConfiguration);
-    }
-
-    /**
-     * Set the {@link IpConfiguration} for this network.
-     * @param ipConfiguration the {@link IpConfiguration} to set, or null to use the default
-     *                        constructor {@link IpConfiguration#IpConfiguration()}.
-     * @hide
-     */
-    @SystemApi
-    public void setIpConfiguration(@Nullable IpConfiguration ipConfiguration) {
-        if (ipConfiguration == null) ipConfiguration = new IpConfiguration();
-        mIpConfiguration = ipConfiguration;
-    }
-
-    /**
-     * Get the {@link StaticIpConfiguration} for this network.
-     * @return the {@link StaticIpConfiguration}, or null if unset.
-     * @hide
-     */
-    @Nullable
-    @UnsupportedAppUsage
-    public StaticIpConfiguration getStaticIpConfiguration() {
-        return mIpConfiguration.getStaticIpConfiguration();
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setStaticIpConfiguration(StaticIpConfiguration staticIpConfiguration) {
-        mIpConfiguration.setStaticIpConfiguration(staticIpConfiguration);
-    }
-
-    /**
-     * Get the {@link IpConfiguration.IpAssignment} for this network.
-     * @hide
-     */
-    @NonNull
-    @UnsupportedAppUsage
-    public IpConfiguration.IpAssignment getIpAssignment() {
-        return mIpConfiguration.getIpAssignment();
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setIpAssignment(IpConfiguration.IpAssignment ipAssignment) {
-        mIpConfiguration.setIpAssignment(ipAssignment);
-    }
-
-    /**
-     * Get the {@link IpConfiguration.ProxySettings} for this network.
-     * @hide
-     */
-    @NonNull
-    @UnsupportedAppUsage
-    public IpConfiguration.ProxySettings getProxySettings() {
-        return mIpConfiguration.getProxySettings();
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setProxySettings(IpConfiguration.ProxySettings proxySettings) {
-        mIpConfiguration.setProxySettings(proxySettings);
-    }
-
-    /**
-     * Returns the HTTP proxy used by this object.
-     * @return a {@link ProxyInfo httpProxy} representing the proxy specified by this
-     *                  WifiConfiguration, or {@code null} if no proxy is specified.
-     */
-    public ProxyInfo getHttpProxy() {
-        if (mIpConfiguration.getProxySettings() == IpConfiguration.ProxySettings.NONE) {
-            return null;
-        }
-        return new ProxyInfo(mIpConfiguration.getHttpProxy());
-    }
-
-    /**
-     * Set the {@link ProxyInfo} for this WifiConfiguration. This method should only be used by a
-     * device owner or profile owner. When other apps attempt to save a {@link WifiConfiguration}
-     * with modified proxy settings, the methods {@link WifiManager#addNetwork} and
-     * {@link WifiManager#updateNetwork} fail and return {@code -1}.
-     *
-     * @param httpProxy {@link ProxyInfo} representing the httpProxy to be used by this
-     *                  WifiConfiguration. Setting this to {@code null} will explicitly set no
-     *                  proxy, removing any proxy that was previously set.
-     * @exception IllegalArgumentException for invalid httpProxy
-     */
-    public void setHttpProxy(ProxyInfo httpProxy) {
-        if (httpProxy == null) {
-            mIpConfiguration.setProxySettings(IpConfiguration.ProxySettings.NONE);
-            mIpConfiguration.setHttpProxy(null);
-            return;
-        }
-        ProxyInfo httpProxyCopy;
-        ProxySettings proxySettingCopy;
-        if (!Uri.EMPTY.equals(httpProxy.getPacFileUrl())) {
-            proxySettingCopy = IpConfiguration.ProxySettings.PAC;
-            // Construct a new PAC URL Proxy
-            httpProxyCopy = ProxyInfo.buildPacProxy(httpProxy.getPacFileUrl(), httpProxy.getPort());
-        } else {
-            proxySettingCopy = IpConfiguration.ProxySettings.STATIC;
-            // Construct a new HTTP Proxy
-            httpProxyCopy = ProxyInfo.buildDirectProxy(httpProxy.getHost(), httpProxy.getPort(),
-                    Arrays.asList(httpProxy.getExclusionList()));
-        }
-        if (!httpProxyCopy.isValid()) {
-            throw new IllegalArgumentException("Invalid ProxyInfo: " + httpProxyCopy.toString());
-        }
-        mIpConfiguration.setProxySettings(proxySettingCopy);
-        mIpConfiguration.setHttpProxy(httpProxyCopy);
-    }
-
-    /**
-     * Set the {@link ProxySettings} and {@link ProxyInfo} for this network.
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public void setProxy(@NonNull ProxySettings settings, @NonNull ProxyInfo proxy) {
-        mIpConfiguration.setProxySettings(settings);
-        mIpConfiguration.setHttpProxy(proxy);
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** @hide */
-    public void setPasspointManagementObjectTree(String passpointManagementObjectTree) {
-        mPasspointManagementObjectTree = passpointManagementObjectTree;
-    }
-
-    /** @hide */
-    public String getMoTree() {
-        return mPasspointManagementObjectTree;
-    }
-
-    /** Copy constructor */
-    public WifiConfiguration(@NonNull WifiConfiguration source) {
-        if (source != null) {
-            networkId = source.networkId;
-            status = source.status;
-            SSID = source.SSID;
-            BSSID = source.BSSID;
-            FQDN = source.FQDN;
-            roamingConsortiumIds = source.roamingConsortiumIds.clone();
-            providerFriendlyName = source.providerFriendlyName;
-            isHomeProviderNetwork = source.isHomeProviderNetwork;
-            preSharedKey = source.preSharedKey;
-
-            mNetworkSelectionStatus.copy(source.getNetworkSelectionStatus());
-            apBand = source.apBand;
-            apChannel = source.apChannel;
-
-            wepKeys = new String[4];
-            for (int i = 0; i < wepKeys.length; i++) {
-                wepKeys[i] = source.wepKeys[i];
-            }
-
-            wepTxKeyIndex = source.wepTxKeyIndex;
-            priority = source.priority;
-            hiddenSSID = source.hiddenSSID;
-            allowedKeyManagement   = (BitSet) source.allowedKeyManagement.clone();
-            allowedProtocols       = (BitSet) source.allowedProtocols.clone();
-            allowedAuthAlgorithms  = (BitSet) source.allowedAuthAlgorithms.clone();
-            allowedPairwiseCiphers = (BitSet) source.allowedPairwiseCiphers.clone();
-            allowedGroupCiphers    = (BitSet) source.allowedGroupCiphers.clone();
-            allowedGroupManagementCiphers = (BitSet) source.allowedGroupManagementCiphers.clone();
-            allowedSuiteBCiphers    = (BitSet) source.allowedSuiteBCiphers.clone();
-            enterpriseConfig = new WifiEnterpriseConfig(source.enterpriseConfig);
-
-            defaultGwMacAddress = source.defaultGwMacAddress;
-
-            mIpConfiguration = new IpConfiguration(source.mIpConfiguration);
-
-            if ((source.linkedConfigurations != null)
-                    && (source.linkedConfigurations.size() > 0)) {
-                linkedConfigurations = new HashMap<String, Integer>();
-                linkedConfigurations.putAll(source.linkedConfigurations);
-            }
-            validatedInternetAccess = source.validatedInternetAccess;
-            isLegacyPasspointConfig = source.isLegacyPasspointConfig;
-            ephemeral = source.ephemeral;
-            osu = source.osu;
-            trusted = source.trusted;
-            fromWifiNetworkSuggestion = source.fromWifiNetworkSuggestion;
-            fromWifiNetworkSpecifier = source.fromWifiNetworkSpecifier;
-            meteredHint = source.meteredHint;
-            meteredOverride = source.meteredOverride;
-            useExternalScores = source.useExternalScores;
-
-            lastConnectUid = source.lastConnectUid;
-            lastUpdateUid = source.lastUpdateUid;
-            creatorUid = source.creatorUid;
-            creatorName = source.creatorName;
-            lastUpdateName = source.lastUpdateName;
-            peerWifiConfiguration = source.peerWifiConfiguration;
-
-            lastConnected = source.lastConnected;
-            lastDisconnected = source.lastDisconnected;
-            numScorerOverride = source.numScorerOverride;
-            numScorerOverrideAndSwitchedNetwork = source.numScorerOverrideAndSwitchedNetwork;
-            numAssociation = source.numAssociation;
-            allowAutojoin = source.allowAutojoin;
-            numNoInternetAccessReports = source.numNoInternetAccessReports;
-            noInternetAccessExpected = source.noInternetAccessExpected;
-            shared = source.shared;
-            recentFailure.setAssociationStatus(source.recentFailure.getAssociationStatus());
-            mRandomizedMacAddress = source.mRandomizedMacAddress;
-            macRandomizationSetting = source.macRandomizationSetting;
-            randomizedMacExpirationTimeMs = source.randomizedMacExpirationTimeMs;
-            requirePmf = source.requirePmf;
-            updateIdentifier = source.updateIdentifier;
-            carrierId = source.carrierId;
-            mPasspointUniqueId = source.mPasspointUniqueId;
-        }
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(networkId);
-        dest.writeInt(status);
-        mNetworkSelectionStatus.writeToParcel(dest);
-        dest.writeString(SSID);
-        dest.writeString(BSSID);
-        dest.writeInt(apBand);
-        dest.writeInt(apChannel);
-        dest.writeString(FQDN);
-        dest.writeString(providerFriendlyName);
-        dest.writeInt(isHomeProviderNetwork ? 1 : 0);
-        dest.writeInt(roamingConsortiumIds.length);
-        for (long roamingConsortiumId : roamingConsortiumIds) {
-            dest.writeLong(roamingConsortiumId);
-        }
-        dest.writeString(preSharedKey);
-        for (String wepKey : wepKeys) {
-            dest.writeString(wepKey);
-        }
-        dest.writeInt(wepTxKeyIndex);
-        dest.writeInt(priority);
-        dest.writeInt(hiddenSSID ? 1 : 0);
-        dest.writeInt(requirePmf ? 1 : 0);
-        dest.writeString(updateIdentifier);
-
-        writeBitSet(dest, allowedKeyManagement);
-        writeBitSet(dest, allowedProtocols);
-        writeBitSet(dest, allowedAuthAlgorithms);
-        writeBitSet(dest, allowedPairwiseCiphers);
-        writeBitSet(dest, allowedGroupCiphers);
-        writeBitSet(dest, allowedGroupManagementCiphers);
-        writeBitSet(dest, allowedSuiteBCiphers);
-
-        dest.writeParcelable(enterpriseConfig, flags);
-
-        dest.writeParcelable(mIpConfiguration, flags);
-        dest.writeString(dhcpServer);
-        dest.writeString(defaultGwMacAddress);
-        dest.writeInt(validatedInternetAccess ? 1 : 0);
-        dest.writeInt(isLegacyPasspointConfig ? 1 : 0);
-        dest.writeInt(ephemeral ? 1 : 0);
-        dest.writeInt(trusted ? 1 : 0);
-        dest.writeInt(fromWifiNetworkSuggestion ? 1 : 0);
-        dest.writeInt(fromWifiNetworkSpecifier ? 1 : 0);
-        dest.writeInt(meteredHint ? 1 : 0);
-        dest.writeInt(meteredOverride);
-        dest.writeInt(useExternalScores ? 1 : 0);
-        dest.writeInt(creatorUid);
-        dest.writeInt(lastConnectUid);
-        dest.writeInt(lastUpdateUid);
-        dest.writeString(creatorName);
-        dest.writeString(lastUpdateName);
-        dest.writeInt(numScorerOverride);
-        dest.writeInt(numScorerOverrideAndSwitchedNetwork);
-        dest.writeInt(numAssociation);
-        dest.writeBoolean(allowAutojoin);
-        dest.writeInt(numNoInternetAccessReports);
-        dest.writeInt(noInternetAccessExpected ? 1 : 0);
-        dest.writeInt(shared ? 1 : 0);
-        dest.writeString(mPasspointManagementObjectTree);
-        dest.writeInt(recentFailure.getAssociationStatus());
-        dest.writeParcelable(mRandomizedMacAddress, flags);
-        dest.writeInt(macRandomizationSetting);
-        dest.writeInt(osu ? 1 : 0);
-        dest.writeLong(randomizedMacExpirationTimeMs);
-        dest.writeInt(carrierId);
-        dest.writeString(mPasspointUniqueId);
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    @UnsupportedAppUsage
-    public static final @android.annotation.NonNull Creator<WifiConfiguration> CREATOR =
-        new Creator<WifiConfiguration>() {
-            public WifiConfiguration createFromParcel(Parcel in) {
-                WifiConfiguration config = new WifiConfiguration();
-                config.networkId = in.readInt();
-                config.status = in.readInt();
-                config.mNetworkSelectionStatus.readFromParcel(in);
-                config.SSID = in.readString();
-                config.BSSID = in.readString();
-                config.apBand = in.readInt();
-                config.apChannel = in.readInt();
-                config.FQDN = in.readString();
-                config.providerFriendlyName = in.readString();
-                config.isHomeProviderNetwork = in.readInt() != 0;
-                int numRoamingConsortiumIds = in.readInt();
-                config.roamingConsortiumIds = new long[numRoamingConsortiumIds];
-                for (int i = 0; i < numRoamingConsortiumIds; i++) {
-                    config.roamingConsortiumIds[i] = in.readLong();
-                }
-                config.preSharedKey = in.readString();
-                for (int i = 0; i < config.wepKeys.length; i++) {
-                    config.wepKeys[i] = in.readString();
-                }
-                config.wepTxKeyIndex = in.readInt();
-                config.priority = in.readInt();
-                config.hiddenSSID = in.readInt() != 0;
-                config.requirePmf = in.readInt() != 0;
-                config.updateIdentifier = in.readString();
-
-                config.allowedKeyManagement   = readBitSet(in);
-                config.allowedProtocols       = readBitSet(in);
-                config.allowedAuthAlgorithms  = readBitSet(in);
-                config.allowedPairwiseCiphers = readBitSet(in);
-                config.allowedGroupCiphers    = readBitSet(in);
-                config.allowedGroupManagementCiphers = readBitSet(in);
-                config.allowedSuiteBCiphers   = readBitSet(in);
-
-                config.enterpriseConfig = in.readParcelable(null);
-                config.setIpConfiguration(in.readParcelable(null));
-                config.dhcpServer = in.readString();
-                config.defaultGwMacAddress = in.readString();
-                config.validatedInternetAccess = in.readInt() != 0;
-                config.isLegacyPasspointConfig = in.readInt() != 0;
-                config.ephemeral = in.readInt() != 0;
-                config.trusted = in.readInt() != 0;
-                config.fromWifiNetworkSuggestion =  in.readInt() != 0;
-                config.fromWifiNetworkSpecifier =  in.readInt() != 0;
-                config.meteredHint = in.readInt() != 0;
-                config.meteredOverride = in.readInt();
-                config.useExternalScores = in.readInt() != 0;
-                config.creatorUid = in.readInt();
-                config.lastConnectUid = in.readInt();
-                config.lastUpdateUid = in.readInt();
-                config.creatorName = in.readString();
-                config.lastUpdateName = in.readString();
-                config.numScorerOverride = in.readInt();
-                config.numScorerOverrideAndSwitchedNetwork = in.readInt();
-                config.numAssociation = in.readInt();
-                config.allowAutojoin = in.readBoolean();
-                config.numNoInternetAccessReports = in.readInt();
-                config.noInternetAccessExpected = in.readInt() != 0;
-                config.shared = in.readInt() != 0;
-                config.mPasspointManagementObjectTree = in.readString();
-                config.recentFailure.setAssociationStatus(in.readInt());
-                config.mRandomizedMacAddress = in.readParcelable(null);
-                config.macRandomizationSetting = in.readInt();
-                config.osu = in.readInt() != 0;
-                config.randomizedMacExpirationTimeMs = in.readLong();
-                config.carrierId = in.readInt();
-                config.mPasspointUniqueId = in.readString();
-                return config;
-            }
-
-            public WifiConfiguration[] newArray(int size) {
-                return new WifiConfiguration[size];
-            }
-        };
-
-    /**
-     * Passpoint Unique identifier
-     * @hide
-     */
-    private String mPasspointUniqueId = null;
-
-    /**
-     * Set the Passpoint unique identifier
-     * @param uniqueId Passpoint unique identifier to be set
-     * @hide
-     */
-    public void setPasspointUniqueId(String uniqueId) {
-        mPasspointUniqueId = uniqueId;
-    }
-
-    /**
-     * Set the Passpoint unique identifier
-     * @hide
-     */
-    public String getPasspointUniqueId() {
-        return mPasspointUniqueId;
-    }
-
-    /**
-     * If network is one of the most recently connected.
-     * For framework internal use only. Do not parcel.
-     * @hide
-     */
-    public boolean isMostRecentlyConnected = false;
-
-    /**
-     * Whether the key mgmt indicates if the WifiConfiguration needs a preSharedKey or not.
-     * @return true if preSharedKey is needed, false otherwise.
-     * @hide
-     */
-    public boolean needsPreSharedKey() {
-        return allowedKeyManagement.get(KeyMgmt.WPA_PSK)
-                || allowedKeyManagement.get(KeyMgmt.SAE)
-                || allowedKeyManagement.get(KeyMgmt.WAPI_PSK);
-    }
-
-}
diff --git a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java b/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
deleted file mode 100644
index 90edc45..0000000
--- a/wifi/java/android/net/wifi/WifiEnterpriseConfig.java
+++ /dev/null
@@ -1,1494 +0,0 @@
-/*
- * Copyright (C) 2013 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.net.wifi;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.nio.charset.StandardCharsets;
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-import java.security.interfaces.ECPublicKey;
-import java.security.interfaces.RSAPublicKey;
-import java.security.spec.ECParameterSpec;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Enterprise configuration details for Wi-Fi. Stores details about the EAP method
- * and any associated credentials.
- */
-public class WifiEnterpriseConfig implements Parcelable {
-
-    /** Key prefix for WAPI AS certificates. */
-    public static final String WAPI_AS_CERTIFICATE = "WAPIAS_";
-
-    /** Key prefix for WAPI user certificates. */
-    public static final String WAPI_USER_CERTIFICATE = "WAPIUSR_";
-
-    /**
-     * Intent extra: name for WAPI AS certificates
-     */
-    public static final String EXTRA_WAPI_AS_CERTIFICATE_NAME =
-            "android.net.wifi.extra.WAPI_AS_CERTIFICATE_NAME";
-
-    /**
-     * Intent extra: data for WAPI AS certificates
-     */
-    public static final String EXTRA_WAPI_AS_CERTIFICATE_DATA =
-            "android.net.wifi.extra.WAPI_AS_CERTIFICATE_DATA";
-
-    /**
-     * Intent extra: name for WAPI USER certificates
-     */
-    public static final String EXTRA_WAPI_USER_CERTIFICATE_NAME =
-            "android.net.wifi.extra.WAPI_USER_CERTIFICATE_NAME";
-
-    /**
-     * Intent extra: data for WAPI USER certificates
-     */
-    public static final String EXTRA_WAPI_USER_CERTIFICATE_DATA =
-            "android.net.wifi.extra.WAPI_USER_CERTIFICATE_DATA";
-
-    /** @hide */
-    public static final String EMPTY_VALUE         = "NULL";
-    /** @hide */
-    public static final String EAP_KEY             = "eap";
-    /** @hide */
-    public static final String PHASE2_KEY          = "phase2";
-    /** @hide */
-    public static final String IDENTITY_KEY        = "identity";
-    /** @hide */
-    public static final String ANON_IDENTITY_KEY   = "anonymous_identity";
-    /** @hide */
-    public static final String PASSWORD_KEY        = "password";
-    /** @hide */
-    public static final String SUBJECT_MATCH_KEY   = "subject_match";
-    /** @hide */
-    public static final String ALTSUBJECT_MATCH_KEY = "altsubject_match";
-    /** @hide */
-    public static final String DOM_SUFFIX_MATCH_KEY = "domain_suffix_match";
-    /** @hide */
-    public static final String OPP_KEY_CACHING     = "proactive_key_caching";
-    /** @hide */
-    public static final String EAP_ERP             = "eap_erp";
-    /** @hide */
-    public static final String OCSP                = "ocsp";
-
-    /**
-     * String representing the keystore OpenSSL ENGINE's ID.
-     * @hide
-     */
-    public static final String ENGINE_ID_KEYSTORE = "keystore";
-
-    /**
-     * String representing the keystore URI used for wpa_supplicant.
-     * @hide
-     */
-    public static final String KEYSTORE_URI = "keystore://";
-
-    /**
-     * String representing the keystore URI used for wpa_supplicant,
-     * Unlike #KEYSTORE_URI, this supports a list of space-delimited aliases
-     * @hide
-     */
-    public static final String KEYSTORES_URI = "keystores://";
-
-    /**
-     * String to set the engine value to when it should be enabled.
-     * @hide
-     */
-    public static final String ENGINE_ENABLE = "1";
-
-    /**
-     * String to set the engine value to when it should be disabled.
-     * @hide
-     */
-    public static final String ENGINE_DISABLE = "0";
-
-    /**
-     * Key prefix for CA certificates.
-     * Note: copied from {@link android.security.Credentials#CA_CERTIFICATE} since it is @hide.
-     */
-    private static final String CA_CERTIFICATE = "CACERT_";
-    /**
-     * Key prefix for user certificates.
-     * Note: copied from {@link android.security.Credentials#USER_CERTIFICATE} since it is @hide.
-     */
-    private static final String USER_CERTIFICATE = "USRCERT_";
-    /**
-     * Key prefix for user private and secret keys.
-     * Note: copied from {@link android.security.Credentials#USER_PRIVATE_KEY} since it is @hide.
-     */
-    private static final String USER_PRIVATE_KEY = "USRPKEY_";
-
-    /** @hide */
-    public static final String CA_CERT_PREFIX = KEYSTORE_URI + CA_CERTIFICATE;
-    /** @hide */
-    public static final String CLIENT_CERT_PREFIX = KEYSTORE_URI + USER_CERTIFICATE;
-    /** @hide */
-    public static final String CLIENT_CERT_KEY     = "client_cert";
-    /** @hide */
-    public static final String CA_CERT_KEY         = "ca_cert";
-    /** @hide */
-    public static final String CA_PATH_KEY         = "ca_path";
-    /** @hide */
-    public static final String ENGINE_KEY          = "engine";
-    /** @hide */
-    public static final String ENGINE_ID_KEY       = "engine_id";
-    /** @hide */
-    public static final String PRIVATE_KEY_ID_KEY  = "key_id";
-    /** @hide */
-    public static final String REALM_KEY           = "realm";
-    /** @hide */
-    public static final String PLMN_KEY            = "plmn";
-    /** @hide */
-    public static final String CA_CERT_ALIAS_DELIMITER = " ";
-    /** @hide */
-    public static final String WAPI_CERT_SUITE_KEY = "wapi_cert_suite";
-
-    /**
-     * Do not use OCSP stapling (TLS certificate status extension)
-     * @hide
-     */
-    @SystemApi
-    public static final int OCSP_NONE = 0;
-
-    /**
-     * Try to use OCSP stapling, but not require response
-     * @hide
-     */
-    @SystemApi
-    public static final int OCSP_REQUEST_CERT_STATUS = 1;
-
-    /**
-     * Require valid OCSP stapling response
-     * @hide
-     */
-    @SystemApi
-    public static final int OCSP_REQUIRE_CERT_STATUS = 2;
-
-    /**
-     * Require valid OCSP stapling response for all not-trusted certificates in the server
-     * certificate chain
-     * @hide
-     */
-    @SystemApi
-    public static final int OCSP_REQUIRE_ALL_NON_TRUSTED_CERTS_STATUS = 3;
-
-    /** @hide */
-    @IntDef(prefix = {"OCSP_"}, value = {
-            OCSP_NONE,
-            OCSP_REQUEST_CERT_STATUS,
-            OCSP_REQUIRE_CERT_STATUS,
-            OCSP_REQUIRE_ALL_NON_TRUSTED_CERTS_STATUS
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface Ocsp {}
-
-    /**
-     * Whether to use/require OCSP (Online Certificate Status Protocol) to check server certificate.
-     * @hide
-     */
-    private @Ocsp int mOcsp = OCSP_NONE;
-
-    // Fields to copy verbatim from wpa_supplicant.
-    private static final String[] SUPPLICANT_CONFIG_KEYS = new String[] {
-            IDENTITY_KEY,
-            ANON_IDENTITY_KEY,
-            PASSWORD_KEY,
-            CLIENT_CERT_KEY,
-            CA_CERT_KEY,
-            SUBJECT_MATCH_KEY,
-            ENGINE_KEY,
-            ENGINE_ID_KEY,
-            PRIVATE_KEY_ID_KEY,
-            ALTSUBJECT_MATCH_KEY,
-            DOM_SUFFIX_MATCH_KEY,
-            CA_PATH_KEY
-    };
-
-    /**
-     * Fields that have unquoted values in {@link #mFields}.
-     */
-    private static final List<String> UNQUOTED_KEYS = Arrays.asList(ENGINE_KEY, OPP_KEY_CACHING,
-                                                                    EAP_ERP);
-
-    @UnsupportedAppUsage
-    private HashMap<String, String> mFields = new HashMap<String, String>();
-    private X509Certificate[] mCaCerts;
-    private PrivateKey mClientPrivateKey;
-    private X509Certificate[] mClientCertificateChain;
-    private int mEapMethod = Eap.NONE;
-    private int mPhase2Method = Phase2.NONE;
-    private boolean mIsAppInstalledDeviceKeyAndCert = false;
-    private boolean mIsAppInstalledCaCert = false;
-
-    private static final String TAG = "WifiEnterpriseConfig";
-
-    public WifiEnterpriseConfig() {
-        // Do not set defaults so that the enterprise fields that are not changed
-        // by API are not changed underneath
-        // This is essential because an app may not have all fields like password
-        // available. It allows modification of subset of fields.
-
-    }
-
-    /**
-     * Copy over the contents of the source WifiEnterpriseConfig object over to this object.
-     *
-     * @param source Source WifiEnterpriseConfig object.
-     * @param ignoreMaskedPassword Set to true to ignore masked password field, false otherwise.
-     * @param mask if |ignoreMaskedPassword| is set, check if the incoming password field is set
-     *             to this value.
-     */
-    private void copyFrom(WifiEnterpriseConfig source, boolean ignoreMaskedPassword, String mask) {
-        for (String key : source.mFields.keySet()) {
-            if (ignoreMaskedPassword && key.equals(PASSWORD_KEY)
-                    && TextUtils.equals(source.mFields.get(key), mask)) {
-                continue;
-            }
-            mFields.put(key, source.mFields.get(key));
-        }
-        if (source.mCaCerts != null) {
-            mCaCerts = Arrays.copyOf(source.mCaCerts, source.mCaCerts.length);
-        } else {
-            mCaCerts = null;
-        }
-        mClientPrivateKey = source.mClientPrivateKey;
-        if (source.mClientCertificateChain != null) {
-            mClientCertificateChain = Arrays.copyOf(
-                    source.mClientCertificateChain,
-                    source.mClientCertificateChain.length);
-        } else {
-            mClientCertificateChain = null;
-        }
-        mEapMethod = source.mEapMethod;
-        mPhase2Method = source.mPhase2Method;
-        mIsAppInstalledDeviceKeyAndCert = source.mIsAppInstalledDeviceKeyAndCert;
-        mIsAppInstalledCaCert = source.mIsAppInstalledCaCert;
-        mOcsp = source.mOcsp;
-    }
-
-    /**
-     * Copy constructor.
-     * This copies over all the fields verbatim (does not ignore masked password fields).
-     *
-     * @param source Source WifiEnterpriseConfig object.
-     */
-    public WifiEnterpriseConfig(WifiEnterpriseConfig source) {
-        copyFrom(source, false, "");
-    }
-
-    /**
-     * Copy fields from the provided external WifiEnterpriseConfig.
-     * This is needed to handle the WifiEnterpriseConfig objects which were sent by apps with the
-     * password field masked.
-     *
-     * @param externalConfig External WifiEnterpriseConfig object.
-     * @param mask String mask to compare against.
-     * @hide
-     */
-    public void copyFromExternal(WifiEnterpriseConfig externalConfig, String mask) {
-        copyFrom(externalConfig, true, convertToQuotedString(mask));
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mFields.size());
-        for (Map.Entry<String, String> entry : mFields.entrySet()) {
-            dest.writeString(entry.getKey());
-            dest.writeString(entry.getValue());
-        }
-
-        dest.writeInt(mEapMethod);
-        dest.writeInt(mPhase2Method);
-        ParcelUtil.writeCertificates(dest, mCaCerts);
-        ParcelUtil.writePrivateKey(dest, mClientPrivateKey);
-        ParcelUtil.writeCertificates(dest, mClientCertificateChain);
-        dest.writeBoolean(mIsAppInstalledDeviceKeyAndCert);
-        dest.writeBoolean(mIsAppInstalledCaCert);
-        dest.writeInt(mOcsp);
-    }
-
-    public static final @android.annotation.NonNull Creator<WifiEnterpriseConfig> CREATOR =
-            new Creator<WifiEnterpriseConfig>() {
-                @Override
-                public WifiEnterpriseConfig createFromParcel(Parcel in) {
-                    WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-                    int count = in.readInt();
-                    for (int i = 0; i < count; i++) {
-                        String key = in.readString();
-                        String value = in.readString();
-                        enterpriseConfig.mFields.put(key, value);
-                    }
-
-                    enterpriseConfig.mEapMethod = in.readInt();
-                    enterpriseConfig.mPhase2Method = in.readInt();
-                    enterpriseConfig.mCaCerts = ParcelUtil.readCertificates(in);
-                    enterpriseConfig.mClientPrivateKey = ParcelUtil.readPrivateKey(in);
-                    enterpriseConfig.mClientCertificateChain = ParcelUtil.readCertificates(in);
-                    enterpriseConfig.mIsAppInstalledDeviceKeyAndCert = in.readBoolean();
-                    enterpriseConfig.mIsAppInstalledCaCert = in.readBoolean();
-                    enterpriseConfig.mOcsp = in.readInt();
-                    return enterpriseConfig;
-                }
-
-                @Override
-                public WifiEnterpriseConfig[] newArray(int size) {
-                    return new WifiEnterpriseConfig[size];
-                }
-            };
-
-    /** The Extensible Authentication Protocol method used */
-    public static final class Eap {
-        /** No EAP method used. Represents an empty config */
-        public static final int NONE    = -1;
-        /** Protected EAP */
-        public static final int PEAP    = 0;
-        /** EAP-Transport Layer Security */
-        public static final int TLS     = 1;
-        /** EAP-Tunneled Transport Layer Security */
-        public static final int TTLS    = 2;
-        /** EAP-Password */
-        public static final int PWD     = 3;
-        /** EAP-Subscriber Identity Module [RFC-4186] */
-        public static final int SIM     = 4;
-        /** EAP-Authentication and Key Agreement [RFC-4187] */
-        public static final int AKA     = 5;
-        /** EAP-Authentication and Key Agreement Prime [RFC-5448] */
-        public static final int AKA_PRIME = 6;
-        /** Hotspot 2.0 r2 OSEN */
-        public static final int UNAUTH_TLS = 7;
-        /** WAPI Certificate */
-        public static final int WAPI_CERT = 8;
-        /** @hide */
-        public static final String[] strings =
-                { "PEAP", "TLS", "TTLS", "PWD", "SIM", "AKA", "AKA'", "WFA-UNAUTH-TLS",
-                        "WAPI_CERT" };
-
-        /** Prevent initialization */
-        private Eap() {}
-    }
-
-    /** The inner authentication method used */
-    public static final class Phase2 {
-        public static final int NONE        = 0;
-        /** Password Authentication Protocol */
-        public static final int PAP         = 1;
-        /** Microsoft Challenge Handshake Authentication Protocol */
-        public static final int MSCHAP      = 2;
-        /** Microsoft Challenge Handshake Authentication Protocol v2 */
-        public static final int MSCHAPV2    = 3;
-        /** Generic Token Card */
-        public static final int GTC         = 4;
-        /** EAP-Subscriber Identity Module [RFC-4186] */
-        public static final int SIM         = 5;
-        /** EAP-Authentication and Key Agreement [RFC-4187] */
-        public static final int AKA         = 6;
-        /** EAP-Authentication and Key Agreement Prime [RFC-5448] */
-        public static final int AKA_PRIME   = 7;
-        private static final String AUTH_PREFIX = "auth=";
-        private static final String AUTHEAP_PREFIX = "autheap=";
-        /** @hide */
-        public static final String[] strings = {EMPTY_VALUE, "PAP", "MSCHAP",
-                "MSCHAPV2", "GTC", "SIM", "AKA", "AKA'" };
-
-        /** Prevent initialization */
-        private Phase2() {}
-    }
-
-    // Loader and saver interfaces for exchanging data with wpa_supplicant.
-    // TODO: Decouple this object (which is just a placeholder of the configuration)
-    // from the implementation that knows what wpa_supplicant wants.
-    /**
-     * Interface used for retrieving supplicant configuration from WifiEnterpriseConfig
-     * @hide
-     */
-    public interface SupplicantSaver {
-        /**
-         * Set a value within wpa_supplicant configuration
-         * @param key index to set within wpa_supplciant
-         * @param value the value for the key
-         * @return true if successful; false otherwise
-         */
-        boolean saveValue(String key, String value);
-    }
-
-    /**
-     * Interface used for populating a WifiEnterpriseConfig from supplicant configuration
-     * @hide
-     */
-    public interface SupplicantLoader {
-        /**
-         * Returns a value within wpa_supplicant configuration
-         * @param key index to set within wpa_supplciant
-         * @return string value if successful; null otherwise
-         */
-        String loadValue(String key);
-    }
-
-    /**
-     * Internal use only; supply field values to wpa_supplicant config.  The configuration
-     * process aborts on the first failed call on {@code saver}.
-     * @param saver proxy for setting configuration in wpa_supplciant
-     * @return whether the save succeeded on all attempts
-     * @hide
-     */
-    public boolean saveToSupplicant(SupplicantSaver saver) {
-        if (!isEapMethodValid()) {
-            return false;
-        }
-
-        // wpa_supplicant can update the anonymous identity for these kinds of networks after
-        // framework reads them, so make sure the framework doesn't try to overwrite them.
-        boolean shouldNotWriteAnonIdentity = mEapMethod == WifiEnterpriseConfig.Eap.SIM
-                || mEapMethod == WifiEnterpriseConfig.Eap.AKA
-                || mEapMethod == WifiEnterpriseConfig.Eap.AKA_PRIME;
-        for (String key : mFields.keySet()) {
-            if (shouldNotWriteAnonIdentity && ANON_IDENTITY_KEY.equals(key)) {
-                continue;
-            }
-            if (!saver.saveValue(key, mFields.get(key))) {
-                return false;
-            }
-        }
-
-        if (!saver.saveValue(EAP_KEY, Eap.strings[mEapMethod])) {
-            return false;
-        }
-
-        if (mEapMethod != Eap.TLS && mEapMethod != Eap.UNAUTH_TLS && mPhase2Method != Phase2.NONE) {
-            boolean is_autheap = mEapMethod == Eap.TTLS && mPhase2Method == Phase2.GTC;
-            String prefix = is_autheap ? Phase2.AUTHEAP_PREFIX : Phase2.AUTH_PREFIX;
-            String value = convertToQuotedString(prefix + Phase2.strings[mPhase2Method]);
-            return saver.saveValue(PHASE2_KEY, value);
-        } else if (mPhase2Method == Phase2.NONE) {
-            // By default, send a null phase 2 to clear old configuration values.
-            return saver.saveValue(PHASE2_KEY, null);
-        } else {
-            Log.e(TAG, "WiFi enterprise configuration is invalid as it supplies a "
-                    + "phase 2 method but the phase1 method does not support it.");
-            return false;
-        }
-    }
-
-    /**
-     * Internal use only; retrieve configuration from wpa_supplicant config.
-     * @param loader proxy for retrieving configuration keys from wpa_supplicant
-     * @hide
-     */
-    public void loadFromSupplicant(SupplicantLoader loader) {
-        for (String key : SUPPLICANT_CONFIG_KEYS) {
-            String value = loader.loadValue(key);
-            if (value == null) {
-                mFields.put(key, EMPTY_VALUE);
-            } else {
-                mFields.put(key, value);
-            }
-        }
-        String eapMethod  = loader.loadValue(EAP_KEY);
-        mEapMethod = getStringIndex(Eap.strings, eapMethod, Eap.NONE);
-
-        String phase2Method = removeDoubleQuotes(loader.loadValue(PHASE2_KEY));
-        // Remove "auth=" or "autheap=" prefix.
-        if (phase2Method.startsWith(Phase2.AUTH_PREFIX)) {
-            phase2Method = phase2Method.substring(Phase2.AUTH_PREFIX.length());
-        } else if (phase2Method.startsWith(Phase2.AUTHEAP_PREFIX)) {
-            phase2Method = phase2Method.substring(Phase2.AUTHEAP_PREFIX.length());
-        }
-        mPhase2Method = getStringIndex(Phase2.strings, phase2Method, Phase2.NONE);
-    }
-
-    /**
-     * Set the EAP authentication method.
-     * @param  eapMethod is one {@link Eap#PEAP}, {@link Eap#TLS}, {@link Eap#TTLS} or
-     *                   {@link Eap#PWD}
-     * @throws IllegalArgumentException on an invalid eap method
-     */
-    public void setEapMethod(int eapMethod) {
-        switch (eapMethod) {
-            /** Valid methods */
-            case Eap.WAPI_CERT:
-                mEapMethod = eapMethod;
-                setPhase2Method(Phase2.NONE);
-                break;
-            case Eap.TLS:
-            case Eap.UNAUTH_TLS:
-                setPhase2Method(Phase2.NONE);
-                /* fall through */
-            case Eap.PEAP:
-            case Eap.PWD:
-            case Eap.TTLS:
-            case Eap.SIM:
-            case Eap.AKA:
-            case Eap.AKA_PRIME:
-                mEapMethod = eapMethod;
-                setFieldValue(OPP_KEY_CACHING, "1");
-                break;
-            default:
-                throw new IllegalArgumentException("Unknown EAP method");
-        }
-    }
-
-    /**
-     * Get the eap method.
-     * @return eap method configured
-     */
-    public int getEapMethod() {
-        return mEapMethod;
-    }
-
-    /**
-     * Set Phase 2 authentication method. Sets the inner authentication method to be used in
-     * phase 2 after setting up a secure channel
-     * @param phase2Method is the inner authentication method and can be one of {@link Phase2#NONE},
-     *                     {@link Phase2#PAP}, {@link Phase2#MSCHAP}, {@link Phase2#MSCHAPV2},
-     *                     {@link Phase2#GTC}
-     * @throws IllegalArgumentException on an invalid phase2 method
-     *
-     */
-    public void setPhase2Method(int phase2Method) {
-        switch (phase2Method) {
-            case Phase2.NONE:
-            case Phase2.PAP:
-            case Phase2.MSCHAP:
-            case Phase2.MSCHAPV2:
-            case Phase2.GTC:
-            case Phase2.SIM:
-            case Phase2.AKA:
-            case Phase2.AKA_PRIME:
-                mPhase2Method = phase2Method;
-                break;
-            default:
-                throw new IllegalArgumentException("Unknown Phase 2 method");
-        }
-    }
-
-    /**
-     * Get the phase 2 authentication method.
-     * @return a phase 2 method defined at {@link Phase2}
-     * */
-    public int getPhase2Method() {
-        return mPhase2Method;
-    }
-
-    /**
-     * Set the identity
-     * @param identity
-     */
-    public void setIdentity(String identity) {
-        setFieldValue(IDENTITY_KEY, identity, "");
-    }
-
-    /**
-     * Get the identity
-     * @return the identity
-     */
-    public String getIdentity() {
-        return getFieldValue(IDENTITY_KEY);
-    }
-
-    /**
-     * Set anonymous identity. This is used as the unencrypted identity with
-     * certain EAP types
-     * @param anonymousIdentity the anonymous identity
-     */
-    public void setAnonymousIdentity(String anonymousIdentity) {
-        setFieldValue(ANON_IDENTITY_KEY, anonymousIdentity);
-    }
-
-    /**
-     * Get the anonymous identity
-     * @return anonymous identity
-     */
-    public String getAnonymousIdentity() {
-        return getFieldValue(ANON_IDENTITY_KEY);
-    }
-
-    /**
-     * Set the password.
-     * @param password the password
-     */
-    public void setPassword(String password) {
-        setFieldValue(PASSWORD_KEY, password);
-    }
-
-    /**
-     * Get the password.
-     *
-     * Returns locally set password value. For networks fetched from
-     * framework, returns "*".
-     */
-    public String getPassword() {
-        return getFieldValue(PASSWORD_KEY);
-    }
-
-    /**
-     * Encode a CA certificate alias so it does not contain illegal character.
-     * @hide
-     */
-    public static String encodeCaCertificateAlias(String alias) {
-        byte[] bytes = alias.getBytes(StandardCharsets.UTF_8);
-        StringBuilder sb = new StringBuilder(bytes.length * 2);
-        for (byte o : bytes) {
-            sb.append(String.format("%02x", o & 0xFF));
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Decode a previously-encoded CA certificate alias.
-     * @hide
-     */
-    public static String decodeCaCertificateAlias(String alias) {
-        byte[] data = new byte[alias.length() >> 1];
-        for (int n = 0, position = 0; n < alias.length(); n += 2, position++) {
-            data[position] = (byte) Integer.parseInt(alias.substring(n,  n + 2), 16);
-        }
-        try {
-            return new String(data, StandardCharsets.UTF_8);
-        } catch (NumberFormatException e) {
-            e.printStackTrace();
-            return alias;
-        }
-    }
-
-    /**
-     * Set CA certificate alias.
-     *
-     * <p> See the {@link android.security.KeyChain} for details on installing or choosing
-     * a certificate
-     * </p>
-     * @param alias identifies the certificate
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public void setCaCertificateAlias(String alias) {
-        setFieldValue(CA_CERT_KEY, alias, CA_CERT_PREFIX);
-    }
-
-    /**
-     * Set CA certificate aliases. When creating installing the corresponding certificate to
-     * the keystore, please use alias encoded by {@link #encodeCaCertificateAlias(String)}.
-     *
-     * <p> See the {@link android.security.KeyChain} for details on installing or choosing
-     * a certificate.
-     * </p>
-     * @param aliases identifies the certificate. Can be null to indicate the absence of a
-     *                certificate.
-     * @hide
-     */
-    @SystemApi
-    public void setCaCertificateAliases(@Nullable String[] aliases) {
-        if (aliases == null) {
-            setFieldValue(CA_CERT_KEY, null, CA_CERT_PREFIX);
-        } else if (aliases.length == 1) {
-            // Backwards compatibility: use the original cert prefix if setting only one alias.
-            setCaCertificateAlias(aliases[0]);
-        } else {
-            // Use KEYSTORES_URI which supports multiple aliases.
-            StringBuilder sb = new StringBuilder();
-            for (int i = 0; i < aliases.length; i++) {
-                if (i > 0) {
-                    sb.append(CA_CERT_ALIAS_DELIMITER);
-                }
-                sb.append(encodeCaCertificateAlias(CA_CERTIFICATE + aliases[i]));
-            }
-            setFieldValue(CA_CERT_KEY, sb.toString(), KEYSTORES_URI);
-        }
-    }
-
-    /**
-     * Get CA certificate alias
-     * @return alias to the CA certificate
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public String getCaCertificateAlias() {
-        return getFieldValue(CA_CERT_KEY, CA_CERT_PREFIX);
-    }
-
-    /**
-     * Get CA certificate aliases.
-     * @return alias to the CA certificate, or null if unset.
-     * @hide
-     */
-    @Nullable
-    @SystemApi
-    public String[] getCaCertificateAliases() {
-        String value = getFieldValue(CA_CERT_KEY);
-        if (value.startsWith(CA_CERT_PREFIX)) {
-            // Backwards compatibility: parse the original alias prefix.
-            return new String[] {getFieldValue(CA_CERT_KEY, CA_CERT_PREFIX)};
-        } else if (value.startsWith(KEYSTORES_URI)) {
-            String values = value.substring(KEYSTORES_URI.length());
-
-            String[] aliases = TextUtils.split(values, CA_CERT_ALIAS_DELIMITER);
-            for (int i = 0; i < aliases.length; i++) {
-                aliases[i] = decodeCaCertificateAlias(aliases[i]);
-                if (aliases[i].startsWith(CA_CERTIFICATE)) {
-                    aliases[i] = aliases[i].substring(CA_CERTIFICATE.length());
-                }
-            }
-            return aliases.length != 0 ? aliases : null;
-        } else {
-            return TextUtils.isEmpty(value) ? null : new String[] {value};
-        }
-    }
-
-    /**
-     * Specify a X.509 certificate that identifies the server.
-     *
-     * <p>A default name is automatically assigned to the certificate and used
-     * with this configuration. The framework takes care of installing the
-     * certificate when the config is saved and removing the certificate when
-     * the config is removed.
-     *
-     * Note: If no certificate is set for an Enterprise configuration, either by not calling this
-     * API (or the {@link #setCaCertificates(X509Certificate[])}, or by calling it with null, then
-     * the server certificate validation is skipped - which means that the connection is not secure.
-     *
-     * @param cert X.509 CA certificate
-     * @throws IllegalArgumentException if not a CA certificate
-     */
-    public void setCaCertificate(@Nullable X509Certificate cert) {
-        if (cert != null) {
-            if (cert.getBasicConstraints() >= 0) {
-                mIsAppInstalledCaCert = true;
-                mCaCerts = new X509Certificate[] {cert};
-            } else {
-                mCaCerts = null;
-                throw new IllegalArgumentException("Not a CA certificate");
-            }
-        } else {
-            mCaCerts = null;
-        }
-    }
-
-    /**
-     * Get CA certificate. If multiple CA certificates are configured previously,
-     * return the first one.
-     * @return X.509 CA certificate
-     */
-    @Nullable public X509Certificate getCaCertificate() {
-        if (mCaCerts != null && mCaCerts.length > 0) {
-            return mCaCerts[0];
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Specify a list of X.509 certificates that identifies the server. The validation
-     * passes if the CA of server certificate matches one of the given certificates.
-
-     * <p>Default names are automatically assigned to the certificates and used
-     * with this configuration. The framework takes care of installing the
-     * certificates when the config is saved and removing the certificates when
-     * the config is removed.
-     *
-     * Note: If no certificates are set for an Enterprise configuration, either by not calling this
-     * API (or the {@link #setCaCertificate(X509Certificate)}, or by calling it with null, then the
-     * server certificate validation is skipped - which means that the
-     * connection is not secure.
-     *
-     * @param certs X.509 CA certificates
-     * @throws IllegalArgumentException if any of the provided certificates is
-     *     not a CA certificate
-     */
-    public void setCaCertificates(@Nullable X509Certificate[] certs) {
-        if (certs != null) {
-            X509Certificate[] newCerts = new X509Certificate[certs.length];
-            for (int i = 0; i < certs.length; i++) {
-                if (certs[i].getBasicConstraints() >= 0) {
-                    newCerts[i] = certs[i];
-                } else {
-                    mCaCerts = null;
-                    throw new IllegalArgumentException("Not a CA certificate");
-                }
-            }
-            mCaCerts = newCerts;
-            mIsAppInstalledCaCert = true;
-        } else {
-            mCaCerts = null;
-        }
-    }
-
-    /**
-     * Get CA certificates.
-     */
-    @Nullable public X509Certificate[] getCaCertificates() {
-        if (mCaCerts != null && mCaCerts.length > 0) {
-            return mCaCerts;
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * @hide
-     */
-    public void resetCaCertificate() {
-        mCaCerts = null;
-    }
-
-    /**
-     * Set the ca_path directive on wpa_supplicant.
-     *
-     * From wpa_supplicant documentation:
-     *
-     * Directory path for CA certificate files (PEM). This path may contain
-     * multiple CA certificates in OpenSSL format. Common use for this is to
-     * point to system trusted CA list which is often installed into directory
-     * like /etc/ssl/certs. If configured, these certificates are added to the
-     * list of trusted CAs. ca_cert may also be included in that case, but it is
-     * not required.
-     *
-     * Note: If no certificate path is set for an Enterprise configuration, either by not calling
-     * this API, or by calling it with null, and no certificate is set by
-     * {@link #setCaCertificate(X509Certificate)} or {@link #setCaCertificates(X509Certificate[])},
-     * then the server certificate validation is skipped - which means that the connection is not
-     * secure.
-     *
-     * @param path The path for CA certificate files, or empty string to clear.
-     * @hide
-     */
-    @SystemApi
-    public void setCaPath(@NonNull String path) {
-        setFieldValue(CA_PATH_KEY, path);
-    }
-
-    /**
-     * Get the ca_path directive from wpa_supplicant.
-     * @return The path for CA certificate files, or an empty string if unset.
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    public String getCaPath() {
-        return getFieldValue(CA_PATH_KEY);
-    }
-
-    /**
-     * Set Client certificate alias.
-     *
-     * <p> See the {@link android.security.KeyChain} for details on installing or choosing
-     * a certificate
-     * </p>
-     * @param alias identifies the certificate, or empty string to clear.
-     * @hide
-     */
-    @SystemApi
-    public void setClientCertificateAlias(@NonNull String alias) {
-        setFieldValue(CLIENT_CERT_KEY, alias, CLIENT_CERT_PREFIX);
-        setFieldValue(PRIVATE_KEY_ID_KEY, alias, USER_PRIVATE_KEY);
-        // Also, set engine parameters
-        if (TextUtils.isEmpty(alias)) {
-            setFieldValue(ENGINE_KEY, ENGINE_DISABLE);
-            setFieldValue(ENGINE_ID_KEY, "");
-        } else {
-            setFieldValue(ENGINE_KEY, ENGINE_ENABLE);
-            setFieldValue(ENGINE_ID_KEY, ENGINE_ID_KEYSTORE);
-        }
-    }
-
-    /**
-     * Get client certificate alias.
-     * @return alias to the client certificate, or an empty string if unset.
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    public String getClientCertificateAlias() {
-        return getFieldValue(CLIENT_CERT_KEY, CLIENT_CERT_PREFIX);
-    }
-
-    /**
-     * Specify a private key and client certificate for client authorization.
-     *
-     * <p>A default name is automatically assigned to the key entry and used
-     * with this configuration.  The framework takes care of installing the
-     * key entry when the config is saved and removing the key entry when
-     * the config is removed.
-
-     * @param privateKey a PrivateKey instance for the end certificate.
-     * @param clientCertificate an X509Certificate representing the end certificate.
-     * @throws IllegalArgumentException for an invalid key or certificate.
-     */
-    public void setClientKeyEntry(PrivateKey privateKey, X509Certificate clientCertificate) {
-        X509Certificate[] clientCertificates = null;
-        if (clientCertificate != null) {
-            clientCertificates = new X509Certificate[] {clientCertificate};
-        }
-        setClientKeyEntryWithCertificateChain(privateKey, clientCertificates);
-    }
-
-    /**
-     * Specify a private key and client certificate chain for client authorization.
-     *
-     * <p>A default name is automatically assigned to the key entry and used
-     * with this configuration.  The framework takes care of installing the
-     * key entry when the config is saved and removing the key entry when
-     * the config is removed.
-     *
-     * @param privateKey a PrivateKey instance for the end certificate.
-     * @param clientCertificateChain an array of X509Certificate instances which starts with
-     *         end certificate and continues with additional CA certificates necessary to
-     *         link the end certificate with some root certificate known by the authenticator.
-     * @throws IllegalArgumentException for an invalid key or certificate.
-     */
-    public void setClientKeyEntryWithCertificateChain(PrivateKey privateKey,
-            X509Certificate[] clientCertificateChain) {
-        X509Certificate[] newCerts = null;
-        if (clientCertificateChain != null && clientCertificateChain.length > 0) {
-            // We validate that this is a well formed chain that starts
-            // with an end-certificate and is followed by CA certificates.
-            // We don't validate that each following certificate verifies
-            // the previous. https://en.wikipedia.org/wiki/Chain_of_trust
-            //
-            // Basic constraints is an X.509 extension type that defines
-            // whether a given certificate is allowed to sign additional
-            // certificates and what path length restrictions may exist.
-            // We use this to judge whether the certificate is an end
-            // certificate or a CA certificate.
-            // https://cryptography.io/en/latest/x509/reference/
-            if (clientCertificateChain[0].getBasicConstraints() != -1) {
-                throw new IllegalArgumentException(
-                        "First certificate in the chain must be a client end certificate");
-            }
-
-            for (int i = 1; i < clientCertificateChain.length; i++) {
-                if (clientCertificateChain[i].getBasicConstraints() == -1) {
-                    throw new IllegalArgumentException(
-                            "All certificates following the first must be CA certificates");
-                }
-            }
-            newCerts = Arrays.copyOf(clientCertificateChain,
-                    clientCertificateChain.length);
-
-            if (privateKey == null) {
-                throw new IllegalArgumentException("Client cert without a private key");
-            }
-            if (privateKey.getEncoded() == null) {
-                throw new IllegalArgumentException("Private key cannot be encoded");
-            }
-        }
-
-        mClientPrivateKey = privateKey;
-        mClientCertificateChain = newCerts;
-        mIsAppInstalledDeviceKeyAndCert = true;
-    }
-
-    /**
-     * Get client certificate
-     *
-     * @return X.509 client certificate
-     */
-    public X509Certificate getClientCertificate() {
-        if (mClientCertificateChain != null && mClientCertificateChain.length > 0) {
-            return mClientCertificateChain[0];
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Get the complete client certificate chain in the same order as it was last supplied.
-     *
-     * <p>If the chain was last supplied by a call to
-     * {@link #setClientKeyEntry(java.security.PrivateKey, java.security.cert.X509Certificate)}
-     * with a non-null * certificate instance, a single-element array containing the certificate
-     * will be * returned. If {@link #setClientKeyEntryWithCertificateChain(
-     * java.security.PrivateKey, java.security.cert.X509Certificate[])} was last called with a
-     * non-empty array, this array will be returned in the same order as it was supplied.
-     * Otherwise, {@code null} will be returned.
-     *
-     * @return X.509 client certificates
-     */
-    @Nullable public X509Certificate[] getClientCertificateChain() {
-        if (mClientCertificateChain != null && mClientCertificateChain.length > 0) {
-            return mClientCertificateChain;
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * @hide
-     */
-    public void resetClientKeyEntry() {
-        mClientPrivateKey = null;
-        mClientCertificateChain = null;
-    }
-
-    /**
-     * Get the client private key as supplied in {@link #setClientKeyEntryWithCertificateChain}, or
-     * null if unset.
-     */
-    @Nullable
-    public PrivateKey getClientPrivateKey() {
-        return mClientPrivateKey;
-    }
-
-    /**
-     * Set subject match (deprecated). This is the substring to be matched against the subject of
-     * the authentication server certificate.
-     * @param subjectMatch substring to be matched
-     * @deprecated in favor of altSubjectMatch
-     */
-    public void setSubjectMatch(String subjectMatch) {
-        setFieldValue(SUBJECT_MATCH_KEY, subjectMatch);
-    }
-
-    /**
-     * Get subject match (deprecated)
-     * @return the subject match string
-     * @deprecated in favor of altSubjectMatch
-     */
-    public String getSubjectMatch() {
-        return getFieldValue(SUBJECT_MATCH_KEY);
-    }
-
-    /**
-     * Set alternate subject match. This is the substring to be matched against the
-     * alternate subject of the authentication server certificate.
-     *
-     * Note: If no alternate subject is set for an Enterprise configuration, either by not calling
-     * this API, or by calling it with null, or not setting domain suffix match using the
-     * {@link #setDomainSuffixMatch(String)}, then the server certificate validation is incomplete -
-     * which means that the connection is not secure.
-     *
-     * @param altSubjectMatch substring to be matched, for example
-     *                     DNS:server.example.com;EMAIL:server@example.com
-     */
-    public void setAltSubjectMatch(String altSubjectMatch) {
-        setFieldValue(ALTSUBJECT_MATCH_KEY, altSubjectMatch);
-    }
-
-    /**
-     * Get alternate subject match
-     * @return the alternate subject match string
-     */
-    public String getAltSubjectMatch() {
-        return getFieldValue(ALTSUBJECT_MATCH_KEY);
-    }
-
-    /**
-     * Set the domain_suffix_match directive on wpa_supplicant. This is the parameter to use
-     * for Hotspot 2.0 defined matching of AAA server certs per WFA HS2.0 spec, section 7.3.3.2,
-     * second paragraph.
-     *
-     * <p>From wpa_supplicant documentation:
-     * <p>Constraint for server domain name. If set, this FQDN is used as a suffix match requirement
-     * for the AAAserver certificate in SubjectAltName dNSName element(s). If a matching dNSName is
-     * found, this constraint is met.
-     * <p>Suffix match here means that the host/domain name is compared one label at a time starting
-     * from the top-level domain and all the labels in domain_suffix_match shall be included in the
-     * certificate. The certificate may include additional sub-level labels in addition to the
-     * required labels.
-     * <p>More than one match string can be provided by using semicolons to separate the strings
-     * (e.g., example.org;example.com). When multiple strings are specified, a match with any one of
-     * the values is considered a sufficient match for the certificate, i.e., the conditions are
-     * ORed ogether.
-     * <p>For example, domain_suffix_match=example.com would match test.example.com but would not
-     * match test-example.com.
-     *
-     * Note: If no domain suffix is set for an Enterprise configuration, either by not calling this
-     * API, or by calling it with null, or not setting alternate subject match using the
-     * {@link #setAltSubjectMatch(String)}, then the server certificate
-     * validation is incomplete - which means that the connection is not secure.
-     *
-     * @param domain The domain value
-     */
-    public void setDomainSuffixMatch(String domain) {
-        setFieldValue(DOM_SUFFIX_MATCH_KEY, domain);
-    }
-
-    /**
-     * Get the domain_suffix_match value. See setDomSuffixMatch.
-     * @return The domain value.
-     */
-    public String getDomainSuffixMatch() {
-        return getFieldValue(DOM_SUFFIX_MATCH_KEY);
-    }
-
-    /**
-     * Set realm for Passpoint credential; realm identifies a set of networks where your
-     * Passpoint credential can be used
-     * @param realm the realm
-     */
-    public void setRealm(String realm) {
-        setFieldValue(REALM_KEY, realm);
-    }
-
-    /**
-     * Get realm for Passpoint credential; see {@link #setRealm(String)} for more information
-     * @return the realm
-     */
-    public String getRealm() {
-        return getFieldValue(REALM_KEY);
-    }
-
-    /**
-     * Set plmn (Public Land Mobile Network) of the provider of Passpoint credential
-     * @param plmn the plmn value derived from mcc (mobile country code) & mnc (mobile network code)
-     */
-    public void setPlmn(String plmn) {
-        setFieldValue(PLMN_KEY, plmn);
-    }
-
-    /**
-     * Get plmn (Public Land Mobile Network) for Passpoint credential; see {@link #setPlmn
-     * (String)} for more information
-     * @return the plmn
-     */
-    public String getPlmn() {
-        return getFieldValue(PLMN_KEY);
-    }
-
-    /** See {@link WifiConfiguration#getKeyIdForCredentials} @hide */
-    public String getKeyId(WifiEnterpriseConfig current) {
-        // If EAP method is not initialized, use current config details
-        if (mEapMethod == Eap.NONE) {
-            return (current != null) ? current.getKeyId(null) : EMPTY_VALUE;
-        }
-        if (!isEapMethodValid()) {
-            return EMPTY_VALUE;
-        }
-        return Eap.strings[mEapMethod] + "_" + Phase2.strings[mPhase2Method];
-    }
-
-    private String removeDoubleQuotes(String string) {
-        if (TextUtils.isEmpty(string)) return "";
-        int length = string.length();
-        if ((length > 1) && (string.charAt(0) == '"')
-                && (string.charAt(length - 1) == '"')) {
-            return string.substring(1, length - 1);
-        }
-        return string;
-    }
-
-    private String convertToQuotedString(String string) {
-        return "\"" + string + "\"";
-    }
-
-    /**
-     * Returns the index at which the toBeFound string is found in the array.
-     * @param arr array of strings
-     * @param toBeFound string to be found
-     * @param defaultIndex default index to be returned when string is not found
-     * @return the index into array
-     */
-    private int getStringIndex(String arr[], String toBeFound, int defaultIndex) {
-        if (TextUtils.isEmpty(toBeFound)) return defaultIndex;
-        for (int i = 0; i < arr.length; i++) {
-            if (toBeFound.equals(arr[i])) return i;
-        }
-        return defaultIndex;
-    }
-
-    /**
-     * Returns the field value for the key with prefix removed.
-     * @param key into the hash
-     * @param prefix is the prefix that the value may have
-     * @return value
-     * @hide
-     */
-    private String getFieldValue(String key, String prefix) {
-        // TODO: Should raise an exception if |key| is EAP_KEY or PHASE2_KEY since
-        // neither of these keys should be retrieved in this manner.
-        String value = mFields.get(key);
-        // Uninitialized or known to be empty after reading from supplicant
-        if (TextUtils.isEmpty(value) || EMPTY_VALUE.equals(value)) return "";
-
-        value = removeDoubleQuotes(value);
-        if (value.startsWith(prefix)) {
-            return value.substring(prefix.length());
-        } else {
-            return value;
-        }
-    }
-
-    /**
-     * Returns the field value for the key.
-     * @param key into the hash
-     * @return value
-     * @hide
-     */
-    public String getFieldValue(String key) {
-        return getFieldValue(key, "");
-    }
-
-    /**
-     * Set a value with an optional prefix at key
-     * @param key into the hash
-     * @param value to be set
-     * @param prefix an optional value to be prefixed to actual value
-     * @hide
-     */
-    private void setFieldValue(String key, String value, String prefix) {
-        // TODO: Should raise an exception if |key| is EAP_KEY or PHASE2_KEY since
-        // neither of these keys should be set in this manner.
-        if (TextUtils.isEmpty(value)) {
-            mFields.put(key, EMPTY_VALUE);
-        } else {
-            String valueToSet;
-            if (!UNQUOTED_KEYS.contains(key)) {
-                valueToSet = convertToQuotedString(prefix + value);
-            } else {
-                valueToSet = prefix + value;
-            }
-            mFields.put(key, valueToSet);
-        }
-    }
-
-    /**
-     * Set a value at key
-     * @param key into the hash
-     * @param value to be set
-     * @hide
-     */
-    public void setFieldValue(String key, String value) {
-        setFieldValue(key, value, "");
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sb = new StringBuffer();
-        for (String key : mFields.keySet()) {
-            // Don't display password in toString().
-            String value = PASSWORD_KEY.equals(key) ? "<removed>" : mFields.get(key);
-            sb.append(key).append(" ").append(value).append("\n");
-        }
-        if (mEapMethod >= 0 && mEapMethod < Eap.strings.length) {
-            sb.append("eap_method: ").append(Eap.strings[mEapMethod]).append("\n");
-        }
-        if (mPhase2Method > 0 && mPhase2Method < Phase2.strings.length) {
-            sb.append("phase2_method: ").append(Phase2.strings[mPhase2Method]).append("\n");
-        }
-        sb.append(" ocsp: ").append(mOcsp).append("\n");
-        return sb.toString();
-    }
-
-    /**
-     * Returns whether the EAP method data is valid, i.e., whether mEapMethod and mPhase2Method
-     * are valid indices into {@code Eap.strings[]} and {@code Phase2.strings[]} respectively.
-     */
-    private boolean isEapMethodValid() {
-        if (mEapMethod == Eap.NONE) {
-            Log.e(TAG, "WiFi enterprise configuration is invalid as it supplies no EAP method.");
-            return false;
-        }
-        if (mEapMethod < 0 || mEapMethod >= Eap.strings.length) {
-            Log.e(TAG, "mEapMethod is invald for WiFi enterprise configuration: " + mEapMethod);
-            return false;
-        }
-        if (mPhase2Method < 0 || mPhase2Method >= Phase2.strings.length) {
-            Log.e(TAG, "mPhase2Method is invald for WiFi enterprise configuration: "
-                    + mPhase2Method);
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Check if certificate was installed by an app, or manually (not by an app). If true,
-     * certificate and keys will be removed from key storage when this network is removed. If not,
-     * then certificates and keys remain persistent until the user manually removes them.
-     *
-     * @return true if certificate was installed by an app, false if certificate was installed
-     * manually by the user.
-     * @hide
-     */
-    public boolean isAppInstalledDeviceKeyAndCert() {
-        return mIsAppInstalledDeviceKeyAndCert;
-    }
-
-    /**
-     * Check if CA certificate was installed by an app, or manually (not by an app). If true,
-     * CA certificate will be removed from key storage when this network is removed. If not,
-     * then certificates and keys remain persistent until the user manually removes them.
-     *
-     * @return true if CA certificate was installed by an app, false if CA certificate was installed
-     * manually by the user.
-     * @hide
-     */
-    public boolean isAppInstalledCaCert() {
-        return mIsAppInstalledCaCert;
-    }
-
-    /**
-     * Set the OCSP type.
-     * @param ocsp is one of {@link ##OCSP_NONE}, {@link #OCSP_REQUEST_CERT_STATUS},
-     *                   {@link #OCSP_REQUIRE_CERT_STATUS} or
-     *                   {@link #OCSP_REQUIRE_ALL_NON_TRUSTED_CERTS_STATUS}
-     * @throws IllegalArgumentException if the OCSP type is invalid
-     * @hide
-     */
-    @SystemApi
-    public void setOcsp(@Ocsp int ocsp) {
-        if (ocsp >= OCSP_NONE && ocsp <= OCSP_REQUIRE_ALL_NON_TRUSTED_CERTS_STATUS) {
-            mOcsp = ocsp;
-        } else {
-            throw new IllegalArgumentException("Invalid OCSP type.");
-        }
-    }
-
-    /**
-     * Get the OCSP type.
-     * @hide
-     */
-    @SystemApi
-    public @Ocsp int getOcsp() {
-        return mOcsp;
-    }
-
-    /**
-     * Utility method to determine whether the configuration's authentication method is SIM-based.
-     *
-     * @return true if the credential information requires SIM card for current authentication
-     * method, otherwise it returns false.
-     */
-    public boolean isAuthenticationSimBased() {
-        if (mEapMethod == Eap.SIM || mEapMethod == Eap.AKA || mEapMethod == Eap.AKA_PRIME) {
-            return true;
-        }
-        if (mEapMethod == Eap.PEAP) {
-            return mPhase2Method == Phase2.SIM || mPhase2Method == Phase2.AKA
-                    || mPhase2Method == Phase2.AKA_PRIME;
-        }
-        return false;
-    }
-
-    /**
-     * Set the WAPI certificate suite name on wpa_supplicant.
-     *
-     * If this field is not specified, WAPI-CERT uses ASU ID from WAI packet
-     * as the certificate suite name automatically.
-     *
-     * @param wapiCertSuite The name for WAPI certificate suite, or empty string to clear.
-     * @hide
-     */
-    @SystemApi
-    public void setWapiCertSuite(@NonNull String wapiCertSuite) {
-        setFieldValue(WAPI_CERT_SUITE_KEY, wapiCertSuite);
-    }
-
-    /**
-     * Get the WAPI certificate suite name
-     * @return the certificate suite name
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    public String getWapiCertSuite() {
-        return getFieldValue(WAPI_CERT_SUITE_KEY);
-    }
-
-    /**
-     * Method determines whether the Enterprise configuration is insecure. An insecure
-     * configuration is one where EAP method requires a CA certification, i.e. PEAP, TLS, or
-     * TTLS, and any of the following conditions are met:
-     * - Both certificate and CA path are not configured.
-     * - Both alternative subject match and domain suffix match are not set.
-     *
-     * Note: this method does not exhaustively check security of the configuration - i.e. a return
-     * value of {@code false} is not a guarantee that the configuration is secure.
-     * @hide
-     */
-    public boolean isInsecure() {
-        if (mEapMethod != Eap.PEAP && mEapMethod != Eap.TLS && mEapMethod != Eap.TTLS) {
-            return false;
-        }
-        if (TextUtils.isEmpty(getAltSubjectMatch())
-                && TextUtils.isEmpty(getDomainSuffixMatch())) {
-            // Both subject and domain match are not set, it's insecure.
-            return true;
-        }
-        if (mIsAppInstalledCaCert) {
-            // CA certificate is installed by App, it's secure.
-            return false;
-        }
-        if (getCaCertificateAliases() != null) {
-            // CA certificate alias from keyStore is set, it's secure.
-            return false;
-        }
-        return TextUtils.isEmpty(getCaPath());
-    }
-
-    /**
-     * Check if a given certificate Get the Suite-B cipher from the certificate
-     *
-     * @param x509Certificate Certificate to process
-     * @return true if the certificate OID matches the Suite-B requirements for RSA or ECDSA
-     * certificates, or false otherwise.
-     * @hide
-     */
-    public static boolean isSuiteBCipherCert(@Nullable X509Certificate x509Certificate) {
-        if (x509Certificate == null) {
-            return false;
-        }
-        final String sigAlgOid = x509Certificate.getSigAlgOID();
-
-        // Wi-Fi alliance requires the use of both ECDSA secp384r1 and RSA 3072 certificates
-        // in WPA3-Enterprise 192-bit security networks, which are also known as Suite-B-192
-        // networks, even though NSA Suite-B-192 mandates ECDSA only. The use of the term
-        // Suite-B was already coined in the IEEE 802.11-2016 specification for
-        // AKM 00-0F-AC but the test plan for WPA3-Enterprise 192-bit for APs mandates
-        // support for both RSA and ECDSA, and for STAs it mandates ECDSA and optionally
-        // RSA. In order to be compatible with all WPA3-Enterprise 192-bit deployments,
-        // we are supporting both types here.
-        if (sigAlgOid.equals("1.2.840.113549.1.1.12")) {
-            // sha384WithRSAEncryption
-            if (x509Certificate.getPublicKey() instanceof RSAPublicKey) {
-                final RSAPublicKey rsaPublicKey = (RSAPublicKey) x509Certificate.getPublicKey();
-                if (rsaPublicKey.getModulus() != null
-                        && rsaPublicKey.getModulus().bitLength() >= 3072) {
-                    return true;
-                }
-            }
-        } else if (sigAlgOid.equals("1.2.840.10045.4.3.3")) {
-            // ecdsa-with-SHA384
-            if (x509Certificate.getPublicKey() instanceof ECPublicKey) {
-                final ECPublicKey ecPublicKey = (ECPublicKey) x509Certificate.getPublicKey();
-                final ECParameterSpec ecParameterSpec = ecPublicKey.getParams();
-
-                if (ecParameterSpec != null && ecParameterSpec.getOrder() != null
-                        && ecParameterSpec.getOrder().bitLength() >= 384) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-}
diff --git a/wifi/java/android/net/wifi/WifiFrameworkInitializer.java b/wifi/java/android/net/wifi/WifiFrameworkInitializer.java
deleted file mode 100644
index 1507199..0000000
--- a/wifi/java/android/net/wifi/WifiFrameworkInitializer.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.net.wifi;
-
-import android.annotation.SystemApi;
-import android.app.SystemServiceRegistry;
-import android.content.Context;
-import android.net.wifi.aware.IWifiAwareManager;
-import android.net.wifi.aware.WifiAwareManager;
-import android.net.wifi.p2p.IWifiP2pManager;
-import android.net.wifi.p2p.WifiP2pManager;
-import android.net.wifi.rtt.IWifiRttManager;
-import android.net.wifi.rtt.WifiRttManager;
-import android.os.HandlerThread;
-import android.os.Looper;
-
-/**
- * Class for performing registration for all Wifi services.
- *
- * @hide
- */
-@SystemApi
-public class WifiFrameworkInitializer {
-
-    /**
-     * A class implementing the lazy holder idiom: the unique static instance
-     * of {@link #INSTANCE} is instantiated in a thread-safe way (guaranteed by
-     * the language specs) the first time that NoPreloadHolder is referenced in getInstanceLooper().
-     *
-     * This is necessary because we can't spawn a new thread in {@link #registerServiceWrappers()}.
-     * {@link #registerServiceWrappers()} is called during the Zygote phase, which disallows
-     * spawning new threads. Naming the class "NoPreloadHolder" ensures that the classloader will
-     * not preload this class, inadvertently spawning the thread too early.
-     */
-    private static class NoPreloadHolder {
-        private static final HandlerThread INSTANCE = createInstance();
-
-        private static HandlerThread createInstance() {
-            HandlerThread thread = new HandlerThread("WifiManagerThread");
-            thread.start();
-            return thread;
-        }
-    }
-
-    private static Looper getInstanceLooper() {
-        return NoPreloadHolder.INSTANCE.getLooper();
-    }
-
-    private WifiFrameworkInitializer() {}
-
-    /**
-     * Called by {@link SystemServiceRegistry}'s static initializer and registers all Wifi services
-     * to {@link Context}, so that {@link Context#getSystemService} can return them.
-     *
-     * @throws IllegalStateException if this is called from anywhere besides
-     * {@link SystemServiceRegistry}
-     */
-    public static void registerServiceWrappers() {
-        SystemServiceRegistry.registerContextAwareService(
-                Context.WIFI_SERVICE,
-                WifiManager.class,
-                (context, serviceBinder) -> {
-                    IWifiManager service = IWifiManager.Stub.asInterface(serviceBinder);
-                    return new WifiManager(context, service, getInstanceLooper());
-                }
-        );
-        SystemServiceRegistry.registerStaticService(
-                Context.WIFI_P2P_SERVICE,
-                WifiP2pManager.class,
-                serviceBinder -> {
-                    IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(serviceBinder);
-                    return new WifiP2pManager(service);
-                }
-        );
-        SystemServiceRegistry.registerContextAwareService(
-                Context.WIFI_AWARE_SERVICE,
-                WifiAwareManager.class,
-                (context, serviceBinder) -> {
-                    IWifiAwareManager service = IWifiAwareManager.Stub.asInterface(serviceBinder);
-                    return new WifiAwareManager(context, service);
-                }
-        );
-        SystemServiceRegistry.registerContextAwareService(
-                Context.WIFI_SCANNING_SERVICE,
-                WifiScanner.class,
-                (context, serviceBinder) -> {
-                    IWifiScanner service = IWifiScanner.Stub.asInterface(serviceBinder);
-                    return new WifiScanner(context, service, getInstanceLooper());
-                }
-        );
-        SystemServiceRegistry.registerContextAwareService(
-                Context.WIFI_RTT_RANGING_SERVICE,
-                WifiRttManager.class,
-                (context, serviceBinder) -> {
-                    IWifiRttManager service = IWifiRttManager.Stub.asInterface(serviceBinder);
-                    return new WifiRttManager(context, service);
-                }
-        );
-        SystemServiceRegistry.registerContextAwareService(
-                Context.WIFI_RTT_SERVICE,
-                RttManager.class,
-                context -> {
-                    WifiRttManager wifiRttManager = context.getSystemService(WifiRttManager.class);
-                    return new RttManager(context, wifiRttManager);
-                }
-        );
-    }
-}
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
deleted file mode 100644
index 5388367..0000000
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ /dev/null
@@ -1,1051 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.net.NetworkInfo.DetailedState;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import com.android.net.module.util.Inet4AddressUtils;
-
-import java.net.Inet4Address;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.EnumMap;
-import java.util.Locale;
-
-/**
- * Describes the state of any Wi-Fi connection that is active or
- * is in the process of being set up.
- */
-public class WifiInfo implements Parcelable {
-    private static final String TAG = "WifiInfo";
-    /**
-     * This is the map described in the Javadoc comment above. The positions
-     * of the elements of the array must correspond to the ordinal values
-     * of <code>DetailedState</code>.
-     */
-    private static final EnumMap<SupplicantState, DetailedState> stateMap =
-            new EnumMap<SupplicantState, DetailedState>(SupplicantState.class);
-
-    /**
-     * Default MAC address reported to a client that does not have the
-     * android.permission.LOCAL_MAC_ADDRESS permission.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String DEFAULT_MAC_ADDRESS = "02:00:00:00:00:00";
-
-    static {
-        stateMap.put(SupplicantState.DISCONNECTED, DetailedState.DISCONNECTED);
-        stateMap.put(SupplicantState.INTERFACE_DISABLED, DetailedState.DISCONNECTED);
-        stateMap.put(SupplicantState.INACTIVE, DetailedState.IDLE);
-        stateMap.put(SupplicantState.SCANNING, DetailedState.SCANNING);
-        stateMap.put(SupplicantState.AUTHENTICATING, DetailedState.CONNECTING);
-        stateMap.put(SupplicantState.ASSOCIATING, DetailedState.CONNECTING);
-        stateMap.put(SupplicantState.ASSOCIATED, DetailedState.CONNECTING);
-        stateMap.put(SupplicantState.FOUR_WAY_HANDSHAKE, DetailedState.AUTHENTICATING);
-        stateMap.put(SupplicantState.GROUP_HANDSHAKE, DetailedState.AUTHENTICATING);
-        stateMap.put(SupplicantState.COMPLETED, DetailedState.OBTAINING_IPADDR);
-        stateMap.put(SupplicantState.DORMANT, DetailedState.DISCONNECTED);
-        stateMap.put(SupplicantState.UNINITIALIZED, DetailedState.IDLE);
-        stateMap.put(SupplicantState.INVALID, DetailedState.FAILED);
-    }
-
-    private SupplicantState mSupplicantState;
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
-    private String mBSSID;
-    @UnsupportedAppUsage
-    private WifiSsid mWifiSsid;
-    private int mNetworkId;
-
-    /**
-     * Used to indicate that the RSSI is invalid, for example if no RSSI measurements are available
-     * yet.
-     * @hide
-     */
-    @SystemApi
-    public static final int INVALID_RSSI = -127;
-
-    /** @hide **/
-    public static final int MIN_RSSI = -126;
-
-    /** @hide **/
-    public static final int MAX_RSSI = 200;
-
-
-    /**
-     * Received Signal Strength Indicator
-     */
-    private int mRssi;
-
-    /**
-     * Wi-Fi standard for the connection
-     */
-    private @WifiAnnotations.WifiStandard int mWifiStandard;
-
-    /**
-     * The unit in which links speeds are expressed.
-     */
-    public static final String LINK_SPEED_UNITS = "Mbps";
-    private int mLinkSpeed;
-
-    /**
-     * Constant for unknown link speed.
-     */
-    public static final int LINK_SPEED_UNKNOWN = -1;
-
-    /**
-     * Tx(transmit) Link speed in Mbps
-     */
-    private int mTxLinkSpeed;
-
-    /**
-     * Max supported Tx(transmit) link speed in Mbps
-     */
-    private int mMaxSupportedTxLinkSpeed;
-
-    /**
-     * Rx(receive) Link speed in Mbps
-     */
-    private int mRxLinkSpeed;
-
-    /**
-     * Max supported Rx(receive) link speed in Mbps
-     */
-    private int mMaxSupportedRxLinkSpeed;
-
-    /**
-     * Frequency in MHz
-     */
-    public static final String FREQUENCY_UNITS = "MHz";
-    private int mFrequency;
-
-    @UnsupportedAppUsage
-    private InetAddress mIpAddress;
-    @UnsupportedAppUsage
-    private String mMacAddress = DEFAULT_MAC_ADDRESS;
-
-    /**
-     * Whether the network is ephemeral or not.
-     */
-    private boolean mEphemeral;
-
-    /**
-     * Whether the network is trusted or not.
-     */
-    private boolean mTrusted;
-
-    /**
-     * OSU (Online Sign Up) AP for Passpoint R2.
-     */
-    private boolean mOsuAp;
-
-    /**
-     * Fully qualified domain name of a Passpoint configuration
-     */
-    private String mFqdn;
-
-    /**
-     * Name of Passpoint credential provider
-     */
-    private String mProviderFriendlyName;
-
-    /**
-     * If connected to a network suggestion or specifier, store the package name of the app,
-     * else null.
-     */
-    private String mRequestingPackageName;
-
-    /**
-     * Running total count of lost (not ACKed) transmitted unicast data packets.
-     * @hide
-     */
-    public long txBad;
-    /**
-     * Running total count of transmitted unicast data retry packets.
-     * @hide
-     */
-    public long txRetries;
-    /**
-     * Running total count of successfully transmitted (ACKed) unicast data packets.
-     * @hide
-     */
-    public long txSuccess;
-    /**
-     * Running total count of received unicast data packets.
-     * @hide
-     */
-    public long rxSuccess;
-
-    private double mLostTxPacketsPerSecond;
-
-    /**
-     * Average rate of lost transmitted packets, in units of packets per second.
-     * @hide
-     */
-    @SystemApi
-    public double getLostTxPacketsPerSecond() {
-        return mLostTxPacketsPerSecond;
-    }
-
-    /** @hide */
-    public void setLostTxPacketsPerSecond(double lostTxPacketsPerSecond) {
-        mLostTxPacketsPerSecond = lostTxPacketsPerSecond;
-    }
-
-    private double mTxRetriedTxPacketsPerSecond;
-
-    /**
-     * Average rate of transmitted retry packets, in units of packets per second.
-     * @hide
-     */
-    @SystemApi
-    public double getRetriedTxPacketsPerSecond() {
-        return mTxRetriedTxPacketsPerSecond;
-    }
-
-    /** @hide */
-    public void setRetriedTxPacketsRate(double txRetriedTxPacketsPerSecond) {
-        mTxRetriedTxPacketsPerSecond = txRetriedTxPacketsPerSecond;
-    }
-
-    private double mSuccessfulTxPacketsPerSecond;
-
-    /**
-     * Average rate of successfully transmitted unicast packets, in units of packets per second.
-     * @hide
-     */
-    @SystemApi
-    public double getSuccessfulTxPacketsPerSecond() {
-        return mSuccessfulTxPacketsPerSecond;
-    }
-
-    /** @hide */
-    public void setSuccessfulTxPacketsPerSecond(double successfulTxPacketsPerSecond) {
-        mSuccessfulTxPacketsPerSecond = successfulTxPacketsPerSecond;
-    }
-
-    private double mSuccessfulRxPacketsPerSecond;
-
-    /**
-     * Average rate of received unicast data packets, in units of packets per second.
-     * @hide
-     */
-    @SystemApi
-    public double getSuccessfulRxPacketsPerSecond() {
-        return mSuccessfulRxPacketsPerSecond;
-    }
-
-    /** @hide */
-    public void setSuccessfulRxPacketsPerSecond(double successfulRxPacketsPerSecond) {
-        mSuccessfulRxPacketsPerSecond = successfulRxPacketsPerSecond;
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public int score;
-
-    /**
-     * The current Wifi score.
-     * NOTE: this value should only be used for debugging purposes. Do not rely on this value for
-     * any computations. The meaning of this value can and will change at any time without warning.
-     * @hide
-     */
-    @SystemApi
-    public int getScore() {
-        return score;
-    }
-
-    /** @hide */
-    public void setScore(int score) {
-        this.score = score;
-    }
-
-    /**
-     * Flag indicating that AP has hinted that upstream connection is metered,
-     * and sensitive to heavy data transfers.
-     */
-    private boolean mMeteredHint;
-
-    /**
-     * Passpoint unique key
-     */
-    private String mPasspointUniqueId;
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public WifiInfo() {
-        mWifiSsid = null;
-        mBSSID = null;
-        mNetworkId = -1;
-        mSupplicantState = SupplicantState.UNINITIALIZED;
-        mRssi = INVALID_RSSI;
-        mLinkSpeed = LINK_SPEED_UNKNOWN;
-        mFrequency = -1;
-    }
-
-    /** @hide */
-    public void reset() {
-        setInetAddress(null);
-        setBSSID(null);
-        setSSID(null);
-        setNetworkId(-1);
-        setRssi(INVALID_RSSI);
-        setLinkSpeed(LINK_SPEED_UNKNOWN);
-        setTxLinkSpeedMbps(LINK_SPEED_UNKNOWN);
-        setRxLinkSpeedMbps(LINK_SPEED_UNKNOWN);
-        setMaxSupportedTxLinkSpeedMbps(LINK_SPEED_UNKNOWN);
-        setMaxSupportedRxLinkSpeedMbps(LINK_SPEED_UNKNOWN);
-        setFrequency(-1);
-        setMeteredHint(false);
-        setEphemeral(false);
-        setOsuAp(false);
-        setRequestingPackageName(null);
-        setFQDN(null);
-        setProviderFriendlyName(null);
-        setPasspointUniqueId(null);
-        txBad = 0;
-        txSuccess = 0;
-        rxSuccess = 0;
-        txRetries = 0;
-        mLostTxPacketsPerSecond = 0;
-        mSuccessfulTxPacketsPerSecond = 0;
-        mSuccessfulRxPacketsPerSecond = 0;
-        mTxRetriedTxPacketsPerSecond = 0;
-        score = 0;
-    }
-
-    /**
-     * Copy constructor
-     * @hide
-     */
-    public WifiInfo(WifiInfo source) {
-        if (source != null) {
-            mSupplicantState = source.mSupplicantState;
-            mBSSID = source.mBSSID;
-            mWifiSsid = source.mWifiSsid;
-            mNetworkId = source.mNetworkId;
-            mRssi = source.mRssi;
-            mLinkSpeed = source.mLinkSpeed;
-            mTxLinkSpeed = source.mTxLinkSpeed;
-            mRxLinkSpeed = source.mRxLinkSpeed;
-            mFrequency = source.mFrequency;
-            mIpAddress = source.mIpAddress;
-            mMacAddress = source.mMacAddress;
-            mMeteredHint = source.mMeteredHint;
-            mEphemeral = source.mEphemeral;
-            mTrusted = source.mTrusted;
-            mRequestingPackageName =
-                    source.mRequestingPackageName;
-            mOsuAp = source.mOsuAp;
-            mFqdn = source.mFqdn;
-            mProviderFriendlyName = source.mProviderFriendlyName;
-            txBad = source.txBad;
-            txRetries = source.txRetries;
-            txSuccess = source.txSuccess;
-            rxSuccess = source.rxSuccess;
-            mLostTxPacketsPerSecond = source.mLostTxPacketsPerSecond;
-            mTxRetriedTxPacketsPerSecond = source.mTxRetriedTxPacketsPerSecond;
-            mSuccessfulTxPacketsPerSecond = source.mSuccessfulTxPacketsPerSecond;
-            mSuccessfulRxPacketsPerSecond = source.mSuccessfulRxPacketsPerSecond;
-            score = source.score;
-            mWifiStandard = source.mWifiStandard;
-            mMaxSupportedTxLinkSpeed = source.mMaxSupportedTxLinkSpeed;
-            mMaxSupportedRxLinkSpeed = source.mMaxSupportedRxLinkSpeed;
-            mPasspointUniqueId = source.mPasspointUniqueId;
-        }
-    }
-
-    /** Builder for WifiInfo */
-    public static final class Builder {
-        private final WifiInfo mWifiInfo = new WifiInfo();
-
-        /**
-         * Set the SSID, in the form of a raw byte array.
-         * @see WifiInfo#getSSID()
-         */
-        @NonNull
-        public Builder setSsid(@NonNull byte[] ssid) {
-            mWifiInfo.setSSID(WifiSsid.createFromByteArray(ssid));
-            return this;
-        }
-
-        /**
-         * Set the BSSID.
-         * @see WifiInfo#getBSSID()
-         */
-        @NonNull
-        public Builder setBssid(@NonNull String bssid) {
-            mWifiInfo.setBSSID(bssid);
-            return this;
-        }
-
-        /**
-         * Set the RSSI, in dBm.
-         * @see WifiInfo#getRssi()
-         */
-        @NonNull
-        public Builder setRssi(int rssi) {
-            mWifiInfo.setRssi(rssi);
-            return this;
-        }
-
-        /**
-         * Set the network ID.
-         * @see WifiInfo#getNetworkId()
-         */
-        @NonNull
-        public Builder setNetworkId(int networkId) {
-            mWifiInfo.setNetworkId(networkId);
-            return this;
-        }
-
-        /**
-         * Build a WifiInfo object.
-         */
-        @NonNull
-        public WifiInfo build() {
-            return new WifiInfo(mWifiInfo);
-        }
-    }
-
-    /** @hide */
-    public void setSSID(WifiSsid wifiSsid) {
-        mWifiSsid = wifiSsid;
-    }
-
-    /**
-     * Returns the service set identifier (SSID) of the current 802.11 network.
-     * <p>
-     * If the SSID can be decoded as UTF-8, it will be returned surrounded by double
-     * quotation marks. Otherwise, it is returned as a string of hex digits.
-     * The SSID may be {@link WifiManager#UNKNOWN_SSID}, if there is no network currently connected
-     * or if the caller has insufficient permissions to access the SSID.
-     * </p>
-     * <p>
-     * Prior to {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR1}, this method
-     * always returned the SSID with no quotes around it.
-     * </p>
-     *
-     * @return the SSID.
-     */
-    public String getSSID() {
-        if (mWifiSsid != null) {
-            String unicode = mWifiSsid.toString();
-            if (!TextUtils.isEmpty(unicode)) {
-                return "\"" + unicode + "\"";
-            } else {
-                String hex = mWifiSsid.getHexString();
-                return (hex != null) ? hex : WifiManager.UNKNOWN_SSID;
-            }
-        }
-        return WifiManager.UNKNOWN_SSID;
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public WifiSsid getWifiSsid() {
-        return mWifiSsid;
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setBSSID(String BSSID) {
-        mBSSID = BSSID;
-    }
-
-    /**
-     * Return the basic service set identifier (BSSID) of the current access point.
-     * <p>
-     * The BSSID may be
-     * <lt>{@code null}, if there is no network currently connected.</lt>
-     * <lt>{@code "02:00:00:00:00:00"}, if the caller has insufficient permissions to access the
-     * BSSID.<lt>
-     * </p>
-     *
-     * @return the BSSID, in the form of a six-byte MAC address: {@code XX:XX:XX:XX:XX:XX}
-     */
-    public String getBSSID() {
-        return mBSSID;
-    }
-
-    /**
-     * Returns the received signal strength indicator of the current 802.11
-     * network, in dBm.
-     *
-     * <p>Use {@link android.net.wifi.WifiManager#calculateSignalLevel} to convert this number into
-     * an absolute signal level which can be displayed to a user.
-     *
-     * @return the RSSI.
-     */
-    public int getRssi() {
-        return mRssi;
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setRssi(int rssi) {
-        if (rssi < INVALID_RSSI)
-            rssi = INVALID_RSSI;
-        if (rssi > MAX_RSSI)
-            rssi = MAX_RSSI;
-        mRssi = rssi;
-    }
-
-    /**
-     * Sets the Wi-Fi standard
-     * @hide
-     */
-    public void setWifiStandard(@WifiAnnotations.WifiStandard int wifiStandard) {
-        mWifiStandard = wifiStandard;
-    }
-
-    /**
-     * Get connection Wi-Fi standard
-     * @return the connection Wi-Fi standard
-     */
-    public @WifiAnnotations.WifiStandard int getWifiStandard() {
-        return mWifiStandard;
-    }
-
-    /**
-     * Returns the current link speed in {@link #LINK_SPEED_UNITS}.
-     * @return the link speed or {@link #LINK_SPEED_UNKNOWN} if link speed is unknown.
-     * @see #LINK_SPEED_UNITS
-     * @see #LINK_SPEED_UNKNOWN
-     */
-    public int getLinkSpeed() {
-        return mLinkSpeed;
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setLinkSpeed(int linkSpeed) {
-        mLinkSpeed = linkSpeed;
-    }
-
-    /**
-     * Returns the current transmit link speed in Mbps.
-     * @return the Tx link speed or {@link #LINK_SPEED_UNKNOWN} if link speed is unknown.
-     * @see #LINK_SPEED_UNKNOWN
-     */
-    @IntRange(from = -1)
-    public int getTxLinkSpeedMbps() {
-        return mTxLinkSpeed;
-    }
-
-    /**
-     * Returns the maximum supported transmit link speed in Mbps
-     * @return the max supported tx link speed or {@link #LINK_SPEED_UNKNOWN} if link speed is
-     * unknown. @see #LINK_SPEED_UNKNOWN
-     */
-    public int getMaxSupportedTxLinkSpeedMbps() {
-        return mMaxSupportedTxLinkSpeed;
-    }
-
-    /**
-     * Update the last transmitted packet bit rate in Mbps.
-     * @hide
-     */
-    public void setTxLinkSpeedMbps(int txLinkSpeed) {
-        mTxLinkSpeed = txLinkSpeed;
-    }
-
-    /**
-     * Set the maximum supported transmit link speed in Mbps
-     * @hide
-     */
-    public void setMaxSupportedTxLinkSpeedMbps(int maxSupportedTxLinkSpeed) {
-        mMaxSupportedTxLinkSpeed = maxSupportedTxLinkSpeed;
-    }
-
-    /**
-     * Returns the current receive link speed in Mbps.
-     * @return the Rx link speed or {@link #LINK_SPEED_UNKNOWN} if link speed is unknown.
-     * @see #LINK_SPEED_UNKNOWN
-     */
-    @IntRange(from = -1)
-    public int getRxLinkSpeedMbps() {
-        return mRxLinkSpeed;
-    }
-
-    /**
-     * Returns the maximum supported receive link speed in Mbps
-     * @return the max supported Rx link speed or {@link #LINK_SPEED_UNKNOWN} if link speed is
-     * unknown. @see #LINK_SPEED_UNKNOWN
-     */
-    public int getMaxSupportedRxLinkSpeedMbps() {
-        return mMaxSupportedRxLinkSpeed;
-    }
-
-    /**
-     * Update the last received packet bit rate in Mbps.
-     * @hide
-     */
-    public void setRxLinkSpeedMbps(int rxLinkSpeed) {
-        mRxLinkSpeed = rxLinkSpeed;
-    }
-
-    /**
-     * Set the maximum supported receive link speed in Mbps
-     * @hide
-     */
-    public void setMaxSupportedRxLinkSpeedMbps(int maxSupportedRxLinkSpeed) {
-        mMaxSupportedRxLinkSpeed = maxSupportedRxLinkSpeed;
-    }
-
-    /**
-     * Returns the current frequency in {@link #FREQUENCY_UNITS}.
-     * @return the frequency.
-     * @see #FREQUENCY_UNITS
-     */
-    public int getFrequency() {
-        return mFrequency;
-    }
-
-    /** @hide */
-    public void setFrequency(int frequency) {
-        this.mFrequency = frequency;
-    }
-
-    /**
-     * @hide
-     */
-    public boolean is24GHz() {
-        return ScanResult.is24GHz(mFrequency);
-    }
-
-    /**
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public boolean is5GHz() {
-        return ScanResult.is5GHz(mFrequency);
-    }
-
-    /**
-     * @hide
-     */
-    public boolean is6GHz() {
-        return ScanResult.is6GHz(mFrequency);
-    }
-
-    /**
-     * Record the MAC address of the WLAN interface
-     * @param macAddress the MAC address in {@code XX:XX:XX:XX:XX:XX} form
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public void setMacAddress(String macAddress) {
-        this.mMacAddress = macAddress;
-    }
-
-    public String getMacAddress() {
-        return mMacAddress;
-    }
-
-    /**
-     * @return true if {@link #getMacAddress()} has a real MAC address.
-     *
-     * @hide
-     */
-    public boolean hasRealMacAddress() {
-        return mMacAddress != null && !DEFAULT_MAC_ADDRESS.equals(mMacAddress);
-    }
-
-    /**
-     * Indicates if we've dynamically detected this active network connection as
-     * being metered.
-     *
-     * @see WifiConfiguration#isMetered(WifiConfiguration, WifiInfo)
-     * @hide
-     */
-    public void setMeteredHint(boolean meteredHint) {
-        mMeteredHint = meteredHint;
-    }
-
-    /** {@hide} */
-    @UnsupportedAppUsage
-    public boolean getMeteredHint() {
-        return mMeteredHint;
-    }
-
-    /** {@hide} */
-    public void setEphemeral(boolean ephemeral) {
-        mEphemeral = ephemeral;
-    }
-
-    /**
-     * Returns true if the current Wifi network is ephemeral, false otherwise.
-     * An ephemeral network is a network that is temporary and not persisted in the system.
-     * Ephemeral networks cannot be forgotten, only disabled with
-     * {@link WifiManager#disableEphemeralNetwork(String)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public boolean isEphemeral() {
-        return mEphemeral;
-    }
-
-    /** {@hide} */
-    public void setTrusted(boolean trusted) {
-        mTrusted = trusted;
-    }
-
-    /** {@hide} */
-    public boolean isTrusted() {
-        return mTrusted;
-    }
-
-    /** {@hide} */
-    public void setOsuAp(boolean osuAp) {
-        mOsuAp = osuAp;
-    }
-
-    /** {@hide} */
-    @SystemApi
-    public boolean isOsuAp() {
-        return mOsuAp;
-    }
-
-    /** {@hide} */
-    @SystemApi
-    public boolean isPasspointAp() {
-        return mFqdn != null && mProviderFriendlyName != null;
-    }
-
-    /** {@hide} */
-    public void setFQDN(@Nullable String fqdn) {
-        mFqdn = fqdn;
-    }
-
-    /**
-     * Returns the Fully Qualified Domain Name of the network if it is a Passpoint network.
-     * <p>
-     * The FQDN may be
-     * <lt>{@code null} if no network currently connected, currently connected network is not
-     * passpoint network or the caller has insufficient permissions to access the FQDN.</lt>
-     * </p>
-     */
-    public @Nullable String getPasspointFqdn() {
-        return mFqdn;
-    }
-
-    /** {@hide} */
-    public void setProviderFriendlyName(@Nullable String providerFriendlyName) {
-        mProviderFriendlyName = providerFriendlyName;
-    }
-
-    /**
-     * Returns the Provider Friendly Name of the network if it is a Passpoint network.
-     * <p>
-     * The Provider Friendly Name may be
-     * <lt>{@code null} if no network currently connected, currently connected network is not
-     * passpoint network or the caller has insufficient permissions to access the Provider Friendly
-     * Name. </lt>
-     * </p>
-     */
-    public @Nullable String getPasspointProviderFriendlyName() {
-        return mProviderFriendlyName;
-    }
-
-    /** {@hide} */
-    public void setRequestingPackageName(@Nullable String packageName) {
-        mRequestingPackageName = packageName;
-    }
-
-    /**
-     * If this network was created in response to an app request (e.g. through Network Suggestion
-     * or Network Specifier), return the package name of the app that made the request.
-     * Null otherwise.
-     * @hide
-     */
-    @SystemApi
-    public @Nullable String getRequestingPackageName() {
-        return mRequestingPackageName;
-    }
-
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setNetworkId(int id) {
-        mNetworkId = id;
-    }
-
-    /**
-     * Each configured network has a unique small integer ID, used to identify
-     * the network. This method returns the ID for the currently connected network.
-     * <p>
-     * The networkId may be {@code -1} if there is no currently connected network or if the caller
-     * has insufficient permissions to access the network ID.
-     * </p>
-     *
-     * @return the network ID.
-     */
-    public int getNetworkId() {
-        return mNetworkId;
-    }
-
-    /**
-     * Return the detailed state of the supplicant's negotiation with an
-     * access point, in the form of a {@link SupplicantState SupplicantState} object.
-     * @return the current {@link SupplicantState SupplicantState}
-     */
-    public SupplicantState getSupplicantState() {
-        return mSupplicantState;
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setSupplicantState(SupplicantState state) {
-        mSupplicantState = state;
-    }
-
-    /** @hide */
-    public void setInetAddress(InetAddress address) {
-        mIpAddress = address;
-    }
-
-    public int getIpAddress() {
-        int result = 0;
-        if (mIpAddress instanceof Inet4Address) {
-            result = Inet4AddressUtils.inet4AddressToIntHTL((Inet4Address) mIpAddress);
-        }
-        return result;
-    }
-
-    /**
-     * @return {@code true} if this network does not broadcast its SSID, so an
-     * SSID-specific probe request must be used for scans.
-     */
-    public boolean getHiddenSSID() {
-        if (mWifiSsid == null) return false;
-        return mWifiSsid.isHidden();
-    }
-
-    /**
-     * Map a supplicant state into a fine-grained network connectivity state.
-     * @param suppState the supplicant state
-     * @return the corresponding {@link DetailedState}
-     */
-    public static DetailedState getDetailedStateOf(SupplicantState suppState) {
-        return stateMap.get(suppState);
-    }
-
-    /**
-     * Set the <code>SupplicantState</code> from the string name
-     * of the state.
-     * @param stateName the name of the state, as a <code>String</code> returned
-     * in an event sent by {@code wpa_supplicant}.
-     */
-    @UnsupportedAppUsage
-    void setSupplicantState(String stateName) {
-        mSupplicantState = valueOf(stateName);
-    }
-
-    static SupplicantState valueOf(String stateName) {
-        if ("4WAY_HANDSHAKE".equalsIgnoreCase(stateName))
-            return SupplicantState.FOUR_WAY_HANDSHAKE;
-        else {
-            try {
-                return SupplicantState.valueOf(stateName.toUpperCase(Locale.ROOT));
-            } catch (IllegalArgumentException e) {
-                return SupplicantState.INVALID;
-            }
-        }
-    }
-
-    /**
-     * Remove double quotes (") surrounding a SSID string, if present. Otherwise, return the
-     * string unmodified. Return null if the input string was null.
-     * @hide
-     */
-    @Nullable
-    @SystemApi
-    public static String sanitizeSsid(@Nullable String string) {
-        return removeDoubleQuotes(string);
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    @Nullable
-    public static String removeDoubleQuotes(@Nullable String string) {
-        if (string == null) return null;
-        final int length = string.length();
-        if ((length > 1) && (string.charAt(0) == '"') && (string.charAt(length - 1) == '"')) {
-            return string.substring(1, length - 1);
-        }
-        return string;
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sb = new StringBuffer();
-        String none = "<none>";
-
-        sb.append("SSID: ").append(mWifiSsid == null ? WifiManager.UNKNOWN_SSID : mWifiSsid)
-                .append(", BSSID: ").append(mBSSID == null ? none : mBSSID)
-                .append(", MAC: ").append(mMacAddress == null ? none : mMacAddress)
-                .append(", Supplicant state: ")
-                .append(mSupplicantState == null ? none : mSupplicantState)
-                .append(", Wi-Fi standard: ").append(mWifiStandard)
-                .append(", RSSI: ").append(mRssi)
-                .append(", Link speed: ").append(mLinkSpeed).append(LINK_SPEED_UNITS)
-                .append(", Tx Link speed: ").append(mTxLinkSpeed).append(LINK_SPEED_UNITS)
-                .append(", Max Supported Tx Link speed: ")
-                .append(mMaxSupportedTxLinkSpeed).append(LINK_SPEED_UNITS)
-                .append(", Rx Link speed: ").append(mRxLinkSpeed).append(LINK_SPEED_UNITS)
-                .append(", Max Supported Rx Link speed: ")
-                .append(mMaxSupportedRxLinkSpeed).append(LINK_SPEED_UNITS)
-                .append(", Frequency: ").append(mFrequency).append(FREQUENCY_UNITS)
-                .append(", Net ID: ").append(mNetworkId)
-                .append(", Metered hint: ").append(mMeteredHint)
-                .append(", score: ").append(Integer.toString(score));
-        return sb.toString();
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mNetworkId);
-        dest.writeInt(mRssi);
-        dest.writeInt(mLinkSpeed);
-        dest.writeInt(mTxLinkSpeed);
-        dest.writeInt(mRxLinkSpeed);
-        dest.writeInt(mFrequency);
-        if (mIpAddress != null) {
-            dest.writeByte((byte)1);
-            dest.writeByteArray(mIpAddress.getAddress());
-        } else {
-            dest.writeByte((byte)0);
-        }
-        if (mWifiSsid != null) {
-            dest.writeInt(1);
-            mWifiSsid.writeToParcel(dest, flags);
-        } else {
-            dest.writeInt(0);
-        }
-        dest.writeString(mBSSID);
-        dest.writeString(mMacAddress);
-        dest.writeInt(mMeteredHint ? 1 : 0);
-        dest.writeInt(mEphemeral ? 1 : 0);
-        dest.writeInt(mTrusted ? 1 : 0);
-        dest.writeInt(score);
-        dest.writeLong(txSuccess);
-        dest.writeDouble(mSuccessfulTxPacketsPerSecond);
-        dest.writeLong(txRetries);
-        dest.writeDouble(mTxRetriedTxPacketsPerSecond);
-        dest.writeLong(txBad);
-        dest.writeDouble(mLostTxPacketsPerSecond);
-        dest.writeLong(rxSuccess);
-        dest.writeDouble(mSuccessfulRxPacketsPerSecond);
-        mSupplicantState.writeToParcel(dest, flags);
-        dest.writeInt(mOsuAp ? 1 : 0);
-        dest.writeString(mRequestingPackageName);
-        dest.writeString(mFqdn);
-        dest.writeString(mProviderFriendlyName);
-        dest.writeInt(mWifiStandard);
-        dest.writeInt(mMaxSupportedTxLinkSpeed);
-        dest.writeInt(mMaxSupportedRxLinkSpeed);
-        dest.writeString(mPasspointUniqueId);
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    @UnsupportedAppUsage
-    public static final @android.annotation.NonNull Creator<WifiInfo> CREATOR =
-        new Creator<WifiInfo>() {
-            public WifiInfo createFromParcel(Parcel in) {
-                WifiInfo info = new WifiInfo();
-                info.setNetworkId(in.readInt());
-                info.setRssi(in.readInt());
-                info.setLinkSpeed(in.readInt());
-                info.setTxLinkSpeedMbps(in.readInt());
-                info.setRxLinkSpeedMbps(in.readInt());
-                info.setFrequency(in.readInt());
-                if (in.readByte() == 1) {
-                    try {
-                        info.setInetAddress(InetAddress.getByAddress(in.createByteArray()));
-                    } catch (UnknownHostException e) {}
-                }
-                if (in.readInt() == 1) {
-                    info.mWifiSsid = WifiSsid.CREATOR.createFromParcel(in);
-                }
-                info.mBSSID = in.readString();
-                info.mMacAddress = in.readString();
-                info.mMeteredHint = in.readInt() != 0;
-                info.mEphemeral = in.readInt() != 0;
-                info.mTrusted = in.readInt() != 0;
-                info.score = in.readInt();
-                info.txSuccess = in.readLong();
-                info.mSuccessfulTxPacketsPerSecond = in.readDouble();
-                info.txRetries = in.readLong();
-                info.mTxRetriedTxPacketsPerSecond = in.readDouble();
-                info.txBad = in.readLong();
-                info.mLostTxPacketsPerSecond = in.readDouble();
-                info.rxSuccess = in.readLong();
-                info.mSuccessfulRxPacketsPerSecond = in.readDouble();
-                info.mSupplicantState = SupplicantState.CREATOR.createFromParcel(in);
-                info.mOsuAp = in.readInt() != 0;
-                info.mRequestingPackageName = in.readString();
-                info.mFqdn = in.readString();
-                info.mProviderFriendlyName = in.readString();
-                info.mWifiStandard = in.readInt();
-                info.mMaxSupportedTxLinkSpeed = in.readInt();
-                info.mMaxSupportedRxLinkSpeed = in.readInt();
-                info.mPasspointUniqueId = in.readString();
-                return info;
-            }
-
-            public WifiInfo[] newArray(int size) {
-                return new WifiInfo[size];
-            }
-        };
-
-    /**
-     * Set the Passpoint unique identifier for the current connection
-     *
-     * @param passpointUniqueId Unique identifier
-     * @hide
-     */
-    public void setPasspointUniqueId(@Nullable String passpointUniqueId) {
-        mPasspointUniqueId = passpointUniqueId;
-    }
-
-    /**
-     * Get the Passpoint unique identifier for the current connection
-     *
-     * @return Passpoint unique identifier
-     * @hide
-     */
-    public @Nullable String getPasspointUniqueId() {
-        return mPasspointUniqueId;
-    }
-}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
deleted file mode 100644
index ccf8a80..0000000
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ /dev/null
@@ -1,6239 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static android.Manifest.permission.ACCESS_FINE_LOCATION;
-import static android.Manifest.permission.ACCESS_WIFI_STATE;
-import static android.Manifest.permission.READ_WIFI_CREDENTIAL;
-
-import android.annotation.CallbackExecutor;
-import android.annotation.IntDef;
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.RequiresPermission;
-import android.annotation.SdkConstant;
-import android.annotation.SdkConstant.SdkConstantType;
-import android.annotation.SuppressLint;
-import android.annotation.SystemApi;
-import android.annotation.SystemService;
-import android.app.ActivityManager;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.content.Context;
-import android.content.pm.ParceledListSlice;
-import android.net.ConnectivityManager;
-import android.net.DhcpInfo;
-import android.net.MacAddress;
-import android.net.Network;
-import android.net.NetworkStack;
-import android.net.wifi.hotspot2.IProvisioningCallback;
-import android.net.wifi.hotspot2.OsuProvider;
-import android.net.wifi.hotspot2.PasspointConfiguration;
-import android.net.wifi.hotspot2.ProvisioningCallback;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Handler;
-import android.os.HandlerExecutor;
-import android.os.IBinder;
-import android.os.Looper;
-import android.os.RemoteException;
-import android.os.WorkSource;
-import android.os.connectivity.WifiActivityEnergyInfo;
-import android.text.TextUtils;
-import android.util.CloseGuard;
-import android.util.Log;
-import android.util.Pair;
-import android.util.SparseArray;
-
-import com.android.internal.annotations.GuardedBy;
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.Reference;
-import java.lang.ref.WeakReference;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.concurrent.Executor;
-
-/**
- * This class provides the primary API for managing all aspects of Wi-Fi
- * connectivity.
- * <p>
- * On releases before {@link android.os.Build.VERSION_CODES#N}, this object
- * should only be obtained from an {@linkplain Context#getApplicationContext()
- * application context}, and not from any other derived context to avoid memory
- * leaks within the calling process.
- * <p>
- * It deals with several categories of items:
- * </p>
- * <ul>
- * <li>The list of configured networks. The list can be viewed and updated, and
- * attributes of individual entries can be modified.</li>
- * <li>The currently active Wi-Fi network, if any. Connectivity can be
- * established or torn down, and dynamic information about the state of the
- * network can be queried.</li>
- * <li>Results of access point scans, containing enough information to make
- * decisions about what access point to connect to.</li>
- * <li>It defines the names of various Intent actions that are broadcast upon
- * any sort of change in Wi-Fi state.
- * </ul>
- * <p>
- * This is the API to use when performing Wi-Fi specific operations. To perform
- * operations that pertain to network connectivity at an abstract level, use
- * {@link android.net.ConnectivityManager}.
- * </p>
- */
-@SystemService(Context.WIFI_SERVICE)
-public class WifiManager {
-
-    private static final String TAG = "WifiManager";
-    // Supplicant error codes:
-    /**
-     * The error code if there was a problem authenticating.
-     * @deprecated This is no longer supported.
-     */
-    @Deprecated
-    public static final int ERROR_AUTHENTICATING = 1;
-
-    /**
-     * The reason code if there is no error during authentication.
-     * It could also imply that there no authentication in progress,
-     * this reason code also serves as a reset value.
-     * @deprecated This is no longer supported.
-     * @hide
-     */
-    @Deprecated
-    public static final int ERROR_AUTH_FAILURE_NONE = 0;
-
-    /**
-     * The reason code if there was a timeout authenticating.
-     * @deprecated This is no longer supported.
-     * @hide
-     */
-    @Deprecated
-    public static final int ERROR_AUTH_FAILURE_TIMEOUT = 1;
-
-    /**
-     * The reason code if there was a wrong password while
-     * authenticating.
-     * @deprecated This is no longer supported.
-     * @hide
-     */
-    @Deprecated
-    public static final int ERROR_AUTH_FAILURE_WRONG_PSWD = 2;
-
-    /**
-     * The reason code if there was EAP failure while
-     * authenticating.
-     * @deprecated This is no longer supported.
-     * @hide
-     */
-    @Deprecated
-    public static final int ERROR_AUTH_FAILURE_EAP_FAILURE = 3;
-
-    /** @hide */
-    public static final int NETWORK_SUGGESTIONS_MAX_PER_APP_LOW_RAM = 256;
-
-    /** @hide */
-    public static final int NETWORK_SUGGESTIONS_MAX_PER_APP_HIGH_RAM = 1024;
-
-    /**
-     * Reason code if all of the network suggestions were successfully added or removed.
-     */
-    public static final int STATUS_NETWORK_SUGGESTIONS_SUCCESS = 0;
-
-    /**
-     * Reason code if there was an internal error in the platform while processing the addition or
-     * removal of suggestions.
-     */
-    public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_INTERNAL = 1;
-
-    /**
-     * Reason code if the user has disallowed "android:change_wifi_state" app-ops from the app.
-     * @see android.app.AppOpsManager#unsafeCheckOp(String, int, String).
-     */
-    public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_APP_DISALLOWED = 2;
-
-    /**
-     * Reason code if one or more of the network suggestions added already exists in platform's
-     * database.
-     * Note: this code will not be returned with Android 11 as in-place modification is allowed,
-     * please check {@link #addNetworkSuggestions(List)}.
-     * @see WifiNetworkSuggestion#equals(Object)
-     */
-    public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE = 3;
-
-    /**
-     * Reason code if the number of network suggestions provided by the app crosses the max
-     * threshold set per app.
-     * The framework will reject all suggestions provided by {@link #addNetworkSuggestions(List)} if
-     * the total size exceeds the limit.
-     * @see #getMaxNumberOfNetworkSuggestionsPerApp()
-     */
-    public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_EXCEEDS_MAX_PER_APP = 4;
-
-    /**
-     * Reason code if one or more of the network suggestions removed does not exist in platform's
-     * database.
-     * The framework won't remove any suggestions if one or more of suggestions provided
-     * by {@link #removeNetworkSuggestions(List)} does not exist in database.
-     * @see WifiNetworkSuggestion#equals(Object)
-     */
-    public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID = 5;
-
-    /**
-     * Reason code if one or more of the network suggestions added is not allowed.
-     * The framework will reject all suggestions provided by {@link #addNetworkSuggestions(List)}
-     * if one or more of them is not allowed.
-     * This error may be caused by suggestion is using SIM-based encryption method, but calling app
-     * is not carrier privileged.
-     */
-    public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_NOT_ALLOWED = 6;
-
-    /**
-     * Reason code if one or more of the network suggestions added is invalid. Framework will reject
-     * all the suggestions in the list.
-     * The framework will reject all suggestions provided by {@link #addNetworkSuggestions(List)}
-     * if one or more of them is invalid.
-     * Please use {@link WifiNetworkSuggestion.Builder} to create network suggestions.
-     */
-    public static final int STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_INVALID = 7;
-
-    /** @hide */
-    @IntDef(prefix = { "STATUS_NETWORK_SUGGESTIONS_" }, value = {
-            STATUS_NETWORK_SUGGESTIONS_SUCCESS,
-            STATUS_NETWORK_SUGGESTIONS_ERROR_INTERNAL,
-            STATUS_NETWORK_SUGGESTIONS_ERROR_APP_DISALLOWED,
-            STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_DUPLICATE,
-            STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_EXCEEDS_MAX_PER_APP,
-            STATUS_NETWORK_SUGGESTIONS_ERROR_REMOVE_INVALID,
-            STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_NOT_ALLOWED,
-            STATUS_NETWORK_SUGGESTIONS_ERROR_ADD_INVALID,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface NetworkSuggestionsStatusCode {}
-
-    /**
-     * Reason code if suggested network connection attempt failed with an unknown failure.
-     */
-    public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_UNKNOWN = 0;
-    /**
-     * Reason code if suggested network connection attempt failed with association failure.
-     */
-    public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_ASSOCIATION = 1;
-    /**
-     * Reason code if suggested network connection attempt failed with an authentication failure.
-     */
-    public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_AUTHENTICATION = 2;
-    /**
-     * Reason code if suggested network connection attempt failed with an IP provision failure.
-     */
-    public static final int STATUS_SUGGESTION_CONNECTION_FAILURE_IP_PROVISIONING = 3;
-
-    /** @hide */
-    @IntDef(prefix = {"STATUS_SUGGESTION_CONNECTION_FAILURE_"},
-            value = {STATUS_SUGGESTION_CONNECTION_FAILURE_UNKNOWN,
-                    STATUS_SUGGESTION_CONNECTION_FAILURE_ASSOCIATION,
-                    STATUS_SUGGESTION_CONNECTION_FAILURE_AUTHENTICATION,
-                    STATUS_SUGGESTION_CONNECTION_FAILURE_IP_PROVISIONING
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface SuggestionConnectionStatusCode {}
-
-    /**
-     * Broadcast intent action indicating whether Wi-Fi scanning is currently available.
-     * Available extras:
-     * - {@link #EXTRA_SCAN_AVAILABLE}
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String ACTION_WIFI_SCAN_AVAILABILITY_CHANGED =
-            "android.net.wifi.action.WIFI_SCAN_AVAILABILITY_CHANGED";
-
-    /**
-     * A boolean extra indicating whether scanning is currently available.
-     * Sent in the broadcast {@link #ACTION_WIFI_SCAN_AVAILABILITY_CHANGED}.
-     * Its value is true if scanning is currently available, false otherwise.
-     */
-    public static final String EXTRA_SCAN_AVAILABLE = "android.net.wifi.extra.SCAN_AVAILABLE";
-
-    /**
-     * Broadcast intent action indicating that the credential of a Wi-Fi network
-     * has been changed. One extra provides the ssid of the network. Another
-     * extra provides the event type, whether the credential is saved or forgot.
-     * @hide
-     */
-    @SystemApi
-    public static final String WIFI_CREDENTIAL_CHANGED_ACTION =
-            "android.net.wifi.WIFI_CREDENTIAL_CHANGED";
-    /** @hide */
-    @SystemApi
-    public static final String EXTRA_WIFI_CREDENTIAL_EVENT_TYPE = "et";
-    /** @hide */
-    @SystemApi
-    public static final String EXTRA_WIFI_CREDENTIAL_SSID = "ssid";
-    /** @hide */
-    @SystemApi
-    public static final int WIFI_CREDENTIAL_SAVED = 0;
-    /** @hide */
-    @SystemApi
-    public static final int WIFI_CREDENTIAL_FORGOT = 1;
-
-    /** @hide */
-    @SystemApi
-    public static final int PASSPOINT_HOME_NETWORK = 0;
-
-    /** @hide */
-    @SystemApi
-    public static final int PASSPOINT_ROAMING_NETWORK = 1;
-
-    /**
-     * Broadcast intent action indicating that a Passpoint provider icon has been received.
-     *
-     * Included extras:
-     * {@link #EXTRA_BSSID_LONG}
-     * {@link #EXTRA_FILENAME}
-     * {@link #EXTRA_ICON}
-     *
-     * Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
-     *
-     * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
-     * components will be launched.
-     *
-     * @hide
-     */
-    public static final String ACTION_PASSPOINT_ICON = "android.net.wifi.action.PASSPOINT_ICON";
-    /**
-     * BSSID of an AP in long representation.  The {@link #EXTRA_BSSID} contains BSSID in
-     * String representation.
-     *
-     * Retrieve with {@link android.content.Intent#getLongExtra(String, long)}.
-     *
-     * @hide
-     */
-    public static final String EXTRA_BSSID_LONG = "android.net.wifi.extra.BSSID_LONG";
-    /**
-     * Icon data.
-     *
-     * Retrieve with {@link android.content.Intent#getParcelableExtra(String)} and cast into
-     * {@link android.graphics.drawable.Icon}.
-     *
-     * @hide
-     */
-    public static final String EXTRA_ICON = "android.net.wifi.extra.ICON";
-    /**
-     * Name of a file.
-     *
-     * Retrieve with {@link android.content.Intent#getStringExtra(String)}.
-     *
-     * @hide
-     */
-    public static final String EXTRA_FILENAME = "android.net.wifi.extra.FILENAME";
-
-    /**
-     * Broadcast intent action indicating a Passpoint OSU Providers List element has been received.
-     *
-     * Included extras:
-     * {@link #EXTRA_BSSID_LONG}
-     * {@link #EXTRA_ANQP_ELEMENT_DATA}
-     *
-     * Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
-     *
-     * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
-     * components will be launched.
-     *
-     * @hide
-     */
-    public static final String ACTION_PASSPOINT_OSU_PROVIDERS_LIST =
-            "android.net.wifi.action.PASSPOINT_OSU_PROVIDERS_LIST";
-    /**
-     * Raw binary data of an ANQP (Access Network Query Protocol) element.
-     *
-     * Retrieve with {@link android.content.Intent#getByteArrayExtra(String)}.
-     *
-     * @hide
-     */
-    public static final String EXTRA_ANQP_ELEMENT_DATA =
-            "android.net.wifi.extra.ANQP_ELEMENT_DATA";
-
-    /**
-     * Broadcast intent action indicating that a Passpoint Deauth Imminent frame has been received.
-     *
-     * Included extras:
-     * {@link #EXTRA_BSSID_LONG}
-     * {@link #EXTRA_ESS}
-     * {@link #EXTRA_DELAY}
-     * {@link #EXTRA_URL}
-     *
-     * Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
-     *
-     * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
-     * components will be launched.
-     *
-     * @hide
-     */
-    public static final String ACTION_PASSPOINT_DEAUTH_IMMINENT =
-            "android.net.wifi.action.PASSPOINT_DEAUTH_IMMINENT";
-    /**
-     * Flag indicating BSS (Basic Service Set) or ESS (Extended Service Set). This will be set to
-     * {@code true} for ESS.
-     *
-     * Retrieve with {@link android.content.Intent#getBooleanExtra(String, boolean)}.
-     *
-     * @hide
-     */
-    public static final String EXTRA_ESS = "android.net.wifi.extra.ESS";
-    /**
-     * Delay in seconds.
-     *
-     * Retrieve with {@link android.content.Intent#getIntExtra(String, int)}.
-     *
-     * @hide
-     */
-    public static final String EXTRA_DELAY = "android.net.wifi.extra.DELAY";
-
-    /**
-     * Broadcast intent action indicating a Passpoint subscription remediation frame has been
-     * received.
-     *
-     * Included extras:
-     * {@link #EXTRA_BSSID_LONG}
-     * {@link #EXTRA_SUBSCRIPTION_REMEDIATION_METHOD}
-     * {@link #EXTRA_URL}
-     *
-     * Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
-     *
-     * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
-     * components will be launched.
-     *
-     * @hide
-     */
-    public static final String ACTION_PASSPOINT_SUBSCRIPTION_REMEDIATION =
-            "android.net.wifi.action.PASSPOINT_SUBSCRIPTION_REMEDIATION";
-    /**
-     * The protocol supported by the subscription remediation server. The possible values are:
-     * 0 - OMA DM
-     * 1 - SOAP XML SPP
-     *
-     * Retrieve with {@link android.content.Intent#getIntExtra(String, int)}.
-     *
-     * @hide
-     */
-    public static final String EXTRA_SUBSCRIPTION_REMEDIATION_METHOD =
-            "android.net.wifi.extra.SUBSCRIPTION_REMEDIATION_METHOD";
-
-    /**
-     * Activity Action: Receiver should launch Passpoint OSU (Online Sign Up) view.
-     * Included extras:
-     *
-     * {@link #EXTRA_OSU_NETWORK}: {@link Network} instance associated with OSU AP.
-     * {@link #EXTRA_URL}: String representation of a server URL used for OSU process.
-     *
-     * @hide
-     */
-    @SystemApi
-    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ACTION_PASSPOINT_LAUNCH_OSU_VIEW =
-            "android.net.wifi.action.PASSPOINT_LAUNCH_OSU_VIEW";
-
-    /**
-     * The lookup key for a {@link android.net.Network} associated with a Passpoint OSU server.
-     * Included in the {@link #ACTION_PASSPOINT_LAUNCH_OSU_VIEW} broadcast.
-     *
-     * Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_OSU_NETWORK = "android.net.wifi.extra.OSU_NETWORK";
-
-    /**
-     * String representation of an URL for Passpoint OSU.
-     * Included in the {@link #ACTION_PASSPOINT_LAUNCH_OSU_VIEW} broadcast.
-     *
-     * Retrieve with {@link android.content.Intent#getStringExtra(String)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_URL = "android.net.wifi.extra.URL";
-
-    /**
-     * Broadcast intent action indicating that Wi-Fi has been enabled, disabled,
-     * enabling, disabling, or unknown. One extra provides this state as an int.
-     * Another extra provides the previous state, if available.  No network-related
-     * permissions are required to subscribe to this broadcast.
-     *
-     * <p class="note">This broadcast is not delivered to manifest receivers in
-     * applications that target API version 26 or later.
-     *
-     * @see #EXTRA_WIFI_STATE
-     * @see #EXTRA_PREVIOUS_WIFI_STATE
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String WIFI_STATE_CHANGED_ACTION =
-        "android.net.wifi.WIFI_STATE_CHANGED";
-    /**
-     * The lookup key for an int that indicates whether Wi-Fi is enabled,
-     * disabled, enabling, disabling, or unknown.  Retrieve it with
-     * {@link android.content.Intent#getIntExtra(String,int)}.
-     *
-     * @see #WIFI_STATE_DISABLED
-     * @see #WIFI_STATE_DISABLING
-     * @see #WIFI_STATE_ENABLED
-     * @see #WIFI_STATE_ENABLING
-     * @see #WIFI_STATE_UNKNOWN
-     */
-    public static final String EXTRA_WIFI_STATE = "wifi_state";
-    /**
-     * The previous Wi-Fi state.
-     *
-     * @see #EXTRA_WIFI_STATE
-     */
-    public static final String EXTRA_PREVIOUS_WIFI_STATE = "previous_wifi_state";
-
-    /**
-     * Wi-Fi is currently being disabled. The state will change to {@link #WIFI_STATE_DISABLED} if
-     * it finishes successfully.
-     *
-     * @see #WIFI_STATE_CHANGED_ACTION
-     * @see #getWifiState()
-     */
-    public static final int WIFI_STATE_DISABLING = 0;
-    /**
-     * Wi-Fi is disabled.
-     *
-     * @see #WIFI_STATE_CHANGED_ACTION
-     * @see #getWifiState()
-     */
-    public static final int WIFI_STATE_DISABLED = 1;
-    /**
-     * Wi-Fi is currently being enabled. The state will change to {@link #WIFI_STATE_ENABLED} if
-     * it finishes successfully.
-     *
-     * @see #WIFI_STATE_CHANGED_ACTION
-     * @see #getWifiState()
-     */
-    public static final int WIFI_STATE_ENABLING = 2;
-    /**
-     * Wi-Fi is enabled.
-     *
-     * @see #WIFI_STATE_CHANGED_ACTION
-     * @see #getWifiState()
-     */
-    public static final int WIFI_STATE_ENABLED = 3;
-    /**
-     * Wi-Fi is in an unknown state. This state will occur when an error happens while enabling
-     * or disabling.
-     *
-     * @see #WIFI_STATE_CHANGED_ACTION
-     * @see #getWifiState()
-     */
-    public static final int WIFI_STATE_UNKNOWN = 4;
-
-    /**
-     * Broadcast intent action indicating that Wi-Fi AP has been enabled, disabled,
-     * enabling, disabling, or failed.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String WIFI_AP_STATE_CHANGED_ACTION =
-        "android.net.wifi.WIFI_AP_STATE_CHANGED";
-
-    /**
-     * The lookup key for an int that indicates whether Wi-Fi AP is enabled,
-     * disabled, enabling, disabling, or failed.  Retrieve it with
-     * {@link android.content.Intent#getIntExtra(String,int)}.
-     *
-     * @see #WIFI_AP_STATE_DISABLED
-     * @see #WIFI_AP_STATE_DISABLING
-     * @see #WIFI_AP_STATE_ENABLED
-     * @see #WIFI_AP_STATE_ENABLING
-     * @see #WIFI_AP_STATE_FAILED
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_WIFI_AP_STATE = "wifi_state";
-
-    /**
-     * An extra containing the int error code for Soft AP start failure.
-     * Can be obtained from the {@link #WIFI_AP_STATE_CHANGED_ACTION} using
-     * {@link android.content.Intent#getIntExtra}.
-     * This extra will only be attached if {@link #EXTRA_WIFI_AP_STATE} is
-     * attached and is equal to {@link #WIFI_AP_STATE_FAILED}.
-     *
-     * The error code will be one of:
-     * {@link #SAP_START_FAILURE_GENERAL},
-     * {@link #SAP_START_FAILURE_NO_CHANNEL},
-     * {@link #SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION}
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_WIFI_AP_FAILURE_REASON =
-            "android.net.wifi.extra.WIFI_AP_FAILURE_REASON";
-    /**
-     * The previous Wi-Fi state.
-     *
-     * @see #EXTRA_WIFI_AP_STATE
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_PREVIOUS_WIFI_AP_STATE = "previous_wifi_state";
-    /**
-     * The lookup key for a String extra that stores the interface name used for the Soft AP.
-     * This extra is included in the broadcast {@link #WIFI_AP_STATE_CHANGED_ACTION}.
-     * Retrieve its value with {@link android.content.Intent#getStringExtra(String)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_WIFI_AP_INTERFACE_NAME =
-            "android.net.wifi.extra.WIFI_AP_INTERFACE_NAME";
-    /**
-     * The lookup key for an int extra that stores the intended IP mode for this Soft AP.
-     * One of {@link #IFACE_IP_MODE_TETHERED} or {@link #IFACE_IP_MODE_LOCAL_ONLY}.
-     * This extra is included in the broadcast {@link #WIFI_AP_STATE_CHANGED_ACTION}.
-     * Retrieve its value with {@link android.content.Intent#getIntExtra(String, int)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_WIFI_AP_MODE = "android.net.wifi.extra.WIFI_AP_MODE";
-
-    /** @hide */
-    @IntDef(flag = false, prefix = { "WIFI_AP_STATE_" }, value = {
-        WIFI_AP_STATE_DISABLING,
-        WIFI_AP_STATE_DISABLED,
-        WIFI_AP_STATE_ENABLING,
-        WIFI_AP_STATE_ENABLED,
-        WIFI_AP_STATE_FAILED,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface WifiApState {}
-
-    /**
-     * Wi-Fi AP is currently being disabled. The state will change to
-     * {@link #WIFI_AP_STATE_DISABLED} if it finishes successfully.
-     *
-     * @see #WIFI_AP_STATE_CHANGED_ACTION
-     * @see #getWifiApState()
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int WIFI_AP_STATE_DISABLING = 10;
-    /**
-     * Wi-Fi AP is disabled.
-     *
-     * @see #WIFI_AP_STATE_CHANGED_ACTION
-     * @see #getWifiState()
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int WIFI_AP_STATE_DISABLED = 11;
-    /**
-     * Wi-Fi AP is currently being enabled. The state will change to
-     * {@link #WIFI_AP_STATE_ENABLED} if it finishes successfully.
-     *
-     * @see #WIFI_AP_STATE_CHANGED_ACTION
-     * @see #getWifiApState()
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int WIFI_AP_STATE_ENABLING = 12;
-    /**
-     * Wi-Fi AP is enabled.
-     *
-     * @see #WIFI_AP_STATE_CHANGED_ACTION
-     * @see #getWifiApState()
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int WIFI_AP_STATE_ENABLED = 13;
-    /**
-     * Wi-Fi AP is in a failed state. This state will occur when an error occurs during
-     * enabling or disabling
-     *
-     * @see #WIFI_AP_STATE_CHANGED_ACTION
-     * @see #getWifiApState()
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int WIFI_AP_STATE_FAILED = 14;
-
-    /** @hide */
-    @IntDef(flag = false, prefix = { "SAP_START_FAILURE_" }, value = {
-        SAP_START_FAILURE_GENERAL,
-        SAP_START_FAILURE_NO_CHANNEL,
-        SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface SapStartFailure {}
-
-    /**
-     *  All other reasons for AP start failure besides {@link #SAP_START_FAILURE_NO_CHANNEL} and
-     *  {@link #SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION}.
-     *
-     *  @hide
-     */
-    @SystemApi
-    public static final int SAP_START_FAILURE_GENERAL= 0;
-
-    /**
-     *  If Wi-Fi AP start failed, this reason code means that no legal channel exists on user
-     *  selected band due to regulatory constraints.
-     *
-     *  @hide
-     */
-    @SystemApi
-    public static final int SAP_START_FAILURE_NO_CHANNEL = 1;
-
-    /**
-     *  If Wi-Fi AP start failed, this reason code means that the specified configuration
-     *  is not supported by the current HAL version.
-     *
-     *  @hide
-     */
-    @SystemApi
-    public static final int SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION = 2;
-
-
-    /** @hide */
-    @IntDef(flag = false, prefix = { "SAP_CLIENT_BLOCKED_REASON_" }, value = {
-        SAP_CLIENT_BLOCK_REASON_CODE_BLOCKED_BY_USER,
-        SAP_CLIENT_BLOCK_REASON_CODE_NO_MORE_STAS,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface SapClientBlockedReason {}
-
-    /**
-     *  If Soft Ap client is blocked, this reason code means that client doesn't exist in the
-     *  specified configuration {@link SoftApConfiguration.Builder#setBlockedClientList(List)}
-     *  and {@link SoftApConfiguration.Builder#setAllowedClientList(List)}
-     *  and the {@link SoftApConfiguration.Builder#setClientControlByUserEnabled(boolean)}
-     *  is configured as well.
-     *  @hide
-     */
-    @SystemApi
-    public static final int SAP_CLIENT_BLOCK_REASON_CODE_BLOCKED_BY_USER = 0;
-
-    /**
-     *  If Soft Ap client is blocked, this reason code means that no more clients can be
-     *  associated to this AP since it reached maximum capacity. The maximum capacity is
-     *  the minimum of {@link SoftApConfiguration.Builder#setMaxNumberOfClients(int)} and
-     *  {@link SoftApCapability#getMaxSupportedClients} which get from
-     *  {@link WifiManager.SoftApCallback#onCapabilityChanged(SoftApCapability)}.
-     *
-     *  @hide
-     */
-    @SystemApi
-    public static final int SAP_CLIENT_BLOCK_REASON_CODE_NO_MORE_STAS = 1;
-
-    /**
-     * Client disconnected for unspecified reason. This could for example be because the AP is being
-     * shut down.
-     * @hide
-     */
-    public static final int SAP_CLIENT_DISCONNECT_REASON_CODE_UNSPECIFIED = 2;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"IFACE_IP_MODE_"}, value = {
-            IFACE_IP_MODE_UNSPECIFIED,
-            IFACE_IP_MODE_CONFIGURATION_ERROR,
-            IFACE_IP_MODE_TETHERED,
-            IFACE_IP_MODE_LOCAL_ONLY})
-    public @interface IfaceIpMode {}
-
-    /**
-     * Interface IP mode unspecified.
-     *
-     * @see #updateInterfaceIpState(String, int)
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int IFACE_IP_MODE_UNSPECIFIED = -1;
-
-    /**
-     * Interface IP mode for configuration error.
-     *
-     * @see #updateInterfaceIpState(String, int)
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int IFACE_IP_MODE_CONFIGURATION_ERROR = 0;
-
-    /**
-     * Interface IP mode for tethering.
-     *
-     * @see #updateInterfaceIpState(String, int)
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int IFACE_IP_MODE_TETHERED = 1;
-
-    /**
-     * Interface IP mode for Local Only Hotspot.
-     *
-     * @see #updateInterfaceIpState(String, int)
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int IFACE_IP_MODE_LOCAL_ONLY = 2;
-
-    /**
-     * Broadcast intent action indicating that the wifi network settings
-     * had been reset.
-     *
-     * Note: This intent is sent as a directed broadcast to each manifest registered receiver.
-     * Intent will not be received by dynamically registered receivers.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_CARRIER_PROVISIONING)
-    public static final String ACTION_NETWORK_SETTINGS_RESET =
-            "android.net.wifi.action.NETWORK_SETTINGS_RESET";
-
-    /**
-     * Broadcast intent action indicating that a connection to the supplicant has
-     * been established (and it is now possible
-     * to perform Wi-Fi operations) or the connection to the supplicant has been
-     * lost. One extra provides the connection state as a boolean, where {@code true}
-     * means CONNECTED.
-     * @deprecated This is no longer supported.
-     * @see #EXTRA_SUPPLICANT_CONNECTED
-     */
-    @Deprecated
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String SUPPLICANT_CONNECTION_CHANGE_ACTION =
-        "android.net.wifi.supplicant.CONNECTION_CHANGE";
-    /**
-     * The lookup key for a boolean that indicates whether a connection to
-     * the supplicant daemon has been gained or lost. {@code true} means
-     * a connection now exists.
-     * Retrieve it with {@link android.content.Intent#getBooleanExtra(String,boolean)}.
-     * @deprecated This is no longer supported.
-     */
-    @Deprecated
-    public static final String EXTRA_SUPPLICANT_CONNECTED = "connected";
-    /**
-     * Broadcast intent action indicating that the state of Wi-Fi connectivity
-     * has changed. An extra provides the new state
-     * in the form of a {@link android.net.NetworkInfo} object.  No network-related
-     * permissions are required to subscribe to this broadcast.
-     *
-     * <p class="note">This broadcast is not delivered to manifest receivers in
-     * applications that target API version 26 or later.
-     * @see #EXTRA_NETWORK_INFO
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String NETWORK_STATE_CHANGED_ACTION = "android.net.wifi.STATE_CHANGE";
-    /**
-     * The lookup key for a {@link android.net.NetworkInfo} object associated with the
-     * Wi-Fi network. Retrieve with
-     * {@link android.content.Intent#getParcelableExtra(String)}.
-     */
-    public static final String EXTRA_NETWORK_INFO = "networkInfo";
-    /**
-     * The lookup key for a String giving the BSSID of the access point to which
-     * we are connected. No longer used.
-     */
-    @Deprecated
-    public static final String EXTRA_BSSID = "bssid";
-    /**
-     * The lookup key for a {@link android.net.wifi.WifiInfo} object giving the
-     * information about the access point to which we are connected.
-     * No longer used.
-     */
-    @Deprecated
-    public static final String EXTRA_WIFI_INFO = "wifiInfo";
-    /**
-     * Broadcast intent action indicating that the state of establishing a connection to
-     * an access point has changed.One extra provides the new
-     * {@link SupplicantState}. Note that the supplicant state is Wi-Fi specific, and
-     * is not generally the most useful thing to look at if you are just interested in
-     * the overall state of connectivity.
-     * @see #EXTRA_NEW_STATE
-     * @see #EXTRA_SUPPLICANT_ERROR
-     * @deprecated This is no longer supported.
-     */
-    @Deprecated
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String SUPPLICANT_STATE_CHANGED_ACTION =
-        "android.net.wifi.supplicant.STATE_CHANGE";
-    /**
-     * The lookup key for a {@link SupplicantState} describing the new state
-     * Retrieve with
-     * {@link android.content.Intent#getParcelableExtra(String)}.
-     * @deprecated This is no longer supported.
-     */
-    @Deprecated
-    public static final String EXTRA_NEW_STATE = "newState";
-
-    /**
-     * The lookup key for a {@link SupplicantState} describing the supplicant
-     * error code if any
-     * Retrieve with
-     * {@link android.content.Intent#getIntExtra(String, int)}.
-     * @see #ERROR_AUTHENTICATING
-     * @deprecated This is no longer supported.
-     */
-    @Deprecated
-    public static final String EXTRA_SUPPLICANT_ERROR = "supplicantError";
-
-    /**
-     * The lookup key for a {@link SupplicantState} describing the supplicant
-     * error reason if any
-     * Retrieve with
-     * {@link android.content.Intent#getIntExtra(String, int)}.
-     * @see #ERROR_AUTH_FAILURE_#REASON_CODE
-     * @deprecated This is no longer supported.
-     * @hide
-     */
-    @Deprecated
-    public static final String EXTRA_SUPPLICANT_ERROR_REASON = "supplicantErrorReason";
-
-    /**
-     * Broadcast intent action indicating that the configured networks changed.
-     * This can be as a result of adding/updating/deleting a network.
-     * <br />
-     * {@link #EXTRA_CHANGE_REASON} contains whether the configuration was added/changed/removed.
-     * {@link #EXTRA_WIFI_CONFIGURATION} is never set starting in Android 11.
-     * {@link #EXTRA_MULTIPLE_NETWORKS_CHANGED} is set for backwards compatibility reasons, but
-     * its value is always true, even if only a single network changed.
-     * <br />
-     * The {@link android.Manifest.permission#ACCESS_WIFI_STATE ACCESS_WIFI_STATE} permission is
-     * required to receive this broadcast.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String CONFIGURED_NETWORKS_CHANGED_ACTION =
-        "android.net.wifi.CONFIGURED_NETWORKS_CHANGE";
-    /**
-     * The lookup key for a {@link android.net.wifi.WifiConfiguration} object representing
-     * the changed Wi-Fi configuration when the {@link #CONFIGURED_NETWORKS_CHANGED_ACTION}
-     * broadcast is sent.
-     * Note: this extra is never set starting in Android 11.
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_WIFI_CONFIGURATION = "wifiConfiguration";
-    /**
-     * Multiple network configurations have changed.
-     * @see #CONFIGURED_NETWORKS_CHANGED_ACTION
-     * Note: this extra is always true starting in Android 11.
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_MULTIPLE_NETWORKS_CHANGED = "multipleChanges";
-    /**
-     * The lookup key for an integer indicating the reason a Wi-Fi network configuration
-     * has changed. One of {@link #CHANGE_REASON_ADDED}, {@link #CHANGE_REASON_REMOVED},
-     * {@link #CHANGE_REASON_CONFIG_CHANGE}.
-     *
-     * @see #CONFIGURED_NETWORKS_CHANGED_ACTION
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_CHANGE_REASON = "changeReason";
-    /**
-     * The configuration is new and was added.
-     * @hide
-     */
-    @SystemApi
-    public static final int CHANGE_REASON_ADDED = 0;
-    /**
-     * The configuration was removed and is no longer present in the system's list of
-     * configured networks.
-     * @hide
-     */
-    @SystemApi
-    public static final int CHANGE_REASON_REMOVED = 1;
-    /**
-     * The configuration has changed as a result of explicit action or because the system
-     * took an automated action such as disabling a malfunctioning configuration.
-     * @hide
-     */
-    @SystemApi
-    public static final int CHANGE_REASON_CONFIG_CHANGE = 2;
-    /**
-     * An access point scan has completed, and results are available.
-     * Call {@link #getScanResults()} to obtain the results.
-     * The broadcast intent may contain an extra field with the key {@link #EXTRA_RESULTS_UPDATED}
-     * and a {@code boolean} value indicating if the scan was successful.
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String SCAN_RESULTS_AVAILABLE_ACTION = "android.net.wifi.SCAN_RESULTS";
-
-    /**
-     * Lookup key for a {@code boolean} extra in intent {@link #SCAN_RESULTS_AVAILABLE_ACTION}
-     * representing if the scan was successful or not.
-     * Scans may fail for multiple reasons, these may include:
-     * <ol>
-     * <li>An app requested too many scans in a certain period of time.
-     * This may lead to additional scan request rejections via "scan throttling" for both
-     * foreground and background apps.
-     * Note: Apps holding android.Manifest.permission.NETWORK_SETTINGS permission are
-     * exempted from scan throttling.
-     * </li>
-     * <li>The device is idle and scanning is disabled.</li>
-     * <li>Wifi hardware reported a scan failure.</li>
-     * </ol>
-     * @return true scan was successful, results are updated
-     * @return false scan was not successful, results haven't been updated since previous scan
-     */
-    public static final String EXTRA_RESULTS_UPDATED = "resultsUpdated";
-
-    /**
-     * A batch of access point scans has been completed and the results areavailable.
-     * Call {@link #getBatchedScanResults()} to obtain the results.
-     * @deprecated This API is nolonger supported.
-     * Use {@link android.net.wifi.WifiScanner} API
-     * @hide
-     */
-    @Deprecated
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String BATCHED_SCAN_RESULTS_AVAILABLE_ACTION =
-            "android.net.wifi.BATCHED_RESULTS";
-
-    /**
-     * The RSSI (signal strength) has changed.
-     *
-     * Receiver Required Permission: android.Manifest.permission.ACCESS_WIFI_STATE
-     * @see #EXTRA_NEW_RSSI
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String RSSI_CHANGED_ACTION = "android.net.wifi.RSSI_CHANGED";
-    /**
-     * The lookup key for an {@code int} giving the new RSSI in dBm.
-     */
-    public static final String EXTRA_NEW_RSSI = "newRssi";
-
-    /**
-     * @see #ACTION_LINK_CONFIGURATION_CHANGED
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final String LINK_CONFIGURATION_CHANGED_ACTION =
-            "android.net.wifi.LINK_CONFIGURATION_CHANGED";
-
-    /**
-     * Broadcast intent action indicating that the link configuration changed on wifi.
-     * <br />Included Extras:
-     * <br />{@link #EXTRA_LINK_PROPERTIES}: may not be set starting in Android 11. Check for
-     * <br /> null before reading its value.
-     * <br /> No permissions are required to listen to this broadcast.
-     * @hide
-     */
-    @SystemApi
-    public static final String ACTION_LINK_CONFIGURATION_CHANGED =
-            // should be android.net.wifi.action.LINK_CONFIGURATION_CHANGED, but due to
-            // @UnsupportedAppUsage leaving it as android.net.wifi.LINK_CONFIGURATION_CHANGED.
-            LINK_CONFIGURATION_CHANGED_ACTION;
-
-    /**
-     * The lookup key for a {@link android.net.LinkProperties} object associated with the
-     * Wi-Fi network.
-     * Included in the {@link #ACTION_LINK_CONFIGURATION_CHANGED} broadcast.
-     *
-     * Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
-     *
-     * Note: this extra may not be set starting in Android 11. Check for null before reading its
-     * value.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String EXTRA_LINK_PROPERTIES = "android.net.wifi.extra.LINK_PROPERTIES";
-
-    /**
-     * The lookup key for a {@link android.net.NetworkCapabilities} object associated with the
-     * Wi-Fi network. Retrieve with
-     * {@link android.content.Intent#getParcelableExtra(String)}.
-     * @hide
-     */
-    public static final String EXTRA_NETWORK_CAPABILITIES = "networkCapabilities";
-
-    /**
-     * The network IDs of the configured networks could have changed.
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String NETWORK_IDS_CHANGED_ACTION = "android.net.wifi.NETWORK_IDS_CHANGED";
-
-    /**
-     * Activity Action: Show a system activity that allows the user to enable
-     * scans to be available even with Wi-Fi turned off.
-     *
-     * <p>Notification of the result of this activity is posted using the
-     * {@link android.app.Activity#onActivityResult} callback. The
-     * <code>resultCode</code>
-     * will be {@link android.app.Activity#RESULT_OK} if scan always mode has
-     * been turned on or {@link android.app.Activity#RESULT_CANCELED} if the user
-     * has rejected the request or an error has occurred.
-     */
-    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE =
-            "android.net.wifi.action.REQUEST_SCAN_ALWAYS_AVAILABLE";
-
-    /**
-     * Activity Action: Pick a Wi-Fi network to connect to.
-     * <p>Input: Nothing.
-     * <p>Output: Nothing.
-     */
-    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ACTION_PICK_WIFI_NETWORK = "android.net.wifi.PICK_WIFI_NETWORK";
-
-    /**
-     * Activity Action: Receiver should show UI to get user approval to enable WiFi.
-     * <p>Input: {@link android.content.Intent#EXTRA_PACKAGE_NAME} string extra with
-     *           the name of the app requesting the action.
-     * <p>Output: Nothing.
-     * <p>No permissions are required to send this action.
-     * @hide
-     */
-    @SystemApi
-    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ACTION_REQUEST_ENABLE = "android.net.wifi.action.REQUEST_ENABLE";
-
-    /**
-     * Activity Action: Receiver should show UI to get user approval to disable WiFi.
-     * <p>Input: {@link android.content.Intent#EXTRA_PACKAGE_NAME} string extra with
-     *           the name of the app requesting the action.
-     * <p>Output: Nothing.
-     * <p>No permissions are required to send this action.
-     * @hide
-     */
-    @SystemApi
-    @SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
-    public static final String ACTION_REQUEST_DISABLE = "android.net.wifi.action.REQUEST_DISABLE";
-
-    /**
-     * Directed broadcast intent action indicating that the device has connected to one of the
-     * network suggestions provided by the app. This will be sent post connection to a network
-     * which was created with {@link WifiNetworkSuggestion.Builder#setIsAppInteractionRequired(
-     * boolean)}
-     * flag set.
-     * <p>
-     * Note: The broadcast is sent to the app only if it holds
-     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION} permission.
-     *
-     * @see #EXTRA_NETWORK_SUGGESTION
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION =
-            "android.net.wifi.action.WIFI_NETWORK_SUGGESTION_POST_CONNECTION";
-    /**
-     * Sent as as a part of {@link #ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION} that holds
-     * an instance of {@link WifiNetworkSuggestion} corresponding to the connected network.
-     */
-    public static final String EXTRA_NETWORK_SUGGESTION =
-            "android.net.wifi.extra.NETWORK_SUGGESTION";
-
-    /**
-     * Internally used Wi-Fi lock mode representing the case were no locks are held.
-     * @hide
-     */
-    public static final int WIFI_MODE_NO_LOCKS_HELD = 0;
-
-    /**
-     * In this Wi-Fi lock mode, Wi-Fi will be kept active,
-     * and will behave normally, i.e., it will attempt to automatically
-     * establish a connection to a remembered access point that is
-     * within range, and will do periodic scans if there are remembered
-     * access points but none are in range.
-     *
-     * @deprecated This API is non-functional and will have no impact.
-     */
-    @Deprecated
-    public static final int WIFI_MODE_FULL = 1;
-
-    /**
-     * In this Wi-Fi lock mode, Wi-Fi will be kept active,
-     * but the only operation that will be supported is initiation of
-     * scans, and the subsequent reporting of scan results. No attempts
-     * will be made to automatically connect to remembered access points,
-     * nor will periodic scans be automatically performed looking for
-     * remembered access points. Scans must be explicitly requested by
-     * an application in this mode.
-     *
-     * @deprecated This API is non-functional and will have no impact.
-     */
-    @Deprecated
-    public static final int WIFI_MODE_SCAN_ONLY = 2;
-
-    /**
-     * In this Wi-Fi lock mode, Wi-Fi will not go to power save.
-     * This results in operating with low packet latency.
-     * The lock is only active when the device is connected to an access point.
-     * The lock is active even when the device screen is off or the acquiring application is
-     * running in the background.
-     * This mode will consume more power and hence should be used only
-     * when there is a need for this tradeoff.
-     * <p>
-     * An example use case is when a voice connection needs to be
-     * kept active even after the device screen goes off.
-     * Holding a {@link #WIFI_MODE_FULL_HIGH_PERF} lock for the
-     * duration of the voice call may improve the call quality.
-     * <p>
-     * When there is no support from the hardware, the {@link #WIFI_MODE_FULL_HIGH_PERF}
-     * lock will have no impact.
-     */
-    public static final int WIFI_MODE_FULL_HIGH_PERF = 3;
-
-    /**
-     * In this Wi-Fi lock mode, Wi-Fi will operate with a priority to achieve low latency.
-     * {@link #WIFI_MODE_FULL_LOW_LATENCY} lock has the following limitations:
-     * <ol>
-     * <li>The lock is only active when the device is connected to an access point.</li>
-     * <li>The lock is only active when the screen is on.</li>
-     * <li>The lock is only active when the acquiring app is running in the foreground.</li>
-     * </ol>
-     * Low latency mode optimizes for reduced packet latency,
-     * and as a result other performance measures may suffer when there are trade-offs to make:
-     * <ol>
-     * <li>Battery life may be reduced.</li>
-     * <li>Throughput may be reduced.</li>
-     * <li>Frequency of Wi-Fi scanning may be reduced. This may result in: </li>
-     * <ul>
-     * <li>The device may not roam or switch to the AP with highest signal quality.</li>
-     * <li>Location accuracy may be reduced.</li>
-     * </ul>
-     * </ol>
-     * <p>
-     * Example use cases are real time gaming or virtual reality applications where
-     * low latency is a key factor for user experience.
-     * <p>
-     * Note: For an app which acquires both {@link #WIFI_MODE_FULL_LOW_LATENCY} and
-     * {@link #WIFI_MODE_FULL_HIGH_PERF} locks, {@link #WIFI_MODE_FULL_LOW_LATENCY}
-     * lock will be effective when app is running in foreground and screen is on,
-     * while the {@link #WIFI_MODE_FULL_HIGH_PERF} lock will take effect otherwise.
-     */
-    public static final int WIFI_MODE_FULL_LOW_LATENCY = 4;
-
-
-    /** Anything worse than or equal to this will show 0 bars. */
-    @UnsupportedAppUsage
-    private static final int MIN_RSSI = -100;
-
-    /** Anything better than or equal to this will show the max bars. */
-    @UnsupportedAppUsage
-    private static final int MAX_RSSI = -55;
-
-    /**
-     * Number of RSSI levels used in the framework to initiate {@link #RSSI_CHANGED_ACTION}
-     * broadcast, where each level corresponds to a range of RSSI values.
-     * The {@link #RSSI_CHANGED_ACTION} broadcast will only fire if the RSSI
-     * change is significant enough to change the RSSI signal level.
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int RSSI_LEVELS = 5;
-
-    //TODO (b/146346676): This needs to be removed, not used in the code.
-    /**
-     * Auto settings in the driver. The driver could choose to operate on both
-     * 2.4 GHz and 5 GHz or make a dynamic decision on selecting the band.
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public static final int WIFI_FREQUENCY_BAND_AUTO = 0;
-
-    /**
-     * Operation on 5 GHz alone
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public static final int WIFI_FREQUENCY_BAND_5GHZ = 1;
-
-    /**
-     * Operation on 2.4 GHz alone
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public static final int WIFI_FREQUENCY_BAND_2GHZ = 2;
-
-    /** @hide */
-    public static final boolean DEFAULT_POOR_NETWORK_AVOIDANCE_ENABLED = false;
-
-    /**
-     * Maximum number of active locks we allow.
-     * This limit was added to prevent apps from creating a ridiculous number
-     * of locks and crashing the system by overflowing the global ref table.
-     */
-    private static final int MAX_ACTIVE_LOCKS = 50;
-
-    /** Indicates an invalid SSID. */
-    public static final String UNKNOWN_SSID = "<unknown ssid>";
-
-    /** @hide */
-    public static final MacAddress ALL_ZEROS_MAC_ADDRESS =
-            MacAddress.fromString("00:00:00:00:00:00");
-
-    /* Number of currently active WifiLocks and MulticastLocks */
-    @UnsupportedAppUsage
-    private int mActiveLockCount;
-
-    private Context mContext;
-    @UnsupportedAppUsage
-    IWifiManager mService;
-    private final int mTargetSdkVersion;
-
-    private Looper mLooper;
-    private boolean mVerboseLoggingEnabled = false;
-
-    private final Object mLock = new Object(); // lock guarding access to the following vars
-    @GuardedBy("mLock")
-    private LocalOnlyHotspotCallbackProxy mLOHSCallbackProxy;
-    @GuardedBy("mLock")
-    private LocalOnlyHotspotObserverProxy mLOHSObserverProxy;
-
-    /**
-     * Create a new WifiManager instance.
-     * Applications will almost always want to use
-     * {@link android.content.Context#getSystemService Context.getSystemService} to retrieve
-     * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}.
-     *
-     * @param context the application context
-     * @param service the Binder interface
-     * @param looper the Looper used to deliver callbacks
-     * @hide - hide this because it takes in a parameter of type IWifiManager, which
-     * is a system private class.
-     */
-    public WifiManager(@NonNull Context context, @NonNull IWifiManager service,
-        @NonNull Looper looper) {
-        mContext = context;
-        mService = service;
-        mLooper = looper;
-        mTargetSdkVersion = context.getApplicationInfo().targetSdkVersion;
-        updateVerboseLoggingEnabledFromService();
-    }
-
-    /**
-     * Return a list of all the networks configured for the current foreground
-     * user.
-     *
-     * Not all fields of WifiConfiguration are returned. Only the following
-     * fields are filled in:
-     * <ul>
-     * <li>networkId</li>
-     * <li>SSID</li>
-     * <li>BSSID</li>
-     * <li>priority</li>
-     * <li>allowedProtocols</li>
-     * <li>allowedKeyManagement</li>
-     * <li>allowedAuthAlgorithms</li>
-     * <li>allowedPairwiseCiphers</li>
-     * <li>allowedGroupCiphers</li>
-     * <li>status</li>
-     * </ul>
-     * @return a list of network configurations in the form of a list
-     * of {@link WifiConfiguration} objects.
-     *
-     * @deprecated
-     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
-     * mechanism to trigger connection to a Wi-Fi network.
-     * b) See {@link #addNetworkSuggestions(List)},
-     * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
-     * when auto-connecting to wifi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always fail and return an
-     * empty list.
-     * <p>
-     * Deprecation Exemptions:
-     * <ul>
-     * <li>Device Owner (DO), Profile Owner (PO) and system apps will have access to the full list.
-     * <li>Callers with Carrier privilege will receive a restricted list only containing
-     * configurations which they created.
-     * </ul>
-     */
-    @Deprecated
-    @RequiresPermission(allOf = {ACCESS_FINE_LOCATION, ACCESS_WIFI_STATE})
-    public List<WifiConfiguration> getConfiguredNetworks() {
-        try {
-            ParceledListSlice<WifiConfiguration> parceledList =
-                    mService.getConfiguredNetworks(mContext.getOpPackageName(),
-                            mContext.getAttributionTag());
-            if (parceledList == null) {
-                return Collections.emptyList();
-            }
-            return parceledList.getList();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /** @hide */
-    @SystemApi
-    @RequiresPermission(allOf = {ACCESS_FINE_LOCATION, ACCESS_WIFI_STATE, READ_WIFI_CREDENTIAL})
-    public List<WifiConfiguration> getPrivilegedConfiguredNetworks() {
-        try {
-            ParceledListSlice<WifiConfiguration> parceledList =
-                    mService.getPrivilegedConfiguredNetworks(mContext.getOpPackageName(),
-                            mContext.getAttributionTag());
-            if (parceledList == null) {
-                return Collections.emptyList();
-            }
-            return parceledList.getList();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Returns a list of all matching WifiConfigurations for a given list of ScanResult.
-     *
-     * An empty list will be returned when no configurations are installed or if no configurations
-     * match the ScanResult.
-     *
-     * @param scanResults a list of scanResult that represents the BSSID
-     * @return List that consists of {@link WifiConfiguration} and corresponding scanResults per
-     * network type({@link #PASSPOINT_HOME_NETWORK} and {@link #PASSPOINT_ROAMING_NETWORK}).
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD
-    })
-    @NonNull
-    public List<Pair<WifiConfiguration, Map<Integer, List<ScanResult>>>> getAllMatchingWifiConfigs(
-            @NonNull List<ScanResult> scanResults) {
-        List<Pair<WifiConfiguration, Map<Integer, List<ScanResult>>>> configs = new ArrayList<>();
-        try {
-            Map<String, Map<Integer, List<ScanResult>>> results =
-                    mService.getAllMatchingPasspointProfilesForScanResults(scanResults);
-            if (results.isEmpty()) {
-                return configs;
-            }
-            List<WifiConfiguration> wifiConfigurations =
-                    mService.getWifiConfigsForPasspointProfiles(
-                            new ArrayList<>(results.keySet()));
-            for (WifiConfiguration configuration : wifiConfigurations) {
-                Map<Integer, List<ScanResult>> scanResultsPerNetworkType =
-                        results.get(configuration.getKey());
-                if (scanResultsPerNetworkType != null) {
-                    configs.add(Pair.create(configuration, scanResultsPerNetworkType));
-                }
-            }
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-
-        return configs;
-    }
-
-    /**
-     * Retrieve a list of {@link WifiConfiguration} for available {@link WifiNetworkSuggestion}
-     * matching the given list of {@link ScanResult}.
-     *
-     * An available {@link WifiNetworkSuggestion} must satisfy:
-     * <ul>
-     * <li> Matching one of the {@link ScanResult} from the given list.
-     * <li> and {@link WifiNetworkSuggestion.Builder#setIsUserAllowedToManuallyConnect(boolean)} set
-     * to true.
-     * </ul>
-     *
-     * @param scanResults a list of scanResult.
-     * @return a list of @link WifiConfiguration} for available {@link WifiNetworkSuggestion}
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD
-    })
-    @NonNull
-    public List<WifiConfiguration> getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(
-            @NonNull List<ScanResult> scanResults) {
-        try {
-            return mService.getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(scanResults);
-        } catch (RemoteException e) {
-            throw e.rethrowAsRuntimeException();
-        }
-    }
-
-    /**
-     * Returns a list of unique Hotspot 2.0 OSU (Online Sign-Up) providers associated with a given
-     * list of ScanResult.
-     *
-     * An empty list will be returned if no match is found.
-     *
-     * @param scanResults a list of ScanResult
-     * @return Map that consists {@link OsuProvider} and a list of matching {@link ScanResult}
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD
-    })
-    @NonNull
-    public Map<OsuProvider, List<ScanResult>> getMatchingOsuProviders(
-            @Nullable List<ScanResult> scanResults) {
-        if (scanResults == null) {
-            return new HashMap<>();
-        }
-        try {
-            return mService.getMatchingOsuProviders(scanResults);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Returns the matching Passpoint R2 configurations for given OSU (Online Sign-Up) providers.
-     *
-     * Given a list of OSU providers, this only returns OSU providers that already have Passpoint R2
-     * configurations in the device.
-     * An empty map will be returned when there is no matching Passpoint R2 configuration for the
-     * given OsuProviders.
-     *
-     * @param osuProviders a set of {@link OsuProvider}
-     * @return Map that consists of {@link OsuProvider} and matching {@link PasspointConfiguration}.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD
-    })
-    @NonNull
-    public Map<OsuProvider, PasspointConfiguration> getMatchingPasspointConfigsForOsuProviders(
-            @NonNull Set<OsuProvider> osuProviders) {
-        try {
-            return mService.getMatchingPasspointConfigsForOsuProviders(
-                    new ArrayList<>(osuProviders));
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Add a new network description to the set of configured networks.
-     * The {@code networkId} field of the supplied configuration object
-     * is ignored.
-     * <p/>
-     * The new network will be marked DISABLED by default. To enable it,
-     * called {@link #enableNetwork}.
-     *
-     * @param config the set of variables that describe the configuration,
-     *            contained in a {@link WifiConfiguration} object.
-     *            If the {@link WifiConfiguration} has an Http Proxy set
-     *            the calling app must be System, or be provisioned as the Profile or Device Owner.
-     * @return the ID of the newly created network description. This is used in
-     *         other operations to specified the network to be acted upon.
-     *         Returns {@code -1} on failure.
-     *
-     * @deprecated
-     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
-     * mechanism to trigger connection to a Wi-Fi network.
-     * b) See {@link #addNetworkSuggestions(List)},
-     * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
-     * when auto-connecting to wifi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always fail and return
-     * {@code -1}.
-     * <p>
-     * Deprecation Exemptions:
-     * <ul>
-     * <li>Device Owner (DO), Profile Owner (PO) and system apps.
-     * </ul>
-     */
-    @Deprecated
-    public int addNetwork(WifiConfiguration config) {
-        if (config == null) {
-            return -1;
-        }
-        config.networkId = -1;
-        return addOrUpdateNetwork(config);
-    }
-
-    /**
-     * Update the network description of an existing configured network.
-     *
-     * @param config the set of variables that describe the configuration,
-     *            contained in a {@link WifiConfiguration} object. It may
-     *            be sparse, so that only the items that are being changed
-     *            are non-<code>null</code>. The {@code networkId} field
-     *            must be set to the ID of the existing network being updated.
-     *            If the {@link WifiConfiguration} has an Http Proxy set
-     *            the calling app must be System, or be provisioned as the Profile or Device Owner.
-     * @return Returns the {@code networkId} of the supplied
-     *         {@code WifiConfiguration} on success.
-     *         <br/>
-     *         Returns {@code -1} on failure, including when the {@code networkId}
-     *         field of the {@code WifiConfiguration} does not refer to an
-     *         existing network.
-     *
-     * @deprecated
-     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
-     * mechanism to trigger connection to a Wi-Fi network.
-     * b) See {@link #addNetworkSuggestions(List)},
-     * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
-     * when auto-connecting to wifi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always fail and return
-     * {@code -1}.
-     * <p>
-     * Deprecation Exemptions:
-     * <ul>
-     * <li>Device Owner (DO), Profile Owner (PO) and system apps.
-     * </ul>
-     */
-    @Deprecated
-    public int updateNetwork(WifiConfiguration config) {
-        if (config == null || config.networkId < 0) {
-            return -1;
-        }
-        return addOrUpdateNetwork(config);
-    }
-
-    /**
-     * Internal method for doing the RPC that creates a new network description
-     * or updates an existing one.
-     *
-     * @param config The possibly sparse object containing the variables that
-     *         are to set or updated in the network description.
-     * @return the ID of the network on success, {@code -1} on failure.
-     */
-    private int addOrUpdateNetwork(WifiConfiguration config) {
-        try {
-            return mService.addOrUpdateNetwork(config, mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Interface for indicating user selection from the list of networks presented in the
-     * {@link NetworkRequestMatchCallback#onMatch(List)}.
-     *
-     * The platform will implement this callback and pass it along with the
-     * {@link NetworkRequestMatchCallback#onUserSelectionCallbackRegistration(
-     * NetworkRequestUserSelectionCallback)}. The UI component handling
-     * {@link NetworkRequestMatchCallback} will invoke {@link #select(WifiConfiguration)} or
-     * {@link #reject()} to return the user's selection back to the platform via this callback.
-     * @hide
-     */
-    @SystemApi
-    public interface NetworkRequestUserSelectionCallback {
-        /**
-         * User selected this network to connect to.
-         * @param wifiConfiguration WifiConfiguration object corresponding to the network
-         *                          user selected.
-         */
-        @SuppressLint("CallbackMethodName")
-        default void select(@NonNull WifiConfiguration wifiConfiguration) {}
-
-        /**
-         * User rejected the app's request.
-         */
-        @SuppressLint("CallbackMethodName")
-        default void reject() {}
-    }
-
-    /**
-     * Interface for network request callback. Should be implemented by applications and passed when
-     * calling {@link #registerNetworkRequestMatchCallback(Executor,
-     * WifiManager.NetworkRequestMatchCallback)}.
-     *
-     * This is meant to be implemented by a UI component to present the user with a list of networks
-     * matching the app's request. The user is allowed to pick one of these networks to connect to
-     * or reject the request by the app.
-     * @hide
-     */
-    @SystemApi
-    public interface NetworkRequestMatchCallback {
-        /**
-         * Invoked to register a callback to be invoked to convey user selection. The callback
-         * object passed in this method is to be invoked by the UI component after the service sends
-         * a list of matching scan networks using {@link #onMatch(List)} and user picks a network
-         * from that list.
-         *
-         * @param userSelectionCallback Callback object to send back the user selection.
-         */
-        default void onUserSelectionCallbackRegistration(
-                @NonNull NetworkRequestUserSelectionCallback userSelectionCallback) {}
-
-        /**
-         * Invoked when the active network request is aborted, either because
-         * <li> The app released the request, OR</li>
-         * <li> Request was overridden by a new request</li>
-         * This signals the end of processing for the current request and should stop the UI
-         * component. No subsequent calls from the UI component will be handled by the platform.
-         */
-        default void onAbort() {}
-
-        /**
-         * Invoked when a network request initiated by an app matches some networks in scan results.
-         * This may be invoked multiple times for a single network request as the platform finds new
-         * matching networks in scan results.
-         *
-         * @param scanResults List of {@link ScanResult} objects corresponding to the networks
-         *                    matching the request.
-         */
-        default void onMatch(@NonNull List<ScanResult> scanResults) {}
-
-        /**
-         * Invoked on a successful connection with the network that the user selected
-         * via {@link NetworkRequestUserSelectionCallback}.
-         *
-         * @param wifiConfiguration WifiConfiguration object corresponding to the network that the
-         *                          user selected.
-         */
-        default void onUserSelectionConnectSuccess(@NonNull WifiConfiguration wifiConfiguration) {}
-
-        /**
-         * Invoked on failure to establish connection with the network that the user selected
-         * via {@link NetworkRequestUserSelectionCallback}.
-         *
-         * @param wifiConfiguration WifiConfiguration object corresponding to the network
-         *                          user selected.
-         */
-        default void onUserSelectionConnectFailure(@NonNull WifiConfiguration wifiConfiguration) {}
-    }
-
-    /**
-     * Callback proxy for NetworkRequestUserSelectionCallback objects.
-     * @hide
-     */
-    private class NetworkRequestUserSelectionCallbackProxy implements
-            NetworkRequestUserSelectionCallback {
-        private final INetworkRequestUserSelectionCallback mCallback;
-
-        NetworkRequestUserSelectionCallbackProxy(
-                INetworkRequestUserSelectionCallback callback) {
-            mCallback = callback;
-        }
-
-        @Override
-        public void select(@NonNull WifiConfiguration wifiConfiguration) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "NetworkRequestUserSelectionCallbackProxy: select "
-                        + "wificonfiguration: " + wifiConfiguration);
-            }
-            try {
-                mCallback.select(wifiConfiguration);
-            } catch (RemoteException e) {
-                Log.e(TAG, "Failed to invoke onSelected", e);
-                throw e.rethrowFromSystemServer();
-            }
-        }
-
-        @Override
-        public void reject() {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "NetworkRequestUserSelectionCallbackProxy: reject");
-            }
-            try {
-                mCallback.reject();
-            } catch (RemoteException e) {
-                Log.e(TAG, "Failed to invoke onRejected", e);
-                throw e.rethrowFromSystemServer();
-            }
-        }
-    }
-
-    /**
-     * Callback proxy for NetworkRequestMatchCallback objects.
-     * @hide
-     */
-    private class NetworkRequestMatchCallbackProxy extends INetworkRequestMatchCallback.Stub {
-        private final Executor mExecutor;
-        private final NetworkRequestMatchCallback mCallback;
-
-        NetworkRequestMatchCallbackProxy(Executor executor, NetworkRequestMatchCallback callback) {
-            mExecutor = executor;
-            mCallback = callback;
-        }
-
-        @Override
-        public void onUserSelectionCallbackRegistration(
-                INetworkRequestUserSelectionCallback userSelectionCallback) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "NetworkRequestMatchCallbackProxy: "
-                        + "onUserSelectionCallbackRegistration callback: " + userSelectionCallback);
-            }
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onUserSelectionCallbackRegistration(
-                        new NetworkRequestUserSelectionCallbackProxy(userSelectionCallback));
-            });
-        }
-
-        @Override
-        public void onAbort() {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "NetworkRequestMatchCallbackProxy: onAbort");
-            }
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onAbort();
-            });
-        }
-
-        @Override
-        public void onMatch(List<ScanResult> scanResults) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "NetworkRequestMatchCallbackProxy: onMatch scanResults: "
-                        + scanResults);
-            }
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onMatch(scanResults);
-            });
-        }
-
-        @Override
-        public void onUserSelectionConnectSuccess(WifiConfiguration wifiConfiguration) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "NetworkRequestMatchCallbackProxy: onUserSelectionConnectSuccess "
-                        + " wificonfiguration: " + wifiConfiguration);
-            }
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onUserSelectionConnectSuccess(wifiConfiguration);
-            });
-        }
-
-        @Override
-        public void onUserSelectionConnectFailure(WifiConfiguration wifiConfiguration) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "NetworkRequestMatchCallbackProxy: onUserSelectionConnectFailure"
-                        + " wificonfiguration: " + wifiConfiguration);
-            }
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onUserSelectionConnectFailure(wifiConfiguration);
-            });
-        }
-    }
-
-    /**
-     * Registers a callback for NetworkRequest matches. See {@link NetworkRequestMatchCallback}.
-     * Caller can unregister a previously registered callback using
-     * {@link #unregisterNetworkRequestMatchCallback(NetworkRequestMatchCallback)}
-     * <p>
-     * Applications should have the
-     * {@link android.Manifest.permission#NETWORK_SETTINGS} permission. Callers
-     * without the permission will trigger a {@link java.lang.SecurityException}.
-     * <p>
-     *
-     * @param executor The Executor on whose thread to execute the callbacks of the {@code callback}
-     *                 object.
-     * @param callback Callback for network match events to register.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void registerNetworkRequestMatchCallback(@NonNull @CallbackExecutor Executor executor,
-            @NonNull NetworkRequestMatchCallback callback) {
-        if (executor == null) throw new IllegalArgumentException("executor cannot be null");
-        if (callback == null) throw new IllegalArgumentException("callback cannot be null");
-        Log.v(TAG, "registerNetworkRequestMatchCallback: callback=" + callback
-                + ", executor=" + executor);
-
-        Binder binder = new Binder();
-        try {
-            mService.registerNetworkRequestMatchCallback(
-                    binder, new NetworkRequestMatchCallbackProxy(executor, callback),
-                    callback.hashCode());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Unregisters a callback for NetworkRequest matches. See {@link NetworkRequestMatchCallback}.
-     * <p>
-     * Applications should have the
-     * {@link android.Manifest.permission#NETWORK_SETTINGS} permission. Callers
-     * without the permission will trigger a {@link java.lang.SecurityException}.
-     * <p>
-     *
-     * @param callback Callback for network match events to unregister.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void unregisterNetworkRequestMatchCallback(
-            @NonNull NetworkRequestMatchCallback callback) {
-        if (callback == null) throw new IllegalArgumentException("callback cannot be null");
-        Log.v(TAG, "unregisterNetworkRequestMatchCallback: callback=" + callback);
-
-        try {
-            mService.unregisterNetworkRequestMatchCallback(callback.hashCode());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Provide a list of network suggestions to the device. See {@link WifiNetworkSuggestion}
-     * for a detailed explanation of the parameters.
-     * When the device decides to connect to one of the provided network suggestions, platform sends
-     * a directed broadcast {@link #ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION} to the app if
-     * the network was created with
-     * {@link WifiNetworkSuggestion.Builder#setIsAppInteractionRequired(boolean)} flag set and the
-     * app holds {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION}
-     * permission.
-     *<p>
-     * NOTE:
-     * <li> These networks are just a suggestion to the platform. The platform will ultimately
-     * decide on which network the device connects to. </li>
-     * <li> When an app is uninstalled or disabled, all its suggested networks are discarded.
-     * If the device is currently connected to a suggested network which is being removed then the
-     * device will disconnect from that network.</li>
-     * <li> If user reset network settings, all added suggestions will be discarded. Apps can use
-     * {@link #getNetworkSuggestions()} to check if their suggestions are in the device.</li>
-     * <li> In-place modification of existing suggestions are allowed.
-     * <li> If the provided suggestions include any previously provided suggestions by the app,
-     * previous suggestions will be updated.</li>
-     * <li>If one of the provided suggestions marks a previously unmetered suggestion as metered and
-     * the device is currently connected to that suggested network, then the device will disconnect
-     * from that network. The system will immediately re-evaluate all the network candidates
-     * and possibly reconnect back to the same suggestion. This disconnect is to make sure that any
-     * traffic flowing over unmetered networks isn't accidentally continued over a metered network.
-     * </li>
-     * </li>
-     *
-     * @param networkSuggestions List of network suggestions provided by the app.
-     * @return Status code for the operation. One of the STATUS_NETWORK_SUGGESTIONS_ values.
-     * @throws {@link SecurityException} if the caller is missing required permissions.
-     * @see WifiNetworkSuggestion#equals(Object)
-     */
-    @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE)
-    public @NetworkSuggestionsStatusCode int addNetworkSuggestions(
-            @NonNull List<WifiNetworkSuggestion> networkSuggestions) {
-        try {
-            return mService.addNetworkSuggestions(
-                    networkSuggestions, mContext.getOpPackageName(), mContext.getAttributionTag());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Remove some or all of the network suggestions that were previously provided by the app.
-     * If one of the suggestions being removed was used to establish connection to the current
-     * network, then the device will immediately disconnect from that network.
-     *
-     * See {@link WifiNetworkSuggestion} for a detailed explanation of the parameters.
-     * See {@link WifiNetworkSuggestion#equals(Object)} for the equivalence evaluation used.
-     *
-     * @param networkSuggestions List of network suggestions to be removed. Pass an empty list
-     *                           to remove all the previous suggestions provided by the app.
-     * @return Status code for the operation. One of the STATUS_NETWORK_SUGGESTIONS_ values.
-     * Any matching suggestions are removed from the device and will not be considered for any
-     * further connection attempts.
-     */
-    @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE)
-    public @NetworkSuggestionsStatusCode int removeNetworkSuggestions(
-            @NonNull List<WifiNetworkSuggestion> networkSuggestions) {
-        try {
-            return mService.removeNetworkSuggestions(
-                    networkSuggestions, mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Get all network suggestions provided by the calling app.
-     * See {@link #addNetworkSuggestions(List)}
-     * See {@link #removeNetworkSuggestions(List)}
-     * @return a list of {@link WifiNetworkSuggestion}
-     */
-    @RequiresPermission(ACCESS_WIFI_STATE)
-    public @NonNull List<WifiNetworkSuggestion> getNetworkSuggestions() {
-        try {
-            return mService.getNetworkSuggestions(mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowAsRuntimeException();
-        }
-    }
-
-    /**
-     * Returns the max number of network suggestions that are allowed per app on the device.
-     * @see #addNetworkSuggestions(List)
-     * @see #removeNetworkSuggestions(List)
-     */
-    public int getMaxNumberOfNetworkSuggestionsPerApp() {
-        return getMaxNumberOfNetworkSuggestionsPerApp(
-                mContext.getSystemService(ActivityManager.class).isLowRamDevice());
-    }
-
-    /** @hide */
-    public static int getMaxNumberOfNetworkSuggestionsPerApp(boolean isLowRamDevice) {
-        return isLowRamDevice
-                ? NETWORK_SUGGESTIONS_MAX_PER_APP_LOW_RAM
-                : NETWORK_SUGGESTIONS_MAX_PER_APP_HIGH_RAM;
-    }
-
-    /**
-     * Add or update a Passpoint configuration.  The configuration provides a credential
-     * for connecting to Passpoint networks that are operated by the Passpoint
-     * service provider specified in the configuration.
-     *
-     * Each configuration is uniquely identified by a unique key which depends on the contents of
-     * the configuration. This allows the caller to install multiple profiles with the same FQDN
-     * (Fully qualified domain name). Therefore, in order to update an existing profile, it is
-     * first required to remove it using {@link WifiManager#removePasspointConfiguration(String)}.
-     * Otherwise, a new profile will be added with both configuration.
-     *
-     * @param config The Passpoint configuration to be added
-     * @throws IllegalArgumentException if configuration is invalid or Passpoint is not enabled on
-     *                                  the device.
-     *
-     * Deprecated for general app usage - except DO/PO apps.
-     * See {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} to
-     * create a passpoint suggestion.
-     * See {@link #addNetworkSuggestions(List)}, {@link #removeNetworkSuggestions(List)} for new
-     * API to add Wi-Fi networks for consideration when auto-connecting to wifi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#R} or above, this API will always fail and throw
-     * {@link IllegalArgumentException}.
-     * <p>
-     * Deprecation Exemptions:
-     * <ul>
-     * <li>Device Owner (DO), Profile Owner (PO) and system apps.
-     * </ul>
-     */
-    public void addOrUpdatePasspointConfiguration(PasspointConfiguration config) {
-        try {
-            if (!mService.addOrUpdatePasspointConfiguration(config, mContext.getOpPackageName())) {
-                throw new IllegalArgumentException();
-            }
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Remove the Passpoint configuration identified by its FQDN (Fully Qualified Domain Name) added
-     * by the caller.
-     *
-     * @param fqdn The FQDN of the Passpoint configuration added by the caller to be removed
-     * @throws IllegalArgumentException if no configuration is associated with the given FQDN or
-     *                                  Passpoint is not enabled on the device.
-     * @deprecated This will be non-functional in a future release.
-     */
-    @Deprecated
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_CARRIER_PROVISIONING
-    })
-    public void removePasspointConfiguration(String fqdn) {
-        try {
-            if (!mService.removePasspointConfiguration(fqdn, mContext.getOpPackageName())) {
-                throw new IllegalArgumentException();
-            }
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Return the list of installed Passpoint configurations added by the caller.
-     *
-     * An empty list will be returned when no configurations are installed.
-     *
-     * @return A list of {@link PasspointConfiguration} added by the caller
-     * @deprecated This will be non-functional in a future release.
-     */
-    @Deprecated
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD
-    })
-    public List<PasspointConfiguration> getPasspointConfigurations() {
-        try {
-            return mService.getPasspointConfigurations(mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Query for a Hotspot 2.0 release 2 OSU icon file. An {@link #ACTION_PASSPOINT_ICON} intent
-     * will be broadcasted once the request is completed.  The presence of the intent extra
-     * {@link #EXTRA_ICON} will indicate the result of the request.
-     * A missing intent extra {@link #EXTRA_ICON} will indicate a failure.
-     *
-     * @param bssid The BSSID of the AP
-     * @param fileName Name of the icon file (remote file) to query from the AP
-     *
-     * @throws UnsupportedOperationException if Passpoint is not enabled on the device.
-     * @hide
-     */
-    public void queryPasspointIcon(long bssid, String fileName) {
-        try {
-            mService.queryPasspointIcon(bssid, fileName);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Match the currently associated network against the SP matching the given FQDN
-     * @param fqdn FQDN of the SP
-     * @return ordinal [HomeProvider, RoamingProvider, Incomplete, None, Declined]
-     * @hide
-     */
-    public int matchProviderWithCurrentNetwork(String fqdn) {
-        try {
-            return mService.matchProviderWithCurrentNetwork(fqdn);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Deauthenticate and set the re-authentication hold off time for the current network
-     * @param holdoff hold off time in milliseconds
-     * @param ess set if the hold off pertains to an ESS rather than a BSS
-     * @hide
-     *
-     * TODO (140167680): This needs to be removed, the implementation is empty!
-     */
-    public void deauthenticateNetwork(long holdoff, boolean ess) {
-        try {
-            mService.deauthenticateNetwork(holdoff, ess);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Remove the specified network from the list of configured networks.
-     * This may result in the asynchronous delivery of state change
-     * events.
-     *
-     * Applications are not allowed to remove networks created by other
-     * applications.
-     *
-     * @param netId the ID of the network as returned by {@link #addNetwork} or {@link
-     *        #getConfiguredNetworks}.
-     * @return {@code true} if the operation succeeded
-     *
-     * @deprecated
-     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
-     * mechanism to trigger connection to a Wi-Fi network.
-     * b) See {@link #addNetworkSuggestions(List)},
-     * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
-     * when auto-connecting to wifi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always fail and return
-     * {@code false}.
-     * <p>
-     * Deprecation Exemptions:
-     * <ul>
-     * <li>Device Owner (DO), Profile Owner (PO) and system apps.
-     * </ul>
-     */
-    @Deprecated
-    public boolean removeNetwork(int netId) {
-        try {
-            return mService.removeNetwork(netId, mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Allow a previously configured network to be associated with. If
-     * <code>attemptConnect</code> is true, an attempt to connect to the selected
-     * network is initiated. This may result in the asynchronous delivery
-     * of state change events.
-     * <p>
-     * <b>Note:</b> Network communication may not use Wi-Fi even if Wi-Fi is connected;
-     * traffic may instead be sent through another network, such as cellular data,
-     * Bluetooth tethering, or Ethernet. For example, traffic will never use a
-     * Wi-Fi network that does not provide Internet access (e.g. a wireless
-     * printer), if another network that does offer Internet access (e.g.
-     * cellular data) is available. Applications that need to ensure that their
-     * network traffic uses Wi-Fi should use APIs such as
-     * {@link Network#bindSocket(java.net.Socket)},
-     * {@link Network#openConnection(java.net.URL)}, or
-     * {@link ConnectivityManager#bindProcessToNetwork} to do so.
-     *
-     * Applications are not allowed to enable networks created by other
-     * applications.
-     *
-     * @param netId the ID of the network as returned by {@link #addNetwork} or {@link
-     *        #getConfiguredNetworks}.
-     * @param attemptConnect The way to select a particular network to connect to is specify
-     *        {@code true} for this parameter.
-     * @return {@code true} if the operation succeeded
-     *
-     * @deprecated
-     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
-     * mechanism to trigger connection to a Wi-Fi network.
-     * b) See {@link #addNetworkSuggestions(List)},
-     * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
-     * when auto-connecting to wifi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always fail and return
-     * {@code false}.
-     * Deprecation Exemptions:
-     * <ul>
-     * <li>Device Owner (DO), Profile Owner (PO) and system apps.
-     * </ul>
-     */
-    @Deprecated
-    public boolean enableNetwork(int netId, boolean attemptConnect) {
-        try {
-            return mService.enableNetwork(netId, attemptConnect, mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Disable a configured network. The specified network will not be
-     * a candidate for associating. This may result in the asynchronous
-     * delivery of state change events.
-     *
-     * Applications are not allowed to disable networks created by other
-     * applications.
-     *
-     * @param netId the ID of the network as returned by {@link #addNetwork} or {@link
-     *        #getConfiguredNetworks}.
-     * @return {@code true} if the operation succeeded
-     *
-     * @deprecated
-     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
-     * mechanism to trigger connection to a Wi-Fi network.
-     * b) See {@link #addNetworkSuggestions(List)},
-     * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
-     * when auto-connecting to wifi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always fail and return
-     * {@code false}.
-     * <p>
-     * Deprecation Exemptions:
-     * <ul>
-     * <li>Device Owner (DO), Profile Owner (PO) and system apps.
-     * </ul>
-     */
-    @Deprecated
-    public boolean disableNetwork(int netId) {
-        try {
-            return mService.disableNetwork(netId, mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Disassociate from the currently active access point. This may result
-     * in the asynchronous delivery of state change events.
-     * @return {@code true} if the operation succeeded
-     *
-     * @deprecated
-     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
-     * mechanism to trigger connection to a Wi-Fi network.
-     * b) See {@link #addNetworkSuggestions(List)},
-     * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
-     * when auto-connecting to wifi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always fail and return
-     * {@code false}.
-     * <p>
-     * Deprecation Exemptions:
-     * <ul>
-     * <li>Device Owner (DO), Profile Owner (PO) and system apps.
-     * </ul>
-     */
-    @Deprecated
-    public boolean disconnect() {
-        try {
-            return mService.disconnect(mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Reconnect to the currently active access point, if we are currently
-     * disconnected. This may result in the asynchronous delivery of state
-     * change events.
-     * @return {@code true} if the operation succeeded
-     *
-     * @deprecated
-     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
-     * mechanism to trigger connection to a Wi-Fi network.
-     * b) See {@link #addNetworkSuggestions(List)},
-     * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
-     * when auto-connecting to wifi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always fail and return
-     * {@code false}.
-     * <p>
-     * Deprecation Exemptions:
-     * <ul>
-     * <li>Device Owner (DO), Profile Owner (PO) and system apps.
-     * </ul>
-     */
-    @Deprecated
-    public boolean reconnect() {
-        try {
-            return mService.reconnect(mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Reconnect to the currently active access point, even if we are already
-     * connected. This may result in the asynchronous delivery of state
-     * change events.
-     * @return {@code true} if the operation succeeded
-     *
-     * @deprecated
-     * a) See {@link WifiNetworkSpecifier.Builder#build()} for new
-     * mechanism to trigger connection to a Wi-Fi network.
-     * b) See {@link #addNetworkSuggestions(List)},
-     * {@link #removeNetworkSuggestions(List)} for new API to add Wi-Fi networks for consideration
-     * when auto-connecting to wifi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always return false.
-     */
-    @Deprecated
-    public boolean reassociate() {
-        try {
-            return mService.reassociate(mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Check that the supplicant daemon is responding to requests.
-     * @return {@code true} if we were able to communicate with the supplicant and
-     * it returned the expected response to the PING message.
-     * @deprecated Will return the output of {@link #isWifiEnabled()} instead.
-     */
-    @Deprecated
-    public boolean pingSupplicant() {
-        return isWifiEnabled();
-    }
-
-    /** @hide */
-    public static final long WIFI_FEATURE_INFRA            = 0x0001L;  // Basic infrastructure mode
-    /** @hide */
-    public static final long WIFI_FEATURE_PASSPOINT        = 0x0004L;  // Support for GAS/ANQP
-    /** @hide */
-    public static final long WIFI_FEATURE_P2P              = 0x0008L;  // Wifi-Direct
-    /** @hide */
-    public static final long WIFI_FEATURE_MOBILE_HOTSPOT   = 0x0010L;  // Soft AP
-    /** @hide */
-    public static final long WIFI_FEATURE_SCANNER          = 0x0020L;  // WifiScanner APIs
-    /** @hide */
-    public static final long WIFI_FEATURE_AWARE            = 0x0040L;  // Wi-Fi AWare networking
-    /** @hide */
-    public static final long WIFI_FEATURE_D2D_RTT          = 0x0080L;  // Device-to-device RTT
-    /** @hide */
-    public static final long WIFI_FEATURE_D2AP_RTT         = 0x0100L;  // Device-to-AP RTT
-    /** @hide */
-    public static final long WIFI_FEATURE_BATCH_SCAN       = 0x0200L;  // Batched Scan (deprecated)
-    /** @hide */
-    public static final long WIFI_FEATURE_PNO              = 0x0400L;  // Preferred network offload
-    /** @hide */
-    public static final long WIFI_FEATURE_ADDITIONAL_STA   = 0x0800L;  // Support for two STAs
-    /** @hide */
-    public static final long WIFI_FEATURE_TDLS             = 0x1000L;  // Tunnel directed link setup
-    /** @hide */
-    public static final long WIFI_FEATURE_TDLS_OFFCHANNEL  = 0x2000L;  // TDLS off channel
-    /** @hide */
-    public static final long WIFI_FEATURE_EPR              = 0x4000L;  // Enhanced power reporting
-    /** @hide */
-    public static final long WIFI_FEATURE_AP_STA           = 0x8000L;  // AP STA Concurrency
-    /** @hide */
-    public static final long WIFI_FEATURE_LINK_LAYER_STATS = 0x10000L; // Link layer stats
-    /** @hide */
-    public static final long WIFI_FEATURE_LOGGER           = 0x20000L; // WiFi Logger
-    /** @hide */
-    public static final long WIFI_FEATURE_HAL_EPNO         = 0x40000L; // Enhanced PNO
-    /** @hide */
-    public static final long WIFI_FEATURE_RSSI_MONITOR     = 0x80000L; // RSSI Monitor
-    /** @hide */
-    public static final long WIFI_FEATURE_MKEEP_ALIVE      = 0x100000L; // mkeep_alive
-    /** @hide */
-    public static final long WIFI_FEATURE_CONFIG_NDO       = 0x200000L; // ND offload
-    /** @hide */
-    public static final long WIFI_FEATURE_TRANSMIT_POWER   = 0x400000L; // Capture transmit power
-    /** @hide */
-    public static final long WIFI_FEATURE_CONTROL_ROAMING  = 0x800000L; // Control firmware roaming
-    /** @hide */
-    public static final long WIFI_FEATURE_IE_WHITELIST     = 0x1000000L; // Probe IE white listing
-    /** @hide */
-    public static final long WIFI_FEATURE_SCAN_RAND        = 0x2000000L; // Random MAC & Probe seq
-    /** @hide */
-    public static final long WIFI_FEATURE_TX_POWER_LIMIT   = 0x4000000L; // Set Tx power limit
-    /** @hide */
-    public static final long WIFI_FEATURE_WPA3_SAE         = 0x8000000L; // WPA3-Personal SAE
-    /** @hide */
-    public static final long WIFI_FEATURE_WPA3_SUITE_B     = 0x10000000L; // WPA3-Enterprise Suite-B
-    /** @hide */
-    public static final long WIFI_FEATURE_OWE              = 0x20000000L; // Enhanced Open
-    /** @hide */
-    public static final long WIFI_FEATURE_LOW_LATENCY      = 0x40000000L; // Low Latency modes
-    /** @hide */
-    public static final long WIFI_FEATURE_DPP              = 0x80000000L; // DPP (Easy-Connect)
-    /** @hide */
-    public static final long WIFI_FEATURE_P2P_RAND_MAC     = 0x100000000L; // Random P2P MAC
-    /** @hide */
-    public static final long WIFI_FEATURE_CONNECTED_RAND_MAC    = 0x200000000L; // Random STA MAC
-    /** @hide */
-    public static final long WIFI_FEATURE_AP_RAND_MAC      = 0x400000000L; // Random AP MAC
-    /** @hide */
-    public static final long WIFI_FEATURE_MBO              = 0x800000000L; // MBO Support
-    /** @hide */
-    public static final long WIFI_FEATURE_OCE              = 0x1000000000L; // OCE Support
-    /** @hide */
-    public static final long WIFI_FEATURE_WAPI             = 0x2000000000L; // WAPI
-
-    /** @hide */
-    public static final long WIFI_FEATURE_FILS_SHA256     = 0x4000000000L; // FILS-SHA256
-
-    /** @hide */
-    public static final long WIFI_FEATURE_FILS_SHA384     = 0x8000000000L; // FILS-SHA384
-
-    private long getSupportedFeatures() {
-        try {
-            return mService.getSupportedFeatures();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    private boolean isFeatureSupported(long feature) {
-        return (getSupportedFeatures() & feature) == feature;
-    }
-
-    /**
-     * @return true if this adapter supports Passpoint
-     * @hide
-     */
-    public boolean isPasspointSupported() {
-        return isFeatureSupported(WIFI_FEATURE_PASSPOINT);
-    }
-
-    /**
-     * @return true if this adapter supports WifiP2pManager (Wi-Fi Direct)
-     */
-    public boolean isP2pSupported() {
-        return isFeatureSupported(WIFI_FEATURE_P2P);
-    }
-
-    /**
-     * @return true if this adapter supports portable Wi-Fi hotspot
-     * @hide
-     */
-    @SystemApi
-    public boolean isPortableHotspotSupported() {
-        return isFeatureSupported(WIFI_FEATURE_MOBILE_HOTSPOT);
-    }
-
-    /**
-     * @return true if this adapter supports WifiScanner APIs
-     * @hide
-     */
-    @SystemApi
-    public boolean isWifiScannerSupported() {
-        return isFeatureSupported(WIFI_FEATURE_SCANNER);
-    }
-
-    /**
-     * @return true if this adapter supports Neighbour Awareness Network APIs
-     * @hide
-     */
-    public boolean isWifiAwareSupported() {
-        return isFeatureSupported(WIFI_FEATURE_AWARE);
-    }
-
-    /**
-     * Query whether the device supports Station (STA) + Access point (AP) concurrency or not.
-     *
-     * @return true if this device supports STA + AP concurrency, false otherwise.
-     */
-    public boolean isStaApConcurrencySupported() {
-        return isFeatureSupported(WIFI_FEATURE_AP_STA);
-    }
-
-    /**
-     * @deprecated Please use {@link android.content.pm.PackageManager#hasSystemFeature(String)}
-     * with {@link android.content.pm.PackageManager#FEATURE_WIFI_RTT} and
-     * {@link android.content.pm.PackageManager#FEATURE_WIFI_AWARE}.
-     *
-     * @return true if this adapter supports Device-to-device RTT
-     * @hide
-     */
-    @Deprecated
-    @SystemApi
-    public boolean isDeviceToDeviceRttSupported() {
-        return isFeatureSupported(WIFI_FEATURE_D2D_RTT);
-    }
-
-    /**
-     * @deprecated Please use {@link android.content.pm.PackageManager#hasSystemFeature(String)}
-     * with {@link android.content.pm.PackageManager#FEATURE_WIFI_RTT}.
-     *
-     * @return true if this adapter supports Device-to-AP RTT
-     */
-    @Deprecated
-    public boolean isDeviceToApRttSupported() {
-        return isFeatureSupported(WIFI_FEATURE_D2AP_RTT);
-    }
-
-    /**
-     * @return true if this adapter supports offloaded connectivity scan
-     */
-    public boolean isPreferredNetworkOffloadSupported() {
-        return isFeatureSupported(WIFI_FEATURE_PNO);
-    }
-
-    /**
-     * @return true if this adapter supports multiple simultaneous connections
-     * @hide
-     */
-    public boolean isAdditionalStaSupported() {
-        return isFeatureSupported(WIFI_FEATURE_ADDITIONAL_STA);
-    }
-
-    /**
-     * @return true if this adapter supports Tunnel Directed Link Setup
-     */
-    public boolean isTdlsSupported() {
-        return isFeatureSupported(WIFI_FEATURE_TDLS);
-    }
-
-    /**
-     * @return true if this adapter supports Off Channel Tunnel Directed Link Setup
-     * @hide
-     */
-    public boolean isOffChannelTdlsSupported() {
-        return isFeatureSupported(WIFI_FEATURE_TDLS_OFFCHANNEL);
-    }
-
-    /**
-     * @return true if this adapter supports advanced power/performance counters
-     */
-    public boolean isEnhancedPowerReportingSupported() {
-        return isFeatureSupported(WIFI_FEATURE_LINK_LAYER_STATS);
-    }
-
-    /**
-     * @return true if this device supports connected MAC randomization.
-     * @hide
-     */
-    @SystemApi
-    public boolean isConnectedMacRandomizationSupported() {
-        return isFeatureSupported(WIFI_FEATURE_CONNECTED_RAND_MAC);
-    }
-
-    /**
-     * @return true if this device supports connected MAC randomization.
-     * @hide
-     */
-    @SystemApi
-    public boolean isApMacRandomizationSupported() {
-        return isFeatureSupported(WIFI_FEATURE_AP_RAND_MAC);
-    }
-
-    /**
-     * Check if the chipset supports 5GHz band.
-     * @return {@code true} if supported, {@code false} otherwise.
-     */
-    public boolean is5GHzBandSupported() {
-        try {
-            return mService.is5GHzBandSupported();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Check if the chipset supports 6GHz band.
-     * @return {@code true} if supported, {@code false} otherwise.
-     */
-    public boolean is6GHzBandSupported() {
-        try {
-            return mService.is6GHzBandSupported();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Check if the chipset supports a certain Wi-Fi standard.
-     * @param standard the IEEE 802.11 standard to check on.
-     *        valid values from {@link ScanResult}'s {@code WIFI_STANDARD_}
-     * @return {@code true} if supported, {@code false} otherwise.
-     */
-    public boolean isWifiStandardSupported(@WifiAnnotations.WifiStandard int standard) {
-        try {
-            return mService.isWifiStandardSupported(standard);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Interface for Wi-Fi activity energy info listener. Should be implemented by applications and
-     * set when calling {@link WifiManager#getWifiActivityEnergyInfoAsync}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public interface OnWifiActivityEnergyInfoListener {
-        /**
-         * Called when Wi-Fi activity energy info is available.
-         * Note: this listener is triggered at most once for each call to
-         * {@link #getWifiActivityEnergyInfoAsync}.
-         *
-         * @param info the latest {@link WifiActivityEnergyInfo}, or null if unavailable.
-         */
-        void onWifiActivityEnergyInfo(@Nullable WifiActivityEnergyInfo info);
-    }
-
-    private static class OnWifiActivityEnergyInfoProxy
-            extends IOnWifiActivityEnergyInfoListener.Stub {
-        private final Object mLock = new Object();
-        @Nullable @GuardedBy("mLock") private Executor mExecutor;
-        @Nullable @GuardedBy("mLock") private OnWifiActivityEnergyInfoListener mListener;
-
-        OnWifiActivityEnergyInfoProxy(Executor executor,
-                OnWifiActivityEnergyInfoListener listener) {
-            mExecutor = executor;
-            mListener = listener;
-        }
-
-        @Override
-        public void onWifiActivityEnergyInfo(WifiActivityEnergyInfo info) {
-            Executor executor;
-            OnWifiActivityEnergyInfoListener listener;
-            synchronized (mLock) {
-                if (mExecutor == null || mListener == null) {
-                    return;
-                }
-                executor = mExecutor;
-                listener = mListener;
-                // null out to allow garbage collection, prevent triggering listener more than once
-                mExecutor = null;
-                mListener = null;
-            }
-            Binder.clearCallingIdentity();
-            executor.execute(() -> listener.onWifiActivityEnergyInfo(info));
-        }
-    }
-
-    /**
-     * Request to get the current {@link WifiActivityEnergyInfo} asynchronously.
-     * Note: This method will return null if {@link #isEnhancedPowerReportingSupported()} returns
-     * false.
-     *
-     * @param executor the executor that the listener will be invoked on
-     * @param listener the listener that will receive the {@link WifiActivityEnergyInfo} object
-     *                 when it becomes available. The listener will be triggered at most once for
-     *                 each call to this method.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(ACCESS_WIFI_STATE)
-    public void getWifiActivityEnergyInfoAsync(
-            @NonNull @CallbackExecutor Executor executor,
-            @NonNull OnWifiActivityEnergyInfoListener listener) {
-        Objects.requireNonNull(executor, "executor cannot be null");
-        Objects.requireNonNull(listener, "listener cannot be null");
-        try {
-            mService.getWifiActivityEnergyInfoAsync(
-                    new OnWifiActivityEnergyInfoProxy(executor, listener));
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Request a scan for access points. Returns immediately. The availability
-     * of the results is made known later by means of an asynchronous event sent
-     * on completion of the scan.
-     * <p>
-     * To initiate a Wi-Fi scan, declare the
-     * {@link android.Manifest.permission#CHANGE_WIFI_STATE}
-     * permission in the manifest, and perform these steps:
-     * </p>
-     * <ol style="1">
-     * <li>Invoke the following method:
-     * {@code ((WifiManager) getSystemService(WIFI_SERVICE)).startScan()}</li>
-     * <li>
-     * Register a BroadcastReceiver to listen to
-     * {@code SCAN_RESULTS_AVAILABLE_ACTION}.</li>
-     * <li>When a broadcast is received, call:
-     * {@code ((WifiManager) getSystemService(WIFI_SERVICE)).getScanResults()}</li>
-     * </ol>
-     * @return {@code true} if the operation succeeded, i.e., the scan was initiated.
-     * @deprecated The ability for apps to trigger scan requests will be removed in a future
-     * release.
-     */
-    @Deprecated
-    public boolean startScan() {
-        return startScan(null);
-    }
-
-    /** @hide */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
-    public boolean startScan(WorkSource workSource) {
-        try {
-            String packageName = mContext.getOpPackageName();
-            String attributionTag = mContext.getAttributionTag();
-            return mService.startScan(packageName, attributionTag);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * WPS has been deprecated from Client mode operation.
-     *
-     * @return null
-     * @hide
-     * @deprecated This API is deprecated
-     */
-    public String getCurrentNetworkWpsNfcConfigurationToken() {
-        return null;
-    }
-
-    /**
-     * Return dynamic information about the current Wi-Fi connection, if any is active.
-     * <p>
-     * In the connected state, access to the SSID and BSSID requires
-     * the same permissions as {@link #getScanResults}. If such access is not allowed,
-     * {@link WifiInfo#getSSID} will return {@link #UNKNOWN_SSID} and
-     * {@link WifiInfo#getBSSID} will return {@code "02:00:00:00:00:00"}.
-     * {@link WifiInfo#getPasspointFqdn()} will return null.
-     * {@link WifiInfo#getPasspointProviderFriendlyName()} will return null.
-     *
-     * @return the Wi-Fi information, contained in {@link WifiInfo}.
-     */
-    public WifiInfo getConnectionInfo() {
-        try {
-            return mService.getConnectionInfo(mContext.getOpPackageName(),
-                    mContext.getAttributionTag());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Return the results of the latest access point scan.
-     * @return the list of access points found in the most recent scan. An app must hold
-     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION} permission
-     * in order to get valid results.
-     */
-    public List<ScanResult> getScanResults() {
-        try {
-            return mService.getScanResults(mContext.getOpPackageName(),
-                    mContext.getAttributionTag());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Get the filtered ScanResults which match the network configurations specified by the
-     * {@code networkSuggestionsToMatch}. Suggestions which use {@link WifiConfiguration} use
-     * SSID and the security type to match. Suggestions which use {@link PasspointConfigration}
-     * use the matching rules of Hotspot 2.0.
-     * @param networkSuggestionsToMatch The list of {@link WifiNetworkSuggestion} to match against.
-     * These may or may not be suggestions which are installed on the device.
-     * @param scanResults The scan results to be filtered. Optional - if not provided(empty list),
-     * the Wi-Fi service will use the most recent scan results which the system has.
-     * @return The map of {@link WifiNetworkSuggestion} to the list of {@link ScanResult}
-     * corresponding to networks which match them.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(allOf = {ACCESS_FINE_LOCATION, ACCESS_WIFI_STATE})
-    @NonNull
-    public Map<WifiNetworkSuggestion, List<ScanResult>> getMatchingScanResults(
-            @NonNull List<WifiNetworkSuggestion> networkSuggestionsToMatch,
-            @Nullable List<ScanResult> scanResults) {
-        if (networkSuggestionsToMatch == null) {
-            throw new IllegalArgumentException("networkSuggestions must not be null.");
-        }
-        try {
-            return mService.getMatchingScanResults(
-                    networkSuggestionsToMatch, scanResults,
-                    mContext.getOpPackageName(), mContext.getAttributionTag());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Set if scanning is always available.
-     *
-     * If set to {@code true}, apps can issue {@link #startScan} and fetch scan results
-     * even when Wi-Fi is turned off.
-     *
-     * @param isAvailable true to enable, false to disable.
-     * @hide
-     * @see #isScanAlwaysAvailable()
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void setScanAlwaysAvailable(boolean isAvailable) {
-        try {
-            mService.setScanAlwaysAvailable(isAvailable);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Check if scanning is always available.
-     *
-     * If this return {@code true}, apps can issue {@link #startScan} and fetch scan results
-     * even when Wi-Fi is turned off.
-     *
-     * To change this setting, see {@link #ACTION_REQUEST_SCAN_ALWAYS_AVAILABLE}.
-     * @deprecated The ability for apps to trigger scan requests will be removed in a future
-     * release.
-     */
-    @Deprecated
-    public boolean isScanAlwaysAvailable() {
-        try {
-            return mService.isScanAlwaysAvailable();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Tell the device to persist the current list of configured networks.
-     * <p>
-     * Note: It is possible for this method to change the network IDs of
-     * existing networks. You should assume the network IDs can be different
-     * after calling this method.
-     *
-     * @return {@code false}.
-     * @deprecated There is no need to call this method -
-     * {@link #addNetwork(WifiConfiguration)}, {@link #updateNetwork(WifiConfiguration)}
-     * and {@link #removeNetwork(int)} already persist the configurations automatically.
-     */
-    @Deprecated
-    public boolean saveConfiguration() {
-        return false;
-    }
-
-    /**
-     * Get the country code.
-     * @return the country code in ISO 3166 alpha-2 (2-letter) uppercase format, or null if
-     * there is no country code configured.
-     * @hide
-     */
-    @Nullable
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public String getCountryCode() {
-        try {
-            return mService.getCountryCode();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Return the DHCP-assigned addresses from the last successful DHCP request,
-     * if any.
-     * @return the DHCP information
-     */
-    public DhcpInfo getDhcpInfo() {
-        try {
-            return mService.getDhcpInfo();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Enable or disable Wi-Fi.
-     * <p>
-     * Applications must have the {@link android.Manifest.permission#CHANGE_WIFI_STATE}
-     * permission to toggle wifi.
-     *
-     * @param enabled {@code true} to enable, {@code false} to disable.
-     * @return {@code false} if the request cannot be satisfied; {@code true} indicates that wifi is
-     *         either already in the requested state, or in progress toward the requested state.
-     * @throws  {@link java.lang.SecurityException} if the caller is missing required permissions.
-     *
-     * @deprecated Starting with Build.VERSION_CODES#Q, applications are not allowed to
-     * enable/disable Wi-Fi.
-     * <b>Compatibility Note:</b> For applications targeting
-     * {@link android.os.Build.VERSION_CODES#Q} or above, this API will always fail and return
-     * {@code false}. If apps are targeting an older SDK ({@link android.os.Build.VERSION_CODES#P}
-     * or below), they can continue to use this API.
-     * <p>
-     * Deprecation Exemptions:
-     * <ul>
-     * <li>Device Owner (DO), Profile Owner (PO) and system apps.
-     * </ul>
-     */
-    @Deprecated
-    public boolean setWifiEnabled(boolean enabled) {
-        try {
-            return mService.setWifiEnabled(mContext.getOpPackageName(), enabled);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Gets the Wi-Fi enabled state.
-     * @return One of {@link #WIFI_STATE_DISABLED},
-     *         {@link #WIFI_STATE_DISABLING}, {@link #WIFI_STATE_ENABLED},
-     *         {@link #WIFI_STATE_ENABLING}, {@link #WIFI_STATE_UNKNOWN}
-     * @see #isWifiEnabled()
-     */
-    public int getWifiState() {
-        try {
-            return mService.getWifiEnabledState();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Return whether Wi-Fi is enabled or disabled.
-     * @return {@code true} if Wi-Fi is enabled
-     * @see #getWifiState()
-     */
-    public boolean isWifiEnabled() {
-        return getWifiState() == WIFI_STATE_ENABLED;
-    }
-
-    /**
-     * Calculates the level of the signal. This should be used any time a signal
-     * is being shown.
-     *
-     * @param rssi The power of the signal measured in RSSI.
-     * @param numLevels The number of levels to consider in the calculated level.
-     * @return A level of the signal, given in the range of 0 to numLevels-1 (both inclusive).
-     * @deprecated Callers should use {@link #calculateSignalLevel(int)} instead to get the
-     * signal level using the system default RSSI thresholds, or otherwise compute the RSSI level
-     * themselves using their own formula.
-     */
-    @Deprecated
-    public static int calculateSignalLevel(int rssi, int numLevels) {
-        if (rssi <= MIN_RSSI) {
-            return 0;
-        } else if (rssi >= MAX_RSSI) {
-            return numLevels - 1;
-        } else {
-            float inputRange = (MAX_RSSI - MIN_RSSI);
-            float outputRange = (numLevels - 1);
-            return (int)((float)(rssi - MIN_RSSI) * outputRange / inputRange);
-        }
-    }
-
-    /**
-     * Given a raw RSSI, return the RSSI signal quality rating using the system default RSSI
-     * quality rating thresholds.
-     * @param rssi a raw RSSI value, in dBm, usually between -55 and -90
-     * @return the RSSI signal quality rating, in the range
-     * [0, {@link #getMaxSignalLevel()}], where 0 is the lowest (worst signal) RSSI
-     * rating and {@link #getMaxSignalLevel()} is the highest (best signal) RSSI rating.
-     */
-    @IntRange(from = 0)
-    public int calculateSignalLevel(int rssi) {
-        try {
-            return mService.calculateSignalLevel(rssi);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Get the system default maximum signal level.
-     * This is the maximum RSSI level returned by {@link #calculateSignalLevel(int)}.
-     */
-    @IntRange(from = 0)
-    public int getMaxSignalLevel() {
-        return calculateSignalLevel(Integer.MAX_VALUE);
-    }
-
-    /**
-     * Compares two signal strengths.
-     *
-     * @param rssiA The power of the first signal measured in RSSI.
-     * @param rssiB The power of the second signal measured in RSSI.
-     * @return Returns <0 if the first signal is weaker than the second signal,
-     *         0 if the two signals have the same strength, and >0 if the first
-     *         signal is stronger than the second signal.
-     */
-    public static int compareSignalLevel(int rssiA, int rssiB) {
-        return rssiA - rssiB;
-    }
-
-    /**
-     * Call allowing ConnectivityService to update WifiService with interface mode changes.
-     *
-     * @param ifaceName String name of the updated interface, or null to represent all interfaces
-     * @param mode int representing the new mode, one of:
-     *             {@link #IFACE_IP_MODE_TETHERED},
-     *             {@link #IFACE_IP_MODE_LOCAL_ONLY},
-     *             {@link #IFACE_IP_MODE_CONFIGURATION_ERROR},
-     *             {@link #IFACE_IP_MODE_UNSPECIFIED}
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_STACK,
-            NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK
-    })
-    public void updateInterfaceIpState(@Nullable String ifaceName, @IfaceIpMode int mode) {
-        try {
-            mService.updateInterfaceIpState(ifaceName, mode);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Start Soft AP (hotspot) mode for tethering purposes with the specified configuration.
-     * Note that starting Soft AP mode may disable station mode operation if the device does not
-     * support concurrency.
-     * @param wifiConfig SSID, security and channel details as part of WifiConfiguration, or null to
-     *                   use the persisted Soft AP configuration that was previously set using
-     *                   {@link #setWifiApConfiguration(WifiConfiguration)}.
-     * @return {@code true} if the operation succeeded, {@code false} otherwise
-     *
-     * @hide
-     */
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_STACK,
-            NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK
-    })
-    public boolean startSoftAp(@Nullable WifiConfiguration wifiConfig) {
-        try {
-            return mService.startSoftAp(wifiConfig);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Start Soft AP (hotspot) mode for tethering purposes with the specified configuration.
-     * Note that starting Soft AP mode may disable station mode operation if the device does not
-     * support concurrency.
-     * @param softApConfig A valid SoftApConfiguration specifying the configuration of the SAP,
-     *                     or null to use the persisted Soft AP configuration that was previously
-     *                     set using {@link #setSoftApConfiguration(softApConfiguration)}.
-     * @return {@code true} if the operation succeeded, {@code false} otherwise
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_STACK,
-            NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK
-    })
-    public boolean startTetheredHotspot(@Nullable SoftApConfiguration softApConfig) {
-        try {
-            return mService.startTetheredHotspot(softApConfig);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-
-    /**
-     * Stop SoftAp mode.
-     * Note that stopping softap mode will restore the previous wifi mode.
-     * @return {@code true} if the operation succeeds, {@code false} otherwise
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_STACK,
-            NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK
-    })
-    public boolean stopSoftAp() {
-        try {
-            return mService.stopSoftAp();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Request a local only hotspot that an application can use to communicate between co-located
-     * devices connected to the created WiFi hotspot.  The network created by this method will not
-     * have Internet access.  Each application can make a single request for the hotspot, but
-     * multiple applications could be requesting the hotspot at the same time.  When multiple
-     * applications have successfully registered concurrently, they will be sharing the underlying
-     * hotspot. {@link LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} is called
-     * when the hotspot is ready for use by the application.
-     * <p>
-     * Each application can make a single active call to this method. The {@link
-     * LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} callback supplies the
-     * requestor with a {@link LocalOnlyHotspotReservation} that contains a
-     * {@link SoftApConfiguration} with the SSID, security type and credentials needed to connect
-     * to the hotspot.  Communicating this information is up to the application.
-     * <p>
-     * If the LocalOnlyHotspot cannot be created, the {@link LocalOnlyHotspotCallback#onFailed(int)}
-     * method will be called. Example failures include errors bringing up the network or if
-     * there is an incompatible operating mode.  For example, if the user is currently using Wifi
-     * Tethering to provide an upstream to another device, LocalOnlyHotspot will not start due to
-     * an incompatible mode. The possible error codes include:
-     * {@link LocalOnlyHotspotCallback#ERROR_NO_CHANNEL},
-     * {@link LocalOnlyHotspotCallback#ERROR_GENERIC},
-     * {@link LocalOnlyHotspotCallback#ERROR_INCOMPATIBLE_MODE} and
-     * {@link LocalOnlyHotspotCallback#ERROR_TETHERING_DISALLOWED}.
-     * <p>
-     * Internally, requests will be tracked to prevent the hotspot from being torn down while apps
-     * are still using it.  The {@link LocalOnlyHotspotReservation} object passed in the  {@link
-     * LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} call should be closed when
-     * the LocalOnlyHotspot is no longer needed using {@link LocalOnlyHotspotReservation#close()}.
-     * Since the hotspot may be shared among multiple applications, removing the final registered
-     * application request will trigger the hotspot teardown.  This means that applications should
-     * not listen to broadcasts containing wifi state to determine if the hotspot was stopped after
-     * they are done using it. Additionally, once {@link LocalOnlyHotspotReservation#close()} is
-     * called, applications will not receive callbacks of any kind.
-     * <p>
-     * Applications should be aware that the user may also stop the LocalOnlyHotspot through the
-     * Settings UI; it is not guaranteed to stay up as long as there is a requesting application.
-     * The requestors will be notified of this case via
-     * {@link LocalOnlyHotspotCallback#onStopped()}.  Other cases may arise where the hotspot is
-     * torn down (Emergency mode, etc).  Application developers should be aware that it can stop
-     * unexpectedly, but they will receive a notification if they have properly registered.
-     * <p>
-     * Applications should also be aware that this network will be shared with other applications.
-     * Applications are responsible for protecting their data on this network (e.g., TLS).
-     * <p>
-     * Applications need to have the following permissions to start LocalOnlyHotspot: {@link
-     * android.Manifest.permission#CHANGE_WIFI_STATE} and {@link
-     * android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION}.  Callers without
-     * the permissions will trigger a {@link java.lang.SecurityException}.
-     * <p>
-     * @param callback LocalOnlyHotspotCallback for the application to receive updates about
-     * operating status.
-     * @param handler Handler to be used for callbacks.  If the caller passes a null Handler, the
-     * main thread will be used.
-     */
-    @RequiresPermission(allOf = {
-            android.Manifest.permission.CHANGE_WIFI_STATE,
-            android.Manifest.permission.ACCESS_FINE_LOCATION})
-    public void startLocalOnlyHotspot(LocalOnlyHotspotCallback callback,
-            @Nullable Handler handler) {
-        Executor executor = handler == null ? null : new HandlerExecutor(handler);
-        startLocalOnlyHotspotInternal(null, executor, callback);
-    }
-
-    /**
-     * Starts a local-only hotspot with a specific configuration applied. See
-     * {@link #startLocalOnlyHotspot(LocalOnlyHotspotCallback, Handler)}.
-     *
-     * Applications need either {@link android.Manifest.permission#NETWORK_SETUP_WIZARD} or
-     * {@link android.Manifest.permission#NETWORK_SETTINGS} to call this method.
-     *
-     * Since custom configuration settings may be incompatible with each other, the hotspot started
-     * through this method cannot coexist with another hotspot created through
-     * startLocalOnlyHotspot. If this is attempted, the first hotspot request wins and others
-     * receive {@link LocalOnlyHotspotCallback#ERROR_GENERIC} through
-     * {@link LocalOnlyHotspotCallback#onFailed}.
-     *
-     * @param config Custom configuration for the hotspot. See {@link SoftApConfiguration}.
-     * @param executor Executor to run callback methods on, or null to use the main thread.
-     * @param callback Callback object for updates about hotspot status, or null for no updates.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD})
-    public void startLocalOnlyHotspot(@NonNull SoftApConfiguration config,
-            @Nullable Executor executor,
-            @Nullable LocalOnlyHotspotCallback callback) {
-        Objects.requireNonNull(config);
-        startLocalOnlyHotspotInternal(config, executor, callback);
-    }
-
-    /**
-     * Common implementation of both configurable and non-configurable LOHS.
-     *
-     * @param config App-specified configuration, or null. When present, additional privileges are
-     *               required, and the hotspot cannot be shared with other clients.
-     * @param executor Executor to run callback methods on, or null to use the main thread.
-     * @param callback Callback object for updates about hotspot status, or null for no updates.
-     */
-    private void startLocalOnlyHotspotInternal(
-            @Nullable SoftApConfiguration config,
-            @Nullable Executor executor,
-            @Nullable LocalOnlyHotspotCallback callback) {
-        if (executor == null) {
-            executor = mContext.getMainExecutor();
-        }
-        synchronized (mLock) {
-            LocalOnlyHotspotCallbackProxy proxy =
-                    new LocalOnlyHotspotCallbackProxy(this, executor, callback);
-            try {
-                String packageName = mContext.getOpPackageName();
-                String featureId = mContext.getAttributionTag();
-                int returnCode = mService.startLocalOnlyHotspot(proxy, packageName, featureId,
-                        config);
-                if (returnCode != LocalOnlyHotspotCallback.REQUEST_REGISTERED) {
-                    // Send message to the proxy to make sure we call back on the correct thread
-                    proxy.onHotspotFailed(returnCode);
-                    return;
-                }
-                mLOHSCallbackProxy = proxy;
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        }
-    }
-
-    /**
-     * Cancels a pending local only hotspot request.  This can be used by the calling application to
-     * cancel the existing request if the provided callback has not been triggered.  Calling this
-     * method will be equivalent to closing the returned LocalOnlyHotspotReservation, but it is not
-     * explicitly required.
-     * <p>
-     * When cancelling this request, application developers should be aware that there may still be
-     * outstanding local only hotspot requests and the hotspot may still start, or continue running.
-     * Additionally, if a callback was registered, it will no longer be triggered after calling
-     * cancel.
-     *
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public void cancelLocalOnlyHotspotRequest() {
-        synchronized (mLock) {
-            stopLocalOnlyHotspot();
-        }
-    }
-
-    /**
-     *  Method used to inform WifiService that the LocalOnlyHotspot is no longer needed.  This
-     *  method is used by WifiManager to release LocalOnlyHotspotReservations held by calling
-     *  applications and removes the internal tracking for the hotspot request.  When all requesting
-     *  applications are finished using the hotspot, it will be stopped and WiFi will return to the
-     *  previous operational mode.
-     *
-     *  This method should not be called by applications.  Instead, they should call the close()
-     *  method on their LocalOnlyHotspotReservation.
-     */
-    private void stopLocalOnlyHotspot() {
-        synchronized (mLock) {
-            if (mLOHSCallbackProxy == null) {
-                // nothing to do, the callback was already cleaned up.
-                return;
-            }
-            mLOHSCallbackProxy = null;
-            try {
-                mService.stopLocalOnlyHotspot();
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        }
-    }
-
-    /**
-     * Allow callers (Settings UI) to watch LocalOnlyHotspot state changes.  Callers will
-     * receive a {@link LocalOnlyHotspotSubscription} object as a parameter of the
-     * {@link LocalOnlyHotspotObserver#onRegistered(LocalOnlyHotspotSubscription)}. The registered
-     * callers will receive the {@link LocalOnlyHotspotObserver#onStarted(SoftApConfiguration)} and
-     * {@link LocalOnlyHotspotObserver#onStopped()} callbacks.
-     * <p>
-     * Applications should have the
-     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION ACCESS_FINE_LOCATION}
-     * permission.  Callers without the permission will trigger a
-     * {@link java.lang.SecurityException}.
-     * <p>
-     * @param observer LocalOnlyHotspotObserver callback.
-     * @param handler Handler to use for callbacks
-     *
-     * @hide
-     */
-    public void watchLocalOnlyHotspot(LocalOnlyHotspotObserver observer,
-            @Nullable Handler handler) {
-        Executor executor = handler == null ? mContext.getMainExecutor()
-                : new HandlerExecutor(handler);
-        synchronized (mLock) {
-            mLOHSObserverProxy =
-                    new LocalOnlyHotspotObserverProxy(this, executor, observer);
-            try {
-                mService.startWatchLocalOnlyHotspot(mLOHSObserverProxy);
-                mLOHSObserverProxy.registered();
-            } catch (RemoteException e) {
-                mLOHSObserverProxy = null;
-                throw e.rethrowFromSystemServer();
-            }
-        }
-    }
-
-    /**
-     * Allow callers to stop watching LocalOnlyHotspot state changes.  After calling this method,
-     * applications will no longer receive callbacks.
-     *
-     * @hide
-     */
-    public void unregisterLocalOnlyHotspotObserver() {
-        synchronized (mLock) {
-            if (mLOHSObserverProxy == null) {
-                // nothing to do, the callback was already cleaned up
-                return;
-            }
-            mLOHSObserverProxy = null;
-            try {
-                mService.stopWatchLocalOnlyHotspot();
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        }
-    }
-
-    /**
-     * Gets the tethered Wi-Fi hotspot enabled state.
-     * @return One of {@link #WIFI_AP_STATE_DISABLED},
-     *         {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED},
-     *         {@link #WIFI_AP_STATE_ENABLING}, {@link #WIFI_AP_STATE_FAILED}
-     * @see #isWifiApEnabled()
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE)
-    public int getWifiApState() {
-        try {
-            return mService.getWifiApEnabledState();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Return whether tethered Wi-Fi AP is enabled or disabled.
-     * @return {@code true} if tethered  Wi-Fi AP is enabled
-     * @see #getWifiApState()
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE)
-    public boolean isWifiApEnabled() {
-        return getWifiApState() == WIFI_AP_STATE_ENABLED;
-    }
-
-    /**
-     * Gets the tethered Wi-Fi AP Configuration.
-     * @return AP details in WifiConfiguration
-     *
-     * Note that AP detail may contain configuration which is cannot be represented
-     * by the legacy WifiConfiguration, in such cases a null will be returned.
-     *
-     * @deprecated This API is deprecated. Use {@link #getSoftApConfiguration()} instead.
-     * @hide
-     */
-    @Nullable
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE)
-    @Deprecated
-    public WifiConfiguration getWifiApConfiguration() {
-        try {
-            return mService.getWifiApConfiguration();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Gets the Wi-Fi tethered AP Configuration.
-     * @return AP details in {@link SoftApConfiguration}
-     *
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public SoftApConfiguration getSoftApConfiguration() {
-        try {
-            return mService.getSoftApConfiguration();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Sets the tethered Wi-Fi AP Configuration.
-     * @return {@code true} if the operation succeeded, {@code false} otherwise
-     *
-     * @deprecated This API is deprecated. Use {@link #setSoftApConfiguration(SoftApConfiguration)}
-     * instead.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.CHANGE_WIFI_STATE)
-    @Deprecated
-    public boolean setWifiApConfiguration(WifiConfiguration wifiConfig) {
-        try {
-            return mService.setWifiApConfiguration(wifiConfig, mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Sets the tethered Wi-Fi AP Configuration.
-     *
-     * If the API is called while the tethered soft AP is enabled, the configuration will apply to
-     * the current soft AP if the new configuration only includes
-     * {@link SoftApConfiguration.Builder#setMaxNumberOfClients(int)}
-     * or {@link SoftApConfiguration.Builder#setShutdownTimeoutMillis(long)}
-     * or {@link SoftApConfiguration.Builder#setClientControlByUserEnabled(boolean)}
-     * or {@link SoftApConfiguration.Builder#setBlockedClientList(List)}
-     * or {@link SoftApConfiguration.Builder#setAllowedClientList(List)}
-     *
-     * Otherwise, the configuration changes will be applied when the Soft AP is next started
-     * (the framework will not stop/start the AP).
-     *
-     * @param softApConfig  A valid SoftApConfiguration specifying the configuration of the SAP.
-     * @return {@code true} if the operation succeeded, {@code false} otherwise
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public boolean setSoftApConfiguration(@NonNull SoftApConfiguration softApConfig) {
-        try {
-            return mService.setSoftApConfiguration(
-                    softApConfig, mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Enable/Disable TDLS on a specific local route.
-     *
-     * <p>
-     * TDLS enables two wireless endpoints to talk to each other directly
-     * without going through the access point that is managing the local
-     * network. It saves bandwidth and improves quality of the link.
-     * </p>
-     * <p>
-     * This API enables/disables the option of using TDLS. If enabled, the
-     * underlying hardware is free to use TDLS or a hop through the access
-     * point. If disabled, existing TDLS session is torn down and
-     * hardware is restricted to use access point for transferring wireless
-     * packets. Default value for all routes is 'disabled', meaning restricted
-     * to use access point for transferring packets.
-     * </p>
-     *
-     * @param remoteIPAddress IP address of the endpoint to setup TDLS with
-     * @param enable true = setup and false = tear down TDLS
-     */
-    public void setTdlsEnabled(InetAddress remoteIPAddress, boolean enable) {
-        try {
-            mService.enableTdls(remoteIPAddress.getHostAddress(), enable);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Similar to {@link #setTdlsEnabled(InetAddress, boolean) }, except
-     * this version allows you to specify remote endpoint with a MAC address.
-     * @param remoteMacAddress MAC address of the remote endpoint such as 00:00:0c:9f:f2:ab
-     * @param enable true = setup and false = tear down TDLS
-     */
-    public void setTdlsEnabledWithMacAddress(String remoteMacAddress, boolean enable) {
-        try {
-            mService.enableTdlsWithMacAddress(remoteMacAddress, enable);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Passed with {@link ActionListener#onFailure}.
-     * Indicates that the operation failed due to an internal error.
-     * @hide
-     */
-    public static final int ERROR                       = 0;
-
-    /**
-     * Passed with {@link ActionListener#onFailure}.
-     * Indicates that the operation is already in progress
-     * @hide
-     */
-    public static final int IN_PROGRESS                 = 1;
-
-    /**
-     * Passed with {@link ActionListener#onFailure}.
-     * Indicates that the operation failed because the framework is busy and
-     * unable to service the request
-     * @hide
-     */
-    public static final int BUSY                        = 2;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef({ERROR, IN_PROGRESS, BUSY})
-    public @interface ActionListenerFailureReason {}
-
-    /* WPS specific errors */
-    /** WPS overlap detected
-     * @deprecated This is deprecated
-     */
-    public static final int WPS_OVERLAP_ERROR           = 3;
-    /** WEP on WPS is prohibited
-     * @deprecated This is deprecated
-     */
-    public static final int WPS_WEP_PROHIBITED          = 4;
-    /** TKIP only prohibited
-     * @deprecated This is deprecated
-     */
-    public static final int WPS_TKIP_ONLY_PROHIBITED    = 5;
-    /** Authentication failure on WPS
-     * @deprecated This is deprecated
-     */
-    public static final int WPS_AUTH_FAILURE            = 6;
-    /** WPS timed out
-     * @deprecated This is deprecated
-     */
-    public static final int WPS_TIMED_OUT               = 7;
-
-    /**
-     * Passed with {@link ActionListener#onFailure}.
-     * Indicates that the operation failed due to invalid inputs
-     * @hide
-     */
-    public static final int INVALID_ARGS                = 8;
-
-    /**
-     * Passed with {@link ActionListener#onFailure}.
-     * Indicates that the operation failed due to user permissions.
-     * @hide
-     */
-    public static final int NOT_AUTHORIZED              = 9;
-
-    /**
-     * Interface for callback invocation on an application action
-     * @hide
-     */
-    @SystemApi
-    public interface ActionListener {
-        /**
-         * The operation succeeded.
-         */
-        void onSuccess();
-        /**
-         * The operation failed.
-         * @param reason The reason for failure depends on the operation.
-         */
-        void onFailure(@ActionListenerFailureReason int reason);
-    }
-
-    /** Interface for callback invocation on a start WPS action
-     * @deprecated This is deprecated
-     */
-    public static abstract class WpsCallback {
-
-        /** WPS start succeeded
-         * @deprecated This API is deprecated
-         */
-        public abstract void onStarted(String pin);
-
-        /** WPS operation completed successfully
-         * @deprecated This API is deprecated
-         */
-        public abstract void onSucceeded();
-
-        /**
-         * WPS operation failed
-         * @param reason The reason for failure could be one of
-         * {@link #WPS_TKIP_ONLY_PROHIBITED}, {@link #WPS_OVERLAP_ERROR},
-         * {@link #WPS_WEP_PROHIBITED}, {@link #WPS_TIMED_OUT} or {@link #WPS_AUTH_FAILURE}
-         * and some generic errors.
-         * @deprecated This API is deprecated
-         */
-        public abstract void onFailed(int reason);
-    }
-
-    /**
-     * Base class for soft AP callback. Should be extended by applications and set when calling
-     * {@link WifiManager#registerSoftApCallback(Executor, SoftApCallback)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public interface SoftApCallback {
-        /**
-         * Called when soft AP state changes.
-         *
-         * @param state         the new AP state. One of {@link #WIFI_AP_STATE_DISABLED},
-         *                      {@link #WIFI_AP_STATE_DISABLING}, {@link #WIFI_AP_STATE_ENABLED},
-         *                      {@link #WIFI_AP_STATE_ENABLING}, {@link #WIFI_AP_STATE_FAILED}
-         * @param failureReason reason when in failed state. One of
-         *                      {@link #SAP_START_FAILURE_GENERAL},
-         *                      {@link #SAP_START_FAILURE_NO_CHANNEL},
-         *                      {@link #SAP_START_FAILURE_UNSUPPORTED_CONFIGURATION}
-         */
-        default void onStateChanged(@WifiApState int state, @SapStartFailure int failureReason) {}
-
-        /**
-         * Called when the connected clients to soft AP changes.
-         *
-         * @param clients the currently connected clients
-         */
-        default void onConnectedClientsChanged(@NonNull List<WifiClient> clients) {}
-
-        /**
-         * Called when information of softap changes.
-         *
-         * @param softApInfo is the softap information. {@link SoftApInfo}
-         */
-        default void onInfoChanged(@NonNull SoftApInfo softApInfo) {
-            // Do nothing: can be updated to add SoftApInfo details (e.g. channel) to the UI.
-        }
-
-        /**
-         * Called when capability of softap changes.
-         *
-         * @param softApCapability is the softap capability. {@link SoftApCapability}
-         */
-        default void onCapabilityChanged(@NonNull SoftApCapability softApCapability) {
-            // Do nothing: can be updated to add SoftApCapability details (e.g. meximum supported
-            // client number) to the UI.
-        }
-
-        /**
-         * Called when client trying to connect but device blocked the client with specific reason.
-         *
-         * Can be used to ask user to update client to allowed list or blocked list
-         * when reason is {@link SAP_CLIENT_BLOCK_REASON_CODE_BLOCKED_BY_USER}, or
-         * indicate the block due to maximum supported client number limitation when reason is
-         * {@link SAP_CLIENT_BLOCK_REASON_CODE_NO_MORE_STAS}.
-         *
-         * @param client the currently blocked client.
-         * @param blockedReason one of blocked reason from {@link SapClientBlockedReason}
-         */
-        default void onBlockedClientConnecting(@NonNull WifiClient client,
-                @SapClientBlockedReason int blockedReason) {
-            // Do nothing: can be used to ask user to update client to allowed list or blocked list.
-        }
-    }
-
-    /**
-     * Callback proxy for SoftApCallback objects.
-     *
-     * @hide
-     */
-    private class SoftApCallbackProxy extends ISoftApCallback.Stub {
-        private final Executor mExecutor;
-        private final SoftApCallback mCallback;
-
-        SoftApCallbackProxy(Executor executor, SoftApCallback callback) {
-            mExecutor = executor;
-            mCallback = callback;
-        }
-
-        @Override
-        public void onStateChanged(int state, int failureReason) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "SoftApCallbackProxy: onStateChanged: state=" + state
-                        + ", failureReason=" + failureReason);
-            }
-
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onStateChanged(state, failureReason);
-            });
-        }
-
-        @Override
-        public void onConnectedClientsChanged(List<WifiClient> clients) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "SoftApCallbackProxy: onConnectedClientsChanged: clients="
-                        + clients.size() + " clients");
-            }
-
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onConnectedClientsChanged(clients);
-            });
-        }
-
-        @Override
-        public void onInfoChanged(SoftApInfo softApInfo) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "SoftApCallbackProxy: onInfoChange: softApInfo=" + softApInfo);
-            }
-
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onInfoChanged(softApInfo);
-            });
-        }
-
-        @Override
-        public void onCapabilityChanged(SoftApCapability capability) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "SoftApCallbackProxy: onCapabilityChanged: SoftApCapability="
-                        + capability);
-            }
-
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onCapabilityChanged(capability);
-            });
-        }
-
-        @Override
-        public void onBlockedClientConnecting(@NonNull WifiClient client, int blockedReason) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "SoftApCallbackProxy: onBlockedClientConnecting: client=" + client
-                        + " with reason = " + blockedReason);
-            }
-
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onBlockedClientConnecting(client, blockedReason);
-            });
-        }
-    }
-
-    /**
-     * Registers a callback for Soft AP. See {@link SoftApCallback}. Caller will receive the
-     * following callbacks on registration:
-     * <ul>
-     * <li> {@link SoftApCallback#onStateChanged(int, int)}</li>
-     * <li> {@link SoftApCallback#onConnectedClientsChanged(List<WifiClient>)}</li>
-     * <li> {@link SoftApCallback#onInfoChanged(SoftApInfo)}</li>
-     * <li> {@link SoftApCallback#onCapabilityChanged(SoftApCapability)}</li>
-     * </ul>
-     * These will be dispatched on registration to provide the caller with the current state
-     * (and are not an indication of any current change). Note that receiving an immediate
-     * WIFI_AP_STATE_FAILED value for soft AP state indicates that the latest attempt to start
-     * soft AP has failed. Caller can unregister a previously registered callback using
-     * {@link #unregisterSoftApCallback}
-     * <p>
-     * Applications should have the
-     * {@link android.Manifest.permission#NETWORK_SETTINGS NETWORK_SETTINGS} permission. Callers
-     * without the permission will trigger a {@link java.lang.SecurityException}.
-     * <p>
-     *
-     * @param executor The Executor on whose thread to execute the callbacks of the {@code callback}
-     *                 object.
-     * @param callback Callback for soft AP events
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void registerSoftApCallback(@NonNull @CallbackExecutor Executor executor,
-            @NonNull SoftApCallback callback) {
-        if (executor == null) throw new IllegalArgumentException("executor cannot be null");
-        if (callback == null) throw new IllegalArgumentException("callback cannot be null");
-        Log.v(TAG, "registerSoftApCallback: callback=" + callback + ", executor=" + executor);
-
-        Binder binder = new Binder();
-        try {
-            mService.registerSoftApCallback(
-                    binder, new SoftApCallbackProxy(executor, callback), callback.hashCode());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Allow callers to unregister a previously registered callback. After calling this method,
-     * applications will no longer receive soft AP events.
-     *
-     * @param callback Callback to unregister for soft AP events
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void unregisterSoftApCallback(@NonNull SoftApCallback callback) {
-        if (callback == null) throw new IllegalArgumentException("callback cannot be null");
-        Log.v(TAG, "unregisterSoftApCallback: callback=" + callback);
-
-        try {
-            mService.unregisterSoftApCallback(callback.hashCode());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * LocalOnlyHotspotReservation that contains the {@link SoftApConfiguration} for the active
-     * LocalOnlyHotspot request.
-     * <p>
-     * Applications requesting LocalOnlyHotspot for sharing will receive an instance of the
-     * LocalOnlyHotspotReservation in the
-     * {@link LocalOnlyHotspotCallback#onStarted(LocalOnlyHotspotReservation)} call.  This
-     * reservation contains the relevant {@link SoftApConfiguration}.
-     * When an application is done with the LocalOnlyHotspot, they should call {@link
-     * LocalOnlyHotspotReservation#close()}.  Once this happens, the application will not receive
-     * any further callbacks. If the LocalOnlyHotspot is stopped due to a
-     * user triggered mode change, applications will be notified via the {@link
-     * LocalOnlyHotspotCallback#onStopped()} callback.
-     */
-    public class LocalOnlyHotspotReservation implements AutoCloseable {
-
-        private final CloseGuard mCloseGuard = new CloseGuard();
-        private final SoftApConfiguration mSoftApConfig;
-        private final WifiConfiguration mWifiConfig;
-        private boolean mClosed = false;
-
-        /** @hide */
-        @VisibleForTesting
-        public LocalOnlyHotspotReservation(SoftApConfiguration config) {
-            mSoftApConfig = config;
-            mWifiConfig = config.toWifiConfiguration();
-            mCloseGuard.open("close");
-        }
-
-        /**
-         * Returns the {@link WifiConfiguration} of the current Local Only Hotspot (LOHS).
-         * May be null if hotspot enabled and security type is not
-         * {@code WifiConfiguration.KeyMgmt.None} or {@code WifiConfiguration.KeyMgmt.WPA2_PSK}.
-         *
-         * @deprecated Use {@code WifiManager#getSoftApConfiguration()} to get the
-         * LOHS configuration.
-         */
-        @Deprecated
-        @Nullable
-        public WifiConfiguration getWifiConfiguration() {
-            return mWifiConfig;
-        }
-
-        /**
-         * Returns the {@link SoftApConfiguration} of the current Local Only Hotspot (LOHS).
-         */
-        @NonNull
-        public SoftApConfiguration getSoftApConfiguration() {
-            return mSoftApConfig;
-        }
-
-        @Override
-        public void close() {
-            try {
-                synchronized (mLock) {
-                    if (!mClosed) {
-                        mClosed = true;
-                        stopLocalOnlyHotspot();
-                        mCloseGuard.close();
-                    }
-                }
-            } catch (Exception e) {
-                Log.e(TAG, "Failed to stop Local Only Hotspot.");
-            } finally {
-                Reference.reachabilityFence(this);
-            }
-        }
-
-        @Override
-        protected void finalize() throws Throwable {
-            try {
-                if (mCloseGuard != null) {
-                    mCloseGuard.warnIfOpen();
-                }
-                close();
-            } finally {
-                super.finalize();
-            }
-        }
-    }
-
-    /**
-     * Callback class for applications to receive updates about the LocalOnlyHotspot status.
-     */
-    public static class LocalOnlyHotspotCallback {
-        /** @hide */
-        public static final int REQUEST_REGISTERED = 0;
-
-        public static final int ERROR_NO_CHANNEL = 1;
-        public static final int ERROR_GENERIC = 2;
-        public static final int ERROR_INCOMPATIBLE_MODE = 3;
-        public static final int ERROR_TETHERING_DISALLOWED = 4;
-
-        /** LocalOnlyHotspot start succeeded. */
-        public void onStarted(LocalOnlyHotspotReservation reservation) {};
-
-        /**
-         * LocalOnlyHotspot stopped.
-         * <p>
-         * The LocalOnlyHotspot can be disabled at any time by the user.  When this happens,
-         * applications will be notified that it was stopped. This will not be invoked when an
-         * application calls {@link LocalOnlyHotspotReservation#close()}.
-         */
-        public void onStopped() {};
-
-        /**
-         * LocalOnlyHotspot failed to start.
-         * <p>
-         * Applications can attempt to call
-         * {@link WifiManager#startLocalOnlyHotspot(LocalOnlyHotspotCallback, Handler)} again at
-         * a later time.
-         * <p>
-         * @param reason The reason for failure could be one of: {@link
-         * #ERROR_TETHERING_DISALLOWED}, {@link #ERROR_INCOMPATIBLE_MODE},
-         * {@link #ERROR_NO_CHANNEL}, or {@link #ERROR_GENERIC}.
-         */
-        public void onFailed(int reason) { };
-    }
-
-    /**
-     * Callback proxy for LocalOnlyHotspotCallback objects.
-     */
-    private static class LocalOnlyHotspotCallbackProxy extends ILocalOnlyHotspotCallback.Stub {
-        private final WeakReference<WifiManager> mWifiManager;
-        private final Executor mExecutor;
-        private final LocalOnlyHotspotCallback mCallback;
-
-        /**
-         * Constructs a {@link LocalOnlyHotspotCallbackProxy} using the specified executor.  All
-         * callbacks will run using the given executor.
-         *
-         * @param manager WifiManager
-         * @param executor Executor for delivering callbacks.
-         * @param callback LocalOnlyHotspotCallback to notify the calling application, or null.
-         */
-        LocalOnlyHotspotCallbackProxy(
-                @NonNull WifiManager manager,
-                @NonNull Executor executor,
-                @Nullable LocalOnlyHotspotCallback callback) {
-            mWifiManager = new WeakReference<>(manager);
-            mExecutor = executor;
-            mCallback = callback;
-        }
-
-        @Override
-        public void onHotspotStarted(SoftApConfiguration config) {
-            WifiManager manager = mWifiManager.get();
-            if (manager == null) return;
-
-            if (config == null) {
-                Log.e(TAG, "LocalOnlyHotspotCallbackProxy: config cannot be null.");
-                onHotspotFailed(LocalOnlyHotspotCallback.ERROR_GENERIC);
-                return;
-            }
-            final LocalOnlyHotspotReservation reservation =
-                    manager.new LocalOnlyHotspotReservation(config);
-            if (mCallback == null) return;
-            mExecutor.execute(() -> mCallback.onStarted(reservation));
-        }
-
-        @Override
-        public void onHotspotStopped() {
-            WifiManager manager = mWifiManager.get();
-            if (manager == null) return;
-
-            Log.w(TAG, "LocalOnlyHotspotCallbackProxy: hotspot stopped");
-            if (mCallback == null) return;
-            mExecutor.execute(() -> mCallback.onStopped());
-        }
-
-        @Override
-        public void onHotspotFailed(int reason) {
-            WifiManager manager = mWifiManager.get();
-            if (manager == null) return;
-
-            Log.w(TAG, "LocalOnlyHotspotCallbackProxy: failed to start.  reason: "
-                    + reason);
-            if (mCallback == null) return;
-            mExecutor.execute(() -> mCallback.onFailed(reason));
-        }
-    }
-
-    /**
-     * LocalOnlyHotspotSubscription that is an AutoCloseable object for tracking applications
-     * watching for LocalOnlyHotspot changes.
-     *
-     * @hide
-     */
-    public class LocalOnlyHotspotSubscription implements AutoCloseable {
-        private final CloseGuard mCloseGuard = new CloseGuard();
-
-        /** @hide */
-        @VisibleForTesting
-        public LocalOnlyHotspotSubscription() {
-            mCloseGuard.open("close");
-        }
-
-        @Override
-        public void close() {
-            try {
-                unregisterLocalOnlyHotspotObserver();
-                mCloseGuard.close();
-            } catch (Exception e) {
-                Log.e(TAG, "Failed to unregister LocalOnlyHotspotObserver.");
-            } finally {
-                Reference.reachabilityFence(this);
-            }
-        }
-
-        @Override
-        protected void finalize() throws Throwable {
-            try {
-                if (mCloseGuard != null) {
-                    mCloseGuard.warnIfOpen();
-                }
-                close();
-            } finally {
-                super.finalize();
-            }
-        }
-    }
-
-    /**
-     * Class to notify calling applications that watch for changes in LocalOnlyHotspot of updates.
-     *
-     * @hide
-     */
-    public static class LocalOnlyHotspotObserver {
-        /**
-         * Confirm registration for LocalOnlyHotspotChanges by returning a
-         * LocalOnlyHotspotSubscription.
-         */
-        public void onRegistered(LocalOnlyHotspotSubscription subscription) {};
-
-        /**
-         * LocalOnlyHotspot started with the supplied config.
-         */
-        public void onStarted(SoftApConfiguration config) {};
-
-        /**
-         * LocalOnlyHotspot stopped.
-         */
-        public void onStopped() {};
-    }
-
-    /**
-     * Callback proxy for LocalOnlyHotspotObserver objects.
-     */
-    private static class LocalOnlyHotspotObserverProxy extends ILocalOnlyHotspotCallback.Stub {
-        private final WeakReference<WifiManager> mWifiManager;
-        private final Executor mExecutor;
-        private final LocalOnlyHotspotObserver mObserver;
-
-        /**
-         * Constructs a {@link LocalOnlyHotspotObserverProxy} using the specified looper.
-         * All callbacks will be delivered on the thread of the specified looper.
-         *
-         * @param manager WifiManager
-         * @param executor Executor for delivering callbacks
-         * @param observer LocalOnlyHotspotObserver to notify the calling application.
-         */
-        LocalOnlyHotspotObserverProxy(WifiManager manager, Executor executor,
-                final LocalOnlyHotspotObserver observer) {
-            mWifiManager = new WeakReference<>(manager);
-            mExecutor = executor;
-            mObserver = observer;
-        }
-
-        public void registered() throws RemoteException {
-            WifiManager manager = mWifiManager.get();
-            if (manager == null) return;
-
-            mExecutor.execute(() ->
-                    mObserver.onRegistered(manager.new LocalOnlyHotspotSubscription()));
-        }
-
-        @Override
-        public void onHotspotStarted(SoftApConfiguration config) {
-            WifiManager manager = mWifiManager.get();
-            if (manager == null) return;
-
-            if (config == null) {
-                Log.e(TAG, "LocalOnlyHotspotObserverProxy: config cannot be null.");
-                return;
-            }
-            mExecutor.execute(() -> mObserver.onStarted(config));
-        }
-
-        @Override
-        public void onHotspotStopped() {
-            WifiManager manager = mWifiManager.get();
-            if (manager == null) return;
-
-            mExecutor.execute(() -> mObserver.onStopped());
-        }
-
-        @Override
-        public void onHotspotFailed(int reason) {
-            // do nothing
-        }
-    }
-
-    /**
-     * Callback proxy for ActionListener objects.
-     */
-    private class ActionListenerProxy extends IActionListener.Stub {
-        private final String mActionTag;
-        private final Handler mHandler;
-        private final ActionListener mCallback;
-
-        ActionListenerProxy(String actionTag, Looper looper, ActionListener callback) {
-            mActionTag = actionTag;
-            mHandler = new Handler(looper);
-            mCallback = callback;
-        }
-
-        @Override
-        public void onSuccess() {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "ActionListenerProxy:" + mActionTag + ": onSuccess");
-            }
-            mHandler.post(() -> {
-                mCallback.onSuccess();
-            });
-        }
-
-        @Override
-        public void onFailure(@ActionListenerFailureReason int reason) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "ActionListenerProxy:" + mActionTag + ": onFailure=" + reason);
-            }
-            mHandler.post(() -> {
-                mCallback.onFailure(reason);
-            });
-        }
-    }
-
-    private void connectInternal(@Nullable WifiConfiguration config, int networkId,
-            @Nullable ActionListener listener) {
-        ActionListenerProxy listenerProxy = null;
-        Binder binder = null;
-        if (listener != null) {
-            listenerProxy = new ActionListenerProxy("connect", mLooper, listener);
-            binder = new Binder();
-        }
-        try {
-            mService.connect(config, networkId, binder, listenerProxy,
-                    listener == null ? 0 : listener.hashCode());
-        } catch (RemoteException e) {
-            if (listenerProxy != null) listenerProxy.onFailure(ERROR);
-        } catch (SecurityException e) {
-            if (listenerProxy != null) listenerProxy.onFailure(NOT_AUTHORIZED);
-        }
-    }
-
-    /**
-     * Connect to a network with the given configuration. The network also
-     * gets added to the list of configured networks for the foreground user.
-     *
-     * For a new network, this function is used instead of a
-     * sequence of addNetwork(), enableNetwork(), and reconnect()
-     *
-     * @param config the set of variables that describe the configuration,
-     *            contained in a {@link WifiConfiguration} object.
-     * @param listener for callbacks on success or failure. Can be null.
-     * @throws IllegalStateException if the WifiManager instance needs to be
-     * initialized again
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD,
-            android.Manifest.permission.NETWORK_STACK
-    })
-    public void connect(@NonNull WifiConfiguration config, @Nullable ActionListener listener) {
-        if (config == null) throw new IllegalArgumentException("config cannot be null");
-        connectInternal(config, WifiConfiguration.INVALID_NETWORK_ID, listener);
-    }
-
-    /**
-     * Connect to a network with the given networkId.
-     *
-     * This function is used instead of a enableNetwork() and reconnect()
-     *
-     * <li> This API will cause reconnect if the credentials of the current active
-     * connection has been changed.</li>
-     * <li> This API will cause reconnect if the current active connection is marked metered.</li>
-     *
-     * @param networkId the ID of the network as returned by {@link #addNetwork} or {@link
-     *        getConfiguredNetworks}.
-     * @param listener for callbacks on success or failure. Can be null.
-     * @throws IllegalStateException if the WifiManager instance needs to be
-     * initialized again
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD,
-            android.Manifest.permission.NETWORK_STACK
-    })
-    public void connect(int networkId, @Nullable ActionListener listener) {
-        if (networkId < 0) throw new IllegalArgumentException("Network id cannot be negative");
-        connectInternal(null, networkId, listener);
-    }
-
-    /**
-     * Save the given network to the list of configured networks for the
-     * foreground user. If the network already exists, the configuration
-     * is updated. Any new network is enabled by default.
-     *
-     * For a new network, this function is used instead of a
-     * sequence of addNetwork() and enableNetwork().
-     *
-     * For an existing network, it accomplishes the task of updateNetwork()
-     *
-     * <li> This API will cause reconnect if the credentials of the current active
-     * connection has been changed.</li>
-     * <li> This API will cause disconnect if the current active connection is marked metered.</li>
-     *
-     * @param config the set of variables that describe the configuration,
-     *            contained in a {@link WifiConfiguration} object.
-     * @param listener for callbacks on success or failure. Can be null.
-     * @throws IllegalStateException if the WifiManager instance needs to be
-     * initialized again
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD,
-            android.Manifest.permission.NETWORK_STACK
-    })
-    public void save(@NonNull WifiConfiguration config, @Nullable ActionListener listener) {
-        if (config == null) throw new IllegalArgumentException("config cannot be null");
-        ActionListenerProxy listenerProxy = null;
-        Binder binder = null;
-        if (listener != null) {
-            listenerProxy = new ActionListenerProxy("save", mLooper, listener);
-            binder = new Binder();
-        }
-        try {
-            mService.save(config, binder, listenerProxy,
-                    listener == null ? 0 : listener.hashCode());
-        } catch (RemoteException e) {
-            if (listenerProxy != null) listenerProxy.onFailure(ERROR);
-        } catch (SecurityException e) {
-            if (listenerProxy != null) listenerProxy.onFailure(NOT_AUTHORIZED);
-        }
-    }
-
-    /**
-     * Delete the network from the list of configured networks for the
-     * foreground user.
-     *
-     * This function is used instead of a sequence of removeNetwork()
-     *
-     * @param config the set of variables that describe the configuration,
-     *            contained in a {@link WifiConfiguration} object.
-     * @param listener for callbacks on success or failure. Can be null.
-     * @throws IllegalStateException if the WifiManager instance needs to be
-     * initialized again
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD,
-            android.Manifest.permission.NETWORK_STACK
-    })
-    public void forget(int netId, @Nullable ActionListener listener) {
-        if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative");
-        ActionListenerProxy listenerProxy = null;
-        Binder binder = null;
-        if (listener != null) {
-            listenerProxy = new ActionListenerProxy("forget", mLooper, listener);
-            binder = new Binder();
-        }
-        try {
-            mService.forget(netId, binder, listenerProxy,
-                    listener == null ? 0 : listener.hashCode());
-        } catch (RemoteException e) {
-            if (listenerProxy != null) listenerProxy.onFailure(ERROR);
-        } catch (SecurityException e) {
-            if (listenerProxy != null) listenerProxy.onFailure(NOT_AUTHORIZED);
-        }
-    }
-
-    /**
-     * Disable network
-     *
-     * @param netId is the network Id
-     * @param listener for callbacks on success or failure. Can be null.
-     * @throws IllegalStateException if the WifiManager instance needs to be
-     * initialized again
-     * @deprecated This API is deprecated. Use {@link #disableNetwork(int)} instead.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD,
-            android.Manifest.permission.NETWORK_STACK
-    })
-    @Deprecated
-    public void disable(int netId, @Nullable ActionListener listener) {
-        if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative");
-        // Simple wrapper which forwards the call to disableNetwork. This is a temporary
-        // implementation until we can remove this API completely.
-        boolean status = disableNetwork(netId);
-        if (listener != null) {
-            if (status) {
-                listener.onSuccess();
-            } else {
-                listener.onFailure(ERROR);
-            }
-        }
-    }
-
-    /**
-     * Enable/disable auto-join globally.
-     *
-     * @param allowAutojoin true to allow auto-join, false to disallow auto-join
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void allowAutojoinGlobal(boolean allowAutojoin) {
-        try {
-            mService.allowAutojoinGlobal(allowAutojoin);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-
-    /**
-     * Sets the user choice for allowing auto-join to a network.
-     * The updated choice will be made available through the updated config supplied by the
-     * CONFIGURED_NETWORKS_CHANGED broadcast.
-     *
-     * @param netId the id of the network to allow/disallow auto-join for.
-     * @param allowAutojoin true to allow auto-join, false to disallow auto-join
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void allowAutojoin(int netId, boolean allowAutojoin) {
-        try {
-            mService.allowAutojoin(netId, allowAutojoin);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Configure auto-join settings for a Passpoint profile.
-     *
-     * @param fqdn the FQDN (fully qualified domain name) of the passpoint profile.
-     * @param allowAutojoin true to enable auto-join, false to disable auto-join.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void allowAutojoinPasspoint(@NonNull String fqdn, boolean allowAutojoin) {
-        try {
-            mService.allowAutojoinPasspoint(fqdn, allowAutojoin);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Configure MAC randomization setting for a Passpoint profile.
-     * MAC randomization is enabled by default.
-     *
-     * @param fqdn the FQDN (fully qualified domain name) of the passpoint profile.
-     * @param enable true to enable MAC randomization, false to disable MAC randomization.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void setMacRandomizationSettingPasspointEnabled(@NonNull String fqdn, boolean enable) {
-        try {
-            mService.setMacRandomizationSettingPasspointEnabled(fqdn, enable);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Sets the user's choice of metered override for a Passpoint profile.
-     *
-     * @param fqdn the FQDN (fully qualified domain name) of the passpoint profile.
-     * @param meteredOverride One of three values: {@link WifiConfiguration#METERED_OVERRIDE_NONE},
-     *                        {@link WifiConfiguration#METERED_OVERRIDE_METERED},
-     *                        {@link WifiConfiguration#METERED_OVERRIDE_NOT_METERED}
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void setPasspointMeteredOverride(@NonNull String fqdn,
-            @WifiConfiguration.MeteredOverride int meteredOverride) {
-        try {
-            mService.setPasspointMeteredOverride(fqdn, meteredOverride);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Temporarily disable a network. Should always trigger with user disconnect network.
-     *
-     * @param network Input can be SSID or FQDN. And caller must ensure that the SSID passed thru
-     *                this API matched the WifiConfiguration.SSID rules, and thus be surrounded by
-     *                quotes.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_STACK
-    })
-    public void disableEphemeralNetwork(@NonNull String network) {
-        if (TextUtils.isEmpty(network)) {
-            throw new IllegalArgumentException("SSID cannot be null or empty!");
-        }
-        try {
-            mService.disableEphemeralNetwork(network, mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * WPS suport has been deprecated from Client mode and this method will immediately trigger
-     * {@link WpsCallback#onFailed(int)} with a generic error.
-     *
-     * @param config WPS configuration (does not support {@link WpsInfo#LABEL})
-     * @param listener for callbacks on success or failure. Can be null.
-     * @throws IllegalStateException if the WifiManager instance needs to be initialized again
-     * @deprecated This API is deprecated
-     */
-    public void startWps(WpsInfo config, WpsCallback listener) {
-        if (listener != null ) {
-            listener.onFailed(ERROR);
-        }
-    }
-
-    /**
-     * WPS support has been deprecated from Client mode and this method will immediately trigger
-     * {@link WpsCallback#onFailed(int)} with a generic error.
-     *
-     * @param listener for callbacks on success or failure. Can be null.
-     * @throws IllegalStateException if the WifiManager instance needs to be initialized again
-     * @deprecated This API is deprecated
-     */
-    public void cancelWps(WpsCallback listener) {
-        if (listener != null) {
-            listener.onFailed(ERROR);
-        }
-    }
-
-    /**
-     * Allows an application to keep the Wi-Fi radio awake.
-     * Normally the Wi-Fi radio may turn off when the user has not used the device in a while.
-     * Acquiring a WifiLock will keep the radio on until the lock is released.  Multiple
-     * applications may hold WifiLocks, and the radio will only be allowed to turn off when no
-     * WifiLocks are held in any application.
-     * <p>
-     * Before using a WifiLock, consider carefully if your application requires Wi-Fi access, or
-     * could function over a mobile network, if available.  A program that needs to download large
-     * files should hold a WifiLock to ensure that the download will complete, but a program whose
-     * network usage is occasional or low-bandwidth should not hold a WifiLock to avoid adversely
-     * affecting battery life.
-     * <p>
-     * Note that WifiLocks cannot override the user-level "Wi-Fi Enabled" setting, nor Airplane
-     * Mode.  They simply keep the radio from turning off when Wi-Fi is already on but the device
-     * is idle.
-     * <p>
-     * Any application using a WifiLock must request the {@code android.permission.WAKE_LOCK}
-     * permission in an {@code <uses-permission>} element of the application's manifest.
-     */
-    public class WifiLock {
-        private String mTag;
-        private final IBinder mBinder;
-        private int mRefCount;
-        int mLockType;
-        private boolean mRefCounted;
-        private boolean mHeld;
-        private WorkSource mWorkSource;
-
-        private WifiLock(int lockType, String tag) {
-            mTag = tag;
-            mLockType = lockType;
-            mBinder = new Binder();
-            mRefCount = 0;
-            mRefCounted = true;
-            mHeld = false;
-        }
-
-        /**
-         * Locks the Wi-Fi radio on until {@link #release} is called.
-         *
-         * If this WifiLock is reference-counted, each call to {@code acquire} will increment the
-         * reference count, and the radio will remain locked as long as the reference count is
-         * above zero.
-         *
-         * If this WifiLock is not reference-counted, the first call to {@code acquire} will lock
-         * the radio, but subsequent calls will be ignored.  Only one call to {@link #release}
-         * will be required, regardless of the number of times that {@code acquire} is called.
-         */
-        public void acquire() {
-            synchronized (mBinder) {
-                if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) {
-                    try {
-                        mService.acquireWifiLock(mBinder, mLockType, mTag, mWorkSource);
-                        synchronized (WifiManager.this) {
-                            if (mActiveLockCount >= MAX_ACTIVE_LOCKS) {
-                                mService.releaseWifiLock(mBinder);
-                                throw new UnsupportedOperationException(
-                                            "Exceeded maximum number of wifi locks");
-                            }
-                            mActiveLockCount++;
-                        }
-                    } catch (RemoteException e) {
-                        throw e.rethrowFromSystemServer();
-                    }
-                    mHeld = true;
-                }
-            }
-        }
-
-        /**
-         * Unlocks the Wi-Fi radio, allowing it to turn off when the device is idle.
-         *
-         * If this WifiLock is reference-counted, each call to {@code release} will decrement the
-         * reference count, and the radio will be unlocked only when the reference count reaches
-         * zero.  If the reference count goes below zero (that is, if {@code release} is called
-         * a greater number of times than {@link #acquire}), an exception is thrown.
-         *
-         * If this WifiLock is not reference-counted, the first call to {@code release} (after
-         * the radio was locked using {@link #acquire}) will unlock the radio, and subsequent
-         * calls will be ignored.
-         */
-        public void release() {
-            synchronized (mBinder) {
-                if (mRefCounted ? (--mRefCount == 0) : (mHeld)) {
-                    try {
-                        mService.releaseWifiLock(mBinder);
-                        synchronized (WifiManager.this) {
-                            mActiveLockCount--;
-                        }
-                    } catch (RemoteException e) {
-                        throw e.rethrowFromSystemServer();
-                    }
-                    mHeld = false;
-                }
-                if (mRefCount < 0) {
-                    throw new RuntimeException("WifiLock under-locked " + mTag);
-                }
-            }
-        }
-
-        /**
-         * Controls whether this is a reference-counted or non-reference-counted WifiLock.
-         *
-         * Reference-counted WifiLocks keep track of the number of calls to {@link #acquire} and
-         * {@link #release}, and only allow the radio to sleep when every call to {@link #acquire}
-         * has been balanced with a call to {@link #release}.  Non-reference-counted WifiLocks
-         * lock the radio whenever {@link #acquire} is called and it is unlocked, and unlock the
-         * radio whenever {@link #release} is called and it is locked.
-         *
-         * @param refCounted true if this WifiLock should keep a reference count
-         */
-        public void setReferenceCounted(boolean refCounted) {
-            mRefCounted = refCounted;
-        }
-
-        /**
-         * Checks whether this WifiLock is currently held.
-         *
-         * @return true if this WifiLock is held, false otherwise
-         */
-        public boolean isHeld() {
-            synchronized (mBinder) {
-                return mHeld;
-            }
-        }
-
-        public void setWorkSource(WorkSource ws) {
-            synchronized (mBinder) {
-                if (ws != null && ws.isEmpty()) {
-                    ws = null;
-                }
-                boolean changed = true;
-                if (ws == null) {
-                    mWorkSource = null;
-                } else {
-                    ws = ws.withoutNames();
-                    if (mWorkSource == null) {
-                        changed = mWorkSource != null;
-                        mWorkSource = new WorkSource(ws);
-                    } else {
-                        changed = !mWorkSource.equals(ws);
-                        if (changed) {
-                            mWorkSource.set(ws);
-                        }
-                    }
-                }
-                if (changed && mHeld) {
-                    try {
-                        mService.updateWifiLockWorkSource(mBinder, mWorkSource);
-                    } catch (RemoteException e) {
-                        throw e.rethrowFromSystemServer();
-                    }
-                }
-            }
-        }
-
-        public String toString() {
-            String s1, s2, s3;
-            synchronized (mBinder) {
-                s1 = Integer.toHexString(System.identityHashCode(this));
-                s2 = mHeld ? "held; " : "";
-                if (mRefCounted) {
-                    s3 = "refcounted: refcount = " + mRefCount;
-                } else {
-                    s3 = "not refcounted";
-                }
-                return "WifiLock{ " + s1 + "; " + s2 + s3 + " }";
-            }
-        }
-
-        @Override
-        protected void finalize() throws Throwable {
-            super.finalize();
-            synchronized (mBinder) {
-                if (mHeld) {
-                    try {
-                        mService.releaseWifiLock(mBinder);
-                        synchronized (WifiManager.this) {
-                            mActiveLockCount--;
-                        }
-                    } catch (RemoteException e) {
-                        throw e.rethrowFromSystemServer();
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Creates a new WifiLock.
-     *
-     * @param lockType the type of lock to create. See {@link #WIFI_MODE_FULL_HIGH_PERF}
-     * and {@link #WIFI_MODE_FULL_LOW_LATENCY} for descriptions of the types of Wi-Fi locks.
-     * @param tag a tag for the WifiLock to identify it in debugging messages.  This string is
-     *            never shown to the user under normal conditions, but should be descriptive
-     *            enough to identify your application and the specific WifiLock within it, if it
-     *            holds multiple WifiLocks.
-     *
-     * @return a new, unacquired WifiLock with the given tag.
-     *
-     * @see WifiLock
-     */
-    public WifiLock createWifiLock(int lockType, String tag) {
-        return new WifiLock(lockType, tag);
-    }
-
-    /**
-     * Creates a new WifiLock.
-     *
-     * @param tag a tag for the WifiLock to identify it in debugging messages.  This string is
-     *            never shown to the user under normal conditions, but should be descriptive
-     *            enough to identify your application and the specific WifiLock within it, if it
-     *            holds multiple WifiLocks.
-     *
-     * @return a new, unacquired WifiLock with the given tag.
-     *
-     * @see WifiLock
-     *
-     * @deprecated This API is non-functional.
-     */
-    @Deprecated
-    public WifiLock createWifiLock(String tag) {
-        return new WifiLock(WIFI_MODE_FULL, tag);
-    }
-
-    /**
-     * Create a new MulticastLock
-     *
-     * @param tag a tag for the MulticastLock to identify it in debugging
-     *            messages.  This string is never shown to the user under
-     *            normal conditions, but should be descriptive enough to
-     *            identify your application and the specific MulticastLock
-     *            within it, if it holds multiple MulticastLocks.
-     *
-     * @return a new, unacquired MulticastLock with the given tag.
-     *
-     * @see MulticastLock
-     */
-    public MulticastLock createMulticastLock(String tag) {
-        return new MulticastLock(tag);
-    }
-
-    /**
-     * Allows an application to receive Wifi Multicast packets.
-     * Normally the Wifi stack filters out packets not explicitly
-     * addressed to this device.  Acquring a MulticastLock will
-     * cause the stack to receive packets addressed to multicast
-     * addresses.  Processing these extra packets can cause a noticeable
-     * battery drain and should be disabled when not needed.
-     */
-    public class MulticastLock {
-        private String mTag;
-        private final IBinder mBinder;
-        private int mRefCount;
-        private boolean mRefCounted;
-        private boolean mHeld;
-
-        private MulticastLock(String tag) {
-            mTag = tag;
-            mBinder = new Binder();
-            mRefCount = 0;
-            mRefCounted = true;
-            mHeld = false;
-        }
-
-        /**
-         * Locks Wifi Multicast on until {@link #release} is called.
-         *
-         * If this MulticastLock is reference-counted each call to
-         * {@code acquire} will increment the reference count, and the
-         * wifi interface will receive multicast packets as long as the
-         * reference count is above zero.
-         *
-         * If this MulticastLock is not reference-counted, the first call to
-         * {@code acquire} will turn on the multicast packets, but subsequent
-         * calls will be ignored.  Only one call to {@link #release} will
-         * be required, regardless of the number of times that {@code acquire}
-         * is called.
-         *
-         * Note that other applications may also lock Wifi Multicast on.
-         * Only they can relinquish their lock.
-         *
-         * Also note that applications cannot leave Multicast locked on.
-         * When an app exits or crashes, any Multicast locks will be released.
-         */
-        public void acquire() {
-            synchronized (mBinder) {
-                if (mRefCounted ? (++mRefCount == 1) : (!mHeld)) {
-                    try {
-                        mService.acquireMulticastLock(mBinder, mTag);
-                        synchronized (WifiManager.this) {
-                            if (mActiveLockCount >= MAX_ACTIVE_LOCKS) {
-                                mService.releaseMulticastLock(mTag);
-                                throw new UnsupportedOperationException(
-                                        "Exceeded maximum number of wifi locks");
-                            }
-                            mActiveLockCount++;
-                        }
-                    } catch (RemoteException e) {
-                        throw e.rethrowFromSystemServer();
-                    }
-                    mHeld = true;
-                }
-            }
-        }
-
-        /**
-         * Unlocks Wifi Multicast, restoring the filter of packets
-         * not addressed specifically to this device and saving power.
-         *
-         * If this MulticastLock is reference-counted, each call to
-         * {@code release} will decrement the reference count, and the
-         * multicast packets will only stop being received when the reference
-         * count reaches zero.  If the reference count goes below zero (that
-         * is, if {@code release} is called a greater number of times than
-         * {@link #acquire}), an exception is thrown.
-         *
-         * If this MulticastLock is not reference-counted, the first call to
-         * {@code release} (after the radio was multicast locked using
-         * {@link #acquire}) will unlock the multicast, and subsequent calls
-         * will be ignored.
-         *
-         * Note that if any other Wifi Multicast Locks are still outstanding
-         * this {@code release} call will not have an immediate effect.  Only
-         * when all applications have released all their Multicast Locks will
-         * the Multicast filter be turned back on.
-         *
-         * Also note that when an app exits or crashes all of its Multicast
-         * Locks will be automatically released.
-         */
-        public void release() {
-            synchronized (mBinder) {
-                if (mRefCounted ? (--mRefCount == 0) : (mHeld)) {
-                    try {
-                        mService.releaseMulticastLock(mTag);
-                        synchronized (WifiManager.this) {
-                            mActiveLockCount--;
-                        }
-                    } catch (RemoteException e) {
-                        throw e.rethrowFromSystemServer();
-                    }
-                    mHeld = false;
-                }
-                if (mRefCount < 0) {
-                    throw new RuntimeException("MulticastLock under-locked "
-                            + mTag);
-                }
-            }
-        }
-
-        /**
-         * Controls whether this is a reference-counted or non-reference-
-         * counted MulticastLock.
-         *
-         * Reference-counted MulticastLocks keep track of the number of calls
-         * to {@link #acquire} and {@link #release}, and only stop the
-         * reception of multicast packets when every call to {@link #acquire}
-         * has been balanced with a call to {@link #release}.  Non-reference-
-         * counted MulticastLocks allow the reception of multicast packets
-         * whenever {@link #acquire} is called and stop accepting multicast
-         * packets whenever {@link #release} is called.
-         *
-         * @param refCounted true if this MulticastLock should keep a reference
-         * count
-         */
-        public void setReferenceCounted(boolean refCounted) {
-            mRefCounted = refCounted;
-        }
-
-        /**
-         * Checks whether this MulticastLock is currently held.
-         *
-         * @return true if this MulticastLock is held, false otherwise
-         */
-        public boolean isHeld() {
-            synchronized (mBinder) {
-                return mHeld;
-            }
-        }
-
-        public String toString() {
-            String s1, s2, s3;
-            synchronized (mBinder) {
-                s1 = Integer.toHexString(System.identityHashCode(this));
-                s2 = mHeld ? "held; " : "";
-                if (mRefCounted) {
-                    s3 = "refcounted: refcount = " + mRefCount;
-                } else {
-                    s3 = "not refcounted";
-                }
-                return "MulticastLock{ " + s1 + "; " + s2 + s3 + " }";
-            }
-        }
-
-        @Override
-        protected void finalize() throws Throwable {
-            super.finalize();
-            setReferenceCounted(false);
-            release();
-        }
-    }
-
-    /**
-     * Check multicast filter status.
-     *
-     * @return true if multicast packets are allowed.
-     *
-     * @hide pending API council approval
-     */
-    public boolean isMulticastEnabled() {
-        try {
-            return mService.isMulticastEnabled();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Initialize the multicast filtering to 'on'
-     * @hide no intent to publish
-     */
-    @UnsupportedAppUsage
-    public boolean initializeMulticastFiltering() {
-        try {
-            mService.initializeMulticastFiltering();
-            return true;
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Set Wi-Fi verbose logging level from developer settings.
-     *
-     * @param enable true to enable verbose logging, false to disable.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void setVerboseLoggingEnabled(boolean enable) {
-        enableVerboseLogging(enable ? 1 : 0);
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage(
-            maxTargetSdk = Build.VERSION_CODES.Q,
-            publicAlternatives = "Use {@code #setVerboseLoggingEnabled(boolean)} instead."
-    )
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void enableVerboseLogging (int verbose) {
-        try {
-            mService.enableVerboseLogging(verbose);
-        } catch (Exception e) {
-            //ignore any failure here
-            Log.e(TAG, "enableVerboseLogging " + e.toString());
-        }
-    }
-
-    /**
-     * Get the persisted Wi-Fi verbose logging level, set by
-     * {@link #setVerboseLoggingEnabled(boolean)}.
-     * No permissions are required to call this method.
-     *
-     * @return true to indicate that verbose logging is enabled, false to indicate that verbose
-     * logging is disabled.
-     *
-     * @hide
-     */
-    @SystemApi
-    public boolean isVerboseLoggingEnabled() {
-        return getVerboseLoggingLevel() > 0;
-    }
-
-    /** @hide */
-    // TODO(b/145484145): remove once SUW stops calling this via reflection
-    @UnsupportedAppUsage(
-            maxTargetSdk = Build.VERSION_CODES.Q,
-            publicAlternatives = "Use {@code #isVerboseLoggingEnabled()} instead."
-    )
-    public int getVerboseLoggingLevel() {
-        try {
-            return mService.getVerboseLoggingLevel();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Removes all saved Wi-Fi networks, Passpoint configurations, ephemeral networks, Network
-     * Requests, and Network Suggestions.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void factoryReset() {
-        try {
-            mService.factoryReset(mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Get {@link Network} object of current wifi network, or null if not connected.
-     * @hide
-     */
-    @Nullable
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD
-    })
-    public Network getCurrentNetwork() {
-        try {
-            return mService.getCurrentNetwork();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Deprecated
-     * returns false
-     * @hide
-     * @deprecated
-     */
-    public boolean setEnableAutoJoinWhenAssociated(boolean enabled) {
-        return false;
-    }
-
-    /**
-     * Deprecated
-     * returns false
-     * @hide
-     * @deprecated
-     */
-    public boolean getEnableAutoJoinWhenAssociated() {
-        return false;
-    }
-
-    /**
-     * Returns a byte stream representing the data that needs to be backed up to save the
-     * current Wifi state.
-     * This Wifi state can be restored by calling {@link #restoreBackupData(byte[])}.
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public byte[] retrieveBackupData() {
-        try {
-            return mService.retrieveBackupData();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Restore state from the backed up data.
-     * @param data byte stream in the same format produced by {@link #retrieveBackupData()}
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void restoreBackupData(@NonNull byte[] data) {
-        try {
-            mService.restoreBackupData(data);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Returns a byte stream representing the data that needs to be backed up to save the
-     * current soft ap config data.
-     *
-     * This soft ap config can be restored by calling {@link #restoreSoftApBackupData(byte[])}
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public byte[] retrieveSoftApBackupData() {
-        try {
-            return mService.retrieveSoftApBackupData();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Returns soft ap config from the backed up data or null if data is invalid.
-     * @param data byte stream in the same format produced by {@link #retrieveSoftApBackupData()}
-     *
-     * @hide
-     */
-    @Nullable
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public SoftApConfiguration restoreSoftApBackupData(@NonNull byte[] data) {
-        try {
-            return mService.restoreSoftApBackupData(data);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Restore state from the older version of back up data.
-     * The old backup data was essentially a backup of wpa_supplicant.conf
-     * and ipconfig.txt file.
-     * @param supplicantData bytes representing wpa_supplicant.conf
-     * @param ipConfigData bytes representing ipconfig.txt
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void restoreSupplicantBackupData(
-            @NonNull byte[] supplicantData, @NonNull byte[] ipConfigData) {
-        try {
-            mService.restoreSupplicantBackupData(supplicantData, ipConfigData);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Start subscription provisioning flow
-     *
-     * @param provider {@link OsuProvider} to provision with
-     * @param executor the Executor on which to run the callback.
-     * @param callback {@link ProvisioningCallback} for updates regarding provisioning flow
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD
-    })
-    public void startSubscriptionProvisioning(@NonNull OsuProvider provider,
-            @NonNull @CallbackExecutor Executor executor, @NonNull ProvisioningCallback callback) {
-        // Verify arguments
-        if (executor == null) {
-            throw new IllegalArgumentException("executor must not be null");
-        }
-        if (callback == null) {
-            throw new IllegalArgumentException("callback must not be null");
-        }
-        try {
-            mService.startSubscriptionProvisioning(provider,
-                    new ProvisioningCallbackProxy(executor, callback));
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Helper class to support OSU Provisioning callbacks
-     */
-    private static class ProvisioningCallbackProxy extends IProvisioningCallback.Stub {
-        private final Executor mExecutor;
-        private final ProvisioningCallback mCallback;
-
-        ProvisioningCallbackProxy(Executor executor, ProvisioningCallback callback) {
-            mExecutor = executor;
-            mCallback = callback;
-        }
-
-        @Override
-        public void onProvisioningStatus(int status) {
-            mExecutor.execute(() -> mCallback.onProvisioningStatus(status));
-        }
-
-        @Override
-        public void onProvisioningFailure(int status) {
-            mExecutor.execute(() -> mCallback.onProvisioningFailure(status));
-        }
-
-        @Override
-        public void onProvisioningComplete() {
-            mExecutor.execute(() -> mCallback.onProvisioningComplete());
-        }
-    }
-
-    /**
-     * Interface for Traffic state callback. Should be extended by applications and set when
-     * calling {@link #registerTrafficStateCallback(Executor, WifiManager.TrafficStateCallback)}.
-     * @hide
-     */
-    @SystemApi
-    public interface TrafficStateCallback {
-        /** @hide */
-        @Retention(RetentionPolicy.SOURCE)
-        @IntDef(prefix = {"DATA_ACTIVITY_"}, value = {
-                DATA_ACTIVITY_NONE,
-                DATA_ACTIVITY_IN,
-                DATA_ACTIVITY_OUT,
-                DATA_ACTIVITY_INOUT})
-        @interface DataActivity {}
-
-        // Lowest bit indicates data reception and the second lowest bit indicates data transmitted
-        /** No data in or out */
-        int DATA_ACTIVITY_NONE         = 0x00;
-        /** Data in, no data out */
-        int DATA_ACTIVITY_IN           = 0x01;
-        /** Data out, no data in */
-        int DATA_ACTIVITY_OUT          = 0x02;
-        /** Data in and out */
-        int DATA_ACTIVITY_INOUT        = 0x03;
-
-        /**
-         * Callback invoked to inform clients about the current traffic state.
-         *
-         * @param state One of the values: {@link #DATA_ACTIVITY_NONE}, {@link #DATA_ACTIVITY_IN},
-         * {@link #DATA_ACTIVITY_OUT} & {@link #DATA_ACTIVITY_INOUT}.
-         */
-        void onStateChanged(@DataActivity int state);
-    }
-
-    /**
-     * Callback proxy for TrafficStateCallback objects.
-     *
-     * @hide
-     */
-    private class TrafficStateCallbackProxy extends ITrafficStateCallback.Stub {
-        private final Executor mExecutor;
-        private final TrafficStateCallback mCallback;
-
-        TrafficStateCallbackProxy(Executor executor, TrafficStateCallback callback) {
-            mExecutor = executor;
-            mCallback = callback;
-        }
-
-        @Override
-        public void onStateChanged(int state) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "TrafficStateCallbackProxy: onStateChanged state=" + state);
-            }
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mCallback.onStateChanged(state);
-            });
-        }
-    }
-
-    /**
-     * Registers a callback for monitoring traffic state. See {@link TrafficStateCallback}. These
-     * callbacks will be invoked periodically by platform to inform clients about the current
-     * traffic state. Caller can unregister a previously registered callback using
-     * {@link #unregisterTrafficStateCallback(TrafficStateCallback)}
-     * <p>
-     * Applications should have the
-     * {@link android.Manifest.permission#NETWORK_SETTINGS NETWORK_SETTINGS} permission. Callers
-     * without the permission will trigger a {@link java.lang.SecurityException}.
-     * <p>
-     *
-     * @param executor The Executor on whose thread to execute the callbacks of the {@code callback}
-     *                 object.
-     * @param callback Callback for traffic state events
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void registerTrafficStateCallback(@NonNull @CallbackExecutor Executor executor,
-                                             @NonNull TrafficStateCallback callback) {
-        if (executor == null) throw new IllegalArgumentException("executor cannot be null");
-        if (callback == null) throw new IllegalArgumentException("callback cannot be null");
-        Log.v(TAG, "registerTrafficStateCallback: callback=" + callback + ", executor=" + executor);
-
-        Binder binder = new Binder();
-        try {
-            mService.registerTrafficStateCallback(
-                    binder, new TrafficStateCallbackProxy(executor, callback), callback.hashCode());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Allow callers to unregister a previously registered callback. After calling this method,
-     * applications will no longer receive traffic state notifications.
-     *
-     * @param callback Callback to unregister for traffic state events
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void unregisterTrafficStateCallback(@NonNull TrafficStateCallback callback) {
-        if (callback == null) throw new IllegalArgumentException("callback cannot be null");
-        Log.v(TAG, "unregisterTrafficStateCallback: callback=" + callback);
-
-        try {
-            mService.unregisterTrafficStateCallback(callback.hashCode());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Helper method to update the local verbose logging flag based on the verbose logging
-     * level from wifi service.
-     */
-    private void updateVerboseLoggingEnabledFromService() {
-        mVerboseLoggingEnabled = isVerboseLoggingEnabled();
-    }
-
-    /**
-     * @return true if this device supports WPA3-Personal SAE
-     */
-    public boolean isWpa3SaeSupported() {
-        return isFeatureSupported(WIFI_FEATURE_WPA3_SAE);
-    }
-
-    /**
-     * @return true if this device supports WPA3-Enterprise Suite-B-192
-     */
-    public boolean isWpa3SuiteBSupported() {
-        return isFeatureSupported(WIFI_FEATURE_WPA3_SUITE_B);
-    }
-
-    /**
-     * @return true if this device supports Wi-Fi Enhanced Open (OWE)
-     */
-    public boolean isEnhancedOpenSupported() {
-        return isFeatureSupported(WIFI_FEATURE_OWE);
-    }
-
-    /**
-     * Wi-Fi Easy Connect (DPP) introduces standardized mechanisms to simplify the provisioning and
-     * configuration of Wi-Fi devices.
-     * For more details, visit <a href="https://www.wi-fi.org/">https://www.wi-fi.org/</a> and
-     * search for "Easy Connect" or "Device Provisioning Protocol specification".
-     *
-     * @return true if this device supports Wi-Fi Easy-connect (Device Provisioning Protocol)
-     */
-    public boolean isEasyConnectSupported() {
-        return isFeatureSupported(WIFI_FEATURE_DPP);
-    }
-
-    /**
-     * @return true if this device supports WAPI.
-     */
-    public boolean isWapiSupported() {
-        return isFeatureSupported(WIFI_FEATURE_WAPI);
-    }
-
-    /**
-     * Gets the factory Wi-Fi MAC addresses.
-     * @return Array of String representing Wi-Fi MAC addresses sorted lexically or an empty Array
-     * if failed.
-     * @hide
-     */
-    @NonNull
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public String[] getFactoryMacAddresses() {
-        try {
-            return mService.getFactoryMacAddresses();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"DEVICE_MOBILITY_STATE_"}, value = {
-            DEVICE_MOBILITY_STATE_UNKNOWN,
-            DEVICE_MOBILITY_STATE_HIGH_MVMT,
-            DEVICE_MOBILITY_STATE_LOW_MVMT,
-            DEVICE_MOBILITY_STATE_STATIONARY})
-    public @interface DeviceMobilityState {}
-
-    /**
-     * Unknown device mobility state
-     *
-     * @see #setDeviceMobilityState(int)
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int DEVICE_MOBILITY_STATE_UNKNOWN = 0;
-
-    /**
-     * High movement device mobility state.
-     * e.g. on a bike, in a motor vehicle
-     *
-     * @see #setDeviceMobilityState(int)
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int DEVICE_MOBILITY_STATE_HIGH_MVMT = 1;
-
-    /**
-     * Low movement device mobility state.
-     * e.g. walking, running
-     *
-     * @see #setDeviceMobilityState(int)
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int DEVICE_MOBILITY_STATE_LOW_MVMT = 2;
-
-    /**
-     * Stationary device mobility state
-     *
-     * @see #setDeviceMobilityState(int)
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int DEVICE_MOBILITY_STATE_STATIONARY = 3;
-
-    /**
-     * Updates the device mobility state. Wifi uses this information to adjust the interval between
-     * Wifi scans in order to balance power consumption with scan accuracy.
-     * The default mobility state when the device boots is {@link #DEVICE_MOBILITY_STATE_UNKNOWN}.
-     * This API should be called whenever there is a change in the mobility state.
-     * @param state the updated device mobility state
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.WIFI_SET_DEVICE_MOBILITY_STATE)
-    public void setDeviceMobilityState(@DeviceMobilityState int state) {
-        try {
-            mService.setDeviceMobilityState(state);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /* Easy Connect - AKA Device Provisioning Protocol (DPP) */
-
-    /**
-     * Easy Connect Network role: Station.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int EASY_CONNECT_NETWORK_ROLE_STA = 0;
-
-    /**
-     * Easy Connect Network role: Access Point.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final int EASY_CONNECT_NETWORK_ROLE_AP = 1;
-
-    /** @hide */
-    @IntDef(prefix = {"EASY_CONNECT_NETWORK_ROLE_"}, value = {
-            EASY_CONNECT_NETWORK_ROLE_STA,
-            EASY_CONNECT_NETWORK_ROLE_AP,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface EasyConnectNetworkRole {
-    }
-
-    /**
-     * Start Easy Connect (DPP) in Configurator-Initiator role. The current device will initiate
-     * Easy Connect bootstrapping with a peer, and configure the peer with the SSID and password of
-     * the specified network using the Easy Connect protocol on an encrypted link.
-     *
-     * @param enrolleeUri         URI of the Enrollee obtained separately (e.g. QR code scanning)
-     * @param selectedNetworkId   Selected network ID to be sent to the peer
-     * @param enrolleeNetworkRole The network role of the enrollee
-     * @param callback            Callback for status updates
-     * @param executor            The Executor on which to run the callback.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD})
-    public void startEasyConnectAsConfiguratorInitiator(@NonNull String enrolleeUri,
-            int selectedNetworkId, @EasyConnectNetworkRole int enrolleeNetworkRole,
-            @NonNull @CallbackExecutor Executor executor,
-            @NonNull EasyConnectStatusCallback callback) {
-        Binder binder = new Binder();
-        try {
-            mService.startDppAsConfiguratorInitiator(binder, enrolleeUri, selectedNetworkId,
-                    enrolleeNetworkRole, new EasyConnectCallbackProxy(executor, callback));
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Start Easy Connect (DPP) in Enrollee-Initiator role. The current device will initiate Easy
-     * Connect bootstrapping with a peer, and receive the SSID and password from the peer
-     * configurator.
-     *
-     * @param configuratorUri URI of the Configurator obtained separately (e.g. QR code scanning)
-     * @param callback        Callback for status updates
-     * @param executor        The Executor on which to run the callback.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD})
-    public void startEasyConnectAsEnrolleeInitiator(@NonNull String configuratorUri,
-            @NonNull @CallbackExecutor Executor executor,
-            @NonNull EasyConnectStatusCallback callback) {
-        Binder binder = new Binder();
-        try {
-            mService.startDppAsEnrolleeInitiator(binder, configuratorUri,
-                    new EasyConnectCallbackProxy(executor, callback));
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Stop or abort a current Easy Connect (DPP) session. This call, once processed, will
-     * terminate any ongoing transaction, and clean up all associated resources. Caller should not
-     * expect any callbacks once this call is made. However, due to the asynchronous nature of
-     * this call, a callback may be fired if it was already pending in the queue.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_SETUP_WIZARD})
-    public void stopEasyConnectSession() {
-        try {
-            /* Request lower layers to stop/abort and clear resources */
-            mService.stopDppSession();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Helper class to support Easy Connect (DPP) callbacks
-     *
-     * @hide
-     */
-    private static class EasyConnectCallbackProxy extends IDppCallback.Stub {
-        private final Executor mExecutor;
-        private final EasyConnectStatusCallback mEasyConnectStatusCallback;
-
-        EasyConnectCallbackProxy(Executor executor,
-                EasyConnectStatusCallback easyConnectStatusCallback) {
-            mExecutor = executor;
-            mEasyConnectStatusCallback = easyConnectStatusCallback;
-        }
-
-        @Override
-        public void onSuccessConfigReceived(int newNetworkId) {
-            Log.d(TAG, "Easy Connect onSuccessConfigReceived callback");
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mEasyConnectStatusCallback.onEnrolleeSuccess(newNetworkId);
-            });
-        }
-
-        @Override
-        public void onSuccess(int status) {
-            Log.d(TAG, "Easy Connect onSuccess callback");
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mEasyConnectStatusCallback.onConfiguratorSuccess(status);
-            });
-        }
-
-        @Override
-        public void onFailure(int status, String ssid, String channelList,
-                int[] operatingClassArray) {
-            Log.d(TAG, "Easy Connect onFailure callback");
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                SparseArray<int[]> channelListArray = parseDppChannelList(channelList);
-                mEasyConnectStatusCallback.onFailure(status, ssid, channelListArray,
-                        operatingClassArray);
-            });
-        }
-
-        @Override
-        public void onProgress(int status) {
-            Log.d(TAG, "Easy Connect onProgress callback");
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> {
-                mEasyConnectStatusCallback.onProgress(status);
-            });
-        }
-    }
-
-    /**
-     * Interface for Wi-Fi usability statistics listener. Should be implemented by applications and
-     * set when calling {@link WifiManager#addOnWifiUsabilityStatsListener(Executor,
-     * OnWifiUsabilityStatsListener)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public interface OnWifiUsabilityStatsListener {
-        /**
-         * Called when Wi-Fi usability statistics is updated.
-         *
-         * @param seqNum The sequence number of statistics, used to derive the timing of updated
-         *               Wi-Fi usability statistics, set by framework and incremented by one after
-         *               each update.
-         * @param isSameBssidAndFreq The flag to indicate whether the BSSID and the frequency of
-         *                           network stays the same or not relative to the last update of
-         *                           Wi-Fi usability stats.
-         * @param stats The updated Wi-Fi usability statistics.
-         */
-        void onWifiUsabilityStats(int seqNum, boolean isSameBssidAndFreq,
-                @NonNull WifiUsabilityStatsEntry stats);
-    }
-
-    /**
-     * Adds a listener for Wi-Fi usability statistics. See {@link OnWifiUsabilityStatsListener}.
-     * Multiple listeners can be added. Callers will be invoked periodically by framework to
-     * inform clients about the current Wi-Fi usability statistics. Callers can remove a previously
-     * added listener using {@link removeOnWifiUsabilityStatsListener}.
-     *
-     * @param executor The executor on which callback will be invoked.
-     * @param listener Listener for Wifi usability statistics.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE)
-    public void addOnWifiUsabilityStatsListener(@NonNull @CallbackExecutor Executor executor,
-            @NonNull OnWifiUsabilityStatsListener listener) {
-        if (executor == null) throw new IllegalArgumentException("executor cannot be null");
-        if (listener == null) throw new IllegalArgumentException("listener cannot be null");
-        if (mVerboseLoggingEnabled) {
-            Log.v(TAG, "addOnWifiUsabilityStatsListener: listener=" + listener);
-        }
-        try {
-            mService.addOnWifiUsabilityStatsListener(new Binder(),
-                    new IOnWifiUsabilityStatsListener.Stub() {
-                        @Override
-                        public void onWifiUsabilityStats(int seqNum, boolean isSameBssidAndFreq,
-                                WifiUsabilityStatsEntry stats) {
-                            if (mVerboseLoggingEnabled) {
-                                Log.v(TAG, "OnWifiUsabilityStatsListener: "
-                                        + "onWifiUsabilityStats: seqNum=" + seqNum);
-                            }
-                            Binder.clearCallingIdentity();
-                            executor.execute(() -> listener.onWifiUsabilityStats(
-                                    seqNum, isSameBssidAndFreq, stats));
-                        }
-                    },
-                    listener.hashCode()
-            );
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Allow callers to remove a previously registered listener. After calling this method,
-     * applications will no longer receive Wi-Fi usability statistics.
-     *
-     * @param listener Listener to remove the Wi-Fi usability statistics.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE)
-    public void removeOnWifiUsabilityStatsListener(@NonNull OnWifiUsabilityStatsListener listener) {
-        if (listener == null) throw new IllegalArgumentException("listener cannot be null");
-        if (mVerboseLoggingEnabled) {
-            Log.v(TAG, "removeOnWifiUsabilityStatsListener: listener=" + listener);
-        }
-        try {
-            mService.removeOnWifiUsabilityStatsListener(listener.hashCode());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Provide a Wi-Fi usability score information to be recorded (but not acted upon) by the
-     * framework. The Wi-Fi usability score is derived from {@link OnWifiUsabilityStatsListener}
-     * where a score is matched to Wi-Fi usability statistics using the sequence number. The score
-     * is used to quantify whether Wi-Fi is usable in a future time.
-     *
-     * @param seqNum Sequence number of the Wi-Fi usability score.
-     * @param score The Wi-Fi usability score, expected range: [0, 100].
-     * @param predictionHorizonSec Prediction horizon of the Wi-Fi usability score in second,
-     *                             expected range: [0, 30].
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE)
-    public void updateWifiUsabilityScore(int seqNum, int score, int predictionHorizonSec) {
-        try {
-            mService.updateWifiUsabilityScore(seqNum, score, predictionHorizonSec);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Abstract class for scan results callback. Should be extended by applications and set when
-     * calling {@link WifiManager#registerScanResultsCallback(Executor, ScanResultsCallback)}.
-     */
-    public abstract static class ScanResultsCallback {
-        private final ScanResultsCallbackProxy mScanResultsCallbackProxy;
-
-        public ScanResultsCallback() {
-            mScanResultsCallbackProxy = new ScanResultsCallbackProxy();
-        }
-
-        /**
-         * Called when new scan results are available.
-         * Clients should use {@link WifiManager#getScanResults()} to get the scan results.
-         */
-        public abstract void onScanResultsAvailable();
-
-        /*package*/ @NonNull ScanResultsCallbackProxy getProxy() {
-            return mScanResultsCallbackProxy;
-        }
-
-        private static class ScanResultsCallbackProxy extends IScanResultsCallback.Stub {
-            private final Object mLock = new Object();
-            @Nullable @GuardedBy("mLock") private Executor mExecutor;
-            @Nullable @GuardedBy("mLock") private ScanResultsCallback mCallback;
-
-            ScanResultsCallbackProxy() {
-                mCallback = null;
-                mExecutor = null;
-            }
-
-            /*package*/ void initProxy(@NonNull Executor executor,
-                    @NonNull ScanResultsCallback callback) {
-                synchronized (mLock) {
-                    mExecutor = executor;
-                    mCallback = callback;
-                }
-            }
-
-            /*package*/ void cleanUpProxy() {
-                synchronized (mLock) {
-                    mExecutor = null;
-                    mCallback = null;
-                }
-            }
-
-            @Override
-            public void onScanResultsAvailable() {
-                ScanResultsCallback callback;
-                Executor executor;
-                synchronized (mLock) {
-                    executor = mExecutor;
-                    callback = mCallback;
-                }
-                if (callback == null || executor == null) {
-                    return;
-                }
-                Binder.clearCallingIdentity();
-                executor.execute(callback::onScanResultsAvailable);
-            }
-        }
-
-    }
-
-    /**
-     * Register a callback for Scan Results. See {@link ScanResultsCallback}.
-     * Caller will receive the event when scan results are available.
-     * Caller should use {@link WifiManager#getScanResults()} requires
-     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} to get the scan results.
-     * Caller can remove a previously registered callback using
-     * {@link WifiManager#unregisterScanResultsCallback(ScanResultsCallback)}
-     * Same caller can add multiple listeners.
-     * <p>
-     * Applications should have the
-     * {@link android.Manifest.permission#ACCESS_WIFI_STATE} permission. Callers
-     * without the permission will trigger a {@link java.lang.SecurityException}.
-     * <p>
-     *
-     * @param executor The executor to execute the callback of the {@code callback} object.
-     * @param callback callback for Scan Results events
-     */
-
-    @RequiresPermission(ACCESS_WIFI_STATE)
-    public void registerScanResultsCallback(@NonNull @CallbackExecutor Executor executor,
-            @NonNull ScanResultsCallback callback) {
-        if (executor == null) throw new IllegalArgumentException("executor cannot be null");
-        if (callback == null) throw new IllegalArgumentException("callback cannot be null");
-
-        Log.v(TAG, "registerScanResultsCallback: callback=" + callback
-                + ", executor=" + executor);
-        ScanResultsCallback.ScanResultsCallbackProxy proxy = callback.getProxy();
-        proxy.initProxy(executor, callback);
-        try {
-            mService.registerScanResultsCallback(proxy);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Allow callers to unregister a previously registered callback. After calling this method,
-     * applications will no longer receive Scan Results events.
-     *
-     * @param callback callback to unregister for Scan Results events
-     */
-    @RequiresPermission(ACCESS_WIFI_STATE)
-    public void unregisterScanResultsCallback(@NonNull ScanResultsCallback callback) {
-        if (callback == null) throw new IllegalArgumentException("callback cannot be null");
-        Log.v(TAG, "unregisterScanResultsCallback: Callback=" + callback);
-        ScanResultsCallback.ScanResultsCallbackProxy proxy = callback.getProxy();
-        try {
-            mService.unregisterScanResultsCallback(proxy);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        } finally {
-            proxy.cleanUpProxy();
-        }
-    }
-
-    /**
-     * Interface for suggestion connection status listener.
-     * Should be implemented by applications and set when calling
-     * {@link WifiManager#addSuggestionConnectionStatusListener(
-     * Executor, SuggestionConnectionStatusListener)}.
-     */
-    public interface SuggestionConnectionStatusListener {
-
-        /**
-         * Called when the framework attempted to connect to a suggestion provided by the
-         * registering app, but the connection to the suggestion failed.
-         * @param wifiNetworkSuggestion The suggestion which failed to connect.
-         * @param failureReason the connection failure reason code. One of
-         * {@link #STATUS_SUGGESTION_CONNECTION_FAILURE_ASSOCIATION},
-         * {@link #STATUS_SUGGESTION_CONNECTION_FAILURE_AUTHENTICATION},
-         * {@link #STATUS_SUGGESTION_CONNECTION_FAILURE_IP_PROVISIONING}
-         * {@link #STATUS_SUGGESTION_CONNECTION_FAILURE_UNKNOWN}
-         */
-        void onConnectionStatus(
-                @NonNull WifiNetworkSuggestion wifiNetworkSuggestion,
-                @SuggestionConnectionStatusCode int failureReason);
-    }
-
-    private class SuggestionConnectionStatusListenerProxy extends
-            ISuggestionConnectionStatusListener.Stub {
-        private final Executor mExecutor;
-        private final SuggestionConnectionStatusListener mListener;
-
-        SuggestionConnectionStatusListenerProxy(@NonNull Executor executor,
-                @NonNull SuggestionConnectionStatusListener listener) {
-            mExecutor = executor;
-            mListener = listener;
-        }
-
-        @Override
-        public void onConnectionStatus(@NonNull WifiNetworkSuggestion wifiNetworkSuggestion,
-                int failureReason) {
-            mExecutor.execute(() ->
-                    mListener.onConnectionStatus(wifiNetworkSuggestion, failureReason));
-        }
-
-    }
-
-    /**
-     * Add a listener for suggestion networks. See {@link SuggestionConnectionStatusListener}.
-     * Caller will receive the event when suggested network have connection failure.
-     * Caller can remove a previously registered listener using
-     * {@link WifiManager#removeSuggestionConnectionStatusListener(
-     * SuggestionConnectionStatusListener)}
-     * Same caller can add multiple listeners to monitor the event.
-     * <p>
-     * Applications should have the
-     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
-     * {@link android.Manifest.permission#ACCESS_WIFI_STATE} permissions.
-     * Callers without the permission will trigger a {@link java.lang.SecurityException}.
-     * <p>
-     *
-     * @param executor The executor to execute the listener of the {@code listener} object.
-     * @param listener listener for suggestion network connection failure.
-     */
-    @RequiresPermission(allOf = {ACCESS_FINE_LOCATION, ACCESS_WIFI_STATE})
-    public void addSuggestionConnectionStatusListener(@NonNull @CallbackExecutor Executor executor,
-            @NonNull SuggestionConnectionStatusListener listener) {
-        if (listener == null) throw new IllegalArgumentException("Listener cannot be null");
-        if (executor == null) throw new IllegalArgumentException("Executor cannot be null");
-        Log.v(TAG, "addSuggestionConnectionStatusListener listener=" + listener
-                + ", executor=" + executor);
-        try {
-            mService.registerSuggestionConnectionStatusListener(new Binder(),
-                    new SuggestionConnectionStatusListenerProxy(executor, listener),
-                    listener.hashCode(), mContext.getOpPackageName(), mContext.getAttributionTag());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-
-    }
-
-    /**
-     * Allow callers to remove a previously registered listener. After calling this method,
-     * applications will no longer receive suggestion connection events through that listener.
-     *
-     * @param listener listener to remove.
-     */
-    @RequiresPermission(ACCESS_WIFI_STATE)
-    public void removeSuggestionConnectionStatusListener(
-            @NonNull SuggestionConnectionStatusListener listener) {
-        if (listener == null) throw new IllegalArgumentException("Listener cannot be null");
-        Log.v(TAG, "removeSuggestionConnectionStatusListener: listener=" + listener);
-        try {
-            mService.unregisterSuggestionConnectionStatusListener(listener.hashCode(),
-                    mContext.getOpPackageName());
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Parse the list of channels the DPP enrollee reports when it fails to find an AP.
-     *
-     * @param channelList List of channels in the format defined in the DPP specification.
-     * @return A parsed sparse array, where the operating class is the key.
-     * @hide
-     */
-    @VisibleForTesting
-    public static SparseArray<int[]> parseDppChannelList(String channelList) {
-        SparseArray<int[]> channelListArray = new SparseArray<>();
-
-        if (TextUtils.isEmpty(channelList)) {
-            return channelListArray;
-        }
-        StringTokenizer str = new StringTokenizer(channelList, ",");
-        String classStr = null;
-        List<Integer> channelsInClass = new ArrayList<>();
-
-        try {
-            while (str.hasMoreElements()) {
-                String cur = str.nextToken();
-
-                /**
-                 * Example for a channel list:
-                 *
-                 * 81/1,2,3,4,5,6,7,8,9,10,11,115/36,40,44,48,118/52,56,60,64,121/100,104,108,112,
-                 * 116,120,124,128,132,136,140,0/144,124/149,153,157,161,125/165
-                 *
-                 * Detect operating class by the delimiter of '/' and use a string tokenizer with
-                 * ',' as a delimiter.
-                 */
-                int classDelim = cur.indexOf('/');
-                if (classDelim != -1) {
-                    if (classStr != null) {
-                        // Store the last channel array in the sparse array, where the operating
-                        // class is the key (as an integer).
-                        int[] channelsArray = new int[channelsInClass.size()];
-                        for (int i = 0; i < channelsInClass.size(); i++) {
-                            channelsArray[i] = channelsInClass.get(i);
-                        }
-                        channelListArray.append(Integer.parseInt(classStr), channelsArray);
-                        channelsInClass = new ArrayList<>();
-                    }
-
-                    // Init a new operating class and store the first channel
-                    classStr = cur.substring(0, classDelim);
-                    String channelStr = cur.substring(classDelim + 1);
-                    channelsInClass.add(Integer.parseInt(channelStr));
-                } else {
-                    if (classStr == null) {
-                        // Invalid format
-                        Log.e(TAG, "Cannot parse DPP channel list");
-                        return new SparseArray<>();
-                    }
-                    channelsInClass.add(Integer.parseInt(cur));
-                }
-            }
-
-            // Store the last array
-            if (classStr != null) {
-                int[] channelsArray = new int[channelsInClass.size()];
-                for (int i = 0; i < channelsInClass.size(); i++) {
-                    channelsArray[i] = channelsInClass.get(i);
-                }
-                channelListArray.append(Integer.parseInt(classStr), channelsArray);
-            }
-            return channelListArray;
-        } catch (NumberFormatException e) {
-            Log.e(TAG, "Cannot parse DPP channel list");
-            return new SparseArray<>();
-        }
-    }
-
-    /**
-     * Callback interface for framework to receive network status updates and trigger of updating
-     * {@link WifiUsabilityStatsEntry}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public interface ScoreUpdateObserver {
-        /**
-         * Called by applications to indicate network status.
-         *
-         * @param sessionId The ID to indicate current Wi-Fi network connection obtained from
-         *                  {@link WifiConnectedNetworkScorer#onStart(int)}.
-         * @param score The score representing link quality of current Wi-Fi network connection.
-         *              Populated by connected network scorer in applications..
-         */
-        void notifyScoreUpdate(int sessionId, int score);
-
-        /**
-         * Called by applications to trigger an update of {@link WifiUsabilityStatsEntry}.
-         * To receive update applications need to add WifiUsabilityStatsEntry listener. See
-         * {@link addOnWifiUsabilityStatsListener(Executor, OnWifiUsabilityStatsListener)}.
-         *
-         * @param sessionId The ID to indicate current Wi-Fi network connection obtained from
-         *                  {@link WifiConnectedNetworkScorer#onStart(int)}.
-         */
-        void triggerUpdateOfWifiUsabilityStats(int sessionId);
-    }
-
-    /**
-     * Callback proxy for {@link ScoreUpdateObserver} objects.
-     *
-     * @hide
-     */
-    private class ScoreUpdateObserverProxy implements ScoreUpdateObserver {
-        private final IScoreUpdateObserver mScoreUpdateObserver;
-
-        private ScoreUpdateObserverProxy(IScoreUpdateObserver observer) {
-            mScoreUpdateObserver = observer;
-        }
-
-        @Override
-        public void notifyScoreUpdate(int sessionId, int score) {
-            try {
-                mScoreUpdateObserver.notifyScoreUpdate(sessionId, score);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        }
-
-        @Override
-        public void triggerUpdateOfWifiUsabilityStats(int sessionId) {
-            try {
-                mScoreUpdateObserver.triggerUpdateOfWifiUsabilityStats(sessionId);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        }
-    }
-
-    /**
-     * Interface for Wi-Fi connected network scorer. Should be implemented by applications and set
-     * when calling
-     * {@link WifiManager#setWifiConnectedNetworkScorer(Executor, WifiConnectedNetworkScorer)}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public interface WifiConnectedNetworkScorer {
-        /**
-         * Called by framework to indicate the start of a network connection.
-         * @param sessionId The ID to indicate current Wi-Fi network connection.
-         */
-        void onStart(int sessionId);
-
-        /**
-         * Called by framework to indicate the end of a network connection.
-         * @param sessionId The ID to indicate current Wi-Fi network connection obtained from
-         *                  {@link WifiConnectedNetworkScorer#onStart(int)}.
-         */
-        void onStop(int sessionId);
-
-        /**
-         * Framework sets callback for score change events after application sets its scorer.
-         * @param observerImpl The instance for {@link WifiManager#ScoreUpdateObserver}. Should be
-         * implemented and instantiated by framework.
-         */
-        void onSetScoreUpdateObserver(@NonNull ScoreUpdateObserver observerImpl);
-    }
-
-    /**
-     * Callback proxy for {@link WifiConnectedNetworkScorer} objects.
-     *
-     * @hide
-     */
-    private class WifiConnectedNetworkScorerProxy extends IWifiConnectedNetworkScorer.Stub {
-        private Executor mExecutor;
-        private WifiConnectedNetworkScorer mScorer;
-
-        WifiConnectedNetworkScorerProxy(Executor executor, WifiConnectedNetworkScorer scorer) {
-            mExecutor = executor;
-            mScorer = scorer;
-        }
-
-        @Override
-        public void onStart(int sessionId) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "WifiConnectedNetworkScorer: " + "onStart: sessionId=" + sessionId);
-            }
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> mScorer.onStart(sessionId));
-        }
-
-        @Override
-        public void onStop(int sessionId) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "WifiConnectedNetworkScorer: " + "onStop: sessionId=" + sessionId);
-            }
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> mScorer.onStop(sessionId));
-        }
-
-        @Override
-        public void onSetScoreUpdateObserver(IScoreUpdateObserver observerImpl) {
-            if (mVerboseLoggingEnabled) {
-                Log.v(TAG, "WifiConnectedNetworkScorer: "
-                        + "onSetScoreUpdateObserver: observerImpl=" + observerImpl);
-            }
-            Binder.clearCallingIdentity();
-            mExecutor.execute(() -> mScorer.onSetScoreUpdateObserver(
-                    new ScoreUpdateObserverProxy(observerImpl)));
-        }
-    }
-
-    /**
-     * Set a callback for Wi-Fi connected network scorer.  See {@link WifiConnectedNetworkScorer}.
-     * Only a single scorer can be set. Caller will be invoked periodically by framework to inform
-     * client about start and stop of Wi-Fi connection. Caller can clear a previously set scorer
-     * using {@link clearWifiConnectedNetworkScorer()}.
-     *
-     * @param executor The executor on which callback will be invoked.
-     * @param scorer Scorer for Wi-Fi network implemented by application.
-     * @return true Scorer is set successfully.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE)
-    public boolean setWifiConnectedNetworkScorer(@NonNull @CallbackExecutor Executor executor,
-            @NonNull WifiConnectedNetworkScorer scorer) {
-        if (executor == null) throw new IllegalArgumentException("executor cannot be null");
-        if (scorer == null) throw new IllegalArgumentException("scorer cannot be null");
-        if (mVerboseLoggingEnabled) {
-            Log.v(TAG, "setWifiConnectedNetworkScorer: scorer=" + scorer);
-        }
-        try {
-            return mService.setWifiConnectedNetworkScorer(new Binder(),
-                    new WifiConnectedNetworkScorerProxy(executor, scorer));
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Allow caller to clear a previously set scorer. After calling this method,
-     * client will no longer receive information about start and stop of Wi-Fi connection.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.WIFI_UPDATE_USABILITY_STATS_SCORE)
-    public void clearWifiConnectedNetworkScorer() {
-        if (mVerboseLoggingEnabled) {
-            Log.v(TAG, "clearWifiConnectedNetworkScorer");
-        }
-        try {
-            mService.clearWifiConnectedNetworkScorer();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Enable/disable wifi scan throttling from 3rd party apps.
-     *
-     * <p>
-     * The throttling limits for apps are described in
-     * <a href="Wi-Fi Scan Throttling">
-     * https://developer.android.com/guide/topics/connectivity/wifi-scan#wifi-scan-throttling</a>
-     * </p>
-     *
-     * @param enable true to allow scan throttling, false to disallow scan throttling.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void setScanThrottleEnabled(boolean enable) {
-        try {
-            mService.setScanThrottleEnabled(enable);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Get the persisted Wi-Fi scan throttle state. Defaults to true, unless changed by the user via
-     * Developer options.
-     *
-     * <p>
-     * The throttling limits for apps are described in
-     * <a href="Wi-Fi Scan Throttling">
-     * https://developer.android.com/guide/topics/connectivity/wifi-scan#wifi-scan-throttling</a>
-     * </p>
-     *
-     * @return true to indicate that scan throttling is enabled, false to indicate that scan
-     * throttling is disabled.
-     */
-    @RequiresPermission(ACCESS_WIFI_STATE)
-    public boolean isScanThrottleEnabled() {
-        try {
-            return mService.isScanThrottleEnabled();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Enable/disable wifi auto wakeup feature.
-     *
-     * <p>
-     * The feature is described in
-     * <a href="Wi-Fi Turn on automatically">
-     * https://source.android.com/devices/tech/connect/wifi-infrastructure
-     * #turn_on_wi-fi_automatically
-     * </a>
-     *
-     * @param enable true to enable, false to disable.
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void setAutoWakeupEnabled(boolean enable) {
-        try {
-            mService.setAutoWakeupEnabled(enable);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Get the persisted Wi-Fi auto wakeup feature state. Defaults to false, unless changed by the
-     * user via Settings.
-     *
-     * <p>
-     * The feature is described in
-     * <a href="Wi-Fi Turn on automatically">
-     * https://source.android.com/devices/tech/connect/wifi-infrastructure
-     * #turn_on_wi-fi_automatically
-     * </a>
-     *
-     * @return true to indicate that wakeup feature is enabled, false to indicate that wakeup
-     * feature is disabled.
-     */
-    @RequiresPermission(ACCESS_WIFI_STATE)
-    public boolean isAutoWakeupEnabled() {
-        try {
-            return mService.isAutoWakeupEnabled();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java
deleted file mode 100644
index 0d13805..0000000
--- a/wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static com.android.internal.util.Preconditions.checkNotNull;
-import static com.android.internal.util.Preconditions.checkState;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.net.MacAddress;
-import android.net.MatchAllNetworkSpecifier;
-import android.net.NetworkRequest;
-import android.net.NetworkSpecifier;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Objects;
-
-/**
- * Network specifier object used by wifi's {@link android.net.NetworkAgent}.
- * @hide
- */
-public final class WifiNetworkAgentSpecifier extends NetworkSpecifier implements Parcelable {
-    /**
-     * Security credentials for the currently connected network.
-     */
-    private final WifiConfiguration mWifiConfiguration;
-
-    public WifiNetworkAgentSpecifier(@NonNull WifiConfiguration wifiConfiguration) {
-        checkNotNull(wifiConfiguration);
-
-        mWifiConfiguration = wifiConfiguration;
-    }
-
-    /**
-     * @hide
-     */
-    public static final @android.annotation.NonNull Creator<WifiNetworkAgentSpecifier> CREATOR =
-            new Creator<WifiNetworkAgentSpecifier>() {
-                @Override
-                public WifiNetworkAgentSpecifier createFromParcel(@NonNull Parcel in) {
-                    WifiConfiguration wifiConfiguration = in.readParcelable(null);
-                    return new WifiNetworkAgentSpecifier(wifiConfiguration);
-                }
-
-                @Override
-                public WifiNetworkAgentSpecifier[] newArray(int size) {
-                    return new WifiNetworkAgentSpecifier[size];
-                }
-            };
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeParcelable(mWifiConfiguration, flags);
-    }
-
-    @Override
-    public boolean canBeSatisfiedBy(@Nullable NetworkSpecifier other) {
-        if (this == other) {
-            return true;
-        }
-        // Any generic requests should be satisifed by a specific wifi network.
-        if (other == null || other instanceof MatchAllNetworkSpecifier) {
-            return true;
-        }
-        if (other instanceof WifiNetworkSpecifier) {
-            return satisfiesNetworkSpecifier((WifiNetworkSpecifier) other);
-        }
-        return equals(other);
-    }
-
-    /**
-     * Match {@link WifiNetworkSpecifier} in app's {@link NetworkRequest} with the
-     * {@link WifiNetworkAgentSpecifier} in wifi platform's {@link android.net.NetworkAgent}.
-     */
-    public boolean satisfiesNetworkSpecifier(@NonNull WifiNetworkSpecifier ns) {
-        // None of these should be null by construction.
-        // {@link WifiNetworkSpecifier.Builder} enforces non-null in {@link WifiNetworkSpecifier}.
-        // {@link WifiNetworkFactory} ensures non-null in {@link WifiNetworkAgentSpecifier}.
-        checkNotNull(ns);
-        checkNotNull(ns.ssidPatternMatcher);
-        checkNotNull(ns.bssidPatternMatcher);
-        checkNotNull(ns.wifiConfiguration.allowedKeyManagement);
-        checkNotNull(this.mWifiConfiguration.SSID);
-        checkNotNull(this.mWifiConfiguration.BSSID);
-        checkNotNull(this.mWifiConfiguration.allowedKeyManagement);
-
-        final String ssidWithQuotes = this.mWifiConfiguration.SSID;
-        checkState(ssidWithQuotes.startsWith("\"") && ssidWithQuotes.endsWith("\""));
-        final String ssidWithoutQuotes = ssidWithQuotes.substring(1, ssidWithQuotes.length() - 1);
-        if (!ns.ssidPatternMatcher.match(ssidWithoutQuotes)) {
-            return false;
-        }
-        final MacAddress bssid = MacAddress.fromString(this.mWifiConfiguration.BSSID);
-        final MacAddress matchBaseAddress = ns.bssidPatternMatcher.first;
-        final MacAddress matchMask = ns.bssidPatternMatcher.second;
-        if (!bssid.matches(matchBaseAddress, matchMask))  {
-            return false;
-        }
-        if (!ns.wifiConfiguration.allowedKeyManagement.equals(
-                this.mWifiConfiguration.allowedKeyManagement)) {
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(
-                mWifiConfiguration.SSID,
-                mWifiConfiguration.BSSID,
-                mWifiConfiguration.allowedKeyManagement);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof WifiNetworkAgentSpecifier)) {
-            return false;
-        }
-        WifiNetworkAgentSpecifier lhs = (WifiNetworkAgentSpecifier) obj;
-        return Objects.equals(this.mWifiConfiguration.SSID, lhs.mWifiConfiguration.SSID)
-                && Objects.equals(this.mWifiConfiguration.BSSID, lhs.mWifiConfiguration.BSSID)
-                && Objects.equals(this.mWifiConfiguration.allowedKeyManagement,
-                    lhs.mWifiConfiguration.allowedKeyManagement);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder("WifiNetworkAgentSpecifier [");
-        sb.append("WifiConfiguration=")
-                .append(", SSID=").append(mWifiConfiguration.SSID)
-                .append(", BSSID=").append(mWifiConfiguration.BSSID)
-                .append("]");
-        return sb.toString();
-    }
-
-    @Override
-    public NetworkSpecifier redact() {
-        return null;
-    }
-}
diff --git a/wifi/java/android/net/wifi/WifiNetworkConnectionStatistics.java b/wifi/java/android/net/wifi/WifiNetworkConnectionStatistics.java
deleted file mode 100644
index 95b2e77..0000000
--- a/wifi/java/android/net/wifi/WifiNetworkConnectionStatistics.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.NonNull;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * Connection Statistics For a WiFi Network.
- * @hide
- */
-@SystemApi
-public class WifiNetworkConnectionStatistics implements Parcelable {
-    private static final String TAG = "WifiNetworkConnnectionStatistics";
-
-    public int numConnection;
-    public int numUsage;
-
-    public WifiNetworkConnectionStatistics(int connection, int usage) {
-        numConnection = connection;
-        numUsage = usage;
-    }
-
-    public WifiNetworkConnectionStatistics() { }
-
-    @NonNull
-    @Override
-    public String toString() {
-        StringBuilder sbuf = new StringBuilder();
-        sbuf.append("c=").append(numConnection);
-        sbuf.append(" u=").append(numUsage);
-        return sbuf.toString();
-    }
-
-
-    /** copy constructor*/
-    public WifiNetworkConnectionStatistics(WifiNetworkConnectionStatistics source) {
-        numConnection = source.numConnection;
-        numUsage = source.numUsage;
-    }
-
-    /** Implement the Parcelable interface */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface */
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(numConnection);
-        dest.writeInt(numUsage);
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @android.annotation.NonNull Creator<WifiNetworkConnectionStatistics> CREATOR =
-        new Creator<WifiNetworkConnectionStatistics>() {
-            public WifiNetworkConnectionStatistics createFromParcel(Parcel in) {
-                int numConnection = in.readInt();
-                int numUsage = in.readInt();
-                WifiNetworkConnectionStatistics stats =
-                        new WifiNetworkConnectionStatistics(numConnection, numUsage);
-                return stats;
-            }
-
-            public WifiNetworkConnectionStatistics[] newArray(int size) {
-                return new WifiNetworkConnectionStatistics[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java b/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
deleted file mode 100644
index e12bb91..0000000
--- a/wifi/java/android/net/wifi/WifiNetworkSpecifier.java
+++ /dev/null
@@ -1,584 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static com.android.internal.util.Preconditions.checkNotNull;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.net.MacAddress;
-import android.net.NetworkRequest;
-import android.net.NetworkSpecifier;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.PatternMatcher;
-import android.text.TextUtils;
-import android.util.Pair;
-
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.StandardCharsets;
-import java.util.Objects;
-
-/**
- * Network specifier object used to request a local Wi-Fi network. Apps should use the
- * {@link WifiNetworkSpecifier.Builder} class to create an instance.
- */
-public final class WifiNetworkSpecifier extends NetworkSpecifier implements Parcelable {
-    private static final String TAG = "WifiNetworkSpecifier";
-
-    /**
-     * Builder used to create {@link WifiNetworkSpecifier} objects.
-     */
-    public static final class Builder {
-        private static final String MATCH_ALL_SSID_PATTERN_PATH = ".*";
-        private static final String MATCH_EMPTY_SSID_PATTERN_PATH = "";
-        private static final Pair<MacAddress, MacAddress> MATCH_NO_BSSID_PATTERN1 =
-                new Pair<>(MacAddress.BROADCAST_ADDRESS, MacAddress.BROADCAST_ADDRESS);
-        private static final Pair<MacAddress, MacAddress> MATCH_NO_BSSID_PATTERN2 =
-                new Pair<>(WifiManager.ALL_ZEROS_MAC_ADDRESS, MacAddress.BROADCAST_ADDRESS);
-        private static final Pair<MacAddress, MacAddress> MATCH_ALL_BSSID_PATTERN =
-                new Pair<>(WifiManager.ALL_ZEROS_MAC_ADDRESS, WifiManager.ALL_ZEROS_MAC_ADDRESS);
-        private static final MacAddress MATCH_EXACT_BSSID_PATTERN_MASK =
-                MacAddress.BROADCAST_ADDRESS;
-
-        /**
-         * SSID pattern match specified by the app.
-         */
-        private @Nullable PatternMatcher mSsidPatternMatcher;
-        /**
-         * BSSID pattern match specified by the app.
-         * Pair of <BaseAddress, Mask>.
-         */
-        private @Nullable Pair<MacAddress, MacAddress> mBssidPatternMatcher;
-        /**
-         * Whether this is an OWE network or not.
-         */
-        private boolean mIsEnhancedOpen;
-        /**
-         * Pre-shared key for use with WPA-PSK networks.
-         */
-        private @Nullable String mWpa2PskPassphrase;
-        /**
-         * Pre-shared key for use with WPA3-SAE networks.
-         */
-        private @Nullable String mWpa3SaePassphrase;
-        /**
-         * The enterprise configuration details specifying the EAP method,
-         * certificates and other settings associated with the WPA/WPA2-Enterprise networks.
-         */
-        private @Nullable WifiEnterpriseConfig mWpa2EnterpriseConfig;
-        /**
-         * The enterprise configuration details specifying the EAP method,
-         * certificates and other settings associated with the WPA3-Enterprise networks.
-         */
-        private @Nullable WifiEnterpriseConfig mWpa3EnterpriseConfig;
-        /**
-         * This is a network that does not broadcast its SSID, so an
-         * SSID-specific probe request must be used for scans.
-         */
-        private boolean mIsHiddenSSID;
-
-        public Builder() {
-            mSsidPatternMatcher = null;
-            mBssidPatternMatcher = null;
-            mIsEnhancedOpen = false;
-            mWpa2PskPassphrase = null;
-            mWpa3SaePassphrase = null;
-            mWpa2EnterpriseConfig = null;
-            mWpa3EnterpriseConfig = null;
-            mIsHiddenSSID = false;
-        }
-
-        /**
-         * Set the unicode SSID match pattern to use for filtering networks from scan results.
-         * <p>
-         * <li>Overrides any previous value set using {@link #setSsid(String)} or
-         * {@link #setSsidPattern(PatternMatcher)}.</li>
-         *
-         * @param ssidPattern Instance of {@link PatternMatcher} containing the UTF-8 encoded
-         *                    string pattern to use for matching the network's SSID.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setSsidPattern(@NonNull PatternMatcher ssidPattern) {
-            checkNotNull(ssidPattern);
-            mSsidPatternMatcher = ssidPattern;
-            return this;
-        }
-
-        /**
-         * Set the unicode SSID for the network.
-         * <p>
-         * <li>Sets the SSID to use for filtering networks from scan results. Will only match
-         * networks whose SSID is identical to the UTF-8 encoding of the specified value.</li>
-         * <li>Overrides any previous value set using {@link #setSsid(String)} or
-         * {@link #setSsidPattern(PatternMatcher)}.</li>
-         *
-         * @param ssid The SSID of the network. It must be valid Unicode.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if the SSID is not valid unicode.
-         */
-        public @NonNull Builder setSsid(@NonNull String ssid) {
-            checkNotNull(ssid);
-            final CharsetEncoder unicodeEncoder = StandardCharsets.UTF_8.newEncoder();
-            if (!unicodeEncoder.canEncode(ssid)) {
-                throw new IllegalArgumentException("SSID is not a valid unicode string");
-            }
-            mSsidPatternMatcher = new PatternMatcher(ssid, PatternMatcher.PATTERN_LITERAL);
-            return this;
-        }
-
-        /**
-         * Set the BSSID match pattern to use for filtering networks from scan results.
-         * Will match all networks with BSSID which satisfies the following:
-         * {@code BSSID & mask == baseAddress}.
-         * <p>
-         * <li>Overrides any previous value set using {@link #setBssid(MacAddress)} or
-         * {@link #setBssidPattern(MacAddress, MacAddress)}.</li>
-         *
-         * @param baseAddress Base address for BSSID pattern.
-         * @param mask Mask for BSSID pattern.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setBssidPattern(
-                @NonNull MacAddress baseAddress, @NonNull MacAddress mask) {
-            checkNotNull(baseAddress);
-            checkNotNull(mask);
-            mBssidPatternMatcher = Pair.create(baseAddress, mask);
-            return this;
-        }
-
-        /**
-         * Set the BSSID to use for filtering networks from scan results. Will only match network
-         * whose BSSID is identical to the specified value.
-         * <p>
-         * <li>Sets the BSSID to use for filtering networks from scan results. Will only match
-         * networks whose BSSID is identical to specified value.</li>
-         * <li>Overrides any previous value set using {@link #setBssid(MacAddress)} or
-         * {@link #setBssidPattern(MacAddress, MacAddress)}.</li>
-         *
-         * @param bssid BSSID of the network.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setBssid(@NonNull MacAddress bssid) {
-            checkNotNull(bssid);
-            mBssidPatternMatcher = Pair.create(bssid, MATCH_EXACT_BSSID_PATTERN_MASK);
-            return this;
-        }
-
-        /**
-         * Specifies whether this represents an Enhanced Open (OWE) network.
-         *
-         * @param isEnhancedOpen {@code true} to indicate that the network uses enhanced open,
-         *                       {@code false} otherwise.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setIsEnhancedOpen(boolean isEnhancedOpen) {
-            mIsEnhancedOpen = isEnhancedOpen;
-            return this;
-        }
-
-        /**
-         * Set the ASCII WPA2 passphrase for this network. Needed for authenticating to
-         * WPA2-PSK networks.
-         *
-         * @param passphrase passphrase of the network.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
-         */
-        public @NonNull Builder setWpa2Passphrase(@NonNull String passphrase) {
-            checkNotNull(passphrase);
-            final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
-            if (!asciiEncoder.canEncode(passphrase)) {
-                throw new IllegalArgumentException("passphrase not ASCII encodable");
-            }
-            mWpa2PskPassphrase = passphrase;
-            return this;
-        }
-
-        /**
-         * Set the ASCII WPA3 passphrase for this network. Needed for authenticating to WPA3-SAE
-         * networks.
-         *
-         * @param passphrase passphrase of the network.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
-         */
-        public @NonNull Builder setWpa3Passphrase(@NonNull String passphrase) {
-            checkNotNull(passphrase);
-            final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
-            if (!asciiEncoder.canEncode(passphrase)) {
-                throw new IllegalArgumentException("passphrase not ASCII encodable");
-            }
-            mWpa3SaePassphrase = passphrase;
-            return this;
-        }
-
-        /**
-         * Set the associated enterprise configuration for this network. Needed for authenticating
-         * to WPA2-EAP networks. See {@link WifiEnterpriseConfig} for description.
-         *
-         * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setWpa2EnterpriseConfig(
-                @NonNull WifiEnterpriseConfig enterpriseConfig) {
-            checkNotNull(enterpriseConfig);
-            mWpa2EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
-            return this;
-        }
-
-        /**
-         * Set the associated enterprise configuration for this network. Needed for authenticating
-         * to WPA3-Enterprise networks (standard and 192-bit security). See
-         * {@link WifiEnterpriseConfig} for description. For 192-bit security networks, both the
-         * client and CA certificates must be provided, and must be of type of either
-         * sha384WithRSAEncryption (OID 1.2.840.113549.1.1.12) or ecdsa-with-SHA384
-         * (OID 1.2.840.10045.4.3.3).
-         *
-         * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setWpa3EnterpriseConfig(
-                @NonNull WifiEnterpriseConfig enterpriseConfig) {
-            checkNotNull(enterpriseConfig);
-            mWpa3EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
-            return this;
-        }
-
-        /**
-         * Specifies whether this represents a hidden network.
-         * <p>
-         * <li>Setting this disallows the usage of {@link #setSsidPattern(PatternMatcher)} since
-         * hidden networks need to be explicitly probed for.</li>
-         * <li>If not set, defaults to false (i.e not a hidden network).</li>
-         *
-         * @param isHiddenSsid {@code true} to indicate that the network is hidden, {@code false}
-         *                     otherwise.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setIsHiddenSsid(boolean isHiddenSsid) {
-            mIsHiddenSSID = isHiddenSsid;
-            return this;
-        }
-
-        private void setSecurityParamsInWifiConfiguration(
-                @NonNull WifiConfiguration configuration) {
-            if (!TextUtils.isEmpty(mWpa2PskPassphrase)) { // WPA-PSK network.
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);
-                // WifiConfiguration.preSharedKey needs quotes around ASCII password.
-                configuration.preSharedKey = "\"" + mWpa2PskPassphrase + "\"";
-            } else if (!TextUtils.isEmpty(mWpa3SaePassphrase)) { // WPA3-SAE network.
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE);
-                // WifiConfiguration.preSharedKey needs quotes around ASCII password.
-                configuration.preSharedKey = "\"" + mWpa3SaePassphrase + "\"";
-            } else if (mWpa2EnterpriseConfig != null) { // WPA-EAP network
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
-                configuration.enterpriseConfig = mWpa2EnterpriseConfig;
-            } else if (mWpa3EnterpriseConfig != null) { // WPA3-Enterprise
-                if (mWpa3EnterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS
-                        && WifiEnterpriseConfig.isSuiteBCipherCert(
-                        mWpa3EnterpriseConfig.getClientCertificate())
-                        && WifiEnterpriseConfig.isSuiteBCipherCert(
-                        mWpa3EnterpriseConfig.getCaCertificate())) {
-                    // WPA3-Enterprise in 192-bit security mode (Suite-B)
-                    configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B);
-                } else {
-                    // WPA3-Enterprise
-                    configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
-                    configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
-                    configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
-                    configuration.allowedPairwiseCiphers.set(
-                            WifiConfiguration.PairwiseCipher.GCMP_256);
-                    configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
-                    configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
-                    configuration.requirePmf = true;
-                }
-                configuration.enterpriseConfig = mWpa3EnterpriseConfig;
-            } else if (mIsEnhancedOpen) { // OWE network
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE);
-            } else { // Open network
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN);
-            }
-        }
-
-        /**
-         * Helper method to build WifiConfiguration object from the builder.
-         * @return Instance of {@link WifiConfiguration}.
-         */
-        private WifiConfiguration buildWifiConfiguration() {
-            final WifiConfiguration wifiConfiguration = new WifiConfiguration();
-            // WifiConfiguration.SSID needs quotes around unicode SSID.
-            if (mSsidPatternMatcher.getType() == PatternMatcher.PATTERN_LITERAL) {
-                wifiConfiguration.SSID = "\"" + mSsidPatternMatcher.getPath() + "\"";
-            }
-            if (mBssidPatternMatcher.second == MATCH_EXACT_BSSID_PATTERN_MASK) {
-                wifiConfiguration.BSSID = mBssidPatternMatcher.first.toString();
-            }
-            setSecurityParamsInWifiConfiguration(wifiConfiguration);
-            wifiConfiguration.hiddenSSID = mIsHiddenSSID;
-            return wifiConfiguration;
-        }
-
-        private boolean hasSetAnyPattern() {
-            return mSsidPatternMatcher != null || mBssidPatternMatcher != null;
-        }
-
-        private void setMatchAnyPatternIfUnset() {
-            if (mSsidPatternMatcher == null) {
-                mSsidPatternMatcher = new PatternMatcher(MATCH_ALL_SSID_PATTERN_PATH,
-                        PatternMatcher.PATTERN_SIMPLE_GLOB);
-            }
-            if (mBssidPatternMatcher == null) {
-                mBssidPatternMatcher = MATCH_ALL_BSSID_PATTERN;
-            }
-        }
-
-        private boolean hasSetMatchNonePattern() {
-            if (mSsidPatternMatcher.getType() != PatternMatcher.PATTERN_PREFIX
-                    && mSsidPatternMatcher.getPath().equals(MATCH_EMPTY_SSID_PATTERN_PATH)) {
-                return true;
-            }
-            if (mBssidPatternMatcher.equals(MATCH_NO_BSSID_PATTERN1)) {
-                return true;
-            }
-            if (mBssidPatternMatcher.equals(MATCH_NO_BSSID_PATTERN2)) {
-                return true;
-            }
-            return false;
-        }
-
-        private boolean hasSetMatchAllPattern() {
-            if ((mSsidPatternMatcher.match(MATCH_EMPTY_SSID_PATTERN_PATH))
-                    && mBssidPatternMatcher.equals(MATCH_ALL_BSSID_PATTERN)) {
-                return true;
-            }
-            return false;
-        }
-
-        private void validateSecurityParams() {
-            int numSecurityTypes = 0;
-            numSecurityTypes += mIsEnhancedOpen ? 1 : 0;
-            numSecurityTypes += !TextUtils.isEmpty(mWpa2PskPassphrase) ? 1 : 0;
-            numSecurityTypes += !TextUtils.isEmpty(mWpa3SaePassphrase) ? 1 : 0;
-            numSecurityTypes += mWpa2EnterpriseConfig != null ? 1 : 0;
-            numSecurityTypes += mWpa3EnterpriseConfig != null ? 1 : 0;
-            if (numSecurityTypes > 1) {
-                throw new IllegalStateException("only one of setIsEnhancedOpen, setWpa2Passphrase,"
-                        + "setWpa3Passphrase, setWpa2EnterpriseConfig or setWpa3EnterpriseConfig"
-                        + " can be invoked for network specifier");
-            }
-        }
-
-        /**
-         * Create a specifier object used to request a local Wi-Fi network. The generated
-         * {@link NetworkSpecifier} should be used in
-         * {@link NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} when building
-         * the {@link NetworkRequest}. These specifiers can only be used to request a local wifi
-         * network (i.e no internet capability). So, the device will not switch it's default route
-         * to wifi if there are other transports (cellular for example) available.
-         *<p>
-         * Note: Apps can set a combination of network match params:
-         * <li> SSID Pattern using {@link #setSsidPattern(PatternMatcher)} OR Specific SSID using
-         * {@link #setSsid(String)}. </li>
-         * AND/OR
-         * <li> BSSID Pattern using {@link #setBssidPattern(MacAddress, MacAddress)} OR Specific
-         * BSSID using {@link #setBssid(MacAddress)} </li>
-         * to trigger connection to a network that matches the set params.
-         * The system will find the set of networks matching the request and present the user
-         * with a system dialog which will allow the user to select a specific Wi-Fi network to
-         * connect to or to deny the request.
-         *</p>
-         *
-         * For example:
-         * To connect to an open network with a SSID prefix of "test" and a BSSID OUI of "10:03:23":
-         *
-         * <pre>{@code
-         * final NetworkSpecifier specifier =
-         *      new Builder()
-         *      .setSsidPattern(new PatternMatcher("test", PatterMatcher.PATTERN_PREFIX))
-         *      .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"),
-         *                       MacAddress.fromString("ff:ff:ff:00:00:00"))
-         *      .build()
-         * final NetworkRequest request =
-         *      new NetworkRequest.Builder()
-         *      .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
-         *      .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
-         *      .setNetworkSpecifier(specifier)
-         *      .build();
-         * final ConnectivityManager connectivityManager =
-         *      context.getSystemService(Context.CONNECTIVITY_SERVICE);
-         * final NetworkCallback networkCallback = new NetworkCallback() {
-         *      ...
-         *      {@literal @}Override
-         *      void onAvailable(...) {}
-         *      // etc.
-         * };
-         * connectivityManager.requestNetwork(request, networkCallback);
-         * }</pre>
-         *
-         * @return Instance of {@link NetworkSpecifier}.
-         * @throws IllegalStateException on invalid params set.
-         */
-        public @NonNull WifiNetworkSpecifier build() {
-            if (!hasSetAnyPattern()) {
-                throw new IllegalStateException("one of setSsidPattern/setSsid/setBssidPattern/"
-                        + "setBssid should be invoked for specifier");
-            }
-            setMatchAnyPatternIfUnset();
-            if (hasSetMatchNonePattern()) {
-                throw new IllegalStateException("cannot set match-none pattern for specifier");
-            }
-            if (hasSetMatchAllPattern()) {
-                throw new IllegalStateException("cannot set match-all pattern for specifier");
-            }
-            if (mIsHiddenSSID && mSsidPatternMatcher.getType() != PatternMatcher.PATTERN_LITERAL) {
-                throw new IllegalStateException("setSsid should also be invoked when "
-                        + "setIsHiddenSsid is invoked for network specifier");
-            }
-            validateSecurityParams();
-
-            return new WifiNetworkSpecifier(
-                    mSsidPatternMatcher,
-                    mBssidPatternMatcher,
-                    buildWifiConfiguration());
-        }
-    }
-
-    /**
-     * SSID pattern match specified by the app.
-     * @hide
-     */
-    public final PatternMatcher ssidPatternMatcher;
-
-    /**
-     * BSSID pattern match specified by the app.
-     * Pair of <BaseAddress, Mask>.
-     * @hide
-     */
-    public final Pair<MacAddress, MacAddress> bssidPatternMatcher;
-
-    /**
-     * Security credentials for the network.
-     * <p>
-     * Note: {@link WifiConfiguration#SSID} & {@link WifiConfiguration#BSSID} fields from
-     * WifiConfiguration are not used. Instead we use the {@link #ssidPatternMatcher} &
-     * {@link #bssidPatternMatcher} fields embedded directly
-     * within {@link WifiNetworkSpecifier}.
-     * @hide
-     */
-    public final WifiConfiguration wifiConfiguration;
-
-    /** @hide */
-    public WifiNetworkSpecifier() throws IllegalAccessException {
-        throw new IllegalAccessException("Use the builder to create an instance");
-    }
-
-    /** @hide */
-    public WifiNetworkSpecifier(@NonNull PatternMatcher ssidPatternMatcher,
-                                @NonNull Pair<MacAddress, MacAddress> bssidPatternMatcher,
-                                @NonNull WifiConfiguration wifiConfiguration) {
-        checkNotNull(ssidPatternMatcher);
-        checkNotNull(bssidPatternMatcher);
-        checkNotNull(wifiConfiguration);
-
-        this.ssidPatternMatcher = ssidPatternMatcher;
-        this.bssidPatternMatcher = bssidPatternMatcher;
-        this.wifiConfiguration = wifiConfiguration;
-    }
-
-    public static final @NonNull Creator<WifiNetworkSpecifier> CREATOR =
-            new Creator<WifiNetworkSpecifier>() {
-                @Override
-                public WifiNetworkSpecifier createFromParcel(Parcel in) {
-                    PatternMatcher ssidPatternMatcher = in.readParcelable(/* classLoader */null);
-                    MacAddress baseAddress = in.readParcelable(null);
-                    MacAddress mask = in.readParcelable(null);
-                    Pair<MacAddress, MacAddress> bssidPatternMatcher =
-                            Pair.create(baseAddress, mask);
-                    WifiConfiguration wifiConfiguration = in.readParcelable(null);
-                    return new WifiNetworkSpecifier(ssidPatternMatcher, bssidPatternMatcher,
-                            wifiConfiguration);
-                }
-
-                @Override
-                public WifiNetworkSpecifier[] newArray(int size) {
-                    return new WifiNetworkSpecifier[size];
-                }
-            };
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeParcelable(ssidPatternMatcher, flags);
-        dest.writeParcelable(bssidPatternMatcher.first, flags);
-        dest.writeParcelable(bssidPatternMatcher.second, flags);
-        dest.writeParcelable(wifiConfiguration, flags);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(
-                ssidPatternMatcher.getPath(), ssidPatternMatcher.getType(), bssidPatternMatcher,
-                wifiConfiguration.allowedKeyManagement);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof WifiNetworkSpecifier)) {
-            return false;
-        }
-        WifiNetworkSpecifier lhs = (WifiNetworkSpecifier) obj;
-        return Objects.equals(this.ssidPatternMatcher.getPath(),
-                    lhs.ssidPatternMatcher.getPath())
-                && Objects.equals(this.ssidPatternMatcher.getType(),
-                    lhs.ssidPatternMatcher.getType())
-                && Objects.equals(this.bssidPatternMatcher,
-                    lhs.bssidPatternMatcher)
-                && Objects.equals(this.wifiConfiguration.allowedKeyManagement,
-                    lhs.wifiConfiguration.allowedKeyManagement);
-    }
-
-    @Override
-    public String toString() {
-        return new StringBuilder()
-                .append("WifiNetworkSpecifier [")
-                .append(", SSID Match pattern=").append(ssidPatternMatcher)
-                .append(", BSSID Match pattern=").append(bssidPatternMatcher)
-                .append(", SSID=").append(wifiConfiguration.SSID)
-                .append(", BSSID=").append(wifiConfiguration.BSSID)
-                .append("]")
-                .toString();
-    }
-
-    /** @hide */
-    @Override
-    public boolean canBeSatisfiedBy(NetworkSpecifier other) {
-        if (other instanceof WifiNetworkAgentSpecifier) {
-            return ((WifiNetworkAgentSpecifier) other).satisfiesNetworkSpecifier(this);
-        }
-        // Specific requests are checked for equality although testing for equality of 2 patterns do
-        // not make much sense!
-        return equals(other);
-    }
-}
diff --git a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java b/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
deleted file mode 100644
index d8be1d2..0000000
--- a/wifi/java/android/net/wifi/WifiNetworkSuggestion.java
+++ /dev/null
@@ -1,986 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static com.android.internal.util.Preconditions.checkNotNull;
-
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.RequiresPermission;
-import android.annotation.SystemApi;
-import android.net.MacAddress;
-import android.net.wifi.hotspot2.PasspointConfiguration;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-
-import java.nio.charset.CharsetEncoder;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * The Network Suggestion object is used to provide a Wi-Fi network for consideration when
- * auto-connecting to networks. Apps cannot directly create this object, they must use
- * {@link WifiNetworkSuggestion.Builder#build()} to obtain an instance of this object.
- *<p>
- * Apps can provide a list of such networks to the platform using
- * {@link WifiManager#addNetworkSuggestions(List)}.
- */
-public final class WifiNetworkSuggestion implements Parcelable {
-    /**
-     * Builder used to create {@link WifiNetworkSuggestion} objects.
-     */
-    public static final class Builder {
-        private static final int UNASSIGNED_PRIORITY = -1;
-
-        /**
-         * SSID of the network.
-         */
-        private String mSsid;
-        /**
-         * Optional BSSID within the network.
-         */
-        private MacAddress mBssid;
-        /**
-         * Whether this is an OWE network or not.
-         */
-        private boolean mIsEnhancedOpen;
-        /**
-         * Pre-shared key for use with WPA-PSK networks.
-         */
-        private @Nullable String mWpa2PskPassphrase;
-        /**
-         * Pre-shared key for use with WPA3-SAE networks.
-         */
-        private @Nullable String mWpa3SaePassphrase;
-        /**
-         * The enterprise configuration details specifying the EAP method,
-         * certificates and other settings associated with the WPA/WPA2-Enterprise networks.
-         */
-        private @Nullable WifiEnterpriseConfig mWpa2EnterpriseConfig;
-        /**
-         * The enterprise configuration details specifying the EAP method,
-         * certificates and other settings associated with the WPA3-Enterprise networks.
-         */
-        private @Nullable WifiEnterpriseConfig mWpa3EnterpriseConfig;
-        /**
-         * The passpoint config for use with Hotspot 2.0 network
-         */
-        private @Nullable PasspointConfiguration mPasspointConfiguration;
-        /**
-         * This is a network that does not broadcast its SSID, so an
-         * SSID-specific probe request must be used for scans.
-         */
-        private boolean mIsHiddenSSID;
-        /**
-         * Whether app needs to log in to captive portal to obtain Internet access.
-         */
-        private boolean mIsAppInteractionRequired;
-        /**
-         * Whether user needs to log in to captive portal to obtain Internet access.
-         */
-        private boolean mIsUserInteractionRequired;
-        /**
-         * Whether this network is metered or not.
-         */
-        private int mMeteredOverride;
-        /**
-         * Priority of this network among other network suggestions provided by the app.
-         * The lower the number, the higher the priority (i.e value of 0 = highest priority).
-         */
-        private int mPriority;
-
-        /**
-         * The carrier ID identifies the operator who provides this network configuration.
-         *    see {@link TelephonyManager#getSimCarrierId()}
-         */
-        private int mCarrierId;
-
-        /**
-         * Whether this network is shared credential with user to allow user manually connect.
-         */
-        private boolean mIsSharedWithUser;
-
-        /**
-         * Whether the setCredentialSharedWithUser have been called.
-         */
-        private boolean mIsSharedWithUserSet;
-
-        /**
-         * Whether this network is initialized with auto-join enabled (the default) or not.
-         */
-        private boolean mIsInitialAutojoinEnabled;
-
-        /**
-         * Pre-shared key for use with WAPI-PSK networks.
-         */
-        private @Nullable String mWapiPskPassphrase;
-
-        /**
-         * The enterprise configuration details specifying the EAP method,
-         * certificates and other settings associated with the WAPI networks.
-         */
-        private @Nullable WifiEnterpriseConfig mWapiEnterpriseConfig;
-
-        /**
-         * Whether this network will be brought up as untrusted (TRUSTED capability bit removed).
-         */
-        private boolean mIsNetworkUntrusted;
-
-        public Builder() {
-            mSsid = null;
-            mBssid =  null;
-            mIsEnhancedOpen = false;
-            mWpa2PskPassphrase = null;
-            mWpa3SaePassphrase = null;
-            mWpa2EnterpriseConfig = null;
-            mWpa3EnterpriseConfig = null;
-            mPasspointConfiguration = null;
-            mIsHiddenSSID = false;
-            mIsAppInteractionRequired = false;
-            mIsUserInteractionRequired = false;
-            mMeteredOverride = WifiConfiguration.METERED_OVERRIDE_NONE;
-            mIsSharedWithUser = true;
-            mIsSharedWithUserSet = false;
-            mIsInitialAutojoinEnabled = true;
-            mPriority = UNASSIGNED_PRIORITY;
-            mCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
-            mWapiPskPassphrase = null;
-            mWapiEnterpriseConfig = null;
-            mIsNetworkUntrusted = false;
-        }
-
-        /**
-         * Set the unicode SSID for the network.
-         * <p>
-         * <li>Overrides any previous value set using {@link #setSsid(String)}.</li>
-         *
-         * @param ssid The SSID of the network. It must be valid Unicode.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if the SSID is not valid unicode.
-         */
-        public @NonNull Builder setSsid(@NonNull String ssid) {
-            checkNotNull(ssid);
-            final CharsetEncoder unicodeEncoder = StandardCharsets.UTF_8.newEncoder();
-            if (!unicodeEncoder.canEncode(ssid)) {
-                throw new IllegalArgumentException("SSID is not a valid unicode string");
-            }
-            mSsid = new String(ssid);
-            return this;
-        }
-
-        /**
-         * Set the BSSID to use for filtering networks from scan results. Will only match network
-         * whose BSSID is identical to the specified value.
-         * <p>
-         * <li Sets a specific BSSID for the network suggestion. If set, only the specified BSSID
-         * with the specified SSID will be considered for connection.
-         * <li>If set, only the specified BSSID with the specified SSID will be considered for
-         * connection.</li>
-         * <li>If not set, all BSSIDs with the specified SSID will be considered for connection.
-         * </li>
-         * <li>Overrides any previous value set using {@link #setBssid(MacAddress)}.</li>
-         *
-         * @param bssid BSSID of the network.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setBssid(@NonNull MacAddress bssid) {
-            checkNotNull(bssid);
-            mBssid = MacAddress.fromBytes(bssid.toByteArray());
-            return this;
-        }
-
-        /**
-         * Specifies whether this represents an Enhanced Open (OWE) network.
-         *
-         * @param isEnhancedOpen {@code true} to indicate that the network used enhanced open,
-         *                       {@code false} otherwise.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setIsEnhancedOpen(boolean isEnhancedOpen) {
-            mIsEnhancedOpen = isEnhancedOpen;
-            return this;
-        }
-
-        /**
-         * Set the ASCII WPA2 passphrase for this network. Needed for authenticating to
-         * WPA2-PSK networks.
-         *
-         * @param passphrase passphrase of the network.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
-         */
-        public @NonNull Builder setWpa2Passphrase(@NonNull String passphrase) {
-            checkNotNull(passphrase);
-            final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
-            if (!asciiEncoder.canEncode(passphrase)) {
-                throw new IllegalArgumentException("passphrase not ASCII encodable");
-            }
-            mWpa2PskPassphrase = passphrase;
-            return this;
-        }
-
-        /**
-         * Set the ASCII WPA3 passphrase for this network. Needed for authenticating to WPA3-SAE
-         * networks.
-         *
-         * @param passphrase passphrase of the network.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
-         */
-        public @NonNull Builder setWpa3Passphrase(@NonNull String passphrase) {
-            checkNotNull(passphrase);
-            final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
-            if (!asciiEncoder.canEncode(passphrase)) {
-                throw new IllegalArgumentException("passphrase not ASCII encodable");
-            }
-            mWpa3SaePassphrase = passphrase;
-            return this;
-        }
-
-        /**
-         * Set the associated enterprise configuration for this network. Needed for authenticating
-         * to WPA2 enterprise networks. See {@link WifiEnterpriseConfig} for description.
-         *
-         * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if configuration CA certificate or
-         *                                  AltSubjectMatch/DomainSuffixMatch is not set.
-         */
-        public @NonNull Builder setWpa2EnterpriseConfig(
-                @NonNull WifiEnterpriseConfig enterpriseConfig) {
-            checkNotNull(enterpriseConfig);
-            if (enterpriseConfig.isInsecure()) {
-                throw new IllegalArgumentException("Enterprise configuration is insecure");
-            }
-            mWpa2EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
-            return this;
-        }
-
-        /**
-         * Set the associated enterprise configuration for this network. Needed for authenticating
-         * to WPA3-Enterprise networks (standard and 192-bit security). See
-         * {@link WifiEnterpriseConfig} for description. For 192-bit security networks, both the
-         * client and CA certificates must be provided, and must be of type of either
-         * sha384WithRSAEncryption (OID 1.2.840.113549.1.1.12) or ecdsa-with-SHA384
-         * (OID 1.2.840.10045.4.3.3).
-         *
-         * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if configuration CA certificate or
-         *                                  AltSubjectMatch/DomainSuffixMatch is not set.
-         */
-        public @NonNull Builder setWpa3EnterpriseConfig(
-                @NonNull WifiEnterpriseConfig enterpriseConfig) {
-            checkNotNull(enterpriseConfig);
-            if (enterpriseConfig.isInsecure()) {
-                throw new IllegalArgumentException("Enterprise configuration is insecure");
-            }
-            mWpa3EnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
-            return this;
-        }
-
-        /**
-         * Set the associated Passpoint configuration for this network. Needed for authenticating
-         * to Hotspot 2.0 networks. See {@link PasspointConfiguration} for description.
-         *
-         * @param passpointConfig Instance of {@link PasspointConfiguration}.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if passpoint configuration is invalid.
-         */
-        public @NonNull Builder setPasspointConfig(
-                @NonNull PasspointConfiguration passpointConfig) {
-            checkNotNull(passpointConfig);
-            if (!passpointConfig.validate()) {
-                throw new IllegalArgumentException("Passpoint configuration is invalid");
-            }
-            mPasspointConfiguration = passpointConfig;
-            return this;
-        }
-
-        /**
-         * Set the carrier ID of the network operator. The carrier ID associates a Suggested
-         * network with a specific carrier (and therefore SIM). The carrier ID must be provided
-         * for any network which uses the SIM-based authentication: e.g. EAP-SIM, EAP-AKA,
-         * EAP-AKA', and EAP-PEAP with SIM-based phase 2 authentication.
-         * @param carrierId see {@link TelephonyManager#getSimCarrierId()}.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         *
-         * @hide
-         */
-        @SystemApi
-        @RequiresPermission(android.Manifest.permission.NETWORK_CARRIER_PROVISIONING)
-        public @NonNull Builder setCarrierId(int carrierId) {
-            mCarrierId = carrierId;
-            return this;
-        }
-
-        /**
-         * Set the ASCII WAPI passphrase for this network. Needed for authenticating to
-         * WAPI-PSK networks.
-         *
-         * @param passphrase passphrase of the network.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if the passphrase is not ASCII encodable.
-         *
-         */
-        public @NonNull Builder setWapiPassphrase(@NonNull String passphrase) {
-            checkNotNull(passphrase);
-            final CharsetEncoder asciiEncoder = StandardCharsets.US_ASCII.newEncoder();
-            if (!asciiEncoder.canEncode(passphrase)) {
-                throw new IllegalArgumentException("passphrase not ASCII encodable");
-            }
-            mWapiPskPassphrase = passphrase;
-            return this;
-        }
-
-        /**
-         * Set the associated enterprise configuration for this network. Needed for authenticating
-         * to WAPI-CERT networks. See {@link WifiEnterpriseConfig} for description.
-         *
-         * @param enterpriseConfig Instance of {@link WifiEnterpriseConfig}.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setWapiEnterpriseConfig(
-                @NonNull WifiEnterpriseConfig enterpriseConfig) {
-            checkNotNull(enterpriseConfig);
-            mWapiEnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
-            return this;
-        }
-
-        /**
-         * Specifies whether this represents a hidden network.
-         * <p>
-         * <li>If not set, defaults to false (i.e not a hidden network).</li>
-         *
-         * @param isHiddenSsid {@code true} to indicate that the network is hidden, {@code false}
-         *                     otherwise.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setIsHiddenSsid(boolean isHiddenSsid) {
-            mIsHiddenSSID = isHiddenSsid;
-            return this;
-        }
-
-        /**
-         * Specifies whether the app needs to log in to a captive portal to obtain Internet access.
-         * <p>
-         * This will dictate if the directed broadcast
-         * {@link WifiManager#ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION} will be sent to the
-         * app after successfully connecting to the network.
-         * Use this for captive portal type networks where the app needs to authenticate the user
-         * before the device can access the network.
-         * <p>
-         * <li>If not set, defaults to false (i.e no app interaction required).</li>
-         *
-         * @param isAppInteractionRequired {@code true} to indicate that app interaction is
-         *                                 required, {@code false} otherwise.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setIsAppInteractionRequired(boolean isAppInteractionRequired) {
-            mIsAppInteractionRequired = isAppInteractionRequired;
-            return this;
-        }
-
-        /**
-         * Specifies whether the user needs to log in to a captive portal to obtain Internet access.
-         * <p>
-         * <li>If not set, defaults to false (i.e no user interaction required).</li>
-         *
-         * @param isUserInteractionRequired {@code true} to indicate that user interaction is
-         *                                  required, {@code false} otherwise.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setIsUserInteractionRequired(boolean isUserInteractionRequired) {
-            mIsUserInteractionRequired = isUserInteractionRequired;
-            return this;
-        }
-
-        /**
-         * Specify the priority of this network among other network suggestions provided by the same
-         * app (priorities have no impact on suggestions by different apps). The higher the number,
-         * the higher the priority (i.e value of 0 = lowest priority).
-         * <p>
-         * <li>If not set, defaults a lower priority than any assigned priority.</li>
-         *
-         * @param priority Integer number representing the priority among suggestions by the app.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         * @throws IllegalArgumentException if the priority value is negative.
-         */
-        public @NonNull Builder setPriority(@IntRange(from = 0) int priority) {
-            if (priority < 0) {
-                throw new IllegalArgumentException("Invalid priority value " + priority);
-            }
-            mPriority = priority;
-            return this;
-        }
-
-        /**
-         * Specifies whether this network is metered.
-         * <p>
-         * <li>If not set, defaults to detect automatically.</li>
-         *
-         * @param isMetered {@code true} to indicate that the network is metered, {@code false}
-         *                  for not metered.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setIsMetered(boolean isMetered) {
-            if (isMetered) {
-                mMeteredOverride = WifiConfiguration.METERED_OVERRIDE_METERED;
-            } else {
-                mMeteredOverride = WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
-            }
-            return this;
-        }
-
-        /**
-         * Specifies whether the network credentials provided with this suggestion can be used by
-         * the user to explicitly (manually) connect to this network. If true this network will
-         * appear in the Wi-Fi Picker (in Settings) and the user will be able to select and connect
-         * to it with the provided credentials. If false, the user will need to enter network
-         * credentials and the resulting configuration will become a user saved network.
-         * <p>
-         * <li>Note: Only valid for secure (non-open) networks.
-         * <li>If not set, defaults to true (i.e. allow user to manually connect) for secure
-         * networks and false for open networks.</li>
-         *
-         * @param isShared {@code true} to indicate that the credentials may be used by the user to
-         *                              manually connect to the network, {@code false} otherwise.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setCredentialSharedWithUser(boolean isShared) {
-            mIsSharedWithUser = isShared;
-            mIsSharedWithUserSet = true;
-            return this;
-        }
-
-        /**
-         * Specifies whether the suggestion is created with auto-join enabled or disabled. The
-         * user may modify the auto-join configuration of a suggestion directly once the device
-         * associates to the network.
-         * <p>
-         * If auto-join is initialized as disabled the user may still be able to manually connect
-         * to the network. Therefore, disabling auto-join only makes sense if
-         * {@link #setCredentialSharedWithUser(boolean)} is set to true (the default) which
-         * itself implies a secure (non-open) network.
-         * <p>
-         * If not set, defaults to true (i.e. auto-join is initialized as enabled).
-         *
-         * @param enabled true for initializing with auto-join enabled (the default), false to
-         *                initializing with auto-join disabled.
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setIsInitialAutojoinEnabled(boolean enabled) {
-            mIsInitialAutojoinEnabled = enabled;
-            return this;
-        }
-
-        /**
-         * Specifies whether the system will bring up the network (if selected) as untrusted. An
-         * untrusted network has its {@link android.net.NetworkCapabilities#NET_CAPABILITY_TRUSTED}
-         * capability removed. The Wi-Fi network selection process may use this information to
-         * influence priority of the suggested network for Wi-Fi network selection (most likely to
-         * reduce it). The connectivity service may use this information to influence the overall
-         * network configuration of the device.
-         * <p>
-         * <li> An untrusted network's credentials may not be shared with the user using
-         * {@link #setCredentialSharedWithUser(boolean)}.</li>
-         * <li> If not set, defaults to false (i.e. network is trusted).</li>
-         *
-         * @param isUntrusted Boolean indicating whether the network should be brought up untrusted
-         *                    (if true) or trusted (if false).
-         * @return Instance of {@link Builder} to enable chaining of the builder method.
-         */
-        public @NonNull Builder setUntrusted(boolean isUntrusted) {
-            mIsNetworkUntrusted = isUntrusted;
-            return this;
-        }
-
-        private void setSecurityParamsInWifiConfiguration(
-                @NonNull WifiConfiguration configuration) {
-            if (!TextUtils.isEmpty(mWpa2PskPassphrase)) { // WPA-PSK network.
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK);
-                // WifiConfiguration.preSharedKey needs quotes around ASCII password.
-                configuration.preSharedKey = "\"" + mWpa2PskPassphrase + "\"";
-            } else if (!TextUtils.isEmpty(mWpa3SaePassphrase)) { // WPA3-SAE network.
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE);
-                // WifiConfiguration.preSharedKey needs quotes around ASCII password.
-                configuration.preSharedKey = "\"" + mWpa3SaePassphrase + "\"";
-            } else if (mWpa2EnterpriseConfig != null) { // WPA-EAP network
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
-                configuration.enterpriseConfig = mWpa2EnterpriseConfig;
-            } else if (mWpa3EnterpriseConfig != null) { // WPA3-Enterprise
-                if (mWpa3EnterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS
-                        && WifiEnterpriseConfig.isSuiteBCipherCert(
-                        mWpa3EnterpriseConfig.getClientCertificate())
-                        && WifiEnterpriseConfig.isSuiteBCipherCert(
-                        mWpa3EnterpriseConfig.getCaCertificate())) {
-                    // WPA3-Enterprise in 192-bit security mode (Suite-B)
-                    configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B);
-                } else {
-                    // WPA3-Enterprise
-                    configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_EAP);
-                    configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
-                    configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
-                    configuration.allowedPairwiseCiphers.set(
-                            WifiConfiguration.PairwiseCipher.GCMP_256);
-                    configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
-                    configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.GCMP_256);
-                    configuration.requirePmf = true;
-                }
-                configuration.enterpriseConfig = mWpa3EnterpriseConfig;
-            } else if (mIsEnhancedOpen) { // OWE network
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OWE);
-            } else if (!TextUtils.isEmpty(mWapiPskPassphrase)) { // WAPI-PSK network.
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_WAPI_PSK);
-                // WifiConfiguration.preSharedKey needs quotes around ASCII password.
-                configuration.preSharedKey = "\"" + mWapiPskPassphrase + "\"";
-            } else if (mWapiEnterpriseConfig != null) { // WAPI-CERT network
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_WAPI_CERT);
-                configuration.enterpriseConfig = mWapiEnterpriseConfig;
-            } else { // Open network
-                configuration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_OPEN);
-            }
-        }
-
-        /**
-         * Helper method to build WifiConfiguration object from the builder.
-         * @return Instance of {@link WifiConfiguration}.
-         */
-        private WifiConfiguration buildWifiConfiguration() {
-            final WifiConfiguration wifiConfiguration = new WifiConfiguration();
-            // WifiConfiguration.SSID needs quotes around unicode SSID.
-            wifiConfiguration.SSID = "\"" + mSsid + "\"";
-            if (mBssid != null) {
-                wifiConfiguration.BSSID = mBssid.toString();
-            }
-
-            setSecurityParamsInWifiConfiguration(wifiConfiguration);
-
-            wifiConfiguration.hiddenSSID = mIsHiddenSSID;
-            wifiConfiguration.priority = mPriority;
-            wifiConfiguration.meteredOverride = mMeteredOverride;
-            wifiConfiguration.carrierId = mCarrierId;
-            wifiConfiguration.trusted = !mIsNetworkUntrusted;
-            return wifiConfiguration;
-        }
-
-        private void validateSecurityParams() {
-            int numSecurityTypes = 0;
-            numSecurityTypes += mIsEnhancedOpen ? 1 : 0;
-            numSecurityTypes += !TextUtils.isEmpty(mWpa2PskPassphrase) ? 1 : 0;
-            numSecurityTypes += !TextUtils.isEmpty(mWpa3SaePassphrase) ? 1 : 0;
-            numSecurityTypes += !TextUtils.isEmpty(mWapiPskPassphrase) ? 1 : 0;
-            numSecurityTypes += mWpa2EnterpriseConfig != null ? 1 : 0;
-            numSecurityTypes += mWpa3EnterpriseConfig != null ? 1 : 0;
-            numSecurityTypes += mWapiEnterpriseConfig != null ? 1 : 0;
-            numSecurityTypes += mPasspointConfiguration != null ? 1 : 0;
-            if (numSecurityTypes > 1) {
-                throw new IllegalStateException("only one of setIsEnhancedOpen, setWpa2Passphrase,"
-                        + " setWpa3Passphrase, setWpa2EnterpriseConfig, setWpa3EnterpriseConfig"
-                        + " setWapiPassphrase, setWapiCertSuite, setIsWapiCertSuiteAuto"
-                        + " or setPasspointConfig can be invoked for network suggestion");
-            }
-        }
-
-        private WifiConfiguration buildWifiConfigurationForPasspoint() {
-            WifiConfiguration wifiConfiguration = new WifiConfiguration();
-            wifiConfiguration.FQDN = mPasspointConfiguration.getHomeSp().getFqdn();
-            wifiConfiguration.setPasspointUniqueId(mPasspointConfiguration.getUniqueId());
-            wifiConfiguration.priority = mPriority;
-            wifiConfiguration.meteredOverride = mMeteredOverride;
-            wifiConfiguration.trusted = !mIsNetworkUntrusted;
-            mPasspointConfiguration.setCarrierId(mCarrierId);
-            mPasspointConfiguration.setMeteredOverride(wifiConfiguration.meteredOverride);
-            return wifiConfiguration;
-        }
-
-        /**
-         * Create a network suggestion object for use in
-         * {@link WifiManager#addNetworkSuggestions(List)}.
-         *
-         *<p class="note">
-         * <b>Note:</b> Apps can set a combination of SSID using {@link #setSsid(String)} and BSSID
-         * using {@link #setBssid(MacAddress)} to provide more fine grained network suggestions to
-         * the platform.
-         * </p>
-         *
-         * For example:
-         * To provide credentials for one open, one WPA2, one WPA3 network with their
-         * corresponding SSID's and one with Passpoint config:
-         *
-         * <pre>{@code
-         * final WifiNetworkSuggestion suggestion1 =
-         *      new Builder()
-         *      .setSsid("test111111")
-         *      .build();
-         * final WifiNetworkSuggestion suggestion2 =
-         *      new Builder()
-         *      .setSsid("test222222")
-         *      .setWpa2Passphrase("test123456")
-         *      .build();
-         * final WifiNetworkSuggestion suggestion3 =
-         *      new Builder()
-         *      .setSsid("test333333")
-         *      .setWpa3Passphrase("test6789")
-         *      .build();
-         * final PasspointConfiguration passpointConfig= new PasspointConfiguration();
-         * // configure passpointConfig to include a valid Passpoint configuration
-         * final WifiNetworkSuggestion suggestion4 =
-         *      new Builder()
-         *      .setPasspointConfig(passpointConfig)
-         *      .build();
-         * final List<WifiNetworkSuggestion> suggestionsList =
-         *      new ArrayList<WifiNetworkSuggestion> { {
-         *          add(suggestion1);
-         *          add(suggestion2);
-         *          add(suggestion3);
-         *          add(suggestion4);
-         *      } };
-         * final WifiManager wifiManager =
-         *      context.getSystemService(Context.WIFI_SERVICE);
-         * wifiManager.addNetworkSuggestions(suggestionsList);
-         * // ...
-         * }</pre>
-         *
-         * @return Instance of {@link WifiNetworkSuggestion}
-         * @throws IllegalStateException on invalid params set
-         * @see WifiNetworkSuggestion
-         */
-        public @NonNull WifiNetworkSuggestion build() {
-            validateSecurityParams();
-            WifiConfiguration wifiConfiguration;
-            if (mPasspointConfiguration != null) {
-                if (mSsid != null) {
-                    throw new IllegalStateException("setSsid should not be invoked for suggestion "
-                            + "with Passpoint configuration");
-                }
-                if (mIsHiddenSSID) {
-                    throw new IllegalStateException("setIsHiddenSsid should not be invoked for "
-                            + "suggestion with Passpoint configuration");
-                }
-                wifiConfiguration = buildWifiConfigurationForPasspoint();
-            } else {
-                if (mSsid == null) {
-                    throw new IllegalStateException("setSsid should be invoked for suggestion");
-                }
-                if (TextUtils.isEmpty(mSsid)) {
-                    throw new IllegalStateException("invalid ssid for suggestion");
-                }
-                if (mBssid != null
-                        && (mBssid.equals(MacAddress.BROADCAST_ADDRESS)
-                        || mBssid.equals(WifiManager.ALL_ZEROS_MAC_ADDRESS))) {
-                    throw new IllegalStateException("invalid bssid for suggestion");
-                }
-                wifiConfiguration = buildWifiConfiguration();
-                if (wifiConfiguration.isOpenNetwork()) {
-                    if (mIsSharedWithUserSet && mIsSharedWithUser) {
-                        throw new IllegalStateException("Open network should not be "
-                                + "setCredentialSharedWithUser to true");
-                    }
-                    mIsSharedWithUser = false;
-                }
-            }
-            if (!mIsSharedWithUser && !mIsInitialAutojoinEnabled) {
-                throw new IllegalStateException("Should have not a network with both "
-                        + "setCredentialSharedWithUser and "
-                        + "setIsAutojoinEnabled set to false");
-            }
-            if (mIsNetworkUntrusted) {
-                if (mIsSharedWithUserSet && mIsSharedWithUser) {
-                    throw new IllegalStateException("Should not be both"
-                            + "setCredentialSharedWithUser and +"
-                            + "setIsNetworkAsUntrusted to true");
-                }
-                mIsSharedWithUser = false;
-            }
-            return new WifiNetworkSuggestion(
-                    wifiConfiguration,
-                    mPasspointConfiguration,
-                    mIsAppInteractionRequired,
-                    mIsUserInteractionRequired,
-                    mIsSharedWithUser,
-                    mIsInitialAutojoinEnabled);
-        }
-    }
-
-    /**
-     * Network configuration for the provided network.
-     * @hide
-     */
-    @NonNull
-    public final WifiConfiguration wifiConfiguration;
-
-    /**
-     * Passpoint configuration for the provided network.
-     * @hide
-     */
-    @Nullable
-    public final PasspointConfiguration passpointConfiguration;
-
-    /**
-     * Whether app needs to log in to captive portal to obtain Internet access.
-     * @hide
-     */
-    public final boolean isAppInteractionRequired;
-
-    /**
-     * Whether user needs to log in to captive portal to obtain Internet access.
-     * @hide
-     */
-    public final boolean isUserInteractionRequired;
-
-    /**
-     * Whether app share credential with the user, allow user use provided credential to
-     * connect network manually.
-     * @hide
-     */
-    public final boolean isUserAllowedToManuallyConnect;
-
-    /**
-     * Whether the suggestion will be initialized as auto-joined or not.
-     * @hide
-     */
-    public final boolean isInitialAutoJoinEnabled;
-
-    /** @hide */
-    public WifiNetworkSuggestion() {
-        this.wifiConfiguration = new WifiConfiguration();
-        this.passpointConfiguration = null;
-        this.isAppInteractionRequired = false;
-        this.isUserInteractionRequired = false;
-        this.isUserAllowedToManuallyConnect = true;
-        this.isInitialAutoJoinEnabled = true;
-    }
-
-    /** @hide */
-    public WifiNetworkSuggestion(@NonNull WifiConfiguration networkConfiguration,
-                                 @Nullable PasspointConfiguration passpointConfiguration,
-                                 boolean isAppInteractionRequired,
-                                 boolean isUserInteractionRequired,
-                                 boolean isUserAllowedToManuallyConnect,
-                                 boolean isInitialAutoJoinEnabled) {
-        checkNotNull(networkConfiguration);
-        this.wifiConfiguration = networkConfiguration;
-        this.passpointConfiguration = passpointConfiguration;
-
-        this.isAppInteractionRequired = isAppInteractionRequired;
-        this.isUserInteractionRequired = isUserInteractionRequired;
-        this.isUserAllowedToManuallyConnect = isUserAllowedToManuallyConnect;
-        this.isInitialAutoJoinEnabled = isInitialAutoJoinEnabled;
-    }
-
-    public static final @NonNull Creator<WifiNetworkSuggestion> CREATOR =
-            new Creator<WifiNetworkSuggestion>() {
-                @Override
-                public WifiNetworkSuggestion createFromParcel(Parcel in) {
-                    return new WifiNetworkSuggestion(
-                            in.readParcelable(null), // wifiConfiguration
-                            in.readParcelable(null), // PasspointConfiguration
-                            in.readBoolean(), // isAppInteractionRequired
-                            in.readBoolean(), // isUserInteractionRequired
-                            in.readBoolean(), // isSharedCredentialWithUser
-                            in.readBoolean()  // isAutojoinEnabled
-                    );
-                }
-
-                @Override
-                public WifiNetworkSuggestion[] newArray(int size) {
-                    return new WifiNetworkSuggestion[size];
-                }
-            };
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeParcelable(wifiConfiguration, flags);
-        dest.writeParcelable(passpointConfiguration, flags);
-        dest.writeBoolean(isAppInteractionRequired);
-        dest.writeBoolean(isUserInteractionRequired);
-        dest.writeBoolean(isUserAllowedToManuallyConnect);
-        dest.writeBoolean(isInitialAutoJoinEnabled);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(wifiConfiguration.SSID, wifiConfiguration.BSSID,
-                wifiConfiguration.allowedKeyManagement, wifiConfiguration.getKey());
-    }
-
-    /**
-     * Equals for network suggestions.
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof WifiNetworkSuggestion)) {
-            return false;
-        }
-        WifiNetworkSuggestion lhs = (WifiNetworkSuggestion) obj;
-        if (this.passpointConfiguration == null ^ lhs.passpointConfiguration == null) {
-            return false;
-        }
-
-        return TextUtils.equals(this.wifiConfiguration.SSID, lhs.wifiConfiguration.SSID)
-                && TextUtils.equals(this.wifiConfiguration.BSSID, lhs.wifiConfiguration.BSSID)
-                && Objects.equals(this.wifiConfiguration.allowedKeyManagement,
-                lhs.wifiConfiguration.allowedKeyManagement)
-                && TextUtils.equals(this.wifiConfiguration.getKey(),
-                lhs.wifiConfiguration.getKey());
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder("WifiNetworkSuggestion[ ")
-                .append("SSID=").append(wifiConfiguration.SSID)
-                .append(", BSSID=").append(wifiConfiguration.BSSID)
-                .append(", FQDN=").append(wifiConfiguration.FQDN)
-                .append(", isAppInteractionRequired=").append(isAppInteractionRequired)
-                .append(", isUserInteractionRequired=").append(isUserInteractionRequired)
-                .append(", isCredentialSharedWithUser=").append(isUserAllowedToManuallyConnect)
-                .append(", isInitialAutoJoinEnabled=").append(isInitialAutoJoinEnabled)
-                .append(", isUnTrusted=").append(!wifiConfiguration.trusted)
-                .append(" ]");
-        return sb.toString();
-    }
-
-    /**
-     * Get the {@link WifiConfiguration} associated with this Suggestion.
-     * @hide
-     */
-    @SystemApi
-    @NonNull
-    public WifiConfiguration getWifiConfiguration() {
-        return wifiConfiguration;
-    }
-
-    /**
-     * Get the BSSID, or null if unset.
-     * @see Builder#setBssid(MacAddress)
-     */
-    @Nullable
-    public MacAddress getBssid() {
-        if (wifiConfiguration.BSSID == null) {
-            return null;
-        }
-        return MacAddress.fromString(wifiConfiguration.BSSID);
-    }
-
-    /** @see Builder#setCredentialSharedWithUser(boolean) */
-    public boolean isCredentialSharedWithUser() {
-        return isUserAllowedToManuallyConnect;
-    }
-
-    /** @see Builder#setIsAppInteractionRequired(boolean) */
-    public boolean isAppInteractionRequired() {
-        return isAppInteractionRequired;
-    }
-
-    /** @see Builder#setIsEnhancedOpen(boolean)  */
-    public boolean isEnhancedOpen() {
-        return wifiConfiguration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.OWE);
-    }
-
-    /** @see Builder#setIsHiddenSsid(boolean)  */
-    public boolean isHiddenSsid() {
-        return wifiConfiguration.hiddenSSID;
-    }
-
-    /** @see Builder#setIsInitialAutojoinEnabled(boolean)  */
-    public boolean isInitialAutojoinEnabled() {
-        return isInitialAutoJoinEnabled;
-    }
-
-    /** @see Builder#setIsMetered(boolean)  */
-    public boolean isMetered() {
-        return wifiConfiguration.meteredOverride == WifiConfiguration.METERED_OVERRIDE_METERED;
-    }
-
-    /** @see Builder#setIsUserInteractionRequired(boolean)  */
-    public boolean isUserInteractionRequired() {
-        return isUserInteractionRequired;
-    }
-
-    /**
-     * Get the {@link PasspointConfiguration} associated with this Suggestion, or null if this
-     * Suggestion is not for a Passpoint network.
-     */
-    @Nullable
-    public PasspointConfiguration getPasspointConfig() {
-        return passpointConfiguration;
-    }
-
-    /** @see Builder#setPriority(int)  */
-    @IntRange(from = 0)
-    public int getPriority() {
-        return wifiConfiguration.priority;
-    }
-
-    /**
-     * Return the SSID of the network, or null if this is a Passpoint network.
-     * @see Builder#setSsid(String)
-     */
-    @Nullable
-    public String getSsid() {
-        if (wifiConfiguration.SSID == null) {
-            return null;
-        }
-        return WifiInfo.sanitizeSsid(wifiConfiguration.SSID);
-    }
-
-    /** @see Builder#setUntrusted(boolean)  */
-    public boolean isUntrusted() {
-        return !wifiConfiguration.trusted;
-    }
-
-    /**
-     * Get the WifiEnterpriseConfig, or null if unset.
-     * @see Builder#setWapiEnterpriseConfig(WifiEnterpriseConfig)
-     * @see Builder#setWpa2EnterpriseConfig(WifiEnterpriseConfig)
-     * @see Builder#setWpa3EnterpriseConfig(WifiEnterpriseConfig)
-     */
-    @Nullable
-    public WifiEnterpriseConfig getEnterpriseConfig() {
-        if (!wifiConfiguration.isEnterprise()) {
-            return null;
-        }
-        return wifiConfiguration.enterpriseConfig;
-    }
-
-    /**
-     * Get the passphrase, or null if unset.
-     * @see Builder#setWapiPassphrase(String)
-     * @see Builder#setWpa2Passphrase(String)
-     * @see Builder#setWpa3Passphrase(String)
-     */
-    @Nullable
-    public String getPassphrase() {
-        if (wifiConfiguration.preSharedKey == null) {
-            return null;
-        }
-        return WifiInfo.removeDoubleQuotes(wifiConfiguration.preSharedKey);
-    }
-}
diff --git a/wifi/java/android/net/wifi/WifiScanner.java b/wifi/java/android/net/wifi/WifiScanner.java
deleted file mode 100644
index 4163c88..0000000
--- a/wifi/java/android/net/wifi/WifiScanner.java
+++ /dev/null
@@ -1,1676 +0,0 @@
-/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.Manifest;
-import android.annotation.CallbackExecutor;
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.RequiresPermission;
-import android.annotation.SuppressLint;
-import android.annotation.SystemApi;
-import android.annotation.SystemService;
-import android.content.Context;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.RemoteException;
-import android.os.WorkSource;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.SparseArray;
-
-import com.android.internal.util.AsyncChannel;
-import com.android.internal.util.Protocol;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.Executor;
-
-/**
- * This class provides a way to scan the Wifi universe around the device
- * @hide
- */
-@SystemApi
-@SystemService(Context.WIFI_SCANNING_SERVICE)
-public class WifiScanner {
-
-    /** @hide */
-    public static final int WIFI_BAND_INDEX_24_GHZ = 0;
-    /** @hide */
-    public static final int WIFI_BAND_INDEX_5_GHZ = 1;
-    /** @hide */
-    public static final int WIFI_BAND_INDEX_5_GHZ_DFS_ONLY = 2;
-    /** @hide */
-    public static final int WIFI_BAND_INDEX_6_GHZ = 3;
-    /** @hide */
-    public static final int WIFI_BAND_COUNT = 4;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"WIFI_BAND_INDEX_"}, value = {
-            WIFI_BAND_INDEX_24_GHZ,
-            WIFI_BAND_INDEX_5_GHZ,
-            WIFI_BAND_INDEX_5_GHZ_DFS_ONLY,
-            WIFI_BAND_INDEX_6_GHZ})
-    public @interface WifiBandIndex {}
-
-    /** no band specified; use channel list instead */
-    public static final int WIFI_BAND_UNSPECIFIED = 0;
-    /** 2.4 GHz band */
-    public static final int WIFI_BAND_24_GHZ = 1 << WIFI_BAND_INDEX_24_GHZ;
-    /** 5 GHz band excluding DFS channels */
-    public static final int WIFI_BAND_5_GHZ = 1 << WIFI_BAND_INDEX_5_GHZ;
-    /** DFS channels from 5 GHz band only */
-    public static final int WIFI_BAND_5_GHZ_DFS_ONLY  = 1 << WIFI_BAND_INDEX_5_GHZ_DFS_ONLY;
-    /** 6 GHz band */
-    public static final int WIFI_BAND_6_GHZ = 1 << WIFI_BAND_INDEX_6_GHZ;
-
-    /**
-     * Combination of bands
-     * Note that those are only the common band combinations,
-     * other combinations can be created by combining any of the basic bands above
-     */
-    /** Both 2.4 GHz band and 5 GHz band; no DFS channels */
-    public static final int WIFI_BAND_BOTH = WIFI_BAND_24_GHZ | WIFI_BAND_5_GHZ;
-    /**
-     * 2.4Ghz band + DFS channels from 5 GHz band only
-     * @hide
-     */
-    public static final int WIFI_BAND_24_GHZ_WITH_5GHZ_DFS  =
-            WIFI_BAND_24_GHZ | WIFI_BAND_5_GHZ_DFS_ONLY;
-    /** 5 GHz band including DFS channels */
-    public static final int WIFI_BAND_5_GHZ_WITH_DFS  = WIFI_BAND_5_GHZ | WIFI_BAND_5_GHZ_DFS_ONLY;
-    /** Both 2.4 GHz band and 5 GHz band; with DFS channels */
-    public static final int WIFI_BAND_BOTH_WITH_DFS =
-            WIFI_BAND_24_GHZ | WIFI_BAND_5_GHZ | WIFI_BAND_5_GHZ_DFS_ONLY;
-    /** 2.4 GHz band and 5 GHz band (no DFS channels) and 6 GHz */
-    public static final int WIFI_BAND_24_5_6_GHZ = WIFI_BAND_BOTH | WIFI_BAND_6_GHZ;
-    /** 2.4 GHz band and 5 GHz band; with DFS channels and 6 GHz */
-    public static final int WIFI_BAND_24_5_WITH_DFS_6_GHZ =
-            WIFI_BAND_BOTH_WITH_DFS | WIFI_BAND_6_GHZ;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"WIFI_BAND_"}, value = {
-            WIFI_BAND_UNSPECIFIED,
-            WIFI_BAND_24_GHZ,
-            WIFI_BAND_5_GHZ,
-            WIFI_BAND_BOTH,
-            WIFI_BAND_5_GHZ_DFS_ONLY,
-            WIFI_BAND_24_GHZ_WITH_5GHZ_DFS,
-            WIFI_BAND_5_GHZ_WITH_DFS,
-            WIFI_BAND_BOTH_WITH_DFS,
-            WIFI_BAND_6_GHZ,
-            WIFI_BAND_24_5_6_GHZ,
-            WIFI_BAND_24_5_WITH_DFS_6_GHZ})
-    public @interface WifiBand {}
-
-    /**
-     * All bands
-     * @hide
-     */
-    public static final int WIFI_BAND_ALL = (1 << WIFI_BAND_COUNT) - 1;
-
-    /** Minimum supported scanning period */
-    public static final int MIN_SCAN_PERIOD_MS = 1000;
-    /** Maximum supported scanning period */
-    public static final int MAX_SCAN_PERIOD_MS = 1024000;
-
-    /** No Error */
-    public static final int REASON_SUCCEEDED = 0;
-    /** Unknown error */
-    public static final int REASON_UNSPECIFIED = -1;
-    /** Invalid listener */
-    public static final int REASON_INVALID_LISTENER = -2;
-    /** Invalid request */
-    public static final int REASON_INVALID_REQUEST = -3;
-    /** Invalid request */
-    public static final int REASON_NOT_AUTHORIZED = -4;
-    /** An outstanding request with the same listener hasn't finished yet. */
-    public static final int REASON_DUPLICATE_REQEUST = -5;
-
-    /** @hide */
-    public static final String GET_AVAILABLE_CHANNELS_EXTRA = "Channels";
-
-    /**
-     * Generic action callback invocation interface
-     *  @hide
-     */
-    @SystemApi
-    public static interface ActionListener {
-        public void onSuccess();
-        public void onFailure(int reason, String description);
-    }
-
-    /**
-     * Test if scan is a full scan. i.e. scanning all available bands.
-     * For backward compatibility, since some apps don't include 6GHz in their requests yet,
-     * lacking 6GHz band does not cause the result to be false.
-     *
-     * @param bandScanned bands that are fully scanned
-     * @param excludeDfs when true, DFS band is excluded from the check
-     * @return true if all bands are scanned, false otherwise
-     *
-     * @hide
-     */
-    public static boolean isFullBandScan(@WifiBand int bandScanned, boolean excludeDfs) {
-        return (bandScanned | WIFI_BAND_6_GHZ | (excludeDfs ? WIFI_BAND_5_GHZ_DFS_ONLY : 0))
-                == WIFI_BAND_ALL;
-    }
-
-    /**
-     * Returns a list of all the possible channels for the given band(s).
-     *
-     * @param band one of the WifiScanner#WIFI_BAND_* constants, e.g. {@link #WIFI_BAND_24_GHZ}
-     * @return a list of all the frequencies, in MHz, for the given band(s) e.g. channel 1 is
-     * 2412, or null if an error occurred.
-     *
-     * @hide
-     */
-    @SystemApi
-    @NonNull
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public List<Integer> getAvailableChannels(int band) {
-        try {
-            Bundle bundle = mService.getAvailableChannels(band, mContext.getOpPackageName(),
-                    mContext.getAttributionTag());
-            List<Integer> channels = bundle.getIntegerArrayList(GET_AVAILABLE_CHANNELS_EXTRA);
-            return channels == null ? new ArrayList<>() : channels;
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * provides channel specification for scanning
-     */
-    public static class ChannelSpec {
-        /**
-         * channel frequency in MHz; for example channel 1 is specified as 2412
-         */
-        public int frequency;
-        /**
-         * if true, scan this channel in passive fashion.
-         * This flag is ignored on DFS channel specification.
-         * @hide
-         */
-        public boolean passive;                                    /* ignored on DFS channels */
-        /**
-         * how long to dwell on this channel
-         * @hide
-         */
-        public int dwellTimeMS;                                    /* not supported for now */
-
-        /**
-         * default constructor for channel spec
-         */
-        public ChannelSpec(int frequency) {
-            this.frequency = frequency;
-            passive = false;
-            dwellTimeMS = 0;
-        }
-    }
-
-    /**
-     * reports {@link ScanListener#onResults} when underlying buffers are full
-     * this is simply the lack of the {@link #REPORT_EVENT_AFTER_EACH_SCAN} flag
-     * @deprecated It is not supported anymore.
-     */
-    @Deprecated
-    public static final int REPORT_EVENT_AFTER_BUFFER_FULL = 0;
-    /**
-     * reports {@link ScanListener#onResults} after each scan
-     */
-    public static final int REPORT_EVENT_AFTER_EACH_SCAN = (1 << 0);
-    /**
-     * reports {@link ScanListener#onFullResult} whenever each beacon is discovered
-     */
-    public static final int REPORT_EVENT_FULL_SCAN_RESULT = (1 << 1);
-    /**
-     * Do not place scans in the chip's scan history buffer
-     */
-    public static final int REPORT_EVENT_NO_BATCH = (1 << 2);
-
-    /**
-     * Optimize the scan for lower latency.
-     * @see ScanSettings#type
-     */
-    public static final int SCAN_TYPE_LOW_LATENCY = 0;
-    /**
-     * Optimize the scan for lower power usage.
-     * @see ScanSettings#type
-     */
-    public static final int SCAN_TYPE_LOW_POWER = 1;
-    /**
-     * Optimize the scan for higher accuracy.
-     * @see ScanSettings#type
-     */
-    public static final int SCAN_TYPE_HIGH_ACCURACY = 2;
-
-    /** {@hide} */
-    public static final String SCAN_PARAMS_SCAN_SETTINGS_KEY = "ScanSettings";
-    /** {@hide} */
-    public static final String SCAN_PARAMS_WORK_SOURCE_KEY = "WorkSource";
-    /** {@hide} */
-    public static final String REQUEST_PACKAGE_NAME_KEY = "PackageName";
-    /** {@hide} */
-    public static final String REQUEST_FEATURE_ID_KEY = "FeatureId";
-
-    /**
-     * scan configuration parameters to be sent to {@link #startBackgroundScan}
-     */
-    public static class ScanSettings implements Parcelable {
-        /** Hidden network to be scanned for. */
-        public static class HiddenNetwork {
-            /** SSID of the network */
-            @NonNull
-            public final String ssid;
-
-            /** Default constructor for HiddenNetwork. */
-            public HiddenNetwork(@NonNull String ssid) {
-                this.ssid = ssid;
-            }
-        }
-
-        /** one of the WIFI_BAND values */
-        public int band;
-        /** list of channels; used when band is set to WIFI_BAND_UNSPECIFIED */
-        public ChannelSpec[] channels;
-        /**
-         * List of hidden networks to scan for. Explicit probe requests are sent out for such
-         * networks during scan. Only valid for single scan requests.
-         */
-        @NonNull
-        @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
-        public final List<HiddenNetwork> hiddenNetworks = new ArrayList<>();
-        /**
-         * period of background scan; in millisecond, 0 => single shot scan
-         * @deprecated Background scan support has always been hardware vendor dependent. This
-         * support may not be present on newer devices. Use {@link #startScan(ScanSettings,
-         * ScanListener)} instead for single scans.
-         */
-        @Deprecated
-        public int periodInMs;
-        /**
-         * must have a valid REPORT_EVENT value
-         * @deprecated Background scan support has always been hardware vendor dependent. This
-         * support may not be present on newer devices. Use {@link #startScan(ScanSettings,
-         * ScanListener)} instead for single scans.
-         */
-        @Deprecated
-        public int reportEvents;
-        /**
-         * defines number of bssids to cache from each scan
-         * @deprecated Background scan support has always been hardware vendor dependent. This
-         * support may not be present on newer devices. Use {@link #startScan(ScanSettings,
-         * ScanListener)} instead for single scans.
-         */
-        @Deprecated
-        public int numBssidsPerScan;
-        /**
-         * defines number of scans to cache; use it with REPORT_EVENT_AFTER_BUFFER_FULL
-         * to wake up at fixed interval
-         * @deprecated Background scan support has always been hardware vendor dependent. This
-         * support may not be present on newer devices. Use {@link #startScan(ScanSettings,
-         * ScanListener)} instead for single scans.
-         */
-        @Deprecated
-        public int maxScansToCache;
-        /**
-         * if maxPeriodInMs is non zero or different than period, then this bucket is
-         * a truncated binary exponential backoff bucket and the scan period will grow
-         * exponentially as per formula: actual_period(N) = period * (2 ^ (N/stepCount))
-         * to maxPeriodInMs
-         * @deprecated Background scan support has always been hardware vendor dependent. This
-         * support may not be present on newer devices. Use {@link #startScan(ScanSettings,
-         * ScanListener)} instead for single scans.
-         */
-        @Deprecated
-        public int maxPeriodInMs;
-        /**
-         * for truncated binary exponential back off bucket, number of scans to perform
-         * for a given period
-         * @deprecated Background scan support has always been hardware vendor dependent. This
-         * support may not be present on newer devices. Use {@link #startScan(ScanSettings,
-         * ScanListener)} instead for single scans.
-         */
-        @Deprecated
-        public int stepCount;
-        /**
-         * Flag to indicate if the scan settings are targeted for PNO scan.
-         * {@hide}
-         */
-        public boolean isPnoScan;
-        /**
-         * Indicate the type of scan to be performed by the wifi chip.
-         *
-         * On devices with multiple hardware radio chains (and hence different modes of scan),
-         * this type serves as an indication to the hardware on what mode of scan to perform.
-         * Only apps holding {@link android.Manifest.permission.NETWORK_STACK} permission can set
-         * this value.
-         *
-         * Note: This serves as an intent and not as a stipulation, the wifi chip
-         * might honor or ignore the indication based on the current radio conditions. Always
-         * use the {@link ScanResult#radioChainInfos} to figure out the radio chain configuration
-         * used to receive the corresponding scan result.
-         *
-         * One of {@link #SCAN_TYPE_LOW_LATENCY}, {@link #SCAN_TYPE_LOW_POWER},
-         * {@link #SCAN_TYPE_HIGH_ACCURACY}.
-         * Default value: {@link #SCAN_TYPE_LOW_LATENCY}.
-         */
-        @WifiAnnotations.ScanType
-        @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
-        public int type = SCAN_TYPE_LOW_LATENCY;
-        /**
-         * This scan request may ignore location settings while receiving scans. This should only
-         * be used in emergency situations.
-         * {@hide}
-         */
-        @SystemApi
-        public boolean ignoreLocationSettings;
-        /**
-         * This scan request will be hidden from app-ops noting for location information. This
-         * should only be used by FLP/NLP module on the device which is using the scan results to
-         * compute results for behalf on their clients. FLP/NLP module using this flag should ensure
-         * that they note in app-ops the eventual delivery of location information computed using
-         * these results to their client .
-         * {@hide}
-         */
-        @SystemApi
-        public boolean hideFromAppOps;
-
-        /** Implement the Parcelable interface {@hide} */
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeInt(band);
-            dest.writeInt(periodInMs);
-            dest.writeInt(reportEvents);
-            dest.writeInt(numBssidsPerScan);
-            dest.writeInt(maxScansToCache);
-            dest.writeInt(maxPeriodInMs);
-            dest.writeInt(stepCount);
-            dest.writeInt(isPnoScan ? 1 : 0);
-            dest.writeInt(type);
-            dest.writeInt(ignoreLocationSettings ? 1 : 0);
-            dest.writeInt(hideFromAppOps ? 1 : 0);
-            if (channels != null) {
-                dest.writeInt(channels.length);
-                for (int i = 0; i < channels.length; i++) {
-                    dest.writeInt(channels[i].frequency);
-                    dest.writeInt(channels[i].dwellTimeMS);
-                    dest.writeInt(channels[i].passive ? 1 : 0);
-                }
-            } else {
-                dest.writeInt(0);
-            }
-            dest.writeInt(hiddenNetworks.size());
-            for (HiddenNetwork hiddenNetwork : hiddenNetworks) {
-                dest.writeString(hiddenNetwork.ssid);
-            }
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @NonNull Creator<ScanSettings> CREATOR =
-                new Creator<ScanSettings>() {
-                    public ScanSettings createFromParcel(Parcel in) {
-                        ScanSettings settings = new ScanSettings();
-                        settings.band = in.readInt();
-                        settings.periodInMs = in.readInt();
-                        settings.reportEvents = in.readInt();
-                        settings.numBssidsPerScan = in.readInt();
-                        settings.maxScansToCache = in.readInt();
-                        settings.maxPeriodInMs = in.readInt();
-                        settings.stepCount = in.readInt();
-                        settings.isPnoScan = in.readInt() == 1;
-                        settings.type = in.readInt();
-                        settings.ignoreLocationSettings = in.readInt() == 1;
-                        settings.hideFromAppOps = in.readInt() == 1;
-                        int num_channels = in.readInt();
-                        settings.channels = new ChannelSpec[num_channels];
-                        for (int i = 0; i < num_channels; i++) {
-                            int frequency = in.readInt();
-                            ChannelSpec spec = new ChannelSpec(frequency);
-                            spec.dwellTimeMS = in.readInt();
-                            spec.passive = in.readInt() == 1;
-                            settings.channels[i] = spec;
-                        }
-                        int numNetworks = in.readInt();
-                        settings.hiddenNetworks.clear();
-                        for (int i = 0; i < numNetworks; i++) {
-                            String ssid = in.readString();
-                            settings.hiddenNetworks.add(new HiddenNetwork(ssid));
-                        }
-                        return settings;
-                    }
-
-                    public ScanSettings[] newArray(int size) {
-                        return new ScanSettings[size];
-                    }
-                };
-    }
-
-    /**
-     * all the information garnered from a single scan
-     */
-    public static class ScanData implements Parcelable {
-        /** scan identifier */
-        private int mId;
-        /** additional information about scan
-         * 0 => no special issues encountered in the scan
-         * non-zero => scan was truncated, so results may not be complete
-         */
-        private int mFlags;
-        /**
-         * Indicates the buckets that were scanned to generate these results.
-         * This is not relevant to WifiScanner API users and is used internally.
-         * {@hide}
-         */
-        private int mBucketsScanned;
-        /**
-         * 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 int mBandScanned;
-        /** all scan results discovered in this scan, sorted by timestamp in ascending order */
-        private final List<ScanResult> mResults;
-
-        ScanData() {
-            mResults = new ArrayList<>();
-        }
-
-        public ScanData(int id, int flags, ScanResult[] results) {
-            mId = id;
-            mFlags = flags;
-            mResults = new ArrayList<>(Arrays.asList(results));
-        }
-
-        /** {@hide} */
-        public ScanData(int id, int flags, int bucketsScanned, int bandScanned,
-                        ScanResult[] results) {
-            this(id, flags, bucketsScanned, bandScanned, new ArrayList<>(Arrays.asList(results)));
-        }
-
-        /** {@hide} */
-        public ScanData(int id, int flags, int bucketsScanned, int bandScanned,
-                        List<ScanResult> results) {
-            mId = id;
-            mFlags = flags;
-            mBucketsScanned = bucketsScanned;
-            mBandScanned = bandScanned;
-            mResults = results;
-        }
-
-        public ScanData(ScanData s) {
-            mId = s.mId;
-            mFlags = s.mFlags;
-            mBucketsScanned = s.mBucketsScanned;
-            mBandScanned = s.mBandScanned;
-            mResults = new ArrayList<>();
-            for (ScanResult scanResult : s.mResults) {
-                mResults.add(new ScanResult(scanResult));
-            }
-        }
-
-        public int getId() {
-            return mId;
-        }
-
-        public int getFlags() {
-            return mFlags;
-        }
-
-        /** {@hide} */
-        public int getBucketsScanned() {
-            return mBucketsScanned;
-        }
-
-        /** {@hide} */
-        public int getBandScanned() {
-            return mBandScanned;
-        }
-
-        public ScanResult[] getResults() {
-            return mResults.toArray(new ScanResult[0]);
-        }
-
-        /** {@hide} */
-        public void addResults(@NonNull ScanResult[] newResults) {
-            for (ScanResult result : newResults) {
-                mResults.add(new ScanResult(result));
-            }
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeInt(mId);
-            dest.writeInt(mFlags);
-            dest.writeInt(mBucketsScanned);
-            dest.writeInt(mBandScanned);
-            dest.writeParcelableList(mResults, 0);
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @NonNull Creator<ScanData> CREATOR =
-                new Creator<ScanData>() {
-                    public ScanData createFromParcel(Parcel in) {
-                        int id = in.readInt();
-                        int flags = in.readInt();
-                        int bucketsScanned = in.readInt();
-                        int bandScanned = in.readInt();
-                        List<ScanResult> results = new ArrayList<>();
-                        in.readParcelableList(results, ScanResult.class.getClassLoader());
-                        return new ScanData(id, flags, bucketsScanned, bandScanned, results);
-                    }
-
-                    public ScanData[] newArray(int size) {
-                        return new ScanData[size];
-                    }
-                };
-    }
-
-    public static class ParcelableScanData implements Parcelable {
-
-        public ScanData mResults[];
-
-        public ParcelableScanData(ScanData[] results) {
-            mResults = results;
-        }
-
-        public ScanData[] getResults() {
-            return mResults;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public void writeToParcel(Parcel dest, int flags) {
-            if (mResults != null) {
-                dest.writeInt(mResults.length);
-                for (int i = 0; i < mResults.length; i++) {
-                    ScanData result = mResults[i];
-                    result.writeToParcel(dest, flags);
-                }
-            } else {
-                dest.writeInt(0);
-            }
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @NonNull Creator<ParcelableScanData> CREATOR =
-                new Creator<ParcelableScanData>() {
-                    public ParcelableScanData createFromParcel(Parcel in) {
-                        int n = in.readInt();
-                        ScanData results[] = new ScanData[n];
-                        for (int i = 0; i < n; i++) {
-                            results[i] = ScanData.CREATOR.createFromParcel(in);
-                        }
-                        return new ParcelableScanData(results);
-                    }
-
-                    public ParcelableScanData[] newArray(int size) {
-                        return new ParcelableScanData[size];
-                    }
-                };
-    }
-
-    public static class ParcelableScanResults implements Parcelable {
-
-        public ScanResult mResults[];
-
-        public ParcelableScanResults(ScanResult[] results) {
-            mResults = results;
-        }
-
-        public ScanResult[] getResults() {
-            return mResults;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public void writeToParcel(Parcel dest, int flags) {
-            if (mResults != null) {
-                dest.writeInt(mResults.length);
-                for (int i = 0; i < mResults.length; i++) {
-                    ScanResult result = mResults[i];
-                    result.writeToParcel(dest, flags);
-                }
-            } else {
-                dest.writeInt(0);
-            }
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @NonNull Creator<ParcelableScanResults> CREATOR =
-                new Creator<ParcelableScanResults>() {
-                    public ParcelableScanResults createFromParcel(Parcel in) {
-                        int n = in.readInt();
-                        ScanResult results[] = new ScanResult[n];
-                        for (int i = 0; i < n; i++) {
-                            results[i] = ScanResult.CREATOR.createFromParcel(in);
-                        }
-                        return new ParcelableScanResults(results);
-                    }
-
-                    public ParcelableScanResults[] newArray(int size) {
-                        return new ParcelableScanResults[size];
-                    }
-                };
-    }
-
-    /** {@hide} */
-    public static final String PNO_PARAMS_PNO_SETTINGS_KEY = "PnoSettings";
-    /** {@hide} */
-    public static final String PNO_PARAMS_SCAN_SETTINGS_KEY = "ScanSettings";
-    /**
-     * PNO scan configuration parameters to be sent to {@link #startPnoScan}.
-     * Note: This structure needs to be in sync with |wifi_epno_params| struct in gscan HAL API.
-     * {@hide}
-     */
-    public static class PnoSettings implements Parcelable {
-        /**
-         * Pno network to be added to the PNO scan filtering.
-         * {@hide}
-         */
-        public static class PnoNetwork {
-            /*
-             * Pno flags bitmask to be set in {@link #PnoNetwork.flags}
-             */
-            /** Whether directed scan needs to be performed (for hidden SSIDs) */
-            public static final byte FLAG_DIRECTED_SCAN = (1 << 0);
-            /** Whether PNO event shall be triggered if the network is found on A band */
-            public static final byte FLAG_A_BAND = (1 << 1);
-            /** Whether PNO event shall be triggered if the network is found on G band */
-            public static final byte FLAG_G_BAND = (1 << 2);
-            /**
-             * Whether strict matching is required
-             * If required then the firmware must store the network's SSID and not just a hash
-             */
-            public static final byte FLAG_STRICT_MATCH = (1 << 3);
-            /**
-             * If this SSID should be considered the same network as the currently connected
-             * one for scoring.
-             */
-            public static final byte FLAG_SAME_NETWORK = (1 << 4);
-
-            /*
-             * Code for matching the beacon AUTH IE - additional codes. Bitmask to be set in
-             * {@link #PnoNetwork.authBitField}
-             */
-            /** Open Network */
-            public static final byte AUTH_CODE_OPEN = (1 << 0);
-            /** WPA_PSK or WPA2PSK */
-            public static final byte AUTH_CODE_PSK = (1 << 1);
-            /** any EAPOL */
-            public static final byte AUTH_CODE_EAPOL = (1 << 2);
-
-            /** SSID of the network */
-            public String ssid;
-            /** Bitmask of the FLAG_XXX */
-            public byte flags = 0;
-            /** Bitmask of the ATUH_XXX */
-            public byte authBitField = 0;
-            /** frequencies on which the particular network needs to be scanned for */
-            public int[] frequencies = {};
-
-            /**
-             * default constructor for PnoNetwork
-             */
-            public PnoNetwork(String ssid) {
-                this.ssid = ssid;
-            }
-
-            @Override
-            public int hashCode() {
-                return Objects.hash(ssid, flags, authBitField);
-            }
-
-            @Override
-            public boolean equals(Object obj) {
-                if (this == obj) {
-                    return true;
-                }
-                if (!(obj instanceof PnoNetwork)) {
-                    return false;
-                }
-                PnoNetwork lhs = (PnoNetwork) obj;
-                return TextUtils.equals(this.ssid, lhs.ssid)
-                        && this.flags == lhs.flags
-                        && this.authBitField == lhs.authBitField;
-            }
-        }
-
-        /** Connected vs Disconnected PNO flag {@hide} */
-        public boolean isConnected;
-        /** Minimum 5GHz RSSI for a BSSID to be considered */
-        public int min5GHzRssi;
-        /** Minimum 2.4GHz RSSI for a BSSID to be considered */
-        public int min24GHzRssi;
-        /** Minimum 6GHz RSSI for a BSSID to be considered */
-        public int min6GHzRssi;
-        /** Pno Network filter list */
-        public PnoNetwork[] networkList;
-
-        /** Implement the Parcelable interface {@hide} */
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeInt(isConnected ? 1 : 0);
-            dest.writeInt(min5GHzRssi);
-            dest.writeInt(min24GHzRssi);
-            dest.writeInt(min6GHzRssi);
-            if (networkList != null) {
-                dest.writeInt(networkList.length);
-                for (int i = 0; i < networkList.length; i++) {
-                    dest.writeString(networkList[i].ssid);
-                    dest.writeByte(networkList[i].flags);
-                    dest.writeByte(networkList[i].authBitField);
-                    dest.writeIntArray(networkList[i].frequencies);
-                }
-            } else {
-                dest.writeInt(0);
-            }
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @NonNull Creator<PnoSettings> CREATOR =
-                new Creator<PnoSettings>() {
-                    public PnoSettings createFromParcel(Parcel in) {
-                        PnoSettings settings = new PnoSettings();
-                        settings.isConnected = in.readInt() == 1;
-                        settings.min5GHzRssi = in.readInt();
-                        settings.min24GHzRssi = in.readInt();
-                        settings.min6GHzRssi = in.readInt();
-                        int numNetworks = in.readInt();
-                        settings.networkList = new PnoNetwork[numNetworks];
-                        for (int i = 0; i < numNetworks; i++) {
-                            String ssid = in.readString();
-                            PnoNetwork network = new PnoNetwork(ssid);
-                            network.flags = in.readByte();
-                            network.authBitField = in.readByte();
-                            network.frequencies = in.createIntArray();
-                            settings.networkList[i] = network;
-                        }
-                        return settings;
-                    }
-
-                    public PnoSettings[] newArray(int size) {
-                        return new PnoSettings[size];
-                    }
-                };
-
-    }
-
-    /**
-     * interface to get scan events on; specify this on {@link #startBackgroundScan} or
-     * {@link #startScan}
-     */
-    public interface ScanListener extends ActionListener {
-        /**
-         * Framework co-ordinates scans across multiple apps; so it may not give exactly the
-         * same period requested. If period of a scan is changed; it is reported by this event.
-         * @deprecated Background scan support has always been hardware vendor dependent. This
-         * support may not be present on newer devices. Use {@link #startScan(ScanSettings,
-         * ScanListener)} instead for single scans.
-         */
-        @Deprecated
-        public void onPeriodChanged(int periodInMs);
-        /**
-         * reports results retrieved from background scan and single shot scans
-         */
-        public void onResults(ScanData[] results);
-        /**
-         * reports full scan result for each access point found in scan
-         */
-        public void onFullResult(ScanResult fullScanResult);
-    }
-
-    /**
-     * interface to get PNO scan events on; specify this on {@link #startDisconnectedPnoScan} and
-     * {@link #startConnectedPnoScan}.
-     * {@hide}
-     */
-    public interface PnoScanListener extends ScanListener {
-        /**
-         * Invoked when one of the PNO networks are found in scan results.
-         */
-        void onPnoNetworkFound(ScanResult[] results);
-    }
-
-    /**
-     * Enable/Disable wifi scanning.
-     *
-     * @param enable set to true to enable scanning, set to false to disable all types of scanning.
-     *
-     * @see WifiManager#ACTION_WIFI_SCAN_AVAILABILITY_CHANGED
-     * {@hide}
-     */
-    @SystemApi
-    @RequiresPermission(Manifest.permission.NETWORK_STACK)
-    public void setScanningEnabled(boolean enable) {
-        validateChannel();
-        mAsyncChannel.sendMessage(enable ? CMD_ENABLE : CMD_DISABLE);
-    }
-
-    /**
-     * Register a listener that will receive results from all single scans.
-     * Either the {@link ScanListener#onSuccess()} or  {@link ScanListener#onFailure(int, String)}
-     * method will be called once when the listener is registered.
-     * Afterwards (assuming onSuccess was called), all subsequent single scan results will be
-     * delivered to the listener. It is possible that onFullResult will not be called for all
-     * results of the first scan if the listener was registered during the scan.
-     *
-     * @param executor the Executor on which to run the callback.
-     * @param listener specifies the object to report events to. This object is also treated as a
-     *                 key for this request, and must also be specified to cancel the request.
-     *                 Multiple requests should also not share this object.
-     */
-    @RequiresPermission(Manifest.permission.NETWORK_STACK)
-    public void registerScanListener(@NonNull @CallbackExecutor Executor executor,
-            @NonNull ScanListener listener) {
-        Objects.requireNonNull(executor, "executor cannot be null");
-        Objects.requireNonNull(listener, "listener cannot be null");
-        int key = addListener(listener, executor);
-        if (key == INVALID_KEY) return;
-        validateChannel();
-        mAsyncChannel.sendMessage(CMD_REGISTER_SCAN_LISTENER, 0, key);
-    }
-
-    /**
-     * Overload of {@link #registerScanListener(Executor, ScanListener)} that executes the callback
-     * synchronously.
-     * @hide
-     */
-    @RequiresPermission(Manifest.permission.NETWORK_STACK)
-    public void registerScanListener(@NonNull ScanListener listener) {
-        registerScanListener(new SynchronousExecutor(), listener);
-    }
-
-    /**
-     * Deregister a listener for ongoing single scans
-     * @param listener specifies which scan to cancel; must be same object as passed in {@link
-     *  #registerScanListener}
-     */
-    public void unregisterScanListener(@NonNull ScanListener listener) {
-        Objects.requireNonNull(listener, "listener cannot be null");
-        int key = removeListener(listener);
-        if (key == INVALID_KEY) return;
-        validateChannel();
-        mAsyncChannel.sendMessage(CMD_DEREGISTER_SCAN_LISTENER, 0, key);
-    }
-
-    /** start wifi scan in background
-     * @param settings specifies various parameters for the scan; for more information look at
-     * {@link ScanSettings}
-     * @param listener specifies the object to report events to. This object is also treated as a
-     *                 key for this scan, and must also be specified to cancel the scan. Multiple
-     *                 scans should also not share this object.
-     */
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void startBackgroundScan(ScanSettings settings, ScanListener listener) {
-        startBackgroundScan(settings, listener, null);
-    }
-
-    /** start wifi scan in background
-     * @param settings specifies various parameters for the scan; for more information look at
-     * {@link ScanSettings}
-     * @param workSource WorkSource to blame for power usage
-     * @param listener specifies the object to report events to. This object is also treated as a
-     *                 key for this scan, and must also be specified to cancel the scan. Multiple
-     *                 scans should also not share this object.
-     * @deprecated Background scan support has always been hardware vendor dependent. This support
-     * may not be present on newer devices. Use {@link #startScan(ScanSettings, ScanListener)}
-     * instead for single scans.
-     */
-    @Deprecated
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void startBackgroundScan(ScanSettings settings, ScanListener listener,
-            WorkSource workSource) {
-        Objects.requireNonNull(listener, "listener cannot be null");
-        int key = addListener(listener);
-        if (key == INVALID_KEY) return;
-        validateChannel();
-        Bundle scanParams = new Bundle();
-        scanParams.putParcelable(SCAN_PARAMS_SCAN_SETTINGS_KEY, settings);
-        scanParams.putParcelable(SCAN_PARAMS_WORK_SOURCE_KEY, workSource);
-        scanParams.putString(REQUEST_PACKAGE_NAME_KEY, mContext.getOpPackageName());
-        scanParams.putString(REQUEST_FEATURE_ID_KEY, mContext.getAttributionTag());
-        mAsyncChannel.sendMessage(CMD_START_BACKGROUND_SCAN, 0, key, scanParams);
-    }
-
-    /**
-     * stop an ongoing wifi scan
-     * @param listener specifies which scan to cancel; must be same object as passed in {@link
-     *  #startBackgroundScan}
-     * @deprecated Background scan support has always been hardware vendor dependent. This support
-     * may not be present on newer devices. Use {@link #startScan(ScanSettings, ScanListener)}
-     * instead for single scans.
-     */
-    @Deprecated
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void stopBackgroundScan(ScanListener listener) {
-        Objects.requireNonNull(listener, "listener cannot be null");
-        int key = removeListener(listener);
-        if (key == INVALID_KEY) return;
-        validateChannel();
-        Bundle scanParams = new Bundle();
-        scanParams.putString(REQUEST_PACKAGE_NAME_KEY, mContext.getOpPackageName());
-        scanParams.putString(REQUEST_FEATURE_ID_KEY, mContext.getAttributionTag());
-        mAsyncChannel.sendMessage(CMD_STOP_BACKGROUND_SCAN, 0, key, scanParams);
-    }
-
-    /**
-     * reports currently available scan results on appropriate listeners
-     * @return true if all scan results were reported correctly
-     * @deprecated Background scan support has always been hardware vendor dependent. This support
-     * may not be present on newer devices. Use {@link #startScan(ScanSettings, ScanListener)}
-     * instead for single scans.
-     */
-    @Deprecated
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public boolean getScanResults() {
-        validateChannel();
-        Bundle scanParams = new Bundle();
-        scanParams.putString(REQUEST_PACKAGE_NAME_KEY, mContext.getOpPackageName());
-        scanParams.putString(REQUEST_FEATURE_ID_KEY, mContext.getAttributionTag());
-        Message reply =
-                mAsyncChannel.sendMessageSynchronously(CMD_GET_SCAN_RESULTS, 0, 0, scanParams);
-        return reply.what == CMD_OP_SUCCEEDED;
-    }
-
-    /**
-     * starts a single scan and reports results asynchronously
-     * @param settings specifies various parameters for the scan; for more information look at
-     * {@link ScanSettings}
-     * @param listener specifies the object to report events to. This object is also treated as a
-     *                 key for this scan, and must also be specified to cancel the scan. Multiple
-     *                 scans should also not share this object.
-     */
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void startScan(ScanSettings settings, ScanListener listener) {
-        startScan(settings, listener, null);
-    }
-
-    /**
-     * starts a single scan and reports results asynchronously
-     * @param settings specifies various parameters for the scan; for more information look at
-     * {@link ScanSettings}
-     * @param listener specifies the object to report events to. This object is also treated as a
-     *                 key for this scan, and must also be specified to cancel the scan. Multiple
-     *                 scans should also not share this object.
-     * @param workSource WorkSource to blame for power usage
-     */
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void startScan(ScanSettings settings, ScanListener listener, WorkSource workSource) {
-        startScan(settings, null, listener, workSource);
-    }
-
-    /**
-     * starts a single scan and reports results asynchronously
-     * @param settings specifies various parameters for the scan; for more information look at
-     * {@link ScanSettings}
-     * @param executor the Executor on which to run the callback.
-     * @param listener specifies the object to report events to. This object is also treated as a
-     *                 key for this scan, and must also be specified to cancel the scan. Multiple
-     *                 scans should also not share this object.
-     * @param workSource WorkSource to blame for power usage
-     * @hide
-     */
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void startScan(ScanSettings settings, @Nullable @CallbackExecutor Executor executor,
-            ScanListener listener, WorkSource workSource) {
-        Objects.requireNonNull(listener, "listener cannot be null");
-        int key = addListener(listener, executor);
-        if (key == INVALID_KEY) return;
-        validateChannel();
-        Bundle scanParams = new Bundle();
-        scanParams.putParcelable(SCAN_PARAMS_SCAN_SETTINGS_KEY, settings);
-        scanParams.putParcelable(SCAN_PARAMS_WORK_SOURCE_KEY, workSource);
-        scanParams.putString(REQUEST_PACKAGE_NAME_KEY, mContext.getOpPackageName());
-        scanParams.putString(REQUEST_FEATURE_ID_KEY, mContext.getAttributionTag());
-        mAsyncChannel.sendMessage(CMD_START_SINGLE_SCAN, 0, key, scanParams);
-    }
-
-    /**
-     * stops an ongoing single shot scan; only useful after {@link #startScan} if onResults()
-     * hasn't been called on the listener, ignored otherwise
-     * @param listener
-     */
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public void stopScan(ScanListener listener) {
-        Objects.requireNonNull(listener, "listener cannot be null");
-        int key = removeListener(listener);
-        if (key == INVALID_KEY) return;
-        validateChannel();
-        Bundle scanParams = new Bundle();
-        scanParams.putString(REQUEST_PACKAGE_NAME_KEY, mContext.getOpPackageName());
-        scanParams.putString(REQUEST_FEATURE_ID_KEY, mContext.getAttributionTag());
-        mAsyncChannel.sendMessage(CMD_STOP_SINGLE_SCAN, 0, key, scanParams);
-    }
-
-    /**
-     * Retrieve the most recent scan results from a single scan request.
-     */
-    @NonNull
-    @RequiresPermission(android.Manifest.permission.LOCATION_HARDWARE)
-    public List<ScanResult> getSingleScanResults() {
-        validateChannel();
-        Bundle scanParams = new Bundle();
-        scanParams.putString(REQUEST_PACKAGE_NAME_KEY, mContext.getOpPackageName());
-        scanParams.putString(REQUEST_FEATURE_ID_KEY, mContext.getAttributionTag());
-        Message reply = mAsyncChannel.sendMessageSynchronously(CMD_GET_SINGLE_SCAN_RESULTS, 0, 0,
-                scanParams);
-        if (reply.what == WifiScanner.CMD_OP_SUCCEEDED) {
-            return Arrays.asList(((ParcelableScanResults) reply.obj).getResults());
-        }
-        OperationResult result = (OperationResult) reply.obj;
-        Log.e(TAG, "Error retrieving SingleScan results reason: " + result.reason
-                + " description: " + result.description);
-        return new ArrayList<>();
-    }
-
-    private void startPnoScan(ScanSettings scanSettings, PnoSettings pnoSettings, int key) {
-        // Bundle up both the settings and send it across.
-        Bundle pnoParams = new Bundle();
-        // Set the PNO scan flag.
-        scanSettings.isPnoScan = true;
-        pnoParams.putParcelable(PNO_PARAMS_SCAN_SETTINGS_KEY, scanSettings);
-        pnoParams.putParcelable(PNO_PARAMS_PNO_SETTINGS_KEY, pnoSettings);
-        mAsyncChannel.sendMessage(CMD_START_PNO_SCAN, 0, key, pnoParams);
-    }
-    /**
-     * Start wifi connected PNO scan
-     * @param scanSettings specifies various parameters for the scan; for more information look at
-     * {@link ScanSettings}
-     * @param pnoSettings specifies various parameters for PNO; for more information look at
-     * {@link PnoSettings}
-     * @param executor the Executor on which to run the callback.
-     * @param listener specifies the object to report events to. This object is also treated as a
-     *                 key for this scan, and must also be specified to cancel the scan. Multiple
-     *                 scans should also not share this object.
-     * {@hide}
-     */
-    public void startConnectedPnoScan(ScanSettings scanSettings, PnoSettings pnoSettings,
-            @NonNull @CallbackExecutor Executor executor, PnoScanListener listener) {
-        Objects.requireNonNull(listener, "listener cannot be null");
-        Objects.requireNonNull(pnoSettings, "pnoSettings cannot be null");
-        int key = addListener(listener, executor);
-        if (key == INVALID_KEY) return;
-        validateChannel();
-        pnoSettings.isConnected = true;
-        startPnoScan(scanSettings, pnoSettings, key);
-    }
-    /**
-     * Start wifi disconnected PNO scan
-     * @param scanSettings specifies various parameters for the scan; for more information look at
-     * {@link ScanSettings}
-     * @param pnoSettings specifies various parameters for PNO; for more information look at
-     * {@link PnoSettings}
-     * @param listener specifies the object to report events to. This object is also treated as a
-     *                 key for this scan, and must also be specified to cancel the scan. Multiple
-     *                 scans should also not share this object.
-     * {@hide}
-     */
-    @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
-    public void startDisconnectedPnoScan(ScanSettings scanSettings, PnoSettings pnoSettings,
-            @NonNull @CallbackExecutor Executor executor, PnoScanListener listener) {
-        Objects.requireNonNull(listener, "listener cannot be null");
-        Objects.requireNonNull(pnoSettings, "pnoSettings cannot be null");
-        int key = addListener(listener, executor);
-        if (key == INVALID_KEY) return;
-        validateChannel();
-        pnoSettings.isConnected = false;
-        startPnoScan(scanSettings, pnoSettings, key);
-    }
-    /**
-     * Stop an ongoing wifi PNO scan
-     * @param listener specifies which scan to cancel; must be same object as passed in {@link
-     *  #startPnoScan}
-     * {@hide}
-     */
-    @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
-    public void stopPnoScan(ScanListener listener) {
-        Objects.requireNonNull(listener, "listener cannot be null");
-        int key = removeListener(listener);
-        if (key == INVALID_KEY) return;
-        validateChannel();
-        mAsyncChannel.sendMessage(CMD_STOP_PNO_SCAN, 0, key);
-    }
-
-    /** specifies information about an access point of interest */
-    @Deprecated
-    public static class BssidInfo {
-        /** bssid of the access point; in XX:XX:XX:XX:XX:XX format */
-        public String bssid;
-        /** low signal strength threshold; more information at {@link ScanResult#level} */
-        public int low;                                            /* minimum RSSI */
-        /** high signal threshold; more information at {@link ScanResult#level} */
-        public int high;                                           /* maximum RSSI */
-        /** channel frequency (in KHz) where you may find this BSSID */
-        public int frequencyHint;
-    }
-
-    /** @hide */
-    @SystemApi
-    @Deprecated
-    public static class WifiChangeSettings implements Parcelable {
-        public int rssiSampleSize;                          /* sample size for RSSI averaging */
-        public int lostApSampleSize;                        /* samples to confirm AP's loss */
-        public int unchangedSampleSize;                     /* samples to confirm no change */
-        public int minApsBreachingThreshold;                /* change threshold to trigger event */
-        public int periodInMs;                              /* scan period in millisecond */
-        public BssidInfo[] bssidInfos;
-
-        /** Implement the Parcelable interface {@hide} */
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public void writeToParcel(Parcel dest, int flags) {
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @NonNull Creator<WifiChangeSettings> CREATOR =
-                new Creator<WifiChangeSettings>() {
-                    public WifiChangeSettings createFromParcel(Parcel in) {
-                        return new WifiChangeSettings();
-                    }
-
-                    public WifiChangeSettings[] newArray(int size) {
-                        return new WifiChangeSettings[size];
-                    }
-                };
-
-    }
-
-    /** configure WifiChange detection
-     * @param rssiSampleSize number of samples used for RSSI averaging
-     * @param lostApSampleSize number of samples to confirm an access point's loss
-     * @param unchangedSampleSize number of samples to confirm there are no changes
-     * @param minApsBreachingThreshold minimum number of access points that need to be
-     *                                 out of range to detect WifiChange
-     * @param periodInMs indicates period of scan to find changes
-     * @param bssidInfos access points to watch
-     */
-    @Deprecated
-    @SuppressLint("RequiresPermission")
-    public void configureWifiChange(
-            int rssiSampleSize,                             /* sample size for RSSI averaging */
-            int lostApSampleSize,                           /* samples to confirm AP's loss */
-            int unchangedSampleSize,                        /* samples to confirm no change */
-            int minApsBreachingThreshold,                   /* change threshold to trigger event */
-            int periodInMs,                                 /* period of scan */
-            BssidInfo[] bssidInfos                          /* signal thresholds to cross */
-            )
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * interface to get wifi change events on; use this on {@link #startTrackingWifiChange}
-     */
-    @Deprecated
-    public interface WifiChangeListener extends ActionListener {
-        /** indicates that changes were detected in wifi environment
-         * @param results indicate the access points that exhibited change
-         */
-        public void onChanging(ScanResult[] results);           /* changes are found */
-        /** indicates that no wifi changes are being detected for a while
-         * @param results indicate the access points that are bing monitored for change
-         */
-        public void onQuiescence(ScanResult[] results);         /* changes settled down */
-    }
-
-    /**
-     * track changes in wifi environment
-     * @param listener object to report events on; this object must be unique and must also be
-     *                 provided on {@link #stopTrackingWifiChange}
-     */
-    @Deprecated
-    @SuppressLint("RequiresPermission")
-    public void startTrackingWifiChange(WifiChangeListener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * stop tracking changes in wifi environment
-     * @param listener object that was provided to report events on {@link
-     * #stopTrackingWifiChange}
-     */
-    @Deprecated
-    @SuppressLint("RequiresPermission")
-    public void stopTrackingWifiChange(WifiChangeListener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** @hide */
-    @SystemApi
-    @Deprecated
-    @SuppressLint("RequiresPermission")
-    public void configureWifiChange(WifiChangeSettings settings) {
-        throw new UnsupportedOperationException();
-    }
-
-    /** interface to receive hotlist events on; use this on {@link #setHotlist} */
-    @Deprecated
-    public static interface BssidListener extends ActionListener {
-        /** indicates that access points were found by on going scans
-         * @param results list of scan results, one for each access point visible currently
-         */
-        public void onFound(ScanResult[] results);
-        /** indicates that access points were missed by on going scans
-         * @param results list of scan results, for each access point that is not visible anymore
-         */
-        public void onLost(ScanResult[] results);
-    }
-
-    /** @hide */
-    @SystemApi
-    @Deprecated
-    public static class HotlistSettings implements Parcelable {
-        public BssidInfo[] bssidInfos;
-        public int apLostThreshold;
-
-        /** Implement the Parcelable interface {@hide} */
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public void writeToParcel(Parcel dest, int flags) {
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @NonNull Creator<HotlistSettings> CREATOR =
-                new Creator<HotlistSettings>() {
-                    public HotlistSettings createFromParcel(Parcel in) {
-                        HotlistSettings settings = new HotlistSettings();
-                        return settings;
-                    }
-
-                    public HotlistSettings[] newArray(int size) {
-                        return new HotlistSettings[size];
-                    }
-                };
-    }
-
-    /**
-     * set interesting access points to find
-     * @param bssidInfos access points of interest
-     * @param apLostThreshold number of scans needed to indicate that AP is lost
-     * @param listener object provided to report events on; this object must be unique and must
-     *                 also be provided on {@link #stopTrackingBssids}
-     */
-    @Deprecated
-    @SuppressLint("RequiresPermission")
-    public void startTrackingBssids(BssidInfo[] bssidInfos,
-                                    int apLostThreshold, BssidListener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     * remove tracking of interesting access points
-     * @param listener same object provided in {@link #startTrackingBssids}
-     */
-    @Deprecated
-    @SuppressLint("RequiresPermission")
-    public void stopTrackingBssids(BssidListener listener) {
-        throw new UnsupportedOperationException();
-    }
-
-
-    /* private members and methods */
-
-    private static final String TAG = "WifiScanner";
-    private static final boolean DBG = false;
-
-    /* commands for Wifi Service */
-    private static final int BASE = Protocol.BASE_WIFI_SCANNER;
-
-    /** @hide */
-    public static final int CMD_START_BACKGROUND_SCAN       = BASE + 2;
-    /** @hide */
-    public static final int CMD_STOP_BACKGROUND_SCAN        = BASE + 3;
-    /** @hide */
-    public static final int CMD_GET_SCAN_RESULTS            = BASE + 4;
-    /** @hide */
-    public static final int CMD_SCAN_RESULT                 = BASE + 5;
-    /** @hide */
-    public static final int CMD_OP_SUCCEEDED                = BASE + 17;
-    /** @hide */
-    public static final int CMD_OP_FAILED                   = BASE + 18;
-    /** @hide */
-    public static final int CMD_FULL_SCAN_RESULT            = BASE + 20;
-    /** @hide */
-    public static final int CMD_START_SINGLE_SCAN           = BASE + 21;
-    /** @hide */
-    public static final int CMD_STOP_SINGLE_SCAN            = BASE + 22;
-    /** @hide */
-    public static final int CMD_SINGLE_SCAN_COMPLETED       = BASE + 23;
-    /** @hide */
-    public static final int CMD_START_PNO_SCAN              = BASE + 24;
-    /** @hide */
-    public static final int CMD_STOP_PNO_SCAN               = BASE + 25;
-    /** @hide */
-    public static final int CMD_PNO_NETWORK_FOUND           = BASE + 26;
-    /** @hide */
-    public static final int CMD_REGISTER_SCAN_LISTENER      = BASE + 27;
-    /** @hide */
-    public static final int CMD_DEREGISTER_SCAN_LISTENER    = BASE + 28;
-    /** @hide */
-    public static final int CMD_GET_SINGLE_SCAN_RESULTS     = BASE + 29;
-    /** @hide */
-    public static final int CMD_ENABLE                      = BASE + 30;
-    /** @hide */
-    public static final int CMD_DISABLE                     = BASE + 31;
-
-    private Context mContext;
-    private IWifiScanner mService;
-
-    private static final int INVALID_KEY = 0;
-    private int mListenerKey = 1;
-
-    private final SparseArray mListenerMap = new SparseArray();
-    private final SparseArray<Executor> mExecutorMap = new SparseArray<>();
-    private final Object mListenerMapLock = new Object();
-
-    private AsyncChannel mAsyncChannel;
-    private final Handler mInternalHandler;
-
-    /**
-     * Create a new WifiScanner instance.
-     * Applications will almost always want to use
-     * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
-     * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}.
-     *
-     * @param context the application context
-     * @param service the Binder interface for {@link Context#WIFI_SCANNING_SERVICE}
-     * @param looper the Looper used to deliver callbacks
-     *
-     * @hide
-     */
-    public WifiScanner(@NonNull Context context, @NonNull IWifiScanner service,
-            @NonNull Looper looper) {
-        mContext = context;
-        mService = service;
-
-        Messenger messenger = null;
-        try {
-            messenger = mService.getMessenger();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-
-        if (messenger == null) {
-            throw new IllegalStateException("getMessenger() returned null!  This is invalid.");
-        }
-
-        mAsyncChannel = new AsyncChannel();
-
-        mInternalHandler = new ServiceHandler(looper);
-        mAsyncChannel.connectSync(mContext, mInternalHandler, messenger);
-        // We cannot use fullyConnectSync because it sends the FULL_CONNECTION message
-        // synchronously, which causes WifiScanningService to receive the wrong replyTo value.
-        mAsyncChannel.sendMessage(AsyncChannel.CMD_CHANNEL_FULL_CONNECTION);
-    }
-
-    private void validateChannel() {
-        if (mAsyncChannel == null) throw new IllegalStateException(
-                "No permission to access and change wifi or a bad initialization");
-    }
-
-    private int addListener(ActionListener listener) {
-        return addListener(listener, null);
-    }
-
-    // Add a listener into listener map. If the listener already exists, return INVALID_KEY and
-    // send an error message to internal handler; Otherwise add the listener to the listener map and
-    // return the key of the listener.
-    private int addListener(ActionListener listener, Executor executor) {
-        synchronized (mListenerMapLock) {
-            boolean keyExists = (getListenerKey(listener) != INVALID_KEY);
-            // Note we need to put the listener into listener map even if it's a duplicate as the
-            // internal handler will need the key to find the listener. In case of duplicates,
-            // removing duplicate key logic will be handled in internal handler.
-            int key = putListener(listener);
-            if (keyExists) {
-                if (DBG) Log.d(TAG, "listener key already exists");
-                OperationResult operationResult = new OperationResult(REASON_DUPLICATE_REQEUST,
-                        "Outstanding request with same key not stopped yet");
-                Message message = Message.obtain(mInternalHandler, CMD_OP_FAILED, 0, key,
-                        operationResult);
-                message.sendToTarget();
-                return INVALID_KEY;
-            } else {
-                mExecutorMap.put(key, executor);
-                return key;
-            }
-        }
-    }
-
-    private int putListener(Object listener) {
-        if (listener == null) return INVALID_KEY;
-        int key;
-        synchronized (mListenerMapLock) {
-            do {
-                key = mListenerKey++;
-            } while (key == INVALID_KEY);
-            mListenerMap.put(key, listener);
-        }
-        return key;
-    }
-
-    private static class ListenerWithExecutor {
-        @Nullable final Object mListener;
-        @Nullable final Executor mExecutor;
-
-        ListenerWithExecutor(@Nullable Object listener, @Nullable Executor executor) {
-            mListener = listener;
-            mExecutor = executor;
-        }
-    }
-
-    private ListenerWithExecutor getListenerWithExecutor(int key) {
-        if (key == INVALID_KEY) return new ListenerWithExecutor(null, null);
-        synchronized (mListenerMapLock) {
-            Object listener = mListenerMap.get(key);
-            Executor executor = mExecutorMap.get(key);
-            return new ListenerWithExecutor(listener, executor);
-        }
-    }
-
-    private int getListenerKey(Object listener) {
-        if (listener == null) return INVALID_KEY;
-        synchronized (mListenerMapLock) {
-            int index = mListenerMap.indexOfValue(listener);
-            if (index == -1) {
-                return INVALID_KEY;
-            } else {
-                return mListenerMap.keyAt(index);
-            }
-        }
-    }
-
-    private Object removeListener(int key) {
-        if (key == INVALID_KEY) return null;
-        synchronized (mListenerMapLock) {
-            Object listener = mListenerMap.get(key);
-            mListenerMap.remove(key);
-            mExecutorMap.remove(key);
-            return listener;
-        }
-    }
-
-    private int removeListener(Object listener) {
-        int key = getListenerKey(listener);
-        if (key == INVALID_KEY) {
-            Log.e(TAG, "listener cannot be found");
-            return key;
-        }
-        synchronized (mListenerMapLock) {
-            mListenerMap.remove(key);
-            mExecutorMap.remove(key);
-            return key;
-        }
-    }
-
-    /** @hide */
-    public static class OperationResult implements Parcelable {
-        public int reason;
-        public String description;
-
-        public OperationResult(int reason, String description) {
-            this.reason = reason;
-            this.description = description;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public int describeContents() {
-            return 0;
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeInt(reason);
-            dest.writeString(description);
-        }
-
-        /** Implement the Parcelable interface {@hide} */
-        public static final @NonNull Creator<OperationResult> CREATOR =
-                new Creator<OperationResult>() {
-                    public OperationResult createFromParcel(Parcel in) {
-                        int reason = in.readInt();
-                        String description = in.readString();
-                        return new OperationResult(reason, description);
-                    }
-
-                    public OperationResult[] newArray(int size) {
-                        return new OperationResult[size];
-                    }
-                };
-    }
-
-    private class ServiceHandler extends Handler {
-        ServiceHandler(Looper looper) {
-            super(looper);
-        }
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case AsyncChannel.CMD_CHANNEL_FULLY_CONNECTED:
-                    return;
-                case AsyncChannel.CMD_CHANNEL_DISCONNECTED:
-                    Log.e(TAG, "Channel connection lost");
-                    // This will cause all further async API calls on the WifiManager
-                    // to fail and throw an exception
-                    mAsyncChannel = null;
-                    getLooper().quit();
-                    return;
-            }
-
-            ListenerWithExecutor listenerWithExecutor = getListenerWithExecutor(msg.arg2);
-            Object listener = listenerWithExecutor.mListener;
-
-            if (listener == null) {
-                if (DBG) Log.d(TAG, "invalid listener key = " + msg.arg2);
-                return;
-            } else {
-                if (DBG) Log.d(TAG, "listener key = " + msg.arg2);
-            }
-
-            Executor executor = listenerWithExecutor.mExecutor;
-            if (executor == null) {
-                executor = new SynchronousExecutor();
-            }
-
-            switch (msg.what) {
-                /* ActionListeners grouped together */
-                case CMD_OP_SUCCEEDED: {
-                    ActionListener actionListener = (ActionListener) listener;
-                    Binder.clearCallingIdentity();
-                    executor.execute(actionListener::onSuccess);
-                } break;
-                case CMD_OP_FAILED: {
-                    OperationResult result = (OperationResult) msg.obj;
-                    ActionListener actionListener = (ActionListener) listener;
-                    removeListener(msg.arg2);
-                    Binder.clearCallingIdentity();
-                    executor.execute(() ->
-                            actionListener.onFailure(result.reason, result.description));
-                } break;
-                case CMD_SCAN_RESULT: {
-                    ScanListener scanListener = (ScanListener) listener;
-                    ParcelableScanData parcelableScanData = (ParcelableScanData) msg.obj;
-                    Binder.clearCallingIdentity();
-                    executor.execute(() -> scanListener.onResults(parcelableScanData.getResults()));
-                } break;
-                case CMD_FULL_SCAN_RESULT: {
-                    ScanResult result = (ScanResult) msg.obj;
-                    ScanListener scanListener = ((ScanListener) listener);
-                    Binder.clearCallingIdentity();
-                    executor.execute(() -> scanListener.onFullResult(result));
-                } break;
-                case CMD_SINGLE_SCAN_COMPLETED: {
-                    if (DBG) Log.d(TAG, "removing listener for single scan");
-                    removeListener(msg.arg2);
-                } break;
-                case CMD_PNO_NETWORK_FOUND: {
-                    PnoScanListener pnoScanListener = (PnoScanListener) listener;
-                    ParcelableScanResults parcelableScanResults = (ParcelableScanResults) msg.obj;
-                    Binder.clearCallingIdentity();
-                    executor.execute(() ->
-                            pnoScanListener.onPnoNetworkFound(parcelableScanResults.getResults()));
-                } break;
-                default: {
-                    if (DBG) Log.d(TAG, "Ignoring message " + msg.what);
-                } break;
-            }
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/WifiSsid.java b/wifi/java/android/net/wifi/WifiSsid.java
deleted file mode 100644
index 704ae81..0000000
--- a/wifi/java/android/net/wifi/WifiSsid.java
+++ /dev/null
@@ -1,288 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.io.ByteArrayOutputStream;
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.Charset;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CoderResult;
-import java.nio.charset.CodingErrorAction;
-import java.util.Arrays;
-import java.util.Locale;
-
-/**
- * Stores SSID octets and handles conversion.
- *
- * For Ascii encoded string, any octet < 32 or > 127 is encoded as
- * a "\x" followed by the hex representation of the octet.
- * Exception chars are ", \, \e, \n, \r, \t which are escaped by a \
- * See src/utils/common.c for the implementation in the supplicant.
- *
- * @hide
- */
-public final class WifiSsid implements Parcelable {
-    private static final String TAG = "WifiSsid";
-
-    @UnsupportedAppUsage
-    public final ByteArrayOutputStream octets = new ByteArrayOutputStream(32);
-
-    private static final int HEX_RADIX = 16;
-
-    @UnsupportedAppUsage
-    public static final String NONE = WifiManager.UNKNOWN_SSID;
-
-    private WifiSsid() {
-    }
-
-    /**
-     * Create a WifiSsid from a raw byte array. If the byte array is null, return an empty WifiSsid
-     * object.
-     */
-    @NonNull
-    public static WifiSsid createFromByteArray(@Nullable byte[] ssid) {
-        WifiSsid wifiSsid = new WifiSsid();
-        if (ssid != null) {
-            wifiSsid.octets.write(ssid, 0 /* the start offset */, ssid.length);
-        }
-        return wifiSsid;
-    }
-
-    @UnsupportedAppUsage
-    public static WifiSsid createFromAsciiEncoded(String asciiEncoded) {
-        WifiSsid a = new WifiSsid();
-        a.convertToBytes(asciiEncoded);
-        return a;
-    }
-
-    public static WifiSsid createFromHex(String hexStr) {
-        WifiSsid a = new WifiSsid();
-        if (hexStr == null) return a;
-
-        if (hexStr.startsWith("0x") || hexStr.startsWith("0X")) {
-            hexStr = hexStr.substring(2);
-        }
-
-        for (int i = 0; i < hexStr.length()-1; i += 2) {
-            int val;
-            try {
-                val = Integer.parseInt(hexStr.substring(i, i + 2), HEX_RADIX);
-            } catch(NumberFormatException e) {
-                val = 0;
-            }
-            a.octets.write(val);
-        }
-        return a;
-    }
-
-    /* This function is equivalent to printf_decode() at src/utils/common.c in
-     * the supplicant */
-    private void convertToBytes(String asciiEncoded) {
-        int i = 0;
-        int val = 0;
-        while (i< asciiEncoded.length()) {
-            char c = asciiEncoded.charAt(i);
-            switch (c) {
-                case '\\':
-                    i++;
-                    switch(asciiEncoded.charAt(i)) {
-                        case '\\':
-                            octets.write('\\');
-                            i++;
-                            break;
-                        case '"':
-                            octets.write('"');
-                            i++;
-                            break;
-                        case 'n':
-                            octets.write('\n');
-                            i++;
-                            break;
-                        case 'r':
-                            octets.write('\r');
-                            i++;
-                            break;
-                        case 't':
-                            octets.write('\t');
-                            i++;
-                            break;
-                        case 'e':
-                            octets.write(27); //escape char
-                            i++;
-                            break;
-                        case 'x':
-                            i++;
-                            try {
-                                val = Integer.parseInt(asciiEncoded.substring(i, i + 2), HEX_RADIX);
-                            } catch (NumberFormatException e) {
-                                val = -1;
-                            } catch (StringIndexOutOfBoundsException e) {
-                                val = -1;
-                            }
-                            if (val < 0) {
-                                val = Character.digit(asciiEncoded.charAt(i), HEX_RADIX);
-                                if (val < 0) break;
-                                octets.write(val);
-                                i++;
-                            } else {
-                                octets.write(val);
-                                i += 2;
-                            }
-                            break;
-                        case '0':
-                        case '1':
-                        case '2':
-                        case '3':
-                        case '4':
-                        case '5':
-                        case '6':
-                        case '7':
-                            val = asciiEncoded.charAt(i) - '0';
-                            i++;
-                            if (asciiEncoded.charAt(i) >= '0' && asciiEncoded.charAt(i) <= '7') {
-                                val = val * 8 + asciiEncoded.charAt(i) - '0';
-                                i++;
-                            }
-                            if (asciiEncoded.charAt(i) >= '0' && asciiEncoded.charAt(i) <= '7') {
-                                val = val * 8 + asciiEncoded.charAt(i) - '0';
-                                i++;
-                            }
-                            octets.write(val);
-                            break;
-                        default:
-                            break;
-                    }
-                    break;
-                default:
-                    octets.write(c);
-                    i++;
-                    break;
-            }
-        }
-    }
-
-    /**
-     * Converts this SSID to an unquoted UTF-8 String representation.
-     * @return the SSID string, or {@link WifiManager#UNKNOWN_SSID} if there was an error.
-     */
-    @Override
-    public String toString() {
-        byte[] ssidBytes = octets.toByteArray();
-        // Supplicant returns \x00\x00\x00\x00\x00\x00\x00\x00 hex string
-        // for a hidden access point. Make sure we maintain the previous
-        // behavior of returning empty string for this case.
-        if (octets.size() <= 0 || isArrayAllZeroes(ssidBytes)) return "";
-        // TODO: Handle conversion to other charsets upon failure
-        Charset charset = Charset.forName("UTF-8");
-        CharsetDecoder decoder = charset.newDecoder()
-                .onMalformedInput(CodingErrorAction.REPLACE)
-                .onUnmappableCharacter(CodingErrorAction.REPLACE);
-        CharBuffer out = CharBuffer.allocate(32);
-
-        CoderResult result = decoder.decode(ByteBuffer.wrap(ssidBytes), out, true);
-        out.flip();
-        if (result.isError()) {
-            return WifiManager.UNKNOWN_SSID;
-        }
-        return out.toString();
-    }
-
-    @Override
-    public boolean equals(Object thatObject) {
-        if (this == thatObject) {
-            return true;
-        }
-        if (!(thatObject instanceof WifiSsid)) {
-            return false;
-        }
-        WifiSsid that = (WifiSsid) thatObject;
-        return Arrays.equals(octets.toByteArray(), that.octets.toByteArray());
-    }
-
-    @Override
-    public int hashCode() {
-        return Arrays.hashCode(octets.toByteArray());
-    }
-
-    private boolean isArrayAllZeroes(byte[] ssidBytes) {
-        for (int i = 0; i< ssidBytes.length; i++) {
-            if (ssidBytes[i] != 0) return false;
-        }
-        return true;
-    }
-
-    /** @hide */
-    public boolean isHidden() {
-        return isArrayAllZeroes(octets.toByteArray());
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public byte[] getOctets() {
-        return octets.toByteArray();
-    }
-
-    /** @hide */
-    public String getHexString() {
-        String out = "0x";
-        byte[] ssidbytes = getOctets();
-        for (int i = 0; i < octets.size(); i++) {
-            out += String.format(Locale.US, "%02x", ssidbytes[i]);
-        }
-        return (octets.size() > 0) ? out : null;
-    }
-
-    /** Implement the Parcelable interface */
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface */
-    @Override
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeInt(octets.size());
-        dest.writeByteArray(octets.toByteArray());
-    }
-
-    /** Implement the Parcelable interface */
-    @UnsupportedAppUsage
-    public static final @NonNull Creator<WifiSsid> CREATOR =
-            new Creator<WifiSsid>() {
-                @Override
-                public WifiSsid createFromParcel(Parcel in) {
-                    WifiSsid ssid = new WifiSsid();
-                    int length = in.readInt();
-                    byte[] b = new byte[length];
-                    in.readByteArray(b);
-                    ssid.octets.write(b, 0, length);
-                    return ssid;
-                }
-
-                @Override
-                public WifiSsid[] newArray(int size) {
-                    return new WifiSsid[size];
-                }
-            };
-}
diff --git a/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java b/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java
deleted file mode 100644
index 8f3635f..0000000
--- a/wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.annotation.IntDef;
-import android.annotation.SystemApi;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import android.telephony.Annotation.NetworkType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * This class makes a subset of
- * com.android.server.wifi.nano.WifiMetricsProto.WifiUsabilityStatsEntry parcelable.
- *
- * @hide
- */
-@SystemApi
-public final class WifiUsabilityStatsEntry implements Parcelable {
-    /** {@hide} */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"PROBE_STATUS_"}, value = {
-            PROBE_STATUS_UNKNOWN,
-            PROBE_STATUS_NO_PROBE,
-            PROBE_STATUS_SUCCESS,
-            PROBE_STATUS_FAILURE})
-    public @interface ProbeStatus {}
-
-    /** Link probe status is unknown */
-    public static final int PROBE_STATUS_UNKNOWN = 0;
-    /** Link probe is not triggered */
-    public static final int PROBE_STATUS_NO_PROBE = 1;
-    /** Link probe is triggered and the result is success */
-    public static final int PROBE_STATUS_SUCCESS = 2;
-    /** Link probe is triggered and the result is failure */
-    public static final int PROBE_STATUS_FAILURE = 3;
-
-    /** Absolute milliseconds from device boot when these stats were sampled */
-    private final long mTimeStampMillis;
-    /** The RSSI (in dBm) at the sample time */
-    private final int mRssi;
-    /** Link speed at the sample time in Mbps */
-    private final int mLinkSpeedMbps;
-    /** The total number of tx success counted from the last radio chip reset */
-    private final long mTotalTxSuccess;
-    /** The total number of MPDU data packet retries counted from the last radio chip reset */
-    private final long mTotalTxRetries;
-    /** The total number of tx bad counted from the last radio chip reset */
-    private final long mTotalTxBad;
-    /** The total number of rx success counted from the last radio chip reset */
-    private final long mTotalRxSuccess;
-    /** The total time the wifi radio is on in ms counted from the last radio chip reset */
-    private final long mTotalRadioOnTimeMillis;
-    /** The total time the wifi radio is doing tx in ms counted from the last radio chip reset */
-    private final long mTotalRadioTxTimeMillis;
-    /** The total time the wifi radio is doing rx in ms counted from the last radio chip reset */
-    private final long mTotalRadioRxTimeMillis;
-    /** The total time spent on all types of scans in ms counted from the last radio chip reset */
-    private final long mTotalScanTimeMillis;
-    /** The total time spent on nan scans in ms counted from the last radio chip reset */
-    private final long mTotalNanScanTimeMillis;
-    /** The total time spent on background scans in ms counted from the last radio chip reset */
-    private final long mTotalBackgroundScanTimeMillis;
-    /** The total time spent on roam scans in ms counted from the last radio chip reset */
-    private final long mTotalRoamScanTimeMillis;
-    /** The total time spent on pno scans in ms counted from the last radio chip reset */
-    private final long mTotalPnoScanTimeMillis;
-    /** The total time spent on hotspot2.0 scans and GAS exchange in ms counted from the last radio
-     * chip reset */
-    private final long mTotalHotspot2ScanTimeMillis;
-    /** The total time CCA is on busy status on the current frequency in ms counted from the last
-     * radio chip reset */
-    private final long mTotalCcaBusyFreqTimeMillis;
-    /** The total radio on time on the current frequency from the last radio chip reset */
-    private final long mTotalRadioOnFreqTimeMillis;
-    /** The total number of beacons received from the last radio chip reset */
-    private final long mTotalBeaconRx;
-    /** The status of link probe since last stats update */
-    @ProbeStatus private final int mProbeStatusSinceLastUpdate;
-    /** The elapsed time of the most recent link probe since last stats update */
-    private final int mProbeElapsedTimeSinceLastUpdateMillis;
-    /** The MCS rate of the most recent link probe since last stats update */
-    private final int mProbeMcsRateSinceLastUpdate;
-    /** Rx link speed at the sample time in Mbps */
-    private final int mRxLinkSpeedMbps;
-    private final @NetworkType int mCellularDataNetworkType;
-    private final int mCellularSignalStrengthDbm;
-    private final int mCellularSignalStrengthDb;
-    private final boolean mIsSameRegisteredCell;
-
-    /** Constructor function {@hide} */
-    public WifiUsabilityStatsEntry(long timeStampMillis, int rssi, int linkSpeedMbps,
-            long totalTxSuccess, long totalTxRetries, long totalTxBad, long totalRxSuccess,
-            long totalRadioOnTimeMillis, long totalRadioTxTimeMillis, long totalRadioRxTimeMillis,
-            long totalScanTimeMillis, long totalNanScanTimeMillis,
-            long totalBackgroundScanTimeMillis,
-            long totalRoamScanTimeMillis, long totalPnoScanTimeMillis,
-            long totalHotspot2ScanTimeMillis,
-            long totalCcaBusyFreqTimeMillis, long totalRadioOnFreqTimeMillis, long totalBeaconRx,
-            @ProbeStatus int probeStatusSinceLastUpdate, int probeElapsedTimeSinceLastUpdateMillis,
-            int probeMcsRateSinceLastUpdate, int rxLinkSpeedMbps,
-            @NetworkType int cellularDataNetworkType,
-            int cellularSignalStrengthDbm, int cellularSignalStrengthDb,
-            boolean isSameRegisteredCell) {
-        mTimeStampMillis = timeStampMillis;
-        mRssi = rssi;
-        mLinkSpeedMbps = linkSpeedMbps;
-        mTotalTxSuccess = totalTxSuccess;
-        mTotalTxRetries = totalTxRetries;
-        mTotalTxBad = totalTxBad;
-        mTotalRxSuccess = totalRxSuccess;
-        mTotalRadioOnTimeMillis = totalRadioOnTimeMillis;
-        mTotalRadioTxTimeMillis = totalRadioTxTimeMillis;
-        mTotalRadioRxTimeMillis = totalRadioRxTimeMillis;
-        mTotalScanTimeMillis = totalScanTimeMillis;
-        mTotalNanScanTimeMillis = totalNanScanTimeMillis;
-        mTotalBackgroundScanTimeMillis = totalBackgroundScanTimeMillis;
-        mTotalRoamScanTimeMillis = totalRoamScanTimeMillis;
-        mTotalPnoScanTimeMillis = totalPnoScanTimeMillis;
-        mTotalHotspot2ScanTimeMillis = totalHotspot2ScanTimeMillis;
-        mTotalCcaBusyFreqTimeMillis = totalCcaBusyFreqTimeMillis;
-        mTotalRadioOnFreqTimeMillis = totalRadioOnFreqTimeMillis;
-        mTotalBeaconRx = totalBeaconRx;
-        mProbeStatusSinceLastUpdate = probeStatusSinceLastUpdate;
-        mProbeElapsedTimeSinceLastUpdateMillis = probeElapsedTimeSinceLastUpdateMillis;
-        mProbeMcsRateSinceLastUpdate = probeMcsRateSinceLastUpdate;
-        mRxLinkSpeedMbps = rxLinkSpeedMbps;
-        mCellularDataNetworkType = cellularDataNetworkType;
-        mCellularSignalStrengthDbm = cellularSignalStrengthDbm;
-        mCellularSignalStrengthDb = cellularSignalStrengthDb;
-        mIsSameRegisteredCell = isSameRegisteredCell;
-    }
-
-    /** Implement the Parcelable interface */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeLong(mTimeStampMillis);
-        dest.writeInt(mRssi);
-        dest.writeInt(mLinkSpeedMbps);
-        dest.writeLong(mTotalTxSuccess);
-        dest.writeLong(mTotalTxRetries);
-        dest.writeLong(mTotalTxBad);
-        dest.writeLong(mTotalRxSuccess);
-        dest.writeLong(mTotalRadioOnTimeMillis);
-        dest.writeLong(mTotalRadioTxTimeMillis);
-        dest.writeLong(mTotalRadioRxTimeMillis);
-        dest.writeLong(mTotalScanTimeMillis);
-        dest.writeLong(mTotalNanScanTimeMillis);
-        dest.writeLong(mTotalBackgroundScanTimeMillis);
-        dest.writeLong(mTotalRoamScanTimeMillis);
-        dest.writeLong(mTotalPnoScanTimeMillis);
-        dest.writeLong(mTotalHotspot2ScanTimeMillis);
-        dest.writeLong(mTotalCcaBusyFreqTimeMillis);
-        dest.writeLong(mTotalRadioOnFreqTimeMillis);
-        dest.writeLong(mTotalBeaconRx);
-        dest.writeInt(mProbeStatusSinceLastUpdate);
-        dest.writeInt(mProbeElapsedTimeSinceLastUpdateMillis);
-        dest.writeInt(mProbeMcsRateSinceLastUpdate);
-        dest.writeInt(mRxLinkSpeedMbps);
-        dest.writeInt(mCellularDataNetworkType);
-        dest.writeInt(mCellularSignalStrengthDbm);
-        dest.writeInt(mCellularSignalStrengthDb);
-        dest.writeBoolean(mIsSameRegisteredCell);
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @android.annotation.NonNull Creator<WifiUsabilityStatsEntry> CREATOR =
-            new Creator<WifiUsabilityStatsEntry>() {
-        public WifiUsabilityStatsEntry createFromParcel(Parcel in) {
-            return new WifiUsabilityStatsEntry(
-                    in.readLong(), in.readInt(),
-                    in.readInt(), in.readLong(), in.readLong(),
-                    in.readLong(), in.readLong(), in.readLong(),
-                    in.readLong(), in.readLong(), in.readLong(),
-                    in.readLong(), in.readLong(), in.readLong(),
-                    in.readLong(), in.readLong(), in.readLong(),
-                    in.readLong(), in.readLong(), in.readInt(),
-                    in.readInt(), in.readInt(), in.readInt(),
-                    in.readInt(), in.readInt(), in.readInt(),
-                    in.readBoolean()
-            );
-        }
-
-        public WifiUsabilityStatsEntry[] newArray(int size) {
-            return new WifiUsabilityStatsEntry[size];
-        }
-    };
-
-    /** Absolute milliseconds from device boot when these stats were sampled */
-    public long getTimeStampMillis() {
-        return mTimeStampMillis;
-    }
-
-    /** The RSSI (in dBm) at the sample time */
-    public int getRssi() {
-        return mRssi;
-    }
-
-    /** Link speed at the sample time in Mbps */
-    public int getLinkSpeedMbps() {
-        return mLinkSpeedMbps;
-    }
-
-    /** The total number of tx success counted from the last radio chip reset */
-    public long getTotalTxSuccess() {
-        return mTotalTxSuccess;
-    }
-
-    /** The total number of MPDU data packet retries counted from the last radio chip reset */
-    public long getTotalTxRetries() {
-        return mTotalTxRetries;
-    }
-
-    /** The total number of tx bad counted from the last radio chip reset */
-    public long getTotalTxBad() {
-        return mTotalTxBad;
-    }
-
-    /** The total number of rx success counted from the last radio chip reset */
-    public long getTotalRxSuccess() {
-        return mTotalRxSuccess;
-    }
-
-    /** The total time the wifi radio is on in ms counted from the last radio chip reset */
-    public long getTotalRadioOnTimeMillis() {
-        return mTotalRadioOnTimeMillis;
-    }
-
-    /** The total time the wifi radio is doing tx in ms counted from the last radio chip reset */
-    public long getTotalRadioTxTimeMillis() {
-        return mTotalRadioTxTimeMillis;
-    }
-
-    /** The total time the wifi radio is doing rx in ms counted from the last radio chip reset */
-    public long getTotalRadioRxTimeMillis() {
-        return mTotalRadioRxTimeMillis;
-    }
-
-    /** The total time spent on all types of scans in ms counted from the last radio chip reset */
-    public long getTotalScanTimeMillis() {
-        return mTotalScanTimeMillis;
-    }
-
-    /** The total time spent on nan scans in ms counted from the last radio chip reset */
-    public long getTotalNanScanTimeMillis() {
-        return mTotalNanScanTimeMillis;
-    }
-
-    /** The total time spent on background scans in ms counted from the last radio chip reset */
-    public long getTotalBackgroundScanTimeMillis() {
-        return mTotalBackgroundScanTimeMillis;
-    }
-
-    /** The total time spent on roam scans in ms counted from the last radio chip reset */
-    public long getTotalRoamScanTimeMillis() {
-        return mTotalRoamScanTimeMillis;
-    }
-
-    /** The total time spent on pno scans in ms counted from the last radio chip reset */
-    public long getTotalPnoScanTimeMillis() {
-        return mTotalPnoScanTimeMillis;
-    }
-
-    /** The total time spent on hotspot2.0 scans and GAS exchange in ms counted from the last radio
-     * chip reset */
-    public long getTotalHotspot2ScanTimeMillis() {
-        return mTotalHotspot2ScanTimeMillis;
-    }
-
-    /** The total time CCA is on busy status on the current frequency in ms counted from the last
-     * radio chip reset */
-    public long getTotalCcaBusyFreqTimeMillis() {
-        return mTotalCcaBusyFreqTimeMillis;
-    }
-
-    /** The total radio on time on the current frequency from the last radio chip reset */
-    public long getTotalRadioOnFreqTimeMillis() {
-        return mTotalRadioOnFreqTimeMillis;
-    }
-
-    /** The total number of beacons received from the last radio chip reset */
-    public long getTotalBeaconRx() {
-        return mTotalBeaconRx;
-    }
-
-    /** The status of link probe since last stats update */
-    @ProbeStatus public int getProbeStatusSinceLastUpdate() {
-        return mProbeStatusSinceLastUpdate;
-    }
-
-    /** The elapsed time of the most recent link probe since last stats update */
-    public int getProbeElapsedTimeSinceLastUpdateMillis() {
-        return mProbeElapsedTimeSinceLastUpdateMillis;
-    }
-
-    /** The MCS rate of the most recent link probe since last stats update */
-    public int getProbeMcsRateSinceLastUpdate() {
-        return mProbeMcsRateSinceLastUpdate;
-    }
-
-    /** Rx link speed at the sample time in Mbps */
-    public int getRxLinkSpeedMbps() {
-        return mRxLinkSpeedMbps;
-    }
-
-    /** Cellular data network type currently in use on the device for data transmission */
-    @NetworkType public int getCellularDataNetworkType() {
-        return mCellularDataNetworkType;
-    }
-
-    /**
-     * Cellular signal strength in dBm, NR: CsiRsrp, LTE: Rsrp, WCDMA/TDSCDMA: Rscp,
-     * CDMA: Rssi, EVDO: Rssi, GSM: Rssi
-     */
-    public int getCellularSignalStrengthDbm() {
-        return mCellularSignalStrengthDbm;
-    }
-
-    /**
-     * Cellular signal strength in dB, NR: CsiSinr, LTE: Rsrq, WCDMA: EcNo, TDSCDMA: invalid,
-     * CDMA: Ecio, EVDO: SNR, GSM: invalid
-     */
-    public int getCellularSignalStrengthDb() {
-        return mCellularSignalStrengthDb;
-    }
-
-    /** Whether the primary registered cell of current entry is same as that of previous entry */
-    public boolean isSameRegisteredCell() {
-        return mIsSameRegisteredCell;
-    }
-}
diff --git a/wifi/java/android/net/wifi/WpsInfo.java b/wifi/java/android/net/wifi/WpsInfo.java
deleted file mode 100644
index 689ace5b..0000000
--- a/wifi/java/android/net/wifi/WpsInfo.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * A class representing Wi-Fi Protected Setup
- *
- * {@see android.net.wifi.p2p.WifiP2pConfig}
- */
-public class WpsInfo implements Parcelable {
-
-    /** Push button configuration */
-    public static final int PBC     = 0;
-    /** Display pin method configuration - pin is generated and displayed on device */
-    public static final int DISPLAY = 1;
-    /** Keypad pin method configuration - pin is entered on device */
-    public static final int KEYPAD  = 2;
-    /** Label pin method configuration - pin is labelled on device */
-    public static final int LABEL   = 3;
-    /** Invalid configuration */
-    public static final int INVALID = 4;
-
-    /** Wi-Fi Protected Setup. www.wi-fi.org/wifi-protected-setup has details */
-    public int setup;
-
-    /** Passed with pin method KEYPAD */
-    public String BSSID;
-
-    /** Passed with pin method configuration */
-    public String pin;
-
-    public WpsInfo() {
-        setup = INVALID;
-        BSSID = null;
-        pin = null;
-    }
-
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append(" setup: ").append(setup);
-        sbuf.append('\n');
-        sbuf.append(" BSSID: ").append(BSSID);
-        sbuf.append('\n');
-        sbuf.append(" pin: ").append(pin);
-        sbuf.append('\n');
-        return sbuf.toString();
-    }
-
-    /** Implement the Parcelable interface */
-    public int describeContents() {
-        return 0;
-    }
-
-    /* Copy constructor */
-    public WpsInfo(WpsInfo source) {
-        if (source != null) {
-            setup = source.setup;
-            BSSID = source.BSSID;
-            pin = source.pin;
-        }
-    }
-
-    /** Implement the Parcelable interface */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(setup);
-        dest.writeString(BSSID);
-        dest.writeString(pin);
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @android.annotation.NonNull Creator<WpsInfo> CREATOR =
-        new Creator<WpsInfo>() {
-            public WpsInfo createFromParcel(Parcel in) {
-                WpsInfo config = new WpsInfo();
-                config.setup = in.readInt();
-                config.BSSID = in.readString();
-                config.pin = in.readString();
-                return config;
-            }
-
-            public WpsInfo[] newArray(int size) {
-                return new WpsInfo[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/aware/AttachCallback.java b/wifi/java/android/net/wifi/aware/AttachCallback.java
deleted file mode 100644
index c368b46..0000000
--- a/wifi/java/android/net/wifi/aware/AttachCallback.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-/**
- * Base class for Aware attach callbacks. Should be extended by applications and set when calling
- * {@link WifiAwareManager#attach(AttachCallback, android.os.Handler)}. These are callbacks
- * applying to the Aware connection as a whole - not to specific publish or subscribe sessions -
- * for that see {@link DiscoverySessionCallback}.
- */
-public class AttachCallback {
-    /**
-     * Called when Aware attach operation
-     * {@link WifiAwareManager#attach(AttachCallback, android.os.Handler)}
-     * is completed and that we can now start discovery sessions or connections.
-     *
-     * @param session The Aware object on which we can execute further Aware operations - e.g.
-     *                discovery, connections.
-     */
-    public void onAttached(WifiAwareSession session) {
-        /* empty */
-    }
-
-    /**
-     * Called when Aware attach operation
-     * {@link WifiAwareManager#attach(AttachCallback, android.os.Handler)} failed.
-     */
-    public void onAttachFailed() {
-        /* empty */
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/Characteristics.java b/wifi/java/android/net/wifi/aware/Characteristics.java
deleted file mode 100644
index d5fd48e..0000000
--- a/wifi/java/android/net/wifi/aware/Characteristics.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.IntDef;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * The characteristics of the Wi-Fi Aware implementation.
- */
-public final class Characteristics implements Parcelable {
-    /** @hide */
-    public static final String KEY_MAX_SERVICE_NAME_LENGTH = "key_max_service_name_length";
-    /** @hide */
-    public static final String KEY_MAX_SERVICE_SPECIFIC_INFO_LENGTH =
-            "key_max_service_specific_info_length";
-    /** @hide */
-    public static final String KEY_MAX_MATCH_FILTER_LENGTH = "key_max_match_filter_length";
-    /** @hide */
-    public static final String KEY_SUPPORTED_CIPHER_SUITES = "key_supported_cipher_suites";
-
-    private Bundle mCharacteristics = new Bundle();
-
-    /** @hide : should not be created by apps */
-    public Characteristics(Bundle characteristics) {
-        mCharacteristics = characteristics;
-    }
-
-    /**
-     * Returns the maximum string length that can be used to specify a Aware service name. Restricts
-     * the parameters of the {@link PublishConfig.Builder#setServiceName(String)} and
-     * {@link SubscribeConfig.Builder#setServiceName(String)}.
-     *
-     * @return A positive integer, maximum string length of Aware service name.
-     */
-    public int getMaxServiceNameLength() {
-        return mCharacteristics.getInt(KEY_MAX_SERVICE_NAME_LENGTH);
-    }
-
-    /**
-     * Returns the maximum length of byte array that can be used to specify a Aware service specific
-     * information field: the arbitrary load used in discovery or the message length of Aware
-     * message exchange. Restricts the parameters of the
-     * {@link PublishConfig.Builder#setServiceSpecificInfo(byte[])},
-     * {@link SubscribeConfig.Builder#setServiceSpecificInfo(byte[])}, and
-     * {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])}
-     * variants.
-     *
-     * @return A positive integer, maximum length of byte array for Aware messaging.
-     */
-    public int getMaxServiceSpecificInfoLength() {
-        return mCharacteristics.getInt(KEY_MAX_SERVICE_SPECIFIC_INFO_LENGTH);
-    }
-
-    /**
-     * Returns the maximum length of byte array that can be used to specify a Aware match filter.
-     * Restricts the parameters of the
-     * {@link PublishConfig.Builder#setMatchFilter(java.util.List)} and
-     * {@link SubscribeConfig.Builder#setMatchFilter(java.util.List)}.
-     *
-     * @return A positive integer, maximum length of byte array for Aware discovery match filter.
-     */
-    public int getMaxMatchFilterLength() {
-        return mCharacteristics.getInt(KEY_MAX_MATCH_FILTER_LENGTH);
-    }
-
-    /** @hide */
-    @IntDef(flag = true, prefix = { "WIFI_AWARE_CIPHER_SUITE_" }, value = {
-            WIFI_AWARE_CIPHER_SUITE_NCS_SK_128,
-            WIFI_AWARE_CIPHER_SUITE_NCS_SK_256,
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface WifiAwareCipherSuites {}
-
-    /**
-     * Wi-Fi Aware supported ciphier suite representing NCS SK 128: 128 bit shared-key.
-     */
-    public static final int WIFI_AWARE_CIPHER_SUITE_NCS_SK_128 = 1 << 0;
-
-    /**
-     * Wi-Fi Aware supported ciphier suite representing NCS SK 256: 256 bit shared-key.
-     */
-    public static final int WIFI_AWARE_CIPHER_SUITE_NCS_SK_256 = 1 << 1;
-
-    /**
-     * Returns the set of cipher suites supported by the device for use in Wi-Fi Aware data-paths.
-     * The device automatically picks the strongest cipher suite when initiating a data-path setup.
-     *
-     * @return A set of flags from {@link #WIFI_AWARE_CIPHER_SUITE_NCS_SK_128}, or
-     * {@link #WIFI_AWARE_CIPHER_SUITE_NCS_SK_256}.
-     */
-    public @WifiAwareCipherSuites int getSupportedCipherSuites() {
-        return mCharacteristics.getInt(KEY_SUPPORTED_CIPHER_SUITES);
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeBundle(mCharacteristics);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    public static final @android.annotation.NonNull Creator<Characteristics> CREATOR =
-            new Creator<Characteristics>() {
-                @Override
-                public Characteristics createFromParcel(Parcel in) {
-                    Characteristics c = new Characteristics(in.readBundle());
-                    return c;
-                }
-
-                @Override
-                public Characteristics[] newArray(int size) {
-                    return new Characteristics[size];
-                }
-            };
-}
diff --git a/wifi/java/android/net/wifi/aware/ConfigRequest.aidl b/wifi/java/android/net/wifi/aware/ConfigRequest.aidl
deleted file mode 100644
index 68a7c85..0000000
--- a/wifi/java/android/net/wifi/aware/ConfigRequest.aidl
+++ /dev/null
@@ -1,19 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-parcelable ConfigRequest;
diff --git a/wifi/java/android/net/wifi/aware/ConfigRequest.java b/wifi/java/android/net/wifi/aware/ConfigRequest.java
deleted file mode 100644
index 61ab92c..0000000
--- a/wifi/java/android/net/wifi/aware/ConfigRequest.java
+++ /dev/null
@@ -1,385 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Arrays;
-
-/**
- * Defines a request object to configure a Wi-Fi Aware network. Built using
- * {@link ConfigRequest.Builder}. Configuration is requested using
- * {@link WifiAwareManager#attach(AttachCallback, android.os.Handler)}.
- * Note that the actual achieved configuration may be different from the
- * requested configuration - since different applications may request different
- * configurations.
- *
- * @hide
- */
-public final class ConfigRequest implements Parcelable {
-    /**
-     * Lower range of possible cluster ID.
-     */
-    public static final int CLUSTER_ID_MIN = 0;
-
-    /**
-     * Upper range of possible cluster ID.
-     */
-    public static final int CLUSTER_ID_MAX = 0xFFFF;
-
-    /**
-     * Indices for configuration variables which are specified per band.
-     */
-    public static final int NAN_BAND_24GHZ = 0;
-    public static final int NAN_BAND_5GHZ = 1;
-    public static final int NAN_BAND_6GHZ = 2;
-
-    /**
-     * Magic values for Discovery Window (DW) interval configuration
-     */
-    public static final int DW_INTERVAL_NOT_INIT = -1;
-    public static final int DW_DISABLE = 0; // only valid for 5GHz
-
-    /**
-     * Indicates whether 5G band support is requested.
-     */
-    public final boolean mSupport5gBand;
-
-    /**
-     * Indicates whether 6G band support is requested.
-     */
-    public final boolean mSupport6gBand;
-
-    /**
-     * Specifies the desired master preference.
-     */
-    public final int mMasterPreference;
-
-    /**
-     * Specifies the desired lower range of the cluster ID. Must be lower then
-     * {@link ConfigRequest#mClusterHigh}.
-     */
-    public final int mClusterLow;
-
-    /**
-     * Specifies the desired higher range of the cluster ID. Must be higher then
-     * {@link ConfigRequest#mClusterLow}.
-     */
-    public final int mClusterHigh;
-
-    /**
-     * Specifies the discovery window interval for the device on NAN_BAND_*.
-     */
-    public final int mDiscoveryWindowInterval[];
-
-    private ConfigRequest(boolean support5gBand, boolean support6gBand, int masterPreference,
-            int clusterLow, int clusterHigh, int[] discoveryWindowInterval) {
-        mSupport5gBand = support5gBand;
-        mSupport6gBand = support6gBand;
-        mMasterPreference = masterPreference;
-        mClusterLow = clusterLow;
-        mClusterHigh = clusterHigh;
-        mDiscoveryWindowInterval = discoveryWindowInterval;
-    }
-
-    @Override
-    public String toString() {
-        return "ConfigRequest [mSupport5gBand=" + mSupport5gBand
-                + ", mSupport6gBand=" + mSupport6gBand
-                + ", mMasterPreference=" + mMasterPreference
-                + ", mClusterLow=" + mClusterLow
-                + ", mClusterHigh=" + mClusterHigh
-                + ", mDiscoveryWindowInterval=" + Arrays.toString(mDiscoveryWindowInterval) + "]";
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mSupport5gBand ? 1 : 0);
-        dest.writeInt(mSupport6gBand ? 1 : 0);
-        dest.writeInt(mMasterPreference);
-        dest.writeInt(mClusterLow);
-        dest.writeInt(mClusterHigh);
-        dest.writeIntArray(mDiscoveryWindowInterval);
-    }
-
-    public static final @android.annotation.NonNull Creator<ConfigRequest> CREATOR = new Creator<ConfigRequest>() {
-        @Override
-        public ConfigRequest[] newArray(int size) {
-            return new ConfigRequest[size];
-        }
-
-        @Override
-        public ConfigRequest createFromParcel(Parcel in) {
-            boolean support5gBand = in.readInt() != 0;
-            boolean support6gBand = in.readInt() != 0;
-            int masterPreference = in.readInt();
-            int clusterLow = in.readInt();
-            int clusterHigh = in.readInt();
-            int discoveryWindowInterval[] = in.createIntArray();
-
-            return new ConfigRequest(support5gBand, support6gBand, masterPreference, clusterLow,
-                    clusterHigh, discoveryWindowInterval);
-        }
-    };
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (!(o instanceof ConfigRequest)) {
-            return false;
-        }
-
-        ConfigRequest lhs = (ConfigRequest) o;
-
-        return mSupport5gBand == lhs.mSupport5gBand
-                && mSupport6gBand == lhs.mSupport6gBand
-                && mMasterPreference == lhs.mMasterPreference
-                && mClusterLow == lhs.mClusterLow && mClusterHigh == lhs.mClusterHigh
-                && Arrays.equals(mDiscoveryWindowInterval, lhs.mDiscoveryWindowInterval);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-
-        result = 31 * result + (mSupport5gBand ? 1 : 0);
-        result = 31 * result + (mSupport6gBand ? 1 : 0);
-        result = 31 * result + mMasterPreference;
-        result = 31 * result + mClusterLow;
-        result = 31 * result + mClusterHigh;
-        result = 31 * result + Arrays.hashCode(mDiscoveryWindowInterval);
-
-        return result;
-    }
-
-    /**
-     * Verifies that the contents of the ConfigRequest are valid. Otherwise
-     * throws an IllegalArgumentException.
-     */
-    public void validate() throws IllegalArgumentException {
-        if (mMasterPreference < 0) {
-            throw new IllegalArgumentException(
-                    "Master Preference specification must be non-negative");
-        }
-        if (mMasterPreference == 1 || mMasterPreference == 255 || mMasterPreference > 255) {
-            throw new IllegalArgumentException("Master Preference specification must not "
-                    + "exceed 255 or use 1 or 255 (reserved values)");
-        }
-        if (mClusterLow < CLUSTER_ID_MIN) {
-            throw new IllegalArgumentException("Cluster specification must be non-negative");
-        }
-        if (mClusterLow > CLUSTER_ID_MAX) {
-            throw new IllegalArgumentException("Cluster specification must not exceed 0xFFFF");
-        }
-        if (mClusterHigh < CLUSTER_ID_MIN) {
-            throw new IllegalArgumentException("Cluster specification must be non-negative");
-        }
-        if (mClusterHigh > CLUSTER_ID_MAX) {
-            throw new IllegalArgumentException("Cluster specification must not exceed 0xFFFF");
-        }
-        if (mClusterLow > mClusterHigh) {
-            throw new IllegalArgumentException(
-                    "Invalid argument combination - must have Cluster Low <= Cluster High");
-        }
-        if (mDiscoveryWindowInterval.length != 3) {
-            throw new IllegalArgumentException(
-                    "Invalid discovery window interval: must have 3 elements (2.4 & 5 & 6");
-        }
-        if (mDiscoveryWindowInterval[NAN_BAND_24GHZ] != DW_INTERVAL_NOT_INIT &&
-                (mDiscoveryWindowInterval[NAN_BAND_24GHZ] < 1 // valid for 2.4GHz: [1-5]
-                || mDiscoveryWindowInterval[NAN_BAND_24GHZ] > 5)) {
-            throw new IllegalArgumentException(
-                    "Invalid discovery window interval for 2.4GHz: valid is UNSET or [1,5]");
-        }
-        if (mDiscoveryWindowInterval[NAN_BAND_5GHZ] != DW_INTERVAL_NOT_INIT &&
-                (mDiscoveryWindowInterval[NAN_BAND_5GHZ] < 0 // valid for 5GHz: [0-5]
-                || mDiscoveryWindowInterval[NAN_BAND_5GHZ] > 5)) {
-            throw new IllegalArgumentException(
-                "Invalid discovery window interval for 5GHz: valid is UNSET or [0,5]");
-        }
-        if (mDiscoveryWindowInterval[NAN_BAND_6GHZ] != DW_INTERVAL_NOT_INIT
-                && (mDiscoveryWindowInterval[NAN_BAND_6GHZ] < 0 // valid for 6GHz: [0-5]
-                || mDiscoveryWindowInterval[NAN_BAND_6GHZ] > 5)) {
-            throw new IllegalArgumentException(
-                "Invalid discovery window interval for 6GHz: valid is UNSET or [0,5]");
-        }
-    }
-
-    /**
-     * Builder used to build {@link ConfigRequest} objects.
-     */
-    public static final class Builder {
-        private boolean mSupport5gBand = true;
-        private boolean mSupport6gBand = false;
-        private int mMasterPreference = 0;
-        private int mClusterLow = CLUSTER_ID_MIN;
-        private int mClusterHigh = CLUSTER_ID_MAX;
-        private int[] mDiscoveryWindowInterval = {DW_INTERVAL_NOT_INIT, DW_INTERVAL_NOT_INIT,
-                DW_INTERVAL_NOT_INIT};
-
-        /**
-         * Specify whether 5G band support is required in this request. Disabled by default.
-         *
-         * @param support5gBand Support for 5G band is required.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setSupport5gBand(boolean support5gBand) {
-            mSupport5gBand = support5gBand;
-            return this;
-        }
-
-        /**
-         * Specify whether 6G band support is required in this request. Disabled by default.
-         *
-         * @param support6gBand Support for 6G band is required.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setSupport6gBand(boolean support6gBand) {
-            mSupport6gBand = support6gBand;
-            return this;
-        }
-
-        /**
-         * Specify the Master Preference requested. The permitted range is 0 (the default) to
-         * 255 with 1 and 255 excluded (reserved).
-         *
-         * @param masterPreference The requested master preference
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setMasterPreference(int masterPreference) {
-            if (masterPreference < 0) {
-                throw new IllegalArgumentException(
-                        "Master Preference specification must be non-negative");
-            }
-            if (masterPreference == 1 || masterPreference == 255 || masterPreference > 255) {
-                throw new IllegalArgumentException("Master Preference specification must not "
-                        + "exceed 255 or use 1 or 255 (reserved values)");
-            }
-
-            mMasterPreference = masterPreference;
-            return this;
-        }
-
-        /**
-         * The Cluster ID is generated randomly for new Aware networks. Specify
-         * the lower range of the cluster ID. The upper range is specified using
-         * the {@link ConfigRequest.Builder#setClusterHigh(int)}. The permitted
-         * range is 0 (the default) to the value specified by
-         * {@link ConfigRequest.Builder#setClusterHigh(int)}. Equality of Low and High is
-         * permitted which restricts the Cluster ID to the specified value.
-         *
-         * @param clusterLow The lower range of the generated cluster ID.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setClusterLow(..).setClusterHigh(..)}.
-         */
-        public Builder setClusterLow(int clusterLow) {
-            if (clusterLow < CLUSTER_ID_MIN) {
-                throw new IllegalArgumentException("Cluster specification must be non-negative");
-            }
-            if (clusterLow > CLUSTER_ID_MAX) {
-                throw new IllegalArgumentException("Cluster specification must not exceed 0xFFFF");
-            }
-
-            mClusterLow = clusterLow;
-            return this;
-        }
-
-        /**
-         * The Cluster ID is generated randomly for new Aware networks. Specify
-         * the lower upper of the cluster ID. The lower range is specified using
-         * the {@link ConfigRequest.Builder#setClusterLow(int)}. The permitted
-         * range is the value specified by
-         * {@link ConfigRequest.Builder#setClusterLow(int)} to 0xFFFF (the default). Equality of
-         * Low and High is permitted which restricts the Cluster ID to the specified value.
-         *
-         * @param clusterHigh The upper range of the generated cluster ID.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setClusterLow(..).setClusterHigh(..)}.
-         */
-        public Builder setClusterHigh(int clusterHigh) {
-            if (clusterHigh < CLUSTER_ID_MIN) {
-                throw new IllegalArgumentException("Cluster specification must be non-negative");
-            }
-            if (clusterHigh > CLUSTER_ID_MAX) {
-                throw new IllegalArgumentException("Cluster specification must not exceed 0xFFFF");
-            }
-
-            mClusterHigh = clusterHigh;
-            return this;
-        }
-
-        /**
-         * The discovery window interval specifies the discovery windows in which the device will be
-         * awake. The configuration enables trading off latency vs. power (higher interval means
-         * higher discovery latency but lower power).
-         *
-         * @param band Either {@link #NAN_BAND_24GHZ} or {@link #NAN_BAND_5GHZ} or
-         *        {@link #NAN_BAND_6GHZ}.
-         * @param interval A value of 1, 2, 3, 4, or 5 indicating an interval of 2^(interval-1). For
-         *                 the 5GHz band a value of 0 indicates that the device will not be awake
-         *                 for any discovery windows.
-         *
-         * @return The builder itself to facilitate chaining operations
-         *         {@code builder.setDiscoveryWindowInterval(...).setMasterPreference(...)}.
-         */
-        public Builder setDiscoveryWindowInterval(int band, int interval) {
-            if (band != NAN_BAND_24GHZ && band != NAN_BAND_5GHZ && band != NAN_BAND_6GHZ) {
-                throw new IllegalArgumentException("Invalid band value");
-            }
-            if ((band == NAN_BAND_24GHZ && (interval < 1 || interval > 5))
-                    || (band == NAN_BAND_5GHZ && (interval < 0 || interval > 5))
-                    || (band == NAN_BAND_6GHZ && (interval < 0 || interval > 5))) {
-                throw new IllegalArgumentException(
-                        "Invalid interval value: 2.4 GHz [1,5] or 5GHz/6GHz [0,5]");
-            }
-
-            mDiscoveryWindowInterval[band] = interval;
-            return this;
-        }
-
-        /**
-         * Build {@link ConfigRequest} given the current requests made on the
-         * builder.
-         */
-        public ConfigRequest build() {
-            if (mClusterLow > mClusterHigh) {
-                throw new IllegalArgumentException(
-                        "Invalid argument combination - must have Cluster Low <= Cluster High");
-            }
-
-            return new ConfigRequest(mSupport5gBand, mSupport6gBand, mMasterPreference, mClusterLow,
-                    mClusterHigh, mDiscoveryWindowInterval);
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/DiscoverySession.java b/wifi/java/android/net/wifi/aware/DiscoverySession.java
deleted file mode 100644
index 4d92ae1..0000000
--- a/wifi/java/android/net/wifi/aware/DiscoverySession.java
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.net.NetworkSpecifier;
-import android.util.CloseGuard;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.lang.ref.Reference;
-import java.lang.ref.WeakReference;
-
-/**
- * A class representing a single publish or subscribe Aware session. This object
- * will not be created directly - only its child classes are available:
- * {@link PublishDiscoverySession} and {@link SubscribeDiscoverySession}. This
- * class provides functionality common to both publish and subscribe discovery sessions:
- * <ul>
- *      <li>Sending messages: {@link #sendMessage(PeerHandle, int, byte[])} method.
- *      <li>Creating a network-specifier when requesting a Aware connection using
- *      {@link WifiAwareNetworkSpecifier.Builder}.
- * </ul>
- * <p>
- * The {@link #close()} method must be called to destroy discovery sessions once they are
- * no longer needed.
- */
-public class DiscoverySession implements AutoCloseable {
-    private static final String TAG = "DiscoverySession";
-    private static final boolean DBG = false;
-    private static final boolean VDBG = false; // STOPSHIP if true
-
-    private static final int MAX_SEND_RETRY_COUNT = 5;
-
-    /** @hide */
-    protected WeakReference<WifiAwareManager> mMgr;
-    /** @hide */
-    protected final int mClientId;
-    /** @hide */
-    protected final int mSessionId;
-    /** @hide */
-    protected boolean mTerminated = false;
-
-    private final CloseGuard mCloseGuard = new CloseGuard();
-
-    /**
-     * Return the maximum permitted retry count when sending messages using
-     * {@link #sendMessage(PeerHandle, int, byte[], int)}.
-     *
-     * @return Maximum retry count when sending messages.
-     *
-     * @hide
-     */
-    public static int getMaxSendRetryCount() {
-        return MAX_SEND_RETRY_COUNT;
-    }
-
-    /** @hide */
-    public DiscoverySession(WifiAwareManager manager, int clientId, int sessionId) {
-        if (VDBG) {
-            Log.v(TAG, "New discovery session created: manager=" + manager + ", clientId="
-                    + clientId + ", sessionId=" + sessionId);
-        }
-
-        mMgr = new WeakReference<>(manager);
-        mClientId = clientId;
-        mSessionId = sessionId;
-
-        mCloseGuard.open("close");
-    }
-
-    /**
-     * Destroy the publish or subscribe session - free any resources, and stop
-     * transmitting packets on-air (for an active session) or listening for
-     * matches (for a passive session). The session may not be used for any
-     * additional operations after its destruction.
-     * <p>
-     *     This operation must be done on a session which is no longer needed. Otherwise system
-     *     resources will continue to be utilized until the application exits. The only
-     *     exception is a session for which we received a termination callback,
-     *     {@link DiscoverySessionCallback#onSessionTerminated()}.
-     */
-    @Override
-    public void close() {
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.w(TAG, "destroy: called post GC on WifiAwareManager");
-            return;
-        }
-        mgr.terminateSession(mClientId, mSessionId);
-        mTerminated = true;
-        mMgr.clear();
-        mCloseGuard.close();
-        Reference.reachabilityFence(this);
-    }
-
-    /**
-     * Sets the status of the session to terminated - i.e. an indication that
-     * already terminated rather than executing a termination.
-     *
-     * @hide
-     */
-    public void setTerminated() {
-        if (mTerminated) {
-            Log.w(TAG, "terminate: already terminated.");
-            return;
-        }
-
-        mTerminated = true;
-        mMgr.clear();
-        mCloseGuard.close();
-    }
-
-    /** @hide */
-    @Override
-    protected void finalize() throws Throwable {
-        try {
-            if (mCloseGuard != null) {
-                mCloseGuard.warnIfOpen();
-            }
-
-            if (!mTerminated) {
-                close();
-            }
-        } finally {
-            super.finalize();
-        }
-    }
-
-    /**
-     * Access the client ID of the Aware session.
-     *
-     * Note: internal visibility for testing.
-     *
-     * @return The internal client ID.
-     *
-     * @hide
-     */
-    @VisibleForTesting
-    public int getClientId() {
-        return mClientId;
-    }
-
-    /**
-     * Access the discovery session ID of the Aware session.
-     *
-     * Note: internal visibility for testing.
-     *
-     * @return The internal discovery session ID.
-     *
-     * @hide
-     */
-    @VisibleForTesting
-    public int getSessionId() {
-        return mSessionId;
-    }
-
-    /**
-     * Sends a message to the specified destination. Aware messages are transmitted in the context
-     * of a discovery session - executed subsequent to a publish/subscribe
-     * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle,
-     * byte[], java.util.List)} event.
-     * <p>
-     *     Aware messages are not guaranteed delivery. Callbacks on
-     *     {@link DiscoverySessionCallback} indicate message was transmitted successfully,
-     *     {@link DiscoverySessionCallback#onMessageSendSucceeded(int)}, or transmission
-     *     failed (possibly after several retries) -
-     *     {@link DiscoverySessionCallback#onMessageSendFailed(int)}.
-     * <p>
-     *     The peer will get a callback indicating a message was received using
-     *     {@link DiscoverySessionCallback#onMessageReceived(PeerHandle,
-     *     byte[])}.
-     *
-     * @param peerHandle The peer's handle for the message. Must be a result of an
-     * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle,
-     * byte[], java.util.List)} or
-     * {@link DiscoverySessionCallback#onMessageReceived(PeerHandle,
-     * byte[])} events.
-     * @param messageId An arbitrary integer used by the caller to identify the message. The same
-     *            integer ID will be returned in the callbacks indicating message send success or
-     *            failure. The {@code messageId} is not used internally by the Aware service - it
-     *                  can be arbitrary and non-unique.
-     * @param message The message to be transmitted.
-     * @param retryCount An integer specifying how many additional service-level (as opposed to PHY
-     *            or MAC level) retries should be attempted if there is no ACK from the receiver
-     *            (note: no retransmissions are attempted in other failure cases). A value of 0
-     *            indicates no retries. Max permitted value is {@link #getMaxSendRetryCount()}.
-     *
-     * @hide
-     */
-    public void sendMessage(@NonNull PeerHandle peerHandle, int messageId,
-            @Nullable byte[] message, int retryCount) {
-        if (mTerminated) {
-            Log.w(TAG, "sendMessage: called on terminated session");
-            return;
-        }
-
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.w(TAG, "sendMessage: called post GC on WifiAwareManager");
-            return;
-        }
-
-        mgr.sendMessage(mClientId, mSessionId, peerHandle, message, messageId, retryCount);
-    }
-
-    /**
-     * Sends a message to the specified destination. Aware messages are transmitted in the context
-     * of a discovery session - executed subsequent to a publish/subscribe
-     * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle,
-     * byte[], java.util.List)} event.
-     * <p>
-     *     Aware messages are not guaranteed delivery. Callbacks on
-     *     {@link DiscoverySessionCallback} indicate message was transmitted successfully,
-     *     {@link DiscoverySessionCallback#onMessageSendSucceeded(int)}, or transmission
-     *     failed (possibly after several retries) -
-     *     {@link DiscoverySessionCallback#onMessageSendFailed(int)}.
-     * <p>
-     * The peer will get a callback indicating a message was received using
-     * {@link DiscoverySessionCallback#onMessageReceived(PeerHandle,
-     * byte[])}.
-     *
-     * @param peerHandle The peer's handle for the message. Must be a result of an
-     * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle,
-     * byte[], java.util.List)} or
-     * {@link DiscoverySessionCallback#onMessageReceived(PeerHandle,
-     * byte[])} events.
-     * @param messageId An arbitrary integer used by the caller to identify the message. The same
-     *            integer ID will be returned in the callbacks indicating message send success or
-     *            failure. The {@code messageId} is not used internally by the Aware service - it
-     *                  can be arbitrary and non-unique.
-     * @param message The message to be transmitted.
-     */
-    public void sendMessage(@NonNull PeerHandle peerHandle, int messageId,
-            @Nullable byte[] message) {
-        sendMessage(peerHandle, messageId, message, 0);
-    }
-
-    /**
-     * Create a {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} for
-     * an unencrypted WiFi Aware connection (link) to the specified peer. The
-     * {@link android.net.NetworkRequest.Builder#addTransportType(int)} should be set to
-     * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_AWARE}.
-     * <p>
-     * This method should be used when setting up a connection with a peer discovered through Aware
-     * discovery or communication (in such scenarios the MAC address of the peer is shielded by
-     * an opaque peer ID handle). If an Aware connection is needed to a peer discovered using other
-     * OOB (out-of-band) mechanism then use the alternative
-     * {@link WifiAwareSession#createNetworkSpecifierOpen(int, byte[])} method - which uses the
-     * peer's MAC address.
-     * <p>
-     * Note: per the Wi-Fi Aware specification the roles are fixed - a Subscriber is an INITIATOR
-     * and a Publisher is a RESPONDER.
-     * <p>
-     * To set up an encrypted link use the
-     * {@link #createNetworkSpecifierPassphrase(PeerHandle, String)} API.
-     * @deprecated Use the replacement {@link WifiAwareNetworkSpecifier.Builder}.
-     *
-     * @param peerHandle The peer's handle obtained through
-     * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle, byte[], java.util.List)}
-     *                   or
-     *                   {@link DiscoverySessionCallback#onMessageReceived(PeerHandle, byte[])}.
-     *                   On a RESPONDER this value is used to gate the acceptance of a connection
-     *                   request from only that peer.
-     *
-     * @return A {@link NetworkSpecifier} to be used to construct
-     * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} to pass to
-     * {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
-     * android.net.ConnectivityManager.NetworkCallback)}
-     * [or other varieties of that API].
-     */
-    @Deprecated
-    public NetworkSpecifier createNetworkSpecifierOpen(@NonNull PeerHandle peerHandle) {
-        if (mTerminated) {
-            Log.w(TAG, "createNetworkSpecifierOpen: called on terminated session");
-            return null;
-        }
-
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.w(TAG, "createNetworkSpecifierOpen: called post GC on WifiAwareManager");
-            return null;
-        }
-
-        int role = this instanceof SubscribeDiscoverySession
-                ? WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR
-                : WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER;
-
-        return mgr.createNetworkSpecifier(mClientId, role, mSessionId, peerHandle, null, null);
-    }
-
-    /**
-     * Create a {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} for
-     * an encrypted WiFi Aware connection (link) to the specified peer. The
-     * {@link android.net.NetworkRequest.Builder#addTransportType(int)} should be set to
-     * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_AWARE}.
-     * <p>
-     * This method should be used when setting up a connection with a peer discovered through Aware
-     * discovery or communication (in such scenarios the MAC address of the peer is shielded by
-     * an opaque peer ID handle). If an Aware connection is needed to a peer discovered using other
-     * OOB (out-of-band) mechanism then use the alternative
-     * {@link WifiAwareSession#createNetworkSpecifierPassphrase(int, byte[], String)} method -
-     * which uses the peer's MAC address.
-     * <p>
-     * Note: per the Wi-Fi Aware specification the roles are fixed - a Subscriber is an INITIATOR
-     * and a Publisher is a RESPONDER.
-     * @deprecated Use the replacement {@link WifiAwareNetworkSpecifier.Builder}.
-     *
-     * @param peerHandle The peer's handle obtained through
-     * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle,
-     * byte[], java.util.List)} or
-     * {@link DiscoverySessionCallback#onMessageReceived(PeerHandle,
-     * byte[])}. On a RESPONDER this value is used to gate the acceptance of a connection request
-     *                   from only that peer.
-     * @param passphrase The passphrase to be used to encrypt the link. The PMK is generated from
-     *                   the passphrase. Use the
-     *                   {@link #createNetworkSpecifierOpen(PeerHandle)} API to
-     *                   specify an open (unencrypted) link.
-     *
-     * @return A {@link NetworkSpecifier} to be used to construct
-     * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} to pass to
-     * {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
-     * android.net.ConnectivityManager.NetworkCallback)}
-     * [or other varieties of that API].
-     */
-    @Deprecated
-    public NetworkSpecifier createNetworkSpecifierPassphrase(
-            @NonNull PeerHandle peerHandle, @NonNull String passphrase) {
-        if (!WifiAwareUtils.validatePassphrase(passphrase)) {
-            throw new IllegalArgumentException("Passphrase must meet length requirements");
-        }
-
-        if (mTerminated) {
-            Log.w(TAG, "createNetworkSpecifierPassphrase: called on terminated session");
-            return null;
-        }
-
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.w(TAG, "createNetworkSpecifierPassphrase: called post GC on WifiAwareManager");
-            return null;
-        }
-
-        int role = this instanceof SubscribeDiscoverySession
-                ? WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR
-                : WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER;
-
-        return mgr.createNetworkSpecifier(mClientId, role, mSessionId, peerHandle, null,
-                passphrase);
-    }
-
-    /**
-     * Create a {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} for
-     * an encrypted WiFi Aware connection (link) to the specified peer. The
-     * {@link android.net.NetworkRequest.Builder#addTransportType(int)} should be set to
-     * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_AWARE}.
-     * <p>
-     * This method should be used when setting up a connection with a peer discovered through Aware
-     * discovery or communication (in such scenarios the MAC address of the peer is shielded by
-     * an opaque peer ID handle). If an Aware connection is needed to a peer discovered using other
-     * OOB (out-of-band) mechanism then use the alternative
-     * {@link WifiAwareSession#createNetworkSpecifierPmk(int, byte[], byte[])} method - which uses
-     * the peer's MAC address.
-     * <p>
-     * Note: per the Wi-Fi Aware specification the roles are fixed - a Subscriber is an INITIATOR
-     * and a Publisher is a RESPONDER.
-     * @deprecated Use the replacement {@link WifiAwareNetworkSpecifier.Builder}.
-     *
-     * @param peerHandle The peer's handle obtained through
-     * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle,
-     * byte[], java.util.List)} or
-     * {@link DiscoverySessionCallback#onMessageReceived(PeerHandle,
-     * byte[])}. On a RESPONDER this value is used to gate the acceptance of a connection request
-     *                   from only that peer.
-     * @param pmk A PMK (pairwise master key, see IEEE 802.11i) specifying the key to use for
-     *            encrypting the data-path. Use the
-     *            {@link #createNetworkSpecifierPassphrase(PeerHandle, String)} to specify a
-     *            Passphrase or {@link #createNetworkSpecifierOpen(PeerHandle)} to specify an
-     *            open (unencrypted) link.
-     *
-     * @return A {@link NetworkSpecifier} to be used to construct
-     * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} to pass to
-     * {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
-     * android.net.ConnectivityManager.NetworkCallback)}
-     * [or other varieties of that API].
-     *
-     * @hide
-     */
-    @Deprecated
-    @SystemApi
-    public NetworkSpecifier createNetworkSpecifierPmk(@NonNull PeerHandle peerHandle,
-            @NonNull byte[] pmk) {
-        if (!WifiAwareUtils.validatePmk(pmk)) {
-            throw new IllegalArgumentException("PMK must 32 bytes");
-        }
-
-        if (mTerminated) {
-            Log.w(TAG, "createNetworkSpecifierPmk: called on terminated session");
-            return null;
-        }
-
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.w(TAG, "createNetworkSpecifierPmk: called post GC on WifiAwareManager");
-            return null;
-        }
-
-        int role = this instanceof SubscribeDiscoverySession
-                ? WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR
-                : WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER;
-
-        return mgr.createNetworkSpecifier(mClientId, role, mSessionId, peerHandle, pmk, null);
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java b/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
deleted file mode 100644
index bfb0462..0000000
--- a/wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.NonNull;
-
-import java.util.List;
-
-/**
- * Base class for Aware session events callbacks. Should be extended by
- * applications wanting notifications. The callbacks are set when a
- * publish or subscribe session is created using
- * {@link WifiAwareSession#publish(PublishConfig, DiscoverySessionCallback,
- * android.os.Handler)} or
- * {@link WifiAwareSession#subscribe(SubscribeConfig, DiscoverySessionCallback,
- * android.os.Handler)}.
- * <p>
- * A single callback is set at session creation - it cannot be replaced.
- */
-public class DiscoverySessionCallback {
-    /**
-     * Called when a publish operation is started successfully in response to a
-     * {@link WifiAwareSession#publish(PublishConfig, DiscoverySessionCallback,
-     * android.os.Handler)} operation.
-     *
-     * @param session The {@link PublishDiscoverySession} used to control the
-     *            discovery session.
-     */
-    public void onPublishStarted(@NonNull PublishDiscoverySession session) {
-        /* empty */
-    }
-
-    /**
-     * Called when a subscribe operation is started successfully in response to a
-     * {@link WifiAwareSession#subscribe(SubscribeConfig, DiscoverySessionCallback,
-     * android.os.Handler)} operation.
-     *
-     * @param session The {@link SubscribeDiscoverySession} used to control the
-     *            discovery session.
-     */
-    public void onSubscribeStarted(@NonNull SubscribeDiscoverySession session) {
-        /* empty */
-    }
-
-    /**
-     * Called when a publish or subscribe discovery session configuration update request
-     * succeeds. Called in response to
-     * {@link PublishDiscoverySession#updatePublish(PublishConfig)} or
-     * {@link SubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}.
-     */
-    public void onSessionConfigUpdated() {
-        /* empty */
-    }
-
-    /**
-     * Called when a publish or subscribe discovery session cannot be created:
-     * {@link WifiAwareSession#publish(PublishConfig, DiscoverySessionCallback,
-     * android.os.Handler)} or
-     * {@link WifiAwareSession#subscribe(SubscribeConfig, DiscoverySessionCallback,
-     * android.os.Handler)}, or when a configuration update fails:
-     * {@link PublishDiscoverySession#updatePublish(PublishConfig)} or
-     * {@link SubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}.
-     * <p>
-     *     For discovery session updates failure leaves the session running with its previous
-     *     configuration - the discovery session is not terminated.
-     */
-    public void onSessionConfigFailed() {
-        /* empty */
-    }
-
-    /**
-     * Called when a discovery session (publish or subscribe) terminates. Termination may be due
-     * to user-request (either directly through {@link DiscoverySession#close()} or
-     * application-specified expiration, e.g. {@link PublishConfig.Builder#setTtlSec(int)}
-     * or {@link SubscribeConfig.Builder#setTtlSec(int)}).
-     */
-    public void onSessionTerminated() {
-        /* empty */
-    }
-
-    /**
-     * Called when a discovery (publish or subscribe) operation results in a
-     * service discovery.
-     * <p>
-     * Note that this method and
-     * {@link #onServiceDiscoveredWithinRange(PeerHandle, byte[], List, int)} may be called
-     * multiple times per service discovery.
-     *
-     * @param peerHandle An opaque handle to the peer matching our discovery operation.
-     * @param serviceSpecificInfo The service specific information (arbitrary
-     *            byte array) provided by the peer as part of its discovery
-     *            configuration.
-     * @param matchFilter The filter which resulted in this service discovery. For
-     * {@link PublishConfig#PUBLISH_TYPE_UNSOLICITED},
-     * {@link SubscribeConfig#SUBSCRIBE_TYPE_PASSIVE} discovery sessions this is the publisher's
-     *                    match filter. For {@link PublishConfig#PUBLISH_TYPE_SOLICITED},
-     *                    {@link SubscribeConfig#SUBSCRIBE_TYPE_ACTIVE} discovery sessions this
-     *                    is the subscriber's match filter.
-     */
-    public void onServiceDiscovered(PeerHandle peerHandle,
-            byte[] serviceSpecificInfo, List<byte[]> matchFilter) {
-        /* empty */
-    }
-
-    /**
-     * Called when a discovery (publish or subscribe) operation results in a
-     * service discovery. Called when a Subscribe service was configured with a range requirement
-     * {@link SubscribeConfig.Builder#setMinDistanceMm(int)} and/or
-     * {@link SubscribeConfig.Builder#setMaxDistanceMm(int)} and the Publish service was configured
-     * with {@link PublishConfig.Builder#setRangingEnabled(boolean)}.
-     * <p>
-     * If either Publisher or Subscriber does not enable Ranging, or if Ranging is temporarily
-     * disabled by the underlying device, service discovery proceeds without ranging and the
-     * {@link #onServiceDiscovered(PeerHandle, byte[], List)} is called.
-     * <p>
-     * Note that this method and {@link #onServiceDiscovered(PeerHandle, byte[], List)} may be
-     * called multiple times per service discovery.
-     *
-     * @param peerHandle An opaque handle to the peer matching our discovery operation.
-     * @param serviceSpecificInfo The service specific information (arbitrary
-     *            byte array) provided by the peer as part of its discovery
-     *            configuration.
-     * @param matchFilter The filter which resulted in this service discovery. For
-     * {@link PublishConfig#PUBLISH_TYPE_UNSOLICITED},
-     * {@link SubscribeConfig#SUBSCRIBE_TYPE_PASSIVE} discovery sessions this is the publisher's
-     *                    match filter. For {@link PublishConfig#PUBLISH_TYPE_SOLICITED},
-     *                    {@link SubscribeConfig#SUBSCRIBE_TYPE_ACTIVE} discovery sessions this
-     *                    is the subscriber's match filter.
-     * @param distanceMm The measured distance to the Publisher in mm. Note: the measured distance
-     *                   may be negative for very close devices.
-     */
-    public void onServiceDiscoveredWithinRange(PeerHandle peerHandle,
-        byte[] serviceSpecificInfo, List<byte[]> matchFilter, int distanceMm) {
-        /* empty */
-    }
-
-    /**
-     * Called in response to
-     * {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])}
-     * when a message is transmitted successfully - i.e. when it was received successfully by the
-     * peer (corresponds to an ACK being received).
-     * <p>
-     * Note that either this callback or
-     * {@link DiscoverySessionCallback#onMessageSendFailed(int)} will be
-     * received - never both.
-     *
-     * @param messageId The arbitrary message ID specified when sending the message.
-     */
-    public void onMessageSendSucceeded(@SuppressWarnings("unused") int messageId) {
-        /* empty */
-    }
-
-    /**
-     * Called when message transmission initiated with
-     * {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])} fails. E.g. when no ACK is
-     * received from the peer.
-     * <p>
-     * Note that either this callback or
-     * {@link DiscoverySessionCallback#onMessageSendSucceeded(int)} will be received
-     * - never both.
-     *
-     * @param messageId The arbitrary message ID specified when sending the message.
-     */
-    public void onMessageSendFailed(@SuppressWarnings("unused") int messageId) {
-        /* empty */
-    }
-
-    /**
-     * Called when a message is received from a discovery session peer - in response to the
-     * peer's {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])}.
-     *
-     * @param peerHandle An opaque handle to the peer matching our discovery operation.
-     * @param message A byte array containing the message.
-     */
-    public void onMessageReceived(PeerHandle peerHandle, byte[] message) {
-        /* empty */
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/IWifiAwareDiscoverySessionCallback.aidl b/wifi/java/android/net/wifi/aware/IWifiAwareDiscoverySessionCallback.aidl
deleted file mode 100644
index 421a8af..0000000
--- a/wifi/java/android/net/wifi/aware/IWifiAwareDiscoverySessionCallback.aidl
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-/**
- * Callback interface that WifiAwareManager implements
- *
- * {@hide}
- */
-oneway interface IWifiAwareDiscoverySessionCallback
-{
-    void onSessionStarted(int discoverySessionId);
-    void onSessionConfigSuccess();
-    void onSessionConfigFail(int reason);
-    void onSessionTerminated(int reason);
-
-    void onMatch(int peerId, in byte[] serviceSpecificInfo, in byte[] matchFilter);
-    void onMatchWithDistance(int peerId, in byte[] serviceSpecificInfo, in byte[] matchFilter,
-            int distanceMm);
-
-    void onMessageSendSuccess(int messageId);
-    void onMessageSendFail(int messageId, int reason);
-    void onMessageReceived(int peerId, in byte[] message);
-}
diff --git a/wifi/java/android/net/wifi/aware/IWifiAwareEventCallback.aidl b/wifi/java/android/net/wifi/aware/IWifiAwareEventCallback.aidl
deleted file mode 100644
index b646567..0000000
--- a/wifi/java/android/net/wifi/aware/IWifiAwareEventCallback.aidl
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.net.wifi.aware.ConfigRequest;
-
-/**
- * Callback interface that WifiAwareManager implements
- *
- * {@hide}
- */
-oneway interface IWifiAwareEventCallback
-{
-    void onConnectSuccess(int clientId);
-    void onConnectFail(int reason);
-    void onIdentityChanged(in byte[] mac);
-}
diff --git a/wifi/java/android/net/wifi/aware/IWifiAwareMacAddressProvider.aidl b/wifi/java/android/net/wifi/aware/IWifiAwareMacAddressProvider.aidl
deleted file mode 100644
index 0e7289c..0000000
--- a/wifi/java/android/net/wifi/aware/IWifiAwareMacAddressProvider.aidl
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-/**
- * Callback for IWifiAwareManager.getMacAddressFromPeerHandle
- *
- * @hide
- */
-oneway interface IWifiAwareMacAddressProvider
-{
-    void macAddress(in Map peerIdToMacMap);
-}
diff --git a/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl b/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl
deleted file mode 100644
index 88f95ad..0000000
--- a/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.app.PendingIntent;
-
-import android.net.wifi.aware.ConfigRequest;
-import android.net.wifi.aware.IWifiAwareDiscoverySessionCallback;
-import android.net.wifi.aware.IWifiAwareEventCallback;
-import android.net.wifi.aware.IWifiAwareMacAddressProvider;
-import android.net.wifi.aware.PublishConfig;
-import android.net.wifi.aware.SubscribeConfig;
-import android.net.wifi.aware.Characteristics;
-
-/**
- * Interface that WifiAwareService implements
- *
- * {@hide}
- */
-interface IWifiAwareManager
-{
-    // Aware API
-    boolean isUsageEnabled();
-    Characteristics getCharacteristics();
-
-    // client API
-    void connect(in IBinder binder, in String callingPackage, in String callingFeatureId,
-            in IWifiAwareEventCallback callback, in ConfigRequest configRequest,
-            boolean notifyOnIdentityChanged);
-    void disconnect(int clientId, in IBinder binder);
-
-    void publish(in String callingPackage, in String callingFeatureId, int clientId,
-            in PublishConfig publishConfig, in IWifiAwareDiscoverySessionCallback callback);
-    void subscribe(in String callingPackage, in String callingFeatureId, int clientId,
-            in SubscribeConfig subscribeConfig, in IWifiAwareDiscoverySessionCallback callback);
-
-    // session API
-    void updatePublish(int clientId, int discoverySessionId, in PublishConfig publishConfig);
-    void updateSubscribe(int clientId, int discoverySessionId, in SubscribeConfig subscribeConfig);
-    void sendMessage(int clientId, int discoverySessionId, int peerId, in byte[] message,
-        int messageId, int retryCount);
-    void terminateSession(int clientId, int discoverySessionId);
-
-    // internal APIs: intended to be used between System Services (restricted permissions)
-    void requestMacAddresses(int uid, in List peerIds, in IWifiAwareMacAddressProvider callback);
-}
diff --git a/wifi/java/android/net/wifi/aware/IdentityChangedListener.java b/wifi/java/android/net/wifi/aware/IdentityChangedListener.java
deleted file mode 100644
index a8b19b3..0000000
--- a/wifi/java/android/net/wifi/aware/IdentityChangedListener.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-/**
- * Base class for a listener which is called with the MAC address of the Aware interface whenever
- * it is changed. Change may be due to device joining a cluster, starting a cluster, or discovery
- * interface change (addresses are randomized at regular intervals). The implication is that
- * peers you've been communicating with may no longer recognize you and you need to re-establish
- * your identity - e.g. by starting a discovery session. This actual MAC address of the
- * interface may also be useful if the application uses alternative (non-Aware) discovery but needs
- * to set up a Aware connection. The provided Aware discovery interface MAC address can then be used
- * in {@link WifiAwareSession#createNetworkSpecifierOpen(int, byte[])} or
- * {@link WifiAwareSession#createNetworkSpecifierPassphrase(int, byte[], String)}.
- */
-public class IdentityChangedListener {
-    /**
-     * @param mac The MAC address of the Aware discovery interface. The application must have the
-     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} to get the actual MAC address,
-     *            otherwise all 0's will be provided.
-     */
-    public void onIdentityChanged(byte[] mac) {
-        /* empty */
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/ParcelablePeerHandle.java b/wifi/java/android/net/wifi/aware/ParcelablePeerHandle.java
deleted file mode 100644
index ca473db..0000000
--- a/wifi/java/android/net/wifi/aware/ParcelablePeerHandle.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.NonNull;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-/**
- * A Parcelable {@link PeerHandle}. Can be constructed from a {@code PeerHandle} and then passed
- * to any of the APIs which take a {@code PeerHandle} as inputs.
- */
-public final class ParcelablePeerHandle extends PeerHandle implements Parcelable {
-    /**
-     * Construct a parcelable version of {@link PeerHandle}.
-     *
-     * @param peerHandle The {@link PeerHandle} to be made parcelable.
-     */
-    public ParcelablePeerHandle(@NonNull PeerHandle peerHandle) {
-        super(peerHandle.peerId);
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(peerId);
-    }
-
-    public static final @android.annotation.NonNull Creator<ParcelablePeerHandle> CREATOR =
-            new Creator<ParcelablePeerHandle>() {
-                @Override
-                public ParcelablePeerHandle[] newArray(int size) {
-                    return new ParcelablePeerHandle[size];
-                }
-
-                @Override
-                public ParcelablePeerHandle createFromParcel(Parcel in) {
-                    int peerHandle = in.readInt();
-                    return new ParcelablePeerHandle(new PeerHandle(peerHandle));
-                }
-            };
-}
diff --git a/wifi/java/android/net/wifi/aware/PeerHandle.java b/wifi/java/android/net/wifi/aware/PeerHandle.java
deleted file mode 100644
index 422e177..0000000
--- a/wifi/java/android/net/wifi/aware/PeerHandle.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-/**
- * Opaque object used to represent a Wi-Fi Aware peer. Obtained from discovery sessions in
- * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle, byte[], java.util.List)} or
- * received messages in {@link DiscoverySessionCallback#onMessageReceived(PeerHandle, byte[])}, and
- * used when sending messages e,g, {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])},
- * or when configuring a network link to a peer, e.g.
- * {@link DiscoverySession#createNetworkSpecifierOpen(PeerHandle)} or
- * {@link DiscoverySession#createNetworkSpecifierPassphrase(PeerHandle, String)}.
- * <p>
- * Note that while a {@code PeerHandle} can be used to track a particular peer (i.e. you can compare
- * the values received from subsequent messages) - it is good practice not to rely on it. Instead
- * use an application level peer identifier encoded in the message,
- * {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])}, and/or in the Publish
- * configuration's service-specific information field,
- * {@link PublishConfig.Builder#setServiceSpecificInfo(byte[])}, or match filter,
- * {@link PublishConfig.Builder#setMatchFilter(java.util.List)}.
- * <p>A parcelable handle object is available with {@link ParcelablePeerHandle}.
- */
-public class PeerHandle {
-    /** @hide */
-    public PeerHandle(int peerId) {
-        this.peerId = peerId;
-    }
-
-    /** @hide */
-    public int peerId;
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (!(o instanceof PeerHandle)) {
-            return false;
-        }
-
-        return peerId == ((PeerHandle) o).peerId;
-    }
-
-    @Override
-    public int hashCode() {
-        return peerId;
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/PublishConfig.java b/wifi/java/android/net/wifi/aware/PublishConfig.java
deleted file mode 100644
index a8844c1..0000000
--- a/wifi/java/android/net/wifi/aware/PublishConfig.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.net.wifi.util.HexEncoding;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Defines the configuration of a Aware publish session. Built using
- * {@link PublishConfig.Builder}. A publish session is created using
- * {@link WifiAwareSession#publish(PublishConfig, DiscoverySessionCallback,
- * android.os.Handler)} or updated using
- * {@link PublishDiscoverySession#updatePublish(PublishConfig)}.
- */
-public final class PublishConfig implements Parcelable {
-    /** @hide */
-    @IntDef({
-            PUBLISH_TYPE_UNSOLICITED, PUBLISH_TYPE_SOLICITED })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface PublishTypes {
-    }
-
-    /**
-     * Defines an unsolicited publish session - a publish session where the publisher is
-     * advertising itself by broadcasting on-the-air. An unsolicited publish session is paired
-     * with an passive subscribe session {@link SubscribeConfig#SUBSCRIBE_TYPE_PASSIVE}.
-     * Configuration is done using {@link PublishConfig.Builder#setPublishType(int)}.
-     */
-    public static final int PUBLISH_TYPE_UNSOLICITED = 0;
-
-    /**
-     * Defines a solicited publish session - a publish session which is silent, waiting for a
-     * matching active subscribe session - and responding to it in unicast. A
-     * solicited publish session is paired with an active subscribe session
-     * {@link SubscribeConfig#SUBSCRIBE_TYPE_ACTIVE}. Configuration is done using
-     * {@link PublishConfig.Builder#setPublishType(int)}.
-     */
-    public static final int PUBLISH_TYPE_SOLICITED = 1;
-
-    /** @hide */
-    public final byte[] mServiceName;
-
-    /** @hide */
-    public final byte[] mServiceSpecificInfo;
-
-    /** @hide */
-    public final byte[] mMatchFilter;
-
-    /** @hide */
-    public final int mPublishType;
-
-    /** @hide */
-    public final int mTtlSec;
-
-    /** @hide */
-    public final boolean mEnableTerminateNotification;
-
-    /** @hide */
-    public final boolean mEnableRanging;
-
-    /** @hide */
-    public PublishConfig(byte[] serviceName, byte[] serviceSpecificInfo, byte[] matchFilter,
-            int publishType, int ttlSec, boolean enableTerminateNotification,
-            boolean enableRanging) {
-        mServiceName = serviceName;
-        mServiceSpecificInfo = serviceSpecificInfo;
-        mMatchFilter = matchFilter;
-        mPublishType = publishType;
-        mTtlSec = ttlSec;
-        mEnableTerminateNotification = enableTerminateNotification;
-        mEnableRanging = enableRanging;
-    }
-
-    @Override
-    public String toString() {
-        return "PublishConfig [mServiceName='" + (mServiceName == null ? "<null>" : String.valueOf(
-                HexEncoding.encode(mServiceName))) + ", mServiceName.length=" + (
-                mServiceName == null ? 0 : mServiceName.length) + ", mServiceSpecificInfo='" + (
-                (mServiceSpecificInfo == null) ? "<null>" : String.valueOf(
-                        HexEncoding.encode(mServiceSpecificInfo)))
-                + ", mServiceSpecificInfo.length=" + (mServiceSpecificInfo == null ? 0
-                : mServiceSpecificInfo.length) + ", mMatchFilter="
-                + (new TlvBufferUtils.TlvIterable(0, 1, mMatchFilter)).toString()
-                + ", mMatchFilter.length=" + (mMatchFilter == null ? 0 : mMatchFilter.length)
-                + ", mPublishType=" + mPublishType + ", mTtlSec=" + mTtlSec
-                + ", mEnableTerminateNotification=" + mEnableTerminateNotification
-                + ", mEnableRanging=" + mEnableRanging + "]";
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeByteArray(mServiceName);
-        dest.writeByteArray(mServiceSpecificInfo);
-        dest.writeByteArray(mMatchFilter);
-        dest.writeInt(mPublishType);
-        dest.writeInt(mTtlSec);
-        dest.writeInt(mEnableTerminateNotification ? 1 : 0);
-        dest.writeInt(mEnableRanging ? 1 : 0);
-    }
-
-    public static final @android.annotation.NonNull Creator<PublishConfig> CREATOR = new Creator<PublishConfig>() {
-        @Override
-        public PublishConfig[] newArray(int size) {
-            return new PublishConfig[size];
-        }
-
-        @Override
-        public PublishConfig createFromParcel(Parcel in) {
-            byte[] serviceName = in.createByteArray();
-            byte[] ssi = in.createByteArray();
-            byte[] matchFilter = in.createByteArray();
-            int publishType = in.readInt();
-            int ttlSec = in.readInt();
-            boolean enableTerminateNotification = in.readInt() != 0;
-            boolean enableRanging = in.readInt() != 0;
-
-            return new PublishConfig(serviceName, ssi, matchFilter, publishType,
-                    ttlSec, enableTerminateNotification, enableRanging);
-        }
-    };
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (!(o instanceof PublishConfig)) {
-            return false;
-        }
-
-        PublishConfig lhs = (PublishConfig) o;
-
-        return Arrays.equals(mServiceName, lhs.mServiceName) && Arrays.equals(mServiceSpecificInfo,
-                lhs.mServiceSpecificInfo) && Arrays.equals(mMatchFilter, lhs.mMatchFilter)
-                && mPublishType == lhs.mPublishType
-                && mTtlSec == lhs.mTtlSec
-                && mEnableTerminateNotification == lhs.mEnableTerminateNotification
-                && mEnableRanging == lhs.mEnableRanging;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(Arrays.hashCode(mServiceName), Arrays.hashCode(mServiceSpecificInfo),
-                Arrays.hashCode(mMatchFilter), mPublishType, mTtlSec, mEnableTerminateNotification,
-                mEnableRanging);
-    }
-
-    /**
-     * Verifies that the contents of the PublishConfig are valid. Otherwise
-     * throws an IllegalArgumentException.
-     *
-     * @hide
-     */
-    public void assertValid(Characteristics characteristics, boolean rttSupported)
-            throws IllegalArgumentException {
-        WifiAwareUtils.validateServiceName(mServiceName);
-
-        if (!TlvBufferUtils.isValid(mMatchFilter, 0, 1)) {
-            throw new IllegalArgumentException(
-                    "Invalid txFilter configuration - LV fields do not match up to length");
-        }
-        if (mPublishType < PUBLISH_TYPE_UNSOLICITED || mPublishType > PUBLISH_TYPE_SOLICITED) {
-            throw new IllegalArgumentException("Invalid publishType - " + mPublishType);
-        }
-        if (mTtlSec < 0) {
-            throw new IllegalArgumentException("Invalid ttlSec - must be non-negative");
-        }
-
-        if (characteristics != null) {
-            int maxServiceNameLength = characteristics.getMaxServiceNameLength();
-            if (maxServiceNameLength != 0 && mServiceName.length > maxServiceNameLength) {
-                throw new IllegalArgumentException(
-                        "Service name longer than supported by device characteristics");
-            }
-            int maxServiceSpecificInfoLength = characteristics.getMaxServiceSpecificInfoLength();
-            if (maxServiceSpecificInfoLength != 0 && mServiceSpecificInfo != null
-                    && mServiceSpecificInfo.length > maxServiceSpecificInfoLength) {
-                throw new IllegalArgumentException(
-                        "Service specific info longer than supported by device characteristics");
-            }
-            int maxMatchFilterLength = characteristics.getMaxMatchFilterLength();
-            if (maxMatchFilterLength != 0 && mMatchFilter != null
-                    && mMatchFilter.length > maxMatchFilterLength) {
-                throw new IllegalArgumentException(
-                        "Match filter longer than supported by device characteristics");
-            }
-        }
-
-        if (!rttSupported && mEnableRanging) {
-            throw new IllegalArgumentException("Ranging is not supported");
-        }
-    }
-
-    /**
-     * Builder used to build {@link PublishConfig} objects.
-     */
-    public static final class Builder {
-        private byte[] mServiceName;
-        private byte[] mServiceSpecificInfo;
-        private byte[] mMatchFilter;
-        private int mPublishType = PUBLISH_TYPE_UNSOLICITED;
-        private int mTtlSec = 0;
-        private boolean mEnableTerminateNotification = true;
-        private boolean mEnableRanging = false;
-
-        /**
-         * Specify the service name of the publish session. The actual on-air
-         * value is a 6 byte hashed representation of this string.
-         * <p>
-         * The Service Name is a UTF-8 encoded string from 1 to 255 bytes in length.
-         * The only acceptable single-byte UTF-8 symbols for a Service Name are alphanumeric
-         * values (A-Z, a-z, 0-9), the hyphen ('-'), and the period ('.'). All valid multi-byte
-         * UTF-8 characters are acceptable in a Service Name.
-         * <p>
-         * Must be called - an empty ServiceName is not valid.
-         *
-         * @param serviceName The service name for the publish session.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setServiceName(@NonNull String serviceName) {
-            if (serviceName == null) {
-                throw new IllegalArgumentException("Invalid service name - must be non-null");
-            }
-            mServiceName = serviceName.getBytes(StandardCharsets.UTF_8);
-            return this;
-        }
-
-        /**
-         * Specify service specific information for the publish session. This is
-         * a free-form byte array available to the application to send
-         * additional information as part of the discovery operation - it
-         * will not be used to determine whether a publish/subscribe match
-         * occurs.
-         * <p>
-         *     Optional. Empty by default.
-         *
-         * @param serviceSpecificInfo A byte-array for the service-specific
-         *            information field.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setServiceSpecificInfo(@Nullable byte[] serviceSpecificInfo) {
-            mServiceSpecificInfo = serviceSpecificInfo;
-            return this;
-        }
-
-        /**
-         * The match filter for a publish session. Used to determine whether a service
-         * discovery occurred - in addition to relying on the service name.
-         * <p>
-         *     Optional. Empty by default.
-         *
-         * @param matchFilter A list of match filter entries (each of which is an arbitrary byte
-         *                    array).
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setMatchFilter(@Nullable List<byte[]> matchFilter) {
-            mMatchFilter = new TlvBufferUtils.TlvConstructor(0, 1).allocateAndPut(
-                    matchFilter).getArray();
-            return this;
-        }
-
-        /**
-         * Specify the type of the publish session: solicited (aka active - publish
-         * packets are transmitted over-the-air), or unsolicited (aka passive -
-         * no publish packets are transmitted, a match is made against an active
-         * subscribe session whose packets are transmitted over-the-air).
-         *
-         * @param publishType Publish session type:
-         *            {@link PublishConfig#PUBLISH_TYPE_SOLICITED} or
-         *            {@link PublishConfig#PUBLISH_TYPE_UNSOLICITED} (the default).
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setPublishType(@PublishTypes int publishType) {
-            if (publishType < PUBLISH_TYPE_UNSOLICITED || publishType > PUBLISH_TYPE_SOLICITED) {
-                throw new IllegalArgumentException("Invalid publishType - " + publishType);
-            }
-            mPublishType = publishType;
-            return this;
-        }
-
-        /**
-         * Sets the time interval (in seconds) an unsolicited (
-         * {@link PublishConfig.Builder#setPublishType(int)}) publish session
-         * will be alive - broadcasting a packet. When the TTL is reached
-         * an event will be generated for
-         * {@link DiscoverySessionCallback#onSessionTerminated()} [unless
-         * {@link #setTerminateNotificationEnabled(boolean)} disables the callback].
-         * <p>
-         *     Optional. 0 by default - indicating the session doesn't terminate on its own.
-         *     Session will be terminated when {@link DiscoverySession#close()} is
-         *     called.
-         *
-         * @param ttlSec Lifetime of a publish session in seconds.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setTtlSec(int ttlSec) {
-            if (ttlSec < 0) {
-                throw new IllegalArgumentException("Invalid ttlSec - must be non-negative");
-            }
-            mTtlSec = ttlSec;
-            return this;
-        }
-
-        /**
-         * Configure whether a publish terminate notification
-         * {@link DiscoverySessionCallback#onSessionTerminated()} is reported
-         * back to the callback.
-         *
-         * @param enable If true the terminate callback will be called when the
-         *            publish is terminated. Otherwise it will not be called.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setTerminateNotificationEnabled(boolean enable) {
-            mEnableTerminateNotification = enable;
-            return this;
-        }
-
-        /**
-         * Configure whether the publish discovery session supports ranging and allows peers to
-         * measure distance to it. This API is used in conjunction with
-         * {@link SubscribeConfig.Builder#setMinDistanceMm(int)} and
-         * {@link SubscribeConfig.Builder#setMaxDistanceMm(int)} to specify a minimum and/or
-         * maximum distance at which discovery will be triggered.
-         * <p>
-         * Optional. Disabled by default - i.e. any peer attempt to measure distance to this device
-         * will be refused and discovery will proceed without ranging constraints.
-         * <p>
-         * The device must support Wi-Fi RTT for this feature to be used. Feature support is checked
-         * as described in {@link android.net.wifi.rtt}.
-         *
-         * @param enable If true, ranging is supported on request of the peer.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setRangingEnabled(boolean enable) {
-            mEnableRanging = enable;
-            return this;
-        }
-
-        /**
-         * Build {@link PublishConfig} given the current requests made on the
-         * builder.
-         */
-        public PublishConfig build() {
-            return new PublishConfig(mServiceName, mServiceSpecificInfo, mMatchFilter, mPublishType,
-                    mTtlSec, mEnableTerminateNotification, mEnableRanging);
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/PublishDiscoverySession.java b/wifi/java/android/net/wifi/aware/PublishDiscoverySession.java
deleted file mode 100644
index 1c99c87..0000000
--- a/wifi/java/android/net/wifi/aware/PublishDiscoverySession.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.NonNull;
-import android.util.Log;
-
-/**
- * A class representing a Aware publish session. Created when
- * {@link WifiAwareSession#publish(PublishConfig, DiscoverySessionCallback,
- * android.os.Handler)} is called and a discovery session is created and returned in
- * {@link DiscoverySessionCallback#onPublishStarted(PublishDiscoverySession)}. See
- * baseline functionality of all discovery sessions in {@link DiscoverySession}. This
- * object allows updating an existing/running publish discovery session using
- * {@link #updatePublish(PublishConfig)}.
- */
-public class PublishDiscoverySession extends DiscoverySession {
-    private static final String TAG = "PublishDiscoverySession";
-
-    /** @hide */
-    public PublishDiscoverySession(WifiAwareManager manager, int clientId, int sessionId) {
-        super(manager, clientId, sessionId);
-    }
-
-    /**
-     * Re-configure the currently active publish session. The
-     * {@link DiscoverySessionCallback} is not replaced - the same listener used
-     * at creation is still used. The results of the configuration are returned using
-     * {@link DiscoverySessionCallback}:
-     * <ul>
-     *     <li>{@link DiscoverySessionCallback#onSessionConfigUpdated()}: configuration
-     *     update succeeded.
-     *     <li>{@link DiscoverySessionCallback#onSessionConfigFailed()}: configuration
-     *     update failed. The publish discovery session is still running using its previous
-     *     configuration (i.e. update failure does not terminate the session).
-     * </ul>
-     *
-     * @param publishConfig The new discovery publish session configuration ({@link PublishConfig}).
-     */
-    public void updatePublish(@NonNull PublishConfig publishConfig) {
-        if (mTerminated) {
-            Log.w(TAG, "updatePublish: called on terminated session");
-            return;
-        } else {
-            WifiAwareManager mgr = mMgr.get();
-            if (mgr == null) {
-                Log.w(TAG, "updatePublish: called post GC on WifiAwareManager");
-                return;
-            }
-
-            mgr.updatePublish(mClientId, mSessionId, publishConfig);
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/SubscribeConfig.java b/wifi/java/android/net/wifi/aware/SubscribeConfig.java
deleted file mode 100644
index 76780f4..0000000
--- a/wifi/java/android/net/wifi/aware/SubscribeConfig.java
+++ /dev/null
@@ -1,497 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.net.wifi.util.HexEncoding;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Defines the configuration of a Aware subscribe session. Built using
- * {@link SubscribeConfig.Builder}. Subscribe is done using
- * {@link WifiAwareSession#subscribe(SubscribeConfig, DiscoverySessionCallback,
- * android.os.Handler)} or
- * {@link SubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}.
- */
-public final class SubscribeConfig implements Parcelable {
-    /** @hide */
-    @IntDef({
-            SUBSCRIBE_TYPE_PASSIVE, SUBSCRIBE_TYPE_ACTIVE })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface SubscribeTypes {
-    }
-
-    /**
-     * Defines a passive subscribe session - a subscribe session where
-     * subscribe packets are not transmitted over-the-air and the device listens
-     * and matches to transmitted publish packets. Configuration is done using
-     * {@link SubscribeConfig.Builder#setSubscribeType(int)}.
-     */
-    public static final int SUBSCRIBE_TYPE_PASSIVE = 0;
-
-    /**
-     * Defines an active subscribe session - a subscribe session where
-     * subscribe packets are transmitted over-the-air. Configuration is done
-     * using {@link SubscribeConfig.Builder#setSubscribeType(int)}.
-     */
-    public static final int SUBSCRIBE_TYPE_ACTIVE = 1;
-
-    /** @hide */
-    public final byte[] mServiceName;
-
-    /** @hide */
-    public final byte[] mServiceSpecificInfo;
-
-    /** @hide */
-    public final byte[] mMatchFilter;
-
-    /** @hide */
-    public final int mSubscribeType;
-
-    /** @hide */
-    public final int mTtlSec;
-
-    /** @hide */
-    public final boolean mEnableTerminateNotification;
-
-    /** @hide */
-    public final boolean mMinDistanceMmSet;
-
-    /** @hide */
-    public final int mMinDistanceMm;
-
-    /** @hide */
-    public final boolean mMaxDistanceMmSet;
-
-    /** @hide */
-    public final int mMaxDistanceMm;
-
-    /** @hide */
-    public SubscribeConfig(byte[] serviceName, byte[] serviceSpecificInfo, byte[] matchFilter,
-            int subscribeType, int ttlSec, boolean enableTerminateNotification,
-            boolean minDistanceMmSet, int minDistanceMm, boolean maxDistanceMmSet,
-            int maxDistanceMm) {
-        mServiceName = serviceName;
-        mServiceSpecificInfo = serviceSpecificInfo;
-        mMatchFilter = matchFilter;
-        mSubscribeType = subscribeType;
-        mTtlSec = ttlSec;
-        mEnableTerminateNotification = enableTerminateNotification;
-        mMinDistanceMm = minDistanceMm;
-        mMinDistanceMmSet = minDistanceMmSet;
-        mMaxDistanceMm = maxDistanceMm;
-        mMaxDistanceMmSet = maxDistanceMmSet;
-    }
-
-    @Override
-    public String toString() {
-        return "SubscribeConfig [mServiceName='" + (mServiceName == null ? "<null>"
-                : String.valueOf(HexEncoding.encode(mServiceName))) + ", mServiceName.length=" + (
-                mServiceName == null ? 0 : mServiceName.length) + ", mServiceSpecificInfo='" + (
-                (mServiceSpecificInfo == null) ? "<null>" : String.valueOf(
-                        HexEncoding.encode(mServiceSpecificInfo)))
-                + ", mServiceSpecificInfo.length=" + (mServiceSpecificInfo == null ? 0
-                : mServiceSpecificInfo.length) + ", mMatchFilter="
-                + (new TlvBufferUtils.TlvIterable(0, 1, mMatchFilter)).toString()
-                + ", mMatchFilter.length=" + (mMatchFilter == null ? 0 : mMatchFilter.length)
-                + ", mSubscribeType=" + mSubscribeType + ", mTtlSec=" + mTtlSec
-                + ", mEnableTerminateNotification=" + mEnableTerminateNotification
-                + ", mMinDistanceMm=" + mMinDistanceMm
-                + ", mMinDistanceMmSet=" + mMinDistanceMmSet
-                + ", mMaxDistanceMm=" + mMaxDistanceMm
-                + ", mMaxDistanceMmSet=" + mMaxDistanceMmSet + "]";
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeByteArray(mServiceName);
-        dest.writeByteArray(mServiceSpecificInfo);
-        dest.writeByteArray(mMatchFilter);
-        dest.writeInt(mSubscribeType);
-        dest.writeInt(mTtlSec);
-        dest.writeInt(mEnableTerminateNotification ? 1 : 0);
-        dest.writeInt(mMinDistanceMm);
-        dest.writeInt(mMinDistanceMmSet ? 1 : 0);
-        dest.writeInt(mMaxDistanceMm);
-        dest.writeInt(mMaxDistanceMmSet ? 1 : 0);
-    }
-
-    public static final @android.annotation.NonNull Creator<SubscribeConfig> CREATOR = new Creator<SubscribeConfig>() {
-        @Override
-        public SubscribeConfig[] newArray(int size) {
-            return new SubscribeConfig[size];
-        }
-
-        @Override
-        public SubscribeConfig createFromParcel(Parcel in) {
-            byte[] serviceName = in.createByteArray();
-            byte[] ssi = in.createByteArray();
-            byte[] matchFilter = in.createByteArray();
-            int subscribeType = in.readInt();
-            int ttlSec = in.readInt();
-            boolean enableTerminateNotification = in.readInt() != 0;
-            int minDistanceMm = in.readInt();
-            boolean minDistanceMmSet = in.readInt() != 0;
-            int maxDistanceMm = in.readInt();
-            boolean maxDistanceMmSet = in.readInt() != 0;
-
-            return new SubscribeConfig(serviceName, ssi, matchFilter, subscribeType, ttlSec,
-                    enableTerminateNotification, minDistanceMmSet, minDistanceMm, maxDistanceMmSet,
-                    maxDistanceMm);
-        }
-    };
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (!(o instanceof SubscribeConfig)) {
-            return false;
-        }
-
-        SubscribeConfig lhs = (SubscribeConfig) o;
-
-        if (!(Arrays.equals(mServiceName, lhs.mServiceName) && Arrays.equals(
-                mServiceSpecificInfo, lhs.mServiceSpecificInfo) && Arrays.equals(mMatchFilter,
-                lhs.mMatchFilter) && mSubscribeType == lhs.mSubscribeType && mTtlSec == lhs.mTtlSec
-                && mEnableTerminateNotification == lhs.mEnableTerminateNotification
-                && mMinDistanceMmSet == lhs.mMinDistanceMmSet
-                && mMaxDistanceMmSet == lhs.mMaxDistanceMmSet)) {
-            return false;
-        }
-
-        if (mMinDistanceMmSet && mMinDistanceMm != lhs.mMinDistanceMm) {
-            return false;
-        }
-
-        if (mMaxDistanceMmSet && mMaxDistanceMm != lhs.mMaxDistanceMm) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = Objects.hash(Arrays.hashCode(mServiceName),
-                Arrays.hashCode(mServiceSpecificInfo), Arrays.hashCode(mMatchFilter),
-                mSubscribeType, mTtlSec, mEnableTerminateNotification, mMinDistanceMmSet,
-                mMaxDistanceMmSet);
-
-        if (mMinDistanceMmSet) {
-            result = Objects.hash(result, mMinDistanceMm);
-        }
-        if (mMaxDistanceMmSet) {
-            result = Objects.hash(result, mMaxDistanceMm);
-        }
-
-        return result;
-    }
-
-    /**
-     * Verifies that the contents of the SubscribeConfig are valid. Otherwise
-     * throws an IllegalArgumentException.
-     *
-     * @hide
-     */
-    public void assertValid(Characteristics characteristics, boolean rttSupported)
-            throws IllegalArgumentException {
-        WifiAwareUtils.validateServiceName(mServiceName);
-
-        if (!TlvBufferUtils.isValid(mMatchFilter, 0, 1)) {
-            throw new IllegalArgumentException(
-                    "Invalid matchFilter configuration - LV fields do not match up to length");
-        }
-        if (mSubscribeType < SUBSCRIBE_TYPE_PASSIVE || mSubscribeType > SUBSCRIBE_TYPE_ACTIVE) {
-            throw new IllegalArgumentException("Invalid subscribeType - " + mSubscribeType);
-        }
-        if (mTtlSec < 0) {
-            throw new IllegalArgumentException("Invalid ttlSec - must be non-negative");
-        }
-
-        if (characteristics != null) {
-            int maxServiceNameLength = characteristics.getMaxServiceNameLength();
-            if (maxServiceNameLength != 0 && mServiceName.length > maxServiceNameLength) {
-                throw new IllegalArgumentException(
-                        "Service name longer than supported by device characteristics");
-            }
-            int maxServiceSpecificInfoLength = characteristics.getMaxServiceSpecificInfoLength();
-            if (maxServiceSpecificInfoLength != 0 && mServiceSpecificInfo != null
-                    && mServiceSpecificInfo.length > maxServiceSpecificInfoLength) {
-                throw new IllegalArgumentException(
-                        "Service specific info longer than supported by device characteristics");
-            }
-            int maxMatchFilterLength = characteristics.getMaxMatchFilterLength();
-            if (maxMatchFilterLength != 0 && mMatchFilter != null
-                    && mMatchFilter.length > maxMatchFilterLength) {
-                throw new IllegalArgumentException(
-                        "Match filter longer than supported by device characteristics");
-            }
-        }
-
-        if (mMinDistanceMmSet && mMinDistanceMm < 0) {
-            throw new IllegalArgumentException("Minimum distance must be non-negative");
-        }
-        if (mMaxDistanceMmSet && mMaxDistanceMm < 0) {
-            throw new IllegalArgumentException("Maximum distance must be non-negative");
-        }
-        if (mMinDistanceMmSet && mMaxDistanceMmSet && mMaxDistanceMm <= mMinDistanceMm) {
-            throw new IllegalArgumentException(
-                    "Maximum distance must be greater than minimum distance");
-        }
-
-        if (!rttSupported && (mMinDistanceMmSet || mMaxDistanceMmSet)) {
-            throw new IllegalArgumentException("Ranging is not supported");
-        }
-    }
-
-    /**
-     * Builder used to build {@link SubscribeConfig} objects.
-     */
-    public static final class Builder {
-        private byte[] mServiceName;
-        private byte[] mServiceSpecificInfo;
-        private byte[] mMatchFilter;
-        private int mSubscribeType = SUBSCRIBE_TYPE_PASSIVE;
-        private int mTtlSec = 0;
-        private boolean mEnableTerminateNotification = true;
-        private boolean mMinDistanceMmSet = false;
-        private int mMinDistanceMm;
-        private boolean mMaxDistanceMmSet = false;
-        private int mMaxDistanceMm;
-
-        /**
-         * Specify the service name of the subscribe session. The actual on-air
-         * value is a 6 byte hashed representation of this string.
-         * <p>
-         * The Service Name is a UTF-8 encoded string from 1 to 255 bytes in length.
-         * The only acceptable single-byte UTF-8 symbols for a Service Name are alphanumeric
-         * values (A-Z, a-z, 0-9), the hyphen ('-'), and the period ('.'). All valid multi-byte
-         * UTF-8 characters are acceptable in a Service Name.
-         * <p>
-         * Must be called - an empty ServiceName is not valid.
-         *
-         * @param serviceName The service name for the subscribe session.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setServiceName(@NonNull String serviceName) {
-            if (serviceName == null) {
-                throw new IllegalArgumentException("Invalid service name - must be non-null");
-            }
-            mServiceName = serviceName.getBytes(StandardCharsets.UTF_8);
-            return this;
-        }
-
-        /**
-         * Specify service specific information for the subscribe session. This is
-         * a free-form byte array available to the application to send
-         * additional information as part of the discovery operation - i.e. it
-         * will not be used to determine whether a publish/subscribe match
-         * occurs.
-         * <p>
-         *     Optional. Empty by default.
-         *
-         * @param serviceSpecificInfo A byte-array for the service-specific
-         *            information field.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setServiceSpecificInfo(@Nullable byte[] serviceSpecificInfo) {
-            mServiceSpecificInfo = serviceSpecificInfo;
-            return this;
-        }
-
-        /**
-         * The match filter for a subscribe session. Used to determine whether a service
-         * discovery occurred - in addition to relying on the service name.
-         * <p>
-         *     Optional. Empty by default.
-         *
-         * @param matchFilter A list of match filter entries (each of which is an arbitrary byte
-         *                    array).
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setMatchFilter(@Nullable List<byte[]> matchFilter) {
-            mMatchFilter = new TlvBufferUtils.TlvConstructor(0, 1).allocateAndPut(
-                    matchFilter).getArray();
-            return this;
-        }
-
-        /**
-         * Sets the type of the subscribe session: active (subscribe packets are
-         * transmitted over-the-air), or passive (no subscribe packets are
-         * transmitted, a match is made against a solicited/active publish
-         * session whose packets are transmitted over-the-air).
-         *
-         * @param subscribeType Subscribe session type:
-         *            {@link SubscribeConfig#SUBSCRIBE_TYPE_ACTIVE} or
-         *            {@link SubscribeConfig#SUBSCRIBE_TYPE_PASSIVE}.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setSubscribeType(@SubscribeTypes int subscribeType) {
-            if (subscribeType < SUBSCRIBE_TYPE_PASSIVE || subscribeType > SUBSCRIBE_TYPE_ACTIVE) {
-                throw new IllegalArgumentException("Invalid subscribeType - " + subscribeType);
-            }
-            mSubscribeType = subscribeType;
-            return this;
-        }
-
-        /**
-         * Sets the time interval (in seconds) an active (
-         * {@link SubscribeConfig.Builder#setSubscribeType(int)}) subscribe session
-         * will be alive - i.e. broadcasting a packet. When the TTL is reached
-         * an event will be generated for
-         * {@link DiscoverySessionCallback#onSessionTerminated()}.
-         * <p>
-         *     Optional. 0 by default - indicating the session doesn't terminate on its own.
-         *     Session will be terminated when {@link DiscoverySession#close()} is
-         *     called.
-         *
-         * @param ttlSec Lifetime of a subscribe session in seconds.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setTtlSec(int ttlSec) {
-            if (ttlSec < 0) {
-                throw new IllegalArgumentException("Invalid ttlSec - must be non-negative");
-            }
-            mTtlSec = ttlSec;
-            return this;
-        }
-
-        /**
-         * Configure whether a subscribe terminate notification
-         * {@link DiscoverySessionCallback#onSessionTerminated()} is reported
-         * back to the callback.
-         *
-         * @param enable If true the terminate callback will be called when the
-         *            subscribe is terminated. Otherwise it will not be called.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setTerminateNotificationEnabled(boolean enable) {
-            mEnableTerminateNotification = enable;
-            return this;
-        }
-
-        /**
-         * Configure the minimum distance to a discovered publisher at which to trigger a discovery
-         * notification. I.e. discovery will be triggered if we've found a matching publisher
-         * (based on the other criteria in this configuration) <b>and</b> the distance to the
-         * publisher is larger than the value specified in this API. Can be used in conjunction with
-         * {@link #setMaxDistanceMm(int)} to specify a geofence, i.e. discovery with min <=
-         * distance <= max.
-         * <p>
-         * For ranging to be used in discovery it must also be enabled on the publisher using
-         * {@link PublishConfig.Builder#setRangingEnabled(boolean)}. However, ranging may
-         * not be available or enabled on the publisher or may be temporarily disabled on either
-         * subscriber or publisher - in such cases discovery will proceed without ranging.
-         * <p>
-         * When ranging is enabled and available on both publisher and subscriber and a service
-         * is discovered based on geofence constraints the
-         * {@link DiscoverySessionCallback#onServiceDiscoveredWithinRange(PeerHandle, byte[], List, int)}
-         * is called, otherwise the
-         * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle, byte[], List)}
-         * is called.
-         * <p>
-         * The device must support Wi-Fi RTT for this feature to be used. Feature support is checked
-         * as described in {@link android.net.wifi.rtt}.
-         *
-         * @param minDistanceMm Minimum distance, in mm, to the publisher above which to trigger
-         *                      discovery.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setMinDistanceMm(int minDistanceMm) {
-            mMinDistanceMm = minDistanceMm;
-            mMinDistanceMmSet = true;
-            return this;
-        }
-
-        /**
-         * Configure the maximum distance to a discovered publisher at which to trigger a discovery
-         * notification. I.e. discovery will be triggered if we've found a matching publisher
-         * (based on the other criteria in this configuration) <b>and</b> the distance to the
-         * publisher is smaller than the value specified in this API. Can be used in conjunction
-         * with {@link #setMinDistanceMm(int)} to specify a geofence, i.e. discovery with min <=
-         * distance <= max.
-         * <p>
-         * For ranging to be used in discovery it must also be enabled on the publisher using
-         * {@link PublishConfig.Builder#setRangingEnabled(boolean)}. However, ranging may
-         * not be available or enabled on the publisher or may be temporarily disabled on either
-         * subscriber or publisher - in such cases discovery will proceed without ranging.
-         * <p>
-         * When ranging is enabled and available on both publisher and subscriber and a service
-         * is discovered based on geofence constraints the
-         * {@link DiscoverySessionCallback#onServiceDiscoveredWithinRange(PeerHandle, byte[], List, int)}
-         * is called, otherwise the
-         * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle, byte[], List)}
-         * is called.
-         * <p>
-         * The device must support Wi-Fi RTT for this feature to be used. Feature support is checked
-         * as described in {@link android.net.wifi.rtt}.
-         *
-         * @param maxDistanceMm Maximum distance, in mm, to the publisher below which to trigger
-         *                      discovery.
-         *
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder setMaxDistanceMm(int maxDistanceMm) {
-            mMaxDistanceMm = maxDistanceMm;
-            mMaxDistanceMmSet = true;
-            return this;
-        }
-
-        /**
-         * Build {@link SubscribeConfig} given the current requests made on the
-         * builder.
-         */
-        public SubscribeConfig build() {
-            return new SubscribeConfig(mServiceName, mServiceSpecificInfo, mMatchFilter,
-                    mSubscribeType, mTtlSec, mEnableTerminateNotification,
-                    mMinDistanceMmSet, mMinDistanceMm, mMaxDistanceMmSet, mMaxDistanceMm);
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/SubscribeDiscoverySession.java b/wifi/java/android/net/wifi/aware/SubscribeDiscoverySession.java
deleted file mode 100644
index ca88a90..0000000
--- a/wifi/java/android/net/wifi/aware/SubscribeDiscoverySession.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.NonNull;
-import android.util.Log;
-
-/**
- * A class representing a Aware subscribe session. Created when
- * {@link WifiAwareSession#subscribe(SubscribeConfig,
- * DiscoverySessionCallback, android.os.Handler)}
- * is called and a discovery session is created and returned in
- * {@link DiscoverySessionCallback#onSubscribeStarted(SubscribeDiscoverySession)}.
- * See baseline functionality of all discovery sessions in {@link DiscoverySession}.
- * This object allows updating an existing/running subscribe discovery session using
- * {@link #updateSubscribe(SubscribeConfig)}.
- */
-public class SubscribeDiscoverySession extends DiscoverySession {
-    private static final String TAG = "SubscribeDiscSession";
-
-    /**
-     * {@hide}
-     */
-    public SubscribeDiscoverySession(WifiAwareManager manager, int clientId,
-            int sessionId) {
-        super(manager, clientId, sessionId);
-    }
-
-    /**
-     * Re-configure the currently active subscribe session. The
-     * {@link DiscoverySessionCallback} is not replaced - the same listener used
-     * at creation is still used. The results of the configuration are returned using
-     * {@link DiscoverySessionCallback}:
-     * <ul>
-     *     <li>{@link DiscoverySessionCallback#onSessionConfigUpdated()}: configuration
-     *     update succeeded.
-     *     <li>{@link DiscoverySessionCallback#onSessionConfigFailed()}: configuration
-     *     update failed. The subscribe discovery session is still running using its previous
-     *     configuration (i.e. update failure does not terminate the session).
-     * </ul>
-     *
-     * @param subscribeConfig The new discovery subscribe session configuration
-     *                        ({@link SubscribeConfig}).
-     */
-    public void updateSubscribe(@NonNull SubscribeConfig subscribeConfig) {
-        if (mTerminated) {
-            Log.w(TAG, "updateSubscribe: called on terminated session");
-            return;
-        } else {
-            WifiAwareManager mgr = mMgr.get();
-            if (mgr == null) {
-                Log.w(TAG, "updateSubscribe: called post GC on WifiAwareManager");
-                return;
-            }
-
-            mgr.updateSubscribe(mClientId, mSessionId, subscribeConfig);
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/TlvBufferUtils.java b/wifi/java/android/net/wifi/aware/TlvBufferUtils.java
deleted file mode 100644
index 2d3cc1e..0000000
--- a/wifi/java/android/net/wifi/aware/TlvBufferUtils.java
+++ /dev/null
@@ -1,714 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.Nullable;
-
-import java.nio.BufferOverflowException;
-import java.nio.ByteOrder;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * Utility class to construct and parse byte arrays using the TLV format -
- * Type/Length/Value format. The utilities accept a configuration of the size of
- * the Type field and the Length field. A Type field size of 0 is allowed -
- * allowing usage for LV (no T) array formats.
- *
- * @hide
- */
-public class TlvBufferUtils {
-    private TlvBufferUtils() {
-        // no reason to ever create this class
-    }
-
-    /**
-     * Utility class to construct byte arrays using the TLV format -
-     * Type/Length/Value.
-     * <p>
-     * A constructor is created specifying the size of the Type (T) and Length
-     * (L) fields. A specification of zero size T field is allowed - resulting
-     * in LV type format.
-     * <p>
-     * The byte array is either provided (using
-     * {@link TlvConstructor#wrap(byte[])}) or allocated (using
-     * {@link TlvConstructor#allocate(int)}).
-     * <p>
-     * Values are added to the structure using the {@code TlvConstructor.put*()}
-     * methods.
-     * <p>
-     * The final byte array is obtained using {@link TlvConstructor#getArray()}.
-     */
-    public static class TlvConstructor {
-        private int mTypeSize;
-        private int mLengthSize;
-        private ByteOrder mByteOrder = ByteOrder.BIG_ENDIAN;
-
-        private byte[] mArray;
-        private int mArrayLength;
-        private int mPosition;
-
-        /**
-         * Define a TLV constructor with the specified size of the Type (T) and
-         * Length (L) fields.
-         *
-         * @param typeSize Number of bytes used for the Type (T) field. Values
-         *            of 0, 1, or 2 bytes are allowed. A specification of 0
-         *            bytes implies that the field being constructed has the LV
-         *            format rather than the TLV format.
-         * @param lengthSize Number of bytes used for the Length (L) field.
-         *            Values of 1 or 2 bytes are allowed.
-         */
-        public TlvConstructor(int typeSize, int lengthSize) {
-            if (typeSize < 0 || typeSize > 2 || lengthSize <= 0 || lengthSize > 2) {
-                throw new IllegalArgumentException(
-                        "Invalid sizes - typeSize=" + typeSize + ", lengthSize=" + lengthSize);
-            }
-            mTypeSize = typeSize;
-            mLengthSize = lengthSize;
-            mPosition = 0;
-        }
-
-        /**
-         * Configure the TLV constructor to use a particular byte order. Should be
-         * {@link ByteOrder#BIG_ENDIAN} (the default at construction) or
-         * {@link ByteOrder#LITTLE_ENDIAN}.
-         *
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor setByteOrder(ByteOrder byteOrder) {
-            mByteOrder = byteOrder;
-            return this;
-        }
-
-        /**
-         * Set the byte array to be used to construct the TLV.
-         *
-         * @param array Byte array to be formatted.
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor wrap(@Nullable byte[] array) {
-            mArray = array;
-            mArrayLength = (array == null) ? 0 : array.length;
-            mPosition = 0;
-            return this;
-        }
-
-        /**
-         * Allocates a new byte array to be used ot construct a TLV.
-         *
-         * @param capacity The size of the byte array to be allocated.
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor allocate(int capacity) {
-            mArray = new byte[capacity];
-            mArrayLength = capacity;
-            mPosition = 0;
-            return this;
-        }
-
-        /**
-         * Creates a TLV array (of the previously specified Type and Length sizes) from the input
-         * list. Allocates an array matching the contents (and required Type and Length
-         * fields), copies the contents, and set the Length fields. The Type field is set to 0.
-         *
-         * @param list A list of fields to be added to the TLV buffer.
-         * @return The constructor of the TLV.
-         */
-        public TlvConstructor allocateAndPut(@Nullable List<byte[]> list) {
-            if (list != null) {
-                int size = 0;
-                for (byte[] field : list) {
-                    size += mTypeSize + mLengthSize;
-                    if (field != null) {
-                        size += field.length;
-                    }
-                }
-                allocate(size);
-                for (byte[] field : list) {
-                    putByteArray(0, field);
-                }
-            }
-            return this;
-        }
-
-        /**
-         * Copies a byte into the TLV with the indicated type. For an LV
-         * formatted structure (i.e. typeLength=0 in {@link TlvConstructor
-         * TlvConstructor(int, int)} ) the type field is ignored.
-         *
-         * @param type The value to be placed into the Type field.
-         * @param b The byte to be inserted into the structure.
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor putByte(int type, byte b) {
-            checkLength(1);
-            addHeader(type, 1);
-            mArray[mPosition++] = b;
-            return this;
-        }
-
-        /**
-         * Copies a raw byte into the TLV buffer - without a type or a length.
-         *
-         * @param b The byte to be inserted into the structure.
-         * @return The constructor to facilitate chaining {@code cts.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor putRawByte(byte b) {
-            checkRawLength(1);
-            mArray[mPosition++] = b;
-            return this;
-        }
-
-        /**
-         * Copies a byte array into the TLV with the indicated type. For an LV
-         * formatted structure (i.e. typeLength=0 in {@link TlvConstructor
-         * TlvConstructor(int, int)} ) the type field is ignored.
-         *
-         * @param type The value to be placed into the Type field.
-         * @param array The array to be copied into the TLV structure.
-         * @param offset Start copying from the array at the specified offset.
-         * @param length Copy the specified number (length) of bytes from the
-         *            array.
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor putByteArray(int type, @Nullable byte[] array, int offset,
-                int length) {
-            checkLength(length);
-            addHeader(type, length);
-            if (length != 0) {
-                System.arraycopy(array, offset, mArray, mPosition, length);
-            }
-            mPosition += length;
-            return this;
-        }
-
-        /**
-         * Copies a byte array into the TLV with the indicated type. For an LV
-         * formatted structure (i.e. typeLength=0 in {@link TlvConstructor
-         * TlvConstructor(int, int)} ) the type field is ignored.
-         *
-         * @param type The value to be placed into the Type field.
-         * @param array The array to be copied (in full) into the TLV structure.
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor putByteArray(int type, @Nullable byte[] array) {
-            return putByteArray(type, array, 0, (array == null) ? 0 : array.length);
-        }
-
-        /**
-         * Copies a byte array into the TLV - without a type or a length.
-         *
-         * @param array The array to be copied (in full) into the TLV structure.
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor putRawByteArray(@Nullable byte[] array) {
-            if (array == null) return this;
-
-            checkRawLength(array.length);
-            System.arraycopy(array, 0, mArray, mPosition, array.length);
-            mPosition += array.length;
-            return this;
-        }
-
-        /**
-         * Places a zero length element (i.e. Length field = 0) into the TLV.
-         * For an LV formatted structure (i.e. typeLength=0 in
-         * {@link TlvConstructor TlvConstructor(int, int)} ) the type field is
-         * ignored.
-         *
-         * @param type The value to be placed into the Type field.
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor putZeroLengthElement(int type) {
-            checkLength(0);
-            addHeader(type, 0);
-            return this;
-        }
-
-        /**
-         * Copies short into the TLV with the indicated type. For an LV
-         * formatted structure (i.e. typeLength=0 in {@link TlvConstructor
-         * TlvConstructor(int, int)} ) the type field is ignored.
-         *
-         * @param type The value to be placed into the Type field.
-         * @param data The short to be inserted into the structure.
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor putShort(int type, short data) {
-            checkLength(2);
-            addHeader(type, 2);
-            pokeShort(mArray, mPosition, data, mByteOrder);
-            mPosition += 2;
-            return this;
-        }
-
-        /**
-         * Copies integer into the TLV with the indicated type. For an LV
-         * formatted structure (i.e. typeLength=0 in {@link TlvConstructor
-         * TlvConstructor(int, int)} ) the type field is ignored.
-         *
-         * @param type The value to be placed into the Type field.
-         * @param data The integer to be inserted into the structure.
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor putInt(int type, int data) {
-            checkLength(4);
-            addHeader(type, 4);
-            pokeInt(mArray, mPosition, data, mByteOrder);
-            mPosition += 4;
-            return this;
-        }
-
-        /**
-         * Copies a String's byte representation into the TLV with the indicated
-         * type. For an LV formatted structure (i.e. typeLength=0 in
-         * {@link TlvConstructor TlvConstructor(int, int)} ) the type field is
-         * ignored.
-         *
-         * @param type The value to be placed into the Type field.
-         * @param data The string whose bytes are to be inserted into the
-         *            structure.
-         * @return The constructor to facilitate chaining
-         *         {@code ctr.putXXX(..).putXXX(..)}.
-         */
-        public TlvConstructor putString(int type, @Nullable String data) {
-            byte[] bytes = null;
-            int length = 0;
-            if (data != null) {
-                bytes = data.getBytes();
-                length = bytes.length;
-            }
-            return putByteArray(type, bytes, 0, length);
-        }
-
-        /**
-         * Returns the constructed TLV formatted byte-array. This array is a copy of the wrapped
-         * or allocated array - truncated to just the significant bytes - i.e. those written into
-         * the (T)LV.
-         *
-         * @return The byte array containing the TLV formatted structure.
-         */
-        public byte[] getArray() {
-            return Arrays.copyOf(mArray, getActualLength());
-        }
-
-        /**
-         * Returns the size of the TLV formatted portion of the wrapped or
-         * allocated byte array. The array itself is returned with
-         * {@link TlvConstructor#getArray()}.
-         *
-         * @return The size of the TLV formatted portion of the byte array.
-         */
-        private int getActualLength() {
-            return mPosition;
-        }
-
-        private void checkLength(int dataLength) {
-            if (mPosition + mTypeSize + mLengthSize + dataLength > mArrayLength) {
-                throw new BufferOverflowException();
-            }
-        }
-
-        private void checkRawLength(int dataLength) {
-            if (mPosition + dataLength > mArrayLength) {
-                throw new BufferOverflowException();
-            }
-        }
-
-        private void addHeader(int type, int length) {
-            if (mTypeSize == 1) {
-                mArray[mPosition] = (byte) type;
-            } else if (mTypeSize == 2) {
-                pokeShort(mArray, mPosition, (short) type, mByteOrder);
-            }
-            mPosition += mTypeSize;
-
-            if (mLengthSize == 1) {
-                mArray[mPosition] = (byte) length;
-            } else if (mLengthSize == 2) {
-                pokeShort(mArray, mPosition, (short) length, mByteOrder);
-            }
-            mPosition += mLengthSize;
-        }
-    }
-
-    /**
-     * Utility class used when iterating over a TLV formatted byte-array. Use
-     * {@link TlvIterable} to iterate over array. A {@link TlvElement}
-     * represents each entry in a TLV formatted byte-array.
-     */
-    public static class TlvElement {
-        /**
-         * The Type (T) field of the current TLV element. Note that for LV
-         * formatted byte-arrays (i.e. TLV whose Type/T size is 0) the value of
-         * this field is undefined.
-         */
-        public int type;
-
-        /**
-         * The Length (L) field of the current TLV element.
-         */
-        public int length;
-
-        /**
-         * Control of the endianess of the TLV element - true for big-endian, false for little-
-         * endian.
-         */
-        public ByteOrder byteOrder = ByteOrder.BIG_ENDIAN;
-
-        /**
-         * The Value (V) field - a raw byte array representing the current TLV
-         * element where the entry starts at {@link TlvElement#offset}.
-         */
-        private byte[] mRefArray;
-
-        /**
-         * The offset to be used into {@link TlvElement#mRefArray} to access the
-         * raw data representing the current TLV element.
-         */
-        public int offset;
-
-        private TlvElement(int type, int length, @Nullable byte[] refArray, int offset) {
-            this.type = type;
-            this.length = length;
-            mRefArray = refArray;
-            this.offset = offset;
-
-            if (offset + length > refArray.length) {
-                throw new BufferOverflowException();
-            }
-        }
-
-        /**
-         * Return the raw byte array of the Value (V) field.
-         *
-         * @return The Value (V) field as a byte array.
-         */
-        public byte[] getRawData() {
-            return Arrays.copyOfRange(mRefArray, offset, offset + length);
-        }
-
-        /**
-         * Utility function to return a byte representation of a TLV element of
-         * length 1. Note: an attempt to call this function on a TLV item whose
-         * {@link TlvElement#length} is != 1 will result in an exception.
-         *
-         * @return byte representation of current TLV element.
-         */
-        public byte getByte() {
-            if (length != 1) {
-                throw new IllegalArgumentException(
-                        "Accesing a byte from a TLV element of length " + length);
-            }
-            return mRefArray[offset];
-        }
-
-        /**
-         * Utility function to return a short representation of a TLV element of
-         * length 2. Note: an attempt to call this function on a TLV item whose
-         * {@link TlvElement#length} is != 2 will result in an exception.
-         *
-         * @return short representation of current TLV element.
-         */
-        public short getShort() {
-            if (length != 2) {
-                throw new IllegalArgumentException(
-                        "Accesing a short from a TLV element of length " + length);
-            }
-            return peekShort(mRefArray, offset, byteOrder);
-        }
-
-        /**
-         * Utility function to return an integer representation of a TLV element
-         * of length 4. Note: an attempt to call this function on a TLV item
-         * whose {@link TlvElement#length} is != 4 will result in an exception.
-         *
-         * @return integer representation of current TLV element.
-         */
-        public int getInt() {
-            if (length != 4) {
-                throw new IllegalArgumentException(
-                        "Accesing an int from a TLV element of length " + length);
-            }
-            return peekInt(mRefArray, offset, byteOrder);
-        }
-
-        /**
-         * Utility function to return a String representation of a TLV element.
-         *
-         * @return String repersentation of the current TLV element.
-         */
-        public String getString() {
-            return new String(mRefArray, offset, length);
-        }
-    }
-
-    /**
-     * Utility class to iterate over a TLV formatted byte-array.
-     */
-    public static class TlvIterable implements Iterable<TlvElement> {
-        private int mTypeSize;
-        private int mLengthSize;
-        private ByteOrder mByteOrder = ByteOrder.BIG_ENDIAN;
-        private byte[] mArray;
-        private int mArrayLength;
-
-        /**
-         * Constructs a TlvIterable object - specifying the format of the TLV
-         * (the sizes of the Type and Length fields), and the byte array whose
-         * data is to be parsed.
-         *
-         * @param typeSize Number of bytes used for the Type (T) field. Valid
-         *            values are 0 (i.e. indicating the format is LV rather than
-         *            TLV), 1, and 2 bytes.
-         * @param lengthSize Number of bytes used for the Length (L) field.
-         *            Values values are 1 or 2 bytes.
-         * @param array The TLV formatted byte-array to parse.
-         */
-        public TlvIterable(int typeSize, int lengthSize, @Nullable byte[] array) {
-            if (typeSize < 0 || typeSize > 2 || lengthSize <= 0 || lengthSize > 2) {
-                throw new IllegalArgumentException(
-                        "Invalid sizes - typeSize=" + typeSize + ", lengthSize=" + lengthSize);
-            }
-            mTypeSize = typeSize;
-            mLengthSize = lengthSize;
-            mArray = array;
-            mArrayLength = (array == null) ? 0 : array.length;
-        }
-
-        /**
-         * Configure the TLV iterator to use little-endian byte ordering.
-         */
-        public void setByteOrder(ByteOrder byteOrder) {
-            mByteOrder = byteOrder;
-        }
-
-        /**
-         * Prints out a parsed representation of the TLV-formatted byte array.
-         * Whenever possible bytes, shorts, and integer are printed out (for
-         * fields whose length is 1, 2, or 4 respectively).
-         */
-        @Override
-        public String toString() {
-            StringBuilder builder = new StringBuilder();
-
-            builder.append("[");
-            boolean first = true;
-            for (TlvElement tlv : this) {
-                if (!first) {
-                    builder.append(",");
-                }
-                first = false;
-                builder.append(" (");
-                if (mTypeSize != 0) {
-                    builder.append("T=" + tlv.type + ",");
-                }
-                builder.append("L=" + tlv.length + ") ");
-                if (tlv.length == 0) {
-                    builder.append("<null>");
-                } else if (tlv.length == 1) {
-                    builder.append(tlv.getByte());
-                } else if (tlv.length == 2) {
-                    builder.append(tlv.getShort());
-                } else if (tlv.length == 4) {
-                    builder.append(tlv.getInt());
-                } else {
-                    builder.append("<bytes>");
-                }
-                if (tlv.length != 0) {
-                    builder.append(" (S='" + tlv.getString() + "')");
-                }
-            }
-            builder.append("]");
-
-            return builder.toString();
-        }
-
-        /**
-         * Returns a List with the raw contents (no types) of the iterator.
-         */
-        public List<byte[]> toList() {
-            List<byte[]> list = new ArrayList<>();
-            for (TlvElement tlv : this) {
-                list.add(Arrays.copyOfRange(tlv.mRefArray, tlv.offset, tlv.offset + tlv.length));
-            }
-
-            return list;
-        }
-
-        /**
-         * Returns an iterator to step through a TLV formatted byte-array. The
-         * individual elements returned by the iterator are {@link TlvElement}.
-         */
-        @Override
-        public Iterator<TlvElement> iterator() {
-            return new Iterator<TlvElement>() {
-                private int mOffset = 0;
-
-                @Override
-                public boolean hasNext() {
-                    return mOffset < mArrayLength;
-                }
-
-                @Override
-                public TlvElement next() {
-                    if (!hasNext()) {
-                        throw new NoSuchElementException();
-                    }
-
-                    int type = 0;
-                    if (mTypeSize == 1) {
-                        type = mArray[mOffset];
-                    } else if (mTypeSize == 2) {
-                        type = peekShort(mArray, mOffset, mByteOrder);
-                    }
-                    mOffset += mTypeSize;
-
-                    int length = 0;
-                    if (mLengthSize == 1) {
-                        length = mArray[mOffset];
-                    } else if (mLengthSize == 2) {
-                        length = peekShort(mArray, mOffset, mByteOrder);
-                    }
-                    mOffset += mLengthSize;
-
-                    TlvElement tlv = new TlvElement(type, length, mArray, mOffset);
-                    tlv.byteOrder = mByteOrder;
-                    mOffset += length;
-                    return tlv;
-                }
-
-                @Override
-                public void remove() {
-                    throw new UnsupportedOperationException();
-                }
-            };
-        }
-    }
-
-    /**
-     * Validates that a (T)LV array is constructed correctly. I.e. that its specified Length
-     * fields correctly fill the specified length (and do not overshoot). Uses big-endian
-     * byte ordering.
-     *
-     * @param array The (T)LV array to verify.
-     * @param typeSize The size (in bytes) of the type field. Valid values are 0, 1, or 2.
-     * @param lengthSize The size (in bytes) of the length field. Valid values are 1 or 2.
-     * @return A boolean indicating whether the array is valid (true) or invalid (false).
-     */
-    public static boolean isValid(@Nullable byte[] array, int typeSize, int lengthSize) {
-        return isValidEndian(array, typeSize, lengthSize, ByteOrder.BIG_ENDIAN);
-    }
-
-    /**
-     * Validates that a (T)LV array is constructed correctly. I.e. that its specified Length
-     * fields correctly fill the specified length (and do not overshoot).
-     *
-     * @param array The (T)LV array to verify.
-     * @param typeSize The size (in bytes) of the type field. Valid values are 0, 1, or 2.
-     * @param lengthSize The size (in bytes) of the length field. Valid values are 1 or 2.
-     * @param byteOrder The endianness of the byte array: {@link ByteOrder#BIG_ENDIAN} or
-     *                  {@link ByteOrder#LITTLE_ENDIAN}.
-     * @return A boolean indicating whether the array is valid (true) or invalid (false).
-     */
-    public static boolean isValidEndian(@Nullable byte[] array, int typeSize, int lengthSize,
-            ByteOrder byteOrder) {
-        if (typeSize < 0 || typeSize > 2) {
-            throw new IllegalArgumentException(
-                    "Invalid arguments - typeSize must be 0, 1, or 2: typeSize=" + typeSize);
-        }
-        if (lengthSize <= 0 || lengthSize > 2) {
-            throw new IllegalArgumentException(
-                    "Invalid arguments - lengthSize must be 1 or 2: lengthSize=" + lengthSize);
-        }
-        if (array == null) {
-            return true;
-        }
-
-        int nextTlvIndex = 0;
-        while (nextTlvIndex + typeSize + lengthSize <= array.length) {
-            nextTlvIndex += typeSize;
-            if (lengthSize == 1) {
-                nextTlvIndex += lengthSize + array[nextTlvIndex];
-            } else {
-                nextTlvIndex += lengthSize + peekShort(array, nextTlvIndex, byteOrder);
-            }
-        }
-
-        return nextTlvIndex == array.length;
-    }
-
-    private static void pokeShort(byte[] dst, int offset, short value, ByteOrder order) {
-        if (order == ByteOrder.BIG_ENDIAN) {
-            dst[offset++] = (byte) ((value >> 8) & 0xff);
-            dst[offset  ] = (byte) ((value >> 0) & 0xff);
-        } else {
-            dst[offset++] = (byte) ((value >> 0) & 0xff);
-            dst[offset  ] = (byte) ((value >> 8) & 0xff);
-        }
-    }
-
-    private static void pokeInt(byte[] dst, int offset, int value, ByteOrder order) {
-        if (order == ByteOrder.BIG_ENDIAN) {
-            dst[offset++] = (byte) ((value >> 24) & 0xff);
-            dst[offset++] = (byte) ((value >> 16) & 0xff);
-            dst[offset++] = (byte) ((value >>  8) & 0xff);
-            dst[offset  ] = (byte) ((value >>  0) & 0xff);
-        } else {
-            dst[offset++] = (byte) ((value >>  0) & 0xff);
-            dst[offset++] = (byte) ((value >>  8) & 0xff);
-            dst[offset++] = (byte) ((value >> 16) & 0xff);
-            dst[offset  ] = (byte) ((value >> 24) & 0xff);
-        }
-    }
-
-    private static short peekShort(byte[] src, int offset, ByteOrder order) {
-        if (order == ByteOrder.BIG_ENDIAN) {
-            return (short) ((src[offset] << 8) | (src[offset + 1] & 0xff));
-        } else {
-            return (short) ((src[offset + 1] << 8) | (src[offset] & 0xff));
-        }
-    }
-
-    private static int peekInt(byte[] src, int offset, ByteOrder order) {
-        if (order == ByteOrder.BIG_ENDIAN) {
-            return ((src[offset++] & 0xff) << 24)
-                    | ((src[offset++] & 0xff) << 16)
-                    | ((src[offset++] & 0xff) <<  8)
-                    | ((src[offset  ] & 0xff) <<  0);
-        } else {
-            return ((src[offset++] & 0xff) <<  0)
-                    | ((src[offset++] & 0xff) <<  8)
-                    | ((src[offset++] & 0xff) << 16)
-                    | ((src[offset  ] & 0xff) << 24);
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java b/wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java
deleted file mode 100644
index 9ae3bd0..0000000
--- a/wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.net.NetworkSpecifier;
-import android.net.wifi.util.HexEncoding;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.Log;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.StringJoiner;
-
-/**
- * A network specifier object used to represent the capabilities of an network agent. A collection
- * of multiple WifiAwareNetworkSpecifier objects whose matching critiera (satisfiedBy) is an OR:
- * a match on any of the network specifiers in the collection is a match.
- *
- * This class is not intended for use in network requests.
- *
- * @hide
- */
-public class WifiAwareAgentNetworkSpecifier extends NetworkSpecifier implements Parcelable {
-    private static final String TAG = "WifiAwareAgentNs";
-
-    private static final boolean VDBG = false; // STOPSHIP if true
-
-    private Set<ByteArrayWrapper> mNetworkSpecifiers = new HashSet<>();
-    private MessageDigest mDigester;
-
-    public WifiAwareAgentNetworkSpecifier() {
-        initialize();
-    }
-
-    public WifiAwareAgentNetworkSpecifier(WifiAwareNetworkSpecifier ns) {
-        initialize();
-        mNetworkSpecifiers.add(convert(ns));
-    }
-
-    public WifiAwareAgentNetworkSpecifier(WifiAwareNetworkSpecifier[] nss) {
-        initialize();
-        for (WifiAwareNetworkSpecifier ns : nss) {
-            mNetworkSpecifiers.add(convert(ns));
-        }
-    }
-
-    public boolean isEmpty() {
-        return mNetworkSpecifiers.isEmpty();
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeArray(mNetworkSpecifiers.toArray());
-    }
-
-    public static final @android.annotation.NonNull Creator<WifiAwareAgentNetworkSpecifier> CREATOR =
-            new Creator<WifiAwareAgentNetworkSpecifier>() {
-                @Override
-                public WifiAwareAgentNetworkSpecifier createFromParcel(Parcel in) {
-                    WifiAwareAgentNetworkSpecifier agentNs = new WifiAwareAgentNetworkSpecifier();
-                    Object[] objs = in.readArray(null);
-                    for (Object obj : objs) {
-                        agentNs.mNetworkSpecifiers.add((ByteArrayWrapper) obj);
-                    }
-                    return agentNs;
-                }
-
-                @Override
-                public WifiAwareAgentNetworkSpecifier[] newArray(int size) {
-                    return new WifiAwareAgentNetworkSpecifier[size];
-                }
-            };
-
-    @Override
-    public int hashCode() {
-        return mNetworkSpecifiers.hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (obj == this) {
-            return true;
-        }
-        if (!(obj instanceof WifiAwareAgentNetworkSpecifier)) {
-            return false;
-        }
-        return mNetworkSpecifiers.equals(((WifiAwareAgentNetworkSpecifier) obj).mNetworkSpecifiers);
-    }
-
-    @Override
-    public String toString() {
-        StringJoiner sj = new StringJoiner(",");
-        for (ByteArrayWrapper baw: mNetworkSpecifiers) {
-            sj.add(baw.toString());
-        }
-        return sj.toString();
-    }
-
-    @Override
-    public boolean canBeSatisfiedBy(NetworkSpecifier other) {
-        if (!(other instanceof WifiAwareAgentNetworkSpecifier)) {
-            return false;
-        }
-        WifiAwareAgentNetworkSpecifier otherNs = (WifiAwareAgentNetworkSpecifier) other;
-
-        // called as old.satifiedBy(new): satisfied if old contained in new
-        for (ByteArrayWrapper baw: mNetworkSpecifiers) {
-            if (!otherNs.mNetworkSpecifiers.contains(baw)) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    public boolean satisfiesAwareNetworkSpecifier(WifiAwareNetworkSpecifier ns) {
-        if (VDBG) Log.v(TAG, "satisfiesAwareNetworkSpecifier: ns=" + ns);
-        ByteArrayWrapper nsBytes = convert(ns);
-        return mNetworkSpecifiers.contains(nsBytes);
-    }
-
-    @Override
-    public NetworkSpecifier redact() {
-        return null;
-    }
-
-    private void initialize() {
-        try {
-            mDigester = MessageDigest.getInstance("SHA-256");
-        } catch (NoSuchAlgorithmException e) {
-            Log.e(TAG, "Can not instantiate a SHA-256 digester!? Will match nothing.");
-            return;
-        }
-    }
-
-    private ByteArrayWrapper convert(WifiAwareNetworkSpecifier ns) {
-        if (mDigester == null) {
-            return null;
-        }
-
-        Parcel parcel = Parcel.obtain();
-        ns.writeToParcel(parcel, 0);
-        byte[] bytes = parcel.marshall();
-
-        mDigester.reset();
-        mDigester.update(bytes);
-        return new ByteArrayWrapper(mDigester.digest());
-    }
-
-    private static class ByteArrayWrapper implements Parcelable {
-        private byte[] mData;
-
-        ByteArrayWrapper(byte[] data) {
-            mData = data;
-        }
-
-        @Override
-        public int hashCode() {
-            return Arrays.hashCode(mData);
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (obj == this) {
-                return true;
-            }
-            if (!(obj instanceof ByteArrayWrapper)) {
-                return false;
-            }
-            return Arrays.equals(((ByteArrayWrapper) obj).mData, mData);
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeByteArray(mData);
-        }
-
-        public static final @android.annotation.NonNull Creator<ByteArrayWrapper> CREATOR =
-                new Creator<ByteArrayWrapper>() {
-                    @Override
-                    public ByteArrayWrapper createFromParcel(Parcel in) {
-                        return new ByteArrayWrapper(in.createByteArray());
-                    }
-
-                    @Override
-                    public ByteArrayWrapper[] newArray(int size) {
-                        return new ByteArrayWrapper[size];
-                    }
-                };
-
-        @Override
-        public String toString() {
-            return new String(HexEncoding.encode(mData));
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareManager.java b/wifi/java/android/net/wifi/aware/WifiAwareManager.java
deleted file mode 100644
index c2ae17c..0000000
--- a/wifi/java/android/net/wifi/aware/WifiAwareManager.java
+++ /dev/null
@@ -1,824 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.RequiresPermission;
-import android.annotation.SdkConstant;
-import android.annotation.SdkConstant.SdkConstantType;
-import android.annotation.SystemService;
-import android.content.Context;
-import android.net.ConnectivityManager;
-import android.net.NetworkRequest;
-import android.net.NetworkSpecifier;
-import android.net.wifi.util.HexEncoding;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.RemoteException;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.WeakReference;
-import java.nio.BufferOverflowException;
-import java.util.List;
-
-/**
- * This class provides the primary API for managing Wi-Fi Aware operations:
- * discovery and peer-to-peer data connections.
- * <p>
- * The class provides access to:
- * <ul>
- * <li>Initialize a Aware cluster (peer-to-peer synchronization). Refer to
- * {@link #attach(AttachCallback, Handler)}.
- * <li>Create discovery sessions (publish or subscribe sessions). Refer to
- * {@link WifiAwareSession#publish(PublishConfig, DiscoverySessionCallback, Handler)} and
- * {@link WifiAwareSession#subscribe(SubscribeConfig, DiscoverySessionCallback, Handler)}.
- * <li>Create a Aware network specifier to be used with
- * {@link ConnectivityManager#requestNetwork(NetworkRequest, ConnectivityManager.NetworkCallback)}
- * to set-up a Aware connection with a peer. Refer to {@link WifiAwareNetworkSpecifier.Builder}.
- * </ul>
- * <p>
- *     Aware may not be usable when Wi-Fi is disabled (and other conditions). To validate that
- *     the functionality is available use the {@link #isAvailable()} function. To track
- *     changes in Aware usability register for the {@link #ACTION_WIFI_AWARE_STATE_CHANGED}
- *     broadcast. Note that this broadcast is not sticky - you should register for it and then
- *     check the above API to avoid a race condition.
- * <p>
- *     An application must use {@link #attach(AttachCallback, Handler)} to initialize a
- *     Aware cluster - before making any other Aware operation. Aware cluster membership is a
- *     device-wide operation - the API guarantees that the device is in a cluster or joins a
- *     Aware cluster (or starts one if none can be found). Information about attach success (or
- *     failure) are returned in callbacks of {@link AttachCallback}. Proceed with Aware
- *     discovery or connection setup only after receiving confirmation that Aware attach
- *     succeeded - {@link AttachCallback#onAttached(WifiAwareSession)}. When an
- *     application is finished using Aware it <b>must</b> use the
- *     {@link WifiAwareSession#close()} API to indicate to the Aware service that the device
- *     may detach from the Aware cluster. The device will actually disable Aware once the last
- *     application detaches.
- * <p>
- *     Once a Aware attach is confirmed use the
- *     {@link WifiAwareSession#publish(PublishConfig, DiscoverySessionCallback, Handler)}
- *     or
- *     {@link WifiAwareSession#subscribe(SubscribeConfig, DiscoverySessionCallback,
- *     Handler)} to create publish or subscribe Aware discovery sessions. Events are called on the
- *     provided callback object {@link DiscoverySessionCallback}. Specifically, the
- *     {@link DiscoverySessionCallback#onPublishStarted(PublishDiscoverySession)}
- *     and
- *     {@link DiscoverySessionCallback#onSubscribeStarted(
- *SubscribeDiscoverySession)}
- *     return {@link PublishDiscoverySession} and
- *     {@link SubscribeDiscoverySession}
- *     objects respectively on which additional session operations can be performed, e.g. updating
- *     the session {@link PublishDiscoverySession#updatePublish(PublishConfig)} and
- *     {@link SubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}. Sessions can
- *     also be used to send messages using the
- *     {@link DiscoverySession#sendMessage(PeerHandle, int, byte[])} APIs. When an
- *     application is finished with a discovery session it <b>must</b> terminate it using the
- *     {@link DiscoverySession#close()} API.
- * <p>
- *    Creating connections between Aware devices is managed by the standard
- *    {@link ConnectivityManager#requestNetwork(NetworkRequest,
- *    ConnectivityManager.NetworkCallback)}.
- *    The {@link NetworkRequest} object should be constructed with:
- *    <ul>
- *        <li>{@link NetworkRequest.Builder#addTransportType(int)} of
- *        {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_AWARE}.
- *        <li>{@link NetworkRequest.Builder#setNetworkSpecifier(String)} using
- *        {@link WifiAwareNetworkSpecifier.Builder}.
- *    </ul>
- */
-@SystemService(Context.WIFI_AWARE_SERVICE)
-public class WifiAwareManager {
-    private static final String TAG = "WifiAwareManager";
-    private static final boolean DBG = false;
-    private static final boolean VDBG = false; // STOPSHIP if true
-
-    /**
-     * Broadcast intent action to indicate that the state of Wi-Fi Aware availability has changed.
-     * Use the {@link #isAvailable()} to query the current status.
-     * This broadcast is <b>not</b> sticky, use the {@link #isAvailable()} API after registering
-     * the broadcast to check the current state of Wi-Fi Aware.
-     * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
-     * components will be launched.
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String ACTION_WIFI_AWARE_STATE_CHANGED =
-            "android.net.wifi.aware.action.WIFI_AWARE_STATE_CHANGED";
-
-    /** @hide */
-    @IntDef({
-            WIFI_AWARE_DATA_PATH_ROLE_INITIATOR, WIFI_AWARE_DATA_PATH_ROLE_RESPONDER})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface DataPathRole {
-    }
-
-    /**
-     * Connection creation role is that of INITIATOR. Used to create a network specifier string
-     * when requesting a Aware network.
-     *
-     * @see WifiAwareSession#createNetworkSpecifierOpen(int, byte[])
-     * @see WifiAwareSession#createNetworkSpecifierPassphrase(int, byte[], String)
-     */
-    public static final int WIFI_AWARE_DATA_PATH_ROLE_INITIATOR = 0;
-
-    /**
-     * Connection creation role is that of RESPONDER. Used to create a network specifier string
-     * when requesting a Aware network.
-     *
-     * @see WifiAwareSession#createNetworkSpecifierOpen(int, byte[])
-     * @see WifiAwareSession#createNetworkSpecifierPassphrase(int, byte[], String)
-     */
-    public static final int WIFI_AWARE_DATA_PATH_ROLE_RESPONDER = 1;
-
-    private final Context mContext;
-    private final IWifiAwareManager mService;
-
-    private final Object mLock = new Object(); // lock access to the following vars
-
-    /** @hide */
-    public WifiAwareManager(@NonNull Context context, @NonNull IWifiAwareManager service) {
-        mContext = context;
-        mService = service;
-    }
-
-    /**
-     * Returns the current status of Aware API: whether or not Aware is available. To track
-     * changes in the state of Aware API register for the
-     * {@link #ACTION_WIFI_AWARE_STATE_CHANGED} broadcast.
-     *
-     * @return A boolean indicating whether the app can use the Aware API at this time (true) or
-     * not (false).
-     */
-    public boolean isAvailable() {
-        try {
-            return mService.isUsageEnabled();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Returns the characteristics of the Wi-Fi Aware interface: a set of parameters which specify
-     * limitations on configurations, e.g. the maximum service name length.
-     *
-     * @return An object specifying configuration limitations of Aware.
-     */
-    public Characteristics getCharacteristics() {
-        try {
-            return mService.getCharacteristics();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Attach to the Wi-Fi Aware service - enabling the application to create discovery sessions or
-     * create connections to peers. The device will attach to an existing cluster if it can find
-     * one or create a new cluster (if it is the first to enable Aware in its vicinity). Results
-     * (e.g. successful attach to a cluster) are provided to the {@code attachCallback} object.
-     * An application <b>must</b> call {@link WifiAwareSession#close()} when done with the
-     * Wi-Fi Aware object.
-     * <p>
-     * Note: a Aware cluster is a shared resource - if the device is already attached to a cluster
-     * then this function will simply indicate success immediately using the same {@code
-     * attachCallback}.
-     *
-     * @param attachCallback A callback for attach events, extended from
-     * {@link AttachCallback}.
-     * @param handler The Handler on whose thread to execute the callbacks of the {@code
-     * attachCallback} object. If a null is provided then the application's main thread will be
-     *                used.
-     */
-    public void attach(@NonNull AttachCallback attachCallback, @Nullable Handler handler) {
-        attach(handler, null, attachCallback, null);
-    }
-
-    /**
-     * Attach to the Wi-Fi Aware service - enabling the application to create discovery sessions or
-     * create connections to peers. The device will attach to an existing cluster if it can find
-     * one or create a new cluster (if it is the first to enable Aware in its vicinity). Results
-     * (e.g. successful attach to a cluster) are provided to the {@code attachCallback} object.
-     * An application <b>must</b> call {@link WifiAwareSession#close()} when done with the
-     * Wi-Fi Aware object.
-     * <p>
-     * Note: a Aware cluster is a shared resource - if the device is already attached to a cluster
-     * then this function will simply indicate success immediately using the same {@code
-     * attachCallback}.
-     * <p>
-     * This version of the API attaches a listener to receive the MAC address of the Aware interface
-     * on startup and whenever it is updated (it is randomized at regular intervals for privacy).
-     * The application must have the {@link android.Manifest.permission#ACCESS_FINE_LOCATION}
-     * permission to execute this attach request. Otherwise, use the
-     * {@link #attach(AttachCallback, Handler)} version. Note that aside from permission
-     * requirements this listener will wake up the host at regular intervals causing higher power
-     * consumption, do not use it unless the information is necessary (e.g. for OOB discovery).
-     *
-     * @param attachCallback A callback for attach events, extended from
-     * {@link AttachCallback}.
-     * @param identityChangedListener A listener for changed identity, extended from
-     * {@link IdentityChangedListener}.
-     * @param handler The Handler on whose thread to execute the callbacks of the {@code
-     * attachCallback} and {@code identityChangedListener} objects. If a null is provided then the
-     *                application's main thread will be used.
-     */
-    public void attach(@NonNull AttachCallback attachCallback,
-            @NonNull IdentityChangedListener identityChangedListener,
-            @Nullable Handler handler) {
-        attach(handler, null, attachCallback, identityChangedListener);
-    }
-
-    /** @hide */
-    public void attach(Handler handler, ConfigRequest configRequest,
-            AttachCallback attachCallback,
-            IdentityChangedListener identityChangedListener) {
-        if (VDBG) {
-            Log.v(TAG, "attach(): handler=" + handler + ", callback=" + attachCallback
-                    + ", configRequest=" + configRequest + ", identityChangedListener="
-                    + identityChangedListener);
-        }
-
-        if (attachCallback == null) {
-            throw new IllegalArgumentException("Null callback provided");
-        }
-
-        synchronized (mLock) {
-            Looper looper = (handler == null) ? Looper.getMainLooper() : handler.getLooper();
-
-            try {
-                Binder binder = new Binder();
-                mService.connect(binder, mContext.getOpPackageName(), mContext.getAttributionTag(),
-                        new WifiAwareEventCallbackProxy(this, looper, binder, attachCallback,
-                                identityChangedListener), configRequest,
-                        identityChangedListener != null);
-            } catch (RemoteException e) {
-                throw e.rethrowFromSystemServer();
-            }
-        }
-    }
-
-    /** @hide */
-    public void disconnect(int clientId, Binder binder) {
-        if (VDBG) Log.v(TAG, "disconnect()");
-
-        try {
-            mService.disconnect(clientId, binder);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /** @hide */
-    public void publish(int clientId, Looper looper, PublishConfig publishConfig,
-            DiscoverySessionCallback callback) {
-        if (VDBG) Log.v(TAG, "publish(): clientId=" + clientId + ", config=" + publishConfig);
-
-        if (callback == null) {
-            throw new IllegalArgumentException("Null callback provided");
-        }
-
-        try {
-            mService.publish(mContext.getOpPackageName(), mContext.getAttributionTag(), clientId,
-                    publishConfig,
-                    new WifiAwareDiscoverySessionCallbackProxy(this, looper, true, callback,
-                            clientId));
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /** @hide */
-    public void updatePublish(int clientId, int sessionId, PublishConfig publishConfig) {
-        if (VDBG) {
-            Log.v(TAG, "updatePublish(): clientId=" + clientId + ",sessionId=" + sessionId
-                    + ", config=" + publishConfig);
-        }
-
-        try {
-            mService.updatePublish(clientId, sessionId, publishConfig);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /** @hide */
-    public void subscribe(int clientId, Looper looper, SubscribeConfig subscribeConfig,
-            DiscoverySessionCallback callback) {
-        if (VDBG) {
-            if (VDBG) {
-                Log.v(TAG,
-                        "subscribe(): clientId=" + clientId + ", config=" + subscribeConfig);
-            }
-        }
-
-        if (callback == null) {
-            throw new IllegalArgumentException("Null callback provided");
-        }
-
-        try {
-            mService.subscribe(mContext.getOpPackageName(), mContext.getAttributionTag(), clientId,
-                    subscribeConfig,
-                    new WifiAwareDiscoverySessionCallbackProxy(this, looper, false, callback,
-                            clientId));
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /** @hide */
-    public void updateSubscribe(int clientId, int sessionId, SubscribeConfig subscribeConfig) {
-        if (VDBG) {
-            Log.v(TAG, "updateSubscribe(): clientId=" + clientId + ",sessionId=" + sessionId
-                    + ", config=" + subscribeConfig);
-        }
-
-        try {
-            mService.updateSubscribe(clientId, sessionId, subscribeConfig);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /** @hide */
-    public void terminateSession(int clientId, int sessionId) {
-        if (VDBG) {
-            Log.d(TAG,
-                    "terminateSession(): clientId=" + clientId + ", sessionId=" + sessionId);
-        }
-
-        try {
-            mService.terminateSession(clientId, sessionId);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /** @hide */
-    public void sendMessage(int clientId, int sessionId, PeerHandle peerHandle, byte[] message,
-            int messageId, int retryCount) {
-        if (peerHandle == null) {
-            throw new IllegalArgumentException(
-                    "sendMessage: invalid peerHandle - must be non-null");
-        }
-
-        if (VDBG) {
-            Log.v(TAG, "sendMessage(): clientId=" + clientId + ", sessionId=" + sessionId
-                    + ", peerHandle=" + peerHandle.peerId + ", messageId="
-                    + messageId + ", retryCount=" + retryCount);
-        }
-
-        try {
-            mService.sendMessage(clientId, sessionId, peerHandle.peerId, message, messageId,
-                    retryCount);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /** @hide */
-    @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
-    public void requestMacAddresses(int uid, List<Integer> peerIds,
-            IWifiAwareMacAddressProvider callback) {
-        try {
-            mService.requestMacAddresses(uid, peerIds, callback);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /** @hide */
-    public NetworkSpecifier createNetworkSpecifier(int clientId, int role, int sessionId,
-            @NonNull PeerHandle peerHandle, @Nullable byte[] pmk, @Nullable String passphrase) {
-        if (VDBG) {
-            Log.v(TAG, "createNetworkSpecifier: role=" + role + ", sessionId=" + sessionId
-                    + ", peerHandle=" + ((peerHandle == null) ? peerHandle : peerHandle.peerId)
-                    + ", pmk=" + ((pmk == null) ? "null" : "non-null")
-                    + ", passphrase=" + ((passphrase == null) ? "null" : "non-null"));
-        }
-
-        if (!WifiAwareUtils.isLegacyVersion(mContext, Build.VERSION_CODES.Q)) {
-            throw new UnsupportedOperationException(
-                    "API deprecated - use WifiAwareNetworkSpecifier.Builder");
-        }
-
-        if (role != WIFI_AWARE_DATA_PATH_ROLE_INITIATOR
-                && role != WIFI_AWARE_DATA_PATH_ROLE_RESPONDER) {
-            throw new IllegalArgumentException(
-                    "createNetworkSpecifier: Invalid 'role' argument when creating a network "
-                            + "specifier");
-        }
-        if (role == WIFI_AWARE_DATA_PATH_ROLE_INITIATOR || !WifiAwareUtils.isLegacyVersion(mContext,
-                Build.VERSION_CODES.P)) {
-            if (peerHandle == null) {
-                throw new IllegalArgumentException(
-                        "createNetworkSpecifier: Invalid peer handle - cannot be null");
-            }
-        }
-
-        return new WifiAwareNetworkSpecifier(
-                (peerHandle == null) ? WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_IB_ANY_PEER
-                        : WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_IB,
-                role,
-                clientId,
-                sessionId,
-                peerHandle != null ? peerHandle.peerId : 0, // 0 is an invalid peer ID
-                null, // peerMac (not used in this method)
-                pmk,
-                passphrase,
-                0, // no port info for deprecated IB APIs
-                -1); // no transport info for deprecated IB APIs
-    }
-
-    /** @hide */
-    public NetworkSpecifier createNetworkSpecifier(int clientId, @DataPathRole int role,
-            @NonNull byte[] peer, @Nullable byte[] pmk, @Nullable String passphrase) {
-        if (VDBG) {
-            Log.v(TAG, "createNetworkSpecifier: role=" + role
-                    + ", pmk=" + ((pmk == null) ? "null" : "non-null")
-                    + ", passphrase=" + ((passphrase == null) ? "null" : "non-null"));
-        }
-
-        if (role != WIFI_AWARE_DATA_PATH_ROLE_INITIATOR
-                && role != WIFI_AWARE_DATA_PATH_ROLE_RESPONDER) {
-            throw new IllegalArgumentException(
-                    "createNetworkSpecifier: Invalid 'role' argument when creating a network "
-                            + "specifier");
-        }
-        if (role == WIFI_AWARE_DATA_PATH_ROLE_INITIATOR || !WifiAwareUtils.isLegacyVersion(mContext,
-                Build.VERSION_CODES.P)) {
-            if (peer == null) {
-                throw new IllegalArgumentException(
-                        "createNetworkSpecifier: Invalid peer MAC - cannot be null");
-            }
-        }
-        if (peer != null && peer.length != 6) {
-            throw new IllegalArgumentException("createNetworkSpecifier: Invalid peer MAC address");
-        }
-
-        return new WifiAwareNetworkSpecifier(
-                (peer == null) ? WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_OOB_ANY_PEER
-                        : WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_OOB,
-                role,
-                clientId,
-                0, // 0 is an invalid session ID
-                0, // 0 is an invalid peer ID
-                peer,
-                pmk,
-                passphrase,
-                0, // no port info for OOB APIs
-                -1); // no transport protocol info for OOB APIs
-    }
-
-    private static class WifiAwareEventCallbackProxy extends IWifiAwareEventCallback.Stub {
-        private static final int CALLBACK_CONNECT_SUCCESS = 0;
-        private static final int CALLBACK_CONNECT_FAIL = 1;
-        private static final int CALLBACK_IDENTITY_CHANGED = 2;
-
-        private final Handler mHandler;
-        private final WeakReference<WifiAwareManager> mAwareManager;
-        private final Binder mBinder;
-        private final Looper mLooper;
-
-        /**
-         * Constructs a {@link AttachCallback} using the specified looper.
-         * All callbacks will delivered on the thread of the specified looper.
-         *
-         * @param looper The looper on which to execute the callbacks.
-         */
-        WifiAwareEventCallbackProxy(WifiAwareManager mgr, Looper looper, Binder binder,
-                final AttachCallback attachCallback,
-                final IdentityChangedListener identityChangedListener) {
-            mAwareManager = new WeakReference<>(mgr);
-            mLooper = looper;
-            mBinder = binder;
-
-            if (VDBG) Log.v(TAG, "WifiAwareEventCallbackProxy ctor: looper=" + looper);
-            mHandler = new Handler(looper) {
-                @Override
-                public void handleMessage(Message msg) {
-                    if (DBG) {
-                        Log.d(TAG, "WifiAwareEventCallbackProxy: What=" + msg.what + ", msg="
-                                + msg);
-                    }
-
-                    WifiAwareManager mgr = mAwareManager.get();
-                    if (mgr == null) {
-                        Log.w(TAG, "WifiAwareEventCallbackProxy: handleMessage post GC");
-                        return;
-                    }
-
-                    switch (msg.what) {
-                        case CALLBACK_CONNECT_SUCCESS:
-                            attachCallback.onAttached(
-                                    new WifiAwareSession(mgr, mBinder, msg.arg1));
-                            break;
-                        case CALLBACK_CONNECT_FAIL:
-                            mAwareManager.clear();
-                            attachCallback.onAttachFailed();
-                            break;
-                        case CALLBACK_IDENTITY_CHANGED:
-                            if (identityChangedListener == null) {
-                                Log.e(TAG, "CALLBACK_IDENTITY_CHANGED: null listener.");
-                            } else {
-                                identityChangedListener.onIdentityChanged((byte[]) msg.obj);
-                            }
-                            break;
-                    }
-                }
-            };
-        }
-
-        @Override
-        public void onConnectSuccess(int clientId) {
-            if (VDBG) Log.v(TAG, "onConnectSuccess");
-
-            Message msg = mHandler.obtainMessage(CALLBACK_CONNECT_SUCCESS);
-            msg.arg1 = clientId;
-            mHandler.sendMessage(msg);
-        }
-
-        @Override
-        public void onConnectFail(int reason) {
-            if (VDBG) Log.v(TAG, "onConnectFail: reason=" + reason);
-
-            Message msg = mHandler.obtainMessage(CALLBACK_CONNECT_FAIL);
-            msg.arg1 = reason;
-            mHandler.sendMessage(msg);
-        }
-
-        @Override
-        public void onIdentityChanged(byte[] mac) {
-            if (VDBG) Log.v(TAG, "onIdentityChanged: mac=" + new String(HexEncoding.encode(mac)));
-
-            Message msg = mHandler.obtainMessage(CALLBACK_IDENTITY_CHANGED);
-            msg.obj = mac;
-            mHandler.sendMessage(msg);
-        }
-    }
-
-    private static class WifiAwareDiscoverySessionCallbackProxy extends
-            IWifiAwareDiscoverySessionCallback.Stub {
-        private static final int CALLBACK_SESSION_STARTED = 0;
-        private static final int CALLBACK_SESSION_CONFIG_SUCCESS = 1;
-        private static final int CALLBACK_SESSION_CONFIG_FAIL = 2;
-        private static final int CALLBACK_SESSION_TERMINATED = 3;
-        private static final int CALLBACK_MATCH = 4;
-        private static final int CALLBACK_MESSAGE_SEND_SUCCESS = 5;
-        private static final int CALLBACK_MESSAGE_SEND_FAIL = 6;
-        private static final int CALLBACK_MESSAGE_RECEIVED = 7;
-        private static final int CALLBACK_MATCH_WITH_DISTANCE = 8;
-
-        private static final String MESSAGE_BUNDLE_KEY_MESSAGE = "message";
-        private static final String MESSAGE_BUNDLE_KEY_MESSAGE2 = "message2";
-
-        private final WeakReference<WifiAwareManager> mAwareManager;
-        private final boolean mIsPublish;
-        private final DiscoverySessionCallback mOriginalCallback;
-        private final int mClientId;
-
-        private final Handler mHandler;
-        private DiscoverySession mSession;
-
-        WifiAwareDiscoverySessionCallbackProxy(WifiAwareManager mgr, Looper looper,
-                boolean isPublish, DiscoverySessionCallback originalCallback,
-                int clientId) {
-            mAwareManager = new WeakReference<>(mgr);
-            mIsPublish = isPublish;
-            mOriginalCallback = originalCallback;
-            mClientId = clientId;
-
-            if (VDBG) {
-                Log.v(TAG, "WifiAwareDiscoverySessionCallbackProxy ctor: isPublish=" + isPublish);
-            }
-
-            mHandler = new Handler(looper) {
-                @Override
-                public void handleMessage(Message msg) {
-                    if (DBG) Log.d(TAG, "What=" + msg.what + ", msg=" + msg);
-
-                    if (mAwareManager.get() == null) {
-                        Log.w(TAG, "WifiAwareDiscoverySessionCallbackProxy: handleMessage post GC");
-                        return;
-                    }
-
-                    switch (msg.what) {
-                        case CALLBACK_SESSION_STARTED:
-                            onProxySessionStarted(msg.arg1);
-                            break;
-                        case CALLBACK_SESSION_CONFIG_SUCCESS:
-                            mOriginalCallback.onSessionConfigUpdated();
-                            break;
-                        case CALLBACK_SESSION_CONFIG_FAIL:
-                            mOriginalCallback.onSessionConfigFailed();
-                            if (mSession == null) {
-                                /*
-                                 * creation failed (as opposed to update
-                                 * failing)
-                                 */
-                                mAwareManager.clear();
-                            }
-                            break;
-                        case CALLBACK_SESSION_TERMINATED:
-                            onProxySessionTerminated(msg.arg1);
-                            break;
-                        case CALLBACK_MATCH:
-                        case CALLBACK_MATCH_WITH_DISTANCE:
-                            {
-                            List<byte[]> matchFilter = null;
-                            byte[] arg = msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE2);
-                            try {
-                                matchFilter = new TlvBufferUtils.TlvIterable(0, 1, arg).toList();
-                            } catch (BufferOverflowException e) {
-                                matchFilter = null;
-                                Log.e(TAG, "onServiceDiscovered: invalid match filter byte array '"
-                                        + new String(HexEncoding.encode(arg))
-                                        + "' - cannot be parsed: e=" + e);
-                            }
-                            if (msg.what == CALLBACK_MATCH) {
-                                mOriginalCallback.onServiceDiscovered(new PeerHandle(msg.arg1),
-                                        msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE),
-                                        matchFilter);
-                            } else {
-                                mOriginalCallback.onServiceDiscoveredWithinRange(
-                                        new PeerHandle(msg.arg1),
-                                        msg.getData().getByteArray(MESSAGE_BUNDLE_KEY_MESSAGE),
-                                        matchFilter, msg.arg2);
-                            }
-                            break;
-                        }
-                        case CALLBACK_MESSAGE_SEND_SUCCESS:
-                            mOriginalCallback.onMessageSendSucceeded(msg.arg1);
-                            break;
-                        case CALLBACK_MESSAGE_SEND_FAIL:
-                            mOriginalCallback.onMessageSendFailed(msg.arg1);
-                            break;
-                        case CALLBACK_MESSAGE_RECEIVED:
-                            mOriginalCallback.onMessageReceived(new PeerHandle(msg.arg1),
-                                    (byte[]) msg.obj);
-                            break;
-                    }
-                }
-            };
-        }
-
-        @Override
-        public void onSessionStarted(int sessionId) {
-            if (VDBG) Log.v(TAG, "onSessionStarted: sessionId=" + sessionId);
-
-            Message msg = mHandler.obtainMessage(CALLBACK_SESSION_STARTED);
-            msg.arg1 = sessionId;
-            mHandler.sendMessage(msg);
-        }
-
-        @Override
-        public void onSessionConfigSuccess() {
-            if (VDBG) Log.v(TAG, "onSessionConfigSuccess");
-
-            Message msg = mHandler.obtainMessage(CALLBACK_SESSION_CONFIG_SUCCESS);
-            mHandler.sendMessage(msg);
-        }
-
-        @Override
-        public void onSessionConfigFail(int reason) {
-            if (VDBG) Log.v(TAG, "onSessionConfigFail: reason=" + reason);
-
-            Message msg = mHandler.obtainMessage(CALLBACK_SESSION_CONFIG_FAIL);
-            msg.arg1 = reason;
-            mHandler.sendMessage(msg);
-        }
-
-        @Override
-        public void onSessionTerminated(int reason) {
-            if (VDBG) Log.v(TAG, "onSessionTerminated: reason=" + reason);
-
-            Message msg = mHandler.obtainMessage(CALLBACK_SESSION_TERMINATED);
-            msg.arg1 = reason;
-            mHandler.sendMessage(msg);
-        }
-
-        private void onMatchCommon(int messageType, int peerId, byte[] serviceSpecificInfo,
-                byte[] matchFilter, int distanceMm) {
-            Bundle data = new Bundle();
-            data.putByteArray(MESSAGE_BUNDLE_KEY_MESSAGE, serviceSpecificInfo);
-            data.putByteArray(MESSAGE_BUNDLE_KEY_MESSAGE2, matchFilter);
-
-            Message msg = mHandler.obtainMessage(messageType);
-            msg.arg1 = peerId;
-            msg.arg2 = distanceMm;
-            msg.setData(data);
-            mHandler.sendMessage(msg);
-        }
-
-        @Override
-        public void onMatch(int peerId, byte[] serviceSpecificInfo, byte[] matchFilter) {
-            if (VDBG) Log.v(TAG, "onMatch: peerId=" + peerId);
-
-            onMatchCommon(CALLBACK_MATCH, peerId, serviceSpecificInfo, matchFilter, 0);
-        }
-
-        @Override
-        public void onMatchWithDistance(int peerId, byte[] serviceSpecificInfo, byte[] matchFilter,
-                int distanceMm) {
-            if (VDBG) {
-                Log.v(TAG, "onMatchWithDistance: peerId=" + peerId + ", distanceMm=" + distanceMm);
-            }
-
-            onMatchCommon(CALLBACK_MATCH_WITH_DISTANCE, peerId, serviceSpecificInfo, matchFilter,
-                    distanceMm);
-        }
-
-        @Override
-        public void onMessageSendSuccess(int messageId) {
-            if (VDBG) Log.v(TAG, "onMessageSendSuccess");
-
-            Message msg = mHandler.obtainMessage(CALLBACK_MESSAGE_SEND_SUCCESS);
-            msg.arg1 = messageId;
-            mHandler.sendMessage(msg);
-        }
-
-        @Override
-        public void onMessageSendFail(int messageId, int reason) {
-            if (VDBG) Log.v(TAG, "onMessageSendFail: reason=" + reason);
-
-            Message msg = mHandler.obtainMessage(CALLBACK_MESSAGE_SEND_FAIL);
-            msg.arg1 = messageId;
-            msg.arg2 = reason;
-            mHandler.sendMessage(msg);
-        }
-
-        @Override
-        public void onMessageReceived(int peerId, byte[] message) {
-            if (VDBG) {
-                Log.v(TAG, "onMessageReceived: peerId=" + peerId);
-            }
-
-            Message msg = mHandler.obtainMessage(CALLBACK_MESSAGE_RECEIVED);
-            msg.arg1 = peerId;
-            msg.obj = message;
-            mHandler.sendMessage(msg);
-        }
-
-        /*
-         * Proxied methods
-         */
-        public void onProxySessionStarted(int sessionId) {
-            if (VDBG) Log.v(TAG, "Proxy: onSessionStarted: sessionId=" + sessionId);
-            if (mSession != null) {
-                Log.e(TAG,
-                        "onSessionStarted: sessionId=" + sessionId + ": session already created!?");
-                throw new IllegalStateException(
-                        "onSessionStarted: sessionId=" + sessionId + ": session already created!?");
-            }
-
-            WifiAwareManager mgr = mAwareManager.get();
-            if (mgr == null) {
-                Log.w(TAG, "onProxySessionStarted: mgr GC'd");
-                return;
-            }
-
-            if (mIsPublish) {
-                PublishDiscoverySession session = new PublishDiscoverySession(mgr,
-                        mClientId, sessionId);
-                mSession = session;
-                mOriginalCallback.onPublishStarted(session);
-            } else {
-                SubscribeDiscoverySession
-                        session = new SubscribeDiscoverySession(mgr, mClientId, sessionId);
-                mSession = session;
-                mOriginalCallback.onSubscribeStarted(session);
-            }
-        }
-
-        public void onProxySessionTerminated(int reason) {
-            if (VDBG) Log.v(TAG, "Proxy: onSessionTerminated: reason=" + reason);
-            if (mSession != null) {
-                mSession.setTerminated();
-                mSession = null;
-            } else {
-                Log.w(TAG, "Proxy: onSessionTerminated called but mSession is null!?");
-            }
-            mAwareManager.clear();
-            mOriginalCallback.onSessionTerminated();
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareNetworkInfo.java b/wifi/java/android/net/wifi/aware/WifiAwareNetworkInfo.java
deleted file mode 100644
index 60fe604..0000000
--- a/wifi/java/android/net/wifi/aware/WifiAwareNetworkInfo.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.Nullable;
-import android.net.NetworkCapabilities;
-import android.net.TransportInfo;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.net.Inet6Address;
-import java.net.NetworkInterface;
-import java.net.SocketException;
-import java.net.UnknownHostException;
-import java.util.Objects;
-
-/**
- * Wi-Fi Aware-specific network information. The information can be extracted from the
- * {@link android.net.NetworkCapabilities} of the network using
- * {@link NetworkCapabilities#getTransportInfo()}.
- * The {@link NetworkCapabilities} is provided by the connectivity service to apps, e.g. received
- * through the
- * {@link android.net.ConnectivityManager.NetworkCallback#onCapabilitiesChanged(android.net.Network,
- * android.net.NetworkCapabilities)} callback.
- * <p>
- * The Wi-Fi Aware-specific network information include the peer's scoped link-local IPv6 address
- * for the Wi-Fi Aware link, as well as (optionally) the port and transport protocol specified by
- * the peer.
- * The scoped link-local IPv6, port, and transport protocol can then be used to create a
- * {@link java.net.Socket} connection to the peer.
- * <p>
- * Note: these are the peer's IPv6 and port information - not the local device's!
- */
-public final class WifiAwareNetworkInfo implements TransportInfo, Parcelable {
-    private Inet6Address mIpv6Addr;
-    private int mPort = 0; // a value of 0 is considered invalid
-    private int mTransportProtocol = -1; // a value of -1 is considered invalid
-
-    /** @hide */
-    public WifiAwareNetworkInfo(Inet6Address ipv6Addr) {
-        mIpv6Addr = ipv6Addr;
-    }
-
-    /** @hide */
-    public WifiAwareNetworkInfo(Inet6Address ipv6Addr, int port, int transportProtocol) {
-        mIpv6Addr = ipv6Addr;
-        mPort = port;
-        mTransportProtocol = transportProtocol;
-    }
-
-    /**
-     * Get the scoped link-local IPv6 address of the Wi-Fi Aware peer (not of the local device!).
-     *
-     * @return An IPv6 address.
-     */
-    @Nullable
-    public Inet6Address getPeerIpv6Addr() {
-        return mIpv6Addr;
-    }
-
-    /**
-     * Get the port number to be used to create a network connection to the Wi-Fi Aware peer.
-     * The port information is provided by the app running on the peer which requested the
-     * connection, using the {@link WifiAwareNetworkSpecifier.Builder#setPort(int)}.
-     *
-     * @return A port number on the peer. A value of 0 indicates that no port was specified by the
-     *         peer.
-     */
-    public int getPort() {
-        return mPort;
-    }
-
-    /**
-     * Get the transport protocol to be used to communicate over a network connection to the Wi-Fi
-     * Aware peer. The transport protocol is provided by the app running on the peer which requested
-     * the connection, using the
-     * {@link WifiAwareNetworkSpecifier.Builder#setTransportProtocol(int)}.
-     * <p>
-     * The transport protocol number is assigned by the Internet Assigned Numbers Authority
-     * (IANA) https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml.
-     *
-     * @return A transport protocol id. A value of -1 indicates that no transport protocol was
-     *         specified by the peer.
-     */
-    public int getTransportProtocol() {
-        return mTransportProtocol;
-    }
-
-    // parcelable methods
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeByteArray(mIpv6Addr.getAddress());
-        NetworkInterface ni = mIpv6Addr.getScopedInterface();
-        dest.writeString(ni == null ? null : ni.getName());
-        dest.writeInt(mPort);
-        dest.writeInt(mTransportProtocol);
-    }
-
-    public static final @android.annotation.NonNull Creator<WifiAwareNetworkInfo> CREATOR =
-            new Creator<WifiAwareNetworkInfo>() {
-                @Override
-                public WifiAwareNetworkInfo createFromParcel(Parcel in) {
-                    byte[] addr = in.createByteArray();
-                    String interfaceName = in.readString();
-                    int port = in.readInt();
-                    int transportProtocol = in.readInt();
-                    Inet6Address ipv6Addr;
-                    try {
-                        NetworkInterface ni = null;
-                        if (interfaceName != null) {
-                            try {
-                                ni = NetworkInterface.getByName(interfaceName);
-                            } catch (SocketException e) {
-                                e.printStackTrace();
-                            }
-                        }
-                        ipv6Addr = Inet6Address.getByAddress(null, addr, ni);
-                    } catch (UnknownHostException e) {
-                        e.printStackTrace();
-                        return new WifiAwareNetworkInfo(null);
-                    }
-                    return new WifiAwareNetworkInfo(ipv6Addr, port, transportProtocol);
-                }
-
-                @Override
-                public WifiAwareNetworkInfo[] newArray(int size) {
-                    return new WifiAwareNetworkInfo[size];
-                }
-            };
-
-
-    // object methods
-
-    @Override
-    public String toString() {
-        return new StringBuilder("AwareNetworkInfo: IPv6=").append(mIpv6Addr).append(
-                ", port=").append(mPort).append(", transportProtocol=").append(
-                mTransportProtocol).toString();
-    }
-
-    /** @hide */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (!(obj instanceof WifiAwareNetworkInfo)) {
-            return false;
-        }
-
-        WifiAwareNetworkInfo lhs = (WifiAwareNetworkInfo) obj;
-        return Objects.equals(mIpv6Addr, lhs.mIpv6Addr) && mPort == lhs.mPort
-                && mTransportProtocol == lhs.mTransportProtocol;
-    }
-
-    /** @hide */
-    @Override
-    public int hashCode() {
-        return Objects.hash(mIpv6Addr, mPort, mTransportProtocol);
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java b/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java
deleted file mode 100644
index 3547750..0000000
--- a/wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java
+++ /dev/null
@@ -1,446 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import static android.net.wifi.aware.WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR;
-
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-import android.net.NetworkSpecifier;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import java.util.Arrays;
-import java.util.Objects;
-
-/**
- * Network specifier object used to request a Wi-Fi Aware network. Apps should use the
- * {@link WifiAwareNetworkSpecifier.Builder} class to create an instance.
- */
-public final class WifiAwareNetworkSpecifier extends NetworkSpecifier implements Parcelable {
-    /**
-     * TYPE: in band, specific peer: role, client_id, session_id, peer_id, pmk/passphrase optional
-     * @hide
-     */
-    public static final int NETWORK_SPECIFIER_TYPE_IB = 0;
-
-    /**
-     * TYPE: in band, any peer: role, client_id, session_id, pmk/passphrase optional
-     * [only permitted for RESPONDER]
-     * @hide
-     */
-    public static final int NETWORK_SPECIFIER_TYPE_IB_ANY_PEER = 1;
-
-    /**
-     * TYPE: out-of-band: role, client_id, peer_mac, pmk/passphrase optional
-     * @hide
-     */
-    public static final int NETWORK_SPECIFIER_TYPE_OOB = 2;
-
-    /**
-     * TYPE: out-of-band, any peer: role, client_id, pmk/passphrase optional
-     * [only permitted for RESPONDER]
-     * @hide
-     */
-    public static final int NETWORK_SPECIFIER_TYPE_OOB_ANY_PEER = 3;
-
-    /** @hide */
-    public static final int NETWORK_SPECIFIER_TYPE_MAX_VALID = NETWORK_SPECIFIER_TYPE_OOB_ANY_PEER;
-
-    /**
-     * One of the NETWORK_SPECIFIER_TYPE_* constants. The type of the network specifier object.
-     * @hide
-     */
-    public final int type;
-
-    /**
-     * The role of the device: WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR or
-     * WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER.
-     * @hide
-     */
-    public final int role;
-
-    /**
-     * The client ID of the device.
-     * @hide
-     */
-    public final int clientId;
-
-    /**
-     * The session ID in which context to request a data-path. Only relevant for IB requests.
-     * @hide
-     */
-    public final int sessionId;
-
-    /**
-     * The peer ID of the device which the data-path should be connected to. Only relevant for
-     * IB requests (i.e. not IB_ANY_PEER or OOB*).
-     * @hide
-     */
-    public final int peerId;
-
-    /**
-     * The peer MAC address of the device which the data-path should be connected to. Only relevant
-     * for OB requests (i.e. not OOB_ANY_PEER or IB*).
-     * @hide
-     */
-    public final byte[] peerMac;
-
-    /**
-     * The PMK of the requested data-path. Can be null. Only one or none of pmk or passphrase should
-     * be specified.
-     * @hide
-     */
-    public final byte[] pmk;
-
-    /**
-     * The Passphrase of the requested data-path. Can be null. Only one or none of the pmk or
-     * passphrase should be specified.
-     * @hide
-     */
-    public final String passphrase;
-
-    /**
-     * The port information to be used for this link. This information will be communicated to the
-     * peer as part of the layer 2 link setup.
-     *
-     * Information only allowed on secure links since a single layer-2 link is set up for all
-     * requestors. Therefore if multiple apps on a single device request links to the same peer
-     * device they all get the same link. However, the link is only set up on the first request -
-     * hence only the first can transmit the port information. But we don't want to expose that
-     * information to other apps. Limiting to secure links would (usually) imply single app usage.
-     *
-     * @hide
-     */
-    public final int port;
-
-    /**
-     * The transport protocol information to be used for this link. This information will be
-     * communicated to the peer as part of the layer 2 link setup.
-     *
-     * Information only allowed on secure links since a single layer-2 link is set up for all
-     * requestors. Therefore if multiple apps on a single device request links to the same peer
-     * device they all get the same link. However, the link is only set up on the first request -
-     * hence only the first can transmit the port information. But we don't want to expose that
-     * information to other apps. Limiting to secure links would (usually) imply single app usage.
-     *
-     * @hide
-     */
-    public final int transportProtocol;
-
-    /** @hide */
-    public WifiAwareNetworkSpecifier(int type, int role, int clientId, int sessionId, int peerId,
-            byte[] peerMac, byte[] pmk, String passphrase, int port, int transportProtocol) {
-        this.type = type;
-        this.role = role;
-        this.clientId = clientId;
-        this.sessionId = sessionId;
-        this.peerId = peerId;
-        this.peerMac = peerMac;
-        this.pmk = pmk;
-        this.passphrase = passphrase;
-        this.port = port;
-        this.transportProtocol = transportProtocol;
-    }
-
-    public static final @android.annotation.NonNull Creator<WifiAwareNetworkSpecifier> CREATOR =
-            new Creator<WifiAwareNetworkSpecifier>() {
-                @Override
-                public WifiAwareNetworkSpecifier createFromParcel(Parcel in) {
-                    return new WifiAwareNetworkSpecifier(
-                        in.readInt(), // type
-                        in.readInt(), // role
-                        in.readInt(), // clientId
-                        in.readInt(), // sessionId
-                        in.readInt(), // peerId
-                        in.createByteArray(), // peerMac
-                        in.createByteArray(), // pmk
-                        in.readString(), // passphrase
-                        in.readInt(), // port
-                        in.readInt()); // transportProtocol
-                }
-
-                @Override
-                public WifiAwareNetworkSpecifier[] newArray(int size) {
-                    return new WifiAwareNetworkSpecifier[size];
-                }
-            };
-
-    /**
-     * Indicates whether the network specifier specifies an OOB (out-of-band) data-path - i.e. a
-     * data-path created without a corresponding Aware discovery session.
-     *
-     * @hide
-     */
-    public boolean isOutOfBand() {
-        return type == NETWORK_SPECIFIER_TYPE_OOB || type == NETWORK_SPECIFIER_TYPE_OOB_ANY_PEER;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(type);
-        dest.writeInt(role);
-        dest.writeInt(clientId);
-        dest.writeInt(sessionId);
-        dest.writeInt(peerId);
-        dest.writeByteArray(peerMac);
-        dest.writeByteArray(pmk);
-        dest.writeString(passphrase);
-        dest.writeInt(port);
-        dest.writeInt(transportProtocol);
-    }
-
-    /** @hide */
-    @Override
-    public boolean canBeSatisfiedBy(NetworkSpecifier other) {
-        // MatchAllNetworkSpecifier is taken care in NetworkCapabilities#satisfiedBySpecifier.
-        if (other instanceof WifiAwareAgentNetworkSpecifier) {
-            return ((WifiAwareAgentNetworkSpecifier) other).satisfiesAwareNetworkSpecifier(this);
-        }
-        return equals(other);
-    }
-
-    /** @hide */
-    @Override
-    public int hashCode() {
-        return Objects.hash(type, role, clientId, sessionId, peerId, Arrays.hashCode(peerMac),
-                Arrays.hashCode(pmk), passphrase, port, transportProtocol);
-    }
-
-    /** @hide */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (!(obj instanceof WifiAwareNetworkSpecifier)) {
-            return false;
-        }
-
-        WifiAwareNetworkSpecifier lhs = (WifiAwareNetworkSpecifier) obj;
-
-        return type == lhs.type
-                && role == lhs.role
-                && clientId == lhs.clientId
-                && sessionId == lhs.sessionId
-                && peerId == lhs.peerId
-                && Arrays.equals(peerMac, lhs.peerMac)
-                && Arrays.equals(pmk, lhs.pmk)
-                && Objects.equals(passphrase, lhs.passphrase)
-                && port == lhs.port
-                && transportProtocol == lhs.transportProtocol;
-    }
-
-    /** @hide */
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder("WifiAwareNetworkSpecifier [");
-        sb.append("type=").append(type)
-                .append(", role=").append(role)
-                .append(", clientId=").append(clientId)
-                .append(", sessionId=").append(sessionId)
-                .append(", peerId=").append(peerId)
-                // masking potential PII (although low impact information)
-                .append(", peerMac=").append((peerMac == null) ? "<null>" : "<non-null>")
-                // masking PII
-                .append(", pmk=").append((pmk == null) ? "<null>" : "<non-null>")
-                // masking PII
-                .append(", passphrase=").append((passphrase == null) ? "<null>" : "<non-null>")
-                .append(", port=").append(port).append(", transportProtocol=")
-                .append(transportProtocol)
-                .append("]");
-        return sb.toString();
-    }
-
-    /**
-     * A builder class for a Wi-Fi Aware network specifier to set up an Aware connection with a
-     * peer.
-     */
-    public static final class Builder {
-        private DiscoverySession mDiscoverySession;
-        private PeerHandle mPeerHandle;
-        private String mPskPassphrase;
-        private byte[] mPmk;
-        private int mPort = 0; // invalid value
-        private int mTransportProtocol = -1; // invalid value
-
-        /**
-         * Create a builder for {@link WifiAwareNetworkSpecifier} used in requests to set up a
-         * Wi-Fi Aware connection with a peer.
-         *
-         * @param discoverySession A Wi-Fi Aware discovery session in whose context the connection
-         *                         is created.
-         * @param peerHandle The handle of the peer to which the Wi-Fi Aware connection is
-         *                   requested. The peer is discovered through Wi-Fi Aware discovery. The
-         *                   handle can be obtained through
-         * {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle, byte[], java.util.List)}
-         *                   or
-         *                   {@link DiscoverySessionCallback#onMessageReceived(PeerHandle, byte[])}.
-         */
-        public Builder(@NonNull DiscoverySession discoverySession, @NonNull PeerHandle peerHandle) {
-            if (discoverySession == null) {
-                throw new IllegalArgumentException("Non-null discoverySession required");
-            }
-            if (peerHandle == null) {
-                throw new IllegalArgumentException("Non-null peerHandle required");
-            }
-            mDiscoverySession = discoverySession;
-            mPeerHandle = peerHandle;
-        }
-
-        /**
-         * Configure the PSK Passphrase for the Wi-Fi Aware connection being requested. This method
-         * is optional - if not called, then an Open (unencrypted) connection will be created.
-         *
-         * @param pskPassphrase The (optional) passphrase to be used to encrypt the link. Use the
-         *                      {@link #setPmk(byte[])} to specify a PMK.
-         * @return the current {@link Builder} builder, enabling chaining of builder
-         *         methods.
-         */
-        public @NonNull Builder setPskPassphrase(@NonNull String pskPassphrase) {
-            if (!WifiAwareUtils.validatePassphrase(pskPassphrase)) {
-                throw new IllegalArgumentException("Passphrase must meet length requirements");
-            }
-            mPskPassphrase = pskPassphrase;
-            return this;
-        }
-
-        /**
-         * Configure the PMK for the Wi-Fi Aware connection being requested. This method
-         * is optional - if not called, then an Open (unencrypted) connection will be created.
-         *
-         * @param pmk A PMK (pairwise master key, see IEEE 802.11i) specifying the key to use for
-         *            encrypting the data-path. Use the {@link #setPskPassphrase(String)} to
-         *            specify a Passphrase.
-         * @return the current {@link Builder} builder, enabling chaining of builder
-         *         methods.
-         */
-        public @NonNull Builder setPmk(@NonNull byte[] pmk) {
-            if (!WifiAwareUtils.validatePmk(pmk)) {
-                throw new IllegalArgumentException("PMK must 32 bytes");
-            }
-            mPmk = pmk;
-            return this;
-        }
-
-        /**
-         * Configure the port number which will be used to create a connection over this link. This
-         * configuration should only be done on the server device, e.g. the device creating the
-         * {@link java.net.ServerSocket}.
-         * <p>Notes:
-         * <ul>
-         *     <li>The server device must be the Publisher device!
-         *     <li>The port information can only be specified on secure links, specified using
-         *     {@link #setPskPassphrase(String)} or {@link #setPmk(byte[])}.
-         * </ul>
-         *
-         * @param port A positive integer indicating the port to be used for communication.
-         * @return the current {@link Builder} builder, enabling chaining of builder
-         *         methods.
-         */
-        public @NonNull Builder setPort(@IntRange(from = 0, to = 65535) int port) {
-            if (port <= 0 || port > 65535) {
-                throw new IllegalArgumentException("The port must be a positive value (0, 65535]");
-            }
-            mPort = port;
-            return this;
-        }
-
-        /**
-         * Configure the transport protocol which will be used to create a connection over this
-         * link. This configuration should only be done on the server device, e.g. the device
-         * creating the {@link java.net.ServerSocket} for TCP.
-         * <p>Notes:
-         * <ul>
-         *     <li>The server device must be the Publisher device!
-         *     <li>The transport protocol information can only be specified on secure links,
-         *     specified using {@link #setPskPassphrase(String)} or {@link #setPmk(byte[])}.
-         * </ul>
-         * The transport protocol number is assigned by the Internet Assigned Numbers Authority
-         * (IANA) https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml.
-         *
-         * @param transportProtocol The transport protocol to be used for communication.
-         * @return the current {@link Builder} builder, enabling chaining of builder
-         *         methods.
-         */
-        public @NonNull
-                Builder setTransportProtocol(@IntRange(from = 0, to = 255) int transportProtocol) {
-            if (transportProtocol < 0 || transportProtocol > 255) {
-                throw new IllegalArgumentException(
-                        "The transport protocol must be in range [0, 255]");
-            }
-            mTransportProtocol = transportProtocol;
-            return this;
-        }
-
-        /**
-         * Create a {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)}
-         * for a WiFi Aware connection (link) to the specified peer. The
-         * {@link android.net.NetworkRequest.Builder#addTransportType(int)} should be set to
-         * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_AWARE}.
-         * <p> The default builder constructor will initialize a NetworkSpecifier which requests an
-         * open (non-encrypted) link. To request an encrypted link use the
-         * {@link #setPskPassphrase(String)} or {@link #setPmk(byte[])} builder methods.
-         *
-         * @return A {@link NetworkSpecifier} to be used to construct
-         * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} to pass
-         * to {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
-         * android.net.ConnectivityManager.NetworkCallback)}
-         * [or other varieties of that API].
-         */
-        public @NonNull WifiAwareNetworkSpecifier build() {
-            if (mDiscoverySession == null) {
-                throw new IllegalStateException("Null discovery session!?");
-            }
-            if (mPeerHandle == null) {
-                throw new IllegalStateException("Null peerHandle!?");
-            }
-            if (mPskPassphrase != null & mPmk != null) {
-                throw new IllegalStateException(
-                        "Can only specify a Passphrase or a PMK - not both!");
-            }
-
-            int role = mDiscoverySession instanceof SubscribeDiscoverySession
-                    ? WIFI_AWARE_DATA_PATH_ROLE_INITIATOR
-                    : WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER;
-
-            if (mPort != 0 || mTransportProtocol != -1) {
-                if (role != WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER) {
-                    throw new IllegalStateException(
-                            "Port and transport protocol information can only "
-                                    + "be specified on the Publisher device (which is the server");
-                }
-                if (TextUtils.isEmpty(mPskPassphrase) && mPmk == null) {
-                    throw new IllegalStateException("Port and transport protocol information can "
-                            + "only be specified on a secure link");
-                }
-            }
-
-            return new WifiAwareNetworkSpecifier(
-                    WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_IB, role,
-                    mDiscoverySession.mClientId, mDiscoverySession.mSessionId, mPeerHandle.peerId,
-                    null, mPmk, mPskPassphrase, mPort, mTransportProtocol);
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareSession.java b/wifi/java/android/net/wifi/aware/WifiAwareSession.java
deleted file mode 100644
index fe0872c..0000000
--- a/wifi/java/android/net/wifi/aware/WifiAwareSession.java
+++ /dev/null
@@ -1,343 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.net.NetworkSpecifier;
-import android.os.Binder;
-import android.os.Handler;
-import android.os.Looper;
-import android.util.CloseGuard;
-import android.util.Log;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-import java.lang.ref.Reference;
-import java.lang.ref.WeakReference;
-
-/**
- * This class represents a Wi-Fi Aware session - an attachment to the Wi-Fi Aware service through
- * which the app can execute discovery operations.
- */
-public class WifiAwareSession implements AutoCloseable {
-    private static final String TAG = "WifiAwareSession";
-    private static final boolean DBG = false;
-    private static final boolean VDBG = false; // STOPSHIP if true
-
-    private final WeakReference<WifiAwareManager> mMgr;
-    private final Binder mBinder;
-    private final int mClientId;
-
-    private boolean mTerminated = true;
-    private final CloseGuard mCloseGuard = new CloseGuard();
-
-    /** @hide */
-    public WifiAwareSession(WifiAwareManager manager, Binder binder, int clientId) {
-        if (VDBG) Log.v(TAG, "New session created: manager=" + manager + ", clientId=" + clientId);
-
-        mMgr = new WeakReference<>(manager);
-        mBinder = binder;
-        mClientId = clientId;
-        mTerminated = false;
-
-        mCloseGuard.open("close");
-    }
-
-    /**
-     * Destroy the Wi-Fi Aware service session and, if no other applications are attached to Aware,
-     * also disable Aware. This method destroys all outstanding operations - i.e. all publish and
-     * subscribes are terminated, and any outstanding data-links are shut-down. However, it is
-     * good practice to destroy these discovery sessions and connections explicitly before a
-     * session-wide destroy.
-     * <p>
-     * An application may re-attach after a destroy using
-     * {@link WifiAwareManager#attach(AttachCallback, Handler)} .
-     */
-    @Override
-    public void close() {
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.w(TAG, "destroy: called post GC on WifiAwareManager");
-            return;
-        }
-        mgr.disconnect(mClientId, mBinder);
-        mTerminated = true;
-        mMgr.clear();
-        mCloseGuard.close();
-        Reference.reachabilityFence(this);
-    }
-
-    /** @hide */
-    @Override
-    protected void finalize() throws Throwable {
-        try {
-            if (mCloseGuard != null) {
-                mCloseGuard.warnIfOpen();
-            }
-
-            if (!mTerminated) {
-                close();
-            }
-        } finally {
-            super.finalize();
-        }
-    }
-
-    /**
-     * Access the client ID of the Aware session.
-     *
-     * Note: internal visibility for testing.
-     *
-     * @return The internal client ID.
-     *
-     * @hide
-     */
-    @VisibleForTesting
-    public int getClientId() {
-        return mClientId;
-    }
-
-    /**
-     * Issue a request to the Aware service to create a new Aware publish discovery session, using
-     * the specified {@code publishConfig} configuration. The results of the publish operation
-     * are routed to the callbacks of {@link DiscoverySessionCallback}:
-     * <ul>
-     *     <li>
-     *     {@link DiscoverySessionCallback#onPublishStarted(
-     *PublishDiscoverySession)}
-     *     is called when the publish session is created and provides a handle to the session.
-     *     Further operations on the publish session can be executed on that object.
-     *     <li>{@link DiscoverySessionCallback#onSessionConfigFailed()} is called if the
-     *     publish operation failed.
-     * </ul>
-     * <p>
-     * Other results of the publish session operations will also be routed to callbacks
-     * on the {@code callback} object. The resulting publish session can be modified using
-     * {@link PublishDiscoverySession#updatePublish(PublishConfig)}.
-     * <p>
-     *      An application must use the {@link DiscoverySession#close()} to
-     *      terminate the publish discovery session once it isn't needed. This will free
-     *      resources as well terminate any on-air transmissions.
-     * <p>The application must have the {@link android.Manifest.permission#ACCESS_FINE_LOCATION}
-     * permission to start a publish discovery session.
-     *
-     * @param publishConfig The {@link PublishConfig} specifying the
-     *            configuration of the requested publish session.
-     * @param callback A {@link DiscoverySessionCallback} derived object to be used for
-     *                 session event callbacks.
-     * @param handler The Handler on whose thread to execute the callbacks of the {@code
-     * callback} object. If a null is provided then the application's main thread will be used.
-     */
-    public void publish(@NonNull PublishConfig publishConfig,
-            @NonNull DiscoverySessionCallback callback, @Nullable Handler handler) {
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.e(TAG, "publish: called post GC on WifiAwareManager");
-            return;
-        }
-        if (mTerminated) {
-            Log.e(TAG, "publish: called after termination");
-            return;
-        }
-        mgr.publish(mClientId, (handler == null) ? Looper.getMainLooper() : handler.getLooper(),
-                publishConfig, callback);
-    }
-
-    /**
-     * Issue a request to the Aware service to create a new Aware subscribe discovery session, using
-     * the specified {@code subscribeConfig} configuration. The results of the subscribe
-     * operation are routed to the callbacks of {@link DiscoverySessionCallback}:
-     * <ul>
-     *     <li>
-     *  {@link DiscoverySessionCallback#onSubscribeStarted(
-     *SubscribeDiscoverySession)}
-     *     is called when the subscribe session is created and provides a handle to the session.
-     *     Further operations on the subscribe session can be executed on that object.
-     *     <li>{@link DiscoverySessionCallback#onSessionConfigFailed()} is called if the
-     *     subscribe operation failed.
-     * </ul>
-     * <p>
-     * Other results of the subscribe session operations will also be routed to callbacks
-     * on the {@code callback} object. The resulting subscribe session can be modified using
-     * {@link SubscribeDiscoverySession#updateSubscribe(SubscribeConfig)}.
-     * <p>
-     *      An application must use the {@link DiscoverySession#close()} to
-     *      terminate the subscribe discovery session once it isn't needed. This will free
-     *      resources as well terminate any on-air transmissions.
-     * <p>The application must have the {@link android.Manifest.permission#ACCESS_FINE_LOCATION}
-     * permission to start a subscribe discovery session.
-     *
-     * @param subscribeConfig The {@link SubscribeConfig} specifying the
-     *            configuration of the requested subscribe session.
-     * @param callback A {@link DiscoverySessionCallback} derived object to be used for
-     *                 session event callbacks.
-     * @param handler The Handler on whose thread to execute the callbacks of the {@code
-     * callback} object. If a null is provided then the application's main thread will be used.
-     */
-    public void subscribe(@NonNull SubscribeConfig subscribeConfig,
-            @NonNull DiscoverySessionCallback callback, @Nullable Handler handler) {
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.e(TAG, "publish: called post GC on WifiAwareManager");
-            return;
-        }
-        if (mTerminated) {
-            Log.e(TAG, "publish: called after termination");
-            return;
-        }
-        mgr.subscribe(mClientId, (handler == null) ? Looper.getMainLooper() : handler.getLooper(),
-                subscribeConfig, callback);
-    }
-
-    /**
-     * Create a {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} for
-     * an unencrypted WiFi Aware connection (link) to the specified peer. The
-     * {@link android.net.NetworkRequest.Builder#addTransportType(int)} should be set to
-     * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_AWARE}.
-     * <p>
-     *     This API is targeted for applications which can obtain the peer MAC address using OOB
-     *     (out-of-band) discovery. Aware discovery does not provide the MAC address of the peer -
-     *     when using Aware discovery use the alternative network specifier method -
-     *     {@link android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder}.
-     * <p>
-     * To set up an encrypted link use the
-     * {@link #createNetworkSpecifierPassphrase(int, byte[], String)} API.
-     *
-     * @param role  The role of this device:
-     *              {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_INITIATOR} or
-     *              {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_RESPONDER}
-     * @param peer  The MAC address of the peer's Aware discovery interface. On a RESPONDER this
-     *              value is used to gate the acceptance of a connection request from only that
-     *              peer.
-     *
-     * @return A {@link NetworkSpecifier} to be used to construct
-     * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} to pass to
-     * {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
-     * android.net.ConnectivityManager.NetworkCallback)}
-     * [or other varieties of that API].
-     */
-    public NetworkSpecifier createNetworkSpecifierOpen(
-            @WifiAwareManager.DataPathRole int role, @NonNull byte[] peer) {
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.e(TAG, "createNetworkSpecifierOpen: called post GC on WifiAwareManager");
-            return null;
-        }
-        if (mTerminated) {
-            Log.e(TAG, "createNetworkSpecifierOpen: called after termination");
-            return null;
-        }
-        return mgr.createNetworkSpecifier(mClientId, role, peer, null, null);
-    }
-
-    /**
-     * Create a {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} for
-     * an encrypted WiFi Aware connection (link) to the specified peer. The
-     * {@link android.net.NetworkRequest.Builder#addTransportType(int)} should be set to
-     * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_AWARE}.
-     * <p>
-     *     This API is targeted for applications which can obtain the peer MAC address using OOB
-     *     (out-of-band) discovery. Aware discovery does not provide the MAC address of the peer -
-     *     when using Aware discovery use the alternative network specifier method -
-     *     {@link android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder}.
-     *
-     * @param role  The role of this device:
-     *              {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_INITIATOR} or
-     *              {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_RESPONDER}
-     * @param peer  The MAC address of the peer's Aware discovery interface. On a RESPONDER this
-     *              value is used to gate the acceptance of a connection request from only that
-     *              peer.
-     * @param passphrase The passphrase to be used to encrypt the link. The PMK is generated from
-     *                   the passphrase. Use {@link #createNetworkSpecifierOpen(int, byte[])} to
-     *                   specify an open (unencrypted) link.
-     *
-     * @return A {@link NetworkSpecifier} to be used to construct
-     * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} to pass to
-     * {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
-     * android.net.ConnectivityManager.NetworkCallback)}
-     * [or other varieties of that API].
-     */
-    public NetworkSpecifier createNetworkSpecifierPassphrase(
-            @WifiAwareManager.DataPathRole int role, @NonNull byte[] peer,
-            @NonNull String passphrase) {
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.e(TAG, "createNetworkSpecifierPassphrase: called post GC on WifiAwareManager");
-            return null;
-        }
-        if (mTerminated) {
-            Log.e(TAG, "createNetworkSpecifierPassphrase: called after termination");
-            return null;
-        }
-        if (!WifiAwareUtils.validatePassphrase(passphrase)) {
-            throw new IllegalArgumentException("Passphrase must meet length requirements");
-        }
-
-        return mgr.createNetworkSpecifier(mClientId, role, peer, null, passphrase);
-    }
-
-    /**
-     * Create a {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} for
-     * an encrypted WiFi Aware connection (link) to the specified peer. The
-     * {@link android.net.NetworkRequest.Builder#addTransportType(int)} should be set to
-     * {@link android.net.NetworkCapabilities#TRANSPORT_WIFI_AWARE}.
-     * <p>
-     *     This API is targeted for applications which can obtain the peer MAC address using OOB
-     *     (out-of-band) discovery. Aware discovery does not provide the MAC address of the peer -
-     *     when using Aware discovery use the alternative network specifier method -
-     *     {@link android.net.wifi.aware.WifiAwareNetworkSpecifier.Builder}.
-     *
-     * @param role  The role of this device:
-     *              {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_INITIATOR} or
-     *              {@link WifiAwareManager#WIFI_AWARE_DATA_PATH_ROLE_RESPONDER}
-     * @param peer  The MAC address of the peer's Aware discovery interface. On a RESPONDER this
-     *              value is used to gate the acceptance of a connection request from only that
-     *              peer.
-     * @param pmk A PMK (pairwise master key, see IEEE 802.11i) specifying the key to use for
-     *            encrypting the data-path. Use the
-     *            {@link #createNetworkSpecifierPassphrase(int, byte[], String)} to specify a
-     *            Passphrase or {@link #createNetworkSpecifierOpen(int, byte[])} to specify an
-     *            open (unencrypted) link.
-     *
-     * @return A {@link NetworkSpecifier} to be used to construct
-     * {@link android.net.NetworkRequest.Builder#setNetworkSpecifier(NetworkSpecifier)} to pass to
-     * {@link android.net.ConnectivityManager#requestNetwork(android.net.NetworkRequest,
-     * android.net.ConnectivityManager.NetworkCallback)}
-     * [or other varieties of that API].
-     *
-     * @hide
-     */
-    @SystemApi
-    public NetworkSpecifier createNetworkSpecifierPmk(
-            @WifiAwareManager.DataPathRole int role, @NonNull byte[] peer, @NonNull byte[] pmk) {
-        WifiAwareManager mgr = mMgr.get();
-        if (mgr == null) {
-            Log.e(TAG, "createNetworkSpecifierPmk: called post GC on WifiAwareManager");
-            return null;
-        }
-        if (mTerminated) {
-            Log.e(TAG, "createNetworkSpecifierPmk: called after termination");
-            return null;
-        }
-        if (!WifiAwareUtils.validatePmk(pmk)) {
-            throw new IllegalArgumentException("PMK must 32 bytes");
-        }
-        return mgr.createNetworkSpecifier(mClientId, role, peer, pmk, null);
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/WifiAwareUtils.java b/wifi/java/android/net/wifi/aware/WifiAwareUtils.java
deleted file mode 100644
index 3ece93df..0000000
--- a/wifi/java/android/net/wifi/aware/WifiAwareUtils.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import android.content.Context;
-import android.content.pm.PackageManager;
-import android.hardware.wifi.V1_0.Constants;
-
-/**
- * Provides utilities for the Wifi Aware manager/service.
- *
- * @hide
- */
-public class WifiAwareUtils {
-    /**
-     * Per spec: The Service Name is a UTF-8 encoded string from 1 to 255 bytes in length. The
-     * only acceptable single-byte UTF-8 symbols for a Service Name are alphanumeric values (A-Z,
-     * a-z, 0-9), the hyphen ('-'), and the period ('.'). All valid multi-byte UTF-8 characters
-     * are acceptable in a Service Name.
-     */
-    public static void validateServiceName(byte[] serviceNameData) throws IllegalArgumentException {
-        if (serviceNameData == null) {
-            throw new IllegalArgumentException("Invalid service name - null");
-        }
-
-        if (serviceNameData.length < 1 || serviceNameData.length > 255) {
-            throw new IllegalArgumentException("Invalid service name length - must be between "
-                    + "1 and 255 bytes (UTF-8 encoding)");
-        }
-
-        int index = 0;
-        while (index < serviceNameData.length) {
-            byte b = serviceNameData[index];
-            if ((b & 0x80) == 0x00) {
-                if (!((b >= '0' && b <= '9') || (b >= 'a' && b <= 'z') || (b >= 'A' && b <= 'Z')
-                        || b == '-' || b == '.')) {
-                    throw new IllegalArgumentException("Invalid service name - illegal characters,"
-                            + " allowed = (0-9, a-z,A-Z, -, .)");
-                }
-            }
-            ++index;
-        }
-    }
-
-    /**
-     * Validates that the passphrase is a non-null string of the right size (per the HAL min/max
-     * length parameters).
-     *
-     * @param passphrase Passphrase to test
-     * @return true if passphrase is valid, false if not
-     */
-    public static boolean validatePassphrase(String passphrase) {
-        if (passphrase == null
-                || passphrase.length() < Constants.NanParamSizeLimits.MIN_PASSPHRASE_LENGTH
-                || passphrase.length() > Constants.NanParamSizeLimits.MAX_PASSPHRASE_LENGTH) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Validates that the PMK is a non-null byte array of the right size (32 bytes per spec).
-     *
-     * @param pmk PMK to test
-     * @return true if PMK is valid, false if not
-     */
-    public static boolean validatePmk(byte[] pmk) {
-        if (pmk == null || pmk.length != 32) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Returns true if the App version is older than minVersion.
-     */
-    public static boolean isLegacyVersion(Context context, int minVersion) {
-        try {
-            if (context.getPackageManager().getApplicationInfo(context.getOpPackageName(), 0)
-                    .targetSdkVersion < minVersion) {
-                return true;
-            }
-        } catch (PackageManager.NameNotFoundException e) {
-            // In case of exception, assume known app (more strict checking)
-            // Note: This case will never happen since checkPackage is
-            // called to verify valididity before checking App's version.
-        }
-        return false;
-    }
-}
diff --git a/wifi/java/android/net/wifi/aware/package.html b/wifi/java/android/net/wifi/aware/package.html
deleted file mode 100644
index c4f2e1f..0000000
--- a/wifi/java/android/net/wifi/aware/package.html
+++ /dev/null
@@ -1,43 +0,0 @@
-<HTML>
-<BODY>
-<p>Provides classes which allow applications to use Wi-Fi Aware to discover peers and create
-    connections to them.</p>
-<p>Using the Wi-Fi Aware APIs, applications can advertise services, discover peers which are
-    advertising services, and connect to them.
-    Wi-Fi Aware is independent of Wi-Fi infrastructure (i.e. a device may or may
-    not be associated with an AP concurrent to using Wi-Fi Aware). </p>
-<p>The primary entry point to Wi-Fi Aware capabilities is the
-    {@link android.net.wifi.aware.WifiAwareManager} class, which is acquired by calling
-    {@link android.content.Context#getSystemService(String)
-    Context.getSystemService(Context.WIFI_AWARE_SERVICE)}</p>
-
-<p>Some APIs may require the following user permissions:</p>
-<ul>
-    <li>{@link android.Manifest.permission#ACCESS_WIFI_STATE}</li>
-    <li>{@link android.Manifest.permission#CHANGE_WIFI_STATE}</li>
-    <li>{@link android.Manifest.permission#ACCESS_FINE_LOCATION}</li>
-</ul>
-
-<p class="note"><strong>Note:</strong> Not all Android-powered devices support Wi-Fi Aware
-    functionality.
-    If your application only works with Wi-Fi Aware (i.e. it should only be installed on devices which
-    support Wi-Fi Aware), declare so with a <a
-            href="{@docRoot}guide/topics/manifest/uses-feature-element.html">
-        {@code <uses-feature>}</a>
-    element in the manifest file:</p>
-<pre>
-&lt;manifest ...>
-    &lt;uses-feature android:name="android.hardware.wifi.aware" />
-    ...
-&lt;/manifest>
-</pre>
-<p>Alternatively, if you application does not require Wi-Fi Aware but can take advantage of it if
-    available, you can perform
-    the check at run-time in your code using {@link
-    android.content.pm.PackageManager#hasSystemFeature(String)} with {@link
-    android.content.pm.PackageManager#FEATURE_WIFI_AWARE}:</p>
-<pre>
-    getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_AWARE)
-</pre>
-</BODY>
-</HTML>
diff --git a/wifi/java/android/net/wifi/hotspot2/ConfigParser.java b/wifi/java/android/net/wifi/hotspot2/ConfigParser.java
deleted file mode 100644
index bb01365..0000000
--- a/wifi/java/android/net/wifi/hotspot2/ConfigParser.java
+++ /dev/null
@@ -1,486 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2;
-
-import android.net.wifi.hotspot2.omadm.PpsMoParser;
-import android.text.TextUtils;
-import android.util.Base64;
-import android.util.Log;
-import android.util.Pair;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.LineNumberReader;
-import java.nio.charset.StandardCharsets;
-import java.security.GeneralSecurityException;
-import java.security.KeyStore;
-import java.security.PrivateKey;
-import java.security.cert.Certificate;
-import java.security.cert.CertificateException;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509Certificate;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Utility class for building PasspointConfiguration from an installation file.
- */
-public final class ConfigParser {
-    private static final String TAG = "ConfigParser";
-
-    // Header names.
-    private static final String CONTENT_TYPE = "Content-Type";
-    private static final String CONTENT_TRANSFER_ENCODING = "Content-Transfer-Encoding";
-
-    // MIME types.
-    private static final String TYPE_MULTIPART_MIXED = "multipart/mixed";
-    private static final String TYPE_WIFI_CONFIG = "application/x-wifi-config";
-    private static final String TYPE_PASSPOINT_PROFILE = "application/x-passpoint-profile";
-    private static final String TYPE_CA_CERT = "application/x-x509-ca-cert";
-    private static final String TYPE_PKCS12 = "application/x-pkcs12";
-
-    private static final String ENCODING_BASE64 = "base64";
-    private static final String BOUNDARY = "boundary=";
-
-    /**
-     * Class represent a MIME (Multipurpose Internet Mail Extension) part.
-     */
-    private static class MimePart {
-        /**
-         * Content type of the part.
-         */
-        public String type = null;
-
-        /**
-         * Decoded data.
-         */
-        public byte[] data = null;
-
-        /**
-         * Flag indicating if this is the last part (ending with --{boundary}--).
-         */
-        public boolean isLast = false;
-    }
-
-    /**
-     * Class represent the MIME (Multipurpose Internet Mail Extension) header.
-     */
-    private static class MimeHeader {
-        /**
-         * Content type.
-         */
-        public String contentType = null;
-
-        /**
-         * Boundary string (optional), only applies for the outter MIME header.
-         */
-        public String boundary = null;
-
-        /**
-         * Encoding type.
-         */
-        public String encodingType = null;
-    }
-
-    /**
-     * @hide
-     */
-    public ConfigParser() {}
-
-    /**
-     * Parse the Hotspot 2.0 Release 1 configuration data into a {@link PasspointConfiguration}
-     * object.  The configuration data is a base64 encoded MIME multipart data.  Below is
-     * the format of the decoded message:
-     *
-     * Content-Type: multipart/mixed; boundary={boundary}
-     * Content-Transfer-Encoding: base64
-     * [Skip uninterested headers]
-     *
-     * --{boundary}
-     * Content-Type: application/x-passpoint-profile
-     * Content-Transfer-Encoding: base64
-     *
-     * [base64 encoded Passpoint profile data]
-     * --{boundary}
-     * Content-Type: application/x-x509-ca-cert
-     * Content-Transfer-Encoding: base64
-     *
-     * [base64 encoded X509 CA certificate data]
-     * --{boundary}
-     * Content-Type: application/x-pkcs12
-     * Content-Transfer-Encoding: base64
-     *
-     * [base64 encoded PKCS#12 ASN.1 structure containing client certificate chain]
-     * --{boundary}
-     *
-     * @param mimeType MIME type of the encoded data.
-     * @param data A base64 encoded MIME multipart message containing the Passpoint profile
-     *             (required), CA (Certificate Authority) certificate (optional), and client
-     *             certificate chain (optional).
-     * @return {@link PasspointConfiguration}
-     */
-    public static PasspointConfiguration parsePasspointConfig(String mimeType, byte[] data) {
-        // Verify MIME type.
-        if (!TextUtils.equals(mimeType, TYPE_WIFI_CONFIG)) {
-            Log.e(TAG, "Unexpected MIME type: " + mimeType);
-            return null;
-        }
-
-        try {
-            // Decode the data.
-            byte[] decodedData = Base64.decode(new String(data, StandardCharsets.ISO_8859_1),
-                    Base64.DEFAULT);
-            Map<String, byte[]> mimeParts = parseMimeMultipartMessage(new LineNumberReader(
-                    new InputStreamReader(new ByteArrayInputStream(decodedData),
-                            StandardCharsets.ISO_8859_1)));
-            return createPasspointConfig(mimeParts);
-        } catch (IOException | IllegalArgumentException e) {
-            Log.e(TAG, "Failed to parse installation file: " + e.getMessage());
-            return null;
-        }
-    }
-
-    /**
-     * Create a {@link PasspointConfiguration} object from list of MIME (Multipurpose Internet
-     * Mail Extension) parts.
-     *
-     * @param mimeParts Map of content type and content data.
-     * @return {@link PasspointConfiguration}
-     * @throws IOException
-     */
-    private static PasspointConfiguration createPasspointConfig(Map<String, byte[]> mimeParts)
-            throws IOException {
-        byte[] profileData = mimeParts.get(TYPE_PASSPOINT_PROFILE);
-        if (profileData == null) {
-            throw new IOException("Missing Passpoint Profile");
-        }
-
-        PasspointConfiguration config = PpsMoParser.parseMoText(new String(profileData));
-        if (config == null) {
-            throw new IOException("Failed to parse Passpoint profile");
-        }
-
-        // Credential is needed for storing the certificates and private client key.
-        if (config.getCredential() == null) {
-            throw new IOException("Passpoint profile missing credential");
-        }
-
-        // Don't allow the installer to make changes to the update identifier. This is an
-        // indicator of an R2 (or newer) network.
-        if (config.getUpdateIdentifier() != Integer.MIN_VALUE) {
-            config.setUpdateIdentifier(Integer.MIN_VALUE);
-        }
-
-        // Parse CA (Certificate Authority) certificate.
-        byte[] caCertData = mimeParts.get(TYPE_CA_CERT);
-        if (caCertData != null) {
-            try {
-                config.getCredential().setCaCertificate(parseCACert(caCertData));
-            } catch (CertificateException e) {
-                throw new IOException("Failed to parse CA Certificate");
-            }
-        }
-
-        // Parse PKCS12 data for client private key and certificate chain.
-        byte[] pkcs12Data = mimeParts.get(TYPE_PKCS12);
-        if (pkcs12Data != null) {
-            try {
-                Pair<PrivateKey, List<X509Certificate>> clientKey = parsePkcs12(pkcs12Data);
-                config.getCredential().setClientPrivateKey(clientKey.first);
-                config.getCredential().setClientCertificateChain(
-                        clientKey.second.toArray(new X509Certificate[clientKey.second.size()]));
-            } catch(GeneralSecurityException | IOException e) {
-                throw new IOException("Failed to parse PCKS12 string");
-            }
-        }
-        return config;
-    }
-
-    /**
-     * Parse a MIME (Multipurpose Internet Mail Extension) multipart message from the given
-     * input stream.
-     *
-     * @param in The input stream for reading the message data
-     * @return A map of a content type and content data pair
-     * @throws IOException
-     */
-    private static Map<String, byte[]> parseMimeMultipartMessage(LineNumberReader in)
-            throws IOException {
-        // Parse the outer MIME header.
-        MimeHeader header = parseHeaders(in);
-        if (!TextUtils.equals(header.contentType, TYPE_MULTIPART_MIXED)) {
-            throw new IOException("Invalid content type: " + header.contentType);
-        }
-        if (TextUtils.isEmpty(header.boundary)) {
-            throw new IOException("Missing boundary string");
-        }
-        if (!TextUtils.equals(header.encodingType, ENCODING_BASE64)) {
-            throw new IOException("Unexpected encoding: " + header.encodingType);
-        }
-
-        // Read pass the first boundary string.
-        for (;;) {
-            String line = in.readLine();
-            if (line == null) {
-                throw new IOException("Unexpected EOF before first boundary @ " +
-                        in.getLineNumber());
-            }
-            if (line.equals("--" + header.boundary)) {
-                break;
-            }
-        }
-
-        // Parse each MIME part.
-        Map<String, byte[]> mimeParts = new HashMap<>();
-        boolean isLast = false;
-        do {
-            MimePart mimePart = parseMimePart(in, header.boundary);
-            mimeParts.put(mimePart.type, mimePart.data);
-            isLast = mimePart.isLast;
-        } while(!isLast);
-        return mimeParts;
-    }
-
-    /**
-     * Parse a MIME (Multipurpose Internet Mail Extension) part.  We expect the data to
-     * be encoded in base64.
-     *
-     * @param in Input stream to read the data from
-     * @param boundary Boundary string indicate the end of the part
-     * @return {@link MimePart}
-     * @throws IOException
-     */
-    private static MimePart parseMimePart(LineNumberReader in, String boundary)
-            throws IOException {
-        MimeHeader header = parseHeaders(in);
-        // Expect encoding type to be base64.
-        if (!TextUtils.equals(header.encodingType, ENCODING_BASE64)) {
-            throw new IOException("Unexpected encoding type: " + header.encodingType);
-        }
-
-        // Check for a valid content type.
-        if (!TextUtils.equals(header.contentType, TYPE_PASSPOINT_PROFILE) &&
-                !TextUtils.equals(header.contentType, TYPE_CA_CERT) &&
-                !TextUtils.equals(header.contentType, TYPE_PKCS12)) {
-            throw new IOException("Unexpected content type: " + header.contentType);
-        }
-
-        StringBuilder text = new StringBuilder();
-        boolean isLast = false;
-        String partBoundary = "--" + boundary;
-        String endBoundary = partBoundary + "--";
-        for (;;) {
-            String line = in.readLine();
-            if (line == null) {
-                throw new IOException("Unexpected EOF file in body @ " + in.getLineNumber());
-            }
-            // Check for boundary line.
-            if (line.startsWith(partBoundary)) {
-                if (line.equals(endBoundary)) {
-                    isLast = true;
-                }
-                break;
-            }
-            text.append(line);
-        }
-
-        MimePart part = new MimePart();
-        part.type = header.contentType;
-        part.data = Base64.decode(text.toString(), Base64.DEFAULT);
-        part.isLast = isLast;
-        return part;
-    }
-
-    /**
-     * Parse a MIME (Multipurpose Internet Mail Extension) header from the input stream.
-     * @param in Input stream to read from.
-     * @return {@link MimeHeader}
-     * @throws IOException
-     */
-    private static MimeHeader parseHeaders(LineNumberReader in)
-            throws IOException {
-        MimeHeader header = new MimeHeader();
-
-        // Read the header from the input stream.
-        Map<String, String> headers = readHeaders(in);
-
-        // Parse each header.
-        for (Map.Entry<String, String> entry : headers.entrySet()) {
-            switch (entry.getKey()) {
-                case CONTENT_TYPE:
-                    Pair<String, String> value = parseContentType(entry.getValue());
-                    header.contentType = value.first;
-                    header.boundary = value.second;
-                    break;
-                case CONTENT_TRANSFER_ENCODING:
-                    header.encodingType = entry.getValue();
-                    break;
-                default:
-                    Log.d(TAG, "Ignore header: " + entry.getKey());
-                    break;
-            }
-        }
-        return header;
-    }
-
-    /**
-     * Parse the Content-Type header value.  The value will contain the content type string and
-     * an optional boundary string separated by a ";".  Below are examples of valid Content-Type
-     * header value:
-     *   multipart/mixed; boundary={boundary}
-     *   application/x-passpoint-profile
-     *
-     * @param contentType The Content-Type value string
-     * @return A pair of content type and boundary string
-     * @throws IOException
-     */
-    private static Pair<String, String> parseContentType(String contentType) throws IOException {
-        String[] attributes = contentType.split(";");
-        String type = null;
-        String boundary = null;
-
-        if (attributes.length < 1) {
-            throw new IOException("Invalid Content-Type: " + contentType);
-        }
-
-        // The type is always the first attribute.
-        type = attributes[0].trim();
-        // Look for boundary string from the rest of the attributes.
-        for (int i = 1; i < attributes.length; i++) {
-            String attribute = attributes[i].trim();
-            if (!attribute.startsWith(BOUNDARY)) {
-                Log.d(TAG, "Ignore Content-Type attribute: " + attributes[i]);
-                continue;
-            }
-            boundary = attribute.substring(BOUNDARY.length());
-            // Remove the leading and trailing quote if present.
-            if (boundary.length() > 1 && boundary.startsWith("\"") && boundary.endsWith("\"")) {
-                boundary = boundary.substring(1, boundary.length()-1);
-            }
-        }
-
-        return new Pair<String, String>(type, boundary);
-    }
-
-    /**
-     * Read the headers from the given input stream.  The header section is terminated by
-     * an empty line.
-     *
-     * @param in The input stream to read from
-     * @return Map of key-value pairs.
-     * @throws IOException
-     */
-    private static Map<String, String> readHeaders(LineNumberReader in)
-            throws IOException {
-        Map<String, String> headers = new HashMap<>();
-        String line;
-        String name = null;
-        StringBuilder value = null;
-        for (;;) {
-            line = in.readLine();
-            if (line == null) {
-                throw new IOException("Missing line @ " + in.getLineNumber());
-            }
-
-            // End of headers section.
-            if (line.length() == 0 || line.trim().length() == 0) {
-                // Save the previous header line.
-                if (name != null) {
-                    headers.put(name, value.toString());
-                }
-                break;
-            }
-
-            int nameEnd = line.indexOf(':');
-            if (nameEnd < 0) {
-                if (value != null) {
-                    // Continuation line for the header value.
-                    value.append(' ').append(line.trim());
-                } else {
-                    throw new IOException("Bad header line: '" + line + "' @ " +
-                            in.getLineNumber());
-                }
-            } else {
-                // New header line detected, make sure it doesn't start with a whitespace.
-                if (Character.isWhitespace(line.charAt(0))) {
-                    throw new IOException("Illegal blank prefix in header line '" + line +
-                            "' @ " + in.getLineNumber());
-                }
-
-                if (name != null) {
-                    // Save the previous header line.
-                    headers.put(name, value.toString());
-                }
-
-                // Setup the current header line.
-                name = line.substring(0, nameEnd).trim();
-                value = new StringBuilder();
-                value.append(line.substring(nameEnd+1).trim());
-            }
-        }
-        return headers;
-    }
-
-    /**
-     * Parse a CA (Certificate Authority) certificate data and convert it to a
-     * X509Certificate object.
-     *
-     * @param octets Certificate data
-     * @return X509Certificate
-     * @throws CertificateException
-     */
-    private static X509Certificate parseCACert(byte[] octets) throws CertificateException {
-        CertificateFactory factory = CertificateFactory.getInstance("X.509");
-        return (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(octets));
-    }
-
-    private static Pair<PrivateKey, List<X509Certificate>> parsePkcs12(byte[] octets)
-            throws GeneralSecurityException, IOException {
-        KeyStore ks = KeyStore.getInstance("PKCS12");
-        ByteArrayInputStream in = new ByteArrayInputStream(octets);
-        ks.load(in, new char[0]);
-        in.close();
-
-        // Only expects one set of key and certificate chain.
-        if (ks.size() != 1) {
-            throw new IOException("Unexpected key size: " + ks.size());
-        }
-
-        String alias = ks.aliases().nextElement();
-        if (alias == null) {
-            throw new IOException("No alias found");
-        }
-
-        PrivateKey clientKey = (PrivateKey) ks.getKey(alias, null);
-        List<X509Certificate> clientCertificateChain = null;
-        Certificate[] chain = ks.getCertificateChain(alias);
-        if (chain != null) {
-            clientCertificateChain = new ArrayList<>();
-            for (Certificate certificate : chain) {
-                if (!(certificate instanceof X509Certificate)) {
-                    throw new IOException("Unexpceted certificate type: " +
-                            certificate.getClass());
-                }
-                clientCertificateChain.add((X509Certificate) certificate);
-            }
-        }
-        return new Pair<PrivateKey, List<X509Certificate>>(clientKey, clientCertificateChain);
-    }
-}
diff --git a/wifi/java/android/net/wifi/hotspot2/IProvisioningCallback.aidl b/wifi/java/android/net/wifi/hotspot2/IProvisioningCallback.aidl
deleted file mode 100644
index a6bdd5b6..0000000
--- a/wifi/java/android/net/wifi/hotspot2/IProvisioningCallback.aidl
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2;
-
-/**
- * Interface for Provisioning callback.
- *
- * @hide
- */
-oneway interface IProvisioningCallback
-{
-    /**
-     * Service to manager callback providing failure notification
-     */
-    void onProvisioningFailure(int status);
-
-    /**
-     * Service to manager callback providing Provisioning status
-     */
-    void onProvisioningStatus(int status);
-
-    /**
-     * Service to manager callback providing completion of Provisioning/Remediation flow
-     */
-    void onProvisioningComplete();
-}
-
diff --git a/wifi/java/android/net/wifi/hotspot2/OsuProvider.java b/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
deleted file mode 100644
index f0a0607..0000000
--- a/wifi/java/android/net/wifi/hotspot2/OsuProvider.java
+++ /dev/null
@@ -1,270 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi.hotspot2;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.net.Uri;
-import android.net.wifi.WifiSsid;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * Contained information for a Hotspot 2.0 OSU (Online Sign-Up provider).
- *
- * @hide
- */
-@SystemApi
-public final class OsuProvider implements Parcelable {
-    /**
-     * OSU (Online Sign-Up) method: OMA DM (Open Mobile Alliance Device Management).
-     * For more info, refer to Section 8.3 of the Hotspot 2.0 Release 2 Technical Specification.
-     * @hide
-     */
-    public static final int METHOD_OMA_DM = 0;
-
-    /**
-     * OSU (Online Sign-Up) method: SOAP XML SPP (Subscription Provisioning Protocol).
-     * For more info, refer to Section 8.4 of the Hotspot 2.0 Release 2 Technical Specification.
-     * @hide
-     */
-    public static final int METHOD_SOAP_XML_SPP = 1;
-
-    /**
-     * SSID of the network to connect for service sign-up.
-     */
-    private WifiSsid mOsuSsid;
-
-    /**
-     * Map of friendly names expressed as different language for the OSU provider.
-     */
-    private final Map<String, String> mFriendlyNames;
-
-    /**
-     * Description of the OSU provider.
-     */
-    private final String mServiceDescription;
-
-    /**
-     * URI to browse to for service sign-up.
-     */
-    private final Uri mServerUri;
-
-    /**
-     * Network Access Identifier used for authenticating with the OSU network when OSEN is used.
-     */
-    private final String mNetworkAccessIdentifier;
-
-    /**
-     * List of OSU (Online Sign-Up) method supported.
-     */
-    private final List<Integer> mMethodList;
-
-    /** @hide */
-    public OsuProvider(String osuSsid, Map<String, String> friendlyNames,
-            String serviceDescription, Uri serverUri, String nai, List<Integer> methodList) {
-        this(WifiSsid.createFromByteArray(osuSsid.getBytes(StandardCharsets.UTF_8)),
-                friendlyNames, serviceDescription, serverUri, nai, methodList);
-    }
-
-    /** @hide */
-    public OsuProvider(WifiSsid osuSsid, Map<String, String> friendlyNames,
-            String serviceDescription, Uri serverUri, String nai, List<Integer> methodList) {
-        mOsuSsid = osuSsid;
-        mFriendlyNames = friendlyNames;
-        mServiceDescription = serviceDescription;
-        mServerUri = serverUri;
-        mNetworkAccessIdentifier = nai;
-        if (methodList == null) {
-            mMethodList = new ArrayList<>();
-        } else {
-            mMethodList = new ArrayList<>(methodList);
-        }
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param source The source to copy from
-     * @hide
-     */
-    public OsuProvider(OsuProvider source) {
-        if (source == null) {
-            mOsuSsid = null;
-            mFriendlyNames = null;
-            mServiceDescription = null;
-            mServerUri = null;
-            mNetworkAccessIdentifier = null;
-            mMethodList = new ArrayList<>();
-            return;
-        }
-
-        mOsuSsid = source.mOsuSsid;
-        mFriendlyNames = source.mFriendlyNames;
-        mServiceDescription = source.mServiceDescription;
-        mServerUri = source.mServerUri;
-        mNetworkAccessIdentifier = source.mNetworkAccessIdentifier;
-        if (source.mMethodList == null) {
-            mMethodList = new ArrayList<>();
-        } else {
-            mMethodList = new ArrayList<>(source.mMethodList);
-        }
-    }
-
-    /** @hide */
-    public WifiSsid getOsuSsid() {
-        return mOsuSsid;
-    }
-
-    /** @hide */
-    public void setOsuSsid(WifiSsid osuSsid) {
-        mOsuSsid = osuSsid;
-    }
-
-    /**
-     * Return the friendly Name for current language from the list of friendly names of OSU
-     * provider.
-     *
-     * The string matching the default locale will be returned if it is found, otherwise the string
-     * in english or the first string in the list will be returned if english is not found.
-     * A null will be returned if the list is empty.
-     *
-     * @return String matching the default locale, null otherwise
-     */
-    public @Nullable String getFriendlyName() {
-        if (mFriendlyNames == null || mFriendlyNames.isEmpty()) return null;
-        String lang = Locale.getDefault().getLanguage();
-        String friendlyName = mFriendlyNames.get(lang);
-        if (friendlyName != null) {
-            return friendlyName;
-        }
-        friendlyName = mFriendlyNames.get("en");
-        if (friendlyName != null) {
-            return friendlyName;
-        }
-        return mFriendlyNames.get(mFriendlyNames.keySet().stream().findFirst().get());
-    }
-
-    /** @hide */
-    public Map<String, String> getFriendlyNameList() {
-        return mFriendlyNames;
-    }
-
-    /** @hide */
-    public String getServiceDescription() {
-        return mServiceDescription;
-    }
-
-    public @Nullable Uri getServerUri() {
-        return mServerUri;
-    }
-
-    /** @hide */
-    public String getNetworkAccessIdentifier() {
-        return mNetworkAccessIdentifier;
-    }
-
-    /** @hide */
-    public List<Integer> getMethodList() {
-        return mMethodList;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeParcelable(mOsuSsid, flags);
-        dest.writeString(mServiceDescription);
-        dest.writeParcelable(mServerUri, flags);
-        dest.writeString(mNetworkAccessIdentifier);
-        dest.writeList(mMethodList);
-        Bundle bundle = new Bundle();
-        bundle.putSerializable("friendlyNameMap", (HashMap<String, String>) mFriendlyNames);
-        dest.writeBundle(bundle);
-    }
-
-    @Override
-    public boolean equals(@Nullable Object thatObject) {
-        if (this == thatObject) {
-            return true;
-        }
-        if (!(thatObject instanceof OsuProvider)) {
-            return false;
-        }
-        OsuProvider that = (OsuProvider) thatObject;
-        return Objects.equals(mOsuSsid, that.mOsuSsid)
-                && Objects.equals(mFriendlyNames, that.mFriendlyNames)
-                && TextUtils.equals(mServiceDescription, that.mServiceDescription)
-                && Objects.equals(mServerUri, that.mServerUri)
-                && TextUtils.equals(mNetworkAccessIdentifier, that.mNetworkAccessIdentifier)
-                && Objects.equals(mMethodList, that.mMethodList);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mOsuSsid, mServiceDescription, mFriendlyNames,
-                mServerUri, mNetworkAccessIdentifier, mMethodList);
-    }
-
-    @NonNull
-    @Override
-    public String toString() {
-        return "OsuProvider{mOsuSsid=" + mOsuSsid
-                + " mFriendlyNames=" + mFriendlyNames
-                + " mServiceDescription=" + mServiceDescription
-                + " mServerUri=" + mServerUri
-                + " mNetworkAccessIdentifier=" + mNetworkAccessIdentifier
-                + " mMethodList=" + mMethodList;
-    }
-
-    public static final @android.annotation.NonNull Creator<OsuProvider> CREATOR =
-            new Creator<OsuProvider>() {
-                @Override
-                public OsuProvider createFromParcel(Parcel in) {
-                    WifiSsid osuSsid = in.readParcelable(null);
-                    String serviceDescription = in.readString();
-                    Uri serverUri = in.readParcelable(null);
-                    String nai = in.readString();
-                    List<Integer> methodList = new ArrayList<>();
-                    in.readList(methodList, null);
-                    Bundle bundle = in.readBundle();
-                    Map<String, String> friendlyNamesMap = (HashMap) bundle.getSerializable(
-                            "friendlyNameMap");
-                    return new OsuProvider(osuSsid, friendlyNamesMap, serviceDescription,
-                            serverUri, nai, methodList);
-                }
-
-            @Override
-            public OsuProvider[] newArray(int size) {
-                return new OsuProvider[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java b/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
deleted file mode 100644
index d1d1780..0000000
--- a/wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java
+++ /dev/null
@@ -1,921 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2;
-
-import static android.net.wifi.WifiConfiguration.METERED_OVERRIDE_NONE;
-import static android.net.wifi.WifiConfiguration.MeteredOverride;
-
-import android.annotation.CurrentTimeMillisLong;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.net.wifi.hotspot2.pps.Credential;
-import android.net.wifi.hotspot2.pps.HomeSp;
-import android.net.wifi.hotspot2.pps.Policy;
-import android.net.wifi.hotspot2.pps.UpdateParameter;
-import android.os.Bundle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.telephony.TelephonyManager;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * Class representing Passpoint configuration.  This contains configurations specified in
- * PerProviderSubscription (PPS) Management Object (MO) tree.
- *
- * For more info, refer to Hotspot 2.0 PPS MO defined in section 9.1 of the Hotspot 2.0
- * Release 2 Technical Specification.
- */
-public final class PasspointConfiguration implements Parcelable {
-    private static final String TAG = "PasspointConfiguration";
-
-    /**
-     * Number of bytes for certificate SHA-256 fingerprint byte array.
-     */
-    private static final int CERTIFICATE_SHA256_BYTES = 32;
-
-    /**
-     * Maximum bytes for URL string.
-     */
-    private static final int MAX_URL_BYTES = 1023;
-
-    /**
-     * Integer value used for indicating null value in the Parcel.
-     */
-    private static final int NULL_VALUE = -1;
-
-    /**
-     * Configurations under HomeSp subtree.
-     */
-    private HomeSp mHomeSp = null;
-
-    /**
-     * Set the Home SP (Service Provider) information.
-     *
-     * @param homeSp The Home SP information to set to
-     */
-    public void setHomeSp(HomeSp homeSp) { mHomeSp = homeSp; }
-    /**
-     * Get the Home SP (Service Provider) information.
-     *
-     * @return Home SP information
-     */
-    public HomeSp getHomeSp() { return mHomeSp; }
-
-    /**
-     * Configurations under AAAServerTrustedNames subtree.
-     */
-    private String[] mAaaServerTrustedNames = null;
-    /**
-     * Set the AAA server trusted names information.
-     *
-     * @param aaaServerTrustedNames The AAA server trusted names information to set to
-     * @hide
-     */
-    public void setAaaServerTrustedNames(@Nullable String[] aaaServerTrustedNames) {
-        mAaaServerTrustedNames = aaaServerTrustedNames;
-    }
-    /**
-     * Get the AAA server trusted names information.
-     *
-     * @return AAA server trusted names information
-     * @hide
-     */
-    public @Nullable String[] getAaaServerTrustedNames() {
-        return mAaaServerTrustedNames;
-    }
-
-    /**
-     * Configurations under Credential subtree.
-     */
-    private Credential mCredential = null;
-    /**
-     * Set the credential information.
-     *
-     * @param credential The credential information to set to
-     */
-    public void setCredential(Credential credential) {
-        mCredential = credential;
-    }
-    /**
-     * Get the credential information.
-     *
-     * @return credential information
-     */
-    public Credential getCredential() {
-        return mCredential;
-    }
-
-    /**
-     * Configurations under Policy subtree.
-     */
-    private Policy mPolicy = null;
-    /**
-     * @hide
-     */
-    public void setPolicy(Policy policy) {
-        mPolicy = policy;
-    }
-    /**
-     * @hide
-     */
-    public Policy getPolicy() {
-        return mPolicy;
-    }
-
-    /**
-     * Meta data for performing subscription update.
-     */
-    private UpdateParameter mSubscriptionUpdate = null;
-    /**
-     * @hide
-     */
-    public void setSubscriptionUpdate(UpdateParameter subscriptionUpdate) {
-        mSubscriptionUpdate = subscriptionUpdate;
-    }
-    /**
-     * @hide
-     */
-    public UpdateParameter getSubscriptionUpdate() {
-        return mSubscriptionUpdate;
-    }
-
-    /**
-     * List of HTTPS URL for retrieving trust root certificate and the corresponding SHA-256
-     * fingerprint of the certificate.  The certificates are used for verifying AAA server's
-     * identity during EAP authentication.
-     */
-    private Map<String, byte[]> mTrustRootCertList = null;
-    /**
-     * @hide
-     */
-    public void setTrustRootCertList(Map<String, byte[]> trustRootCertList) {
-        mTrustRootCertList = trustRootCertList;
-    }
-    /**
-     * @hide
-     */
-    public Map<String, byte[]> getTrustRootCertList() {
-        return mTrustRootCertList;
-    }
-
-    /**
-     * Set by the subscription server, updated every time the configuration is updated by
-     * the subscription server.
-     *
-     * Use Integer.MIN_VALUE to indicate unset value.
-     */
-    private int mUpdateIdentifier = Integer.MIN_VALUE;
-    /**
-     * @hide
-     */
-    public void setUpdateIdentifier(int updateIdentifier) {
-        mUpdateIdentifier = updateIdentifier;
-    }
-    /**
-     * @hide
-     */
-    public int getUpdateIdentifier() {
-        return mUpdateIdentifier;
-    }
-
-    /**
-     * The priority of the credential.
-     *
-     * Use Integer.MIN_VALUE to indicate unset value.
-     */
-    private int mCredentialPriority = Integer.MIN_VALUE;
-    /**
-     * @hide
-     */
-    public void setCredentialPriority(int credentialPriority) {
-        mCredentialPriority = credentialPriority;
-    }
-    /**
-     * @hide
-     */
-    public int getCredentialPriority() {
-        return mCredentialPriority;
-    }
-
-    /**
-     * The time this subscription is created. It is in the format of number
-     * of milliseconds since January 1, 1970, 00:00:00 GMT.
-     *
-     * Use Long.MIN_VALUE to indicate unset value.
-     */
-    private long mSubscriptionCreationTimeInMillis = Long.MIN_VALUE;
-    /**
-     * @hide
-     */
-    public void setSubscriptionCreationTimeInMillis(long subscriptionCreationTimeInMillis) {
-        mSubscriptionCreationTimeInMillis = subscriptionCreationTimeInMillis;
-    }
-    /**
-     * @hide
-     */
-    public long getSubscriptionCreationTimeInMillis() {
-        return mSubscriptionCreationTimeInMillis;
-    }
-
-    /**
-     * The time this subscription will expire. It is in the format of number
-     * of milliseconds since January 1, 1970, 00:00:00 GMT.
-     *
-     * Use Long.MIN_VALUE to indicate unset value.
-     */
-    private long mSubscriptionExpirationTimeMillis = Long.MIN_VALUE;
-    /**
-     * @hide
-     */
-    public void setSubscriptionExpirationTimeInMillis(long subscriptionExpirationTimeInMillis) {
-        mSubscriptionExpirationTimeMillis = subscriptionExpirationTimeInMillis;
-    }
-    /**
-     *  Utility method to get the time this subscription will expire. It is in the format of number
-     *  of milliseconds since January 1, 1970, 00:00:00 GMT.
-     *
-     *  @return The time this subscription will expire, or Long.MIN_VALUE to indicate unset value
-     */
-    @CurrentTimeMillisLong
-    public long getSubscriptionExpirationTimeMillis() {
-        return mSubscriptionExpirationTimeMillis;
-    }
-
-    /**
-     * The type of the subscription.  This is defined by the provider and the value is provider
-     * specific.
-     */
-    private String mSubscriptionType = null;
-    /**
-     * @hide
-     */
-    public void setSubscriptionType(String subscriptionType) {
-        mSubscriptionType = subscriptionType;
-    }
-    /**
-     * @hide
-     */
-    public String getSubscriptionType() {
-        return mSubscriptionType;
-    }
-
-    /**
-     * The time period for usage statistics accumulation. A value of zero means that usage
-     * statistics are not accumulated on a periodic basis (e.g., a one-time limit for
-     * “pay as you go” - PAYG service). A non-zero value specifies the usage interval in minutes.
-     */
-    private long mUsageLimitUsageTimePeriodInMinutes = Long.MIN_VALUE;
-    /**
-     * @hide
-     */
-    public void setUsageLimitUsageTimePeriodInMinutes(long usageLimitUsageTimePeriodInMinutes) {
-        mUsageLimitUsageTimePeriodInMinutes = usageLimitUsageTimePeriodInMinutes;
-    }
-    /**
-     * @hide
-     */
-    public long getUsageLimitUsageTimePeriodInMinutes() {
-        return mUsageLimitUsageTimePeriodInMinutes;
-    }
-
-    /**
-     * The time at which usage statistic accumulation  begins.  It is in the format of number
-     * of milliseconds since January 1, 1970, 00:00:00 GMT.
-     *
-     * Use Long.MIN_VALUE to indicate unset value.
-     */
-    private long mUsageLimitStartTimeInMillis = Long.MIN_VALUE;
-    /**
-     * @hide
-     */
-    public void setUsageLimitStartTimeInMillis(long usageLimitStartTimeInMillis) {
-        mUsageLimitStartTimeInMillis = usageLimitStartTimeInMillis;
-    }
-    /**
-     * @hide
-     */
-    public long getUsageLimitStartTimeInMillis() {
-        return mUsageLimitStartTimeInMillis;
-    }
-
-    /**
-     * The cumulative data limit in megabytes for the {@link #usageLimitUsageTimePeriodInMinutes}.
-     * A value of zero indicate unlimited data usage.
-     *
-     * Use Long.MIN_VALUE to indicate unset value.
-     */
-    private long mUsageLimitDataLimit = Long.MIN_VALUE;
-    /**
-     * @hide
-     */
-    public void setUsageLimitDataLimit(long usageLimitDataLimit) {
-        mUsageLimitDataLimit = usageLimitDataLimit;
-    }
-    /**
-     * @hide
-     */
-    public long getUsageLimitDataLimit() {
-        return mUsageLimitDataLimit;
-    }
-
-    /**
-     * The cumulative time limit in minutes for the {@link #usageLimitUsageTimePeriodInMinutes}.
-     * A value of zero indicate unlimited time usage.
-     */
-    private long mUsageLimitTimeLimitInMinutes = Long.MIN_VALUE;
-    /**
-     * @hide
-     */
-    public void setUsageLimitTimeLimitInMinutes(long usageLimitTimeLimitInMinutes) {
-        mUsageLimitTimeLimitInMinutes = usageLimitTimeLimitInMinutes;
-    }
-    /**
-     * @hide
-     */
-    public long getUsageLimitTimeLimitInMinutes() {
-        return mUsageLimitTimeLimitInMinutes;
-    }
-
-    /**
-     * The map of OSU service provider names whose each element is presented in different
-     * languages for the service provider, which is used for finding a matching
-     * PasspointConfiguration with a given service provider name.
-     */
-    private Map<String, String> mServiceFriendlyNames = null;
-
-    /**
-     * @hide
-     */
-    public void setServiceFriendlyNames(Map<String, String> serviceFriendlyNames) {
-        mServiceFriendlyNames = serviceFriendlyNames;
-    }
-
-    /**
-     * @hide
-     */
-    public Map<String, String> getServiceFriendlyNames() {
-        return mServiceFriendlyNames;
-    }
-
-    /**
-     * Return the friendly Name for current language from the list of friendly names of OSU
-     * provider.
-     * The string matching the default locale will be returned if it is found, otherwise the
-     * first string in the list will be returned.  A null will be returned if the list is empty.
-     *
-     * @return String matching the default locale, null otherwise
-     * @hide
-     */
-    public String getServiceFriendlyName() {
-        if (mServiceFriendlyNames == null || mServiceFriendlyNames.isEmpty()) return null;
-        String lang = Locale.getDefault().getLanguage();
-        String friendlyName = mServiceFriendlyNames.get(lang);
-        if (friendlyName != null) {
-            return friendlyName;
-        }
-        friendlyName = mServiceFriendlyNames.get("en");
-        if (friendlyName != null) {
-            return friendlyName;
-        }
-        return mServiceFriendlyNames.get(mServiceFriendlyNames.keySet().stream().findFirst().get());
-    }
-
-    /**
-     * The carrier ID identifies the operator who provides this network configuration.
-     *    see {@link TelephonyManager#getSimCarrierId()}
-     */
-    private int mCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
-
-    /**
-     * Set the carrier ID associated with current configuration.
-     * @param carrierId {@code mCarrierId}
-     * @hide
-     */
-    public void setCarrierId(int carrierId) {
-        this.mCarrierId = carrierId;
-    }
-
-    /**
-     * Get the carrier ID associated with current configuration.
-     * @return {@code mCarrierId}
-     * @hide
-     */
-    public int getCarrierId() {
-        return mCarrierId;
-    }
-
-    /**
-     * The auto-join configuration specifies whether or not the Passpoint Configuration is
-     * considered for auto-connection. If true then yes, if false then it isn't considered as part
-     * of auto-connection - but can still be manually connected to.
-     */
-    private boolean mIsAutojoinEnabled = true;
-
-    /**
-     * The mac randomization setting specifies whether a randomized or device MAC address will
-     * be used to connect to the passpoint network. If true, a randomized MAC will be used.
-     * Otherwise, the device MAC address will be used.
-     */
-    private boolean mIsMacRandomizationEnabled = true;
-
-    /**
-     * Indicates if the end user has expressed an explicit opinion about the
-     * meteredness of this network, such as through the Settings app.
-     * This value is one of {@link #METERED_OVERRIDE_NONE}, {@link #METERED_OVERRIDE_METERED},
-     * or {@link #METERED_OVERRIDE_NOT_METERED}.
-     * <p>
-     * This should always override any values from {@link WifiInfo#getMeteredHint()}.
-     *
-     * By default this field is set to {@link #METERED_OVERRIDE_NONE}.
-     */
-    private int mMeteredOverride = METERED_OVERRIDE_NONE;
-
-    /**
-     * Configures the auto-association status of this Passpoint configuration. A value of true
-     * indicates that the configuration will be considered for auto-connection, a value of false
-     * indicates that only manual connection will work - the framework will not auto-associate to
-     * this Passpoint network.
-     *
-     * @param autojoinEnabled true to be considered for framework auto-connection, false otherwise.
-     * @hide
-     */
-    public void setAutojoinEnabled(boolean autojoinEnabled) {
-        mIsAutojoinEnabled = autojoinEnabled;
-    }
-
-    /**
-     * Configures the MAC randomization setting for this Passpoint configuration.
-     * If set to true, the framework will use a randomized MAC address to connect to this Passpoint
-     * network. Otherwise, the framework will use the device MAC address.
-     *
-     * @param enabled true to use randomized MAC address, false to use device MAC address.
-     * @hide
-     */
-    public void setMacRandomizationEnabled(boolean enabled) {
-        mIsMacRandomizationEnabled = enabled;
-    }
-
-    /**
-     * Sets the metered override setting for this Passpoint configuration.
-     *
-     * @param meteredOverride One of the values in {@link MeteredOverride}
-     * @hide
-     */
-    public void setMeteredOverride(@MeteredOverride int meteredOverride) {
-        mMeteredOverride = meteredOverride;
-    }
-
-    /**
-     * Indicates whether the Passpoint configuration may be auto-connected to by the framework. A
-     * value of true indicates that auto-connection can happen, a value of false indicates that it
-     * cannot. However, even when auto-connection is not possible manual connection by the user is
-     * possible.
-     *
-     * @return the auto-join configuration: true for auto-connection (or join) enabled, false
-     * otherwise.
-     * @hide
-     */
-    @SystemApi
-    public boolean isAutojoinEnabled() {
-        return mIsAutojoinEnabled;
-    }
-
-    /**
-     * Indicates whether the user chose this configuration to be treated as metered or not.
-     *
-     * @return One of the values in {@link MeteredOverride}
-     * @hide
-     */
-    @SystemApi
-    @MeteredOverride
-    public int getMeteredOverride() {
-        return mMeteredOverride;
-    }
-
-    /**
-     * Indicates whether a randomized MAC address or device MAC address will be used for
-     * connections to this Passpoint network. If true, a randomized MAC address will be used.
-     * Otherwise, the device MAC address will be used.
-     *
-     * @return true for MAC randomization enabled. False for disabled.
-     * @hide
-     */
-    @SystemApi
-    public boolean isMacRandomizationEnabled() {
-        return mIsMacRandomizationEnabled;
-    }
-
-    /**
-     * Constructor for creating PasspointConfiguration with default values.
-     */
-    public PasspointConfiguration() {}
-
-    /**
-     * Copy constructor.
-     *
-     * @param source The source to copy from
-     */
-    public PasspointConfiguration(PasspointConfiguration source) {
-        if (source == null) {
-            return;
-        }
-
-        if (source.mHomeSp != null) {
-            mHomeSp = new HomeSp(source.mHomeSp);
-        }
-        if (source.mCredential != null) {
-            mCredential = new Credential(source.mCredential);
-        }
-        if (source.mPolicy != null) {
-            mPolicy = new Policy(source.mPolicy);
-        }
-        if (source.mTrustRootCertList != null) {
-            mTrustRootCertList = Collections.unmodifiableMap(source.mTrustRootCertList);
-        }
-        if (source.mSubscriptionUpdate != null) {
-            mSubscriptionUpdate = new UpdateParameter(source.mSubscriptionUpdate);
-        }
-        mUpdateIdentifier = source.mUpdateIdentifier;
-        mCredentialPriority = source.mCredentialPriority;
-        mSubscriptionCreationTimeInMillis = source.mSubscriptionCreationTimeInMillis;
-        mSubscriptionExpirationTimeMillis = source.mSubscriptionExpirationTimeMillis;
-        mSubscriptionType = source.mSubscriptionType;
-        mUsageLimitDataLimit = source.mUsageLimitDataLimit;
-        mUsageLimitStartTimeInMillis = source.mUsageLimitStartTimeInMillis;
-        mUsageLimitTimeLimitInMinutes = source.mUsageLimitTimeLimitInMinutes;
-        mUsageLimitUsageTimePeriodInMinutes = source.mUsageLimitUsageTimePeriodInMinutes;
-        mServiceFriendlyNames = source.mServiceFriendlyNames;
-        mAaaServerTrustedNames = source.mAaaServerTrustedNames;
-        mCarrierId = source.mCarrierId;
-        mIsAutojoinEnabled = source.mIsAutojoinEnabled;
-        mIsMacRandomizationEnabled = source.mIsMacRandomizationEnabled;
-        mMeteredOverride = source.mMeteredOverride;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeParcelable(mHomeSp, flags);
-        dest.writeParcelable(mCredential, flags);
-        dest.writeParcelable(mPolicy, flags);
-        dest.writeParcelable(mSubscriptionUpdate, flags);
-        writeTrustRootCerts(dest, mTrustRootCertList);
-        dest.writeInt(mUpdateIdentifier);
-        dest.writeInt(mCredentialPriority);
-        dest.writeLong(mSubscriptionCreationTimeInMillis);
-        dest.writeLong(mSubscriptionExpirationTimeMillis);
-        dest.writeString(mSubscriptionType);
-        dest.writeLong(mUsageLimitUsageTimePeriodInMinutes);
-        dest.writeLong(mUsageLimitStartTimeInMillis);
-        dest.writeLong(mUsageLimitDataLimit);
-        dest.writeLong(mUsageLimitTimeLimitInMinutes);
-        dest.writeStringArray(mAaaServerTrustedNames);
-        Bundle bundle = new Bundle();
-        bundle.putSerializable("serviceFriendlyNames",
-                (HashMap<String, String>) mServiceFriendlyNames);
-        dest.writeBundle(bundle);
-        dest.writeInt(mCarrierId);
-        dest.writeBoolean(mIsAutojoinEnabled);
-        dest.writeBoolean(mIsMacRandomizationEnabled);
-        dest.writeInt(mMeteredOverride);
-    }
-
-    @Override
-    public boolean equals(Object thatObject) {
-        if (this == thatObject) {
-            return true;
-        }
-        if (!(thatObject instanceof PasspointConfiguration)) {
-            return false;
-        }
-        PasspointConfiguration that = (PasspointConfiguration) thatObject;
-        return (mHomeSp == null ? that.mHomeSp == null : mHomeSp.equals(that.mHomeSp))
-                && (mAaaServerTrustedNames == null ? that.mAaaServerTrustedNames == null
-                : Arrays.equals(mAaaServerTrustedNames, that.mAaaServerTrustedNames))
-                && (mCredential == null ? that.mCredential == null
-                : mCredential.equals(that.mCredential))
-                && (mPolicy == null ? that.mPolicy == null : mPolicy.equals(that.mPolicy))
-                && (mSubscriptionUpdate == null ? that.mSubscriptionUpdate == null
-                : mSubscriptionUpdate.equals(that.mSubscriptionUpdate))
-                && isTrustRootCertListEquals(mTrustRootCertList, that.mTrustRootCertList)
-                && mUpdateIdentifier == that.mUpdateIdentifier
-                && mCredentialPriority == that.mCredentialPriority
-                && mSubscriptionCreationTimeInMillis == that.mSubscriptionCreationTimeInMillis
-                && mSubscriptionExpirationTimeMillis == that.mSubscriptionExpirationTimeMillis
-                && TextUtils.equals(mSubscriptionType, that.mSubscriptionType)
-                && mUsageLimitUsageTimePeriodInMinutes == that.mUsageLimitUsageTimePeriodInMinutes
-                && mUsageLimitStartTimeInMillis == that.mUsageLimitStartTimeInMillis
-                && mUsageLimitDataLimit == that.mUsageLimitDataLimit
-                && mUsageLimitTimeLimitInMinutes == that.mUsageLimitTimeLimitInMinutes
-                && mCarrierId == that.mCarrierId
-                && mIsAutojoinEnabled == that.mIsAutojoinEnabled
-                && mIsMacRandomizationEnabled == that.mIsMacRandomizationEnabled
-                && mMeteredOverride == that.mMeteredOverride
-                && (mServiceFriendlyNames == null ? that.mServiceFriendlyNames == null
-                : mServiceFriendlyNames.equals(that.mServiceFriendlyNames));
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mHomeSp, mCredential, mPolicy, mSubscriptionUpdate, mTrustRootCertList,
-                mUpdateIdentifier, mCredentialPriority, mSubscriptionCreationTimeInMillis,
-                mSubscriptionExpirationTimeMillis, mUsageLimitUsageTimePeriodInMinutes,
-                mUsageLimitStartTimeInMillis, mUsageLimitDataLimit, mUsageLimitTimeLimitInMinutes,
-                mServiceFriendlyNames, mCarrierId, mIsAutojoinEnabled, mIsMacRandomizationEnabled,
-                mMeteredOverride);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("UpdateIdentifier: ").append(mUpdateIdentifier).append("\n");
-        builder.append("CredentialPriority: ").append(mCredentialPriority).append("\n");
-        builder.append("SubscriptionCreationTime: ").append(
-                mSubscriptionCreationTimeInMillis != Long.MIN_VALUE
-                ? new Date(mSubscriptionCreationTimeInMillis) : "Not specified").append("\n");
-        builder.append("SubscriptionExpirationTime: ").append(
-                mSubscriptionExpirationTimeMillis != Long.MIN_VALUE
-                ? new Date(mSubscriptionExpirationTimeMillis) : "Not specified").append("\n");
-        builder.append("UsageLimitStartTime: ").append(mUsageLimitStartTimeInMillis != Long.MIN_VALUE
-                ? new Date(mUsageLimitStartTimeInMillis) : "Not specified").append("\n");
-        builder.append("UsageTimePeriod: ").append(mUsageLimitUsageTimePeriodInMinutes)
-                .append("\n");
-        builder.append("UsageLimitDataLimit: ").append(mUsageLimitDataLimit).append("\n");
-        builder.append("UsageLimitTimeLimit: ").append(mUsageLimitTimeLimitInMinutes).append("\n");
-        builder.append("Provisioned by a subscription server: ")
-                .append(isOsuProvisioned() ? "Yes" : "No").append("\n");
-        if (mHomeSp != null) {
-            builder.append("HomeSP Begin ---\n");
-            builder.append(mHomeSp);
-            builder.append("HomeSP End ---\n");
-        }
-        if (mCredential != null) {
-            builder.append("Credential Begin ---\n");
-            builder.append(mCredential);
-            builder.append("Credential End ---\n");
-        }
-        if (mPolicy != null) {
-            builder.append("Policy Begin ---\n");
-            builder.append(mPolicy);
-            builder.append("Policy End ---\n");
-        }
-        if (mSubscriptionUpdate != null) {
-            builder.append("SubscriptionUpdate Begin ---\n");
-            builder.append(mSubscriptionUpdate);
-            builder.append("SubscriptionUpdate End ---\n");
-        }
-        if (mTrustRootCertList != null) {
-            builder.append("TrustRootCertServers: ").append(mTrustRootCertList.keySet())
-                    .append("\n");
-        }
-        if (mAaaServerTrustedNames != null) {
-            builder.append("AAAServerTrustedNames: ")
-                    .append(String.join(";", mAaaServerTrustedNames)).append("\n");
-        }
-        if (mServiceFriendlyNames != null) {
-            builder.append("ServiceFriendlyNames: ").append(mServiceFriendlyNames);
-        }
-        builder.append("CarrierId:" + mCarrierId);
-        builder.append("IsAutojoinEnabled:" + mIsAutojoinEnabled);
-        builder.append("mIsMacRandomizationEnabled:" + mIsMacRandomizationEnabled);
-        builder.append("mMeteredOverride:" + mMeteredOverride);
-        return builder.toString();
-    }
-
-    /**
-     * Validate the R1 configuration data.
-     *
-     * @return true on success or false on failure
-     * @hide
-     */
-    public boolean validate() {
-        // Optional: PerProviderSubscription/<X+>/SubscriptionUpdate
-        if (mSubscriptionUpdate != null && !mSubscriptionUpdate.validate()) {
-            return false;
-        }
-        return validateForCommonR1andR2();
-    }
-
-    /**
-     * Validate the R2 configuration data.
-     *
-     * @return true on success or false on failure
-     * @hide
-     */
-    public boolean validateForR2() {
-        // Required: PerProviderSubscription/UpdateIdentifier
-        if (mUpdateIdentifier == Integer.MIN_VALUE) {
-            return false;
-        }
-
-        // Required: PerProviderSubscription/<X+>/SubscriptionUpdate
-        if (mSubscriptionUpdate == null || !mSubscriptionUpdate.validate()) {
-            return false;
-        }
-        return validateForCommonR1andR2();
-    }
-
-    private boolean validateForCommonR1andR2() {
-        // Required: PerProviderSubscription/<X+>/HomeSP
-        if (mHomeSp == null || !mHomeSp.validate()) {
-            return false;
-        }
-
-        // Required: PerProviderSubscription/<X+>/Credential
-        if (mCredential == null || !mCredential.validate()) {
-            return false;
-        }
-
-        // Optional: PerProviderSubscription/<X+>/Policy
-        if (mPolicy != null && !mPolicy.validate()) {
-            return false;
-        }
-
-        if (mTrustRootCertList != null) {
-            for (Map.Entry<String, byte[]> entry : mTrustRootCertList.entrySet()) {
-                String url = entry.getKey();
-                byte[] certFingerprint = entry.getValue();
-                if (TextUtils.isEmpty(url)) {
-                    Log.d(TAG, "Empty URL");
-                    return false;
-                }
-                if (url.getBytes(StandardCharsets.UTF_8).length > MAX_URL_BYTES) {
-                    Log.d(TAG, "URL bytes exceeded the max: "
-                            + url.getBytes(StandardCharsets.UTF_8).length);
-                    return false;
-                }
-
-                if (certFingerprint == null) {
-                    Log.d(TAG, "Fingerprint not specified");
-                    return false;
-                }
-                if (certFingerprint.length != CERTIFICATE_SHA256_BYTES) {
-                    Log.d(TAG, "Incorrect size of trust root certificate SHA-256 fingerprint: "
-                            + certFingerprint.length);
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    public static final @android.annotation.NonNull Creator<PasspointConfiguration> CREATOR =
-        new Creator<PasspointConfiguration>() {
-            @Override
-            public PasspointConfiguration createFromParcel(Parcel in) {
-                PasspointConfiguration config = new PasspointConfiguration();
-                config.setHomeSp(in.readParcelable(null));
-                config.setCredential(in.readParcelable(null));
-                config.setPolicy(in.readParcelable(null));
-                config.setSubscriptionUpdate(in.readParcelable(null));
-                config.setTrustRootCertList(readTrustRootCerts(in));
-                config.setUpdateIdentifier(in.readInt());
-                config.setCredentialPriority(in.readInt());
-                config.setSubscriptionCreationTimeInMillis(in.readLong());
-                config.setSubscriptionExpirationTimeInMillis(in.readLong());
-                config.setSubscriptionType(in.readString());
-                config.setUsageLimitUsageTimePeriodInMinutes(in.readLong());
-                config.setUsageLimitStartTimeInMillis(in.readLong());
-                config.setUsageLimitDataLimit(in.readLong());
-                config.setUsageLimitTimeLimitInMinutes(in.readLong());
-                config.setAaaServerTrustedNames(in.createStringArray());
-                Bundle bundle = in.readBundle();
-                Map<String, String> friendlyNamesMap = (HashMap) bundle.getSerializable(
-                        "serviceFriendlyNames");
-                config.setServiceFriendlyNames(friendlyNamesMap);
-                config.mCarrierId = in.readInt();
-                config.mIsAutojoinEnabled = in.readBoolean();
-                config.mIsMacRandomizationEnabled = in.readBoolean();
-                config.mMeteredOverride = in.readInt();
-                return config;
-            }
-
-            @Override
-            public PasspointConfiguration[] newArray(int size) {
-                return new PasspointConfiguration[size];
-            }
-
-            /**
-             * Helper function for reading trust root certificate info list from a Parcel.
-             *
-             * @param in The Parcel to read from
-             * @return The list of trust root certificate URL with the corresponding certificate
-             *         fingerprint
-             */
-            private Map<String, byte[]> readTrustRootCerts(Parcel in) {
-                int size = in.readInt();
-                if (size == NULL_VALUE) {
-                    return null;
-                }
-                Map<String, byte[]> trustRootCerts = new HashMap<>(size);
-                for (int i = 0; i < size; i++) {
-                    String key = in.readString();
-                    byte[] value = in.createByteArray();
-                    trustRootCerts.put(key, value);
-                }
-                return trustRootCerts;
-            }
-        };
-
-    /**
-     * Helper function for writing trust root certificate information list.
-     *
-     * @param dest The Parcel to write to
-     * @param trustRootCerts The list of trust root certificate URL with the corresponding
-     *                       certificate fingerprint
-     */
-    private static void writeTrustRootCerts(Parcel dest, Map<String, byte[]> trustRootCerts) {
-        if (trustRootCerts == null) {
-            dest.writeInt(NULL_VALUE);
-            return;
-        }
-        dest.writeInt(trustRootCerts.size());
-        for (Map.Entry<String, byte[]> entry : trustRootCerts.entrySet()) {
-            dest.writeString(entry.getKey());
-            dest.writeByteArray(entry.getValue());
-        }
-    }
-
-    /**
-     * Helper function for comparing two trust root certificate list.  Cannot use Map#equals
-     * method since the value type (byte[]) doesn't override equals method.
-     *
-     * @param list1 The first trust root certificate list
-     * @param list2 The second trust root certificate list
-     * @return true if the two list are equal
-     */
-    private static boolean isTrustRootCertListEquals(Map<String, byte[]> list1,
-            Map<String, byte[]> list2) {
-        if (list1 == null || list2 == null) {
-            return list1 == list2;
-        }
-        if (list1.size() != list2.size()) {
-            return false;
-        }
-        for (Map.Entry<String, byte[]> entry : list1.entrySet()) {
-            if (!Arrays.equals(entry.getValue(), list2.get(entry.getKey()))) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Indicates if the Passpoint Configuration was provisioned by a subscription (OSU) server,
-     * which means that it's an R2 (or R3) profile.
-     *
-     * @return true if the Passpoint Configuration was provisioned by a subscription server.
-     */
-    public boolean isOsuProvisioned() {
-        return getUpdateIdentifier() != Integer.MIN_VALUE;
-    }
-
-    /**
-     * Get a unique identifier for a PasspointConfiguration object. The identifier depends on the
-     * configuration that identify the service provider under the HomeSp subtree, and on the
-     * credential configuration under the Credential subtree.
-     * The method throws an {@link IllegalStateException} if the configuration under HomeSp subtree
-     * or the configuration under Credential subtree are not initialized.
-     *
-     * @return A unique identifier
-     */
-    public @NonNull String getUniqueId() {
-        if (mCredential == null || mHomeSp == null || TextUtils.isEmpty(mHomeSp.getFqdn())) {
-            throw new IllegalStateException("Credential or HomeSP are not initialized");
-        }
-
-        StringBuilder sb = new StringBuilder();
-        sb.append(String.format("%s_%x%x", mHomeSp.getFqdn(), mHomeSp.getUniqueId(),
-                mCredential.getUniqueId()));
-        return sb.toString();
-    }
-}
diff --git a/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java b/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java
deleted file mode 100644
index 1d499b6..0000000
--- a/wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java
+++ /dev/null
@@ -1,235 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2;
-
-import android.annotation.SystemApi;
-import android.net.wifi.WifiManager;
-import android.os.Handler;
-
-/**
- * Base class for provisioning callbacks. Should be extended by applications and set when calling
- * {@link WifiManager#startSubscriptionProvisioning(OsuProvider, ProvisioningCallback, Handler)}.
- *
- * @hide
- */
-@SystemApi
-public abstract class ProvisioningCallback {
-
-    /**
-     * The reason code for Provisioning Failure due to connection failure to OSU AP.
-     */
-    public static final int OSU_FAILURE_AP_CONNECTION = 1;
-
-    /**
-     * The reason code for invalid server URL address.
-     */
-    public static final int OSU_FAILURE_SERVER_URL_INVALID = 2;
-
-    /**
-     * The reason code for provisioning failure due to connection failure to the server.
-     */
-    public static final int OSU_FAILURE_SERVER_CONNECTION = 3;
-
-    /**
-     * The reason code for provisioning failure due to invalid server certificate.
-     */
-    public static final int OSU_FAILURE_SERVER_VALIDATION = 4;
-
-    /**
-     * The reason code for provisioning failure due to invalid service provider.
-     */
-    public static final int OSU_FAILURE_SERVICE_PROVIDER_VERIFICATION = 5;
-
-    /**
-     * The reason code for provisioning failure when a provisioning flow is aborted.
-     */
-    public static final int OSU_FAILURE_PROVISIONING_ABORTED = 6;
-
-    /**
-     * The reason code for provisioning failure when a provisioning flow is not possible.
-     */
-    public static final int OSU_FAILURE_PROVISIONING_NOT_AVAILABLE = 7;
-
-    /**
-     * The reason code for provisioning failure due to invalid web url format for an OSU web page.
-     */
-    public static final int OSU_FAILURE_INVALID_URL_FORMAT_FOR_OSU = 8;
-
-    /**
-     * The reason code for provisioning failure when a command received is not the expected command
-     * type.
-     */
-    public static final int OSU_FAILURE_UNEXPECTED_COMMAND_TYPE = 9;
-
-    /**
-     * The reason code for provisioning failure when a SOAP message is not the expected message
-     * type.
-     */
-    public static final int OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_TYPE = 10;
-
-    /**
-     * The reason code for provisioning failure when a SOAP message exchange fails.
-     */
-    public static final int OSU_FAILURE_SOAP_MESSAGE_EXCHANGE = 11;
-
-    /**
-     * The reason code for provisioning failure when a redirect listener fails to start.
-     */
-    public static final int OSU_FAILURE_START_REDIRECT_LISTENER = 12;
-
-    /**
-     * The reason code for provisioning failure when a redirect listener timed out to receive a HTTP
-     * redirect response.
-     */
-    public static final int OSU_FAILURE_TIMED_OUT_REDIRECT_LISTENER = 13;
-
-    /**
-     * The reason code for provisioning failure when there is no OSU activity to listen to
-     * {@link WifiManager#ACTION_PASSPOINT_LAUNCH_OSU_VIEW} intent.
-     */
-    public static final int OSU_FAILURE_NO_OSU_ACTIVITY_FOUND = 14;
-
-    /**
-     * The reason code for provisioning failure when the status of a SOAP message is not the
-     * expected message status.
-     */
-    public static final int OSU_FAILURE_UNEXPECTED_SOAP_MESSAGE_STATUS = 15;
-
-    /**
-     * The reason code for provisioning failure when there is no PPS MO.
-     * MO.
-     */
-    public static final int OSU_FAILURE_NO_PPS_MO = 16;
-
-    /**
-     * The reason code for provisioning failure when there is no AAAServerTrustRoot node in a PPS
-     * MO.
-     */
-    public static final int OSU_FAILURE_NO_AAA_SERVER_TRUST_ROOT_NODE = 17;
-
-    /**
-     * The reason code for provisioning failure when there is no TrustRoot node for remediation
-     * server in a PPS MO.
-     */
-    public static final int OSU_FAILURE_NO_REMEDIATION_SERVER_TRUST_ROOT_NODE = 18;
-
-    /**
-     * The reason code for provisioning failure when there is no TrustRoot node for policy server in
-     * a PPS MO.
-     */
-    public static final int OSU_FAILURE_NO_POLICY_SERVER_TRUST_ROOT_NODE = 19;
-
-    /**
-     * The reason code for provisioning failure when failing to retrieve trust root certificates
-     * used for validating server certificate for AAA, Remediation and Policy server.
-     */
-    public static final int OSU_FAILURE_RETRIEVE_TRUST_ROOT_CERTIFICATES = 20;
-
-    /**
-     * The reason code for provisioning failure when there is no trust root certificate for AAA
-     * server.
-     */
-    public static final int OSU_FAILURE_NO_AAA_TRUST_ROOT_CERTIFICATE = 21;
-
-    /**
-     * The reason code for provisioning failure when a {@link PasspointConfiguration} is failed to
-     * install.
-     */
-    public static final int OSU_FAILURE_ADD_PASSPOINT_CONFIGURATION = 22;
-
-    /**
-     * The reason code for provisioning failure when an {@link OsuProvider} is not found for
-     * provisioning.
-     */
-    public static final int OSU_FAILURE_OSU_PROVIDER_NOT_FOUND = 23;
-
-    /**
-     * The status code for provisioning flow to indicate connecting to OSU AP
-     */
-    public static final int OSU_STATUS_AP_CONNECTING = 1;
-
-    /**
-     * The status code for provisioning flow to indicate the OSU AP is connected.
-     */
-    public static final int OSU_STATUS_AP_CONNECTED = 2;
-
-    /**
-     * The status code for provisioning flow to indicate connecting to the server.
-     */
-    public static final int OSU_STATUS_SERVER_CONNECTING = 3;
-
-    /**
-     * The status code for provisioning flow to indicate the server certificate is validated.
-     */
-    public static final int OSU_STATUS_SERVER_VALIDATED = 4;
-
-    /**
-     * The status code for provisioning flow to indicate the server is connected
-     */
-    public static final int OSU_STATUS_SERVER_CONNECTED = 5;
-
-    /**
-     * The status code for provisioning flow to indicate starting the first SOAP exchange.
-     */
-    public static final int OSU_STATUS_INIT_SOAP_EXCHANGE = 6;
-
-    /**
-     * The status code for provisioning flow to indicate waiting for a HTTP redirect response.
-     */
-    public static final int OSU_STATUS_WAITING_FOR_REDIRECT_RESPONSE = 7;
-
-    /**
-     * The status code for provisioning flow to indicate a HTTP redirect response is received.
-     */
-    public static final int OSU_STATUS_REDIRECT_RESPONSE_RECEIVED = 8;
-
-    /**
-     * The status code for provisioning flow to indicate starting the second SOAP exchange.
-     */
-    public static final int OSU_STATUS_SECOND_SOAP_EXCHANGE = 9;
-
-    /**
-     * The status code for provisioning flow to indicate starting the third SOAP exchange.
-     */
-    public static final int OSU_STATUS_THIRD_SOAP_EXCHANGE = 10;
-
-    /**
-     * The status code for provisioning flow to indicate starting a step retrieving trust root
-     * certs.
-     */
-    public static final int OSU_STATUS_RETRIEVING_TRUST_ROOT_CERTS = 11;
-
-    /**
-     * Provisioning status for OSU failure
-     *
-     * @param status indicates error condition
-     */
-    public abstract void onProvisioningFailure(int status);
-
-    /**
-     * Provisioning status when OSU is in progress
-     *
-     * @param status indicates status of OSU flow
-     */
-    public abstract void onProvisioningStatus(int status);
-
-    /**
-     * Provisioning complete when provisioning/remediation flow completes
-     */
-    public abstract void onProvisioningComplete();
-}
-
diff --git a/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java b/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java
deleted file mode 100644
index ae60ed4..0000000
--- a/wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java
+++ /dev/null
@@ -1,1787 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.omadm;
-
-import android.net.wifi.hotspot2.PasspointConfiguration;
-import android.net.wifi.hotspot2.pps.Credential;
-import android.net.wifi.hotspot2.pps.HomeSp;
-import android.net.wifi.hotspot2.pps.Policy;
-import android.net.wifi.hotspot2.pps.UpdateParameter;
-import android.text.TextUtils;
-import android.util.Log;
-import android.util.Pair;
-
-import org.xml.sax.SAXException;
-
-import java.io.IOException;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Utility class for converting OMA-DM (Open Mobile Alliance's Device Management)
- * PPS-MO (PerProviderSubscription Management Object) XML tree to a
- * {@link PasspointConfiguration} object.
- *
- * Currently this only supports PerProviderSubscription/HomeSP and
- * PerProviderSubscription/Credential subtree for Hotspot 2.0 Release 1 support.
- *
- * For more info, refer to Hotspot 2.0 PPS MO defined in section 9.1 of the Hotspot 2.0
- * Release 2 Technical Specification.
- *
- * Below is a sample XML string for a Release 1 PPS MO tree:
- *
- * <MgmtTree xmlns="syncml:dmddf1.2">
- *   <VerDTD>1.2</VerDTD>
- *   <Node>
- *     <NodeName>PerProviderSubscription</NodeName>
- *     <RTProperties>
- *       <Type>
- *         <DDFName>urn:wfa:mo:hotspot2dot0­perprovidersubscription:1.0</DDFName>
- *       </Type>
- *     </RTProperties>
- *     <Node>
- *       <NodeName>i001</NodeName>
- *       <Node>
- *         <NodeName>HomeSP</NodeName>
- *         <Node>
- *           <NodeName>FriendlyName</NodeName>
- *           <Value>Century House</Value>
- *         </Node>
- *         <Node>
- *           <NodeName>FQDN</NodeName>
- *           <Value>mi6.co.uk</Value>
- *         </Node>
- *         <Node>
- *           <NodeName>RoamingConsortiumOI</NodeName>
- *           <Value>112233,445566</Value>
- *         </Node>
- *       </Node>
- *       <Node>
- *         <NodeName>Credential</NodeName>
- *         <Node>
- *           <NodeName>Realm</NodeName>
- *           <Value>shaken.stirred.com</Value>
- *         </Node>
- *         <Node>
- *           <NodeName>UsernamePassword</NodeName>
- *           <Node>
- *             <NodeName>Username</NodeName>
- *             <Value>james</Value>
- *           </Node>
- *           <Node>
- *             <NodeName>Password</NodeName>
- *             <Value>Ym9uZDAwNw==</Value>
- *           </Node>
- *           <Node>
- *             <NodeName>EAPMethod</NodeName>
- *             <Node>
- *               <NodeName>EAPType</NodeName>
- *               <Value>21</Value>
- *             </Node>
- *             <Node>
- *               <NodeName>InnerMethod</NodeName>
- *               <Value>MS-CHAP-V2</Value>
- *             </Node>
- *           </Node>
- *         </Node>
- *       </Node>
- *     </Node>
- *   </Node>
- * </MgmtTree>
- */
-public final class PpsMoParser {
-    private static final String TAG = "PpsMoParser";
-
-    /**
-     * XML tags expected in the PPS MO (PerProviderSubscription Management Object) XML tree.
-     */
-    private static final String TAG_MANAGEMENT_TREE = "MgmtTree";
-    private static final String TAG_VER_DTD = "VerDTD";
-    private static final String TAG_NODE = "Node";
-    private static final String TAG_NODE_NAME = "NodeName";
-    private static final String TAG_RT_PROPERTIES = "RTProperties";
-    private static final String TAG_TYPE = "Type";
-    private static final String TAG_DDF_NAME = "DDFName";
-    private static final String TAG_VALUE = "Value";
-
-    /**
-     * Name for PerProviderSubscription node.
-     */
-    private static final String NODE_PER_PROVIDER_SUBSCRIPTION = "PerProviderSubscription";
-
-    /**
-     * Fields under PerProviderSubscription.
-     */
-    private static final String NODE_UPDATE_IDENTIFIER = "UpdateIdentifier";
-    private static final String NODE_AAA_SERVER_TRUST_ROOT = "AAAServerTrustRoot";
-    private static final String NODE_SUBSCRIPTION_UPDATE = "SubscriptionUpdate";
-    private static final String NODE_SUBSCRIPTION_PARAMETER = "SubscriptionParameters";
-    private static final String NODE_TYPE_OF_SUBSCRIPTION = "TypeOfSubscription";
-    private static final String NODE_USAGE_LIMITS = "UsageLimits";
-    private static final String NODE_DATA_LIMIT = "DataLimit";
-    private static final String NODE_START_DATE = "StartDate";
-    private static final String NODE_TIME_LIMIT = "TimeLimit";
-    private static final String NODE_USAGE_TIME_PERIOD = "UsageTimePeriod";
-    private static final String NODE_CREDENTIAL_PRIORITY = "CredentialPriority";
-    private static final String NODE_EXTENSION = "Extension";
-
-    /**
-     * Fields under Extension/Android subtree.
-     */
-    /*
-     * This node is used to put Android specific extension nodes and must be put
-     * under "Extension" node. Nodes with unknown names are allowed under this subtree.
-     * If there is any new node added in later release, it won't break older release parsing.
-     * <p>
-     * Ex:
-     * <Node>
-     *   <NodeName>Extension</NodeName>
-     *   <Node>
-     *     <NodeName>Android</NodeName>
-     *     <Node>
-     *       <NodeName>AndroidSpecificAttribute</NodeName>
-     *       <Value>AndroidSpecificValue</Value>
-     *     </Node>
-     *     <Node>
-     *       <NodeName>AndroidSpecificAttribute2</NodeName>
-     *       <Value>AndroidSpecificValue2</Value>
-     *     </Node>
-     *   </Node>
-     * </Node>
-     */
-    private static final String NODE_VENDOR_ANDROID = "Android";
-    /*
-     * This node describes AAA server trusted names. The trusted name must be put in
-     * a leaf named "FQDN". More than one trusted names can be provided by using
-     * semicolons to separate the strings (e.g., example.org;example.com).
-     * <p>
-     * Ex:
-     * <Node>
-     *   <NodeName>AAAServerTrustedNames</NodeName>
-     *   <Node>
-     *     <NodeName>FQDN</NodeName>
-     *     <Value>trusted.com;auth.net</Value>
-     *  </Node>
-     * <Node>
-     */
-    private static final String NODE_AAA_SERVER_TRUSTED_NAMES = "AAAServerTrustedNames";
-
-    /**
-     * Fields under HomeSP subtree.
-     */
-    private static final String NODE_HOMESP = "HomeSP";
-    private static final String NODE_FQDN = "FQDN";
-    private static final String NODE_FRIENDLY_NAME = "FriendlyName";
-    private static final String NODE_ROAMING_CONSORTIUM_OI = "RoamingConsortiumOI";
-    private static final String NODE_NETWORK_ID = "NetworkID";
-    private static final String NODE_SSID = "SSID";
-    private static final String NODE_HESSID = "HESSID";
-    private static final String NODE_ICON_URL = "IconURL";
-    private static final String NODE_HOME_OI_LIST = "HomeOIList";
-    private static final String NODE_HOME_OI = "HomeOI";
-    private static final String NODE_HOME_OI_REQUIRED = "HomeOIRequired";
-    private static final String NODE_OTHER_HOME_PARTNERS = "OtherHomePartners";
-
-    /**
-     * Fields under Credential subtree.
-     */
-    private static final String NODE_CREDENTIAL = "Credential";
-    private static final String NODE_CREATION_DATE = "CreationDate";
-    private static final String NODE_EXPIRATION_DATE = "ExpirationDate";
-    private static final String NODE_USERNAME_PASSWORD = "UsernamePassword";
-    private static final String NODE_USERNAME = "Username";
-    private static final String NODE_PASSWORD = "Password";
-    private static final String NODE_MACHINE_MANAGED = "MachineManaged";
-    private static final String NODE_SOFT_TOKEN_APP = "SoftTokenApp";
-    private static final String NODE_ABLE_TO_SHARE = "AbleToShare";
-    private static final String NODE_EAP_METHOD = "EAPMethod";
-    private static final String NODE_EAP_TYPE = "EAPType";
-    private static final String NODE_VENDOR_ID = "VendorId";
-    private static final String NODE_VENDOR_TYPE = "VendorType";
-    private static final String NODE_INNER_EAP_TYPE = "InnerEAPType";
-    private static final String NODE_INNER_VENDOR_ID = "InnerVendorID";
-    private static final String NODE_INNER_VENDOR_TYPE = "InnerVendorType";
-    private static final String NODE_INNER_METHOD = "InnerMethod";
-    private static final String NODE_DIGITAL_CERTIFICATE = "DigitalCertificate";
-    private static final String NODE_CERTIFICATE_TYPE = "CertificateType";
-    private static final String NODE_CERT_SHA256_FINGERPRINT = "CertSHA256Fingerprint";
-    private static final String NODE_REALM = "Realm";
-    private static final String NODE_SIM = "SIM";
-    private static final String NODE_SIM_IMSI = "IMSI";
-    private static final String NODE_CHECK_AAA_SERVER_CERT_STATUS = "CheckAAAServerCertStatus";
-
-    /**
-     * Fields under Policy subtree.
-     */
-    private static final String NODE_POLICY = "Policy";
-    private static final String NODE_PREFERRED_ROAMING_PARTNER_LIST =
-            "PreferredRoamingPartnerList";
-    private static final String NODE_FQDN_MATCH = "FQDN_Match";
-    private static final String NODE_PRIORITY = "Priority";
-    private static final String NODE_COUNTRY = "Country";
-    private static final String NODE_MIN_BACKHAUL_THRESHOLD = "MinBackhaulThreshold";
-    private static final String NODE_NETWORK_TYPE = "NetworkType";
-    private static final String NODE_DOWNLINK_BANDWIDTH = "DLBandwidth";
-    private static final String NODE_UPLINK_BANDWIDTH = "ULBandwidth";
-    private static final String NODE_POLICY_UPDATE = "PolicyUpdate";
-    private static final String NODE_UPDATE_INTERVAL = "UpdateInterval";
-    private static final String NODE_UPDATE_METHOD = "UpdateMethod";
-    private static final String NODE_RESTRICTION = "Restriction";
-    private static final String NODE_URI = "URI";
-    private static final String NODE_TRUST_ROOT = "TrustRoot";
-    private static final String NODE_CERT_URL = "CertURL";
-    private static final String NODE_SP_EXCLUSION_LIST = "SPExclusionList";
-    private static final String NODE_REQUIRED_PROTO_PORT_TUPLE = "RequiredProtoPortTuple";
-    private static final String NODE_IP_PROTOCOL = "IPProtocol";
-    private static final String NODE_PORT_NUMBER = "PortNumber";
-    private static final String NODE_MAXIMUM_BSS_LOAD_VALUE = "MaximumBSSLoadValue";
-    private static final String NODE_OTHER = "Other";
-
-    /**
-     * URN (Unique Resource Name) for PerProviderSubscription Management Object Tree.
-     */
-    private static final String PPS_MO_URN =
-            "urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0";
-
-    /**
-     * Exception for generic parsing errors.
-     */
-    private static class ParsingException extends Exception {
-        public ParsingException(String message) {
-            super(message);
-        }
-    }
-
-    /**
-     * Class representing a node within the PerProviderSubscription tree.
-     * This is used to flatten out and eliminate the extra layering in the XMLNode tree,
-     * to make the data parsing easier and cleaner.
-     *
-     * A PPSNode can be an internal or a leaf node, but not both.
-     *
-     */
-    private static abstract class PPSNode {
-        private final String mName;
-        public PPSNode(String name) {
-            mName = name;
-        }
-
-        /**
-         * @return the name of the node
-         */
-        public String getName() {
-            return mName;
-        }
-
-        /**
-         * Applies for internal node only.
-         *
-         * @return the list of children nodes.
-         */
-        public abstract List<PPSNode> getChildren();
-
-        /**
-         * Applies for leaf node only.
-         *
-         * @return the string value of the node
-         */
-        public abstract String getValue();
-
-        /**
-         * @return a flag indicating if this is a leaf or an internal node
-         */
-        public abstract boolean isLeaf();
-    }
-
-    /**
-     * Class representing a leaf node in a PPS (PerProviderSubscription) tree.
-     */
-    private static class LeafNode extends PPSNode {
-        private final String mValue;
-        public LeafNode(String nodeName, String value) {
-            super(nodeName);
-            mValue = value;
-        }
-
-        @Override
-        public String getValue() {
-            return mValue;
-        }
-
-        @Override
-        public List<PPSNode> getChildren() {
-            return null;
-        }
-
-        @Override
-        public boolean isLeaf() {
-            return true;
-        }
-    }
-
-    /**
-     * Class representing an internal node in a PPS (PerProviderSubscription) tree.
-     */
-    private static class InternalNode extends PPSNode {
-        private final List<PPSNode> mChildren;
-        public InternalNode(String nodeName, List<PPSNode> children) {
-            super(nodeName);
-            mChildren = children;
-        }
-
-        @Override
-        public String getValue() {
-            return null;
-        }
-
-        @Override
-        public List<PPSNode> getChildren() {
-            return mChildren;
-        }
-
-        @Override
-        public boolean isLeaf() {
-            return false;
-        }
-    }
-
-    /**
-     * @hide
-     */
-    public PpsMoParser() {}
-
-    /**
-     * Convert a XML string representation of a PPS MO (PerProviderSubscription
-     * Management Object) tree to a {@link PasspointConfiguration} object.
-     *
-     * @param xmlString XML string representation of a PPS MO tree
-     * @return {@link PasspointConfiguration} or null
-     */
-    public static PasspointConfiguration parseMoText(String xmlString) {
-        // Convert the XML string to a XML tree.
-        XMLParser xmlParser = new XMLParser();
-        XMLNode root = null;
-        try {
-            root = xmlParser.parse(xmlString);
-        } catch(IOException | SAXException e) {
-            return null;
-        }
-        if (root == null) {
-            return null;
-        }
-
-        // Verify root node is a "MgmtTree" node.
-        if (root.getTag() != TAG_MANAGEMENT_TREE) {
-            Log.e(TAG, "Root is not a MgmtTree");
-            return null;
-        }
-
-        String verDtd = null;    // Used for detecting duplicate VerDTD element.
-        PasspointConfiguration config = null;
-        for (XMLNode child : root.getChildren()) {
-            switch(child.getTag()) {
-                case TAG_VER_DTD:
-                    if (verDtd != null) {
-                        Log.e(TAG, "Duplicate VerDTD element");
-                        return null;
-                    }
-                    verDtd = child.getText();
-                    break;
-                case TAG_NODE:
-                    if (config != null) {
-                        Log.e(TAG, "Unexpected multiple Node element under MgmtTree");
-                        return null;
-                    }
-                    try {
-                        config = parsePpsNode(child);
-                    } catch (ParsingException e) {
-                        Log.e(TAG, e.getMessage());
-                        return null;
-                    }
-                    break;
-                default:
-                    Log.e(TAG, "Unknown node: " + child.getTag());
-                    return null;
-            }
-        }
-        return config;
-    }
-
-    /**
-     * Parse a PerProviderSubscription node. Below is the format of the XML tree (with
-     * each XML element represent a node in the tree):
-     *
-     * <Node>
-     *   <NodeName>PerProviderSubscription</NodeName>
-     *   <RTProperties>
-     *     ...
-     *   </RTPProperties>
-     *   <Node>
-     *     <NodeName>UpdateIdentifier</NodeName>
-     *     <Value>...</Value>
-     *   </Node>
-     *   <Node>
-     *     ...
-     *   </Node>
-     * </Node>
-     *
-     * @param node XMLNode that contains PerProviderSubscription node.
-     * @return PasspointConfiguration or null
-     * @throws ParsingException
-     */
-    private static PasspointConfiguration parsePpsNode(XMLNode node)
-            throws ParsingException {
-        PasspointConfiguration config = null;
-        String nodeName = null;
-        int updateIdentifier = Integer.MIN_VALUE;
-        for (XMLNode child : node.getChildren()) {
-            switch (child.getTag()) {
-                case TAG_NODE_NAME:
-                    if (nodeName != null) {
-                        throw new ParsingException("Duplicate NodeName: " + child.getText());
-                    }
-                    nodeName = child.getText();
-                    if (!TextUtils.equals(nodeName, NODE_PER_PROVIDER_SUBSCRIPTION)) {
-                        throw new ParsingException("Unexpected NodeName: " + nodeName);
-                    }
-                    break;
-                case TAG_NODE:
-                    // A node can be either an UpdateIdentifier node or a PerProviderSubscription
-                    // instance node.  Flatten out the XML tree first by converting it to a PPS
-                    // tree to reduce the complexity of the parsing code.
-                    PPSNode ppsNodeRoot = buildPpsNode(child);
-                    if (TextUtils.equals(ppsNodeRoot.getName(), NODE_UPDATE_IDENTIFIER)) {
-                        if (updateIdentifier != Integer.MIN_VALUE) {
-                            throw new ParsingException("Multiple node for UpdateIdentifier");
-                        }
-                        updateIdentifier = parseInteger(getPpsNodeValue(ppsNodeRoot));
-                    } else {
-                        // Only one PerProviderSubscription instance is expected and allowed.
-                        if (config != null) {
-                            throw new ParsingException("Multiple PPS instance");
-                        }
-                        config = parsePpsInstance(ppsNodeRoot);
-                    }
-                    break;
-                case TAG_RT_PROPERTIES:
-                    // Parse and verify URN stored in the RT (Run Time) Properties.
-                    String urn = parseUrn(child);
-                    if (!TextUtils.equals(urn, PPS_MO_URN)) {
-                        throw new ParsingException("Unknown URN: " + urn);
-                    }
-                    break;
-                default:
-                    throw new ParsingException("Unknown tag under PPS node: " + child.getTag());
-            }
-        }
-        if (config != null && updateIdentifier != Integer.MIN_VALUE) {
-            config.setUpdateIdentifier(updateIdentifier);
-        }
-        return config;
-    }
-
-    /**
-     * Parse the URN stored in the RTProperties. Below is the format of the RTPProperties node:
-     *
-     * <RTProperties>
-     *   <Type>
-     *     <DDFName>urn:...</DDFName>
-     *   </Type>
-     * </RTProperties>
-     *
-     * @param node XMLNode that contains RTProperties node.
-     * @return URN String of URN.
-     * @throws ParsingException
-     */
-    private static String parseUrn(XMLNode node) throws ParsingException {
-        if (node.getChildren().size() != 1)
-            throw new ParsingException("Expect RTPProperties node to only have one child");
-
-        XMLNode typeNode = node.getChildren().get(0);
-        if (typeNode.getChildren().size() != 1) {
-            throw new ParsingException("Expect Type node to only have one child");
-        }
-        if (!TextUtils.equals(typeNode.getTag(), TAG_TYPE)) {
-            throw new ParsingException("Unexpected tag for Type: " + typeNode.getTag());
-        }
-
-        XMLNode ddfNameNode = typeNode.getChildren().get(0);
-        if (!ddfNameNode.getChildren().isEmpty()) {
-            throw new ParsingException("Expect DDFName node to have no child");
-        }
-        if (!TextUtils.equals(ddfNameNode.getTag(), TAG_DDF_NAME)) {
-            throw new ParsingException("Unexpected tag for DDFName: " + ddfNameNode.getTag());
-        }
-
-        return ddfNameNode.getText();
-    }
-
-    /**
-     * Convert a XML tree represented by XMLNode to a PPS (PerProviderSubscription) instance tree
-     * represented by PPSNode.  This flattens out the XML tree to allow easier and cleaner parsing
-     * of the PPS configuration data.  Only three types of XML tag are expected: "NodeName",
-     * "Node", and "Value".
-     *
-     * The original XML tree (each XML element represent a node):
-     *
-     * <Node>
-     *   <NodeName>root</NodeName>
-     *   <Node>
-     *     <NodeName>child1</NodeName>
-     *     <Value>value1</Value>
-     *   </Node>
-     *   <Node>
-     *     <NodeName>child2</NodeName>
-     *     <Node>
-     *       <NodeName>grandchild1</NodeName>
-     *       ...
-     *     </Node>
-     *   </Node>
-     *   ...
-     * </Node>
-     *
-     * The converted PPS tree:
-     *
-     * [root] --- [child1, value1]
-     *   |
-     *   ---------[child2] --------[grandchild1] --- ...
-     *
-     * @param node XMLNode pointed to the root of a XML tree
-     * @return PPSNode pointing to the root of a PPS tree
-     * @throws ParsingException
-     */
-    private static PPSNode buildPpsNode(XMLNode node) throws ParsingException {
-        String nodeName = null;
-        String nodeValue = null;
-        List<PPSNode> childNodes = new ArrayList<PPSNode>();
-        // Names of parsed child nodes, use for detecting multiple child nodes with the same name.
-        Set<String> parsedNodes = new HashSet<String>();
-
-        for (XMLNode child : node.getChildren()) {
-            String tag = child.getTag();
-            if (TextUtils.equals(tag, TAG_NODE_NAME)) {
-                if (nodeName != null) {
-                    throw new ParsingException("Duplicate NodeName node");
-                }
-                nodeName = child.getText();
-            } else if (TextUtils.equals(tag, TAG_NODE)) {
-                PPSNode ppsNode = buildPpsNode(child);
-                if (parsedNodes.contains(ppsNode.getName())) {
-                    throw new ParsingException("Duplicate node: " + ppsNode.getName());
-                }
-                parsedNodes.add(ppsNode.getName());
-                childNodes.add(ppsNode);
-            } else if (TextUtils.equals(tag, TAG_VALUE)) {
-               if (nodeValue != null) {
-                   throw new ParsingException("Duplicate Value node");
-               }
-               nodeValue = child.getText();
-            } else {
-                throw new ParsingException("Unknown tag: " + tag);
-            }
-        }
-
-        if (nodeName == null) {
-            throw new ParsingException("Invalid node: missing NodeName");
-        }
-        if (nodeValue == null && childNodes.size() == 0) {
-            throw new ParsingException("Invalid node: " + nodeName +
-                    " missing both value and children");
-        }
-        if (nodeValue != null && childNodes.size() > 0) {
-            throw new ParsingException("Invalid node: " + nodeName +
-                    " contained both value and children");
-        }
-
-        if (nodeValue != null) {
-            return new LeafNode(nodeName, nodeValue);
-        }
-        return new InternalNode(nodeName, childNodes);
-    }
-
-    /**
-     * Return the value of a PPSNode.  An exception will be thrown if the given node
-     * is not a leaf node.
-     *
-     * @param node PPSNode to retrieve the value from
-     * @return String representing the value of the node
-     * @throws ParsingException
-     */
-    private static String getPpsNodeValue(PPSNode node) throws ParsingException {
-        if (!node.isLeaf()) {
-            throw new ParsingException("Cannot get value from a non-leaf node: " + node.getName());
-        }
-        return node.getValue();
-    }
-
-    /**
-     * Parse a PPS (PerProviderSubscription) configurations from a PPS tree.
-     *
-     * @param root PPSNode representing the root of the PPS tree
-     * @return PasspointConfiguration
-     * @throws ParsingException
-     */
-    private static PasspointConfiguration parsePpsInstance(PPSNode root)
-            throws ParsingException {
-        if (root.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for PPS instance");
-        }
-
-        PasspointConfiguration config = new PasspointConfiguration();
-        for (PPSNode child : root.getChildren()) {
-            switch(child.getName()) {
-                case NODE_HOMESP:
-                    config.setHomeSp(parseHomeSP(child));
-                    break;
-                case NODE_CREDENTIAL:
-                    config.setCredential(parseCredential(child));
-                    break;
-                case NODE_POLICY:
-                    config.setPolicy(parsePolicy(child));
-                    break;
-                case NODE_AAA_SERVER_TRUST_ROOT:
-                    config.setTrustRootCertList(parseAAAServerTrustRootList(child));
-                    break;
-                case NODE_SUBSCRIPTION_UPDATE:
-                    config.setSubscriptionUpdate(parseUpdateParameter(child));
-                    break;
-                case NODE_SUBSCRIPTION_PARAMETER:
-                    parseSubscriptionParameter(child, config);
-                    break;
-                case NODE_CREDENTIAL_PRIORITY:
-                    config.setCredentialPriority(parseInteger(getPpsNodeValue(child)));
-                    break;
-                case NODE_EXTENSION:
-                    // All vendor specific information will be under this node.
-                    parseExtension(child, config);
-                    break;
-                default:
-                    throw new ParsingException("Unknown node: " + child.getName());
-            }
-        }
-        return config;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/HomeSP subtree.
-     *
-     * @param node PPSNode representing the root of the PerProviderSubscription/HomeSP subtree
-     * @return HomeSP
-     * @throws ParsingException
-     */
-    private static HomeSp parseHomeSP(PPSNode node) throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for HomeSP");
-        }
-
-        HomeSp homeSp = new HomeSp();
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_FQDN:
-                    homeSp.setFqdn(getPpsNodeValue(child));
-                    break;
-                case NODE_FRIENDLY_NAME:
-                    homeSp.setFriendlyName(getPpsNodeValue(child));
-                    break;
-                case NODE_ROAMING_CONSORTIUM_OI:
-                    homeSp.setRoamingConsortiumOis(
-                            parseRoamingConsortiumOI(getPpsNodeValue(child)));
-                    break;
-                case NODE_ICON_URL:
-                    homeSp.setIconUrl(getPpsNodeValue(child));
-                    break;
-                case NODE_NETWORK_ID:
-                    homeSp.setHomeNetworkIds(parseNetworkIds(child));
-                    break;
-                case NODE_HOME_OI_LIST:
-                    Pair<List<Long>, List<Long>> homeOIs = parseHomeOIList(child);
-                    homeSp.setMatchAllOis(convertFromLongList(homeOIs.first));
-                    homeSp.setMatchAnyOis(convertFromLongList(homeOIs.second));
-                    break;
-                case NODE_OTHER_HOME_PARTNERS:
-                    homeSp.setOtherHomePartners(parseOtherHomePartners(child));
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under HomeSP: " + child.getName());
-            }
-        }
-        return homeSp;
-    }
-
-    /**
-     * Parse the roaming consortium OI string, which contains a list of OIs separated by ",".
-     *
-     * @param oiStr string containing list of OIs (Organization Identifiers) separated by ","
-     * @return long[]
-     * @throws ParsingException
-     */
-    private static long[] parseRoamingConsortiumOI(String oiStr)
-            throws ParsingException {
-        String[] oiStrArray = oiStr.split(",");
-        long[] oiArray = new long[oiStrArray.length];
-        for (int i = 0; i < oiStrArray.length; i++) {
-            oiArray[i] = parseLong(oiStrArray[i], 16);
-        }
-        return oiArray;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/HomeSP/NetworkID subtree.
-     *
-     * @param node PPSNode representing the root of the PerProviderSubscription/HomeSP/NetworkID
-     *             subtree
-     * @return HashMap<String, Long> representing list of <SSID, HESSID> pair.
-     * @throws ParsingException
-     */
-    static private Map<String, Long> parseNetworkIds(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for NetworkID");
-        }
-
-        Map<String, Long> networkIds = new HashMap<>();
-        for (PPSNode child : node.getChildren()) {
-            Pair<String, Long> networkId = parseNetworkIdInstance(child);
-            networkIds.put(networkId.first, networkId.second);
-        }
-        return networkIds;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/HomeSP/NetworkID/<X+> subtree.
-     * The instance name (<X+>) is irrelevant and must be unique for each instance, which
-     * is verified when the PPS tree is constructed {@link #buildPpsNode}.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/HomeSP/NetworkID/<X+> subtree
-     * @return Pair<String, Long> representing <SSID, HESSID> pair.
-     * @throws ParsingException
-     */
-    static private Pair<String, Long> parseNetworkIdInstance(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for NetworkID instance");
-        }
-
-        String ssid = null;
-        Long hessid = null;
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_SSID:
-                    ssid = getPpsNodeValue(child);
-                    break;
-                case NODE_HESSID:
-                    hessid = parseLong(getPpsNodeValue(child), 16);
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under NetworkID instance: " +
-                            child.getName());
-            }
-        }
-        if (ssid == null)
-            throw new ParsingException("NetworkID instance missing SSID");
-
-        return new Pair<String, Long>(ssid, hessid);
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/HomeSP/HomeOIList subtree.
-     *
-     * @param node PPSNode representing the root of the PerProviderSubscription/HomeSP/HomeOIList
-     *             subtree
-     * @return Pair<List<Long>, List<Long>> containing both MatchAllOIs and MatchAnyOIs list.
-     * @throws ParsingException
-     */
-    private static Pair<List<Long>, List<Long>> parseHomeOIList(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for HomeOIList");
-        }
-
-        List<Long> matchAllOIs = new ArrayList<Long>();
-        List<Long> matchAnyOIs = new ArrayList<Long>();
-        for (PPSNode child : node.getChildren()) {
-            Pair<Long, Boolean> homeOI = parseHomeOIInstance(child);
-            if (homeOI.second.booleanValue()) {
-                matchAllOIs.add(homeOI.first);
-            } else {
-                matchAnyOIs.add(homeOI.first);
-            }
-        }
-        return new Pair<List<Long>, List<Long>>(matchAllOIs, matchAnyOIs);
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/HomeSP/HomeOIList/<X+> subtree.
-     * The instance name (<X+>) is irrelevant and must be unique for each instance, which
-     * is verified when the PPS tree is constructed {@link #buildPpsNode}.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/HomeSP/HomeOIList/<X+> subtree
-     * @return Pair<Long, Boolean> containing a HomeOI and a HomeOIRequired flag
-     * @throws ParsingException
-     */
-    private static Pair<Long, Boolean> parseHomeOIInstance(PPSNode node) throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for HomeOI instance");
-        }
-
-        Long oi = null;
-        Boolean required = null;
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_HOME_OI:
-                    try {
-                        oi = Long.valueOf(getPpsNodeValue(child), 16);
-                    } catch (NumberFormatException e) {
-                        throw new ParsingException("Invalid HomeOI: " + getPpsNodeValue(child));
-                    }
-                    break;
-                case NODE_HOME_OI_REQUIRED:
-                    required = Boolean.valueOf(getPpsNodeValue(child));
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under NetworkID instance: " +
-                            child.getName());
-            }
-        }
-        if (oi == null) {
-            throw new ParsingException("HomeOI instance missing OI field");
-        }
-        if (required == null) {
-            throw new ParsingException("HomeOI instance missing required field");
-        }
-        return new Pair<Long, Boolean>(oi, required);
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/HomeSP/OtherHomePartners subtree.
-     * This contains a list of FQDN (Fully Qualified Domain Name) that are considered
-     * home partners.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/HomeSP/OtherHomePartners subtree
-     * @return String[] list of partner's FQDN
-     * @throws ParsingException
-     */
-    private static String[] parseOtherHomePartners(PPSNode node) throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for OtherHomePartners");
-        }
-        List<String> otherHomePartners = new ArrayList<String>();
-        for (PPSNode child : node.getChildren()) {
-            String fqdn = parseOtherHomePartnerInstance(child);
-            otherHomePartners.add(fqdn);
-        }
-        return otherHomePartners.toArray(new String[otherHomePartners.size()]);
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/HomeSP/OtherHomePartners/<X+> subtree.
-     * The instance name (<X+>) is irrelevant and must be unique for each instance, which
-     * is verified when the PPS tree is constructed {@link #buildPpsNode}.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/HomeSP/OtherHomePartners/<X+> subtree
-     * @return String FQDN of the partner
-     * @throws ParsingException
-     */
-    private static String parseOtherHomePartnerInstance(PPSNode node) throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for OtherHomePartner instance");
-        }
-        String fqdn = null;
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_FQDN:
-                    fqdn = getPpsNodeValue(child);
-                    break;
-                default:
-                    throw new ParsingException(
-                            "Unknown node under OtherHomePartner instance: " + child.getName());
-            }
-        }
-        if (fqdn == null) {
-            throw new ParsingException("OtherHomePartner instance missing FQDN field");
-        }
-        return fqdn;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Credential subtree.
-     *
-     * @param node PPSNode representing the root of the PerProviderSubscription/Credential subtree
-     * @return Credential
-     * @throws ParsingException
-     */
-    private static Credential parseCredential(PPSNode node) throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for Credential");
-        }
-
-        Credential credential = new Credential();
-        for (PPSNode child: node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_CREATION_DATE:
-                    credential.setCreationTimeInMillis(parseDate(getPpsNodeValue(child)));
-                    break;
-                case NODE_EXPIRATION_DATE:
-                    credential.setExpirationTimeInMillis(parseDate(getPpsNodeValue(child)));
-                    break;
-                case NODE_USERNAME_PASSWORD:
-                    credential.setUserCredential(parseUserCredential(child));
-                    break;
-                case NODE_DIGITAL_CERTIFICATE:
-                    credential.setCertCredential(parseCertificateCredential(child));
-                    break;
-                case NODE_REALM:
-                    credential.setRealm(getPpsNodeValue(child));
-                    break;
-                case NODE_CHECK_AAA_SERVER_CERT_STATUS:
-                    credential.setCheckAaaServerCertStatus(
-                            Boolean.parseBoolean(getPpsNodeValue(child)));
-                    break;
-                case NODE_SIM:
-                    credential.setSimCredential(parseSimCredential(child));
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under Credential: " +
-                            child.getName());
-            }
-        }
-        return credential;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Credential/UsernamePassword subtree.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Credential/UsernamePassword subtree
-     * @return Credential.UserCredential
-     * @throws ParsingException
-     */
-    private static Credential.UserCredential parseUserCredential(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for UsernamePassword");
-        }
-
-        Credential.UserCredential userCred = new Credential.UserCredential();
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_USERNAME:
-                    userCred.setUsername(getPpsNodeValue(child));
-                    break;
-                case NODE_PASSWORD:
-                    userCred.setPassword(getPpsNodeValue(child));
-                    break;
-                case NODE_MACHINE_MANAGED:
-                    userCred.setMachineManaged(Boolean.parseBoolean(getPpsNodeValue(child)));
-                    break;
-                case NODE_SOFT_TOKEN_APP:
-                    userCred.setSoftTokenApp(getPpsNodeValue(child));
-                    break;
-                case NODE_ABLE_TO_SHARE:
-                    userCred.setAbleToShare(Boolean.parseBoolean(getPpsNodeValue(child)));
-                    break;
-                case NODE_EAP_METHOD:
-                    parseEAPMethod(child, userCred);
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under UsernamePassword: "
-                            + child.getName());
-            }
-        }
-        return userCred;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Credential/UsernamePassword/EAPMethod
-     * subtree.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Credential/UsernamePassword/EAPMethod subtree
-     * @param userCred UserCredential to be updated with EAP method values.
-     * @throws ParsingException
-     */
-    private static void parseEAPMethod(PPSNode node, Credential.UserCredential userCred)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for EAPMethod");
-        }
-
-        for (PPSNode child : node.getChildren()) {
-            switch(child.getName()) {
-                case NODE_EAP_TYPE:
-                    userCred.setEapType(parseInteger(getPpsNodeValue(child)));
-                    break;
-                case NODE_INNER_METHOD:
-                    userCred.setNonEapInnerMethod(getPpsNodeValue(child));
-                    break;
-                case NODE_VENDOR_ID:
-                case NODE_VENDOR_TYPE:
-                case NODE_INNER_EAP_TYPE:
-                case NODE_INNER_VENDOR_ID:
-                case NODE_INNER_VENDOR_TYPE:
-                    // Only EAP-TTLS is currently supported for user credential, which doesn't
-                    // use any of these parameters.
-                    Log.d(TAG, "Ignore unsupported EAP method parameter: " + child.getName());
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under EAPMethod: " + child.getName());
-            }
-        }
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Credential/DigitalCertificate subtree.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Credential/DigitalCertificate subtree
-     * @return Credential.CertificateCredential
-     * @throws ParsingException
-     */
-    private static Credential.CertificateCredential parseCertificateCredential(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for CertificateCredential");
-        }
-
-        Credential.CertificateCredential certCred = new Credential.CertificateCredential();
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_CERTIFICATE_TYPE:
-                    certCred.setCertType(getPpsNodeValue(child));
-                    break;
-                case NODE_CERT_SHA256_FINGERPRINT:
-                    certCred.setCertSha256Fingerprint(parseHexString(getPpsNodeValue(child)));
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under CertificateCredential: "
-                            + child.getName());
-            }
-        }
-        return certCred;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Credential/SIM subtree.
-     *
-     * @param node PPSNode representing the root of the PerProviderSubscription/Credential/SIM
-     *             subtree
-     * @return Credential.SimCredential
-     * @throws ParsingException
-     */
-    private static Credential.SimCredential parseSimCredential(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for SimCredential");
-        }
-
-        Credential.SimCredential simCred = new Credential.SimCredential();
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_SIM_IMSI:
-                    simCred.setImsi(getPpsNodeValue(child));
-                    break;
-                case NODE_EAP_TYPE:
-                    simCred.setEapType(parseInteger(getPpsNodeValue(child)));
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under SimCredential: "
-                            + child.getName());
-            }
-        }
-        return simCred;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Policy subtree.
-     *
-     * @param node PPSNode representing the root of the PerProviderSubscription/Policy subtree
-     * @return {@link Policy}
-     * @throws ParsingException
-     */
-    private static Policy parsePolicy(PPSNode node) throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for Policy");
-        }
-
-        Policy policy = new Policy();
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_PREFERRED_ROAMING_PARTNER_LIST:
-                    policy.setPreferredRoamingPartnerList(parsePreferredRoamingPartnerList(child));
-                    break;
-                case NODE_MIN_BACKHAUL_THRESHOLD:
-                    parseMinBackhaulThreshold(child, policy);
-                    break;
-                case NODE_POLICY_UPDATE:
-                    policy.setPolicyUpdate(parseUpdateParameter(child));
-                    break;
-                case NODE_SP_EXCLUSION_LIST:
-                    policy.setExcludedSsidList(parseSpExclusionList(child));
-                    break;
-                case NODE_REQUIRED_PROTO_PORT_TUPLE:
-                    policy.setRequiredProtoPortMap(parseRequiredProtoPortTuple(child));
-                    break;
-                case NODE_MAXIMUM_BSS_LOAD_VALUE:
-                    policy.setMaximumBssLoadValue(parseInteger(getPpsNodeValue(child)));
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under Policy: " + child.getName());
-            }
-        }
-        return policy;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Policy/PreferredRoamingPartnerList
-     * subtree.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Policy/PreferredRoamingPartnerList subtree
-     * @return List of {@link Policy#RoamingPartner}
-     * @throws ParsingException
-     */
-    private static List<Policy.RoamingPartner> parsePreferredRoamingPartnerList(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for PreferredRoamingPartnerList");
-        }
-        List<Policy.RoamingPartner> partnerList = new ArrayList<>();
-        for (PPSNode child : node.getChildren()) {
-            partnerList.add(parsePreferredRoamingPartner(child));
-        }
-        return partnerList;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Policy/PreferredRoamingPartnerList/<X+>
-     * subtree.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Policy/PreferredRoamingPartnerList/<X+> subtree
-     * @return {@link Policy#RoamingPartner}
-     * @throws ParsingException
-     */
-    private static Policy.RoamingPartner parsePreferredRoamingPartner(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for PreferredRoamingPartner "
-                    + "instance");
-        }
-
-        Policy.RoamingPartner roamingPartner = new Policy.RoamingPartner();
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_FQDN_MATCH:
-                    // FQDN_Match field is in the format of "[FQDN],[MatchInfo]", where [MatchInfo]
-                    // is either "exactMatch" for exact match of FQDN or "includeSubdomains" for
-                    // matching all FQDNs with the same sub-domain.
-                    String fqdnMatch = getPpsNodeValue(child);
-                    String[] fqdnMatchArray = fqdnMatch.split(",");
-                    if (fqdnMatchArray.length != 2) {
-                        throw new ParsingException("Invalid FQDN_Match: " + fqdnMatch);
-                    }
-                    roamingPartner.setFqdn(fqdnMatchArray[0]);
-                    if (TextUtils.equals(fqdnMatchArray[1], "exactMatch")) {
-                        roamingPartner.setFqdnExactMatch(true);
-                    } else if (TextUtils.equals(fqdnMatchArray[1], "includeSubdomains")) {
-                        roamingPartner.setFqdnExactMatch(false);
-                    } else {
-                        throw new ParsingException("Invalid FQDN_Match: " + fqdnMatch);
-                    }
-                    break;
-                case NODE_PRIORITY:
-                    roamingPartner.setPriority(parseInteger(getPpsNodeValue(child)));
-                    break;
-                case NODE_COUNTRY:
-                    roamingPartner.setCountries(getPpsNodeValue(child));
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under PreferredRoamingPartnerList "
-                            + "instance " + child.getName());
-            }
-        }
-        return roamingPartner;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Policy/MinBackhaulThreshold subtree
-     * into the given policy.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Policy/MinBackhaulThreshold subtree
-     * @param policy The policy to store the MinBackhualThreshold configuration
-     * @throws ParsingException
-     */
-    private static void parseMinBackhaulThreshold(PPSNode node, Policy policy)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for MinBackhaulThreshold");
-        }
-        for (PPSNode child : node.getChildren()) {
-            parseMinBackhaulThresholdInstance(child, policy);
-        }
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Policy/MinBackhaulThreshold/<X+> subtree
-     * into the given policy.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Policy/MinBackhaulThreshold/<X+> subtree
-     * @param policy The policy to store the MinBackhaulThreshold configuration
-     * @throws ParsingException
-     */
-    private static void parseMinBackhaulThresholdInstance(PPSNode node, Policy policy)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for MinBackhaulThreshold instance");
-        }
-        String networkType = null;
-        long downlinkBandwidth = Long.MIN_VALUE;
-        long uplinkBandwidth = Long.MIN_VALUE;
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_NETWORK_TYPE:
-                    networkType = getPpsNodeValue(child);
-                    break;
-                case NODE_DOWNLINK_BANDWIDTH:
-                    downlinkBandwidth = parseLong(getPpsNodeValue(child), 10);
-                    break;
-                case NODE_UPLINK_BANDWIDTH:
-                    uplinkBandwidth = parseLong(getPpsNodeValue(child), 10);
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under MinBackhaulThreshold instance "
-                            + child.getName());
-            }
-        }
-        if (networkType == null) {
-            throw new ParsingException("Missing NetworkType field");
-        }
-
-        if (TextUtils.equals(networkType, "home")) {
-            policy.setMinHomeDownlinkBandwidth(downlinkBandwidth);
-            policy.setMinHomeUplinkBandwidth(uplinkBandwidth);
-        } else if (TextUtils.equals(networkType, "roaming")) {
-            policy.setMinRoamingDownlinkBandwidth(downlinkBandwidth);
-            policy.setMinRoamingUplinkBandwidth(uplinkBandwidth);
-        } else {
-            throw new ParsingException("Invalid network type: " + networkType);
-        }
-    }
-
-    /**
-     * Parse update parameters. This contained configurations from either
-     * PerProviderSubscription/Policy/PolicyUpdate or PerProviderSubscription/SubscriptionUpdate
-     * subtree.
-     *
-     * @param node PPSNode representing the root of the PerProviderSubscription/Policy/PolicyUpdate
-     *             or PerProviderSubscription/SubscriptionUpdate subtree
-     * @return {@link UpdateParameter}
-     * @throws ParsingException
-     */
-    private static UpdateParameter parseUpdateParameter(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for Update Parameters");
-        }
-
-        UpdateParameter updateParam = new UpdateParameter();
-        for (PPSNode child : node.getChildren()) {
-            switch(child.getName()) {
-                case NODE_UPDATE_INTERVAL:
-                    updateParam.setUpdateIntervalInMinutes(parseLong(getPpsNodeValue(child), 10));
-                    break;
-                case NODE_UPDATE_METHOD:
-                    updateParam.setUpdateMethod(getPpsNodeValue(child));
-                    break;
-                case NODE_RESTRICTION:
-                    updateParam.setRestriction(getPpsNodeValue(child));
-                    break;
-                case NODE_URI:
-                    updateParam.setServerUri(getPpsNodeValue(child));
-                    break;
-                case NODE_USERNAME_PASSWORD:
-                    Pair<String, String> usernamePassword = parseUpdateUserCredential(child);
-                    updateParam.setUsername(usernamePassword.first);
-                    updateParam.setBase64EncodedPassword(usernamePassword.second);
-                    break;
-                case NODE_TRUST_ROOT:
-                    Pair<String, byte[]> trustRoot = parseTrustRoot(child);
-                    updateParam.setTrustRootCertUrl(trustRoot.first);
-                    updateParam.setTrustRootCertSha256Fingerprint(trustRoot.second);
-                    break;
-                case NODE_OTHER:
-                    Log.d(TAG, "Ignore unsupported paramter: " + child.getName());
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under Update Parameters: "
-                            + child.getName());
-            }
-        }
-        return updateParam;
-    }
-
-    /**
-     * Parse username and password parameters associated with policy or subscription update.
-     * This contained configurations under either
-     * PerProviderSubscription/Policy/PolicyUpdate/UsernamePassword or
-     * PerProviderSubscription/SubscriptionUpdate/UsernamePassword subtree.
-     *
-     * @param node PPSNode representing the root of the UsernamePassword subtree
-     * @return Pair of username and password
-     * @throws ParsingException
-     */
-    private static Pair<String, String> parseUpdateUserCredential(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for UsernamePassword");
-        }
-
-        String username = null;
-        String password = null;
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_USERNAME:
-                    username = getPpsNodeValue(child);
-                    break;
-                case NODE_PASSWORD:
-                    password = getPpsNodeValue(child);
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under UsernamePassword: "
-                            + child.getName());
-            }
-        }
-        return Pair.create(username, password);
-    }
-
-    /**
-     * Parse the trust root parameters associated with policy update, subscription update, or AAA
-     * server trust root.
-     *
-     * This contained configurations under either
-     * PerProviderSubscription/Policy/PolicyUpdate/TrustRoot or
-     * PerProviderSubscription/SubscriptionUpdate/TrustRoot or
-     * PerProviderSubscription/AAAServerTrustRoot/<X+> subtree.
-     *
-     * @param node PPSNode representing the root of the TrustRoot subtree
-     * @return Pair of Certificate URL and fingerprint
-     * @throws ParsingException
-     */
-    private static Pair<String, byte[]> parseTrustRoot(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for TrustRoot");
-        }
-
-        String certUrl = null;
-        byte[] certFingerprint = null;
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_CERT_URL:
-                    certUrl = getPpsNodeValue(child);
-                    break;
-                case NODE_CERT_SHA256_FINGERPRINT:
-                    certFingerprint = parseHexString(getPpsNodeValue(child));
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under TrustRoot: "
-                            + child.getName());
-            }
-        }
-        return Pair.create(certUrl, certFingerprint);
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Policy/SPExclusionList subtree.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Policy/SPExclusionList subtree
-     * @return Array of excluded SSIDs
-     * @throws ParsingException
-     */
-    private static String[] parseSpExclusionList(PPSNode node) throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for SPExclusionList");
-        }
-        List<String> ssidList = new ArrayList<>();
-        for (PPSNode child : node.getChildren()) {
-            ssidList.add(parseSpExclusionInstance(child));
-        }
-        return ssidList.toArray(new String[ssidList.size()]);
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Policy/SPExclusionList/<X+> subtree.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Policy/SPExclusionList/<X+> subtree
-     * @return String
-     * @throws ParsingException
-     */
-    private static String parseSpExclusionInstance(PPSNode node) throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for SPExclusion instance");
-        }
-        String ssid = null;
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_SSID:
-                    ssid = getPpsNodeValue(child);
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under SPExclusion instance");
-            }
-        }
-        return ssid;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Policy/RequiredProtoPortTuple subtree.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Policy/RequiredProtoPortTuple subtree
-     * @return Map of IP Protocol to Port Number tuples
-     * @throws ParsingException
-     */
-    private static Map<Integer, String> parseRequiredProtoPortTuple(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for RequiredProtoPortTuple");
-        }
-        Map<Integer, String> protoPortTupleMap = new HashMap<>();
-        for (PPSNode child : node.getChildren()) {
-            Pair<Integer, String> protoPortTuple = parseProtoPortTuple(child);
-            protoPortTupleMap.put(protoPortTuple.first, protoPortTuple.second);
-        }
-        return protoPortTupleMap;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Policy/RequiredProtoPortTuple/<X+>
-     * subtree.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Policy/RequiredProtoPortTuple/<X+> subtree
-     * @return Pair of IP Protocol to Port Number tuple
-     * @throws ParsingException
-     */
-    private static Pair<Integer, String> parseProtoPortTuple(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for RequiredProtoPortTuple "
-                    + "instance");
-        }
-        int proto = Integer.MIN_VALUE;
-        String ports = null;
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_IP_PROTOCOL:
-                    proto = parseInteger(getPpsNodeValue(child));
-                    break;
-                case NODE_PORT_NUMBER:
-                    ports = getPpsNodeValue(child);
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under RequiredProtoPortTuple instance"
-                            + child.getName());
-            }
-        }
-        if (proto == Integer.MIN_VALUE) {
-            throw new ParsingException("Missing IPProtocol field");
-        }
-        if (ports == null) {
-            throw new ParsingException("Missing PortNumber field");
-        }
-        return Pair.create(proto, ports);
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/AAAServerTrustRoot subtree.
-     *
-     * @param node PPSNode representing the root of PerProviderSubscription/AAAServerTrustRoot
-     *             subtree
-     * @return Map of certificate URL with the corresponding certificate fingerprint
-     * @throws ParsingException
-     */
-    private static Map<String, byte[]> parseAAAServerTrustRootList(PPSNode node)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for AAAServerTrustRoot");
-        }
-        Map<String, byte[]> certList = new HashMap<>();
-        for (PPSNode child : node.getChildren()) {
-            Pair<String, byte[]> certTuple = parseTrustRoot(child);
-            certList.put(certTuple.first, certTuple.second);
-        }
-        return certList;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/SubscriptionParameter subtree.
-     *
-     * @param node PPSNode representing the root of PerProviderSubscription/SubscriptionParameter
-     *             subtree
-     * @param config Instance of {@link PasspointConfiguration}
-     * @throws ParsingException
-     */
-    private static void parseSubscriptionParameter(PPSNode node, PasspointConfiguration config)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for SubscriptionParameter");
-        }
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_CREATION_DATE:
-                    config.setSubscriptionCreationTimeInMillis(parseDate(getPpsNodeValue(child)));
-                    break;
-                case NODE_EXPIRATION_DATE:
-                    config.setSubscriptionExpirationTimeInMillis(parseDate(getPpsNodeValue(child)));
-                    break;
-                case NODE_TYPE_OF_SUBSCRIPTION:
-                    config.setSubscriptionType(getPpsNodeValue(child));
-                    break;
-                case NODE_USAGE_LIMITS:
-                    parseUsageLimits(child, config);
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under SubscriptionParameter"
-                            + child.getName());
-            }
-        }
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/SubscriptionParameter/UsageLimits
-     * subtree.
-     *
-     * @param node PPSNode representing the root of
-     *             PerProviderSubscription/SubscriptionParameter/UsageLimits subtree
-     * @param config Instance of {@link PasspointConfiguration}
-     * @throws ParsingException
-     */
-    private static void parseUsageLimits(PPSNode node, PasspointConfiguration config)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for UsageLimits");
-        }
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_DATA_LIMIT:
-                    config.setUsageLimitDataLimit(parseLong(getPpsNodeValue(child), 10));
-                    break;
-                case NODE_START_DATE:
-                    config.setUsageLimitStartTimeInMillis(parseDate(getPpsNodeValue(child)));
-                    break;
-                case NODE_TIME_LIMIT:
-                    config.setUsageLimitTimeLimitInMinutes(parseLong(getPpsNodeValue(child), 10));
-                    break;
-                case NODE_USAGE_TIME_PERIOD:
-                    config.setUsageLimitUsageTimePeriodInMinutes(
-                            parseLong(getPpsNodeValue(child), 10));
-                    break;
-                default:
-                    throw new ParsingException("Unknown node under UsageLimits"
-                            + child.getName());
-            }
-        }
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Extension/Android/AAAServerTrustedNames
-     * subtree.
-     *
-     * @param node PPSNode representing the root of the
-     *             PerProviderSubscription/Extension/Android/AAAServerTrustedNames subtree
-     * @return String[] list of trusted name
-     * @throws ParsingException
-     */
-    private static String[] parseAaaServerTrustedNames(PPSNode node) throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for AAAServerTrustedNames instance");
-        }
-        String fqdnListStr = null;
-        String[] fqdnListArray = null;
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_FQDN:
-                    fqdnListStr = getPpsNodeValue(child);
-                    fqdnListArray = fqdnListStr.split(";");
-                    break;
-                default:
-                    throw new ParsingException(
-                            "Unknown node under AAAServerTrustedNames instance: "
-                            + child.getName());
-            }
-        }
-        if (fqdnListArray == null) {
-            throw new ParsingException("AAAServerTrustedNames instance missing FQDN field");
-        }
-
-        return fqdnListArray;
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Extension/Android subtree.
-     *
-     * @param node PPSNode representing the root of PerProviderSubscription/Extension
-     *             subtree
-     * @param config Instance of {@link PasspointConfiguration}
-     * @throws ParsingException
-     */
-    private static void parseVendorAndroidExtension(PPSNode node, PasspointConfiguration config)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for AndroidExtension");
-        }
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_AAA_SERVER_TRUSTED_NAMES:
-                    config.setAaaServerTrustedNames(parseAaaServerTrustedNames(child));
-                    break;
-                default:
-                    // Don't raise an exception for unknown nodes to avoid breaking old release
-                    Log.w(TAG, "Unknown node under Android Extension: " + child.getName());
-            }
-        }
-    }
-
-    /**
-     * Parse configurations under PerProviderSubscription/Extension subtree.
-     *
-     * @param node PPSNode representing the root of PerProviderSubscription/Extension
-     *             subtree
-     * @param config Instance of {@link PasspointConfiguration}
-     * @throws ParsingException
-     */
-    private static void parseExtension(PPSNode node, PasspointConfiguration config)
-            throws ParsingException {
-        if (node.isLeaf()) {
-            throw new ParsingException("Leaf node not expected for Extension");
-        }
-        for (PPSNode child : node.getChildren()) {
-            switch (child.getName()) {
-                case NODE_VENDOR_ANDROID:
-                    parseVendorAndroidExtension(child, config);
-                    break;
-                default:
-                    // Unknown nodes under Extension won't raise exception.
-                    // This allows adding new nodes in the future and
-                    // won't break older release.
-                    Log.w(TAG, "Unknown node under Extension: " + child.getName());
-            }
-        }
-    }
-
-    /**
-     * Convert a hex string to a byte array.
-     *
-     * @param str String containing hex values
-     * @return byte[]
-     * @throws ParsingException
-     */
-    private static byte[] parseHexString(String str) throws ParsingException {
-        if ((str.length() & 1) == 1) {
-            throw new ParsingException("Odd length hex string: " + str + ", length: "
-                    + str.length());
-        }
-
-        byte[] result = new byte[str.length() / 2];
-        for (int i = 0; i < result.length; i++) {
-          int index = i * 2;
-          try {
-              result[i] = (byte) Integer.parseInt(str.substring(index, index + 2), 16);
-          } catch (NumberFormatException e) {
-              throw new ParsingException("Invalid hex string: " + str);
-          }
-        }
-        return result;
-    }
-
-    /**
-     * Convert a date string to the number of milliseconds since January 1, 1970, 00:00:00 GMT.
-     *
-     * @param dateStr String in the format of yyyy-MM-dd'T'HH:mm:ss'Z'
-     * @return number of milliseconds
-     * @throws ParsingException
-     */
-    private static long parseDate(String dateStr) throws ParsingException {
-        try {
-            DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
-            return format.parse(dateStr).getTime();
-        } catch (ParseException pe) {
-            throw new ParsingException("Badly formatted time: " + dateStr);
-        }
-    }
-
-    /**
-     * Parse an integer string.
-     *
-     * @param value String of integer value
-     * @return int
-     * @throws ParsingException
-     */
-    private static int parseInteger(String value) throws ParsingException {
-        try {
-            return Integer.parseInt(value);
-        } catch (NumberFormatException e) {
-            throw new ParsingException("Invalid integer value: " + value);
-        }
-    }
-
-    /**
-     * Parse a string representing a long integer.
-     *
-     * @param value String of long integer value
-     * @return long
-     * @throws ParsingException
-     */
-    private static long parseLong(String value, int radix) throws ParsingException {
-        try {
-            return Long.parseLong(value, radix);
-        } catch (NumberFormatException e) {
-            throw new ParsingException("Invalid long integer value: " + value);
-        }
-    }
-
-    /**
-     * Convert a List<Long> to a primitive long array long[].
-     *
-     * @param list List to be converted
-     * @return long[]
-     */
-    private static long[] convertFromLongList(List<Long> list) {
-        Long[] objectArray = list.toArray(new Long[list.size()]);
-        long[] primitiveArray = new long[objectArray.length];
-        for (int i = 0; i < objectArray.length; i++) {
-            primitiveArray[i] = objectArray[i].longValue();
-        }
-        return primitiveArray;
-    }
-}
diff --git a/wifi/java/android/net/wifi/hotspot2/omadm/XMLNode.java b/wifi/java/android/net/wifi/hotspot2/omadm/XMLNode.java
deleted file mode 100644
index 959d505..0000000
--- a/wifi/java/android/net/wifi/hotspot2/omadm/XMLNode.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.omadm;
-
-import android.text.TextUtils;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * A class represent a node in an XML tree. Each node is an XML element.
- * Used by {@link XMLParser} for parsing/converting each XML element to XMLNode.
- *
- * @hide
- */
-public class XMLNode {
-    private final String mTag;
-    private final List<XMLNode> mChildren;
-    private final XMLNode mParent;
-    private StringBuilder mTextBuilder;
-    private String mText;
-
-    public XMLNode(XMLNode parent, String tag) {
-        mTag = tag;
-        mParent = parent;
-        mChildren = new ArrayList<>();
-        mTextBuilder = new StringBuilder();
-        mText = null;
-    }
-
-    /**
-     * Adding a text to this node. Invoked by {@link XMLParser#characters}.
-     *
-     * @param text String to be added
-     */
-    public void addText(String text) {
-        mTextBuilder.append(text);
-    }
-
-    /**
-     * Adding a child node to this node. Invoked by {@link XMLParser#startElement}.
-     *
-     * @param child XMLNode to be added
-     */
-    public void addChild(XMLNode child) {
-        mChildren.add(child);
-    }
-
-    /**
-     * Invoked when the end of the XML element is detected. Used for further processing
-     * of the text enclosed within this XML element. Invoked by {@link XMLParser#endElement}.
-     */
-    public void close() {
-        // Remove the leading and the trailing whitespaces.
-        mText = mTextBuilder.toString().trim();
-        mTextBuilder = null;
-    }
-
-    public String getTag() {
-        return mTag;
-    }
-
-    public XMLNode getParent() {
-        return mParent;
-    }
-
-    public String getText() {
-        return mText;
-    }
-
-    public List<XMLNode> getChildren() {
-        return mChildren;
-    }
-
-    @Override
-    public boolean equals(Object thatObject) {
-        if (this == thatObject) {
-            return true;
-        }
-        if (!(thatObject instanceof XMLNode)) {
-            return false;
-        }
-        XMLNode that = (XMLNode) thatObject;
-
-        return TextUtils.equals(mTag, that.mTag) &&
-                TextUtils.equals(mText, that.mText) &&
-                mChildren.equals(that.mChildren);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mTag, mText, mChildren);
-    }
-}
diff --git a/wifi/java/android/net/wifi/hotspot2/omadm/XMLParser.java b/wifi/java/android/net/wifi/hotspot2/omadm/XMLParser.java
deleted file mode 100644
index 948052c..0000000
--- a/wifi/java/android/net/wifi/hotspot2/omadm/XMLParser.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.omadm;
-
-import org.xml.sax.Attributes;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-import android.text.TextUtils;
-
-import java.io.IOException;
-import java.io.StringReader;
-
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.parsers.SAXParser;
-import javax.xml.parsers.SAXParserFactory;
-
-/**
- * Class for parsing an XML string to an XML tree represented by {@link XMLNode}.
- *
- * The original XML string:
- * <root>
- *   <tag1>text1</tag1>
- *   <tag2>
- *     <tag3>text3</tag3>
- *   </tag2>
- * </root>
- *
- * The XML tree representation:
- *                  [root]
- *                     |
- *                     |
- *   [tag1, text1]-----|-----[tag2]
- *                             |
- *                             |
- *                       [tag3, text3]
- *
- * @hide
- */
-public class XMLParser extends DefaultHandler {
-    private XMLNode mRoot = null;
-    private XMLNode mCurrent = null;
-
-    public XMLNode parse(String text) throws IOException, SAXException {
-        if (TextUtils.isEmpty(text)) {
-            throw new IOException("XML string not provided");
-        }
-
-        // Reset pointers.
-        mRoot = null;
-        mCurrent = null;
-
-        try {
-            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
-            parser.parse(new InputSource(new StringReader(text)), this);
-            return mRoot;
-        } catch (ParserConfigurationException pce) {
-            throw new SAXException(pce);
-        }
-    }
-
-    @Override
-    public void startElement(String uri, String localName, String qName, Attributes attributes)
-            throws SAXException {
-        XMLNode parent = mCurrent;
-
-        mCurrent = new XMLNode(parent, qName);
-
-        if (mRoot == null) {
-            mRoot = mCurrent;
-        } else if (parent == null) {
-            throw new SAXException("More than one root nodes");
-        } else {
-            parent.addChild(mCurrent);
-        }
-    }
-
-    @Override
-    public void endElement(String uri, String localName, String qName) throws SAXException {
-        if (!qName.equals(mCurrent.getTag())) {
-            throw new SAXException("End tag '" + qName + "' doesn't match current node: " +
-                    mCurrent);
-        }
-
-        mCurrent.close();
-        mCurrent = mCurrent.getParent();
-    }
-
-    @Override
-    public void characters(char[] ch, int start, int length) throws SAXException {
-        mCurrent.addText(new String(ch, start, length));
-    }
-}
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java b/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
deleted file mode 100644
index 282757a..0000000
--- a/wifi/java/android/net/wifi/hotspot2/pps/Credential.java
+++ /dev/null
@@ -1,1313 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.pps;
-
-import android.net.wifi.EAPConstants;
-import android.net.wifi.ParcelUtil;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.X509Certificate;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Objects;
-import java.util.Set;
-
-/**
- * Class representing Credential subtree in the PerProviderSubscription (PPS)
- * Management Object (MO) tree.
- * For more info, refer to Hotspot 2.0 PPS MO defined in section 9.1 of the Hotspot 2.0
- * Release 2 Technical Specification.
- *
- * In addition to the fields in the Credential subtree, this will also maintain necessary
- * information for the private key and certificates associated with this credential.
- */
-public final class Credential implements Parcelable {
-    private static final String TAG = "Credential";
-
-    /**
-     * Max string length for realm.  Refer to Credential/Realm node in Hotspot 2.0 Release 2
-     * Technical Specification Section 9.1 for more info.
-     */
-    private static final int MAX_REALM_BYTES = 253;
-
-    /**
-     * The time this credential is created. It is in the format of number
-     * of milliseconds since January 1, 1970, 00:00:00 GMT.
-     * Using Long.MIN_VALUE to indicate unset value.
-     */
-    private long mCreationTimeInMillis = Long.MIN_VALUE;
-    /**
-     * @hide
-     */
-    public void setCreationTimeInMillis(long creationTimeInMillis) {
-        mCreationTimeInMillis = creationTimeInMillis;
-    }
-    /**
-     * @hide
-     */
-    public long getCreationTimeInMillis() {
-        return mCreationTimeInMillis;
-    }
-
-    /**
-     * The time this credential will expire. It is in the format of number
-     * of milliseconds since January 1, 1970, 00:00:00 GMT.
-    * Using Long.MIN_VALUE to indicate unset value.
-     */
-    private long mExpirationTimeInMillis = Long.MIN_VALUE;
-    /**
-     * @hide
-     */
-    public void setExpirationTimeInMillis(long expirationTimeInMillis) {
-        mExpirationTimeInMillis = expirationTimeInMillis;
-    }
-    /**
-     * @hide
-     */
-    public long getExpirationTimeInMillis() {
-        return mExpirationTimeInMillis;
-    }
-
-    /**
-     * The realm associated with this credential.  It will be used to determine
-     * if this credential can be used to authenticate with a given hotspot by
-     * comparing the realm specified in that hotspot's ANQP element.
-     */
-    private String mRealm = null;
-    /**
-     * Set the realm associated with this credential.
-     *
-     * @param realm The realm to set to
-     */
-    public void setRealm(String realm) {
-        mRealm = realm;
-    }
-    /**
-     * Get the realm associated with this credential.
-     *
-     * @return the realm associated with this credential
-     */
-    public String getRealm() {
-        return mRealm;
-    }
-
-    /**
-     * When set to true, the device should check AAA (Authentication, Authorization,
-     * and Accounting) server's certificate during EAP (Extensible Authentication
-     * Protocol) authentication.
-     */
-    private boolean mCheckAaaServerCertStatus = false;
-    /**
-     * @hide
-     */
-    public void setCheckAaaServerCertStatus(boolean checkAaaServerCertStatus) {
-        mCheckAaaServerCertStatus = checkAaaServerCertStatus;
-    }
-    /**
-     * @hide
-     */
-    public boolean getCheckAaaServerCertStatus() {
-        return mCheckAaaServerCertStatus;
-    }
-
-    /**
-     * Username-password based credential.
-     * Contains the fields under PerProviderSubscription/Credential/UsernamePassword subtree.
-     */
-    public static final class UserCredential implements Parcelable {
-        /**
-         * Maximum string length for username.  Refer to Credential/UsernamePassword/Username
-         * node in Hotspot 2.0 Release 2 Technical Specification Section 9.1 for more info.
-         */
-        private static final int MAX_USERNAME_BYTES = 63;
-
-        /**
-         * Maximum string length for password.  Refer to Credential/UsernamePassword/Password
-         * in Hotspot 2.0 Release 2 Technical Specification Section 9.1 for more info.
-         */
-        private static final int MAX_PASSWORD_BYTES = 255;
-
-        /**
-         * Supported authentication methods.
-         * @hide
-         */
-        public static final String AUTH_METHOD_PAP = "PAP";
-        /** @hide */
-        public static final String AUTH_METHOD_MSCHAP = "MS-CHAP";
-        /** @hide */
-        public static final String AUTH_METHOD_MSCHAPV2 = "MS-CHAP-V2";
-
-        /**
-         * Supported Non-EAP inner methods.  Refer to
-         * Credential/UsernamePassword/EAPMethod/InnerEAPType in Hotspot 2.0 Release 2 Technical
-         * Specification Section 9.1 for more info.
-         */
-        private static final Set<String> SUPPORTED_AUTH = new HashSet<String>(
-                Arrays.asList(AUTH_METHOD_PAP, AUTH_METHOD_MSCHAP, AUTH_METHOD_MSCHAPV2));
-
-        /**
-         * Username of the credential.
-         */
-        private String mUsername = null;
-        /**
-         * Set the username associated with this user credential.
-         *
-         * @param username The username to set to
-         */
-        public void setUsername(String username) {
-            mUsername = username;
-        }
-        /**
-         * Get the username associated with this user credential.
-         *
-         * @return the username associated with this user credential
-         */
-        public String getUsername() {
-            return mUsername;
-        }
-
-        /**
-         * Base64-encoded password.
-         */
-        private String mPassword = null;
-        /**
-         * Set the Base64-encoded password associated with this user credential.
-         *
-         * @param password The password to set to
-         */
-        public void setPassword(String password) {
-            mPassword = password;
-        }
-        /**
-         * Get the Base64-encoded password associated with this user credential.
-         *
-         * @return the Base64-encoded password associated with this user credential
-         */
-        public String getPassword() {
-            return mPassword;
-        }
-
-        /**
-         * Flag indicating if the password is machine managed.
-         */
-        private boolean mMachineManaged = false;
-        /**
-         * @hide
-         */
-        public void setMachineManaged(boolean machineManaged) {
-            mMachineManaged = machineManaged;
-        }
-        /**
-         * @hide
-         */
-        public boolean getMachineManaged() {
-            return mMachineManaged;
-        }
-
-        /**
-         * The name of the application used to generate the password.
-         */
-        private String mSoftTokenApp = null;
-        /**
-         * @hide
-         */
-        public void setSoftTokenApp(String softTokenApp) {
-            mSoftTokenApp = softTokenApp;
-        }
-        /**
-         * @hide
-         */
-        public String getSoftTokenApp() {
-            return mSoftTokenApp;
-        }
-
-        /**
-         * Flag indicating if this credential is usable on other mobile devices as well.
-         */
-        private boolean mAbleToShare = false;
-        /**
-         * @hide
-         */
-        public void setAbleToShare(boolean ableToShare) {
-            mAbleToShare = ableToShare;
-        }
-        /**
-         * @hide
-         */
-        public boolean getAbleToShare() {
-            return mAbleToShare;
-        }
-
-        /**
-         * EAP (Extensible Authentication Protocol) method type.
-         * Refer to
-         * <a href="http://www.iana.org/assignments/eap-numbers/eap-numbers.xml#eap-numbers-4">
-         * EAP Numbers</a> for valid values.
-         * Using Integer.MIN_VALUE to indicate unset value.
-         */
-        private int mEapType = Integer.MIN_VALUE;
-        /**
-         * Set the EAP (Extensible Authentication Protocol) method type associated with this
-         * user credential.
-         * Refer to
-         * <a href="http://www.iana.org/assignments/eap-numbers/eap-numbers.xml#eap-numbers-4">
-         * EAP Numbers</a> for valid values.
-         *
-         * @param eapType The EAP method type associated with this user credential
-         */
-        public void setEapType(int eapType) {
-            mEapType = eapType;
-        }
-        /**
-         * Get the EAP (Extensible Authentication Protocol) method type associated with this
-         * user credential.
-         *
-         * @return EAP method type
-         */
-        public int getEapType() {
-            return mEapType;
-        }
-
-        /**
-         * Non-EAP inner authentication method.
-         */
-        private String mNonEapInnerMethod = null;
-        /**
-         * Set the inner non-EAP method associated with this user credential.
-         *
-         * @param nonEapInnerMethod The non-EAP inner method to set to
-         */
-        public void setNonEapInnerMethod(String nonEapInnerMethod) {
-            mNonEapInnerMethod = nonEapInnerMethod;
-        }
-        /**
-         * Get the inner non-EAP method associated with this user credential.
-         *
-         * @return Non-EAP inner method associated with this user credential
-         */
-        public String getNonEapInnerMethod() {
-            return mNonEapInnerMethod;
-        }
-
-        /**
-         * Constructor for creating UserCredential with default values.
-         */
-        public UserCredential() {}
-
-        /**
-         * Copy constructor.
-         *
-         * @param source The source to copy from
-         */
-        public UserCredential(UserCredential source) {
-            if (source != null) {
-                mUsername = source.mUsername;
-                mPassword = source.mPassword;
-                mMachineManaged = source.mMachineManaged;
-                mSoftTokenApp = source.mSoftTokenApp;
-                mAbleToShare = source.mAbleToShare;
-                mEapType = source.mEapType;
-                mNonEapInnerMethod = source.mNonEapInnerMethod;
-            }
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeString(mUsername);
-            dest.writeString(mPassword);
-            dest.writeInt(mMachineManaged ? 1 : 0);
-            dest.writeString(mSoftTokenApp);
-            dest.writeInt(mAbleToShare ? 1 : 0);
-            dest.writeInt(mEapType);
-            dest.writeString(mNonEapInnerMethod);
-        }
-
-        @Override
-        public boolean equals(Object thatObject) {
-            if (this == thatObject) {
-                return true;
-            }
-            if (!(thatObject instanceof UserCredential)) {
-                return false;
-            }
-
-            UserCredential that = (UserCredential) thatObject;
-            return TextUtils.equals(mUsername, that.mUsername)
-                    && TextUtils.equals(mPassword, that.mPassword)
-                    && mMachineManaged == that.mMachineManaged
-                    && TextUtils.equals(mSoftTokenApp, that.mSoftTokenApp)
-                    && mAbleToShare == that.mAbleToShare
-                    && mEapType == that.mEapType
-                    && TextUtils.equals(mNonEapInnerMethod, that.mNonEapInnerMethod);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(mUsername, mPassword, mMachineManaged, mSoftTokenApp,
-                    mAbleToShare, mEapType, mNonEapInnerMethod);
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder builder = new StringBuilder();
-            builder.append("Username: ").append(mUsername).append("\n");
-            builder.append("MachineManaged: ").append(mMachineManaged).append("\n");
-            builder.append("SoftTokenApp: ").append(mSoftTokenApp).append("\n");
-            builder.append("AbleToShare: ").append(mAbleToShare).append("\n");
-            builder.append("EAPType: ").append(mEapType).append("\n");
-            builder.append("AuthMethod: ").append(mNonEapInnerMethod).append("\n");
-            return builder.toString();
-        }
-
-        /**
-         * Validate the configuration data.
-         *
-         * @return true on success or false on failure
-         * @hide
-         */
-        public boolean validate() {
-            if (TextUtils.isEmpty(mUsername)) {
-                Log.d(TAG, "Missing username");
-                return false;
-            }
-            if (mUsername.getBytes(StandardCharsets.UTF_8).length > MAX_USERNAME_BYTES) {
-                Log.d(TAG, "username exceeding maximum length: "
-                        + mUsername.getBytes(StandardCharsets.UTF_8).length);
-                return false;
-            }
-
-            if (TextUtils.isEmpty(mPassword)) {
-                Log.d(TAG, "Missing password");
-                return false;
-            }
-            if (mPassword.getBytes(StandardCharsets.UTF_8).length > MAX_PASSWORD_BYTES) {
-                Log.d(TAG, "password exceeding maximum length: "
-                        + mPassword.getBytes(StandardCharsets.UTF_8).length);
-                return false;
-            }
-
-            // Only supports EAP-TTLS for user credential.
-            if (mEapType != EAPConstants.EAP_TTLS) {
-                Log.d(TAG, "Invalid EAP Type for user credential: " + mEapType);
-                return false;
-            }
-
-            // Verify Non-EAP inner method for EAP-TTLS.
-            if (!SUPPORTED_AUTH.contains(mNonEapInnerMethod)) {
-                Log.d(TAG, "Invalid non-EAP inner method for EAP-TTLS: " + mNonEapInnerMethod);
-                return false;
-            }
-            return true;
-        }
-
-        public static final @android.annotation.NonNull Creator<UserCredential> CREATOR =
-            new Creator<UserCredential>() {
-                @Override
-                public UserCredential createFromParcel(Parcel in) {
-                    UserCredential userCredential = new UserCredential();
-                    userCredential.setUsername(in.readString());
-                    userCredential.setPassword(in.readString());
-                    userCredential.setMachineManaged(in.readInt() != 0);
-                    userCredential.setSoftTokenApp(in.readString());
-                    userCredential.setAbleToShare(in.readInt() != 0);
-                    userCredential.setEapType(in.readInt());
-                    userCredential.setNonEapInnerMethod(in.readString());
-                    return userCredential;
-                }
-
-                @Override
-                public UserCredential[] newArray(int size) {
-                    return new UserCredential[size];
-                }
-            };
-
-        /**
-         * Get a unique identifier for UserCredential.
-         *
-         * @hide
-         * @return a Unique identifier for a UserCredential object
-         */
-        public int getUniqueId() {
-            return Objects.hash(mUsername);
-        }
-    }
-    private UserCredential mUserCredential = null;
-    /**
-     * Set the user credential information.
-     *
-     * @param userCredential The user credential to set to
-     */
-    public void setUserCredential(UserCredential userCredential) {
-        mUserCredential = userCredential;
-    }
-    /**
-     * Get the user credential information.
-     *
-     * @return user credential information
-     */
-    public UserCredential getUserCredential() {
-        return mUserCredential;
-    }
-
-    /**
-     * Certificate based credential.  This is used for EAP-TLS.
-     * Contains fields under PerProviderSubscription/Credential/DigitalCertificate subtree.
-     */
-    public static final class CertificateCredential implements Parcelable {
-        /**
-         * Supported certificate types.
-         * @hide
-         */
-        public static final String CERT_TYPE_X509V3 = "x509v3";
-
-        /**
-         * Certificate SHA-256 fingerprint length.
-         */
-        private static final int CERT_SHA256_FINGER_PRINT_LENGTH = 32;
-
-        /**
-         * Certificate type.
-         */
-        private String mCertType = null;
-        /**
-         * Set the certificate type associated with this certificate credential.
-         *
-         * @param certType The certificate type to set to
-         */
-        public void setCertType(String certType) {
-            mCertType = certType;
-        }
-        /**
-         * Get the certificate type associated with this certificate credential.
-         *
-         * @return certificate type
-         */
-        public String getCertType() {
-            return mCertType;
-        }
-
-        /**
-         * The SHA-256 fingerprint of the certificate.
-         */
-        private byte[] mCertSha256Fingerprint = null;
-        /**
-         * Set the certificate SHA-256 fingerprint associated with this certificate credential.
-         *
-         * @param certSha256Fingerprint The certificate fingerprint to set to
-         */
-        public void setCertSha256Fingerprint(byte[] certSha256Fingerprint) {
-            mCertSha256Fingerprint = certSha256Fingerprint;
-        }
-        /**
-         * Get the certificate SHA-256 fingerprint associated with this certificate credential.
-         *
-         * @return certificate SHA-256 fingerprint
-         */
-        public byte[] getCertSha256Fingerprint() {
-            return mCertSha256Fingerprint;
-        }
-
-        /**
-         * Constructor for creating CertificateCredential with default values.
-         */
-        public CertificateCredential() {}
-
-        /**
-         * Copy constructor.
-         *
-         * @param source The source to copy from
-         */
-        public CertificateCredential(CertificateCredential source) {
-            if (source != null) {
-                mCertType = source.mCertType;
-                if (source.mCertSha256Fingerprint != null) {
-                    mCertSha256Fingerprint = Arrays.copyOf(source.mCertSha256Fingerprint,
-                                                          source.mCertSha256Fingerprint.length);
-                }
-            }
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeString(mCertType);
-            dest.writeByteArray(mCertSha256Fingerprint);
-        }
-
-        @Override
-        public boolean equals(Object thatObject) {
-            if (this == thatObject) {
-                return true;
-            }
-            if (!(thatObject instanceof CertificateCredential)) {
-                return false;
-            }
-
-            CertificateCredential that = (CertificateCredential) thatObject;
-            return TextUtils.equals(mCertType, that.mCertType)
-                    && Arrays.equals(mCertSha256Fingerprint, that.mCertSha256Fingerprint);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(mCertType, Arrays.hashCode(mCertSha256Fingerprint));
-        }
-
-        @Override
-        public String toString() {
-            return "CertificateType: " + mCertType + "\n";
-        }
-
-        /**
-         * Validate the configuration data.
-         *
-         * @return true on success or false on failure
-         * @hide
-         */
-        public boolean validate() {
-            if (!TextUtils.equals(CERT_TYPE_X509V3, mCertType)) {
-                Log.d(TAG, "Unsupported certificate type: " + mCertType);
-                return false;
-            }
-            if (mCertSha256Fingerprint == null
-                    || mCertSha256Fingerprint.length != CERT_SHA256_FINGER_PRINT_LENGTH) {
-                Log.d(TAG, "Invalid SHA-256 fingerprint");
-                return false;
-            }
-            return true;
-        }
-
-        public static final @android.annotation.NonNull Creator<CertificateCredential> CREATOR =
-            new Creator<CertificateCredential>() {
-                @Override
-                public CertificateCredential createFromParcel(Parcel in) {
-                    CertificateCredential certCredential = new CertificateCredential();
-                    certCredential.setCertType(in.readString());
-                    certCredential.setCertSha256Fingerprint(in.createByteArray());
-                    return certCredential;
-                }
-
-                @Override
-                public CertificateCredential[] newArray(int size) {
-                    return new CertificateCredential[size];
-                }
-            };
-    }
-    private CertificateCredential mCertCredential = null;
-    /**
-     * Set the certificate credential information.
-     *
-     * @param certCredential The certificate credential to set to
-     */
-    public void setCertCredential(CertificateCredential certCredential) {
-        mCertCredential = certCredential;
-    }
-    /**
-     * Get the certificate credential information.
-     *
-     * @return certificate credential information
-     */
-    public CertificateCredential getCertCredential() {
-        return mCertCredential;
-    }
-
-    /**
-     * SIM (Subscriber Identify Module) based credential.
-     * Contains fields under PerProviderSubscription/Credential/SIM subtree.
-     */
-    public static final class SimCredential implements Parcelable {
-        /**
-         * Maximum string length for IMSI.
-         */
-        private static final int MAX_IMSI_LENGTH = 15;
-
-        /**
-         * International Mobile Subscriber Identity, is used to identify the user
-         * of a cellular network and is a unique identification associated with all
-         * cellular networks
-         */
-        private String mImsi = null;
-        /**
-         * Set the IMSI (International Mobile Subscriber Identity) associated with this SIM
-         * credential.
-         *
-         * @param imsi The IMSI to set to
-         */
-        public void setImsi(String imsi) {
-            mImsi = imsi;
-        }
-        /**
-         * Get the IMSI (International Mobile Subscriber Identity) associated with this SIM
-         * credential.
-         *
-         * @return IMSI associated with this SIM credential
-         */
-        public String getImsi() {
-            return mImsi;
-        }
-
-        /**
-         * EAP (Extensible Authentication Protocol) method type for using SIM credential.
-         * Refer to http://www.iana.org/assignments/eap-numbers/eap-numbers.xml#eap-numbers-4
-         * for valid values.
-         * Using Integer.MIN_VALUE to indicate unset value.
-         */
-        private int mEapType = Integer.MIN_VALUE;
-        /**
-         * Set the EAP (Extensible Authentication Protocol) method type associated with this
-         * SIM credential.
-         *
-         * @param eapType The EAP method type to set to
-         */
-        public void setEapType(int eapType) {
-            mEapType = eapType;
-        }
-        /**
-         * Get the EAP (Extensible Authentication Protocol) method type associated with this
-         * SIM credential.
-         *
-         * @return EAP method type associated with this SIM credential
-         */
-        public int getEapType() {
-            return mEapType;
-        }
-
-        /**
-         * Constructor for creating SimCredential with default values.
-         */
-        public SimCredential() {}
-
-        /**
-         * Copy constructor
-         *
-         * @param source The source to copy from
-         */
-        public SimCredential(SimCredential source) {
-            if (source != null) {
-                mImsi = source.mImsi;
-                mEapType = source.mEapType;
-            }
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public boolean equals(Object thatObject) {
-            if (this == thatObject) {
-                return true;
-            }
-            if (!(thatObject instanceof SimCredential)) {
-                return false;
-            }
-
-            SimCredential that = (SimCredential) thatObject;
-            return TextUtils.equals(mImsi, that.mImsi)
-                    && mEapType == that.mEapType;
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(mImsi, mEapType);
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder builder = new StringBuilder();
-            String imsi;
-            if (mImsi != null) {
-                if (mImsi.length() > 6 && mImsi.charAt(6) != '*') {
-                    // Truncate the full IMSI from the log
-                    imsi = mImsi.substring(0, 6) + "****";
-                } else {
-                    imsi = mImsi;
-                }
-                builder.append("IMSI: ").append(imsi).append("\n");
-            }
-            builder.append("EAPType: ").append(mEapType).append("\n");
-            return builder.toString();
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeString(mImsi);
-            dest.writeInt(mEapType);
-        }
-
-        /**
-         * Validate the configuration data.
-         *
-         * @return true on success or false on failure
-         * @hide
-         */
-        public boolean validate() {
-            // Note: this only validate the format of IMSI string itself.  Additional verification
-            // will be done by WifiService at the time of provisioning to verify against the IMSI
-            // of the SIM card installed in the device.
-            if (!verifyImsi()) {
-                return false;
-            }
-            if (mEapType != EAPConstants.EAP_SIM && mEapType != EAPConstants.EAP_AKA
-                    && mEapType != EAPConstants.EAP_AKA_PRIME) {
-                Log.d(TAG, "Invalid EAP Type for SIM credential: " + mEapType);
-                return false;
-            }
-            return true;
-        }
-
-        public static final @android.annotation.NonNull Creator<SimCredential> CREATOR =
-            new Creator<SimCredential>() {
-                @Override
-                public SimCredential createFromParcel(Parcel in) {
-                    SimCredential simCredential = new SimCredential();
-                    simCredential.setImsi(in.readString());
-                    simCredential.setEapType(in.readInt());
-                    return simCredential;
-                }
-
-                @Override
-                public SimCredential[] newArray(int size) {
-                    return new SimCredential[size];
-                }
-            };
-
-        /**
-         * Verify the IMSI (International Mobile Subscriber Identity) string.  The string
-         * should contain zero or more numeric digits, and might ends with a "*" for prefix
-         * matching.
-         *
-         * @return true if IMSI is valid, false otherwise.
-         */
-        private boolean verifyImsi() {
-            if (TextUtils.isEmpty(mImsi)) {
-                Log.d(TAG, "Missing IMSI");
-                return false;
-            }
-            if (mImsi.length() > MAX_IMSI_LENGTH) {
-                Log.d(TAG, "IMSI exceeding maximum length: " + mImsi.length());
-                return false;
-            }
-
-            // Locate the first non-digit character.
-            int nonDigit;
-            char stopChar = '\0';
-            for (nonDigit = 0; nonDigit < mImsi.length(); nonDigit++) {
-                stopChar = mImsi.charAt(nonDigit);
-                if (stopChar < '0' || stopChar > '9') {
-                    break;
-                }
-            }
-
-            if (nonDigit == mImsi.length()) {
-                return true;
-            }
-            else if (nonDigit == mImsi.length()-1 && stopChar == '*') {
-                // Prefix matching.
-                return true;
-            }
-            return false;
-        }
-    }
-    private SimCredential mSimCredential = null;
-    /**
-     * Set the SIM credential information.
-     *
-     * @param simCredential The SIM credential to set to
-     */
-    public void setSimCredential(SimCredential simCredential) {
-        mSimCredential = simCredential;
-    }
-    /**
-     * Get the SIM credential information.
-     *
-     * @return SIM credential information
-     */
-    public SimCredential getSimCredential() {
-        return mSimCredential;
-    }
-
-    /**
-     * CA (Certificate Authority) X509 certificates.
-     */
-    private X509Certificate[] mCaCertificates = null;
-
-    /**
-     * Set the CA (Certification Authority) certificate associated with this credential.
-     *
-     * @param caCertificate The CA certificate to set to
-     */
-    public void setCaCertificate(X509Certificate caCertificate) {
-        mCaCertificates = null;
-        if (caCertificate != null) {
-            mCaCertificates = new X509Certificate[] {caCertificate};
-        }
-    }
-
-    /**
-     * Set the CA (Certification Authority) certificates associated with this credential.
-     *
-     * @param caCertificates The list of CA certificates to set to
-     * @hide
-     */
-    public void setCaCertificates(X509Certificate[] caCertificates) {
-        mCaCertificates = caCertificates;
-    }
-
-    /**
-     * Get the CA (Certification Authority) certificate associated with this credential.
-     *
-     * @return CA certificate associated with this credential, {@code null} if certificate is not
-     * set or certificate is more than one.
-     */
-    public X509Certificate getCaCertificate() {
-        return mCaCertificates == null || mCaCertificates.length > 1 ? null : mCaCertificates[0];
-    }
-
-    /**
-     * Get the CA (Certification Authority) certificates associated with this credential.
-     *
-     * @return The list of CA certificates associated with this credential
-     * @hide
-     */
-    public X509Certificate[] getCaCertificates() {
-        return mCaCertificates;
-    }
-
-    /**
-     * Client side X509 certificate chain.
-     */
-    private X509Certificate[] mClientCertificateChain = null;
-    /**
-     * Set the client certificate chain associated with this credential.
-     *
-     * @param certificateChain The client certificate chain to set to
-     */
-    public void setClientCertificateChain(X509Certificate[] certificateChain) {
-        mClientCertificateChain = certificateChain;
-    }
-    /**
-     * Get the client certificate chain associated with this credential.
-     *
-     * @return client certificate chain associated with this credential
-     */
-    public X509Certificate[] getClientCertificateChain() {
-        return mClientCertificateChain;
-    }
-
-    /**
-     * Client side private key.
-     */
-    private PrivateKey mClientPrivateKey = null;
-    /**
-     * Set the client private key associated with this credential.
-     *
-     * @param clientPrivateKey the client private key to set to
-     */
-    public void setClientPrivateKey(PrivateKey clientPrivateKey) {
-        mClientPrivateKey = clientPrivateKey;
-    }
-    /**
-     * Get the client private key associated with this credential.
-     *
-     * @return client private key associated with this credential.
-     */
-    public PrivateKey getClientPrivateKey() {
-        return mClientPrivateKey;
-    }
-
-    /**
-     * Constructor for creating Credential with default values.
-     */
-    public Credential() {}
-
-    /**
-     * Copy constructor.
-     *
-     * @param source The source to copy from
-     */
-    public Credential(Credential source) {
-        if (source != null) {
-            mCreationTimeInMillis = source.mCreationTimeInMillis;
-            mExpirationTimeInMillis = source.mExpirationTimeInMillis;
-            mRealm = source.mRealm;
-            mCheckAaaServerCertStatus = source.mCheckAaaServerCertStatus;
-            if (source.mUserCredential != null) {
-                mUserCredential = new UserCredential(source.mUserCredential);
-            }
-            if (source.mCertCredential != null) {
-                mCertCredential = new CertificateCredential(source.mCertCredential);
-            }
-            if (source.mSimCredential != null) {
-                mSimCredential = new SimCredential(source.mSimCredential);
-            }
-            if (source.mClientCertificateChain != null) {
-                mClientCertificateChain = Arrays.copyOf(source.mClientCertificateChain,
-                                                        source.mClientCertificateChain.length);
-            }
-            if (source.mCaCertificates != null) {
-                mCaCertificates = Arrays.copyOf(source.mCaCertificates,
-                        source.mCaCertificates.length);
-            }
-
-            mClientPrivateKey = source.mClientPrivateKey;
-        }
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeLong(mCreationTimeInMillis);
-        dest.writeLong(mExpirationTimeInMillis);
-        dest.writeString(mRealm);
-        dest.writeInt(mCheckAaaServerCertStatus ? 1 : 0);
-        dest.writeParcelable(mUserCredential, flags);
-        dest.writeParcelable(mCertCredential, flags);
-        dest.writeParcelable(mSimCredential, flags);
-        ParcelUtil.writeCertificates(dest, mCaCertificates);
-        ParcelUtil.writeCertificates(dest, mClientCertificateChain);
-        ParcelUtil.writePrivateKey(dest, mClientPrivateKey);
-    }
-
-    @Override
-    public boolean equals(Object thatObject) {
-        if (this == thatObject) {
-            return true;
-        }
-        if (!(thatObject instanceof Credential)) {
-            return false;
-        }
-
-        Credential that = (Credential) thatObject;
-        return TextUtils.equals(mRealm, that.mRealm)
-                && mCreationTimeInMillis == that.mCreationTimeInMillis
-                && mExpirationTimeInMillis == that.mExpirationTimeInMillis
-                && mCheckAaaServerCertStatus == that.mCheckAaaServerCertStatus
-                && (mUserCredential == null ? that.mUserCredential == null
-                    : mUserCredential.equals(that.mUserCredential))
-                && (mCertCredential == null ? that.mCertCredential == null
-                    : mCertCredential.equals(that.mCertCredential))
-                && (mSimCredential == null ? that.mSimCredential == null
-                    : mSimCredential.equals(that.mSimCredential))
-                && isX509CertificatesEquals(mCaCertificates, that.mCaCertificates)
-                && isX509CertificatesEquals(mClientCertificateChain, that.mClientCertificateChain)
-                && isPrivateKeyEquals(mClientPrivateKey, that.mClientPrivateKey);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mCreationTimeInMillis, mExpirationTimeInMillis, mRealm,
-                mCheckAaaServerCertStatus, mUserCredential, mCertCredential, mSimCredential,
-                mClientPrivateKey, Arrays.hashCode(mCaCertificates),
-                Arrays.hashCode(mClientCertificateChain));
-    }
-
-    /**
-     * Get a unique identifier for Credential. This identifier depends only on items that remain
-     * constant throughout the lifetime of a subscription's credentials.
-     *
-     * @hide
-     * @return a Unique identifier for a Credential object
-     */
-    public int getUniqueId() {
-        return Objects.hash(mUserCredential != null ? mUserCredential.getUniqueId() : 0,
-                mCertCredential, mSimCredential, mRealm);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("Realm: ").append(mRealm).append("\n");
-        builder.append("CreationTime: ").append(mCreationTimeInMillis != Long.MIN_VALUE
-                ? new Date(mCreationTimeInMillis) : "Not specified").append("\n");
-        builder.append("ExpirationTime: ").append(mExpirationTimeInMillis != Long.MIN_VALUE
-                ? new Date(mExpirationTimeInMillis) : "Not specified").append("\n");
-        builder.append("CheckAAAServerStatus: ").append(mCheckAaaServerCertStatus).append("\n");
-        if (mUserCredential != null) {
-            builder.append("UserCredential Begin ---\n");
-            builder.append(mUserCredential);
-            builder.append("UserCredential End ---\n");
-        }
-        if (mCertCredential != null) {
-            builder.append("CertificateCredential Begin ---\n");
-            builder.append(mCertCredential);
-            builder.append("CertificateCredential End ---\n");
-        }
-        if (mSimCredential != null) {
-            builder.append("SIMCredential Begin ---\n");
-            builder.append(mSimCredential);
-            builder.append("SIMCredential End ---\n");
-        }
-        return builder.toString();
-    }
-
-    /**
-     * Validate the configuration data.
-     *
-     * @return true on success or false on failure
-     * @hide
-     */
-    public boolean validate() {
-        if (TextUtils.isEmpty(mRealm)) {
-            Log.d(TAG, "Missing realm");
-            return false;
-        }
-        if (mRealm.getBytes(StandardCharsets.UTF_8).length > MAX_REALM_BYTES) {
-            Log.d(TAG, "realm exceeding maximum length: "
-                    + mRealm.getBytes(StandardCharsets.UTF_8).length);
-            return false;
-        }
-
-        // Verify the credential.
-        if (mUserCredential != null) {
-            if (!verifyUserCredential()) {
-                return false;
-            }
-        } else if (mCertCredential != null) {
-            if (!verifyCertCredential()) {
-                return false;
-            }
-        } else if (mSimCredential != null) {
-            if (!verifySimCredential()) {
-                return false;
-            }
-        } else {
-            Log.d(TAG, "Missing required credential");
-            return false;
-        }
-
-        return true;
-    }
-
-    public static final @android.annotation.NonNull Creator<Credential> CREATOR =
-        new Creator<Credential>() {
-            @Override
-            public Credential createFromParcel(Parcel in) {
-                Credential credential = new Credential();
-                credential.setCreationTimeInMillis(in.readLong());
-                credential.setExpirationTimeInMillis(in.readLong());
-                credential.setRealm(in.readString());
-                credential.setCheckAaaServerCertStatus(in.readInt() != 0);
-                credential.setUserCredential(in.readParcelable(null));
-                credential.setCertCredential(in.readParcelable(null));
-                credential.setSimCredential(in.readParcelable(null));
-                credential.setCaCertificates(ParcelUtil.readCertificates(in));
-                credential.setClientCertificateChain(ParcelUtil.readCertificates(in));
-                credential.setClientPrivateKey(ParcelUtil.readPrivateKey(in));
-                return credential;
-            }
-
-            @Override
-            public Credential[] newArray(int size) {
-                return new Credential[size];
-            }
-        };
-
-    /**
-     * Verify user credential.
-     * If no CA certificate is provided, then the system uses the CAs in the trust store.
-     *
-     * @return true if user credential is valid, false otherwise.
-     */
-    private boolean verifyUserCredential() {
-        if (mUserCredential == null) {
-            Log.d(TAG, "Missing user credential");
-            return false;
-        }
-        if (mCertCredential != null || mSimCredential != null) {
-            Log.d(TAG, "Contained more than one type of credential");
-            return false;
-        }
-        if (!mUserCredential.validate()) {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Verify certificate credential, which is used for EAP-TLS.  This will verify
-     * that the necessary client key and certificates are provided.
-     * If no CA certificate is provided, then the system uses the CAs in the trust store.
-     *
-     * @return true if certificate credential is valid, false otherwise.
-     */
-    private boolean verifyCertCredential() {
-        if (mCertCredential == null) {
-            Log.d(TAG, "Missing certificate credential");
-            return false;
-        }
-        if (mUserCredential != null || mSimCredential != null) {
-            Log.d(TAG, "Contained more than one type of credential");
-            return false;
-        }
-
-        if (!mCertCredential.validate()) {
-            return false;
-        }
-
-        if (mClientPrivateKey == null) {
-            Log.d(TAG, "Missing client private key for certificate credential");
-            return false;
-        }
-        try {
-            // Verify SHA-256 fingerprint for client certificate.
-            if (!verifySha256Fingerprint(mClientCertificateChain,
-                    mCertCredential.getCertSha256Fingerprint())) {
-                Log.d(TAG, "SHA-256 fingerprint mismatch");
-                return false;
-            }
-        } catch (NoSuchAlgorithmException | CertificateEncodingException e) {
-            Log.d(TAG, "Failed to verify SHA-256 fingerprint: " + e.getMessage());
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Verify SIM credential.
-     *
-     * @return true if SIM credential is valid, false otherwise.
-     */
-    private boolean verifySimCredential() {
-        if (mSimCredential == null) {
-            Log.d(TAG, "Missing SIM credential");
-            return false;
-        }
-        if (mUserCredential != null || mCertCredential != null) {
-            Log.d(TAG, "Contained more than one type of credential");
-            return false;
-        }
-        return mSimCredential.validate();
-    }
-
-    private static boolean isPrivateKeyEquals(PrivateKey key1, PrivateKey key2) {
-        if (key1 == null && key2 == null) {
-            return true;
-        }
-
-        /* Return false if only one of them is null */
-        if (key1 == null || key2 == null) {
-            return false;
-        }
-
-        return TextUtils.equals(key1.getAlgorithm(), key2.getAlgorithm()) &&
-                Arrays.equals(key1.getEncoded(), key2.getEncoded());
-    }
-
-    /**
-     * Verify two X.509 certificates are identical.
-     *
-     * @param cert1 a certificate to compare
-     * @param cert2 a certificate to compare
-     * @return {@code true} if given certificates are the same each other, {@code false} otherwise.
-     * @hide
-     */
-    public static boolean isX509CertificateEquals(X509Certificate cert1, X509Certificate cert2) {
-        if (cert1 == null && cert2 == null) {
-            return true;
-        }
-
-        /* Return false if only one of them is null */
-        if (cert1 == null || cert2 == null) {
-            return false;
-        }
-
-        boolean result = false;
-        try {
-            result = Arrays.equals(cert1.getEncoded(), cert2.getEncoded());
-        } catch (CertificateEncodingException e) {
-            /* empty, return false. */
-        }
-        return result;
-    }
-
-    private static boolean isX509CertificatesEquals(X509Certificate[] certs1,
-                                                    X509Certificate[] certs2) {
-        if (certs1 == null && certs2 == null) {
-            return true;
-        }
-
-        /* Return false if only one of them is null */
-        if (certs1 == null || certs2 == null) {
-            return false;
-        }
-
-        if (certs1.length != certs2.length) {
-            return false;
-        }
-
-        for (int i = 0; i < certs1.length; i++) {
-            if (!isX509CertificateEquals(certs1[i], certs2[i])) {
-                return false;
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Verify that the digest for a certificate in the certificate chain matches expected
-     * fingerprint.  The certificate that matches the fingerprint is the client certificate.
-     *
-     * @param certChain Chain of certificates
-     * @param expectedFingerprint The expected SHA-256 digest of the client certificate
-     * @return true if the certificate chain contains a matching certificate, false otherwise
-     * @throws NoSuchAlgorithmException
-     * @throws CertificateEncodingException
-     */
-    private static boolean verifySha256Fingerprint(X509Certificate[] certChain,
-                                                   byte[] expectedFingerprint)
-            throws NoSuchAlgorithmException, CertificateEncodingException {
-        if (certChain == null) {
-            return false;
-        }
-        MessageDigest digester = MessageDigest.getInstance("SHA-256");
-        for (X509Certificate certificate : certChain) {
-            digester.reset();
-            byte[] fingerprint = digester.digest(certificate.getEncoded());
-            if (Arrays.equals(expectedFingerprint, fingerprint)) {
-                return true;
-            }
-        }
-        return false;
-    }
-}
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java b/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
deleted file mode 100644
index 8f34579..0000000
--- a/wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java
+++ /dev/null
@@ -1,429 +0,0 @@
-/**
- * Copyright (c) 2016, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.pps;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * Class representing HomeSP subtree in PerProviderSubscription (PPS)
- * Management Object (MO) tree.
- *
- * For more info, refer to Hotspot 2.0 PPS MO defined in section 9.1 of the Hotspot 2.0
- * Release 2 Technical Specification.
- */
-public final class HomeSp implements Parcelable {
-    private static final String TAG = "HomeSp";
-
-    /**
-     * Maximum number of bytes allowed for a SSID.
-     */
-    private static final int MAX_SSID_BYTES = 32;
-
-    /**
-     * Integer value used for indicating null value in the Parcel.
-     */
-    private static final int NULL_VALUE = -1;
-
-    /**
-     * FQDN (Fully Qualified Domain Name) of this home service provider.
-     */
-    private String mFqdn = null;
-    /**
-     * Set the FQDN (Fully Qualified Domain Name) associated with this home service provider.
-     *
-     * @param fqdn The FQDN to set to
-     */
-    public void setFqdn(String fqdn) {
-        mFqdn = fqdn;
-    }
-    /**
-     * Get the FQDN (Fully Qualified Domain Name) associated with this home service provider.
-     *
-     * @return the FQDN associated with this home service provider
-     */
-    public String getFqdn() {
-        return mFqdn;
-    }
-
-    /**
-     * Friendly name of this home service provider.
-     */
-    private String mFriendlyName = null;
-    /**
-     * Set the friendly name associated with this home service provider.
-     *
-     * @param friendlyName The friendly name to set to
-     */
-    public void setFriendlyName(String friendlyName) {
-        mFriendlyName = friendlyName;
-    }
-    /**
-     * Get the friendly name associated with this home service provider.
-     *
-     * @return the friendly name associated with this home service provider
-     */
-    public String getFriendlyName() {
-        return mFriendlyName;
-    }
-
-    /**
-     * Icon URL of this home service provider.
-     */
-    private String mIconUrl = null;
-    /**
-     * @hide
-     */
-    public void setIconUrl(String iconUrl) {
-        mIconUrl = iconUrl;
-    }
-    /**
-     * @hide
-     */
-    public String getIconUrl() {
-        return mIconUrl;
-    }
-
-    /**
-     * <SSID, HESSID> duple of the networks that are consider home networks.
-     *
-     * According to the Section 9.1.2 of the Hotspot 2.0 Release 2 Technical Specification,
-     * all nodes in the PSS MO are encoded using UTF-8 unless stated otherwise.  Thus, the SSID
-     * string is assumed to be encoded using UTF-8.
-     */
-    private Map<String, Long> mHomeNetworkIds = null;
-    /**
-     * @hide
-     */
-    public void setHomeNetworkIds(Map<String, Long> homeNetworkIds) {
-        mHomeNetworkIds = homeNetworkIds;
-    }
-    /**
-     * @hide
-     */
-    public Map<String, Long> getHomeNetworkIds() {
-        return mHomeNetworkIds;
-    }
-
-    /**
-     * Used for determining if this provider is a member of a given Hotspot provider.
-     * Every Organization Identifiers (OIs) in this list are required to match an OI in the
-     * the Roaming Consortium advertised by a Hotspot, in order to consider this provider
-     * as a member of that Hotspot provider (e.g. successful authentication with such Hotspot
-     * is possible).
-     *
-     * Refer to HomeSP/HomeOIList subtree in PerProviderSubscription (PPS) Management Object
-     * (MO) tree for more detail.
-     */
-    private long[] mMatchAllOis = null;
-    /**
-     * @hide
-     */
-    public void setMatchAllOis(long[] matchAllOis) {
-        mMatchAllOis = matchAllOis;
-    }
-    /**
-     * @hide
-     */
-    public long[] getMatchAllOis() {
-        return mMatchAllOis;
-    }
-
-    /**
-     * Used for determining if this provider is a member of a given Hotspot provider.
-     * Matching of any Organization Identifiers (OIs) in this list with an OI in the
-     * Roaming Consortium advertised by a Hotspot, will consider this provider as a member
-     * of that Hotspot provider (e.g. successful authentication with such Hotspot
-     * is possible).
-     *
-     * {@link #mMatchAllOIs} will have precedence over this one, meaning this list will
-     * only be used for matching if {@link #mMatchAllOIs} is null or empty.
-     *
-     * Refer to HomeSP/HomeOIList subtree in PerProviderSubscription (PPS) Management Object
-     * (MO) tree for more detail.
-     */
-    private long[] mMatchAnyOis = null;
-    /**
-     * @hide
-     */
-    public void setMatchAnyOis(long[] matchAnyOis) {
-        mMatchAnyOis = matchAnyOis;
-    }
-    /**
-     * @hide
-     */
-    public long[] getMatchAnyOis() {
-        return mMatchAnyOis;
-    }
-
-    /**
-     * List of FQDN (Fully Qualified Domain Name) of partner providers.
-     * These providers should also be regarded as home Hotspot operators.
-     * This relationship is most likely achieved via a commercial agreement or
-     * operator merges between the providers.
-     */
-    private String[] mOtherHomePartners = null;
-    /**
-     * @hide
-     */
-    public void setOtherHomePartners(String[] otherHomePartners) {
-        mOtherHomePartners = otherHomePartners;
-    }
-    /**
-     * @hide
-     */
-    public String[] getOtherHomePartners() {
-        return mOtherHomePartners;
-    }
-
-    /**
-     * List of Organization Identifiers (OIs) identifying a roaming consortium of
-     * which this provider is a member.
-     */
-    private long[] mRoamingConsortiumOis = null;
-    /**
-     * Set the Organization Identifiers (OIs) identifying a roaming consortium of which this
-     * provider is a member.
-     *
-     * @param roamingConsortiumOis Array of roaming consortium OIs
-     */
-    public void setRoamingConsortiumOis(long[] roamingConsortiumOis) {
-        mRoamingConsortiumOis = roamingConsortiumOis;
-    }
-    /**
-     * Get the Organization Identifiers (OIs) identifying a roaming consortium of which this
-     * provider is a member.
-     *
-     * @return array of roaming consortium OIs
-     */
-    public long[] getRoamingConsortiumOis() {
-        return mRoamingConsortiumOis;
-    }
-
-    /**
-     * Constructor for creating HomeSp with default values.
-     */
-    public HomeSp() {}
-
-    /**
-     * Copy constructor.
-     *
-     * @param source The source to copy from
-     */
-    public HomeSp(HomeSp source) {
-        if (source == null) {
-            return;
-        }
-        mFqdn = source.mFqdn;
-        mFriendlyName = source.mFriendlyName;
-        mIconUrl = source.mIconUrl;
-        if (source.mHomeNetworkIds != null) {
-            mHomeNetworkIds = Collections.unmodifiableMap(source.mHomeNetworkIds);
-        }
-        if (source.mMatchAllOis != null) {
-            mMatchAllOis = Arrays.copyOf(source.mMatchAllOis, source.mMatchAllOis.length);
-        }
-        if (source.mMatchAnyOis != null) {
-            mMatchAnyOis = Arrays.copyOf(source.mMatchAnyOis, source.mMatchAnyOis.length);
-        }
-        if (source.mOtherHomePartners != null) {
-            mOtherHomePartners = Arrays.copyOf(source.mOtherHomePartners,
-                    source.mOtherHomePartners.length);
-        }
-        if (source.mRoamingConsortiumOis != null) {
-            mRoamingConsortiumOis = Arrays.copyOf(source.mRoamingConsortiumOis,
-                    source.mRoamingConsortiumOis.length);
-        }
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mFqdn);
-        dest.writeString(mFriendlyName);
-        dest.writeString(mIconUrl);
-        writeHomeNetworkIds(dest, mHomeNetworkIds);
-        dest.writeLongArray(mMatchAllOis);
-        dest.writeLongArray(mMatchAnyOis);
-        dest.writeStringArray(mOtherHomePartners);
-        dest.writeLongArray(mRoamingConsortiumOis);
-    }
-
-    @Override
-    public boolean equals(Object thatObject) {
-        if (this == thatObject) {
-            return true;
-        }
-        if (!(thatObject instanceof HomeSp)) {
-            return false;
-        }
-        HomeSp that = (HomeSp) thatObject;
-
-        return TextUtils.equals(mFqdn, that.mFqdn)
-                && TextUtils.equals(mFriendlyName, that.mFriendlyName)
-                && TextUtils.equals(mIconUrl, that.mIconUrl)
-                && (mHomeNetworkIds == null ? that.mHomeNetworkIds == null
-                        : mHomeNetworkIds.equals(that.mHomeNetworkIds))
-                && Arrays.equals(mMatchAllOis, that.mMatchAllOis)
-                && Arrays.equals(mMatchAnyOis, that.mMatchAnyOis)
-                && Arrays.equals(mOtherHomePartners, that.mOtherHomePartners)
-                && Arrays.equals(mRoamingConsortiumOis, that.mRoamingConsortiumOis);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mFqdn, mFriendlyName, mIconUrl,
-                mHomeNetworkIds, Arrays.hashCode(mMatchAllOis),
-                Arrays.hashCode(mMatchAnyOis), Arrays.hashCode(mOtherHomePartners),
-                Arrays.hashCode(mRoamingConsortiumOis));
-    }
-
-    /**
-     * Get a unique identifier for HomeSp. This identifier depends only on items that remain
-     * constant throughout the lifetime of a subscription.
-     *
-     * @hide
-     * @return a Unique identifier for a HomeSp object
-     */
-    public int getUniqueId() {
-        return Objects.hash(mFqdn);
-    }
-
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("FQDN: ").append(mFqdn).append("\n");
-        builder.append("FriendlyName: ").append(mFriendlyName).append("\n");
-        builder.append("IconURL: ").append(mIconUrl).append("\n");
-        builder.append("HomeNetworkIDs: ").append(mHomeNetworkIds).append("\n");
-        builder.append("MatchAllOIs: ").append(mMatchAllOis).append("\n");
-        builder.append("MatchAnyOIs: ").append(mMatchAnyOis).append("\n");
-        builder.append("OtherHomePartners: ").append(mOtherHomePartners).append("\n");
-        builder.append("RoamingConsortiumOIs: ").append(mRoamingConsortiumOis).append("\n");
-        return builder.toString();
-    }
-
-    /**
-     * Validate HomeSp data.
-     *
-     * @return true on success or false on failure
-     * @hide
-     */
-    public boolean validate() {
-        if (TextUtils.isEmpty(mFqdn)) {
-            Log.d(TAG, "Missing FQDN");
-            return false;
-        }
-        if (TextUtils.isEmpty(mFriendlyName)) {
-            Log.d(TAG, "Missing friendly name");
-            return false;
-        }
-        // Verify SSIDs specified in the NetworkID
-        if (mHomeNetworkIds != null) {
-            for (Map.Entry<String, Long> entry : mHomeNetworkIds.entrySet()) {
-                if (entry.getKey() == null ||
-                        entry.getKey().getBytes(StandardCharsets.UTF_8).length > MAX_SSID_BYTES) {
-                    Log.d(TAG, "Invalid SSID in HomeNetworkIDs");
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    public static final @android.annotation.NonNull Creator<HomeSp> CREATOR =
-        new Creator<HomeSp>() {
-            @Override
-            public HomeSp createFromParcel(Parcel in) {
-                HomeSp homeSp = new HomeSp();
-                homeSp.setFqdn(in.readString());
-                homeSp.setFriendlyName(in.readString());
-                homeSp.setIconUrl(in.readString());
-                homeSp.setHomeNetworkIds(readHomeNetworkIds(in));
-                homeSp.setMatchAllOis(in.createLongArray());
-                homeSp.setMatchAnyOis(in.createLongArray());
-                homeSp.setOtherHomePartners(in.createStringArray());
-                homeSp.setRoamingConsortiumOis(in.createLongArray());
-                return homeSp;
-            }
-
-            @Override
-            public HomeSp[] newArray(int size) {
-                return new HomeSp[size];
-            }
-
-            /**
-             * Helper function for reading a Home Network IDs map from a Parcel.
-             *
-             * @param in The Parcel to read from
-             * @return Map of home network IDs
-             */
-            private Map<String, Long> readHomeNetworkIds(Parcel in) {
-                int size = in.readInt();
-                if (size == NULL_VALUE) {
-                    return null;
-                }
-                Map<String, Long> networkIds = new HashMap<>(size);
-                for (int i = 0; i < size; i++) {
-                    String key = in.readString();
-                    Long value = null;
-                    long readValue = in.readLong();
-                    if (readValue != NULL_VALUE) {
-                        value = Long.valueOf(readValue);
-                    }
-                    networkIds.put(key, value);
-                }
-                return networkIds;
-            }
-        };
-
-    /**
-     * Helper function for writing Home Network IDs map to a Parcel.
-     *
-     * @param dest The Parcel to write to
-     * @param networkIds The map of home network IDs
-     */
-    private static void writeHomeNetworkIds(Parcel dest, Map<String, Long> networkIds) {
-        if (networkIds == null) {
-            dest.writeInt(NULL_VALUE);
-            return;
-        }
-        dest.writeInt(networkIds.size());
-        for (Map.Entry<String, Long> entry : networkIds.entrySet()) {
-            dest.writeString(entry.getKey());
-            if (entry.getValue() == null) {
-                dest.writeLong(NULL_VALUE);
-            } else {
-                dest.writeLong(entry.getValue());
-            }
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/Policy.java b/wifi/java/android/net/wifi/hotspot2/pps/Policy.java
deleted file mode 100644
index b0a2cc3..0000000
--- a/wifi/java/android/net/wifi/hotspot2/pps/Policy.java
+++ /dev/null
@@ -1,576 +0,0 @@
-/**
- * Copyright (c) 2017, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.pps;
-
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.Log;
-
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * Class representing Policy subtree in PerProviderSubscription (PPS)
- * Management Object (MO) tree.
- *
- * The Policy specifies additional criteria for Passpoint network selections, such as preferred
- * roaming partner, minimum backhaul bandwidth, and etc. It also provides the meta data for
- * updating the policy.
- *
- * For more info, refer to Hotspot 2.0 PPS MO defined in section 9.1 of the Hotspot 2.0
- * Release 2 Technical Specification.
- *
- * @hide
- */
-public final class Policy implements Parcelable {
-    private static final String TAG = "Policy";
-
-    /**
-     * Maximum number of SSIDs in the exclusion list.
-     */
-    private static final int MAX_EXCLUSION_SSIDS = 128;
-
-    /**
-     * Maximum byte for SSID.
-     */
-    private static final int MAX_SSID_BYTES = 32;
-
-    /**
-     * Maximum bytes for port string in {@link #requiredProtoPortMap}.
-     */
-    private static final int MAX_PORT_STRING_BYTES = 64;
-
-    /**
-     * Integer value used for indicating null value in the Parcel.
-     */
-    private static final int NULL_VALUE = -1;
-
-    /**
-     * Minimum available downlink/uplink bandwidth (in kilobits per second) required when
-     * selecting a network from home providers.
-     *
-     * The bandwidth is calculated as the LinkSpeed * (1 – LinkLoad/255), where LinkSpeed
-     * and LinkLoad parameters are drawn from the WAN Metrics ANQP element at that hotspot.
-     *
-     * Using Long.MIN_VALUE to indicate unset value.
-     */
-    private long mMinHomeDownlinkBandwidth = Long.MIN_VALUE;
-    public void setMinHomeDownlinkBandwidth(long minHomeDownlinkBandwidth) {
-        mMinHomeDownlinkBandwidth = minHomeDownlinkBandwidth;
-    }
-    public long getMinHomeDownlinkBandwidth() {
-        return mMinHomeDownlinkBandwidth;
-    }
-    private long mMinHomeUplinkBandwidth = Long.MIN_VALUE;
-    public void setMinHomeUplinkBandwidth(long minHomeUplinkBandwidth) {
-        mMinHomeUplinkBandwidth = minHomeUplinkBandwidth;
-    }
-    public long getMinHomeUplinkBandwidth() {
-        return mMinHomeUplinkBandwidth;
-    }
-
-    /**
-     * Minimum available downlink/uplink bandwidth (in kilobits per second) required when
-     * selecting a network from roaming providers.
-     *
-     * The bandwidth is calculated as the LinkSpeed * (1 – LinkLoad/255), where LinkSpeed
-     * and LinkLoad parameters are drawn from the WAN Metrics ANQP element at that hotspot.
-     *
-     * Using Long.MIN_VALUE to indicate unset value.
-     */
-    private long mMinRoamingDownlinkBandwidth = Long.MIN_VALUE;
-    public void setMinRoamingDownlinkBandwidth(long minRoamingDownlinkBandwidth) {
-        mMinRoamingDownlinkBandwidth = minRoamingDownlinkBandwidth;
-    }
-    public long getMinRoamingDownlinkBandwidth() {
-        return mMinRoamingDownlinkBandwidth;
-    }
-    private long mMinRoamingUplinkBandwidth = Long.MIN_VALUE;
-    public void setMinRoamingUplinkBandwidth(long minRoamingUplinkBandwidth) {
-        mMinRoamingUplinkBandwidth = minRoamingUplinkBandwidth;
-    }
-    public long getMinRoamingUplinkBandwidth() {
-        return mMinRoamingUplinkBandwidth;
-    }
-
-    /**
-     * List of SSIDs that are not preferred by the Home SP.
-     */
-    private String[] mExcludedSsidList = null;
-    public void setExcludedSsidList(String[] excludedSsidList) {
-        mExcludedSsidList = excludedSsidList;
-    }
-    public String[] getExcludedSsidList() {
-        return mExcludedSsidList;
-    }
-
-    /**
-     * List of IP protocol and port number required by one or more operator supported application.
-     * The port string contained one or more port numbers delimited by ",".
-     */
-    private Map<Integer, String> mRequiredProtoPortMap = null;
-    public void setRequiredProtoPortMap(Map<Integer, String> requiredProtoPortMap) {
-        mRequiredProtoPortMap = requiredProtoPortMap;
-    }
-    public Map<Integer, String> getRequiredProtoPortMap() {
-        return mRequiredProtoPortMap;
-    }
-
-    /**
-     * This specifies the maximum acceptable BSS load policy.  This is used to prevent device
-     * from joining an AP whose channel is overly congested with traffic.
-     * Using Integer.MIN_VALUE to indicate unset value.
-     */
-    private int mMaximumBssLoadValue = Integer.MIN_VALUE;
-    public void setMaximumBssLoadValue(int maximumBssLoadValue) {
-        mMaximumBssLoadValue = maximumBssLoadValue;
-    }
-    public int getMaximumBssLoadValue() {
-        return mMaximumBssLoadValue;
-    }
-
-    /**
-     * Policy associated with a roaming provider.  This specifies a priority associated
-     * with a roaming provider for given list of countries.
-     *
-     * Contains field under PerProviderSubscription/Policy/PreferredRoamingPartnerList.
-     */
-    public static final class RoamingPartner implements Parcelable {
-        /**
-         * FQDN of the roaming partner.
-         */
-        private String mFqdn = null;
-        public void setFqdn(String fqdn) {
-            mFqdn = fqdn;
-        }
-        public String getFqdn() {
-            return mFqdn;
-        }
-
-        /**
-         * Flag indicating the exact match of FQDN is required for FQDN matching.
-         *
-         * When this flag is set to false, sub-domain matching is used.  For example, when
-         * {@link #fqdn} s set to "example.com", "host.example.com" would be a match.
-         */
-        private boolean mFqdnExactMatch = false;
-        public void setFqdnExactMatch(boolean fqdnExactMatch) {
-            mFqdnExactMatch = fqdnExactMatch;
-        }
-        public boolean getFqdnExactMatch() {
-            return mFqdnExactMatch;
-        }
-
-        /**
-         * Priority associated with this roaming partner policy.
-         * Using Integer.MIN_VALUE to indicate unset value.
-         */
-        private int mPriority = Integer.MIN_VALUE;
-        public void setPriority(int priority) {
-            mPriority = priority;
-        }
-        public int getPriority() {
-            return mPriority;
-        }
-
-        /**
-         * A string contained One or more, comma delimited (i.e., ",") ISO/IEC 3166-1 two
-         * character country strings or the country-independent value, "*".
-         */
-        private String mCountries = null;
-        public void setCountries(String countries) {
-            mCountries = countries;
-        }
-        public String getCountries() {
-            return mCountries;
-        }
-
-        public RoamingPartner() {}
-
-        public RoamingPartner(RoamingPartner source) {
-            if (source != null) {
-                mFqdn = source.mFqdn;
-                mFqdnExactMatch = source.mFqdnExactMatch;
-                mPriority = source.mPriority;
-                mCountries = source.mCountries;
-            }
-        }
-
-        @Override
-        public int describeContents() {
-            return 0;
-        }
-
-        @Override
-        public void writeToParcel(Parcel dest, int flags) {
-            dest.writeString(mFqdn);
-            dest.writeInt(mFqdnExactMatch ? 1 : 0);
-            dest.writeInt(mPriority);
-            dest.writeString(mCountries);
-        }
-
-        @Override
-        public boolean equals(Object thatObject) {
-            if (this == thatObject) {
-                return true;
-            }
-            if (!(thatObject instanceof RoamingPartner)) {
-                return false;
-            }
-
-            RoamingPartner that = (RoamingPartner) thatObject;
-            return TextUtils.equals(mFqdn, that.mFqdn)
-                    && mFqdnExactMatch == that.mFqdnExactMatch
-                    && mPriority == that.mPriority
-                    && TextUtils.equals(mCountries, that.mCountries);
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(mFqdn, mFqdnExactMatch, mPriority, mCountries);
-        }
-
-        @Override
-        public String toString() {
-            StringBuilder builder = new StringBuilder();
-            builder.append("FQDN: ").append(mFqdn).append("\n");
-            builder.append("ExactMatch: ").append("mFqdnExactMatch").append("\n");
-            builder.append("Priority: ").append(mPriority).append("\n");
-            builder.append("Countries: ").append(mCountries).append("\n");
-            return builder.toString();
-        }
-
-        /**
-         * Validate RoamingParnter data.
-         *
-         * @return true on success
-         * @hide
-         */
-        public boolean validate() {
-            if (TextUtils.isEmpty(mFqdn)) {
-                Log.d(TAG, "Missing FQDN");
-                return false;
-            }
-            if (TextUtils.isEmpty(mCountries)) {
-                Log.d(TAG, "Missing countries");
-                return false;
-            }
-            return true;
-        }
-
-        public static final @android.annotation.NonNull Creator<RoamingPartner> CREATOR =
-            new Creator<RoamingPartner>() {
-                @Override
-                public RoamingPartner createFromParcel(Parcel in) {
-                    RoamingPartner roamingPartner = new RoamingPartner();
-                    roamingPartner.setFqdn(in.readString());
-                    roamingPartner.setFqdnExactMatch(in.readInt() != 0);
-                    roamingPartner.setPriority(in.readInt());
-                    roamingPartner.setCountries(in.readString());
-                    return roamingPartner;
-                }
-
-                @Override
-                public RoamingPartner[] newArray(int size) {
-                    return new RoamingPartner[size];
-                }
-            };
-    }
-    private List<RoamingPartner> mPreferredRoamingPartnerList = null;
-    public void setPreferredRoamingPartnerList(List<RoamingPartner> partnerList) {
-        mPreferredRoamingPartnerList = partnerList;
-    }
-    public List<RoamingPartner> getPreferredRoamingPartnerList() {
-        return mPreferredRoamingPartnerList;
-    }
-
-    /**
-     * Meta data used for policy update.
-     */
-    private UpdateParameter mPolicyUpdate = null;
-    public void setPolicyUpdate(UpdateParameter policyUpdate) {
-        mPolicyUpdate = policyUpdate;
-    }
-    public UpdateParameter getPolicyUpdate() {
-        return mPolicyUpdate;
-    }
-
-    /**
-     * Constructor for creating Policy with default values.
-     */
-    public Policy() {}
-
-    /**
-     * Copy constructor.
-     *
-     * @param source The source to copy from
-     */
-    public Policy(Policy source) {
-        if (source == null) {
-            return;
-        }
-        mMinHomeDownlinkBandwidth = source.mMinHomeDownlinkBandwidth;
-        mMinHomeUplinkBandwidth = source.mMinHomeUplinkBandwidth;
-        mMinRoamingDownlinkBandwidth = source.mMinRoamingDownlinkBandwidth;
-        mMinRoamingUplinkBandwidth = source.mMinRoamingUplinkBandwidth;
-        mMaximumBssLoadValue = source.mMaximumBssLoadValue;
-        if (source.mExcludedSsidList != null) {
-            mExcludedSsidList = Arrays.copyOf(source.mExcludedSsidList,
-                    source.mExcludedSsidList.length);
-        }
-        if (source.mRequiredProtoPortMap != null) {
-            mRequiredProtoPortMap = Collections.unmodifiableMap(source.mRequiredProtoPortMap);
-        }
-        if (source.mPreferredRoamingPartnerList != null) {
-            mPreferredRoamingPartnerList = Collections.unmodifiableList(
-                    source.mPreferredRoamingPartnerList);
-        }
-        if (source.mPolicyUpdate != null) {
-            mPolicyUpdate = new UpdateParameter(source.mPolicyUpdate);
-        }
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeLong(mMinHomeDownlinkBandwidth);
-        dest.writeLong(mMinHomeUplinkBandwidth);
-        dest.writeLong(mMinRoamingDownlinkBandwidth);
-        dest.writeLong(mMinRoamingUplinkBandwidth);
-        dest.writeStringArray(mExcludedSsidList);
-        writeProtoPortMap(dest, mRequiredProtoPortMap);
-        dest.writeInt(mMaximumBssLoadValue);
-        writeRoamingPartnerList(dest, flags, mPreferredRoamingPartnerList);
-        dest.writeParcelable(mPolicyUpdate, flags);
-    }
-
-    @Override
-    public boolean equals(Object thatObject) {
-        if (this == thatObject) {
-            return true;
-        }
-        if (!(thatObject instanceof Policy)) {
-            return false;
-        }
-        Policy that = (Policy) thatObject;
-
-        return mMinHomeDownlinkBandwidth == that.mMinHomeDownlinkBandwidth
-                && mMinHomeUplinkBandwidth == that.mMinHomeUplinkBandwidth
-                && mMinRoamingDownlinkBandwidth == that.mMinRoamingDownlinkBandwidth
-                && mMinRoamingUplinkBandwidth == that.mMinRoamingUplinkBandwidth
-                && Arrays.equals(mExcludedSsidList, that.mExcludedSsidList)
-                && (mRequiredProtoPortMap == null ? that.mRequiredProtoPortMap == null
-                        : mRequiredProtoPortMap.equals(that.mRequiredProtoPortMap))
-                && mMaximumBssLoadValue == that.mMaximumBssLoadValue
-                && (mPreferredRoamingPartnerList == null
-                        ? that.mPreferredRoamingPartnerList == null
-                        : mPreferredRoamingPartnerList.equals(that.mPreferredRoamingPartnerList))
-                && (mPolicyUpdate == null ? that.mPolicyUpdate == null
-                        : mPolicyUpdate.equals(that.mPolicyUpdate));
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mMinHomeDownlinkBandwidth, mMinHomeUplinkBandwidth,
-                mMinRoamingDownlinkBandwidth, mMinRoamingUplinkBandwidth, mExcludedSsidList,
-                mRequiredProtoPortMap, mMaximumBssLoadValue, mPreferredRoamingPartnerList,
-                mPolicyUpdate);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("MinHomeDownlinkBandwidth: ").append(mMinHomeDownlinkBandwidth)
-                .append("\n");
-        builder.append("MinHomeUplinkBandwidth: ").append(mMinHomeUplinkBandwidth).append("\n");
-        builder.append("MinRoamingDownlinkBandwidth: ").append(mMinRoamingDownlinkBandwidth)
-                .append("\n");
-        builder.append("MinRoamingUplinkBandwidth: ").append(mMinRoamingUplinkBandwidth)
-                .append("\n");
-        builder.append("ExcludedSSIDList: ").append(mExcludedSsidList).append("\n");
-        builder.append("RequiredProtoPortMap: ").append(mRequiredProtoPortMap).append("\n");
-        builder.append("MaximumBSSLoadValue: ").append(mMaximumBssLoadValue).append("\n");
-        builder.append("PreferredRoamingPartnerList: ").append(mPreferredRoamingPartnerList)
-                .append("\n");
-        if (mPolicyUpdate != null) {
-            builder.append("PolicyUpdate Begin ---\n");
-            builder.append(mPolicyUpdate);
-            builder.append("PolicyUpdate End ---\n");
-        }
-        return builder.toString();
-    }
-
-    /**
-     * Validate Policy data.
-     *
-     * @return true on success
-     * @hide
-     */
-    public boolean validate() {
-        if (mPolicyUpdate == null) {
-            Log.d(TAG, "PolicyUpdate not specified");
-            return false;
-        }
-        if (!mPolicyUpdate.validate()) {
-            return false;
-        }
-
-        // Validate SSID exclusion list.
-        if (mExcludedSsidList != null) {
-            if (mExcludedSsidList.length > MAX_EXCLUSION_SSIDS) {
-                Log.d(TAG, "SSID exclusion list size exceeded the max: "
-                        + mExcludedSsidList.length);
-                return false;
-            }
-            for (String ssid : mExcludedSsidList) {
-                if (ssid.getBytes(StandardCharsets.UTF_8).length > MAX_SSID_BYTES) {
-                    Log.d(TAG, "Invalid SSID: " + ssid);
-                    return false;
-                }
-            }
-        }
-        // Validate required protocol to port map.
-        if (mRequiredProtoPortMap != null) {
-            for (Map.Entry<Integer, String> entry : mRequiredProtoPortMap.entrySet()) {
-                String portNumber = entry.getValue();
-                if (portNumber.getBytes(StandardCharsets.UTF_8).length > MAX_PORT_STRING_BYTES) {
-                    Log.d(TAG, "PortNumber string bytes exceeded the max: " + portNumber);
-                    return false;
-                }
-            }
-        }
-        // Validate preferred roaming partner list.
-        if (mPreferredRoamingPartnerList != null) {
-            for (RoamingPartner partner : mPreferredRoamingPartnerList) {
-                if (!partner.validate()) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    public static final @android.annotation.NonNull Creator<Policy> CREATOR =
-        new Creator<Policy>() {
-            @Override
-            public Policy createFromParcel(Parcel in) {
-                Policy policy = new Policy();
-                policy.setMinHomeDownlinkBandwidth(in.readLong());
-                policy.setMinHomeUplinkBandwidth(in.readLong());
-                policy.setMinRoamingDownlinkBandwidth(in.readLong());
-                policy.setMinRoamingUplinkBandwidth(in.readLong());
-                policy.setExcludedSsidList(in.createStringArray());
-                policy.setRequiredProtoPortMap(readProtoPortMap(in));
-                policy.setMaximumBssLoadValue(in.readInt());
-                policy.setPreferredRoamingPartnerList(readRoamingPartnerList(in));
-                policy.setPolicyUpdate(in.readParcelable(null));
-                return policy;
-            }
-
-            @Override
-            public Policy[] newArray(int size) {
-                return new Policy[size];
-            }
-
-            /**
-             * Helper function for reading IP Protocol to Port Number map from a Parcel.
-             *
-             * @param in The Parcel to read from
-             * @return Map of IP protocol to port number
-             */
-            private Map<Integer, String> readProtoPortMap(Parcel in) {
-                int size = in.readInt();
-                if (size == NULL_VALUE) {
-                    return null;
-                }
-                Map<Integer, String> protoPortMap = new HashMap<>(size);
-                for (int i = 0; i < size; i++) {
-                    int key = in.readInt();
-                    String value = in.readString();
-                    protoPortMap.put(key, value);
-                }
-                return protoPortMap;
-            }
-
-            /**
-             * Helper function for reading roaming partner list from a Parcel.
-             *
-             * @param in The Parcel to read from
-             * @return List of roaming partners
-             */
-            private List<RoamingPartner> readRoamingPartnerList(Parcel in) {
-                int size = in.readInt();
-                if (size == NULL_VALUE) {
-                    return null;
-                }
-                List<RoamingPartner> partnerList = new ArrayList<>();
-                for (int i = 0; i < size; i++) {
-                    partnerList.add(in.readParcelable(null));
-                }
-                return partnerList;
-            }
-
-        };
-
-    /**
-     * Helper function for writing IP Protocol to Port Number map to a Parcel.
-     *
-     * @param dest The Parcel to write to
-     * @param protoPortMap The map to write
-     */
-    private static void writeProtoPortMap(Parcel dest, Map<Integer, String> protoPortMap) {
-        if (protoPortMap == null) {
-            dest.writeInt(NULL_VALUE);
-            return;
-        }
-        dest.writeInt(protoPortMap.size());
-        for (Map.Entry<Integer, String> entry : protoPortMap.entrySet()) {
-            dest.writeInt(entry.getKey());
-            dest.writeString(entry.getValue());
-        }
-    }
-
-    /**
-     * Helper function for writing roaming partner list to a Parcel.
-     *
-     * @param dest The Parcel to write to
-     * @param flags The flag about how the object should be written
-     * @param partnerList The partner list to write
-     */
-    private static void writeRoamingPartnerList(Parcel dest, int flags,
-            List<RoamingPartner> partnerList) {
-        if (partnerList == null) {
-            dest.writeInt(NULL_VALUE);
-            return;
-        }
-        dest.writeInt(partnerList.size());
-        for (RoamingPartner partner : partnerList) {
-            dest.writeParcelable(partner, flags);
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java b/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
deleted file mode 100644
index 4a8aa36..0000000
--- a/wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/**
- * Copyright (c) 2017, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.pps;
-
-import android.net.wifi.ParcelUtil;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.Base64;
-import android.util.Log;
-
-import java.nio.charset.StandardCharsets;
-import java.security.cert.X509Certificate;
-import java.util.Arrays;
-import java.util.Objects;
-
-/**
- * Class representing configuration parameters for subscription or policy update in
- * PerProviderSubscription (PPS) Management Object (MO) tree.  This is used by both
- * PerProviderSubscription/Policy/PolicyUpdate and PerProviderSubscription/SubscriptionUpdate
- * subtree.
- *
- * For more info, refer to Hotspot 2.0 PPS MO defined in section 9.1 of the Hotspot 2.0
- * Release 2 Technical Specification.
- *
- * @hide
- */
-public final class UpdateParameter implements Parcelable {
-    private static final String TAG = "UpdateParameter";
-
-    /**
-     * Value indicating policy update is not applicable.  Thus, never check with policy server
-     * for updates.
-     */
-    public static final long UPDATE_CHECK_INTERVAL_NEVER = 0xFFFFFFFFL;
-
-    /**
-     * Valid string for UpdateMethod.
-     */
-    public static final String UPDATE_METHOD_OMADM = "OMA-DM-ClientInitiated";
-    public static final String UPDATE_METHOD_SSP = "SSP-ClientInitiated";
-
-    /**
-     * Valid string for Restriction.
-     */
-    public static final String UPDATE_RESTRICTION_HOMESP = "HomeSP";
-    public static final String UPDATE_RESTRICTION_ROAMING_PARTNER = "RoamingPartner";
-    public static final String UPDATE_RESTRICTION_UNRESTRICTED = "Unrestricted";
-
-    /**
-     * Maximum bytes for URI string.
-     */
-    private static final int MAX_URI_BYTES = 1023;
-
-    /**
-     * Maximum bytes for URI string.
-     */
-    private static final int MAX_URL_BYTES = 1023;
-
-    /**
-     * Maximum bytes for username.
-     */
-    private static final int MAX_USERNAME_BYTES = 63;
-
-    /**
-     * Maximum bytes for password.
-     */
-    private static final int MAX_PASSWORD_BYTES = 255;
-
-    /**
-     * Number of bytes for certificate SHA-256 fingerprint byte array.
-     */
-    private static final int CERTIFICATE_SHA256_BYTES = 32;
-
-    /**
-     * This specifies how often the mobile device shall check with policy server for updates.
-     *
-     * Using Long.MIN_VALUE to indicate unset value.
-     */
-    private long mUpdateIntervalInMinutes = Long.MIN_VALUE;
-    public void setUpdateIntervalInMinutes(long updateIntervalInMinutes) {
-        mUpdateIntervalInMinutes = updateIntervalInMinutes;
-    }
-    public long getUpdateIntervalInMinutes() {
-        return mUpdateIntervalInMinutes;
-    }
-
-    /**
-     * The method used to update the policy.  Permitted values are "OMA-DM-ClientInitiated"
-     * and "SPP-ClientInitiated".
-     */
-    private String mUpdateMethod = null;
-    public void setUpdateMethod(String updateMethod) {
-        mUpdateMethod = updateMethod;
-    }
-    public String getUpdateMethod() {
-        return mUpdateMethod;
-    }
-
-    /**
-     * This specifies the hotspots at which the subscription update is permitted.  Permitted
-     * values are "HomeSP", "RoamingPartner", or "Unrestricted";
-     */
-    private String mRestriction = null;
-    public void setRestriction(String restriction) {
-        mRestriction = restriction;
-    }
-    public String getRestriction() {
-        return mRestriction;
-    }
-
-    /**
-     * The URI of the update server.
-     */
-    private String mServerUri = null;
-    public void setServerUri(String serverUri) {
-        mServerUri = serverUri;
-    }
-    public String getServerUri() {
-        return mServerUri;
-    }
-
-    /**
-     * Username used to authenticate with the policy server.
-     */
-    private String mUsername = null;
-    public void setUsername(String username) {
-        mUsername = username;
-    }
-    public String getUsername() {
-        return mUsername;
-    }
-
-    /**
-     * Base64 encoded password used to authenticate with the policy server.
-     */
-    private String mBase64EncodedPassword = null;
-    public void setBase64EncodedPassword(String password) {
-        mBase64EncodedPassword = password;
-    }
-    public String getBase64EncodedPassword() {
-        return mBase64EncodedPassword;
-    }
-
-    /**
-     * HTTPS URL for retrieving certificate for trust root.  The trust root is used to validate
-     * policy server's identity.
-     */
-    private String mTrustRootCertUrl = null;
-    public void setTrustRootCertUrl(String trustRootCertUrl) {
-        mTrustRootCertUrl = trustRootCertUrl;
-    }
-    public String getTrustRootCertUrl() {
-        return mTrustRootCertUrl;
-    }
-
-    /**
-     * SHA-256 fingerprint of the certificate located at {@code mTrustRootCertUrl}
-     */
-    private byte[] mTrustRootCertSha256Fingerprint = null;
-    public void setTrustRootCertSha256Fingerprint(byte[] fingerprint) {
-        mTrustRootCertSha256Fingerprint = fingerprint;
-    }
-    public byte[] getTrustRootCertSha256Fingerprint() {
-        return mTrustRootCertSha256Fingerprint;
-    }
-
-    /**
-     * CA (Certificate Authority) X509 certificates.
-     */
-    private X509Certificate mCaCertificate;
-
-    /**
-     * Set the CA (Certification Authority) certificate associated with Policy/Subscription update.
-     *
-     * @param caCertificate The CA certificate to set
-     * @hide
-     */
-    public void setCaCertificate(X509Certificate caCertificate) {
-        mCaCertificate = caCertificate;
-    }
-
-    /**
-     * Get the CA (Certification Authority) certificate associated with Policy/Subscription update.
-     *
-     * @return CA certificate associated and {@code null} if certificate is not set.
-     * @hide
-     */
-    public X509Certificate getCaCertificate() {
-        return mCaCertificate;
-    }
-
-    /**
-     * Constructor for creating Policy with default values.
-     */
-    public UpdateParameter() {}
-
-    /**
-     * Copy constructor.
-     *
-     * @param source The source to copy from
-     */
-    public UpdateParameter(UpdateParameter source) {
-        if (source == null) {
-            return;
-        }
-        mUpdateIntervalInMinutes = source.mUpdateIntervalInMinutes;
-        mUpdateMethod = source.mUpdateMethod;
-        mRestriction = source.mRestriction;
-        mServerUri = source.mServerUri;
-        mUsername = source.mUsername;
-        mBase64EncodedPassword = source.mBase64EncodedPassword;
-        mTrustRootCertUrl = source.mTrustRootCertUrl;
-        if (source.mTrustRootCertSha256Fingerprint != null) {
-            mTrustRootCertSha256Fingerprint = Arrays.copyOf(source.mTrustRootCertSha256Fingerprint,
-                    source.mTrustRootCertSha256Fingerprint.length);
-        }
-        mCaCertificate = source.mCaCertificate;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeLong(mUpdateIntervalInMinutes);
-        dest.writeString(mUpdateMethod);
-        dest.writeString(mRestriction);
-        dest.writeString(mServerUri);
-        dest.writeString(mUsername);
-        dest.writeString(mBase64EncodedPassword);
-        dest.writeString(mTrustRootCertUrl);
-        dest.writeByteArray(mTrustRootCertSha256Fingerprint);
-        ParcelUtil.writeCertificate(dest, mCaCertificate);
-    }
-
-    @Override
-    public boolean equals(Object thatObject) {
-        if (this == thatObject) {
-            return true;
-        }
-        if (!(thatObject instanceof UpdateParameter)) {
-            return false;
-        }
-        UpdateParameter that = (UpdateParameter) thatObject;
-
-        return mUpdateIntervalInMinutes == that.mUpdateIntervalInMinutes
-                && TextUtils.equals(mUpdateMethod, that.mUpdateMethod)
-                && TextUtils.equals(mRestriction, that.mRestriction)
-                && TextUtils.equals(mServerUri, that.mServerUri)
-                && TextUtils.equals(mUsername, that.mUsername)
-                && TextUtils.equals(mBase64EncodedPassword, that.mBase64EncodedPassword)
-                && TextUtils.equals(mTrustRootCertUrl, that.mTrustRootCertUrl)
-                && Arrays.equals(mTrustRootCertSha256Fingerprint,
-                that.mTrustRootCertSha256Fingerprint)
-                && Credential.isX509CertificateEquals(mCaCertificate, that.mCaCertificate);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mUpdateIntervalInMinutes, mUpdateMethod, mRestriction, mServerUri,
-                mUsername, mBase64EncodedPassword, mTrustRootCertUrl,
-                Arrays.hashCode(mTrustRootCertSha256Fingerprint), mCaCertificate);
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("UpdateInterval: ").append(mUpdateIntervalInMinutes).append("\n");
-        builder.append("UpdateMethod: ").append(mUpdateMethod).append("\n");
-        builder.append("Restriction: ").append(mRestriction).append("\n");
-        builder.append("ServerURI: ").append(mServerUri).append("\n");
-        builder.append("Username: ").append(mUsername).append("\n");
-        builder.append("TrustRootCertURL: ").append(mTrustRootCertUrl).append("\n");
-        return builder.toString();
-    }
-
-    /**
-     * Validate UpdateParameter data.
-     *
-     * @return true on success
-     * @hide
-     */
-    public boolean validate() {
-        if (mUpdateIntervalInMinutes == Long.MIN_VALUE) {
-            Log.d(TAG, "Update interval not specified");
-            return false;
-        }
-        // Update not applicable.
-        if (mUpdateIntervalInMinutes == UPDATE_CHECK_INTERVAL_NEVER) {
-            return true;
-        }
-
-        if (!TextUtils.equals(mUpdateMethod, UPDATE_METHOD_OMADM)
-                && !TextUtils.equals(mUpdateMethod, UPDATE_METHOD_SSP)) {
-            Log.d(TAG, "Unknown update method: " + mUpdateMethod);
-            return false;
-        }
-
-        if (!TextUtils.equals(mRestriction, UPDATE_RESTRICTION_HOMESP)
-                && !TextUtils.equals(mRestriction, UPDATE_RESTRICTION_ROAMING_PARTNER)
-                && !TextUtils.equals(mRestriction, UPDATE_RESTRICTION_UNRESTRICTED)) {
-            Log.d(TAG, "Unknown restriction: " + mRestriction);
-            return false;
-        }
-
-        if (TextUtils.isEmpty(mServerUri)) {
-            Log.d(TAG, "Missing update server URI");
-            return false;
-        }
-        if (mServerUri.getBytes(StandardCharsets.UTF_8).length > MAX_URI_BYTES) {
-            Log.d(TAG, "URI bytes exceeded the max: "
-                    + mServerUri.getBytes(StandardCharsets.UTF_8).length);
-            return false;
-        }
-
-        if (TextUtils.isEmpty(mUsername)) {
-            Log.d(TAG, "Missing username");
-            return false;
-        }
-        if (mUsername.getBytes(StandardCharsets.UTF_8).length > MAX_USERNAME_BYTES) {
-            Log.d(TAG, "Username bytes exceeded the max: "
-                    + mUsername.getBytes(StandardCharsets.UTF_8).length);
-            return false;
-        }
-
-        if (TextUtils.isEmpty(mBase64EncodedPassword)) {
-            Log.d(TAG, "Missing username");
-            return false;
-        }
-        if (mBase64EncodedPassword.getBytes(StandardCharsets.UTF_8).length > MAX_PASSWORD_BYTES) {
-            Log.d(TAG, "Password bytes exceeded the max: "
-                    + mBase64EncodedPassword.getBytes(StandardCharsets.UTF_8).length);
-            return false;
-        }
-        try {
-            Base64.decode(mBase64EncodedPassword, Base64.DEFAULT);
-        } catch (IllegalArgumentException e) {
-            Log.d(TAG, "Invalid encoding for password: " + mBase64EncodedPassword);
-            return false;
-        }
-
-        if (TextUtils.isEmpty(mTrustRootCertUrl)) {
-            Log.d(TAG, "Missing trust root certificate URL");
-            return false;
-        }
-        if (mTrustRootCertUrl.getBytes(StandardCharsets.UTF_8).length > MAX_URL_BYTES) {
-            Log.d(TAG, "Trust root cert URL bytes exceeded the max: "
-                    + mTrustRootCertUrl.getBytes(StandardCharsets.UTF_8).length);
-            return false;
-        }
-
-        if (mTrustRootCertSha256Fingerprint == null) {
-            Log.d(TAG, "Missing trust root certificate SHA-256 fingerprint");
-            return false;
-        }
-        if (mTrustRootCertSha256Fingerprint.length != CERTIFICATE_SHA256_BYTES) {
-            Log.d(TAG, "Incorrect size of trust root certificate SHA-256 fingerprint: "
-                    + mTrustRootCertSha256Fingerprint.length);
-            return false;
-        }
-        return true;
-    }
-
-    public static final @android.annotation.NonNull Creator<UpdateParameter> CREATOR =
-        new Creator<UpdateParameter>() {
-            @Override
-            public UpdateParameter createFromParcel(Parcel in) {
-                UpdateParameter updateParam = new UpdateParameter();
-                updateParam.setUpdateIntervalInMinutes(in.readLong());
-                updateParam.setUpdateMethod(in.readString());
-                updateParam.setRestriction(in.readString());
-                updateParam.setServerUri(in.readString());
-                updateParam.setUsername(in.readString());
-                updateParam.setBase64EncodedPassword(in.readString());
-                updateParam.setTrustRootCertUrl(in.readString());
-                updateParam.setTrustRootCertSha256Fingerprint(in.createByteArray());
-                updateParam.setCaCertificate(ParcelUtil.readCertificate(in));
-                return updateParam;
-            }
-
-            @Override
-            public UpdateParameter[] newArray(int size) {
-                return new UpdateParameter[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl b/wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl
deleted file mode 100644
index bfdd45d..0000000
--- a/wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl
+++ /dev/null
@@ -1,34 +0,0 @@
-/**
- * Copyright (c) 2008, The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import android.os.Messenger;
-
-/**
- * Interface that WifiP2pService implements
- *
- * {@hide}
- */
-interface IWifiP2pManager
-{
-    Messenger getMessenger(in IBinder binder);
-    Messenger getP2pStateMachineMessenger();
-    oneway void close(in IBinder binder);
-    void setMiracastMode(int mode);
-    void checkConfigureWifiDisplayPermission();
-}
-
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java b/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
deleted file mode 100644
index d3a6bac..0000000
--- a/wifi/java/android/net/wifi/p2p/WifiP2pConfig.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import android.annotation.IntDef;
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.net.MacAddress;
-import android.net.wifi.WpsInfo;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.nio.charset.StandardCharsets;
-import java.util.regex.PatternSyntaxException;
-
-/**
- * A class representing a Wi-Fi P2p configuration for setting up a connection
- *
- * {@see WifiP2pManager}
- */
-public class WifiP2pConfig implements Parcelable {
-
-    /**
-     * The device MAC address uniquely identifies a Wi-Fi p2p device
-     */
-    public String deviceAddress = "";
-
-    /**
-     * Wi-Fi Protected Setup information
-     */
-    public WpsInfo wps;
-
-    /** Get the network name of this P2P configuration, or null if unset. */
-    @Nullable
-    public String getNetworkName() {
-        return networkName;
-    }
-
-    /** @hide */
-    public String networkName = "";
-
-    /** Get the passphrase of this P2P configuration, or null if unset. */
-    @Nullable
-    public String getPassphrase() {
-        return passphrase;
-    }
-
-    /** @hide */
-    public String passphrase = "";
-
-    /**
-     * Get the required band for the group owner.
-     * The result will be one of the following:
-     * {@link #GROUP_OWNER_BAND_AUTO},
-     * {@link #GROUP_OWNER_BAND_2GHZ},
-     * {@link #GROUP_OWNER_BAND_5GHZ}
-     */
-    @GroupOperatingBandType
-    public int getGroupOwnerBand() {
-        return groupOwnerBand;
-    }
-
-    /** @hide */
-    @GroupOperatingBandType
-    public int groupOwnerBand = GROUP_OWNER_BAND_AUTO;
-
-    /** @hide */
-    @IntDef(flag = false, prefix = { "GROUP_OWNER_BAND_" }, value = {
-        GROUP_OWNER_BAND_AUTO,
-        GROUP_OWNER_BAND_2GHZ,
-        GROUP_OWNER_BAND_5GHZ
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface GroupOperatingBandType {}
-
-    /**
-     * Allow the system to pick the operating frequency from all supported bands.
-     */
-    public static final int GROUP_OWNER_BAND_AUTO = 0;
-    /**
-     * Allow the system to pick the operating frequency from the 2.4 GHz band.
-     */
-    public static final int GROUP_OWNER_BAND_2GHZ = 1;
-    /**
-     * Allow the system to pick the operating frequency from the 5 GHz band.
-     */
-    public static final int GROUP_OWNER_BAND_5GHZ = 2;
-
-    /**
-     * The least inclination to be a group owner, to be filled in the field
-     * {@link #groupOwnerIntent}.
-     */
-    public static final int GROUP_OWNER_INTENT_MIN = 0;
-
-    /**
-     * The most inclination to be a group owner, to be filled in the field
-     * {@link #groupOwnerIntent}.
-     */
-    public static final int GROUP_OWNER_INTENT_MAX = 15;
-
-    /**
-     * The system can choose an appropriate owner intent value, to be filled in the field
-     * {@link #groupOwnerIntent}.
-     */
-    public static final int GROUP_OWNER_INTENT_AUTO = -1;
-
-    /**
-     * This is an integer value between {@link #GROUP_OWNER_INTENT_MIN} and
-     * {@link #GROUP_OWNER_INTENT_MAX} where
-     * {@link #GROUP_OWNER_INTENT_MIN} indicates the least inclination to be a group owner and
-     * {@link #GROUP_OWNER_INTENT_MAX} indicates the highest inclination to be a group owner.
-     *
-     * A value of {@link #GROUP_OWNER_INTENT_AUTO} indicates the system can choose an appropriate
-     * value.
-     *
-     * By default this field is set to {@link #GROUP_OWNER_INTENT_AUTO}.
-     */
-    @IntRange(from = 0, to = 15)
-    public int groupOwnerIntent = GROUP_OWNER_INTENT_AUTO;
-
-    /** @hide */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public int netId = WifiP2pGroup.NETWORK_ID_PERSISTENT;
-
-    /**
-     * Get the network ID of this P2P configuration.
-     * @return either a non-negative network ID, or one of
-     * {@link WifiP2pGroup#NETWORK_ID_PERSISTENT} or {@link WifiP2pGroup#NETWORK_ID_TEMPORARY}.
-     */
-    public int getNetworkId() {
-        return netId;
-    }
-
-    public WifiP2pConfig() {
-        //set defaults
-        wps = new WpsInfo();
-        wps.setup = WpsInfo.PBC;
-    }
-
-    /** @hide */
-    public void invalidate() {
-        deviceAddress = "";
-    }
-
-    /** P2P-GO-NEG-REQUEST 42:fc:89:a8:96:09 dev_passwd_id=4 {@hide}*/
-    @UnsupportedAppUsage
-    public WifiP2pConfig(String supplicantEvent) throws IllegalArgumentException {
-        String[] tokens = supplicantEvent.split(" ");
-
-        if (tokens.length < 2 || !tokens[0].equals("P2P-GO-NEG-REQUEST")) {
-            throw new IllegalArgumentException("Malformed supplicant event");
-        }
-
-        deviceAddress = tokens[1];
-        wps = new WpsInfo();
-
-        if (tokens.length > 2) {
-            String[] nameVal = tokens[2].split("=");
-            int devPasswdId;
-            try {
-                devPasswdId = Integer.parseInt(nameVal[1]);
-            } catch (NumberFormatException e) {
-                devPasswdId = 0;
-            }
-            //Based on definitions in wps/wps_defs.h
-            switch (devPasswdId) {
-                //DEV_PW_USER_SPECIFIED = 0x0001,
-                case 0x01:
-                    wps.setup = WpsInfo.DISPLAY;
-                    break;
-                //DEV_PW_PUSHBUTTON = 0x0004,
-                case 0x04:
-                    wps.setup = WpsInfo.PBC;
-                    break;
-                //DEV_PW_REGISTRAR_SPECIFIED = 0x0005
-                case 0x05:
-                    wps.setup = WpsInfo.KEYPAD;
-                    break;
-                default:
-                    wps.setup = WpsInfo.PBC;
-                    break;
-            }
-        }
-    }
-
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append("\n address: ").append(deviceAddress);
-        sbuf.append("\n wps: ").append(wps);
-        sbuf.append("\n groupOwnerIntent: ").append(groupOwnerIntent);
-        sbuf.append("\n persist: ").append(netId);
-        sbuf.append("\n networkName: ").append(networkName);
-        sbuf.append("\n passphrase: ").append(
-                TextUtils.isEmpty(passphrase) ? "<empty>" : "<non-empty>");
-        sbuf.append("\n groupOwnerBand: ").append(groupOwnerBand);
-        return sbuf.toString();
-    }
-
-    /** Implement the Parcelable interface */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** copy constructor */
-    public WifiP2pConfig(WifiP2pConfig source) {
-        if (source != null) {
-            deviceAddress = source.deviceAddress;
-            wps = new WpsInfo(source.wps);
-            groupOwnerIntent = source.groupOwnerIntent;
-            netId = source.netId;
-            networkName = source.networkName;
-            passphrase = source.passphrase;
-            groupOwnerBand = source.groupOwnerBand;
-        }
-    }
-
-    /** Implement the Parcelable interface */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(deviceAddress);
-        dest.writeParcelable(wps, flags);
-        dest.writeInt(groupOwnerIntent);
-        dest.writeInt(netId);
-        dest.writeString(networkName);
-        dest.writeString(passphrase);
-        dest.writeInt(groupOwnerBand);
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @android.annotation.NonNull Creator<WifiP2pConfig> CREATOR =
-        new Creator<WifiP2pConfig>() {
-            public WifiP2pConfig createFromParcel(Parcel in) {
-                WifiP2pConfig config = new WifiP2pConfig();
-                config.deviceAddress = in.readString();
-                config.wps = (WpsInfo) in.readParcelable(null);
-                config.groupOwnerIntent = in.readInt();
-                config.netId = in.readInt();
-                config.networkName = in.readString();
-                config.passphrase = in.readString();
-                config.groupOwnerBand = in.readInt();
-                return config;
-            }
-
-            public WifiP2pConfig[] newArray(int size) {
-                return new WifiP2pConfig[size];
-            }
-        };
-
-    /**
-     * Builder used to build {@link WifiP2pConfig} objects for
-     * creating or joining a group.
-     */
-    public static final class Builder {
-
-        private static final MacAddress MAC_ANY_ADDRESS =
-                MacAddress.fromString("02:00:00:00:00:00");
-        /**
-         * Maximum number of bytes allowed for a SSID.
-         */
-        private static final int MAX_SSID_BYTES = 32;
-
-        private MacAddress mDeviceAddress = MAC_ANY_ADDRESS;
-        private String mNetworkName = "";
-        private String mPassphrase = "";
-        private int mGroupOperatingBand = GROUP_OWNER_BAND_AUTO;
-        private int mGroupOperatingFrequency = GROUP_OWNER_BAND_AUTO;
-        private int mNetId = WifiP2pGroup.NETWORK_ID_TEMPORARY;
-
-        /**
-         * Specify the peer's MAC address. If not set, the device will
-         * try to find a peer whose SSID matches the network name as
-         * specified by {@link #setNetworkName(String)}. Specifying null will
-         * reset the peer's MAC address to "02:00:00:00:00:00".
-         * <p>
-         *     Optional. "02:00:00:00:00:00" by default.
-         *
-         * @param deviceAddress the peer's MAC address.
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public @NonNull Builder setDeviceAddress(@Nullable MacAddress deviceAddress) {
-            if (deviceAddress == null) {
-                mDeviceAddress = MAC_ANY_ADDRESS;
-            } else {
-                mDeviceAddress = deviceAddress;
-            }
-            return this;
-        }
-
-        /**
-         * Specify the network name, a.k.a. group name,
-         * for creating or joining a group.
-         * <p>
-         * A network name shall begin with "DIRECT-xy". x and y are selected
-         * from the following character set: upper case letters, lower case
-         * letters and numbers. Any byte values allowed for an SSID according to
-         * IEEE802.11-2012 [1] may be included after the string "DIRECT-xy"
-         * (including none).
-         * <p>
-         *     Must be called - an empty network name or an network name
-         *     not conforming to the P2P Group ID naming rule is not valid.
-         *
-         * @param networkName network name of a group.
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public @NonNull Builder setNetworkName(@NonNull String networkName) {
-            if (TextUtils.isEmpty(networkName)) {
-                throw new IllegalArgumentException(
-                        "network name must be non-empty.");
-            }
-            if (networkName.getBytes(StandardCharsets.UTF_8).length > MAX_SSID_BYTES) {
-                throw new IllegalArgumentException(
-                        "network name exceeds " + MAX_SSID_BYTES + " bytes.");
-            }
-            try {
-                if (!networkName.matches("^DIRECT-[a-zA-Z0-9]{2}.*")) {
-                    throw new IllegalArgumentException(
-                            "network name must starts with the prefix DIRECT-xy.");
-                }
-            } catch (PatternSyntaxException e) {
-                // can never happen (fixed pattern)
-            }
-            mNetworkName = networkName;
-            return this;
-        }
-
-        /**
-         * Specify the passphrase for creating or joining a group.
-         * <p>
-         * The passphrase must be an ASCII string whose length is between 8
-         * and 63.
-         * <p>
-         *     Must be called - an empty passphrase is not valid.
-         *
-         * @param passphrase the passphrase of a group.
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public @NonNull Builder setPassphrase(@NonNull String passphrase) {
-            if (TextUtils.isEmpty(passphrase)) {
-                throw new IllegalArgumentException(
-                        "passphrase must be non-empty.");
-            }
-            if (passphrase.length() < 8 || passphrase.length() > 63) {
-                throw new IllegalArgumentException(
-                        "The length of a passphrase must be between 8 and 63.");
-            }
-            mPassphrase = passphrase;
-            return this;
-        }
-
-        /**
-         * Specify the band to use for creating the group or joining the group. The band should
-         * be {@link #GROUP_OWNER_BAND_2GHZ}, {@link #GROUP_OWNER_BAND_5GHZ} or
-         * {@link #GROUP_OWNER_BAND_AUTO}.
-         * <p>
-         * When creating a group as Group Owner using {@link
-         * WifiP2pManager#createGroup(WifiP2pManager.Channel,
-         * WifiP2pConfig, WifiP2pManager.ActionListener)},
-         * specifying {@link #GROUP_OWNER_BAND_AUTO} allows the system to pick the operating
-         * frequency from all supported bands.
-         * Specifying {@link #GROUP_OWNER_BAND_2GHZ} or {@link #GROUP_OWNER_BAND_5GHZ}
-         * only allows the system to pick the operating frequency in the specified band.
-         * If the Group Owner cannot create a group in the specified band, the operation will fail.
-         * <p>
-         * When joining a group as Group Client using {@link
-         * WifiP2pManager#connect(WifiP2pManager.Channel, WifiP2pConfig,
-         * WifiP2pManager.ActionListener)},
-         * specifying {@link #GROUP_OWNER_BAND_AUTO} allows the system to scan all supported
-         * frequencies to find the desired group. Specifying {@link #GROUP_OWNER_BAND_2GHZ} or
-         * {@link #GROUP_OWNER_BAND_5GHZ} only allows the system to scan the specified band.
-         * <p>
-         *     {@link #setGroupOperatingBand(int)} and {@link #setGroupOperatingFrequency(int)} are
-         *     mutually exclusive. Setting operating band and frequency both is invalid.
-         * <p>
-         *     Optional. {@link #GROUP_OWNER_BAND_AUTO} by default.
-         *
-         * @param band the operating band of the group.
-         *             This should be one of {@link #GROUP_OWNER_BAND_AUTO},
-         *             {@link #GROUP_OWNER_BAND_2GHZ}, {@link #GROUP_OWNER_BAND_5GHZ}.
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public @NonNull Builder setGroupOperatingBand(@GroupOperatingBandType int band) {
-            switch (band) {
-                case GROUP_OWNER_BAND_AUTO:
-                case GROUP_OWNER_BAND_2GHZ:
-                case GROUP_OWNER_BAND_5GHZ:
-                    mGroupOperatingBand = band;
-                    break;
-                default:
-                    throw new IllegalArgumentException(
-                        "Invalid constant for the group operating band!");
-            }
-            return this;
-        }
-
-        /**
-         * Specify the frequency, in MHz, to use for creating the group or joining the group.
-         * <p>
-         * When creating a group as Group Owner using {@link WifiP2pManager#createGroup(
-         * WifiP2pManager.Channel, WifiP2pConfig, WifiP2pManager.ActionListener)},
-         * specifying a frequency only allows the system to pick the specified frequency.
-         * If the Group Owner cannot create a group at the specified frequency,
-         * the operation will fail.
-         * When not specifying a frequency, it allows the system to pick operating frequency
-         * from all supported bands.
-         * <p>
-         * When joining a group as Group Client using {@link WifiP2pManager#connect(
-         * WifiP2pManager.Channel, WifiP2pConfig, WifiP2pManager.ActionListener)},
-         * specifying a frequency only allows the system to scan the specified frequency.
-         * If the frequency is not supported or invalid, the operation will fail.
-         * When not specifying a frequency, it allows the system to scan all supported
-         * frequencies to find the desired group.
-         * <p>
-         *     {@link #setGroupOperatingBand(int)} and {@link #setGroupOperatingFrequency(int)} are
-         *     mutually exclusive. Setting operating band and frequency both is invalid.
-         * <p>
-         *     Optional. 0 by default.
-         *
-         * @param frequency the operating frequency of the group.
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public @NonNull Builder setGroupOperatingFrequency(int frequency) {
-            if (frequency < 0) {
-                throw new IllegalArgumentException(
-                    "Invalid group operating frequency!");
-            }
-            mGroupOperatingFrequency = frequency;
-            return this;
-        }
-
-        /**
-         * Specify that the group configuration be persisted (i.e. saved).
-         * By default the group configuration will not be saved.
-         * <p>
-         *     Optional. false by default.
-         *
-         * @param persistent is this group persistent group.
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public @NonNull Builder enablePersistentMode(boolean persistent) {
-            if (persistent) {
-                mNetId = WifiP2pGroup.NETWORK_ID_PERSISTENT;
-            } else {
-                mNetId = WifiP2pGroup.NETWORK_ID_TEMPORARY;
-            }
-            return this;
-        }
-
-        /**
-         * Build {@link WifiP2pConfig} given the current requests made on the builder.
-         * @return {@link WifiP2pConfig} constructed based on builder method calls.
-         */
-        public @NonNull WifiP2pConfig build() {
-            if (TextUtils.isEmpty(mNetworkName)) {
-                throw new IllegalStateException(
-                        "network name must be non-empty.");
-            }
-            if (TextUtils.isEmpty(mPassphrase)) {
-                throw new IllegalStateException(
-                        "passphrase must be non-empty.");
-            }
-
-            if (mGroupOperatingFrequency > 0 && mGroupOperatingBand > 0) {
-                throw new IllegalStateException(
-                        "Preferred frequency and band are mutually exclusive.");
-            }
-
-            WifiP2pConfig config = new WifiP2pConfig();
-            config.deviceAddress = mDeviceAddress.toString();
-            config.networkName = mNetworkName;
-            config.passphrase = mPassphrase;
-            config.groupOwnerBand = GROUP_OWNER_BAND_AUTO;
-            if (mGroupOperatingFrequency > 0) {
-                config.groupOwnerBand = mGroupOperatingFrequency;
-            } else if (mGroupOperatingBand > 0) {
-                config.groupOwnerBand = mGroupOperatingBand;
-            }
-            config.netId = mNetId;
-            return config;
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
deleted file mode 100644
index 567637a..0000000
--- a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java
+++ /dev/null
@@ -1,435 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.Log;
-
-import java.util.Objects;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A class representing a Wi-Fi p2p device
- *
- * Note that the operations are not thread safe
- * {@see WifiP2pManager}
- */
-public class WifiP2pDevice implements Parcelable {
-
-    private static final String TAG = "WifiP2pDevice";
-
-    /**
-     * The device name is a user friendly string to identify a Wi-Fi p2p device
-     */
-    public String deviceName = "";
-
-    /**
-     * The device MAC address uniquely identifies a Wi-Fi p2p device
-     */
-    public String deviceAddress = "";
-
-    /**
-     * Primary device type identifies the type of device. For example, an application
-     * could filter the devices discovered to only display printers if the purpose is to
-     * enable a printing action from the user. See the Wi-Fi Direct technical specification
-     * for the full list of standard device types supported.
-     */
-    public String primaryDeviceType;
-
-    /**
-     * Secondary device type is an optional attribute that can be provided by a device in
-     * addition to the primary device type.
-     */
-    public String secondaryDeviceType;
-
-
-    // These definitions match the ones in wpa_supplicant
-    /* WPS config methods supported */
-    private static final int WPS_CONFIG_DISPLAY         = 0x0008;
-    private static final int WPS_CONFIG_PUSHBUTTON      = 0x0080;
-    private static final int WPS_CONFIG_KEYPAD          = 0x0100;
-
-    /* Device Capability bitmap */
-    private static final int DEVICE_CAPAB_SERVICE_DISCOVERY         = 1;
-    @SuppressWarnings("unused")
-    private static final int DEVICE_CAPAB_CLIENT_DISCOVERABILITY    = 1<<1;
-    @SuppressWarnings("unused")
-    private static final int DEVICE_CAPAB_CONCURRENT_OPER           = 1<<2;
-    @SuppressWarnings("unused")
-    private static final int DEVICE_CAPAB_INFRA_MANAGED             = 1<<3;
-    @SuppressWarnings("unused")
-    private static final int DEVICE_CAPAB_DEVICE_LIMIT              = 1<<4;
-    private static final int DEVICE_CAPAB_INVITATION_PROCEDURE      = 1<<5;
-
-    /* Group Capability bitmap */
-    private static final int GROUP_CAPAB_GROUP_OWNER                = 1;
-    @SuppressWarnings("unused")
-    private static final int GROUP_CAPAB_PERSISTENT_GROUP           = 1<<1;
-    private static final int GROUP_CAPAB_GROUP_LIMIT                = 1<<2;
-    @SuppressWarnings("unused")
-    private static final int GROUP_CAPAB_INTRA_BSS_DIST             = 1<<3;
-    @SuppressWarnings("unused")
-    private static final int GROUP_CAPAB_CROSS_CONN                 = 1<<4;
-    @SuppressWarnings("unused")
-    private static final int GROUP_CAPAB_PERSISTENT_RECONN          = 1<<5;
-    @SuppressWarnings("unused")
-    private static final int GROUP_CAPAB_GROUP_FORMATION            = 1<<6;
-
-    /**
-     * WPS config methods supported
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public int wpsConfigMethodsSupported;
-
-    /**
-     * Device capability
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public int deviceCapability;
-
-    /**
-     * Group capability
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public int groupCapability;
-
-    public static final int CONNECTED   = 0;
-    public static final int INVITED     = 1;
-    public static final int FAILED      = 2;
-    public static final int AVAILABLE   = 3;
-    public static final int UNAVAILABLE = 4;
-
-    /** Device connection status */
-    public int status = UNAVAILABLE;
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public WifiP2pWfdInfo wfdInfo;
-
-    /** Detailed device string pattern with WFD info
-     * Example:
-     *  P2P-DEVICE-FOUND 00:18:6b:de:a3:6e p2p_dev_addr=00:18:6b:de:a3:6e
-     *  pri_dev_type=1-0050F204-1 name='DWD-300-DEA36E' config_methods=0x188
-     *  dev_capab=0x21 group_capab=0x9
-     */
-    private static final Pattern detailedDevicePattern = Pattern.compile(
-        "((?:[0-9a-f]{2}:){5}[0-9a-f]{2}) " +
-        "(\\d+ )?" +
-        "p2p_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2}) " +
-        "pri_dev_type=(\\d+-[0-9a-fA-F]+-\\d+) " +
-        "name='(.*)' " +
-        "config_methods=(0x[0-9a-fA-F]+) " +
-        "dev_capab=(0x[0-9a-fA-F]+) " +
-        "group_capab=(0x[0-9a-fA-F]+)" +
-        "( wfd_dev_info=0x([0-9a-fA-F]{12}))?"
-    );
-
-    /** 2 token device address pattern
-     * Example:
-     *  P2P-DEVICE-LOST p2p_dev_addr=fa:7b:7a:42:02:13
-     *  AP-STA-DISCONNECTED 42:fc:89:a8:96:09
-     */
-    private static final Pattern twoTokenPattern = Pattern.compile(
-        "(p2p_dev_addr=)?((?:[0-9a-f]{2}:){5}[0-9a-f]{2})"
-    );
-
-    /** 3 token device address pattern
-     * Example:
-     *  AP-STA-CONNECTED 42:fc:89:a8:96:09 p2p_dev_addr=fa:7b:7a:42:02:13
-     *  AP-STA-DISCONNECTED 42:fc:89:a8:96:09 p2p_dev_addr=fa:7b:7a:42:02:13
-     */
-    private static final Pattern threeTokenPattern = Pattern.compile(
-        "(?:[0-9a-f]{2}:){5}[0-9a-f]{2} p2p_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2})"
-    );
-
-
-    public WifiP2pDevice() {
-    }
-
-    /**
-     * @param string formats supported include
-     *  P2P-DEVICE-FOUND fa:7b:7a:42:02:13 p2p_dev_addr=fa:7b:7a:42:02:13
-     *  pri_dev_type=1-0050F204-1 name='p2p-TEST1' config_methods=0x188 dev_capab=0x27
-     *  group_capab=0x0 wfd_dev_info=000006015d022a0032
-     *
-     *  P2P-DEVICE-LOST p2p_dev_addr=fa:7b:7a:42:02:13
-     *
-     *  AP-STA-CONNECTED 42:fc:89:a8:96:09 [p2p_dev_addr=02:90:4c:a0:92:54]
-     *
-     *  AP-STA-DISCONNECTED 42:fc:89:a8:96:09 [p2p_dev_addr=02:90:4c:a0:92:54]
-     *
-     *  fa:7b:7a:42:02:13
-     *
-     *  Note: The events formats can be looked up in the wpa_supplicant code
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public WifiP2pDevice(String string) throws IllegalArgumentException {
-        String[] tokens = string.split("[ \n]");
-        Matcher match;
-
-        if (tokens.length < 1) {
-            throw new IllegalArgumentException("Malformed supplicant event");
-        }
-
-        switch (tokens.length) {
-            case 1:
-                /* Just a device address */
-                deviceAddress = string;
-                return;
-            case 2:
-                match = twoTokenPattern.matcher(string);
-                if (!match.find()) {
-                    throw new IllegalArgumentException("Malformed supplicant event");
-                }
-                deviceAddress = match.group(2);
-                return;
-            case 3:
-                match = threeTokenPattern.matcher(string);
-                if (!match.find()) {
-                    throw new IllegalArgumentException("Malformed supplicant event");
-                }
-                deviceAddress = match.group(1);
-                return;
-            default:
-                match = detailedDevicePattern.matcher(string);
-                if (!match.find()) {
-                    throw new IllegalArgumentException("Malformed supplicant event");
-                }
-
-                deviceAddress = match.group(3);
-                primaryDeviceType = match.group(4);
-                deviceName = match.group(5);
-                wpsConfigMethodsSupported = parseHex(match.group(6));
-                deviceCapability = parseHex(match.group(7));
-                groupCapability = parseHex(match.group(8));
-                if (match.group(9) != null) {
-                    String str = match.group(10);
-                    wfdInfo = new WifiP2pWfdInfo(parseHex(str.substring(0,4)),
-                            parseHex(str.substring(4,8)),
-                            parseHex(str.substring(8,12)));
-                }
-                break;
-        }
-
-        if (tokens[0].startsWith("P2P-DEVICE-FOUND")) {
-            status = AVAILABLE;
-        }
-    }
-
-    /** The Wifi Display information for this device, or null if unavailable. */
-    @Nullable
-    public WifiP2pWfdInfo getWfdInfo() {
-        return wfdInfo;
-    }
-
-    /** Returns true if WPS push button configuration is supported */
-    public boolean wpsPbcSupported() {
-        return (wpsConfigMethodsSupported & WPS_CONFIG_PUSHBUTTON) != 0;
-    }
-
-    /** Returns true if WPS keypad configuration is supported */
-    public boolean wpsKeypadSupported() {
-        return (wpsConfigMethodsSupported & WPS_CONFIG_KEYPAD) != 0;
-    }
-
-    /** Returns true if WPS display configuration is supported */
-    public boolean wpsDisplaySupported() {
-        return (wpsConfigMethodsSupported & WPS_CONFIG_DISPLAY) != 0;
-    }
-
-    /** Returns true if the device is capable of service discovery */
-    public boolean isServiceDiscoveryCapable() {
-        return (deviceCapability & DEVICE_CAPAB_SERVICE_DISCOVERY) != 0;
-    }
-
-    /** Returns true if the device is capable of invitation {@hide}*/
-    public boolean isInvitationCapable() {
-        return (deviceCapability & DEVICE_CAPAB_INVITATION_PROCEDURE) != 0;
-    }
-
-    /** Returns true if the device reaches the limit. {@hide}*/
-    public boolean isDeviceLimit() {
-        return (deviceCapability & DEVICE_CAPAB_DEVICE_LIMIT) != 0;
-    }
-
-    /** Returns true if the device is a group owner */
-    public boolean isGroupOwner() {
-        return (groupCapability & GROUP_CAPAB_GROUP_OWNER) != 0;
-    }
-
-    /** Returns true if the group reaches the limit. {@hide}*/
-    public boolean isGroupLimit() {
-        return (groupCapability & GROUP_CAPAB_GROUP_LIMIT) != 0;
-    }
-
-    /**
-     * Update this device's details using another {@link WifiP2pDevice} instance.
-     * This will throw an exception if the device address does not match.
-     *
-     * @param device another instance of {@link WifiP2pDevice} used to update this instance.
-     * @throws IllegalArgumentException if the device is null or the device address does not match
-     */
-    public void update(@NonNull WifiP2pDevice device) {
-        updateSupplicantDetails(device);
-        status = device.status;
-    }
-
-    /** Updates details obtained from supplicant @hide */
-    public void updateSupplicantDetails(WifiP2pDevice device) {
-        if (device == null) {
-            throw new IllegalArgumentException("device is null");
-        }
-        if (device.deviceAddress == null) {
-            throw new IllegalArgumentException("deviceAddress is null");
-        }
-        if (!deviceAddress.equals(device.deviceAddress)) {
-            throw new IllegalArgumentException("deviceAddress does not match");
-        }
-        deviceName = device.deviceName;
-        primaryDeviceType = device.primaryDeviceType;
-        secondaryDeviceType = device.secondaryDeviceType;
-        wpsConfigMethodsSupported = device.wpsConfigMethodsSupported;
-        deviceCapability = device.deviceCapability;
-        groupCapability = device.groupCapability;
-        wfdInfo = device.wfdInfo;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) return true;
-        if (!(obj instanceof WifiP2pDevice)) return false;
-
-        WifiP2pDevice other = (WifiP2pDevice) obj;
-        if (other == null || other.deviceAddress == null) {
-            return (deviceAddress == null);
-        }
-        return other.deviceAddress.equals(deviceAddress);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(deviceAddress);
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append("Device: ").append(deviceName);
-        sbuf.append("\n deviceAddress: ").append(deviceAddress);
-        sbuf.append("\n primary type: ").append(primaryDeviceType);
-        sbuf.append("\n secondary type: ").append(secondaryDeviceType);
-        sbuf.append("\n wps: ").append(wpsConfigMethodsSupported);
-        sbuf.append("\n grpcapab: ").append(groupCapability);
-        sbuf.append("\n devcapab: ").append(deviceCapability);
-        sbuf.append("\n status: ").append(status);
-        sbuf.append("\n wfdInfo: ").append(wfdInfo);
-        return sbuf.toString();
-    }
-
-    /** Implement the Parcelable interface */
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    /** copy constructor */
-    public WifiP2pDevice(WifiP2pDevice source) {
-        if (source != null) {
-            deviceName = source.deviceName;
-            deviceAddress = source.deviceAddress;
-            primaryDeviceType = source.primaryDeviceType;
-            secondaryDeviceType = source.secondaryDeviceType;
-            wpsConfigMethodsSupported = source.wpsConfigMethodsSupported;
-            deviceCapability = source.deviceCapability;
-            groupCapability = source.groupCapability;
-            status = source.status;
-            if (source.wfdInfo != null) {
-                wfdInfo = new WifiP2pWfdInfo(source.wfdInfo);
-            }
-        }
-    }
-
-    /** Implement the Parcelable interface */
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(deviceName);
-        dest.writeString(deviceAddress);
-        dest.writeString(primaryDeviceType);
-        dest.writeString(secondaryDeviceType);
-        dest.writeInt(wpsConfigMethodsSupported);
-        dest.writeInt(deviceCapability);
-        dest.writeInt(groupCapability);
-        dest.writeInt(status);
-        if (wfdInfo != null) {
-            dest.writeInt(1);
-            wfdInfo.writeToParcel(dest, flags);
-        } else {
-            dest.writeInt(0);
-        }
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @android.annotation.NonNull Creator<WifiP2pDevice> CREATOR =
-        new Creator<WifiP2pDevice>() {
-            @Override
-            public WifiP2pDevice createFromParcel(Parcel in) {
-                WifiP2pDevice device = new WifiP2pDevice();
-                device.deviceName = in.readString();
-                device.deviceAddress = in.readString();
-                device.primaryDeviceType = in.readString();
-                device.secondaryDeviceType = in.readString();
-                device.wpsConfigMethodsSupported = in.readInt();
-                device.deviceCapability = in.readInt();
-                device.groupCapability = in.readInt();
-                device.status = in.readInt();
-                if (in.readInt() == 1) {
-                    device.wfdInfo = WifiP2pWfdInfo.CREATOR.createFromParcel(in);
-                }
-                return device;
-            }
-
-            @Override
-            public WifiP2pDevice[] newArray(int size) {
-                return new WifiP2pDevice[size];
-            }
-        };
-
-    //supported formats: 0x1abc, 0X1abc, 1abc
-    private int parseHex(String hexString) {
-        int num = 0;
-        if (hexString.startsWith("0x") || hexString.startsWith("0X")) {
-            hexString = hexString.substring(2);
-        }
-
-        try {
-            num = Integer.parseInt(hexString, 16);
-        } catch(NumberFormatException e) {
-            Log.e(TAG, "Failed to parse hex string " + hexString);
-        }
-        return num;
-    }
-}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java b/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
deleted file mode 100644
index e7866e6..0000000
--- a/wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import android.compat.annotation.UnsupportedAppUsage;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-
-/**
- * A class representing a Wi-Fi P2p device list.
- *
- * Note that the operations are not thread safe.
- * {@see WifiP2pManager}
- */
-public class WifiP2pDeviceList implements Parcelable {
-
-    private final HashMap<String, WifiP2pDevice> mDevices = new HashMap<String, WifiP2pDevice>();
-
-    public WifiP2pDeviceList() {
-    }
-
-    /** copy constructor */
-    public WifiP2pDeviceList(WifiP2pDeviceList source) {
-        if (source != null) {
-            for (WifiP2pDevice d : source.getDeviceList()) {
-                mDevices.put(d.deviceAddress, new WifiP2pDevice(d));
-            }
-        }
-    }
-
-    /** @hide */
-    public WifiP2pDeviceList(ArrayList<WifiP2pDevice> devices) {
-        for (WifiP2pDevice device : devices) {
-            if (device.deviceAddress != null) {
-                mDevices.put(device.deviceAddress, new WifiP2pDevice(device));
-            }
-        }
-    }
-
-    private void validateDevice(WifiP2pDevice device) {
-        if (device == null) throw new IllegalArgumentException("Null device");
-        if (TextUtils.isEmpty(device.deviceAddress)) {
-            throw new IllegalArgumentException("Empty deviceAddress");
-        }
-    }
-
-    private void validateDeviceAddress(String deviceAddress) {
-        if (TextUtils.isEmpty(deviceAddress)) {
-            throw new IllegalArgumentException("Empty deviceAddress");
-        }
-    }
-
-    /** Clear the list @hide */
-    public boolean clear() {
-        if (mDevices.isEmpty()) return false;
-        mDevices.clear();
-        return true;
-    }
-
-    /**
-     * Add/update a device to the list. If the device is not found, a new device entry
-     * is created. If the device is already found, the device details are updated
-     * @param device to be updated
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public void update(WifiP2pDevice device) {
-        updateSupplicantDetails(device);
-        mDevices.get(device.deviceAddress).status = device.status;
-    }
-
-    /** Only updates details fetched from the supplicant @hide */
-    public void updateSupplicantDetails(WifiP2pDevice device) {
-        validateDevice(device);
-        WifiP2pDevice d = mDevices.get(device.deviceAddress);
-        if (d != null) {
-            d.deviceName = device.deviceName;
-            d.primaryDeviceType = device.primaryDeviceType;
-            d.secondaryDeviceType = device.secondaryDeviceType;
-            d.wpsConfigMethodsSupported = device.wpsConfigMethodsSupported;
-            d.deviceCapability = device.deviceCapability;
-            d.groupCapability = device.groupCapability;
-            d.wfdInfo = device.wfdInfo;
-            return;
-        }
-        //Not found, add a new one
-        mDevices.put(device.deviceAddress, device);
-    }
-
-    /** @hide */
-    public void updateGroupCapability(String deviceAddress, int groupCapab) {
-        validateDeviceAddress(deviceAddress);
-        WifiP2pDevice d = mDevices.get(deviceAddress);
-        if (d != null) {
-            d.groupCapability = groupCapab;
-        }
-    }
-
-    /** @hide */
-    public void updateStatus(String deviceAddress, int status) {
-        validateDeviceAddress(deviceAddress);
-        WifiP2pDevice d = mDevices.get(deviceAddress);
-        if (d != null) {
-            d.status = status;
-        }
-    }
-
-    /**
-     * Fetch a device from the list
-     * @param deviceAddress is the address of the device
-     * @return WifiP2pDevice device found, or null if none found
-     */
-    public WifiP2pDevice get(String deviceAddress) {
-        validateDeviceAddress(deviceAddress);
-        return mDevices.get(deviceAddress);
-    }
-
-    /** @hide */
-    public boolean remove(WifiP2pDevice device) {
-        validateDevice(device);
-        return mDevices.remove(device.deviceAddress) != null;
-    }
-
-    /**
-     * Remove a device from the list
-     * @param deviceAddress is the address of the device
-     * @return WifiP2pDevice device removed, or null if none removed
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public WifiP2pDevice remove(String deviceAddress) {
-        validateDeviceAddress(deviceAddress);
-        return mDevices.remove(deviceAddress);
-    }
-
-    /** Returns true if any device the list was removed @hide */
-    public boolean remove(WifiP2pDeviceList list) {
-        boolean ret = false;
-        for (WifiP2pDevice d : list.mDevices.values()) {
-            if (remove(d)) ret = true;
-        }
-        return ret;
-    }
-
-    /** Get the list of devices */
-    public Collection<WifiP2pDevice> getDeviceList() {
-        return Collections.unmodifiableCollection(mDevices.values());
-    }
-
-    /** @hide */
-    public boolean isGroupOwner(String deviceAddress) {
-        validateDeviceAddress(deviceAddress);
-        WifiP2pDevice device = mDevices.get(deviceAddress);
-        if (device == null) {
-            throw new IllegalArgumentException("Device not found " + deviceAddress);
-        }
-        return device.isGroupOwner();
-    }
-
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        for (WifiP2pDevice device : mDevices.values()) {
-            sbuf.append("\n").append(device);
-        }
-        return sbuf.toString();
-    }
-
-    /** Implement the Parcelable interface */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mDevices.size());
-        for(WifiP2pDevice device : mDevices.values()) {
-            dest.writeParcelable(device, flags);
-        }
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @android.annotation.NonNull Creator<WifiP2pDeviceList> CREATOR =
-        new Creator<WifiP2pDeviceList>() {
-            public WifiP2pDeviceList createFromParcel(Parcel in) {
-                WifiP2pDeviceList deviceList = new WifiP2pDeviceList();
-
-                int deviceCount = in.readInt();
-                for (int i = 0; i < deviceCount; i++) {
-                    deviceList.update((WifiP2pDevice)in.readParcelable(null));
-                }
-                return deviceList;
-            }
-
-            public WifiP2pDeviceList[] newArray(int size) {
-                return new WifiP2pDeviceList[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java b/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java
deleted file mode 100644
index e497b22..0000000
--- a/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java
+++ /dev/null
@@ -1,371 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import android.annotation.Nullable;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * A class representing a Wi-Fi P2p group. A p2p group consists of a single group
- * owner and one or more clients. In the case of a group with only two devices, one
- * will be the group owner and the other will be a group client.
- *
- * {@see WifiP2pManager}
- */
-public class WifiP2pGroup implements Parcelable {
-
-    /**
-     * The temporary network id.
-     * @see #getNetworkId()
-     */
-    public static final int NETWORK_ID_TEMPORARY = -1;
-
-    /**
-     * The temporary network id.
-     *
-     * @hide
-     */
-    @UnsupportedAppUsage
-    public static final int TEMPORARY_NET_ID = NETWORK_ID_TEMPORARY;
-
-    /**
-     * The persistent network id.
-     * If a matching persistent profile is found, use it.
-     * Otherwise, create a new persistent profile.
-     * @see #getNetworkId()
-     */
-    public static final int NETWORK_ID_PERSISTENT = -2;
-
-    /** The network name */
-    private String mNetworkName;
-
-    /** Group owner */
-    private WifiP2pDevice mOwner;
-
-    /** Device is group owner */
-    private boolean mIsGroupOwner;
-
-    /** Group clients */
-    private List<WifiP2pDevice> mClients = new ArrayList<WifiP2pDevice>();
-
-    /** The passphrase used for WPA2-PSK */
-    private String mPassphrase;
-
-    private String mInterface;
-
-    /** The network ID in wpa_supplicant */
-    private int mNetId;
-
-    /** The frequency (in MHz) used by this group */
-    private int mFrequency;
-
-    /** P2P group started string pattern */
-    private static final Pattern groupStartedPattern = Pattern.compile(
-        "ssid=\"(.+)\" " +
-        "freq=(\\d+) " +
-        "(?:psk=)?([0-9a-fA-F]{64})?" +
-        "(?:passphrase=)?(?:\"(.{0,63})\")? " +
-        "go_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2})" +
-        " ?(\\[PERSISTENT\\])?"
-    );
-
-    public WifiP2pGroup() {
-    }
-
-    /**
-     * @param supplicantEvent formats supported include
-     *
-     *  P2P-GROUP-STARTED p2p-wlan0-0 [client|GO] ssid="DIRECT-W8" freq=2437
-     *  [psk=2182b2e50e53f260d04f3c7b25ef33c965a3291b9b36b455a82d77fd82ca15bc|
-     *  passphrase="fKG4jMe3"] go_dev_addr=fa:7b:7a:42:02:13 [PERSISTENT]
-     *
-     *  P2P-GROUP-REMOVED p2p-wlan0-0 [client|GO] reason=REQUESTED
-     *
-     *  P2P-INVITATION-RECEIVED sa=fa:7b:7a:42:02:13 go_dev_addr=f8:7b:7a:42:02:13
-     *  bssid=fa:7b:7a:42:82:13 unknown-network
-     *
-     *  P2P-INVITATION-RECEIVED sa=b8:f9:34:2a:c7:9d persistent=0
-     *
-     *  Note: The events formats can be looked up in the wpa_supplicant code
-     *  @hide
-     */
-    @UnsupportedAppUsage
-    public WifiP2pGroup(String supplicantEvent) throws IllegalArgumentException {
-
-        String[] tokens = supplicantEvent.split(" ");
-
-        if (tokens.length < 3) {
-            throw new IllegalArgumentException("Malformed supplicant event");
-        }
-
-        if (tokens[0].startsWith("P2P-GROUP")) {
-            mInterface = tokens[1];
-            mIsGroupOwner = tokens[2].equals("GO");
-
-            Matcher match = groupStartedPattern.matcher(supplicantEvent);
-            if (!match.find()) {
-                return;
-            }
-
-            mNetworkName = match.group(1);
-            // It throws NumberFormatException if the string cannot be parsed as an integer.
-            mFrequency = Integer.parseInt(match.group(2));
-            // psk is unused right now
-            //String psk = match.group(3);
-            mPassphrase = match.group(4);
-            mOwner = new WifiP2pDevice(match.group(5));
-            if (match.group(6) != null) {
-                mNetId = NETWORK_ID_PERSISTENT;
-            } else {
-                mNetId = NETWORK_ID_TEMPORARY;
-            }
-        } else if (tokens[0].equals("P2P-INVITATION-RECEIVED")) {
-            String sa = null;
-            mNetId = NETWORK_ID_PERSISTENT;
-            for (String token : tokens) {
-                String[] nameValue = token.split("=");
-                if (nameValue.length != 2) continue;
-
-                if (nameValue[0].equals("sa")) {
-                    sa = nameValue[1];
-
-                    // set source address into the client list.
-                    WifiP2pDevice dev = new WifiP2pDevice();
-                    dev.deviceAddress = nameValue[1];
-                    mClients.add(dev);
-                    continue;
-                }
-
-                if (nameValue[0].equals("go_dev_addr")) {
-                    mOwner = new WifiP2pDevice(nameValue[1]);
-                    continue;
-                }
-
-                if (nameValue[0].equals("persistent")) {
-                    mNetId = Integer.parseInt(nameValue[1]);
-                    continue;
-                }
-            }
-        } else {
-            throw new IllegalArgumentException("Malformed supplicant event");
-        }
-    }
-
-    /** @hide */
-    public void setNetworkName(String networkName) {
-        mNetworkName = networkName;
-    }
-
-    /**
-     * Get the network name (SSID) of the group. Legacy Wi-Fi clients will discover
-     * the p2p group using the network name.
-     */
-    public String getNetworkName() {
-        return mNetworkName;
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setIsGroupOwner(boolean isGo) {
-        mIsGroupOwner = isGo;
-    }
-
-    /** Check whether this device is the group owner of the created p2p group */
-    public boolean isGroupOwner() {
-        return mIsGroupOwner;
-    }
-
-    /** @hide */
-    public void setOwner(WifiP2pDevice device) {
-        mOwner = device;
-    }
-
-    /** Get the details of the group owner as a {@link WifiP2pDevice} object */
-    public WifiP2pDevice getOwner() {
-        return mOwner;
-    }
-
-    /** @hide */
-    public void addClient(String address) {
-        addClient(new WifiP2pDevice(address));
-    }
-
-    /** @hide */
-    public void addClient(WifiP2pDevice device) {
-        for (WifiP2pDevice client : mClients) {
-            if (client.equals(device)) return;
-        }
-        mClients.add(device);
-    }
-
-    /** @hide */
-    public boolean removeClient(String address) {
-        return mClients.remove(new WifiP2pDevice(address));
-    }
-
-    /** @hide */
-    public boolean removeClient(WifiP2pDevice device) {
-        return mClients.remove(device);
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public boolean isClientListEmpty() {
-        return mClients.size() == 0;
-    }
-
-    /**
-     * Returns {@code true} if the device is part of the group, {@code false} otherwise.
-     *
-     * @hide
-     */
-    public boolean contains(@Nullable WifiP2pDevice device) {
-        return mOwner.equals(device) || mClients.contains(device);
-    }
-
-    /** Get the list of clients currently part of the p2p group */
-    public Collection<WifiP2pDevice> getClientList() {
-        return Collections.unmodifiableCollection(mClients);
-    }
-
-    /** @hide */
-    public void setPassphrase(String passphrase) {
-        mPassphrase = passphrase;
-    }
-
-    /**
-     * Get the passphrase of the group. This function will return a valid passphrase only
-     * at the group owner. Legacy Wi-Fi clients will need this passphrase alongside
-     * network name obtained from {@link #getNetworkName()} to join the group
-     */
-    public String getPassphrase() {
-        return mPassphrase;
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setInterface(String intf) {
-        mInterface = intf;
-    }
-
-    /** Get the interface name on which the group is created */
-    public String getInterface() {
-        return mInterface;
-    }
-
-    /** The network ID of the P2P group in wpa_supplicant. */
-    public int getNetworkId() {
-        return mNetId;
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public void setNetworkId(int netId) {
-        this.mNetId = netId;
-    }
-
-    /** Get the operating frequency (in MHz) of the p2p group */
-    public int getFrequency() {
-        return mFrequency;
-    }
-
-    /** @hide */
-    public void setFrequency(int freq) {
-        this.mFrequency = freq;
-    }
-
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append("network: ").append(mNetworkName);
-        sbuf.append("\n isGO: ").append(mIsGroupOwner);
-        sbuf.append("\n GO: ").append(mOwner);
-        for (WifiP2pDevice client : mClients) {
-            sbuf.append("\n Client: ").append(client);
-        }
-        sbuf.append("\n interface: ").append(mInterface);
-        sbuf.append("\n networkId: ").append(mNetId);
-        sbuf.append("\n frequency: ").append(mFrequency);
-        return sbuf.toString();
-    }
-
-    /** Implement the Parcelable interface */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** copy constructor */
-    public WifiP2pGroup(WifiP2pGroup source) {
-        if (source != null) {
-            mNetworkName = source.getNetworkName();
-            mOwner = new WifiP2pDevice(source.getOwner());
-            mIsGroupOwner = source.mIsGroupOwner;
-            for (WifiP2pDevice d : source.getClientList()) mClients.add(d);
-            mPassphrase = source.getPassphrase();
-            mInterface = source.getInterface();
-            mNetId = source.getNetworkId();
-            mFrequency = source.getFrequency();
-        }
-    }
-
-    /** Implement the Parcelable interface */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeString(mNetworkName);
-        dest.writeParcelable(mOwner, flags);
-        dest.writeByte(mIsGroupOwner ? (byte) 1: (byte) 0);
-        dest.writeInt(mClients.size());
-        for (WifiP2pDevice client : mClients) {
-            dest.writeParcelable(client, flags);
-        }
-        dest.writeString(mPassphrase);
-        dest.writeString(mInterface);
-        dest.writeInt(mNetId);
-        dest.writeInt(mFrequency);
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @android.annotation.NonNull Creator<WifiP2pGroup> CREATOR =
-        new Creator<WifiP2pGroup>() {
-            public WifiP2pGroup createFromParcel(Parcel in) {
-                WifiP2pGroup group = new WifiP2pGroup();
-                group.setNetworkName(in.readString());
-                group.setOwner((WifiP2pDevice)in.readParcelable(null));
-                group.setIsGroupOwner(in.readByte() == (byte)1);
-                int clientCount = in.readInt();
-                for (int i=0; i<clientCount; i++) {
-                    group.addClient((WifiP2pDevice) in.readParcelable(null));
-                }
-                group.setPassphrase(in.readString());
-                group.setInterface(in.readString());
-                group.setNetworkId(in.readInt());
-                group.setFrequency(in.readInt());
-                return group;
-            }
-
-            public WifiP2pGroup[] newArray(int size) {
-                return new WifiP2pGroup[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pGroupList.java b/wifi/java/android/net/wifi/p2p/WifiP2pGroupList.java
deleted file mode 100644
index 8a86311..0000000
--- a/wifi/java/android/net/wifi/p2p/WifiP2pGroupList.java
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package android.net.wifi.p2p;
-
-import android.annotation.NonNull;
-import android.annotation.SystemApi;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.LruCache;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-
-/**
- * A class representing a Wi-Fi P2p group list
- *
- * {@see WifiP2pManager}
- * @hide
- */
-@SystemApi
-public final class WifiP2pGroupList implements Parcelable {
-
-    private static final int CREDENTIAL_MAX_NUM             =   32;
-
-    @UnsupportedAppUsage
-    private final LruCache<Integer, WifiP2pGroup> mGroups;
-    private final GroupDeleteListener mListener;
-
-    private boolean isClearCalled = false;
-
-    /** @hide */
-    public interface GroupDeleteListener {
-        public void onDeleteGroup(int netId);
-    }
-
-    /** @hide */
-    public WifiP2pGroupList() {
-        this(null, null);
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public WifiP2pGroupList(WifiP2pGroupList source, GroupDeleteListener listener) {
-        mListener = listener;
-        mGroups = new LruCache<Integer, WifiP2pGroup>(CREDENTIAL_MAX_NUM) {
-            @Override
-            protected void entryRemoved(boolean evicted, Integer netId,
-                    WifiP2pGroup oldValue, WifiP2pGroup newValue) {
-                if (mListener != null && !isClearCalled) {
-                    mListener.onDeleteGroup(oldValue.getNetworkId());
-                }
-            }
-        };
-
-        if (source != null) {
-            for (Map.Entry<Integer, WifiP2pGroup> item : source.mGroups.snapshot().entrySet()) {
-                mGroups.put(item.getKey(), item.getValue());
-            }
-        }
-    }
-
-    /**
-     * Get the list of P2P groups.
-     */
-    @NonNull
-    public List<WifiP2pGroup> getGroupList() {
-        return new ArrayList<>(mGroups.snapshot().values());
-    }
-
-    /**
-     * Add the specified group to this group list.
-     *
-     * @param group
-     * @hide
-     */
-    public void add(WifiP2pGroup group) {
-        mGroups.put(group.getNetworkId(), group);
-    }
-
-    /**
-     * Remove the group with the specified network id from this group list.
-     *
-     * @param netId
-     * @hide
-     */
-    public void remove(int netId) {
-        mGroups.remove(netId);
-    }
-
-    /**
-     * Remove the group with the specified device address from this group list.
-     *
-     * @param deviceAddress
-     */
-    void remove(String deviceAddress) {
-        remove(getNetworkId(deviceAddress));
-    }
-
-    /**
-     * Clear the group.
-     * @hide
-     */
-    public boolean clear() {
-        if (mGroups.size() == 0) return false;
-        isClearCalled = true;
-        mGroups.evictAll();
-        isClearCalled = false;
-        return true;
-    }
-
-    /**
-     * Return the network id of the group owner profile with the specified p2p device
-     * address.
-     * If more than one persistent group of the same address is present in the list,
-     * return the first one.
-     *
-     * @param deviceAddress p2p device address.
-     * @return the network id. if not found, return -1.
-     * @hide
-     */
-    public int getNetworkId(String deviceAddress) {
-        if (deviceAddress == null) return -1;
-
-        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
-        for (WifiP2pGroup grp: groups) {
-            if (deviceAddress.equalsIgnoreCase(grp.getOwner().deviceAddress)) {
-                // update cache ordered.
-                mGroups.get(grp.getNetworkId());
-                return grp.getNetworkId();
-            }
-        }
-        return -1;
-    }
-
-    /**
-     * Return the network id of the group with the specified p2p device address
-     * and the ssid.
-     *
-     * @param deviceAddress p2p device address.
-     * @param ssid ssid.
-     * @return the network id. if not found, return -1.
-     * @hide
-     */
-    public int getNetworkId(String deviceAddress, String ssid) {
-        if (deviceAddress == null || ssid == null) {
-            return -1;
-        }
-
-        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
-        for (WifiP2pGroup grp: groups) {
-            if (deviceAddress.equalsIgnoreCase(grp.getOwner().deviceAddress) &&
-                    ssid.equals(grp.getNetworkName())) {
-                // update cache ordered.
-                mGroups.get(grp.getNetworkId());
-                return grp.getNetworkId();
-            }
-        }
-
-        return -1;
-    }
-
-    /**
-     * Return the group owner address of the group with the specified network id
-     *
-     * @param netId network id.
-     * @return the address. if not found, return null.
-     * @hide
-     */
-    public String getOwnerAddr(int netId) {
-        WifiP2pGroup grp = mGroups.get(netId);
-        if (grp != null) {
-            return grp.getOwner().deviceAddress;
-        }
-        return null;
-    }
-
-    /**
-     * Return true if this group list contains the specified network id.
-     * This function does NOT update LRU information.
-     * It means the internal queue is NOT reordered.
-     *
-     * @param netId network id.
-     * @return true if the specified network id is present in this group list.
-     * @hide
-     */
-    public boolean contains(int netId) {
-        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
-        for (WifiP2pGroup grp: groups) {
-            if (netId == grp.getNetworkId()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-
-        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
-        for (WifiP2pGroup grp: groups) {
-            sbuf.append(grp).append("\n");
-        }
-        return sbuf.toString();
-    }
-
-    /** Implement the Parcelable interface */
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface */
-    @Override
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
-        final Collection<WifiP2pGroup> groups = mGroups.snapshot().values();
-        dest.writeInt(groups.size());
-        for(WifiP2pGroup group : groups) {
-            dest.writeParcelable(group, flags);
-        }
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @NonNull Creator<WifiP2pGroupList> CREATOR =
-        new Creator<WifiP2pGroupList>() {
-            public WifiP2pGroupList createFromParcel(Parcel in) {
-                WifiP2pGroupList grpList = new WifiP2pGroupList();
-
-                int deviceCount = in.readInt();
-                for (int i = 0; i < deviceCount; i++) {
-                    grpList.add((WifiP2pGroup)in.readParcelable(null));
-                }
-                return grpList;
-            }
-
-            public WifiP2pGroupList[] newArray(int size) {
-                return new WifiP2pGroupList[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pInfo.java b/wifi/java/android/net/wifi/p2p/WifiP2pInfo.java
deleted file mode 100644
index 33bc37e..0000000
--- a/wifi/java/android/net/wifi/p2p/WifiP2pInfo.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import android.os.Parcelable;
-import android.os.Parcel;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-
-/**
- * A class representing connection information about a Wi-Fi p2p group
- *
- * {@see WifiP2pManager}
- */
-public class WifiP2pInfo implements Parcelable {
-
-    /** Indicates if a p2p group has been successfully formed */
-    public boolean groupFormed;
-
-    /** Indicates if the current device is the group owner */
-    public boolean isGroupOwner;
-
-    /** Group owner address */
-    public InetAddress groupOwnerAddress;
-
-    public WifiP2pInfo() {
-    }
-
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append("groupFormed: ").append(groupFormed)
-            .append(" isGroupOwner: ").append(isGroupOwner)
-            .append(" groupOwnerAddress: ").append(groupOwnerAddress);
-        return sbuf.toString();
-    }
-
-    /** Implement the Parcelable interface */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** copy constructor */
-    public WifiP2pInfo(WifiP2pInfo source) {
-        if (source != null) {
-            groupFormed = source.groupFormed;
-            isGroupOwner = source.isGroupOwner;
-            groupOwnerAddress = source.groupOwnerAddress;
-       }
-    }
-
-    /** Implement the Parcelable interface */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeByte(groupFormed ? (byte)1 : (byte)0);
-        dest.writeByte(isGroupOwner ? (byte)1 : (byte)0);
-
-        if (groupOwnerAddress != null) {
-            dest.writeByte((byte)1);
-            dest.writeByteArray(groupOwnerAddress.getAddress());
-        } else {
-            dest.writeByte((byte)0);
-        }
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @android.annotation.NonNull Creator<WifiP2pInfo> CREATOR =
-        new Creator<WifiP2pInfo>() {
-            public WifiP2pInfo createFromParcel(Parcel in) {
-                WifiP2pInfo info = new WifiP2pInfo();
-                info.groupFormed = (in.readByte() == 1);
-                info.isGroupOwner = (in.readByte() == 1);
-                if (in.readByte() == 1) {
-                    try {
-                        info.groupOwnerAddress = InetAddress.getByAddress(in.createByteArray());
-                    } catch (UnknownHostException e) {}
-                }
-                return info;
-            }
-
-            public WifiP2pInfo[] newArray(int size) {
-                return new WifiP2pInfo[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java b/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
deleted file mode 100644
index 5a27087..0000000
--- a/wifi/java/android/net/wifi/p2p/WifiP2pManager.java
+++ /dev/null
@@ -1,2034 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.RequiresPermission;
-import android.annotation.SdkConstant;
-import android.annotation.SdkConstant.SdkConstantType;
-import android.annotation.SystemApi;
-import android.annotation.SystemService;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.content.Context;
-import android.net.NetworkInfo;
-import android.net.wifi.WpsInfo;
-import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo;
-import android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceResponse;
-import android.net.wifi.p2p.nsd.WifiP2pServiceInfo;
-import android.net.wifi.p2p.nsd.WifiP2pServiceRequest;
-import android.net.wifi.p2p.nsd.WifiP2pServiceResponse;
-import android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo;
-import android.net.wifi.p2p.nsd.WifiP2pUpnpServiceResponse;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.RemoteException;
-import android.text.TextUtils;
-import android.util.CloseGuard;
-import android.util.Log;
-
-import com.android.internal.util.AsyncChannel;
-import com.android.internal.util.Protocol;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.ref.Reference;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * This class provides the API for managing Wi-Fi peer-to-peer connectivity. This lets an
- * application discover available peers, setup connection to peers and query for the list of peers.
- * When a p2p connection is formed over wifi, the device continues to maintain the uplink
- * connection over mobile or any other available network for internet connectivity on the device.
- *
- * <p> The API is asynchronous and responses to requests from an application are on listener
- * callbacks provided by the application. The application needs to do an initialization with
- * {@link #initialize} before doing any p2p operation.
- *
- * <p> Most application calls need a {@link ActionListener} instance for receiving callbacks
- * {@link ActionListener#onSuccess} or {@link ActionListener#onFailure}. Action callbacks
- * indicate whether the initiation of the action was a success or a failure.
- * Upon failure, the reason of failure can be one of {@link #ERROR}, {@link #P2P_UNSUPPORTED}
- * or {@link #BUSY}.
- *
- * <p> An application can initiate discovery of peers with {@link #discoverPeers}. An initiated
- * discovery request from an application stays active until the device starts connecting to a peer
- * ,forms a p2p group or there is an explicit {@link #stopPeerDiscovery}.
- * Applications can listen to {@link #WIFI_P2P_DISCOVERY_CHANGED_ACTION} to know if a peer-to-peer
- * discovery is running or stopped. Additionally, {@link #WIFI_P2P_PEERS_CHANGED_ACTION} indicates
- * if the peer list has changed.
- *
- * <p> When an application needs to fetch the current list of peers, it can request the list
- * of peers with {@link #requestPeers}. When the peer list is available
- * {@link PeerListListener#onPeersAvailable} is called with the device list.
- *
- * <p> An application can initiate a connection request to a peer through {@link #connect}. See
- * {@link WifiP2pConfig} for details on setting up the configuration. For communication with legacy
- * Wi-Fi devices that do not support p2p, an app can create a group using {@link #createGroup}
- * which creates an access point whose details can be fetched with {@link #requestGroupInfo}.
- *
- * <p> After a successful group formation through {@link #createGroup} or through {@link #connect},
- * use {@link #requestConnectionInfo} to fetch the connection details. The connection info
- * {@link WifiP2pInfo} contains the address of the group owner
- * {@link WifiP2pInfo#groupOwnerAddress} and a flag {@link WifiP2pInfo#isGroupOwner} to indicate
- * if the current device is a p2p group owner. A p2p client can thus communicate with
- * the p2p group owner through a socket connection. If the current device is the p2p group owner,
- * {@link WifiP2pInfo#groupOwnerAddress} is anonymized unless the caller holds the
- * {@code android.Manifest.permission#LOCAL_MAC_ADDRESS} permission.
- *
- * <p> With peer discovery using {@link  #discoverPeers}, an application discovers the neighboring
- * peers, but has no good way to figure out which peer to establish a connection with. For example,
- * if a game application is interested in finding all the neighboring peers that are also running
- * the same game, it has no way to find out until after the connection is setup. Pre-association
- * service discovery is meant to address this issue of filtering the peers based on the running
- * services.
- *
- * <p>With pre-association service discovery, an application can advertise a service for a
- * application on a peer device prior to a connection setup between the devices.
- * Currently, DNS based service discovery (Bonjour) and Upnp are the higher layer protocols
- * supported. Get Bonjour resources at dns-sd.org and Upnp resources at upnp.org
- * As an example, a video application can discover a Upnp capable media renderer
- * prior to setting up a Wi-fi p2p connection with the device.
- *
- * <p> An application can advertise a Upnp or a Bonjour service with a call to
- * {@link #addLocalService}. After a local service is added,
- * the framework automatically responds to a peer application discovering the service prior
- * to establishing a p2p connection. A call to {@link #removeLocalService} removes a local
- * service and {@link #clearLocalServices} can be used to clear all local services.
- *
- * <p> An application that is looking for peer devices that support certain services
- * can do so with a call to  {@link #discoverServices}. Prior to initiating the discovery,
- * application can add service discovery request with a call to {@link #addServiceRequest},
- * remove a service discovery request with a call to {@link #removeServiceRequest} or clear
- * all requests with a call to {@link #clearServiceRequests}. When no service requests remain,
- * a previously running service discovery will stop.
- *
- * The application is notified of a result of service discovery request through listener callbacks
- * set through {@link #setDnsSdResponseListeners} for Bonjour or
- * {@link #setUpnpServiceResponseListener} for Upnp.
- *
- * <p class="note"><strong>Note:</strong>
- * Registering an application handler with {@link #initialize} requires the permissions
- * {@link android.Manifest.permission#ACCESS_WIFI_STATE} and
- * {@link android.Manifest.permission#CHANGE_WIFI_STATE} to perform any further peer-to-peer
- * operations.
- *
- * {@see WifiP2pConfig}
- * {@see WifiP2pInfo}
- * {@see WifiP2pGroup}
- * {@see WifiP2pDevice}
- * {@see WifiP2pDeviceList}
- * {@see android.net.wifi.WpsInfo}
- */
-@SystemService(Context.WIFI_P2P_SERVICE)
-public class WifiP2pManager {
-    private static final String TAG = "WifiP2pManager";
-    /**
-     * Broadcast intent action to indicate whether Wi-Fi p2p is enabled or disabled. An
-     * extra {@link #EXTRA_WIFI_STATE} provides the state information as int.
-     *
-     * @see #EXTRA_WIFI_STATE
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String WIFI_P2P_STATE_CHANGED_ACTION =
-        "android.net.wifi.p2p.STATE_CHANGED";
-
-    /**
-     * The lookup key for an int that indicates whether Wi-Fi p2p is enabled or disabled.
-     * Retrieve it with {@link android.content.Intent#getIntExtra(String,int)}.
-     *
-     * @see #WIFI_P2P_STATE_DISABLED
-     * @see #WIFI_P2P_STATE_ENABLED
-     */
-    public static final String EXTRA_WIFI_STATE = "wifi_p2p_state";
-
-    /** @hide */
-    @IntDef({
-            WIFI_P2P_STATE_DISABLED,
-            WIFI_P2P_STATE_ENABLED})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface WifiP2pState {
-    }
-
-    /**
-     * Wi-Fi p2p is disabled.
-     *
-     * @see #WIFI_P2P_STATE_CHANGED_ACTION
-     */
-    public static final int WIFI_P2P_STATE_DISABLED = 1;
-
-    /**
-     * Wi-Fi p2p is enabled.
-     *
-     * @see #WIFI_P2P_STATE_CHANGED_ACTION
-     */
-    public static final int WIFI_P2P_STATE_ENABLED = 2;
-
-    /**
-     * Broadcast intent action indicating that the state of Wi-Fi p2p connectivity
-     * has changed. One extra {@link #EXTRA_WIFI_P2P_INFO} provides the p2p connection info in
-     * the form of a {@link WifiP2pInfo} object. Another extra {@link #EXTRA_NETWORK_INFO} provides
-     * the network info in the form of a {@link android.net.NetworkInfo}. A third extra provides
-     * the details of the group and may contain a {@code null}.
-     *
-     * All of these permissions are required to receive this broadcast:
-     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
-     * {@link android.Manifest.permission#ACCESS_WIFI_STATE}
-     *
-     * @see #EXTRA_WIFI_P2P_INFO
-     * @see #EXTRA_NETWORK_INFO
-     * @see #EXTRA_WIFI_P2P_GROUP
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String WIFI_P2P_CONNECTION_CHANGED_ACTION =
-        "android.net.wifi.p2p.CONNECTION_STATE_CHANGE";
-
-    /**
-     * The lookup key for a {@link android.net.wifi.p2p.WifiP2pInfo} object
-     * Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
-     */
-    public static final String EXTRA_WIFI_P2P_INFO = "wifiP2pInfo";
-
-    /**
-     * The lookup key for a {@link android.net.NetworkInfo} object associated with the
-     * p2p network. Retrieve with
-     * {@link android.content.Intent#getParcelableExtra(String)}.
-     */
-    public static final String EXTRA_NETWORK_INFO = "networkInfo";
-
-    /**
-     * The lookup key for a {@link android.net.wifi.p2p.WifiP2pGroup} object
-     * associated with the p2p network. Retrieve with
-     * {@link android.content.Intent#getParcelableExtra(String)}.
-     */
-    public static final String EXTRA_WIFI_P2P_GROUP = "p2pGroupInfo";
-
-    /**
-     * Broadcast intent action indicating that the available peer list has changed. This
-     * can be sent as a result of peers being found, lost or updated.
-     *
-     * All of these permissions are required to receive this broadcast:
-     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
-     * {@link android.Manifest.permission#ACCESS_WIFI_STATE}
-     *
-     * <p> An extra {@link #EXTRA_P2P_DEVICE_LIST} provides the full list of
-     * current peers. The full list of peers can also be obtained any time with
-     * {@link #requestPeers}.
-     *
-     * @see #EXTRA_P2P_DEVICE_LIST
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String WIFI_P2P_PEERS_CHANGED_ACTION =
-        "android.net.wifi.p2p.PEERS_CHANGED";
-
-     /**
-      * The lookup key for a {@link android.net.wifi.p2p.WifiP2pDeviceList} object representing
-      * the new peer list when {@link #WIFI_P2P_PEERS_CHANGED_ACTION} broadcast is sent.
-      *
-      * <p>Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
-      */
-    public static final String EXTRA_P2P_DEVICE_LIST = "wifiP2pDeviceList";
-
-    /**
-     * Broadcast intent action indicating that peer discovery has either started or stopped.
-     * One extra {@link #EXTRA_DISCOVERY_STATE} indicates whether discovery has started
-     * or stopped.
-     *
-     * <p>Note that discovery will be stopped during a connection setup. If the application tries
-     * to re-initiate discovery during this time, it can fail.
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String WIFI_P2P_DISCOVERY_CHANGED_ACTION =
-        "android.net.wifi.p2p.DISCOVERY_STATE_CHANGE";
-
-    /**
-     * The lookup key for an int that indicates whether p2p discovery has started or stopped.
-     * Retrieve it with {@link android.content.Intent#getIntExtra(String,int)}.
-     *
-     * @see #WIFI_P2P_DISCOVERY_STARTED
-     * @see #WIFI_P2P_DISCOVERY_STOPPED
-     */
-    public static final String EXTRA_DISCOVERY_STATE = "discoveryState";
-
-    /** @hide */
-    @IntDef({
-            WIFI_P2P_DISCOVERY_STOPPED,
-            WIFI_P2P_DISCOVERY_STARTED})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface WifiP2pDiscoveryState {
-    }
-
-    /**
-     * p2p discovery has stopped
-     *
-     * @see #WIFI_P2P_DISCOVERY_CHANGED_ACTION
-     */
-    public static final int WIFI_P2P_DISCOVERY_STOPPED = 1;
-
-    /**
-     * p2p discovery has started
-     *
-     * @see #WIFI_P2P_DISCOVERY_CHANGED_ACTION
-     */
-    public static final int WIFI_P2P_DISCOVERY_STARTED = 2;
-
-    /**
-     * Broadcast intent action indicating that this device details have changed.
-     *
-     * <p> An extra {@link #EXTRA_WIFI_P2P_DEVICE} provides this device details.
-     * The valid device details can also be obtained with
-     * {@link #requestDeviceInfo(Channel, DeviceInfoListener)} when p2p is enabled.
-     * To get information notifications on P2P getting enabled refers
-     * {@link #WIFI_P2P_STATE_ENABLED}.
-     *
-     * <p> The {@link #EXTRA_WIFI_P2P_DEVICE} extra contains an anonymized version of the device's
-     * MAC address. Callers holding the {@code android.Manifest.permission#LOCAL_MAC_ADDRESS}
-     * permission can use {@link #requestDeviceInfo} to obtain the actual MAC address of this
-     * device.
-     *
-     * All of these permissions are required to receive this broadcast:
-     * {@link android.Manifest.permission#ACCESS_FINE_LOCATION} and
-     * {@link android.Manifest.permission#ACCESS_WIFI_STATE}
-     *
-     * @see #EXTRA_WIFI_P2P_DEVICE
-     */
-    @SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String WIFI_P2P_THIS_DEVICE_CHANGED_ACTION =
-        "android.net.wifi.p2p.THIS_DEVICE_CHANGED";
-
-    /**
-     * The lookup key for a {@link android.net.wifi.p2p.WifiP2pDevice} object
-     * Retrieve with {@link android.content.Intent#getParcelableExtra(String)}.
-     */
-    public static final String EXTRA_WIFI_P2P_DEVICE = "wifiP2pDevice";
-
-    /**
-     * Broadcast intent action indicating that remembered persistent groups have changed.
-     *
-     * You can <em>not</em> receive this through components declared
-     * in manifests, only by explicitly registering for it with
-     * {@link android.content.Context#registerReceiver(android.content.BroadcastReceiver,
-     * android.content.IntentFilter) Context.registerReceiver()}.
-     *
-     * @hide
-     */
-    @SystemApi
-    public static final String ACTION_WIFI_P2P_PERSISTENT_GROUPS_CHANGED =
-            "android.net.wifi.p2p.action.WIFI_P2P_PERSISTENT_GROUPS_CHANGED";
-
-    /**
-     * The lookup key for a handover message returned by the WifiP2pService.
-     * @hide
-     */
-    public static final String EXTRA_HANDOVER_MESSAGE =
-            "android.net.wifi.p2p.EXTRA_HANDOVER_MESSAGE";
-
-    /**
-     * The lookup key for a calling package name from WifiP2pManager
-     * @hide
-     */
-    public static final String CALLING_PACKAGE =
-            "android.net.wifi.p2p.CALLING_PACKAGE";
-
-    /**
-     * The lookup key for a calling feature id from WifiP2pManager
-     * @hide
-     */
-    public static final String CALLING_FEATURE_ID =
-            "android.net.wifi.p2p.CALLING_FEATURE_ID";
-
-    /**
-     * The lookup key for a calling package binder from WifiP2pManager
-     * @hide
-     */
-    public static final String CALLING_BINDER =
-            "android.net.wifi.p2p.CALLING_BINDER";
-
-    IWifiP2pManager mService;
-
-    private static final int BASE = Protocol.BASE_WIFI_P2P_MANAGER;
-
-    /** @hide */
-    public static final int DISCOVER_PEERS                          = BASE + 1;
-    /** @hide */
-    public static final int DISCOVER_PEERS_FAILED                   = BASE + 2;
-    /** @hide */
-    public static final int DISCOVER_PEERS_SUCCEEDED                = BASE + 3;
-
-    /** @hide */
-    public static final int STOP_DISCOVERY                          = BASE + 4;
-    /** @hide */
-    public static final int STOP_DISCOVERY_FAILED                   = BASE + 5;
-    /** @hide */
-    public static final int STOP_DISCOVERY_SUCCEEDED                = BASE + 6;
-
-    /** @hide */
-    public static final int CONNECT                                 = BASE + 7;
-    /** @hide */
-    public static final int CONNECT_FAILED                          = BASE + 8;
-    /** @hide */
-    public static final int CONNECT_SUCCEEDED                       = BASE + 9;
-
-    /** @hide */
-    public static final int CANCEL_CONNECT                          = BASE + 10;
-    /** @hide */
-    public static final int CANCEL_CONNECT_FAILED                   = BASE + 11;
-    /** @hide */
-    public static final int CANCEL_CONNECT_SUCCEEDED                = BASE + 12;
-
-    /** @hide */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final int CREATE_GROUP                            = BASE + 13;
-    /** @hide */
-    public static final int CREATE_GROUP_FAILED                     = BASE + 14;
-    /** @hide */
-    public static final int CREATE_GROUP_SUCCEEDED                  = BASE + 15;
-
-    /** @hide */
-    public static final int REMOVE_GROUP                            = BASE + 16;
-    /** @hide */
-    public static final int REMOVE_GROUP_FAILED                     = BASE + 17;
-    /** @hide */
-    public static final int REMOVE_GROUP_SUCCEEDED                  = BASE + 18;
-
-    /** @hide */
-    public static final int REQUEST_PEERS                           = BASE + 19;
-    /** @hide */
-    public static final int RESPONSE_PEERS                          = BASE + 20;
-
-    /** @hide */
-    public static final int REQUEST_CONNECTION_INFO                 = BASE + 21;
-    /** @hide */
-    public static final int RESPONSE_CONNECTION_INFO                = BASE + 22;
-
-    /** @hide */
-    public static final int REQUEST_GROUP_INFO                      = BASE + 23;
-    /** @hide */
-    public static final int RESPONSE_GROUP_INFO                     = BASE + 24;
-
-    /** @hide */
-    public static final int ADD_LOCAL_SERVICE                       = BASE + 28;
-    /** @hide */
-    public static final int ADD_LOCAL_SERVICE_FAILED                = BASE + 29;
-    /** @hide */
-    public static final int ADD_LOCAL_SERVICE_SUCCEEDED             = BASE + 30;
-
-    /** @hide */
-    public static final int REMOVE_LOCAL_SERVICE                    = BASE + 31;
-    /** @hide */
-    public static final int REMOVE_LOCAL_SERVICE_FAILED             = BASE + 32;
-    /** @hide */
-    public static final int REMOVE_LOCAL_SERVICE_SUCCEEDED          = BASE + 33;
-
-    /** @hide */
-    public static final int CLEAR_LOCAL_SERVICES                    = BASE + 34;
-    /** @hide */
-    public static final int CLEAR_LOCAL_SERVICES_FAILED             = BASE + 35;
-    /** @hide */
-    public static final int CLEAR_LOCAL_SERVICES_SUCCEEDED          = BASE + 36;
-
-    /** @hide */
-    public static final int ADD_SERVICE_REQUEST                     = BASE + 37;
-    /** @hide */
-    public static final int ADD_SERVICE_REQUEST_FAILED              = BASE + 38;
-    /** @hide */
-    public static final int ADD_SERVICE_REQUEST_SUCCEEDED           = BASE + 39;
-
-    /** @hide */
-    public static final int REMOVE_SERVICE_REQUEST                  = BASE + 40;
-    /** @hide */
-    public static final int REMOVE_SERVICE_REQUEST_FAILED           = BASE + 41;
-    /** @hide */
-    public static final int REMOVE_SERVICE_REQUEST_SUCCEEDED        = BASE + 42;
-
-    /** @hide */
-    public static final int CLEAR_SERVICE_REQUESTS                  = BASE + 43;
-    /** @hide */
-    public static final int CLEAR_SERVICE_REQUESTS_FAILED           = BASE + 44;
-    /** @hide */
-    public static final int CLEAR_SERVICE_REQUESTS_SUCCEEDED        = BASE + 45;
-
-    /** @hide */
-    public static final int DISCOVER_SERVICES                       = BASE + 46;
-    /** @hide */
-    public static final int DISCOVER_SERVICES_FAILED                = BASE + 47;
-    /** @hide */
-    public static final int DISCOVER_SERVICES_SUCCEEDED             = BASE + 48;
-
-    /** @hide */
-    public static final int PING                                    = BASE + 49;
-
-    /** @hide */
-    public static final int RESPONSE_SERVICE                        = BASE + 50;
-
-    /** @hide */
-    public static final int SET_DEVICE_NAME                         = BASE + 51;
-    /** @hide */
-    public static final int SET_DEVICE_NAME_FAILED                  = BASE + 52;
-    /** @hide */
-    public static final int SET_DEVICE_NAME_SUCCEEDED               = BASE + 53;
-
-    /** @hide */
-    public static final int DELETE_PERSISTENT_GROUP                 = BASE + 54;
-    /** @hide */
-    public static final int DELETE_PERSISTENT_GROUP_FAILED          = BASE + 55;
-    /** @hide */
-    public static final int DELETE_PERSISTENT_GROUP_SUCCEEDED       = BASE + 56;
-
-    /** @hide */
-    public static final int REQUEST_PERSISTENT_GROUP_INFO           = BASE + 57;
-    /** @hide */
-    public static final int RESPONSE_PERSISTENT_GROUP_INFO          = BASE + 58;
-
-    /** @hide */
-    public static final int SET_WFD_INFO                            = BASE + 59;
-    /** @hide */
-    public static final int SET_WFD_INFO_FAILED                     = BASE + 60;
-    /** @hide */
-    public static final int SET_WFD_INFO_SUCCEEDED                  = BASE + 61;
-
-    /** @hide */
-    public static final int START_WPS                               = BASE + 62;
-    /** @hide */
-    public static final int START_WPS_FAILED                        = BASE + 63;
-    /** @hide */
-    public static final int START_WPS_SUCCEEDED                     = BASE + 64;
-
-    /** @hide */
-    public static final int START_LISTEN                            = BASE + 65;
-    /** @hide */
-    public static final int START_LISTEN_FAILED                     = BASE + 66;
-    /** @hide */
-    public static final int START_LISTEN_SUCCEEDED                  = BASE + 67;
-
-    /** @hide */
-    public static final int STOP_LISTEN                             = BASE + 68;
-    /** @hide */
-    public static final int STOP_LISTEN_FAILED                      = BASE + 69;
-    /** @hide */
-    public static final int STOP_LISTEN_SUCCEEDED                   = BASE + 70;
-
-    /** @hide */
-    public static final int SET_CHANNEL                             = BASE + 71;
-    /** @hide */
-    public static final int SET_CHANNEL_FAILED                      = BASE + 72;
-    /** @hide */
-    public static final int SET_CHANNEL_SUCCEEDED                   = BASE + 73;
-
-    /** @hide */
-    public static final int GET_HANDOVER_REQUEST                    = BASE + 75;
-    /** @hide */
-    public static final int GET_HANDOVER_SELECT                     = BASE + 76;
-    /** @hide */
-    public static final int RESPONSE_GET_HANDOVER_MESSAGE           = BASE + 77;
-    /** @hide */
-    public static final int INITIATOR_REPORT_NFC_HANDOVER           = BASE + 78;
-    /** @hide */
-    public static final int RESPONDER_REPORT_NFC_HANDOVER           = BASE + 79;
-    /** @hide */
-    public static final int REPORT_NFC_HANDOVER_SUCCEEDED           = BASE + 80;
-    /** @hide */
-    public static final int REPORT_NFC_HANDOVER_FAILED              = BASE + 81;
-
-    /** @hide */
-    public static final int FACTORY_RESET                           = BASE + 82;
-    /** @hide */
-    public static final int FACTORY_RESET_FAILED                    = BASE + 83;
-    /** @hide */
-    public static final int FACTORY_RESET_SUCCEEDED                 = BASE + 84;
-
-    /** @hide */
-    public static final int REQUEST_ONGOING_PEER_CONFIG             = BASE + 85;
-    /** @hide */
-    public static final int RESPONSE_ONGOING_PEER_CONFIG            = BASE + 86;
-    /** @hide */
-    public static final int SET_ONGOING_PEER_CONFIG                 = BASE + 87;
-    /** @hide */
-    public static final int SET_ONGOING_PEER_CONFIG_FAILED          = BASE + 88;
-    /** @hide */
-    public static final int SET_ONGOING_PEER_CONFIG_SUCCEEDED       = BASE + 89;
-
-    /** @hide */
-    public static final int REQUEST_P2P_STATE                       = BASE + 90;
-    /** @hide */
-    public static final int RESPONSE_P2P_STATE                      = BASE + 91;
-
-    /** @hide */
-    public static final int REQUEST_DISCOVERY_STATE                 = BASE + 92;
-    /** @hide */
-    public static final int RESPONSE_DISCOVERY_STATE                = BASE + 93;
-
-    /** @hide */
-    public static final int REQUEST_NETWORK_INFO                    = BASE + 94;
-    /** @hide */
-    public static final int RESPONSE_NETWORK_INFO                   = BASE + 95;
-
-    /** @hide */
-    public static final int UPDATE_CHANNEL_INFO                     = BASE + 96;
-
-    /** @hide */
-    public static final int REQUEST_DEVICE_INFO                     = BASE + 97;
-    /** @hide */
-    public static final int RESPONSE_DEVICE_INFO                    = BASE + 98;
-
-    /**
-     * Create a new WifiP2pManager instance. Applications use
-     * {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
-     * the standard {@link android.content.Context#WIFI_P2P_SERVICE Context.WIFI_P2P_SERVICE}.
-     * @param service the Binder interface
-     * @hide - hide this because it takes in a parameter of type IWifiP2pManager, which
-     * is a system private class.
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
-    public WifiP2pManager(IWifiP2pManager service) {
-        mService = service;
-    }
-
-    /**
-     * Passed with {@link ActionListener#onFailure}.
-     * Indicates that the operation failed due to an internal error.
-     */
-    public static final int ERROR               = 0;
-
-    /**
-     * Passed with {@link ActionListener#onFailure}.
-     * Indicates that the operation failed because p2p is unsupported on the device.
-     */
-    public static final int P2P_UNSUPPORTED     = 1;
-
-    /**
-     * Passed with {@link ActionListener#onFailure}.
-     * Indicates that the operation failed because the framework is busy and
-     * unable to service the request
-     */
-    public static final int BUSY                = 2;
-
-    /**
-     * Passed with {@link ActionListener#onFailure}.
-     * Indicates that the {@link #discoverServices} failed because no service
-     * requests are added. Use {@link #addServiceRequest} to add a service
-     * request.
-     */
-    public static final int NO_SERVICE_REQUESTS = 3;
-
-    /** Interface for callback invocation when framework channel is lost */
-    public interface ChannelListener {
-        /**
-         * The channel to the framework has been disconnected.
-         * Application could try re-initializing using {@link #initialize}
-         */
-        public void onChannelDisconnected();
-    }
-
-    /** Interface for callback invocation on an application action */
-    public interface ActionListener {
-        /** The operation succeeded */
-        public void onSuccess();
-        /**
-         * The operation failed
-         * @param reason The reason for failure could be one of {@link #P2P_UNSUPPORTED},
-         * {@link #ERROR} or {@link #BUSY}
-         */
-        public void onFailure(int reason);
-    }
-
-    /** Interface for callback invocation when peer list is available */
-    public interface PeerListListener {
-        /**
-         * The requested peer list is available
-         * @param peers List of available peers
-         */
-        public void onPeersAvailable(WifiP2pDeviceList peers);
-    }
-
-    /** Interface for callback invocation when connection info is available */
-    public interface ConnectionInfoListener {
-        /**
-         * The requested connection info is available
-         * @param info Wi-Fi p2p connection info
-         */
-        public void onConnectionInfoAvailable(WifiP2pInfo info);
-    }
-
-    /** Interface for callback invocation when group info is available */
-    public interface GroupInfoListener {
-        /**
-         * The requested p2p group info is available
-         * @param group Wi-Fi p2p group info
-         */
-        public void onGroupInfoAvailable(WifiP2pGroup group);
-    }
-
-   /**
-    * Interface for callback invocation when service discovery response other than
-    * Upnp or Bonjour is received
-    */
-    public interface ServiceResponseListener {
-
-        /**
-         * The requested service response is available.
-         *
-         * @param protocolType protocol type. currently only
-         * {@link WifiP2pServiceInfo#SERVICE_TYPE_VENDOR_SPECIFIC}.
-         * @param responseData service discovery response data based on the requested
-         *  service protocol type. The format depends on the service type.
-         * @param srcDevice source device.
-         */
-        public void onServiceAvailable(int protocolType,
-                byte[] responseData, WifiP2pDevice srcDevice);
-    }
-
-    /**
-     * Interface for callback invocation when Bonjour service discovery response
-     * is received
-     */
-    public interface DnsSdServiceResponseListener {
-
-        /**
-         * The requested Bonjour service response is available.
-         *
-         * <p>This function is invoked when the device with the specified Bonjour
-         * registration type returned the instance name.
-         * @param instanceName instance name.<br>
-         *  e.g) "MyPrinter".
-         * @param registrationType <br>
-         * e.g) "_ipp._tcp.local."
-         * @param srcDevice source device.
-         */
-        public void onDnsSdServiceAvailable(String instanceName,
-                String registrationType, WifiP2pDevice srcDevice);
-
-   }
-
-    /**
-     * Interface for callback invocation when Bonjour TXT record is available
-     * for a service
-     */
-   public interface DnsSdTxtRecordListener {
-        /**
-         * The requested Bonjour service response is available.
-         *
-         * <p>This function is invoked when the device with the specified full
-         * service domain service returned TXT record.
-         *
-         * @param fullDomainName full domain name. <br>
-         * e.g) "MyPrinter._ipp._tcp.local.".
-         * @param txtRecordMap TXT record data as a map of key/value pairs
-         * @param srcDevice source device.
-         */
-        public void onDnsSdTxtRecordAvailable(String fullDomainName,
-                Map<String, String> txtRecordMap,
-                WifiP2pDevice srcDevice);
-   }
-
-    /**
-     * Interface for callback invocation when upnp service discovery response
-     * is received
-     * */
-    public interface UpnpServiceResponseListener {
-
-        /**
-         * The requested upnp service response is available.
-         *
-         * <p>This function is invoked when the specified device or service is found.
-         *
-         * @param uniqueServiceNames The list of unique service names.<br>
-         * e.g) uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp-org:device:
-         * MediaServer:1
-         * @param srcDevice source device.
-         */
-        public void onUpnpServiceAvailable(List<String> uniqueServiceNames,
-                WifiP2pDevice srcDevice);
-    }
-
-
-    /**
-     * Interface for callback invocation when stored group info list is available
-     *
-     * @hide
-     */
-    @SystemApi
-    public interface PersistentGroupInfoListener {
-        /**
-         * The requested stored p2p group info list is available
-         * @param groups Wi-Fi p2p group info list
-         */
-        void onPersistentGroupInfoAvailable(@NonNull WifiP2pGroupList groups);
-    }
-
-    /**
-     * Interface for callback invocation when Handover Request or Select Message is available
-     * @hide
-     */
-    public interface HandoverMessageListener {
-        public void onHandoverMessageAvailable(String handoverMessage);
-    }
-
-    /** Interface for callback invocation when p2p state is available
-     *  in response to {@link #requestP2pState}.
-     */
-    public interface P2pStateListener {
-        /**
-         * The requested p2p state is available.
-         * @param state Wi-Fi p2p state
-         *        @see #WIFI_P2P_STATE_DISABLED
-         *        @see #WIFI_P2P_STATE_ENABLED
-         */
-        void onP2pStateAvailable(@WifiP2pState int state);
-    }
-
-    /** Interface for callback invocation when p2p state is available
-     *  in response to {@link #requestDiscoveryState}.
-     */
-    public interface DiscoveryStateListener {
-        /**
-         * The requested p2p discovery state is available.
-         * @param state Wi-Fi p2p discovery state
-         *        @see #WIFI_P2P_DISCOVERY_STARTED
-         *        @see #WIFI_P2P_DISCOVERY_STOPPED
-         */
-        void onDiscoveryStateAvailable(@WifiP2pDiscoveryState int state);
-    }
-
-    /** Interface for callback invocation when {@link android.net.NetworkInfo} is available
-     *  in response to {@link #requestNetworkInfo}.
-     */
-    public interface NetworkInfoListener {
-        /**
-         * The requested {@link android.net.NetworkInfo} is available
-         * @param networkInfo Wi-Fi p2p {@link android.net.NetworkInfo}
-         */
-        void onNetworkInfoAvailable(@NonNull NetworkInfo networkInfo);
-    }
-
-    /**
-     * Interface for callback invocation when ongoing peer info is available
-     * @hide
-     */
-    public interface OngoingPeerInfoListener {
-        /**
-         * The requested ongoing WifiP2pConfig is available
-         * @param peerConfig WifiP2pConfig for current connecting session
-         */
-        void onOngoingPeerAvailable(WifiP2pConfig peerConfig);
-    }
-
-    /** Interface for callback invocation when {@link android.net.wifi.p2p.WifiP2pDevice}
-     *  is available in response to {@link #requestDeviceInfo(Channel, DeviceInfoListener)}.
-     */
-    public interface DeviceInfoListener {
-        /**
-         * The requested {@link android.net.wifi.p2p.WifiP2pDevice} is available.
-         * @param wifiP2pDevice Wi-Fi p2p {@link android.net.wifi.p2p.WifiP2pDevice}
-         */
-        void onDeviceInfoAvailable(@Nullable WifiP2pDevice wifiP2pDevice);
-    }
-
-    /**
-     * A channel that connects the application to the Wifi p2p framework.
-     * Most p2p operations require a Channel as an argument. An instance of Channel is obtained
-     * by doing a call on {@link #initialize}
-     */
-    public static class Channel implements AutoCloseable {
-        /** @hide */
-        public Channel(Context context, Looper looper, ChannelListener l, Binder binder,
-                WifiP2pManager p2pManager) {
-            mAsyncChannel = new AsyncChannel();
-            mHandler = new P2pHandler(looper);
-            mChannelListener = l;
-            mContext = context;
-            mBinder = binder;
-            mP2pManager = p2pManager;
-
-            mCloseGuard.open("close");
-        }
-        private final static int INVALID_LISTENER_KEY = 0;
-        private final WifiP2pManager mP2pManager;
-        private ChannelListener mChannelListener;
-        private ServiceResponseListener mServRspListener;
-        private DnsSdServiceResponseListener mDnsSdServRspListener;
-        private DnsSdTxtRecordListener mDnsSdTxtListener;
-        private UpnpServiceResponseListener mUpnpServRspListener;
-        private HashMap<Integer, Object> mListenerMap = new HashMap<Integer, Object>();
-        private final Object mListenerMapLock = new Object();
-        private int mListenerKey = 0;
-
-        private final CloseGuard mCloseGuard = new CloseGuard();
-
-        /**
-         * Close the current P2P connection and indicate to the P2P service that connections
-         * created by the app can be removed.
-         */
-        public void close() {
-            if (mP2pManager == null) {
-                Log.w(TAG, "Channel.close(): Null mP2pManager!?");
-            } else {
-                try {
-                    mP2pManager.mService.close(mBinder);
-                } catch (RemoteException e) {
-                    throw e.rethrowFromSystemServer();
-                }
-            }
-
-            mAsyncChannel.disconnect();
-            mCloseGuard.close();
-            Reference.reachabilityFence(this);
-        }
-
-        /** @hide */
-        @Override
-        protected void finalize() throws Throwable {
-            try {
-                if (mCloseGuard != null) {
-                    mCloseGuard.warnIfOpen();
-                }
-
-                close();
-            } finally {
-                super.finalize();
-            }
-        }
-
-        /* package */ final Binder mBinder;
-
-        @UnsupportedAppUsage
-        private AsyncChannel mAsyncChannel;
-        private P2pHandler mHandler;
-        Context mContext;
-        class P2pHandler extends Handler {
-            P2pHandler(Looper looper) {
-                super(looper);
-            }
-
-            @Override
-            public void handleMessage(Message message) {
-                Object listener = getListener(message.arg2);
-                switch (message.what) {
-                    case AsyncChannel.CMD_CHANNEL_DISCONNECTED:
-                        if (mChannelListener != null) {
-                            mChannelListener.onChannelDisconnected();
-                            mChannelListener = null;
-                        }
-                        break;
-                    /* ActionListeners grouped together */
-                    case DISCOVER_PEERS_FAILED:
-                    case STOP_DISCOVERY_FAILED:
-                    case DISCOVER_SERVICES_FAILED:
-                    case CONNECT_FAILED:
-                    case CANCEL_CONNECT_FAILED:
-                    case CREATE_GROUP_FAILED:
-                    case REMOVE_GROUP_FAILED:
-                    case ADD_LOCAL_SERVICE_FAILED:
-                    case REMOVE_LOCAL_SERVICE_FAILED:
-                    case CLEAR_LOCAL_SERVICES_FAILED:
-                    case ADD_SERVICE_REQUEST_FAILED:
-                    case REMOVE_SERVICE_REQUEST_FAILED:
-                    case CLEAR_SERVICE_REQUESTS_FAILED:
-                    case SET_DEVICE_NAME_FAILED:
-                    case DELETE_PERSISTENT_GROUP_FAILED:
-                    case SET_WFD_INFO_FAILED:
-                    case START_WPS_FAILED:
-                    case START_LISTEN_FAILED:
-                    case STOP_LISTEN_FAILED:
-                    case SET_CHANNEL_FAILED:
-                    case REPORT_NFC_HANDOVER_FAILED:
-                    case FACTORY_RESET_FAILED:
-                    case SET_ONGOING_PEER_CONFIG_FAILED:
-                        if (listener != null) {
-                            ((ActionListener) listener).onFailure(message.arg1);
-                        }
-                        break;
-                    /* ActionListeners grouped together */
-                    case DISCOVER_PEERS_SUCCEEDED:
-                    case STOP_DISCOVERY_SUCCEEDED:
-                    case DISCOVER_SERVICES_SUCCEEDED:
-                    case CONNECT_SUCCEEDED:
-                    case CANCEL_CONNECT_SUCCEEDED:
-                    case CREATE_GROUP_SUCCEEDED:
-                    case REMOVE_GROUP_SUCCEEDED:
-                    case ADD_LOCAL_SERVICE_SUCCEEDED:
-                    case REMOVE_LOCAL_SERVICE_SUCCEEDED:
-                    case CLEAR_LOCAL_SERVICES_SUCCEEDED:
-                    case ADD_SERVICE_REQUEST_SUCCEEDED:
-                    case REMOVE_SERVICE_REQUEST_SUCCEEDED:
-                    case CLEAR_SERVICE_REQUESTS_SUCCEEDED:
-                    case SET_DEVICE_NAME_SUCCEEDED:
-                    case DELETE_PERSISTENT_GROUP_SUCCEEDED:
-                    case SET_WFD_INFO_SUCCEEDED:
-                    case START_WPS_SUCCEEDED:
-                    case START_LISTEN_SUCCEEDED:
-                    case STOP_LISTEN_SUCCEEDED:
-                    case SET_CHANNEL_SUCCEEDED:
-                    case REPORT_NFC_HANDOVER_SUCCEEDED:
-                    case FACTORY_RESET_SUCCEEDED:
-                    case SET_ONGOING_PEER_CONFIG_SUCCEEDED:
-                        if (listener != null) {
-                            ((ActionListener) listener).onSuccess();
-                        }
-                        break;
-                    case RESPONSE_PEERS:
-                        WifiP2pDeviceList peers = (WifiP2pDeviceList) message.obj;
-                        if (listener != null) {
-                            ((PeerListListener) listener).onPeersAvailable(peers);
-                        }
-                        break;
-                    case RESPONSE_CONNECTION_INFO:
-                        WifiP2pInfo wifiP2pInfo = (WifiP2pInfo) message.obj;
-                        if (listener != null) {
-                            ((ConnectionInfoListener) listener).onConnectionInfoAvailable(wifiP2pInfo);
-                        }
-                        break;
-                    case RESPONSE_GROUP_INFO:
-                        WifiP2pGroup group = (WifiP2pGroup) message.obj;
-                        if (listener != null) {
-                            ((GroupInfoListener) listener).onGroupInfoAvailable(group);
-                        }
-                        break;
-                    case RESPONSE_SERVICE:
-                        WifiP2pServiceResponse resp = (WifiP2pServiceResponse) message.obj;
-                        handleServiceResponse(resp);
-                        break;
-                    case RESPONSE_PERSISTENT_GROUP_INFO:
-                        WifiP2pGroupList groups = (WifiP2pGroupList) message.obj;
-                        if (listener != null) {
-                            ((PersistentGroupInfoListener) listener).
-                                onPersistentGroupInfoAvailable(groups);
-                        }
-                        break;
-                    case RESPONSE_GET_HANDOVER_MESSAGE:
-                        Bundle handoverBundle = (Bundle) message.obj;
-                        if (listener != null) {
-                            String handoverMessage = handoverBundle != null
-                                    ? handoverBundle.getString(EXTRA_HANDOVER_MESSAGE)
-                                    : null;
-                            ((HandoverMessageListener) listener)
-                                    .onHandoverMessageAvailable(handoverMessage);
-                        }
-                        break;
-                    case RESPONSE_ONGOING_PEER_CONFIG:
-                        WifiP2pConfig peerConfig = (WifiP2pConfig) message.obj;
-                        if (listener != null) {
-                            ((OngoingPeerInfoListener) listener)
-                                    .onOngoingPeerAvailable(peerConfig);
-                        }
-                        break;
-                    case RESPONSE_P2P_STATE:
-                        if (listener != null) {
-                            ((P2pStateListener) listener)
-                                    .onP2pStateAvailable(message.arg1);
-                        }
-                        break;
-                    case RESPONSE_DISCOVERY_STATE:
-                        if (listener != null) {
-                            ((DiscoveryStateListener) listener)
-                                    .onDiscoveryStateAvailable(message.arg1);
-                        }
-                        break;
-                    case RESPONSE_NETWORK_INFO:
-                        if (listener != null) {
-                            ((NetworkInfoListener) listener)
-                                    .onNetworkInfoAvailable((NetworkInfo) message.obj);
-                        }
-                        break;
-                    case RESPONSE_DEVICE_INFO:
-                        if (listener != null) {
-                            ((DeviceInfoListener) listener)
-                                    .onDeviceInfoAvailable((WifiP2pDevice) message.obj);
-                        }
-                        break;
-                    default:
-                        Log.d(TAG, "Ignored " + message);
-                        break;
-                }
-            }
-        }
-
-        private void handleServiceResponse(WifiP2pServiceResponse resp) {
-            if (resp instanceof WifiP2pDnsSdServiceResponse) {
-                handleDnsSdServiceResponse((WifiP2pDnsSdServiceResponse)resp);
-            } else if (resp instanceof WifiP2pUpnpServiceResponse) {
-                if (mUpnpServRspListener != null) {
-                    handleUpnpServiceResponse((WifiP2pUpnpServiceResponse)resp);
-                }
-            } else {
-                if (mServRspListener != null) {
-                    mServRspListener.onServiceAvailable(resp.getServiceType(),
-                            resp.getRawData(), resp.getSrcDevice());
-                }
-            }
-        }
-
-        private void handleUpnpServiceResponse(WifiP2pUpnpServiceResponse resp) {
-            mUpnpServRspListener.onUpnpServiceAvailable(resp.getUniqueServiceNames(),
-                    resp.getSrcDevice());
-        }
-
-        private void handleDnsSdServiceResponse(WifiP2pDnsSdServiceResponse resp) {
-            if (resp.getDnsType() == WifiP2pDnsSdServiceInfo.DNS_TYPE_PTR) {
-                if (mDnsSdServRspListener != null) {
-                    mDnsSdServRspListener.onDnsSdServiceAvailable(
-                            resp.getInstanceName(),
-                            resp.getDnsQueryName(),
-                            resp.getSrcDevice());
-                }
-            } else if (resp.getDnsType() == WifiP2pDnsSdServiceInfo.DNS_TYPE_TXT) {
-                if (mDnsSdTxtListener != null) {
-                    mDnsSdTxtListener.onDnsSdTxtRecordAvailable(
-                            resp.getDnsQueryName(),
-                            resp.getTxtRecord(),
-                            resp.getSrcDevice());
-                }
-            } else {
-                Log.e(TAG, "Unhandled resp " + resp);
-            }
-        }
-
-        @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-        private int putListener(Object listener) {
-            if (listener == null) return INVALID_LISTENER_KEY;
-            int key;
-            synchronized (mListenerMapLock) {
-                do {
-                    key = mListenerKey++;
-                } while (key == INVALID_LISTENER_KEY);
-                mListenerMap.put(key, listener);
-            }
-            return key;
-        }
-
-        private Object getListener(int key) {
-            if (key == INVALID_LISTENER_KEY) return null;
-            synchronized (mListenerMapLock) {
-                return mListenerMap.remove(key);
-            }
-        }
-    }
-
-    private static void checkChannel(Channel c) {
-        if (c == null) throw new IllegalArgumentException("Channel needs to be initialized");
-    }
-
-    private static void checkServiceInfo(WifiP2pServiceInfo info) {
-        if (info == null) throw new IllegalArgumentException("service info is null");
-    }
-
-    private static void checkServiceRequest(WifiP2pServiceRequest req) {
-        if (req == null) throw new IllegalArgumentException("service request is null");
-    }
-
-    private static void checkP2pConfig(WifiP2pConfig c) {
-        if (c == null) throw new IllegalArgumentException("config cannot be null");
-        if (TextUtils.isEmpty(c.deviceAddress)) {
-            throw new IllegalArgumentException("deviceAddress cannot be empty");
-        }
-    }
-
-    /**
-     * Registers the application with the Wi-Fi framework. This function
-     * must be the first to be called before any p2p operations are performed.
-     *
-     * @param srcContext is the context of the source
-     * @param srcLooper is the Looper on which the callbacks are receivied
-     * @param listener for callback at loss of framework communication. Can be null.
-     * @return Channel instance that is necessary for performing any further p2p operations
-     */
-    public Channel initialize(Context srcContext, Looper srcLooper, ChannelListener listener) {
-        Binder binder = new Binder();
-        Channel channel = initalizeChannel(srcContext, srcLooper, listener, getMessenger(binder),
-                binder);
-        return channel;
-    }
-
-    /**
-     * Registers the application with the Wi-Fi framework. Enables system-only functionality.
-     * @hide
-     */
-    public Channel initializeInternal(Context srcContext, Looper srcLooper,
-                                      ChannelListener listener) {
-        return initalizeChannel(srcContext, srcLooper, listener, getP2pStateMachineMessenger(),
-                null);
-    }
-
-    private Channel initalizeChannel(Context srcContext, Looper srcLooper, ChannelListener listener,
-                                     Messenger messenger, Binder binder) {
-        if (messenger == null) return null;
-
-        Channel c = new Channel(srcContext, srcLooper, listener, binder, this);
-        if (c.mAsyncChannel.connectSync(srcContext, c.mHandler, messenger)
-                == AsyncChannel.STATUS_SUCCESSFUL) {
-            Bundle bundle = new Bundle();
-            bundle.putString(CALLING_PACKAGE, c.mContext.getOpPackageName());
-            bundle.putString(CALLING_FEATURE_ID, c.mContext.getAttributionTag());
-            bundle.putBinder(CALLING_BINDER, binder);
-            c.mAsyncChannel.sendMessage(UPDATE_CHANNEL_INFO, 0,
-                    c.putListener(null), bundle);
-            return c;
-        } else {
-            c.close();
-            return null;
-        }
-    }
-
-    /**
-     * Initiate peer discovery. A discovery process involves scanning for available Wi-Fi peers
-     * for the purpose of establishing a connection.
-     *
-     * <p> The function call immediately returns after sending a discovery request
-     * to the framework. The application is notified of a success or failure to initiate
-     * discovery through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * <p> The discovery remains active until a connection is initiated or
-     * a p2p group is formed. Register for {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent to
-     * determine when the framework notifies of a change as peers are discovered.
-     *
-     * <p> Upon receiving a {@link #WIFI_P2P_PEERS_CHANGED_ACTION} intent, an application
-     * can request for the list of peers using {@link #requestPeers}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
-    public void discoverPeers(Channel c, ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(DISCOVER_PEERS, 0, c.putListener(listener));
-    }
-
-    /**
-     * Stop an ongoing peer discovery
-     *
-     * <p> The function call immediately returns after sending a stop request
-     * to the framework. The application is notified of a success or failure to initiate
-     * stop through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    public void stopPeerDiscovery(Channel c, ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(STOP_DISCOVERY, 0, c.putListener(listener));
-    }
-
-    /**
-     * Start a p2p connection to a device with the specified configuration.
-     *
-     * <p> The function call immediately returns after sending a connection request
-     * to the framework. The application is notified of a success or failure to initiate
-     * connect through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * <p> Register for {@link #WIFI_P2P_CONNECTION_CHANGED_ACTION} intent to
-     * determine when the framework notifies of a change in connectivity.
-     *
-     * <p> If the current device is not part of a p2p group, a connect request initiates
-     * a group negotiation with the peer.
-     *
-     * <p> If the current device is part of an existing p2p group or has created
-     * a p2p group with {@link #createGroup}, an invitation to join the group is sent to
-     * the peer device.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param config options as described in {@link WifiP2pConfig} class
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
-    public void connect(Channel c, WifiP2pConfig config, ActionListener listener) {
-        checkChannel(c);
-        checkP2pConfig(config);
-        c.mAsyncChannel.sendMessage(CONNECT, 0, c.putListener(listener), config);
-    }
-
-    /**
-     * Cancel any ongoing p2p group negotiation
-     *
-     * <p> The function call immediately returns after sending a connection cancellation request
-     * to the framework. The application is notified of a success or failure to initiate
-     * cancellation through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    public void cancelConnect(Channel c, ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(CANCEL_CONNECT, 0, c.putListener(listener));
-    }
-
-    /**
-     * Create a p2p group with the current device as the group owner. This essentially creates
-     * an access point that can accept connections from legacy clients as well as other p2p
-     * devices.
-     *
-     * <p class="note"><strong>Note:</strong>
-     * This function would normally not be used unless the current device needs
-     * to form a p2p connection with a legacy client
-     *
-     * <p> The function call immediately returns after sending a group creation request
-     * to the framework. The application is notified of a success or failure to initiate
-     * group creation through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * <p> Application can request for the group details with {@link #requestGroupInfo}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
-    public void createGroup(Channel c, ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(CREATE_GROUP, WifiP2pGroup.NETWORK_ID_PERSISTENT,
-                c.putListener(listener));
-    }
-
-    /**
-     * Create a p2p group with the current device as the group owner. This essentially creates
-     * an access point that can accept connections from legacy clients as well as other p2p
-     * devices.
-     *
-     * <p> An app should use {@link WifiP2pConfig.Builder} to build the configuration
-     * for a group.
-     *
-     * <p class="note"><strong>Note:</strong>
-     * This function would normally not be used unless the current device needs
-     * to form a p2p group as a Group Owner and allow peers to join it as either
-     * Group Clients or legacy Wi-Fi STAs.
-     *
-     * <p> The function call immediately returns after sending a group creation request
-     * to the framework. The application is notified of a success or failure to initiate
-     * group creation through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * <p> Application can request for the group details with {@link #requestGroupInfo}.
-     *
-     * @param c is the channel created at {@link #initialize}.
-     * @param config the configuration of a p2p group.
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
-    public void createGroup(@NonNull Channel c,
-            @Nullable WifiP2pConfig config,
-            @Nullable ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(CREATE_GROUP, 0,
-                c.putListener(listener), config);
-    }
-
-    /**
-     * Remove the current p2p group.
-     *
-     * <p> The function call immediately returns after sending a group removal request
-     * to the framework. The application is notified of a success or failure to initiate
-     * group removal through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    public void removeGroup(Channel c, ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(REMOVE_GROUP, 0, c.putListener(listener));
-    }
-
-    /**
-     * Force p2p to enter listen state
-     *
-     * @param c is the channel created at {@link #initialize(Context, Looper, ChannelListener)}
-     * @param listener for callbacks on success or failure. Can be null.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void startListening(@NonNull Channel c, @Nullable ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(START_LISTEN, 0, c.putListener(listener));
-    }
-
-    /**
-     * Force p2p to exit listen state
-     *
-     * @param c is the channel created at {@link #initialize(Context, Looper, ChannelListener)}
-     * @param listener for callbacks on success or failure. Can be null.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void stopListening(@NonNull Channel c, @Nullable ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(STOP_LISTEN, 0, c.putListener(listener));
-    }
-
-    /**
-     * Set P2P listening and operating channel.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listeningChannel the listening channel's Wifi channel number. e.g. 1, 6, 11.
-     * @param operatingChannel the operating channel's Wifi channel number. e.g. 1, 6, 11.
-     * @param listener for callbacks on success or failure. Can be null.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_STACK,
-            android.Manifest.permission.OVERRIDE_WIFI_CONFIG
-    })
-    public void setWifiP2pChannels(@NonNull Channel c, int listeningChannel, int operatingChannel,
-            @Nullable ActionListener listener) {
-        checkChannel(c);
-        Bundle p2pChannels = new Bundle();
-        p2pChannels.putInt("lc", listeningChannel);
-        p2pChannels.putInt("oc", operatingChannel);
-        c.mAsyncChannel.sendMessage(SET_CHANNEL, 0, c.putListener(listener), p2pChannels);
-    }
-
-    /**
-     * Start a Wi-Fi Protected Setup (WPS) session.
-     *
-     * <p> The function call immediately returns after sending a request to start a
-     * WPS session. Currently, this is only valid if the current device is running
-     * as a group owner to allow any new clients to join the group. The application
-     * is notified of a success or failure to initiate WPS through listener callbacks
-     * {@link ActionListener#onSuccess} or {@link ActionListener#onFailure}.
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public void startWps(Channel c, WpsInfo wps, ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(START_WPS, 0, c.putListener(listener), wps);
-    }
-
-    /**
-     * Register a local service for service discovery. If a local service is registered,
-     * the framework automatically responds to a service discovery request from a peer.
-     *
-     * <p> The function call immediately returns after sending a request to add a local
-     * service to the framework. The application is notified of a success or failure to
-     * add service through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * <p>The service information is set through {@link WifiP2pServiceInfo}.<br>
-     * or its subclass calls  {@link WifiP2pUpnpServiceInfo#newInstance} or
-     *  {@link WifiP2pDnsSdServiceInfo#newInstance} for a Upnp or Bonjour service
-     * respectively
-     *
-     * <p>The service information can be cleared with calls to
-     *  {@link #removeLocalService} or {@link #clearLocalServices}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param servInfo is a local service information.
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
-    public void addLocalService(Channel c, WifiP2pServiceInfo servInfo, ActionListener listener) {
-        checkChannel(c);
-        checkServiceInfo(servInfo);
-        c.mAsyncChannel.sendMessage(ADD_LOCAL_SERVICE, 0, c.putListener(listener), servInfo);
-    }
-
-    /**
-     * Remove a registered local service added with {@link #addLocalService}
-     *
-     * <p> The function call immediately returns after sending a request to remove a
-     * local service to the framework. The application is notified of a success or failure to
-     * add service through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param servInfo is the local service information.
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    public void removeLocalService(Channel c, WifiP2pServiceInfo servInfo,
-            ActionListener listener) {
-        checkChannel(c);
-        checkServiceInfo(servInfo);
-        c.mAsyncChannel.sendMessage(REMOVE_LOCAL_SERVICE, 0, c.putListener(listener), servInfo);
-    }
-
-    /**
-     * Clear all registered local services of service discovery.
-     *
-     * <p> The function call immediately returns after sending a request to clear all
-     * local services to the framework. The application is notified of a success or failure to
-     * add service through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    public void clearLocalServices(Channel c, ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(CLEAR_LOCAL_SERVICES, 0, c.putListener(listener));
-    }
-
-    /**
-     * Register a callback to be invoked on receiving service discovery response.
-     * Used only for vendor specific protocol right now. For Bonjour or Upnp, use
-     * {@link #setDnsSdResponseListeners} or {@link #setUpnpServiceResponseListener}
-     * respectively.
-     *
-     * <p> see {@link #discoverServices} for the detail.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callbacks on receiving service discovery response.
-     */
-    public void setServiceResponseListener(Channel c,
-            ServiceResponseListener listener) {
-        checkChannel(c);
-        c.mServRspListener = listener;
-    }
-
-    /**
-     * Register a callback to be invoked on receiving Bonjour service discovery
-     * response.
-     *
-     * <p> see {@link #discoverServices} for the detail.
-     *
-     * @param c
-     * @param servListener is for listening to a Bonjour service response
-     * @param txtListener is for listening to a Bonjour TXT record response
-     */
-    public void setDnsSdResponseListeners(Channel c,
-            DnsSdServiceResponseListener servListener, DnsSdTxtRecordListener txtListener) {
-        checkChannel(c);
-        c.mDnsSdServRspListener = servListener;
-        c.mDnsSdTxtListener = txtListener;
-    }
-
-    /**
-     * Register a callback to be invoked on receiving upnp service discovery
-     * response.
-     *
-     * <p> see {@link #discoverServices} for the detail.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callbacks on receiving service discovery response.
-     */
-    public void setUpnpServiceResponseListener(Channel c,
-            UpnpServiceResponseListener listener) {
-        checkChannel(c);
-        c.mUpnpServRspListener = listener;
-    }
-
-    /**
-     * Initiate service discovery. A discovery process involves scanning for
-     * requested services for the purpose of establishing a connection to a peer
-     * that supports an available service.
-     *
-     * <p> The function call immediately returns after sending a request to start service
-     * discovery to the framework. The application is notified of a success or failure to initiate
-     * discovery through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * <p> The services to be discovered are specified with calls to {@link #addServiceRequest}.
-     *
-     * <p>The application is notified of the response against the service discovery request
-     * through listener callbacks registered by {@link #setServiceResponseListener} or
-     * {@link #setDnsSdResponseListeners}, or {@link #setUpnpServiceResponseListener}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
-    public void discoverServices(Channel c, ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(DISCOVER_SERVICES, 0, c.putListener(listener));
-    }
-
-    /**
-     * Add a service discovery request.
-     *
-     * <p> The function call immediately returns after sending a request to add service
-     * discovery request to the framework. The application is notified of a success or failure to
-     * add service through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * <p>After service discovery request is added, you can initiate service discovery by
-     * {@link #discoverServices}.
-     *
-     * <p>The added service requests can be cleared with calls to
-     * {@link #removeServiceRequest(Channel, WifiP2pServiceRequest, ActionListener)} or
-     * {@link #clearServiceRequests(Channel, ActionListener)}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param req is the service discovery request.
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    public void addServiceRequest(Channel c,
-            WifiP2pServiceRequest req, ActionListener listener) {
-        checkChannel(c);
-        checkServiceRequest(req);
-        c.mAsyncChannel.sendMessage(ADD_SERVICE_REQUEST, 0,
-                c.putListener(listener), req);
-    }
-
-    /**
-     * Remove a specified service discovery request added with {@link #addServiceRequest}
-     *
-     * <p> The function call immediately returns after sending a request to remove service
-     * discovery request to the framework. The application is notified of a success or failure to
-     * add service through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param req is the service discovery request.
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    public void removeServiceRequest(Channel c, WifiP2pServiceRequest req,
-            ActionListener listener) {
-        checkChannel(c);
-        checkServiceRequest(req);
-        c.mAsyncChannel.sendMessage(REMOVE_SERVICE_REQUEST, 0,
-                c.putListener(listener), req);
-    }
-
-    /**
-     * Clear all registered service discovery requests.
-     *
-     * <p> The function call immediately returns after sending a request to clear all
-     * service discovery requests to the framework. The application is notified of a success
-     * or failure to add service through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callbacks on success or failure. Can be null.
-     */
-    public void clearServiceRequests(Channel c, ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(CLEAR_SERVICE_REQUESTS,
-                0, c.putListener(listener));
-    }
-
-    /**
-     * Request the current list of peers.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callback when peer list is available. Can be null.
-     */
-    @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
-    public void requestPeers(Channel c, PeerListListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(REQUEST_PEERS, 0, c.putListener(listener));
-    }
-
-    /**
-     * Request device connection info.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callback when connection info is available. Can be null.
-     */
-    public void requestConnectionInfo(Channel c, ConnectionInfoListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(REQUEST_CONNECTION_INFO, 0, c.putListener(listener));
-    }
-
-    /**
-     * Request p2p group info.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callback when group info is available. Can be null.
-     */
-    @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
-    public void requestGroupInfo(Channel c, GroupInfoListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(REQUEST_GROUP_INFO, 0, c.putListener(listener));
-    }
-
-    /**
-     * Set p2p device name.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callback when group info is available. Can be null.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_STACK,
-            android.Manifest.permission.OVERRIDE_WIFI_CONFIG
-    })
-    public void setDeviceName(@NonNull Channel c, @NonNull String devName,
-            @Nullable ActionListener listener) {
-        checkChannel(c);
-        WifiP2pDevice d = new WifiP2pDevice();
-        d.deviceName = devName;
-        c.mAsyncChannel.sendMessage(SET_DEVICE_NAME, 0, c.putListener(listener), d);
-    }
-
-    /**
-     * Set Wifi Display information.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param wfdInfo the Wifi Display information to set
-     * @param listener for callbacks on success or failure. Can be null.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY)
-    public void setWfdInfo(@NonNull Channel c, @NonNull WifiP2pWfdInfo wfdInfo,
-            @Nullable ActionListener listener) {
-        setWFDInfo(c, wfdInfo, listener);
-    }
-
-    /** @hide */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    @RequiresPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY)
-    public void setWFDInfo(@NonNull Channel c, @NonNull WifiP2pWfdInfo wfdInfo,
-            @Nullable ActionListener listener) {
-        checkChannel(c);
-        try {
-            mService.checkConfigureWifiDisplayPermission();
-        } catch (RemoteException e) {
-            e.rethrowFromSystemServer();
-        }
-        c.mAsyncChannel.sendMessage(SET_WFD_INFO, 0, c.putListener(listener), wfdInfo);
-    }
-
-
-    /**
-     * Delete a stored persistent group from the system settings.
-     *
-     * <p> The function call immediately returns after sending a persistent group removal request
-     * to the framework. The application is notified of a success or failure to initiate
-     * group removal through listener callbacks {@link ActionListener#onSuccess} or
-     * {@link ActionListener#onFailure}.
-     *
-     * <p>The persistent p2p group list stored in the system can be obtained by
-     * {@link #requestPersistentGroupInfo(Channel, PersistentGroupInfoListener)} and
-     *  a network id can be obtained by {@link WifiP2pGroup#getNetworkId()}.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param netId the network id of the p2p group.
-     * @param listener for callbacks on success or failure. Can be null.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_STACK,
-            android.Manifest.permission.OVERRIDE_WIFI_CONFIG
-    })
-    public void deletePersistentGroup(@NonNull Channel c, int netId,
-            @Nullable ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(DELETE_PERSISTENT_GROUP, netId, c.putListener(listener));
-    }
-
-    /**
-     * Request a list of all the persistent p2p groups stored in system.
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callback when persistent group info list is available. Can be null.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(anyOf = {
-            android.Manifest.permission.NETWORK_SETTINGS,
-            android.Manifest.permission.NETWORK_STACK,
-            android.Manifest.permission.READ_WIFI_CREDENTIAL
-    })
-    public void requestPersistentGroupInfo(@NonNull Channel c,
-            @Nullable PersistentGroupInfoListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(REQUEST_PERSISTENT_GROUP_INFO, 0, c.putListener(listener));
-    }
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = {"MIRACAST_"}, value = {
-            MIRACAST_DISABLED,
-            MIRACAST_SOURCE,
-            MIRACAST_SINK})
-    public @interface MiracastMode {}
-
-    /**
-     * Miracast is disabled.
-     * @hide
-     */
-    @SystemApi
-    public static final int MIRACAST_DISABLED = 0;
-    /**
-     * Device acts as a Miracast source.
-     * @hide
-     */
-    @SystemApi
-    public static final int MIRACAST_SOURCE   = 1;
-    /**
-     * Device acts as a Miracast sink.
-     * @hide
-     */
-    @SystemApi
-    public static final int MIRACAST_SINK     = 2;
-
-    /**
-     * This is used to provide information to drivers to optimize performance depending
-     * on the current mode of operation.
-     * {@link #MIRACAST_DISABLED} - disabled
-     * {@link #MIRACAST_SOURCE} - source operation
-     * {@link #MIRACAST_SINK} - sink operation
-     *
-     * As an example, the driver could reduce the channel dwell time during scanning
-     * when acting as a source or sink to minimize impact on Miracast.
-     *
-     * @param mode mode of operation. One of {@link #MIRACAST_DISABLED}, {@link #MIRACAST_SOURCE},
-     * or {@link #MIRACAST_SINK}
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.CONFIGURE_WIFI_DISPLAY)
-    public void setMiracastMode(@MiracastMode int mode) {
-        try {
-            mService.setMiracastMode(mode);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Get a reference to WifiP2pService handler. This is used to establish
-     * an AsyncChannel communication with WifiService
-     *
-     * @param binder A binder for the service to associate with this client.
-     *
-     * @return Messenger pointing to the WifiP2pService handler
-     * @hide
-     */
-    public Messenger getMessenger(Binder binder) {
-        try {
-            return mService.getMessenger(binder);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Get a reference to P2pStateMachine handler. This is used to establish
-     * a priveleged AsyncChannel communication with WifiP2pService.
-     *
-     * @return Messenger pointing to the WifiP2pService handler
-     * @hide
-     */
-    public Messenger getP2pStateMachineMessenger() {
-        try {
-            return mService.getP2pStateMachineMessenger();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Get a handover request message for use in WFA NFC Handover transfer.
-     * @hide
-     */
-    public void getNfcHandoverRequest(Channel c, HandoverMessageListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(GET_HANDOVER_REQUEST, 0, c.putListener(listener));
-    }
-
-
-    /**
-     * Get a handover select message for use in WFA NFC Handover transfer.
-     * @hide
-     */
-    public void getNfcHandoverSelect(Channel c, HandoverMessageListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(GET_HANDOVER_SELECT, 0, c.putListener(listener));
-    }
-
-    /**
-     * @hide
-     */
-    public void initiatorReportNfcHandover(Channel c, String handoverSelect,
-                                              ActionListener listener) {
-        checkChannel(c);
-        Bundle bundle = new Bundle();
-        bundle.putString(EXTRA_HANDOVER_MESSAGE, handoverSelect);
-        c.mAsyncChannel.sendMessage(INITIATOR_REPORT_NFC_HANDOVER, 0,
-                c.putListener(listener), bundle);
-    }
-
-
-    /**
-     * @hide
-     */
-    public void responderReportNfcHandover(Channel c, String handoverRequest,
-                                              ActionListener listener) {
-        checkChannel(c);
-        Bundle bundle = new Bundle();
-        bundle.putString(EXTRA_HANDOVER_MESSAGE, handoverRequest);
-        c.mAsyncChannel.sendMessage(RESPONDER_REPORT_NFC_HANDOVER, 0,
-                c.putListener(listener), bundle);
-    }
-
-    /**
-     * Removes all saved p2p groups.
-     *
-     * @param c is the channel created at {@link #initialize}.
-     * @param listener for callback on success or failure. Can be null.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS)
-    public void factoryReset(@NonNull Channel c, @Nullable ActionListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(FACTORY_RESET, 0, c.putListener(listener));
-    }
-
-    /**
-     * Request saved WifiP2pConfig which used for an ongoing peer connection
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param listener for callback when ongoing peer config updated. Can't be null.
-     *
-     * @hide
-     */
-    @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
-    public void requestOngoingPeerConfig(@NonNull Channel c,
-            @NonNull OngoingPeerInfoListener listener) {
-        checkChannel(c);
-        c.mAsyncChannel.sendMessage(REQUEST_ONGOING_PEER_CONFIG,
-                Binder.getCallingUid(), c.putListener(listener));
-    }
-
-     /**
-     * Set saved WifiP2pConfig which used for an ongoing peer connection
-     *
-     * @param c is the channel created at {@link #initialize}
-     * @param config used for change an ongoing peer connection
-     * @param listener for callback when ongoing peer config updated. Can be null.
-     *
-     * @hide
-     */
-    @RequiresPermission(android.Manifest.permission.NETWORK_STACK)
-    public void setOngoingPeerConfig(@NonNull Channel c, @NonNull WifiP2pConfig config,
-            @Nullable ActionListener listener) {
-        checkChannel(c);
-        checkP2pConfig(config);
-        c.mAsyncChannel.sendMessage(SET_ONGOING_PEER_CONFIG, 0,
-                c.putListener(listener), config);
-    }
-
-    /**
-     * Request p2p enabled state.
-     *
-     * <p> This state indicates whether Wi-Fi p2p is enabled or disabled.
-     * The valid value is one of {@link #WIFI_P2P_STATE_DISABLED} or
-     * {@link #WIFI_P2P_STATE_ENABLED}. The state is returned using the
-     * {@link P2pStateListener} listener.
-     *
-     * <p> This state is also included in the {@link #WIFI_P2P_STATE_CHANGED_ACTION}
-     * broadcast event with extra {@link #EXTRA_WIFI_STATE}.
-     *
-     * @param c is the channel created at {@link #initialize}.
-     * @param listener for callback when p2p state is available..
-     */
-    public void requestP2pState(@NonNull Channel c,
-            @NonNull P2pStateListener listener) {
-        checkChannel(c);
-        if (listener == null) throw new IllegalArgumentException("This listener cannot be null.");
-        c.mAsyncChannel.sendMessage(REQUEST_P2P_STATE, 0, c.putListener(listener));
-    }
-
-    /**
-     * Request p2p discovery state.
-     *
-     * <p> This state indicates whether p2p discovery has started or stopped.
-     * The valid value is one of {@link #WIFI_P2P_DISCOVERY_STARTED} or
-     * {@link #WIFI_P2P_DISCOVERY_STOPPED}. The state is returned using the
-     * {@link DiscoveryStateListener} listener.
-     *
-     * <p> This state is also included in the {@link #WIFI_P2P_DISCOVERY_CHANGED_ACTION}
-     * broadcast event with extra {@link #EXTRA_DISCOVERY_STATE}.
-     *
-     * @param c is the channel created at {@link #initialize}.
-     * @param listener for callback when discovery state is available..
-     */
-    public void requestDiscoveryState(@NonNull Channel c,
-            @NonNull DiscoveryStateListener listener) {
-        checkChannel(c);
-        if (listener == null) throw new IllegalArgumentException("This listener cannot be null.");
-        c.mAsyncChannel.sendMessage(REQUEST_DISCOVERY_STATE, 0, c.putListener(listener));
-    }
-
-    /**
-     * Request network info.
-     *
-     * <p> This method provides the network info in the form of a {@link android.net.NetworkInfo}.
-     * {@link android.net.NetworkInfo#isAvailable()} indicates the p2p availability and
-     * {@link android.net.NetworkInfo#getDetailedState()} reports the current fine-grained state
-     * of the network. This {@link android.net.NetworkInfo} is returned using the
-     * {@link NetworkInfoListener} listener.
-     *
-     * <p> This information is also included in the {@link #WIFI_P2P_CONNECTION_CHANGED_ACTION}
-     * broadcast event with extra {@link #EXTRA_NETWORK_INFO}.
-     *
-     * @param c is the channel created at {@link #initialize}.
-     * @param listener for callback when network info is available..
-     */
-    public void requestNetworkInfo(@NonNull Channel c,
-            @NonNull NetworkInfoListener listener) {
-        checkChannel(c);
-        if (listener == null) throw new IllegalArgumentException("This listener cannot be null.");
-        c.mAsyncChannel.sendMessage(REQUEST_NETWORK_INFO, 0, c.putListener(listener));
-    }
-
-     /**
-     * Request Device Info
-     *
-     * <p> This method provides the device info
-     * in the form of a {@link android.net.wifi.p2p.WifiP2pDevice}.
-     * Valid {@link android.net.wifi.p2p.WifiP2pDevice} is returned when p2p is enabled.
-     * To get information notifications on P2P getting enabled refers
-     * {@link #WIFI_P2P_STATE_ENABLED}.
-     *
-     * <p> This {@link android.net.wifi.p2p.WifiP2pDevice} is returned using the
-     * {@link DeviceInfoListener} listener.
-     *
-     * <p> {@link android.net.wifi.p2p.WifiP2pDevice#deviceAddress} is only available if the caller
-     * holds the {@code android.Manifest.permission#LOCAL_MAC_ADDRESS} permission, and holds the
-     * anonymized MAC address (02:00:00:00:00:00) otherwise.
-     *
-     * <p> This information is also included in the {@link #WIFI_P2P_THIS_DEVICE_CHANGED_ACTION}
-     * broadcast event with extra {@link #EXTRA_WIFI_P2P_DEVICE}.
-     *
-     * @param c is the channel created at {@link #initialize(Context, Looper, ChannelListener)}.
-     * @param listener for callback when network info is available.
-     */
-    @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION)
-    public void requestDeviceInfo(@NonNull Channel c, @NonNull DeviceInfoListener listener) {
-        checkChannel(c);
-        if (listener == null) throw new IllegalArgumentException("This listener cannot be null.");
-        c.mAsyncChannel.sendMessage(REQUEST_DEVICE_INFO, 0, c.putListener(listener));
-    }
-}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pProvDiscEvent.java b/wifi/java/android/net/wifi/p2p/WifiP2pProvDiscEvent.java
deleted file mode 100644
index d0fe92d..0000000
--- a/wifi/java/android/net/wifi/p2p/WifiP2pProvDiscEvent.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import android.compat.annotation.UnsupportedAppUsage;
-
-/**
- * A class representing a Wi-Fi p2p provisional discovery request/response
- * See {@link #WifiP2pProvDiscEvent} for supported types
- *
- * @hide
- */
-public class WifiP2pProvDiscEvent {
-
-    private static final String TAG = "WifiP2pProvDiscEvent";
-
-    public static final int PBC_REQ     = 1;
-    public static final int PBC_RSP     = 2;
-    public static final int ENTER_PIN   = 3;
-    public static final int SHOW_PIN    = 4;
-
-    /* One of PBC_REQ, PBC_RSP, ENTER_PIN or SHOW_PIN */
-    @UnsupportedAppUsage
-    public int event;
-
-    @UnsupportedAppUsage
-    public WifiP2pDevice device;
-
-    /* Valid when event = SHOW_PIN */
-    @UnsupportedAppUsage
-    public String pin;
-
-    @UnsupportedAppUsage
-    public WifiP2pProvDiscEvent() {
-        device = new WifiP2pDevice();
-    }
-
-    /**
-     * @param string formats supported include
-     *
-     *  P2P-PROV-DISC-PBC-REQ 42:fc:89:e1:e2:27
-     *  P2P-PROV-DISC-PBC-RESP 02:12:47:f2:5a:36
-     *  P2P-PROV-DISC-ENTER-PIN 42:fc:89:e1:e2:27
-     *  P2P-PROV-DISC-SHOW-PIN 42:fc:89:e1:e2:27 44490607
-     *
-     *  Note: The events formats can be looked up in the wpa_supplicant code
-     * @hide
-     */
-    public WifiP2pProvDiscEvent(String string) throws IllegalArgumentException {
-        String[] tokens = string.split(" ");
-
-        if (tokens.length < 2) {
-            throw new IllegalArgumentException("Malformed event " + string);
-        }
-
-        if (tokens[0].endsWith("PBC-REQ")) event = PBC_REQ;
-        else if (tokens[0].endsWith("PBC-RESP")) event = PBC_RSP;
-        else if (tokens[0].endsWith("ENTER-PIN")) event = ENTER_PIN;
-        else if (tokens[0].endsWith("SHOW-PIN")) event = SHOW_PIN;
-        else throw new IllegalArgumentException("Malformed event " + string);
-
-
-        device = new WifiP2pDevice();
-        device.deviceAddress = tokens[1];
-
-        if (event == SHOW_PIN) {
-            pin = tokens[2];
-        }
-    }
-
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append(device);
-        sbuf.append("\n event: ").append(event);
-        sbuf.append("\n pin: ").append(pin);
-        return sbuf.toString();
-    }
-}
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java b/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java
deleted file mode 100644
index e399b5b..0000000
--- a/wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import android.annotation.IntDef;
-import android.annotation.IntRange;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.compat.annotation.UnsupportedAppUsage;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Locale;
-
-/**
- * A class representing Wifi Display information for a device.
- *
- * See Wifi Display technical specification v1.0.0, section 5.1.2.
- */
-public final class WifiP2pWfdInfo implements Parcelable {
-
-    private boolean mEnabled;
-
-    /** Device information bitmap */
-    private int mDeviceInfo;
-
-    /** @hide */
-    @Retention(RetentionPolicy.SOURCE)
-    @IntDef(prefix = { "DEVICE_TYPE_" }, value = {
-            DEVICE_TYPE_WFD_SOURCE,
-            DEVICE_TYPE_PRIMARY_SINK,
-            DEVICE_TYPE_SECONDARY_SINK,
-            DEVICE_TYPE_SOURCE_OR_PRIMARY_SINK})
-    public @interface DeviceType {}
-
-    /** The device is a Wifi Display Source. */
-    public static final int DEVICE_TYPE_WFD_SOURCE = 0;
-    /** The device is a primary sink. */
-    public static final int DEVICE_TYPE_PRIMARY_SINK = 1;
-    /** The device is a secondary sink. */
-    public static final int DEVICE_TYPE_SECONDARY_SINK = 2;
-    /** The device is dual-role capable i.e. either a WFD source or a primary sink. */
-    public static final int DEVICE_TYPE_SOURCE_OR_PRIMARY_SINK = 3;
-
-    /**
-     * {@link #mDeviceInfo} & {@link #DEVICE_TYPE} is one of {@link #DEVICE_TYPE_WFD_SOURCE},
-     * {@link #DEVICE_TYPE_PRIMARY_SINK}, {@link #DEVICE_TYPE_SECONDARY_SINK} or
-     * {@link #DEVICE_TYPE_SOURCE_OR_PRIMARY_SINK}.
-     *
-     * The bit definition is listed in 5.1.2 WFD Device Information Subelement in
-     * Wi-Fi Display Technical Specification.
-     */
-    private static final int DEVICE_TYPE                            = 1 << 1 | 1 << 0;
-    private static final int COUPLED_SINK_SUPPORT_AT_SOURCE         = 1 << 2;
-    private static final int COUPLED_SINK_SUPPORT_AT_SINK           = 1 << 3;
-    private static final int SESSION_AVAILABLE_BIT1                 = 1 << 4;
-    private static final int SESSION_AVAILABLE_BIT2                 = 1 << 5;
-    private static final int SESSION_AVAILABLE                      =
-            SESSION_AVAILABLE_BIT2 | SESSION_AVAILABLE_BIT1;
-    /* The support of Content Protection using the HDCP system 2.0/2.1. */
-    private static final int CONTENT_PROTECTION_SUPPORT             = 1 << 8;
-
-    private int mCtrlPort;
-
-    private int mMaxThroughput;
-
-    /** Default constructor. */
-    public WifiP2pWfdInfo() {}
-
-    /** @hide */
-    @UnsupportedAppUsage
-    public WifiP2pWfdInfo(int devInfo, int ctrlPort, int maxTput) {
-        mEnabled = true;
-        mDeviceInfo = devInfo;
-        mCtrlPort = ctrlPort;
-        mMaxThroughput = maxTput;
-    }
-
-    /** Returns true is Wifi Display is enabled, false otherwise. */
-    public boolean isEnabled() {
-        return mEnabled;
-    }
-
-    /**
-     * Sets whether Wifi Display should be enabled.
-     *
-     * @param enabled true to enable Wifi Display, false to disable
-     */
-    public void setEnabled(boolean enabled) {
-        mEnabled = enabled;
-    }
-
-    /**
-     * Get the type of the device.
-     * One of {@link #DEVICE_TYPE_WFD_SOURCE}, {@link #DEVICE_TYPE_PRIMARY_SINK},
-     * {@link #DEVICE_TYPE_SECONDARY_SINK}, {@link #DEVICE_TYPE_SOURCE_OR_PRIMARY_SINK}
-     */
-    @DeviceType
-    public int getDeviceType() {
-        return mDeviceInfo & DEVICE_TYPE;
-    }
-
-    /**
-     * Sets the type of the device.
-     *
-     * @param deviceType One of {@link #DEVICE_TYPE_WFD_SOURCE}, {@link #DEVICE_TYPE_PRIMARY_SINK},
-     * {@link #DEVICE_TYPE_SECONDARY_SINK}, {@link #DEVICE_TYPE_SOURCE_OR_PRIMARY_SINK}
-     * @return true if the device type was successfully set, false otherwise
-     */
-    public boolean setDeviceType(@DeviceType int deviceType) {
-        if (DEVICE_TYPE_WFD_SOURCE <= deviceType
-                && deviceType <= DEVICE_TYPE_SOURCE_OR_PRIMARY_SINK) {
-            mDeviceInfo &= ~DEVICE_TYPE;
-            mDeviceInfo |= deviceType;
-            return true;
-        }
-        return false;
-    }
-
-    /** Returns true if a session is available, false otherwise. */
-    public boolean isSessionAvailable() {
-        return (mDeviceInfo & SESSION_AVAILABLE) != 0;
-    }
-
-    /**
-     * Sets whether a session is available.
-     *
-     * @param enabled true to indicate that a session is available, false otherwise.
-     */
-    public void setSessionAvailable(boolean enabled) {
-        if (enabled) {
-            mDeviceInfo |= SESSION_AVAILABLE_BIT1;
-            mDeviceInfo &= ~SESSION_AVAILABLE_BIT2;
-        } else {
-            mDeviceInfo &= ~SESSION_AVAILABLE;
-        }
-    }
-
-    /**
-     * @return true if Content Protection using the HDCP system 2.0/2.1 is supported.
-     */
-    public boolean isContentProtectionSupported() {
-        return (mDeviceInfo & CONTENT_PROTECTION_SUPPORT) != 0;
-    }
-
-    /**
-     * Sets whether Content Protection using the HDCP system 2.0/2.1 is supported.
-     *
-     * @param enabled true to indicate that Content Protection is supported, false otherwise.
-     */
-    public void setContentProtectionSupported(boolean enabled) {
-        if (enabled) {
-            mDeviceInfo |= CONTENT_PROTECTION_SUPPORT;
-        } else {
-            mDeviceInfo &= ~CONTENT_PROTECTION_SUPPORT;
-        }
-    }
-
-    /** Returns the TCP port at which the WFD Device listens for RTSP messages. */
-    public int getControlPort() {
-        return mCtrlPort;
-    }
-
-    /** Sets the TCP port at which the WFD Device listens for RTSP messages. */
-    public void setControlPort(@IntRange(from = 0) int port) {
-        mCtrlPort = port;
-    }
-
-    /** Sets the maximum average throughput capability of the WFD Device, in megabits/second. */
-    public void setMaxThroughput(@IntRange(from = 0) int maxThroughput) {
-        mMaxThroughput = maxThroughput;
-    }
-
-    /** Returns the maximum average throughput capability of the WFD Device, in megabits/second. */
-    public int getMaxThroughput() {
-        return mMaxThroughput;
-    }
-
-    /** @hide */
-    public String getDeviceInfoHex() {
-        return String.format(
-                Locale.US, "%04x%04x%04x", mDeviceInfo, mCtrlPort, mMaxThroughput);
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append("WFD enabled: ").append(mEnabled);
-        sbuf.append("WFD DeviceInfo: ").append(mDeviceInfo);
-        sbuf.append("\n WFD CtrlPort: ").append(mCtrlPort);
-        sbuf.append("\n WFD MaxThroughput: ").append(mMaxThroughput);
-        return sbuf.toString();
-    }
-
-    /** Implement the Parcelable interface */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Copy constructor. */
-    public WifiP2pWfdInfo(@Nullable WifiP2pWfdInfo source) {
-        if (source != null) {
-            mEnabled = source.mEnabled;
-            mDeviceInfo = source.mDeviceInfo;
-            mCtrlPort = source.mCtrlPort;
-            mMaxThroughput = source.mMaxThroughput;
-        }
-    }
-
-    /** Implement the Parcelable interface */
-    @Override
-    public void writeToParcel(@NonNull Parcel dest, int flags) {
-        dest.writeInt(mEnabled ? 1 : 0);
-        dest.writeInt(mDeviceInfo);
-        dest.writeInt(mCtrlPort);
-        dest.writeInt(mMaxThroughput);
-    }
-
-    private void readFromParcel(Parcel in) {
-        mEnabled = (in.readInt() == 1);
-        mDeviceInfo = in.readInt();
-        mCtrlPort = in.readInt();
-        mMaxThroughput = in.readInt();
-    }
-
-    /** Implement the Parcelable interface */
-    public static final @NonNull Creator<WifiP2pWfdInfo> CREATOR =
-        new Creator<WifiP2pWfdInfo>() {
-            public WifiP2pWfdInfo createFromParcel(Parcel in) {
-                WifiP2pWfdInfo device = new WifiP2pWfdInfo();
-                device.readFromParcel(in);
-                return device;
-            }
-
-            public WifiP2pWfdInfo[] newArray(int size) {
-                return new WifiP2pWfdInfo[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo.java
deleted file mode 100644
index dad431c1..0000000
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo.java
+++ /dev/null
@@ -1,236 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import android.compat.annotation.UnsupportedAppUsage;
-import android.net.util.nsd.DnsSdTxtRecord;
-import android.os.Build;
-import android.text.TextUtils;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * A class for storing Bonjour service information that is advertised
- * over a Wi-Fi peer-to-peer setup.
- *
- * {@see android.net.wifi.p2p.WifiP2pManager#addLocalService}
- * {@see android.net.wifi.p2p.WifiP2pManager#removeLocalService}
- * {@see WifiP2pServiceInfo}
- * {@see WifiP2pUpnpServiceInfo}
- */
-public class WifiP2pDnsSdServiceInfo extends WifiP2pServiceInfo {
-
-    /**
-     * Bonjour version 1.
-     * @hide
-     */
-    public static final int VERSION_1 = 0x01;
-
-    /**
-     * Pointer record.
-     * @hide
-     */
-    public static final int DNS_TYPE_PTR = 12;
-
-    /**
-     * Text record.
-     * @hide
-     */
-    public static final int DNS_TYPE_TXT = 16;
-
-    /**
-     * virtual memory packet.
-     * see E.3 of the Wi-Fi Direct technical specification for the detail.<br>
-     * Key: domain name Value: pointer address.<br>
-     */
-    private final static Map<String, String> sVmPacket;
-
-    static {
-        sVmPacket = new HashMap<String, String>();
-        sVmPacket.put("_tcp.local.", "c00c");
-        sVmPacket.put("local.", "c011");
-        sVmPacket.put("_udp.local.", "c01c");
-    }
-
-    /**
-     * This constructor is only used in newInstance().
-     *
-     * @param queryList
-     */
-    private WifiP2pDnsSdServiceInfo(List<String> queryList) {
-        super(queryList);
-    }
-
-    /**
-     * Create a Bonjour service information object.
-     *
-     * @param instanceName instance name.<br>
-     *  e.g) "MyPrinter"
-     * @param serviceType service type.<br>
-     *  e.g) "_ipp._tcp"
-     * @param txtMap TXT record with key/value pair in a map confirming to format defined at
-     * http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt
-     * @return Bonjour service information object
-     */
-    public static WifiP2pDnsSdServiceInfo newInstance(String instanceName,
-            String serviceType, Map<String, String> txtMap) {
-        if (TextUtils.isEmpty(instanceName) || TextUtils.isEmpty(serviceType)) {
-            throw new IllegalArgumentException(
-                    "instance name or service type cannot be empty");
-        }
-
-        DnsSdTxtRecord txtRecord = new DnsSdTxtRecord();
-        if (txtMap != null) {
-            for (String key : txtMap.keySet()) {
-                txtRecord.set(key, txtMap.get(key));
-            }
-        }
-
-        ArrayList<String> queries = new ArrayList<String>();
-        queries.add(createPtrServiceQuery(instanceName, serviceType));
-        queries.add(createTxtServiceQuery(instanceName, serviceType, txtRecord));
-
-        return new WifiP2pDnsSdServiceInfo(queries);
-    }
-
-    /**
-     * Create wpa_supplicant service query for PTR record.
-     *
-     * @param instanceName instance name.<br>
-     *  e.g) "MyPrinter"
-     * @param serviceType service type.<br>
-     *  e.g) "_ipp._tcp"
-     * @return wpa_supplicant service query.
-     */
-    private static String createPtrServiceQuery(String instanceName,
-            String serviceType) {
-
-        StringBuffer sb = new StringBuffer();
-        sb.append("bonjour ");
-        sb.append(createRequest(serviceType + ".local.", DNS_TYPE_PTR, VERSION_1));
-        sb.append(" ");
-
-        byte[] data = instanceName.getBytes();
-        sb.append(String.format(Locale.US, "%02x", data.length));
-        sb.append(WifiP2pServiceInfo.bin2HexStr(data));
-        // This is the start point of this response.
-        // Therefore, it indicates the request domain name.
-        sb.append("c027");
-        return sb.toString();
-    }
-
-    /**
-     * Create wpa_supplicant service query for TXT record.
-     *
-     * @param instanceName instance name.<br>
-     *  e.g) "MyPrinter"
-     * @param serviceType service type.<br>
-     *  e.g) "_ipp._tcp"
-     * @param txtRecord TXT record.<br>
-     * @return wpa_supplicant service query.
-     */
-    private static String createTxtServiceQuery(String instanceName,
-            String serviceType,
-            DnsSdTxtRecord txtRecord) {
-
-
-        StringBuffer sb = new StringBuffer();
-        sb.append("bonjour ");
-
-        sb.append(createRequest((instanceName + "." + serviceType + ".local."),
-                DNS_TYPE_TXT, VERSION_1));
-        sb.append(" ");
-        byte[] rawData = txtRecord.getRawData();
-        if (rawData.length == 0) {
-            sb.append("00");
-        } else {
-            sb.append(bin2HexStr(rawData));
-        }
-        return sb.toString();
-    }
-
-    /**
-     * Create bonjour service discovery request.
-     *
-     * @param dnsName dns name
-     * @param dnsType dns type
-     * @param version version number
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
-    static String createRequest(String dnsName, int dnsType, int version) {
-        StringBuffer sb = new StringBuffer();
-
-        /*
-         * The request format is as follows.
-         * ________________________________________________
-         * |  Encoded and Compressed dns name (variable)  |
-         * ________________________________________________
-         * |   Type (2)           | Version (1) |
-         */
-        if (dnsType == WifiP2pDnsSdServiceInfo.DNS_TYPE_TXT) {
-            dnsName = dnsName.toLowerCase(Locale.ROOT); // TODO: is this right?
-        }
-        sb.append(compressDnsName(dnsName));
-        sb.append(String.format(Locale.US, "%04x", dnsType));
-        sb.append(String.format(Locale.US, "%02x", version));
-
-        return sb.toString();
-    }
-
-    /**
-     * Compress DNS data.
-     *
-     * see E.3 of the Wi-Fi Direct technical specification for the detail.
-     *
-     * @param dnsName dns name
-     * @return compressed dns name
-     */
-    private static String compressDnsName(String dnsName) {
-        StringBuffer sb = new StringBuffer();
-
-        // The domain name is replaced with a pointer to a prior
-        // occurrence of the same name in virtual memory packet.
-        while (true) {
-            String data = sVmPacket.get(dnsName);
-            if (data != null) {
-                sb.append(data);
-                break;
-            }
-            int i = dnsName.indexOf('.');
-            if (i == -1) {
-                if (dnsName.length() > 0) {
-                    sb.append(String.format(Locale.US, "%02x", dnsName.length()));
-                    sb.append(WifiP2pServiceInfo.bin2HexStr(dnsName.getBytes()));
-                }
-                // for a sequence of labels ending in a zero octet
-                sb.append("00");
-                break;
-            }
-
-            String name = dnsName.substring(0, i);
-            dnsName = dnsName.substring(i + 1);
-            sb.append(String.format(Locale.US, "%02x", name.length()));
-            sb.append(WifiP2pServiceInfo.bin2HexStr(name.getBytes()));
-        }
-        return sb.toString();
-    }
-}
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest.java
deleted file mode 100644
index d5415e0..0000000
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import android.net.wifi.p2p.WifiP2pManager;
-
-/**
- * A class for creating a Bonjour service discovery request for use with
- * {@link WifiP2pManager#addServiceRequest} and {@link WifiP2pManager#removeServiceRequest}
- *
- * {@see WifiP2pManager}
- * {@see WifiP2pServiceRequest}
- * {@see WifiP2pUpnpServiceRequest}
- */
-public class WifiP2pDnsSdServiceRequest extends WifiP2pServiceRequest {
-
-    /**
-     * This constructor is only used in newInstance().
-     *
-     * @param query The part of service specific query.
-     * @hide
-     */
-    private WifiP2pDnsSdServiceRequest(String query) {
-        super(WifiP2pServiceInfo.SERVICE_TYPE_BONJOUR, query);
-    }
-
-    /**
-     * This constructor is only used in newInstance().
-     * @hide
-     */
-    private WifiP2pDnsSdServiceRequest() {
-        super(WifiP2pServiceInfo.SERVICE_TYPE_BONJOUR, null);
-    }
-
-    private WifiP2pDnsSdServiceRequest(String dnsQuery, int dnsType, int version) {
-        super(WifiP2pServiceInfo.SERVICE_TYPE_BONJOUR, WifiP2pDnsSdServiceInfo.createRequest(
-                dnsQuery,
-                dnsType,
-                version));
-    }
-
-    /**
-     * Create a service discovery request to search all Bonjour services.
-     *
-     * @return service request for Bonjour.
-     */
-    public static WifiP2pDnsSdServiceRequest newInstance() {
-        return new WifiP2pDnsSdServiceRequest();
-    }
-
-    /**
-     * Create a service discovery to search for Bonjour services with the specified
-     * service type.
-     *
-     * @param serviceType service type. Cannot be null <br>
-     *  "_afpovertcp._tcp."(Apple File Sharing over TCP)<br>
-     *  "_ipp._tcp" (IP Printing over TCP)<br>
-     *  "_http._tcp" (http service)
-     * @return service request for DnsSd.
-     */
-    public static WifiP2pDnsSdServiceRequest newInstance(String serviceType) {
-        if (serviceType == null) {
-            throw new IllegalArgumentException("service type cannot be null");
-        }
-        return new WifiP2pDnsSdServiceRequest(serviceType + ".local.",
-                WifiP2pDnsSdServiceInfo.DNS_TYPE_PTR,
-                WifiP2pDnsSdServiceInfo.VERSION_1);
-    }
-
-    /**
-     * Create a service discovery request to get the TXT data from the specified
-     * Bonjour service.
-     *
-     * @param instanceName instance name. Cannot be null. <br>
-     *  "MyPrinter"
-     * @param serviceType service type. Cannot be null. <br>
-     * e.g) <br>
-     *  "_afpovertcp._tcp"(Apple File Sharing over TCP)<br>
-     *  "_ipp._tcp" (IP Printing over TCP)<br>
-     * @return service request for Bonjour.
-     */
-    public static WifiP2pDnsSdServiceRequest newInstance(String instanceName,
-            String serviceType) {
-        if (instanceName == null || serviceType == null) {
-            throw new IllegalArgumentException(
-                    "instance name or service type cannot be null");
-        }
-        String fullDomainName = instanceName + "." + serviceType + ".local.";
-        return new WifiP2pDnsSdServiceRequest(fullDomainName,
-                WifiP2pDnsSdServiceInfo.DNS_TYPE_TXT,
-                WifiP2pDnsSdServiceInfo.VERSION_1);
-    }
-}
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse.java
deleted file mode 100644
index ed84a1a..0000000
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse.java
+++ /dev/null
@@ -1,309 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import android.net.wifi.p2p.WifiP2pDevice;
-
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A class for a response of bonjour service discovery.
- *
- * @hide
- */
-public class WifiP2pDnsSdServiceResponse extends WifiP2pServiceResponse {
-
-    /**
-     * DNS query name.
-     * e.g)
-     * for PTR
-     * "_ipp._tcp.local."
-     * for TXT
-     * "MyPrinter._ipp._tcp.local."
-     */
-    private String mDnsQueryName;
-
-    /**
-     * Service instance name.
-     * e.g) "MyPrinter"
-     * This field is only used when the dns type equals to
-     * {@link WifiP2pDnsSdServiceInfo#DNS_TYPE_PTR}.
-     */
-    private String mInstanceName;
-
-    /**
-     * DNS Type.
-     * Should be {@link WifiP2pDnsSdServiceInfo#DNS_TYPE_PTR} or
-     * {@link WifiP2pDnsSdServiceInfo#DNS_TYPE_TXT}.
-     */
-    private int mDnsType;
-
-    /**
-     * DnsSd version number.
-     * Should be {@link WifiP2pDnsSdServiceInfo#VERSION_1}.
-     */
-    private int mVersion;
-
-    /**
-     * Txt record.
-     * This field is only used when the dns type equals to
-     * {@link WifiP2pDnsSdServiceInfo#DNS_TYPE_TXT}.
-     */
-    private final HashMap<String, String> mTxtRecord = new HashMap<String, String>();
-
-    /**
-     * Virtual memory packet.
-     * see E.3 of the Wi-Fi Direct technical specification for the detail.<br>
-     * The spec can be obtained from wi-fi.org
-     * Key: pointer Value: domain name.<br>
-     */
-    private final static Map<Integer, String> sVmpack;
-
-    static {
-        sVmpack = new HashMap<Integer, String>();
-        sVmpack.put(0x0c, "_tcp.local.");
-        sVmpack.put(0x11, "local.");
-        sVmpack.put(0x1c, "_udp.local.");
-    }
-
-    /**
-     * Returns query DNS name.
-     * @return DNS name.
-     */
-    public String getDnsQueryName() {
-        return mDnsQueryName;
-    }
-
-    /**
-     * Return query DNS type.
-     * @return DNS type.
-     */
-    public int getDnsType() {
-        return mDnsType;
-    }
-
-    /**
-     * Return bonjour version number.
-     * @return version number.
-     */
-    public int getVersion() {
-        return mVersion;
-    }
-
-    /**
-     * Return instance name.
-     * @return
-     */
-    public String getInstanceName() {
-        return mInstanceName;
-    }
-
-    /**
-     * Return TXT record data.
-     * @return TXT record data.
-     */
-    public Map<String, String> getTxtRecord() {
-        return mTxtRecord;
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append("serviceType:DnsSd(").append(mServiceType).append(")");
-        sbuf.append(" status:").append(Status.toString(mStatus));
-        sbuf.append(" srcAddr:").append(mDevice.deviceAddress);
-        sbuf.append(" version:").append(String.format("%02x", mVersion));
-        sbuf.append(" dnsName:").append(mDnsQueryName);
-        sbuf.append(" TxtRecord:");
-        for (String key : mTxtRecord.keySet()) {
-            sbuf.append(" key:").append(key).append(" value:").append(mTxtRecord.get(key));
-        }
-        if (mInstanceName != null) {
-            sbuf.append(" InsName:").append(mInstanceName);
-        }
-        return sbuf.toString();
-    }
-
-    /**
-     * This is only used in framework.
-     * @param status status code.
-     * @param dev source device.
-     * @param data RDATA.
-     * @hide
-     */
-    protected WifiP2pDnsSdServiceResponse(int status,
-            int tranId, WifiP2pDevice dev, byte[] data) {
-        super(WifiP2pServiceInfo.SERVICE_TYPE_BONJOUR,
-                status, tranId, dev, data);
-        if (!parse()) {
-            throw new IllegalArgumentException("Malformed bonjour service response");
-        }
-    }
-
-    /**
-     * Parse DnsSd service discovery response.
-     *
-     * @return {@code true} if the operation succeeded
-     */
-    private boolean parse() {
-        /*
-         * The data format from Wi-Fi Direct spec is as follows.
-         * ________________________________________________
-         * |  encoded and compressed dns name (variable)  |
-         * ________________________________________________
-         * |       dnstype(2byte)      |  version(1byte)  |
-         * ________________________________________________
-         * |              RDATA (variable)                |
-         */
-        if (mData == null) {
-            // the empty is OK.
-            return true;
-        }
-
-        DataInputStream dis = new DataInputStream(new ByteArrayInputStream(mData));
-
-        mDnsQueryName = readDnsName(dis);
-        if (mDnsQueryName == null) {
-            return false;
-        }
-
-        try {
-            mDnsType = dis.readUnsignedShort();
-            mVersion = dis.readUnsignedByte();
-        } catch (IOException e) {
-            e.printStackTrace();
-            return false;
-        }
-
-        if (mDnsType == WifiP2pDnsSdServiceInfo.DNS_TYPE_PTR) {
-            String rData = readDnsName(dis);
-            if (rData == null) {
-                return false;
-            }
-            if (rData.length() <= mDnsQueryName.length()) {
-                return false;
-            }
-
-            mInstanceName = rData.substring(0,
-                    rData.length() - mDnsQueryName.length() -1);
-        } else if (mDnsType == WifiP2pDnsSdServiceInfo.DNS_TYPE_TXT) {
-            return readTxtData(dis);
-        } else {
-            return false;
-        }
-
-        return true;
-    }
-
-    /**
-     * Read dns name.
-     *
-     * @param dis data input stream.
-     * @return dns name
-     */
-    private String readDnsName(DataInputStream dis) {
-        StringBuffer sb = new StringBuffer();
-
-        // copy virtual memory packet.
-        HashMap<Integer, String> vmpack = new HashMap<Integer, String>(sVmpack);
-        if (mDnsQueryName != null) {
-            vmpack.put(0x27, mDnsQueryName);
-        }
-        try {
-            while (true) {
-                int i = dis.readUnsignedByte();
-                if (i == 0x00) {
-                    return sb.toString();
-                } else if (i == 0xc0) {
-                    // refer to pointer.
-                    String ref = vmpack.get(dis.readUnsignedByte());
-                    if (ref == null) {
-                        //invalid.
-                        return null;
-                    }
-                    sb.append(ref);
-                    return sb.toString();
-                } else {
-                    byte[] data = new byte[i];
-                    dis.readFully(data);
-                    sb.append(new String(data));
-                    sb.append(".");
-                }
-            }
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-
-    /**
-     * Read TXT record data.
-     *
-     * @param dis
-     * @return true if TXT data is valid
-     */
-    private boolean readTxtData(DataInputStream dis) {
-        try {
-            while (dis.available() > 0) {
-                int len = dis.readUnsignedByte();
-                if (len == 0) {
-                    break;
-                }
-                byte[] data = new byte[len];
-                dis.readFully(data);
-                String[] keyVal = new String(data).split("=");
-                if (keyVal.length != 2) {
-                    return false;
-                }
-                mTxtRecord.put(keyVal[0], keyVal[1]);
-            }
-            return true;
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-        return false;
-    }
-
-    /**
-     * Creates DnsSd service response.
-     *  This is only called from WifiP2pServiceResponse
-     *
-     * @param status status code.
-     * @param dev source device.
-     * @param data DnsSd response data.
-     * @return DnsSd service response data.
-     * @hide
-     */
-    static WifiP2pDnsSdServiceResponse newInstance(int status,
-            int transId, WifiP2pDevice dev, byte[] data) {
-        if (status != WifiP2pServiceResponse.Status.SUCCESS) {
-            return new WifiP2pDnsSdServiceResponse(status,
-                    transId, dev, null);
-        }
-        try {
-            return new WifiP2pDnsSdServiceResponse(status,
-                    transId, dev, data);
-        } catch (IllegalArgumentException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-}
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceInfo.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceInfo.java
deleted file mode 100644
index 5d018e7..0000000
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceInfo.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import android.compat.annotation.UnsupportedAppUsage;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A class for storing service information that is advertised
- * over a Wi-Fi peer-to-peer setup
- *
- * @see WifiP2pUpnpServiceInfo
- * @see WifiP2pDnsSdServiceInfo
- */
-public class WifiP2pServiceInfo implements Parcelable {
-
-    /**
-     * All service protocol types.
-     */
-    public static final int SERVICE_TYPE_ALL             = 0;
-
-    /**
-     * DNS based service discovery protocol.
-     */
-    public static final int SERVICE_TYPE_BONJOUR         = 1;
-
-    /**
-     * UPnP protocol.
-     */
-    public static final int SERVICE_TYPE_UPNP            = 2;
-
-    /**
-     * WS-Discovery protocol
-     * @hide
-     */
-    public static final int SERVICE_TYPE_WS_DISCOVERY    = 3;
-
-    /**
-     * Vendor Specific protocol
-     */
-    public static final int SERVICE_TYPE_VENDOR_SPECIFIC = 255;
-
-    /**
-     * the list of query string for wpa_supplicant
-     *
-     * e.g)
-     * # IP Printing over TCP (PTR) (RDATA=MyPrinter._ipp._tcp.local.)
-     * {"bonjour", "045f697070c00c000c01", "094d795072696e746572c027"
-     *
-     * # IP Printing over TCP (TXT) (RDATA=txtvers=1,pdl=application/postscript)
-     * {"bonjour", "096d797072696e746572045f697070c00c001001",
-     *  "09747874766572733d311a70646c3d6170706c69636174696f6e2f706f7374736372797074"}
-     *
-     * [UPnP]
-     * # UPnP uuid
-     * {"upnp", "10", "uuid:6859dede-8574-59ab-9332-123456789012"}
-     *
-     * # UPnP rootdevice
-     * {"upnp", "10", "uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"}
-     *
-     * # UPnP device
-     * {"upnp", "10", "uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp
-     * -org:device:InternetGatewayDevice:1"}
-     *
-     *  # UPnP service
-     * {"upnp", "10", "uuid:6859dede-8574-59ab-9322-123456789012::urn:schemas-upnp
-     * -org:service:ContentDirectory:2"}
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
-    private List<String> mQueryList;
-
-    /**
-     * This is only used in subclass.
-     *
-     * @param queryList query string for wpa_supplicant
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
-    protected WifiP2pServiceInfo(List<String> queryList) {
-        if (queryList == null) {
-            throw new IllegalArgumentException("query list cannot be null");
-        }
-        mQueryList = queryList;
-    }
-
-   /**
-    * Return the list of the query string for wpa_supplicant.
-    *
-    * @return the list of the query string for wpa_supplicant.
-    * @hide
-    */
-   public List<String> getSupplicantQueryList() {
-       return mQueryList;
-   }
-
-   /**
-    * Converts byte array to hex string.
-    *
-    * @param data
-    * @return hex string.
-    * @hide
-    */
-   static String bin2HexStr(byte[] data) {
-       StringBuffer sb = new StringBuffer();
-
-       for (byte b: data) {
-           String s = null;
-           try {
-               s = Integer.toHexString(b & 0xff);
-           } catch (Exception e) {
-               e.printStackTrace();
-               return null;
-           }
-           //add 0 padding
-           if (s.length() == 1) {
-               sb.append('0');
-           }
-           sb.append(s);
-       }
-       return sb.toString();
-   }
-
-   @Override
-   public boolean equals(Object o) {
-       if (o == this) {
-           return true;
-       }
-       if (!(o instanceof WifiP2pServiceInfo)) {
-           return false;
-       }
-
-       WifiP2pServiceInfo servInfo = (WifiP2pServiceInfo)o;
-       return  mQueryList.equals(servInfo.mQueryList);
-   }
-
-   @Override
-   public int hashCode() {
-       int result = 17;
-       result = 31 * result + (mQueryList == null ? 0 : mQueryList.hashCode());
-       return result;
-   }
-
-    /** Implement the Parcelable interface {@hide} */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeStringList(mQueryList);
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final @android.annotation.NonNull Creator<WifiP2pServiceInfo> CREATOR =
-        new Creator<WifiP2pServiceInfo>() {
-            public WifiP2pServiceInfo createFromParcel(Parcel in) {
-
-                List<String> data = new ArrayList<String>();
-                in.readStringList(data);
-                return new WifiP2pServiceInfo(data);
-            }
-
-            public WifiP2pServiceInfo[] newArray(int size) {
-                return new WifiP2pServiceInfo[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceRequest.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceRequest.java
deleted file mode 100644
index dea0477..0000000
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceRequest.java
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import android.compat.annotation.UnsupportedAppUsage;
-import android.net.wifi.p2p.WifiP2pManager;
-import android.os.Build;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.Locale;
-
-/**
- * A class for creating a service discovery request for use with
- * {@link WifiP2pManager#addServiceRequest} and {@link WifiP2pManager#removeServiceRequest}
- *
- * <p>This class is used to create service discovery request for custom
- * vendor specific service discovery protocol {@link WifiP2pServiceInfo#SERVICE_TYPE_VENDOR_SPECIFIC}
- * or to search all service protocols {@link WifiP2pServiceInfo#SERVICE_TYPE_ALL}.
- *
- * <p>For the purpose of creating a UPnP or Bonjour service request, use
- * {@link WifiP2pUpnpServiceRequest} or {@link WifiP2pDnsSdServiceRequest} respectively.
- *
- * {@see WifiP2pManager}
- * {@see WifiP2pUpnpServiceRequest}
- * {@see WifiP2pDnsSdServiceRequest}
- */
-public class WifiP2pServiceRequest implements Parcelable {
-
-    /**
-     * Service discovery protocol. It's defined in table63 in Wi-Fi Direct specification.
-     */
-    private int mProtocolType;
-
-    /**
-     * The length of the service request TLV.
-     * The value is equal to 2 plus the number of octets in the
-     * query data field.
-     */
-    private int mLength;
-
-    /**
-     * Service transaction ID.
-     * This is a nonzero value used to match the service request/response TLVs.
-     */
-    private int mTransId;
-
-    /**
-     * The hex dump string of query data for the requested service information.
-     *
-     * e.g) DnsSd apple file sharing over tcp (dns name=_afpovertcp._tcp.local.)
-     * 0b5f6166706f766572746370c00c000c01
-     */
-    private String mQuery;
-
-    /**
-     * This constructor is only used in newInstance().
-     *
-     * @param protocolType service discovery protocol.
-     * @param query The part of service specific query.
-     * @hide
-     */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 115609023)
-    protected WifiP2pServiceRequest(int protocolType, String query) {
-        validateQuery(query);
-
-        mProtocolType = protocolType;
-        mQuery = query;
-        if (query != null) {
-            mLength = query.length()/2 + 2;
-        } else {
-            mLength = 2;
-        }
-    }
-
-    /**
-     * This constructor is only used in Parcelable.
-     *
-     * @param serviceType service discovery type.
-     * @param length the length of service discovery packet.
-     * @param transId the transaction id
-     * @param query The part of service specific query.
-     */
-    private WifiP2pServiceRequest(int serviceType, int length,
-            int transId, String query) {
-        mProtocolType = serviceType;
-        mLength = length;
-        mTransId = transId;
-        mQuery = query;
-    }
-
-    /**
-     * Return transaction id.
-     *
-     * @return transaction id
-     * @hide
-     */
-    public int getTransactionId() {
-        return mTransId;
-    }
-
-    /**
-     * Set transaction id.
-     *
-     * @param id
-     * @hide
-     */
-    public void setTransactionId(int id) {
-        mTransId = id;
-    }
-
-    /**
-     * Return wpa_supplicant request string.
-     *
-     * The format is the hex dump of the following frame.
-     * <pre>
-     * _______________________________________________________________
-     * |        Length (2)        |   Type (1)   | Transaction ID (1) |
-     * |                  Query Data (variable)                       |
-     * </pre>
-     *
-     * @return wpa_supplicant request string.
-     * @hide
-     */
-    public String getSupplicantQuery() {
-        StringBuffer sb = new StringBuffer();
-        // length is retained as little endian format.
-        sb.append(String.format(Locale.US, "%02x", (mLength) & 0xff));
-        sb.append(String.format(Locale.US, "%02x", (mLength >> 8) & 0xff));
-        sb.append(String.format(Locale.US, "%02x", mProtocolType));
-        sb.append(String.format(Locale.US, "%02x", mTransId));
-        if (mQuery != null) {
-            sb.append(mQuery);
-        }
-
-        return sb.toString();
-    }
-
-    /**
-     * Validate query.
-     *
-     * <p>If invalid, throw IllegalArgumentException.
-     * @param query The part of service specific query.
-     */
-    private void validateQuery(String query) {
-        if (query == null) {
-            return;
-        }
-
-        int UNSIGNED_SHORT_MAX = 0xffff;
-        if (query.length()%2 == 1) {
-            throw new IllegalArgumentException(
-                    "query size is invalid. query=" + query);
-        }
-        if (query.length()/2 > UNSIGNED_SHORT_MAX) {
-            throw new IllegalArgumentException(
-                    "query size is too large. len=" + query.length());
-        }
-
-        // check whether query is hex string.
-        query = query.toLowerCase(Locale.ROOT);
-        char[] chars = query.toCharArray();
-        for (char c: chars) {
-            if (!((c >= '0' && c <= '9') ||
-                    (c >= 'a' && c <= 'f'))){
-                throw new IllegalArgumentException(
-                        "query should be hex string. query=" + query);
-            }
-        }
-    }
-
-    /**
-     * Create a service discovery request.
-     *
-     * @param protocolType can be {@link WifiP2pServiceInfo#SERVICE_TYPE_ALL}
-     * or {@link WifiP2pServiceInfo#SERVICE_TYPE_VENDOR_SPECIFIC}.
-     * In order to create a UPnP or Bonjour service request, use
-     * {@link WifiP2pUpnpServiceRequest} or {@link WifiP2pDnsSdServiceRequest}
-     * respectively
-     *
-     * @param queryData hex string that is vendor specific.  Can be null.
-     * @return service discovery request.
-     */
-    public static WifiP2pServiceRequest newInstance(int protocolType, String queryData) {
-        return new WifiP2pServiceRequest(protocolType, queryData);
-    }
-
-    /**
-     * Create a service discovery request.
-     *
-     * @param protocolType can be {@link WifiP2pServiceInfo#SERVICE_TYPE_ALL}
-     * or {@link WifiP2pServiceInfo#SERVICE_TYPE_VENDOR_SPECIFIC}.
-     * In order to create a UPnP or Bonjour service request, use
-     * {@link WifiP2pUpnpServiceRequest} or {@link WifiP2pDnsSdServiceRequest}
-     * respectively
-     *
-     * @return service discovery request.
-     */
-    public static WifiP2pServiceRequest newInstance(int protocolType ) {
-        return new WifiP2pServiceRequest(protocolType, null);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o == this) {
-            return true;
-        }
-        if (!(o instanceof WifiP2pServiceRequest)) {
-            return false;
-        }
-
-        WifiP2pServiceRequest req = (WifiP2pServiceRequest)o;
-
-        /*
-         * Not compare transaction id.
-         * Transaction id may be changed on each service discovery operation.
-         */
-        if ((req.mProtocolType != mProtocolType) ||
-                (req.mLength != mLength)) {
-            return false;
-        }
-
-        if (req.mQuery == null && mQuery == null) {
-            return true;
-        } else if (req.mQuery != null) {
-            return req.mQuery.equals(mQuery);
-        }
-        return false;
-   }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 31 * result + mProtocolType;
-        result = 31 * result + mLength;
-        result = 31 * result + (mQuery == null ? 0 : mQuery.hashCode());
-        return result;
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mProtocolType);
-        dest.writeInt(mLength);
-        dest.writeInt(mTransId);
-        dest.writeString(mQuery);
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
-    public static final @android.annotation.NonNull Creator<WifiP2pServiceRequest> CREATOR =
-        new Creator<WifiP2pServiceRequest>() {
-            public WifiP2pServiceRequest createFromParcel(Parcel in) {
-                int servType = in.readInt();
-                int length = in.readInt();
-                int transId = in.readInt();
-                String query = in.readString();
-                return new WifiP2pServiceRequest(servType, length, transId, query);
-            }
-
-            public WifiP2pServiceRequest[] newArray(int size) {
-                return new WifiP2pServiceRequest[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
deleted file mode 100644
index 1b9c080..0000000
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java
+++ /dev/null
@@ -1,381 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import android.net.wifi.p2p.WifiP2pDevice;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.io.ByteArrayInputStream;
-import java.io.DataInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * The class for a response of service discovery.
- *
- * @hide
- */
-public class WifiP2pServiceResponse implements Parcelable {
-
-    private static int MAX_BUF_SIZE = 1024;
-
-    /**
-     * Service type. It's defined in table63 in Wi-Fi Direct specification.
-     */
-    protected int mServiceType;
-
-    /**
-     * Status code of service discovery response.
-     * It's defined in table65 in Wi-Fi Direct specification.
-     * @see Status
-     */
-    protected int mStatus;
-
-    /**
-     * Service transaction ID.
-     * This is a nonzero value used to match the service request/response TLVs.
-     */
-    protected int mTransId;
-
-    /**
-     * Source device.
-     */
-    protected WifiP2pDevice mDevice;
-
-    /**
-     * Service discovery response data based on the requested on
-     * the service protocol type. The protocol format depends on the service type.
-     */
-    protected byte[] mData;
-
-
-    /**
-     * The status code of service discovery response.
-     * Currently 4 status codes are defined and the status codes from  4 to 255
-     * are reserved.
-     *
-     * See Wi-Fi Direct specification for the detail.
-     */
-    public static class Status {
-        /** success */
-        public static final int SUCCESS = 0;
-
-        /** the service protocol type is not available */
-        public static final int SERVICE_PROTOCOL_NOT_AVAILABLE = 1;
-
-        /** the requested information is not available */
-        public static final int REQUESTED_INFORMATION_NOT_AVAILABLE = 2;
-
-        /** bad request */
-        public static final int BAD_REQUEST = 3;
-
-        /** @hide */
-        public static String toString(int status) {
-            switch(status) {
-            case SUCCESS:
-                return "SUCCESS";
-            case SERVICE_PROTOCOL_NOT_AVAILABLE:
-                return "SERVICE_PROTOCOL_NOT_AVAILABLE";
-            case REQUESTED_INFORMATION_NOT_AVAILABLE:
-                return "REQUESTED_INFORMATION_NOT_AVAILABLE";
-            case BAD_REQUEST:
-                return "BAD_REQUEST";
-            default:
-                return "UNKNOWN";
-            }
-        }
-
-        /** not used */
-        private Status() {}
-    }
-
-    /**
-     * Hidden constructor. This is only used in framework.
-     *
-     * @param serviceType service discovery type.
-     * @param status status code.
-     * @param transId transaction id.
-     * @param device source device.
-     * @param data query data.
-     */
-    protected WifiP2pServiceResponse(int serviceType, int status, int transId,
-            WifiP2pDevice device, byte[] data) {
-        mServiceType = serviceType;
-        mStatus = status;
-        mTransId = transId;
-        mDevice = device;
-        mData = data;
-    }
-
-    /**
-     * Return the service type of service discovery response.
-     *
-     * @return service discovery type.<br>
-     * e.g) {@link WifiP2pServiceInfo#SERVICE_TYPE_BONJOUR}
-     */
-    public int getServiceType() {
-        return mServiceType;
-    }
-
-    /**
-     * Return the status code of service discovery response.
-     *
-     * @return status code.
-     * @see Status
-     */
-    public int getStatus() {
-        return mStatus;
-    }
-
-    /**
-     * Return the transaction id of service discovery response.
-     *
-     * @return transaction id.
-     * @hide
-     */
-    public int getTransactionId() {
-        return mTransId;
-    }
-
-    /**
-     * Return response data.
-     *
-     * <pre>Data format depends on service type
-     *
-     * @return a query or response data.
-     */
-    public byte[] getRawData() {
-        return mData;
-    }
-
-    /**
-     * Returns the source device of service discovery response.
-     *
-     * <pre>This is valid only when service discovery response.
-     *
-     * @return the source device of service discovery response.
-     */
-    public WifiP2pDevice getSrcDevice() {
-        return mDevice;
-    }
-
-    /** @hide */
-    public void setSrcDevice(WifiP2pDevice dev) {
-        if (dev == null) return;
-        this.mDevice = dev;
-    }
-
-
-    /**
-     * Create the list of  WifiP2pServiceResponse instance from supplicant event.
-     *
-     * @param srcAddr source address of the service response
-     * @param tlvsBin byte array containing the binary tlvs data
-     * @return if parse failed, return null
-     * @hide
-     */
-    public static List<WifiP2pServiceResponse> newInstance(String srcAddr, byte[] tlvsBin) {
-        //updateIndicator not used, and not passed up from supplicant
-
-        List<WifiP2pServiceResponse> respList = new ArrayList<WifiP2pServiceResponse>();
-        WifiP2pDevice dev = new WifiP2pDevice();
-        dev.deviceAddress = srcAddr;
-        if (tlvsBin == null) {
-            return null;
-        }
-
-
-        DataInputStream dis = new DataInputStream(new ByteArrayInputStream(tlvsBin));
-        try {
-            while (dis.available() > 0) {
-                /*
-                 * Service discovery header is as follows.
-                 * ______________________________________________________________
-                 * |           Length(2byte)     | Type(1byte) | TransId(1byte)}|
-                 * ______________________________________________________________
-                 * | status(1byte)  |            vendor specific(variable)      |
-                 */
-                // The length equals to 3 plus the number of octets in the vendor
-                // specific content field. And this is little endian.
-                int length = (dis.readUnsignedByte() +
-                        (dis.readUnsignedByte() << 8)) - 3;
-                int type = dis.readUnsignedByte();
-                int transId = dis.readUnsignedByte();
-                int status = dis.readUnsignedByte();
-                if (length < 0) {
-                    return null;
-                }
-                if (length == 0) {
-                    if (status == Status.SUCCESS) {
-                        respList.add(new WifiP2pServiceResponse(type, status,
-                            transId, dev, null));
-                    }
-                    continue;
-                }
-                if (length > MAX_BUF_SIZE) {
-                    dis.skip(length);
-                    continue;
-                }
-                byte[] data = new byte[length];
-                dis.readFully(data);
-
-                WifiP2pServiceResponse resp;
-                if (type ==  WifiP2pServiceInfo.SERVICE_TYPE_BONJOUR) {
-                    resp = WifiP2pDnsSdServiceResponse.newInstance(status,
-                            transId, dev, data);
-                } else if (type == WifiP2pServiceInfo.SERVICE_TYPE_UPNP) {
-                    resp = WifiP2pUpnpServiceResponse.newInstance(status,
-                            transId, dev, data);
-                } else {
-                    resp = new WifiP2pServiceResponse(type, status, transId, dev, data);
-                }
-                if (resp != null && resp.getStatus() == Status.SUCCESS) {
-                    respList.add(resp);
-                }
-            }
-            return respList;
-        } catch (IOException e) {
-            e.printStackTrace();
-        }
-
-        if (respList.size() > 0) {
-            return respList;
-        }
-        return null;
-    }
-
-    /**
-     * Converts hex string to byte array.
-     *
-     * @param hex hex string. if invalid, return null.
-     * @return binary data.
-     */
-    private static byte[] hexStr2Bin(String hex) {
-        int sz = hex.length()/2;
-        byte[] b = new byte[hex.length()/2];
-
-        for (int i=0;i<sz;i++) {
-            try {
-                b[i] = (byte)Integer.parseInt(hex.substring(i*2, i*2+2), 16);
-            } catch (Exception e) {
-                e.printStackTrace();
-                return null;
-            }
-        }
-        return b;
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append("serviceType:").append(mServiceType);
-        sbuf.append(" status:").append(Status.toString(mStatus));
-        sbuf.append(" srcAddr:").append(mDevice.deviceAddress);
-        sbuf.append(" data:").append(Arrays.toString(mData));
-        return sbuf.toString();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (o == this) {
-            return true;
-        }
-        if (!(o instanceof WifiP2pServiceResponse)) {
-            return false;
-        }
-
-        WifiP2pServiceResponse req = (WifiP2pServiceResponse)o;
-
-        return (req.mServiceType == mServiceType) &&
-            (req.mStatus == mStatus) &&
-                equals(req.mDevice.deviceAddress, mDevice.deviceAddress) &&
-                Arrays.equals(req.mData, mData);
-    }
-
-    private boolean equals(Object a, Object b) {
-        if (a == null && b == null) {
-            return true;
-        } else if (a != null) {
-            return a.equals(b);
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 31 * result + mServiceType;
-        result = 31 * result + mStatus;
-        result = 31 * result + mTransId;
-        result = 31 * result + (mDevice.deviceAddress == null ?
-                0 : mDevice.deviceAddress.hashCode());
-        result = 31 * result + (mData == null ? 0 : Arrays.hashCode(mData));
-        return result;
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public int describeContents() {
-        return 0;
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mServiceType);
-        dest.writeInt(mStatus);
-        dest.writeInt(mTransId);
-        dest.writeParcelable(mDevice, flags);
-        if (mData == null || mData.length == 0) {
-            dest.writeInt(0);
-        } else {
-            dest.writeInt(mData.length);
-            dest.writeByteArray(mData);
-        }
-    }
-
-    /** Implement the Parcelable interface {@hide} */
-    public static final @android.annotation.NonNull Creator<WifiP2pServiceResponse> CREATOR =
-        new Creator<WifiP2pServiceResponse>() {
-            public WifiP2pServiceResponse createFromParcel(Parcel in) {
-
-                int type = in.readInt();
-                int status = in.readInt();
-                int transId = in.readInt();
-                WifiP2pDevice dev = (WifiP2pDevice)in.readParcelable(null);
-                int len = in.readInt();
-                byte[] data = null;
-                if (len > 0) {
-                    data = new byte[len];
-                    in.readByteArray(data);
-                }
-                if (type ==  WifiP2pServiceInfo.SERVICE_TYPE_BONJOUR) {
-                    return WifiP2pDnsSdServiceResponse.newInstance(status,
-                            transId, dev, data);
-                } else if (type == WifiP2pServiceInfo.SERVICE_TYPE_UPNP) {
-                    return WifiP2pUpnpServiceResponse.newInstance(status,
-                            transId, dev, data);
-                }
-                return new WifiP2pServiceResponse(type, status, transId, dev, data);
-            }
-
-            public WifiP2pServiceResponse[] newArray(int size) {
-                return new WifiP2pServiceResponse[size];
-            }
-        };
-}
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo.java
deleted file mode 100644
index a4cdfd9..0000000
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.UUID;
-
-/**
- * A class for storing Upnp service information that is advertised
- * over a Wi-Fi peer-to-peer setup.
- *
- * {@see android.net.wifi.p2p.WifiP2pManager#addLocalService}
- * {@see android.net.wifi.p2p.WifiP2pManager#removeLocalService}
- * {@see WifiP2pServiceInfo}
- * {@see WifiP2pDnsSdServiceInfo}
- */
-public class WifiP2pUpnpServiceInfo extends WifiP2pServiceInfo {
-
-    /**
-     * UPnP version 1.0.
-     *
-     * <pre>Query Version should always be set to 0x10 if the query values are
-     * compatible with UPnP Device Architecture 1.0.
-     * @hide
-     */
-    public static final int VERSION_1_0 = 0x10;
-
-    /**
-     * This constructor is only used in newInstance().
-     *
-     * @param queryList
-     */
-    private WifiP2pUpnpServiceInfo(List<String> queryList) {
-        super(queryList);
-    }
-
-    /**
-     * Create UPnP service information object.
-     *
-     * @param uuid a string representation of this UUID in the following format,
-     *  as per <a href="http://www.ietf.org/rfc/rfc4122.txt">RFC 4122</a>.<br>
-     *  e.g) 6859dede-8574-59ab-9332-123456789012
-     * @param device a string representation of this device in the following format,
-     * as per
-     * <a href="http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf">
-     *  UPnP Device Architecture1.1</a><br>
-     *  e.g) urn:schemas-upnp-org:device:MediaServer:1
-     * @param services a string representation of this service in the following format,
-     * as per
-     * <a href="http://www.upnp.org/specs/arch/UPnP-arch-DeviceArchitecture-v1.1.pdf">
-     *  UPnP Device Architecture1.1</a><br>
-     *  e.g) urn:schemas-upnp-org:service:ContentDirectory:1
-     * @return UPnP service information object.
-     */
-    public static WifiP2pUpnpServiceInfo newInstance(String uuid,
-            String device, List<String> services) {
-        if (uuid == null || device == null) {
-            throw new IllegalArgumentException("uuid or device cannnot be null");
-        }
-        UUID.fromString(uuid);
-
-        ArrayList<String> info = new ArrayList<String>();
-
-        info.add(createSupplicantQuery(uuid, null));
-        info.add(createSupplicantQuery(uuid, "upnp:rootdevice"));
-        info.add(createSupplicantQuery(uuid, device));
-        if (services != null) {
-            for (String service:services) {
-                info.add(createSupplicantQuery(uuid, service));
-            }
-        }
-
-        return new WifiP2pUpnpServiceInfo(info);
-    }
-
-    /**
-     * Create wpa_supplicant service query for upnp.
-     *
-     * @param uuid
-     * @param data
-     * @return wpa_supplicant service query for upnp
-     */
-    private static String createSupplicantQuery(String uuid, String data) {
-        StringBuffer sb = new StringBuffer();
-        sb.append("upnp ");
-        sb.append(String.format(Locale.US, "%02x ", VERSION_1_0));
-        sb.append("uuid:");
-        sb.append(uuid);
-        if (data != null) {
-            sb.append("::");
-            sb.append(data);
-        }
-        return sb.toString();
-    }
-}
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest.java
deleted file mode 100644
index 98e447e..0000000
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import android.net.wifi.p2p.WifiP2pManager;
-
-import java.util.Locale;
-
-/**
- * A class for creating a Upnp service discovery request for use with
- * {@link WifiP2pManager#addServiceRequest} and {@link WifiP2pManager#removeServiceRequest}
- *
- * {@see WifiP2pManager}
- * {@see WifiP2pServiceRequest}
- * {@see WifiP2pDnsSdServiceRequest}
- */
-public class WifiP2pUpnpServiceRequest extends WifiP2pServiceRequest {
-
-    /**
-     * This constructor is only used in newInstance().
-     *
-     * @param query The part of service specific query.
-     * @hide
-     */
-    protected WifiP2pUpnpServiceRequest(String query) {
-        super(WifiP2pServiceInfo.SERVICE_TYPE_UPNP, query);
-    }
-
-    /**
-     * This constructor is only used in newInstance().
-     * @hide
-     */
-    protected WifiP2pUpnpServiceRequest() {
-        super(WifiP2pServiceInfo.SERVICE_TYPE_UPNP, null);
-    }
-
-    /**
-     * Create a service discovery request to search all UPnP services.
-     *
-     * @return service request for UPnP.
-     */
-    public static WifiP2pUpnpServiceRequest newInstance() {
-        return new WifiP2pUpnpServiceRequest();
-    }
-    /**
-     * Create a service discovery request to search specified UPnP services.
-     *
-     * @param st ssdp search target.  Cannot be null.<br>
-     * e.g ) <br>
-     * <ul>
-     * <li>"ssdp:all"
-     * <li>"upnp:rootdevice"
-     * <li>"urn:schemas-upnp-org:device:MediaServer:2"
-     * <li>"urn:schemas-upnp-org:service:ContentDirectory:2"
-     * <li>"uuid:6859dede-8574-59ab-9332-123456789012"
-     * </ul>
-     * @return service request for UPnP.
-     */
-    public static WifiP2pUpnpServiceRequest newInstance(String st) {
-        if (st == null) {
-            throw new IllegalArgumentException("search target cannot be null");
-        }
-        StringBuffer sb = new StringBuffer();
-        sb.append(String.format(Locale.US, "%02x", WifiP2pUpnpServiceInfo.VERSION_1_0));
-        sb.append(WifiP2pServiceInfo.bin2HexStr(st.getBytes()));
-        return new WifiP2pUpnpServiceRequest(sb.toString());
-    }
-}
diff --git a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse.java b/wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse.java
deleted file mode 100644
index ab95af6f6..0000000
--- a/wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2012 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import android.net.wifi.p2p.WifiP2pDevice;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * A class for a response of upnp service discovery.
- *
- * @hide
- */
-public class WifiP2pUpnpServiceResponse extends WifiP2pServiceResponse {
-
-    /**
-     * UPnP version. should be {@link WifiP2pUpnpServiceInfo#VERSION_1_0}
-     */
-    private int mVersion;
-
-    /**
-     * The list of Unique Service Name.
-     * e.g)
-     *{"uuid:6859dede-8574-59ab-9332-123456789012",
-     *"uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"}
-     */
-    private List<String> mUniqueServiceNames;
-
-    /**
-     * Return UPnP version number.
-     *
-     * @return version number.
-     * @see WifiP2pUpnpServiceInfo#VERSION_1_0
-     */
-    public int getVersion() {
-        return mVersion;
-    }
-
-    /**
-     * Return Unique Service Name strings.
-     *
-     * @return Unique Service Name.<br>
-     * e.g ) <br>
-     * <ul>
-     * <li>"uuid:6859dede-8574-59ab-9332-123456789012"
-     * <li>"uuid:6859dede-8574-59ab-9332-123456789012::upnp:rootdevice"
-     * <li>"uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp-org:device:
-     * MediaServer:2"
-     * <li>"uuid:6859dede-8574-59ab-9332-123456789012::urn:schemas-upnp-org:service:
-     * ContentDirectory:2"
-     * </ul>
-     */
-    public List<String> getUniqueServiceNames() {
-        return mUniqueServiceNames;
-    }
-
-    /**
-     * hidden constructor.
-     *
-     * @param status status code
-     * @param transId transaction id
-     * @param dev source device
-     * @param data UPnP response data.
-     */
-    protected WifiP2pUpnpServiceResponse(int status,
-            int transId, WifiP2pDevice dev, byte[] data) {
-        super(WifiP2pServiceInfo.SERVICE_TYPE_UPNP,
-                status, transId, dev, data);
-        if (!parse()) {
-            throw new IllegalArgumentException("Malformed upnp service response");
-        }
-    }
-
-    /**
-     * Parse UPnP service discovery response
-     *
-     * @return {@code true} if the operation succeeded
-     */
-    private boolean parse() {
-        /*
-         * The data format is as follows.
-         *
-         * ______________________________________________________
-         * |  Version (1)  |          USN (Variable)            |
-         */
-        if (mData == null) {
-            // the empty is OK.
-            return true;
-        }
-
-        if (mData.length < 1) {
-            return false;
-        }
-
-        mVersion = mData[0] & 0xff;
-        String[] names = new String(mData, 1, mData.length-1).split(",");
-        mUniqueServiceNames = new ArrayList<String>();
-        for (String name : names) {
-            mUniqueServiceNames.add(name);
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        StringBuffer sbuf = new StringBuffer();
-        sbuf.append("serviceType:UPnP(").append(mServiceType).append(")");
-        sbuf.append(" status:").append(Status.toString(mStatus));
-        sbuf.append(" srcAddr:").append(mDevice.deviceAddress);
-        sbuf.append(" version:").append(String.format("%02x", mVersion));
-        if (mUniqueServiceNames != null) {
-            for (String name : mUniqueServiceNames) {
-                sbuf.append(" usn:").append(name);
-            }
-        }
-        return sbuf.toString();
-    }
-
-    /**
-     * Create upnp service response.
-     *
-     * <pre>This is only used in{@link WifiP2pServiceResponse}
-     *
-     * @param status status code.
-     * @param transId transaction id.
-     * @param device source device.
-     * @param data UPnP response data.
-     * @return UPnP service response data.
-     * @hide
-     */
-    static WifiP2pUpnpServiceResponse newInstance(int status,
-            int transId, WifiP2pDevice device, byte[] data) {
-        if (status != WifiP2pServiceResponse.Status.SUCCESS) {
-            return new WifiP2pUpnpServiceResponse(status, transId, device, null);
-        }
-
-        try {
-            return new WifiP2pUpnpServiceResponse(status, transId, device, data);
-        } catch (IllegalArgumentException e) {
-            e.printStackTrace();
-        }
-        return null;
-    }
-}
diff --git a/wifi/java/android/net/wifi/p2p/package.html b/wifi/java/android/net/wifi/p2p/package.html
deleted file mode 100644
index 6a5e8e6..0000000
--- a/wifi/java/android/net/wifi/p2p/package.html
+++ /dev/null
@@ -1,68 +0,0 @@
-<HTML>
-<BODY>
-<p>Provides classes to create peer-to-peer (P2P) connections with Wi-Fi Direct.</p>
-
-<p>Using these APIs, you can discover and connect to other devices when each
-device supports Wi-Fi Direct, then communicate over a speedy connection across distances much longer
-than a Bluetooth connection. The primary class you need to work with is {@link
-android.net.wifi.p2p.WifiP2pManager}, which you can acquire by calling {@link
-android.app.Activity#getSystemService getSystemService(WIFI_P2P_SERVICE)}. The {@link
-android.net.wifi.p2p.WifiP2pManager} includes APIs that allow you to:</p>
-<ul>
-<li>Initialize your application for P2P connections by calling {@link
-android.net.wifi.p2p.WifiP2pManager#initialize initialize()}</li>
-
-<li>Discover nearby devices by calling {@link android.net.wifi.p2p.WifiP2pManager#discoverPeers
-discoverPeers()}</li>
-
-<li>Start a P2P connection by calling {@link android.net.wifi.p2p.WifiP2pManager#connect
-connect()}</li>
-<li>And more</li>
-</ul>
-
-<p>Several other interfaces and classes are necessary as well, such as:</p>
-<ul>
-<li>The {@link android.net.wifi.p2p.WifiP2pManager.ActionListener} interface allows you to receive
-callbacks when an operation such as discovering peers or connecting to them succeeds or fails.</li>
-
-<li>{@link android.net.wifi.p2p.WifiP2pManager.PeerListListener} interface allows you to receive
-information about discovered peers. The callback provides a {@link
-android.net.wifi.p2p.WifiP2pDeviceList}, from which you can retrieve a {@link
-android.net.wifi.p2p.WifiP2pDevice} object for each device within range and get information such as
-the device name, address, device type, the WPS configurations the device supports, and more.</li>
-
-<li>The {@link android.net.wifi.p2p.WifiP2pManager.GroupInfoListener} interface allows you to
-receive information about a P2P group. The callback provides a {@link
-android.net.wifi.p2p.WifiP2pGroup} object, which provides group information such as the owner, the
-network name, and passphrase.</li>
-
-<li>{@link android.net.wifi.p2p.WifiP2pManager.ConnectionInfoListener} interface allows you to
-receive information about the current connection. The callback provides a {@link
-android.net.wifi.p2p.WifiP2pInfo} object, which has information such as whether a group has been
-formed and who is the group owner.</li>
-</ul>
-
-<p>In order to use the Wi-Fi P2P APIs, your app must request the following user permissions:</p>
-<ul>
-<li>{@link android.Manifest.permission#ACCESS_WIFI_STATE}</li>
-<li>{@link android.Manifest.permission#CHANGE_WIFI_STATE}</li>
-<li>{@link android.Manifest.permission#INTERNET} (although your app doesn’t technically connect
-to the Internet, communicating to Wi-Fi Direct peers with standard java sockets requires Internet
-permission).</li>
-</ul>
-
-<p>For example code, see the <a href="{@docRoot}resources/samples/WiFiDirectDemo/index.html">Wi-Fi
-Direct Demo</a> sample application.</p>
-
-<p class="note"><strong>Note:</strong> Not all Android-powered devices support Wi-Fi
-Direct. If your application uses Wi-Fi Direct, declare so with a <a
-href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a>
-element in the manifest file:</p>
-<pre>
-&lt;manifest ...>
-    &lt;uses-feature android:name="android.hardware.wifi.direct" />
-    ...
-&lt;/manifest>
-</pre>
-</BODY>
-</HTML>
diff --git a/wifi/java/android/net/wifi/package.html b/wifi/java/android/net/wifi/package.html
deleted file mode 100644
index b21d39d0..0000000
--- a/wifi/java/android/net/wifi/package.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<HTML>
-<BODY>
-<p>Provides classes to manage Wi-Fi functionality on the device.</p>
-<p>The Wi-Fi APIs provide a means by which applications can communicate 
-with the lower-level wireless stack that provides Wi-Fi network access. Almost all
-information from the device supplicant is available, including the connected network's
-link speed, IP address, negotiation state, and more, plus information about other
-networks that are available. Some other API features include the ability to
-scan, add, save, terminate and initiate Wi-Fi connections.</p>
-
-<p>Some APIs may require the following user permissions:</p>
-<ul>
-  <li>{@link android.Manifest.permission#ACCESS_WIFI_STATE}</li>
-  <li>{@link android.Manifest.permission#CHANGE_WIFI_STATE}</li>
-  <li>{@link android.Manifest.permission#CHANGE_WIFI_MULTICAST_STATE}</li>
-</ul>
-
-<p class="note"><strong>Note:</strong> Not all Android-powered devices provide Wi-Fi functionality.
-If your application uses Wi-Fi, declare so with a <a
-href="{@docRoot}guide/topics/manifest/uses-feature-element.html">{@code <uses-feature>}</a>
-element in the manifest file:</p>
-<pre>
-&lt;manifest ...>
-    &lt;uses-feature android:name="android.hardware.wifi" />
-    ...
-&lt;/manifest>
-</pre>
-</BODY>
-</HTML>
diff --git a/wifi/java/android/net/wifi/rtt/CivicLocation.java b/wifi/java/android/net/wifi/rtt/CivicLocation.java
deleted file mode 100644
index 1d41177..0000000
--- a/wifi/java/android/net/wifi/rtt/CivicLocation.java
+++ /dev/null
@@ -1,333 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import android.annotation.Nullable;
-import android.location.Address;
-import android.net.wifi.rtt.CivicLocationKeys.CivicLocationKeysType;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.os.Parcelable.Creator;
-import android.util.SparseArray;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Locale;
-import java.util.Objects;
-
-/**
- * Decodes the Type Length Value (TLV) elements found in a Location Civic Record as defined by IEEE
- * P802.11-REVmc/D8.0 section 9.4.2.22.13 using the format described in IETF RFC 4776.
- *
- * <p>The TLVs each define a key, value pair for a civic address type such as apt, street, city,
- * county, and country. The class provides a general getter method to extract a value for an element
- * key, returning null if not set.
- *
- * @hide
- */
-public final class CivicLocation implements Parcelable {
-    // Address (class) line indexes
-    private static final int ADDRESS_LINE_0_ROOM_DESK_FLOOR = 0;
-    private static final int ADDRESS_LINE_1_NUMBER_ROAD_SUFFIX_APT = 1;
-    private static final int ADDRESS_LINE_2_CITY = 2;
-    private static final int ADDRESS_LINE_3_STATE_POSTAL_CODE = 3;
-    private static final int ADDRESS_LINE_4_COUNTRY = 4;
-
-    // Buffer management
-    private static final int MIN_CIVIC_BUFFER_SIZE = 3;
-    private static final int MAX_CIVIC_BUFFER_SIZE = 256;
-    private static final int COUNTRY_CODE_LENGTH = 2;
-    private static final int BYTE_MASK = 0xFF;
-    private static final int TLV_TYPE_INDEX = 0;
-    private static final int TLV_LENGTH_INDEX = 1;
-    private static final int TLV_VALUE_INDEX = 2;
-
-    private final boolean mIsValid;
-    private final String mCountryCode; // Two character country code (ISO 3166 standard).
-    private SparseArray<String> mCivicAddressElements =
-            new SparseArray<>(MIN_CIVIC_BUFFER_SIZE);
-
-
-    /**
-     * Constructor
-     *
-     * @param civicTLVs    a byte buffer containing parameters in the form type, length, value
-     * @param countryCode the two letter code defined by the ISO 3166 standard
-     *
-     * @hide
-     */
-    public CivicLocation(@Nullable byte[] civicTLVs, @Nullable String countryCode) {
-        this.mCountryCode = countryCode;
-        if (countryCode == null || countryCode.length() != COUNTRY_CODE_LENGTH) {
-            this.mIsValid = false;
-            return;
-        }
-        boolean isValid = false;
-        if (civicTLVs != null
-                && civicTLVs.length >= MIN_CIVIC_BUFFER_SIZE
-                && civicTLVs.length < MAX_CIVIC_BUFFER_SIZE) {
-            isValid = parseCivicTLVs(civicTLVs);
-        }
-
-        mIsValid = isValid;
-    }
-
-    private CivicLocation(Parcel in) {
-        mIsValid = in.readByte() != 0;
-        mCountryCode = in.readString();
-        mCivicAddressElements = in.readSparseArray(this.getClass().getClassLoader());
-    }
-
-    public static final @android.annotation.NonNull Creator<CivicLocation> CREATOR = new Creator<CivicLocation>() {
-        @Override
-        public CivicLocation createFromParcel(Parcel in) {
-            return new CivicLocation(in);
-        }
-
-        @Override
-        public CivicLocation[] newArray(int size) {
-            return new CivicLocation[size];
-        }
-    };
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel parcel, int flags) {
-        parcel.writeByte((byte) (mIsValid ? 1 : 0));
-        parcel.writeString(mCountryCode);
-        parcel.writeSparseArray((android.util.SparseArray) mCivicAddressElements);
-    }
-
-    /**
-     * Check TLV format and store TLV key/value pairs in this object so they can be queried by key.
-     *
-     * @param civicTLVs the buffer of TLV elements
-     * @return a boolean indicating success of the parsing process
-     */
-    private boolean parseCivicTLVs(byte[] civicTLVs) {
-        int bufferPtr = 0;
-        int bufferLength = civicTLVs.length;
-
-        // Iterate through the sub-elements contained in the LCI IE checking the accumulated
-        // element lengths do not overflow the total buffer length
-        while (bufferPtr < bufferLength) {
-            int civicAddressType = civicTLVs[bufferPtr + TLV_TYPE_INDEX] & BYTE_MASK;
-            int civicAddressTypeLength = civicTLVs[bufferPtr + TLV_LENGTH_INDEX];
-            if (civicAddressTypeLength != 0) {
-                if (bufferPtr + TLV_VALUE_INDEX + civicAddressTypeLength > bufferLength) {
-                    return false;
-                }
-                mCivicAddressElements.put(civicAddressType,
-                        new String(civicTLVs, bufferPtr + TLV_VALUE_INDEX,
-                                civicAddressTypeLength, StandardCharsets.UTF_8));
-            }
-            bufferPtr += civicAddressTypeLength + TLV_VALUE_INDEX;
-        }
-        return true;
-    }
-
-    /**
-     * Getter for the value of a civic Address element type.
-     *
-     * @param key an integer code for the element type key
-     * @return the string value associated with that element type
-     */
-    @Nullable
-    public String getCivicElementValue(@CivicLocationKeysType int key) {
-        return mCivicAddressElements.get(key);
-    }
-
-    /**
-     * Converts a CivicLocation object to a SparseArray.
-     *
-     * @return the SparseArray<string> representation of the CivicLocation
-     */
-    @Nullable
-    public SparseArray<String> toSparseArray() {
-        return mCivicAddressElements;
-    }
-
-    /**
-     * Generates a comma separated string of all the defined elements.
-     *
-     * @return a compiled string representing all elements
-     */
-    @Override
-    public String toString() {
-        return mCivicAddressElements.toString();
-    }
-
-    /**
-     * Converts Civic Location to the best effort Address Object.
-     *
-     * @return the {@link Address} object based on the Civic Location data
-     */
-    @Nullable
-    public Address toAddress() {
-        if (!mIsValid) {
-            return null;
-        }
-        Address address = new Address(Locale.US);
-        String room = formatAddressElement("Room: ", getCivicElementValue(CivicLocationKeys.ROOM));
-        String desk =
-                formatAddressElement(" Desk: ", getCivicElementValue(CivicLocationKeys.DESK));
-        String floor =
-                formatAddressElement(", Flr: ", getCivicElementValue(CivicLocationKeys.FLOOR));
-        String houseNumber = formatAddressElement("", getCivicElementValue(CivicLocationKeys.HNO));
-        String houseNumberSuffix =
-                formatAddressElement("", getCivicElementValue(CivicLocationKeys.HNS));
-        String road =
-                formatAddressElement(" ", getCivicElementValue(
-                        CivicLocationKeys.PRIMARY_ROAD_NAME));
-        String roadSuffix = formatAddressElement(" ", getCivicElementValue(CivicLocationKeys.STS));
-        String apt = formatAddressElement(", Apt: ", getCivicElementValue(CivicLocationKeys.APT));
-        String city = formatAddressElement("", getCivicElementValue(CivicLocationKeys.CITY));
-        String state = formatAddressElement("", getCivicElementValue(CivicLocationKeys.STATE));
-        String postalCode =
-                formatAddressElement(" ", getCivicElementValue(CivicLocationKeys.POSTAL_CODE));
-
-        // Aggregation into common address format
-        String addressLine0 =
-                new StringBuilder().append(room).append(desk).append(floor).toString();
-        String addressLine1 =
-                new StringBuilder().append(houseNumber).append(houseNumberSuffix).append(road)
-                        .append(roadSuffix).append(apt).toString();
-        String addressLine2 = city;
-        String addressLine3 = new StringBuilder().append(state).append(postalCode).toString();
-        String addressLine4 = mCountryCode;
-
-        // Setting Address object line fields by common convention.
-        address.setAddressLine(ADDRESS_LINE_0_ROOM_DESK_FLOOR, addressLine0);
-        address.setAddressLine(ADDRESS_LINE_1_NUMBER_ROAD_SUFFIX_APT, addressLine1);
-        address.setAddressLine(ADDRESS_LINE_2_CITY, addressLine2);
-        address.setAddressLine(ADDRESS_LINE_3_STATE_POSTAL_CODE, addressLine3);
-        address.setAddressLine(ADDRESS_LINE_4_COUNTRY, addressLine4);
-
-        // Other compatible fields between the CIVIC_ADDRESS and the Address Class.
-        address.setFeatureName(getCivicElementValue(CivicLocationKeys.NAM)); // Structure name
-        address.setSubThoroughfare(getCivicElementValue(CivicLocationKeys.HNO));
-        address.setThoroughfare(getCivicElementValue(CivicLocationKeys.PRIMARY_ROAD_NAME));
-        address.setSubLocality(getCivicElementValue(CivicLocationKeys.NEIGHBORHOOD));
-        address.setSubAdminArea(getCivicElementValue(CivicLocationKeys.COUNTY));
-        address.setAdminArea(getCivicElementValue(CivicLocationKeys.STATE));
-        address.setPostalCode(getCivicElementValue(CivicLocationKeys.POSTAL_CODE));
-        address.setCountryCode(mCountryCode); // Country
-        return address;
-    }
-
-    /**
-     * Prepares an address element so that it can be integrated into an address line convention.
-     *
-     * <p>If an address element is null, the return string will be empty e.g. "".
-     *
-     * @param label a string defining the type of address element
-     * @param value a string defining the elements value
-     * @return the formatted version of the value, with null values converted to empty strings
-     */
-    private String formatAddressElement(String label, String value) {
-        if (value != null) {
-            return label + value;
-        } else {
-            return "";
-        }
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof CivicLocation)) {
-            return false;
-        }
-        CivicLocation other = (CivicLocation) obj;
-        return mIsValid == other.mIsValid
-                && Objects.equals(mCountryCode, other.mCountryCode)
-                && isSparseArrayStringEqual(mCivicAddressElements, other.mCivicAddressElements);
-    }
-
-    @Override
-    public int hashCode() {
-        int[] civicAddressKeys = getSparseArrayKeys(mCivicAddressElements);
-        String[] civicAddressValues = getSparseArrayValues(mCivicAddressElements);
-        return Objects.hash(mIsValid, mCountryCode, civicAddressKeys, civicAddressValues);
-    }
-
-    /**
-     * Tests if the Civic Location object is valid
-     *
-     * @return a boolean defining mIsValid
-     */
-    public boolean isValid() {
-        return mIsValid;
-    }
-
-    /**
-     * Tests if two sparse arrays are equal on a key for key basis
-     *
-     * @param sa1 the first sparse array
-     * @param sa2 the second sparse array
-     * @return the boolean result after comparing values key by key
-     */
-    private boolean isSparseArrayStringEqual(SparseArray<String> sa1, SparseArray<String> sa2) {
-        int size = sa1.size();
-        if (size != sa2.size()) {
-            return false;
-        }
-        for (int i = 0; i < size; i++) {
-            String sa1Value = sa1.valueAt(i);
-            String sa2Value = sa2.valueAt(i);
-            if (!sa1Value.equals(sa2Value)) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    /**
-     * Extract an array of all the keys in a SparseArray<String>
-     *
-     * @param sa the sparse array of Strings
-     * @return an integer array of all keys in the SparseArray<String>
-     */
-    private int[] getSparseArrayKeys(SparseArray<String> sa) {
-        int size = sa.size();
-        int[] keys = new int[size];
-        for (int i = 0; i < size; i++) {
-            keys[i] = sa.keyAt(i);
-        }
-        return keys;
-    }
-
-    /**
-     * Extract an array of all the String values in a SparseArray<String>
-     *
-     * @param sa the sparse array of Strings
-     * @return a String array of all values in the SparseArray<String>
-     */
-    private String[] getSparseArrayValues(SparseArray<String> sa) {
-        int size = sa.size();
-        String[] values = new String[size];
-        for (int i = 0; i < size; i++) {
-            values[i] = sa.valueAt(i);
-        }
-        return values;
-    }
-}
diff --git a/wifi/java/android/net/wifi/rtt/CivicLocationKeys.java b/wifi/java/android/net/wifi/rtt/CivicLocationKeys.java
deleted file mode 100644
index b03f4a9..0000000
--- a/wifi/java/android/net/wifi/rtt/CivicLocationKeys.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import android.annotation.IntDef;
-
-import java.lang.annotation.Retention;
-
-/**
- * Civic Address key types used to define address elements.
- *
- * <p>These keys can be used with {@code ResponderLocation.toCivicLocationSparseArray()}
- * to look-up the corresponding string values.</p>
- */
-public class CivicLocationKeys {
-
-    /**
-     * An enumeration of all civic location keys.
-     *
-     * @hide
-     */
-    @Retention(SOURCE)
-    @IntDef({LANGUAGE, STATE, COUNTY, CITY, BOROUGH, NEIGHBORHOOD, GROUP_OF_STREETS, PRD, POD, STS,
-            HNO, HNS, LMK, LOC, NAM, POSTAL_CODE, BUILDING, APT, FLOOR, ROOM, TYPE_OF_PLACE, PCN,
-            PO_BOX, ADDITIONAL_CODE, DESK, PRIMARY_ROAD_NAME, ROAD_SECTION, BRANCH_ROAD_NAME,
-            SUBBRANCH_ROAD_NAME, STREET_NAME_PRE_MODIFIER, STREET_NAME_POST_MODIFIER, SCRIPT})
-    public @interface CivicLocationKeysType {
-    }
-
-    /** Language key e.g. i-default. */
-    public static final int LANGUAGE = 0;
-    /** Category label A1 key e.g. California. */
-    public static final int STATE = 1;
-    /** Category label A2 key e.g. Marin. */
-    public static final int COUNTY = 2;
-    /** Category label A3 key e.g. San Francisco. */
-    public static final int CITY = 3;
-    /** Category label A4 key e.g. Westminster. */
-    public static final int BOROUGH = 4;
-    /** Category label A5 key e.g. Pacific Heights. */
-    public static final int NEIGHBORHOOD = 5;
-    /** Category label A6 key e.g. University District. */
-    public static final int GROUP_OF_STREETS = 6;
-    // 7 - 15 not defined
-    /** Leading Street direction key e.g. N. */
-    public static final int PRD = 16;
-    /** Trailing street suffix key e.g. SW. */
-    public static final int POD = 17;
-    /** Street suffix or Type key e.g Ave, Platz. */
-    public static final int STS = 18;
-    /** House Number key e.g. 123. */
-    public static final int HNO = 19;
-    /** House number suffix key e.g. A, 1/2. */
-    public static final int HNS = 20;
-    /** Landmark or vanity address key e.g. Golden Gate Bridge. */
-    public static final int LMK = 21;
-    /** Additional Location info key e.g. South Wing. */
-    public static final int LOC = 22;
-    /** Name of residence key e.g. Joe's Barbershop. */
-    public static final int NAM = 23;
-    /** Postal or ZIP code key e.g. 10027-1234. */
-    public static final int POSTAL_CODE = 24;
-    /** Building key e.g. Lincoln Library. */
-    public static final int BUILDING = 25;
-    /** Apartment or suite key e.g. Apt 42. */
-    public static final int APT = 26;
-    /** Floor key e.g. 4. */
-    public static final int FLOOR = 27;
-    /** Room key e.g. 450F. */
-    public static final int ROOM = 28;
-    /** Type of place key e.g. office. */
-    public static final int TYPE_OF_PLACE = 29;
-    /** Postal community name key e.g. Leonia. */
-    public static final int PCN = 30;
-    /** Post Office Box key e.g. 12345. */
-    public static final int PO_BOX = 31;
-    /** Additional Code key e.g. 13203000003. */
-    public static final int ADDITIONAL_CODE = 32;
-    /** Seat, desk, pole, or cubical key e.g. WS 181. */
-    public static final int DESK = 33;
-    /** Primary road name key e.g. Shoreline. */
-    public static final int PRIMARY_ROAD_NAME = 34;
-    /** Road Section key e.g. 14. */
-    public static final int ROAD_SECTION = 35;
-    /** Branch Rd Name key e.g. Lane 7. */
-    public static final int BRANCH_ROAD_NAME = 36;
-    /** Subbranch Rd Name key e.g. Alley 8. */
-    public static final int SUBBRANCH_ROAD_NAME = 37;
-    /** Premodifier key e.g. Old. */
-    public static final int STREET_NAME_PRE_MODIFIER = 38;
-    /** Postmodifier key e.g. Service. */
-    public static final int STREET_NAME_POST_MODIFIER = 39;
-    /** Script key e.g. Latn. */
-    public static final int SCRIPT = 128;
-
-    /** private constructor */
-    private CivicLocationKeys() {}
-}
-
diff --git a/wifi/java/android/net/wifi/rtt/IRttCallback.aidl b/wifi/java/android/net/wifi/rtt/IRttCallback.aidl
deleted file mode 100644
index 578dd1e..0000000
--- a/wifi/java/android/net/wifi/rtt/IRttCallback.aidl
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import android.net.wifi.rtt.RangingResult;
-
-/**
- * Interface for RTT result callback.
- *
- * @hide
- */
-oneway interface IRttCallback
-{
-    /**
-     * Service to manager callback indicating failure.
-     */
-    void onRangingFailure(int status);
-
-    /**
-     * Service to manager callback indicating success and providing results.
-     */
-    void onRangingResults(in List<RangingResult> results);
-}
diff --git a/wifi/java/android/net/wifi/rtt/IWifiRttManager.aidl b/wifi/java/android/net/wifi/rtt/IWifiRttManager.aidl
deleted file mode 100644
index 7c92a6b..0000000
--- a/wifi/java/android/net/wifi/rtt/IWifiRttManager.aidl
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import android.os.WorkSource;
-
-import android.net.wifi.rtt.IRttCallback;
-import android.net.wifi.rtt.RangingRequest;
-
-/**
- * @hide
- */
-interface IWifiRttManager
-{
-    boolean isAvailable();
-    void startRanging(in IBinder binder, in String callingPackage, in String callingFeatureId,
-            in WorkSource workSource, in RangingRequest request, in IRttCallback callback);
-    void cancelRanging(in WorkSource workSource);
-}
diff --git a/wifi/java/android/net/wifi/rtt/RangingRequest.java b/wifi/java/android/net/wifi/rtt/RangingRequest.java
deleted file mode 100644
index 318efa6..0000000
--- a/wifi/java/android/net/wifi/rtt/RangingRequest.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.net.MacAddress;
-import android.net.wifi.ScanResult;
-import android.net.wifi.aware.AttachCallback;
-import android.net.wifi.aware.DiscoverySessionCallback;
-import android.net.wifi.aware.IdentityChangedListener;
-import android.net.wifi.aware.PeerHandle;
-import android.net.wifi.aware.WifiAwareManager;
-import android.os.Handler;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringJoiner;
-
-/**
- * Defines the ranging request to other devices. The ranging request is built using
- * {@link RangingRequest.Builder}.
- * A ranging request is executed using
- * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)}.
- * <p>
- * The ranging request is a batch request - specifying a set of devices (specified using
- * {@link RangingRequest.Builder#addAccessPoint(ScanResult)} and
- * {@link RangingRequest.Builder#addAccessPoints(List)}).
- */
-public final class RangingRequest implements Parcelable {
-    private static final int MAX_PEERS = 10;
-
-    /**
-     * Returns the maximum number of peers to range which can be specified in a single {@code
-     * RangingRequest}. The limit applies no matter how the peers are added to the request, e.g.
-     * through {@link RangingRequest.Builder#addAccessPoint(ScanResult)} or
-     * {@link RangingRequest.Builder#addAccessPoints(List)}.
-     *
-     * @return Maximum number of peers.
-     */
-    public static int getMaxPeers() {
-        return MAX_PEERS;
-    }
-
-    /** @hide */
-    public final List<ResponderConfig> mRttPeers;
-
-    /** @hide */
-    private RangingRequest(List<ResponderConfig> rttPeers) {
-        mRttPeers = rttPeers;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeList(mRttPeers);
-    }
-
-    public static final @android.annotation.NonNull Creator<RangingRequest> CREATOR = new Creator<RangingRequest>() {
-        @Override
-        public RangingRequest[] newArray(int size) {
-            return new RangingRequest[size];
-        }
-
-        @Override
-        public RangingRequest createFromParcel(Parcel in) {
-            return new RangingRequest(in.readArrayList(null));
-        }
-    };
-
-    /** @hide */
-    @Override
-    public String toString() {
-        StringJoiner sj = new StringJoiner(", ", "RangingRequest: mRttPeers=[", "]");
-        for (ResponderConfig rc : mRttPeers) {
-            sj.add(rc.toString());
-        }
-        return sj.toString();
-    }
-
-    /** @hide */
-    public void enforceValidity(boolean awareSupported) {
-        if (mRttPeers.size() > MAX_PEERS) {
-            throw new IllegalArgumentException(
-                    "Ranging to too many peers requested. Use getMaxPeers() API to get limit.");
-        }
-
-        for (ResponderConfig peer: mRttPeers) {
-            if (!peer.isValid(awareSupported)) {
-                throw new IllegalArgumentException("Invalid Responder specification");
-            }
-        }
-    }
-
-    /**
-     * Builder class used to construct {@link RangingRequest} objects.
-     */
-    public static final class Builder {
-        private List<ResponderConfig> mRttPeers = new ArrayList<>();
-
-        /**
-         * Add the device specified by the {@link ScanResult} to the list of devices with
-         * which to measure range. The total number of peers added to a request cannot exceed the
-         * limit specified by {@link #getMaxPeers()}.
-         * <p>
-         * Ranging may not be supported if the Access Point does not support IEEE 802.11mc. Use
-         * {@link ScanResult#is80211mcResponder()} to verify the Access Point's capabilities. If
-         * not supported the result status will be
-         * {@link RangingResult#STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC}.
-         *
-         * @param apInfo Information of an Access Point (AP) obtained in a Scan Result.
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder addAccessPoint(@NonNull ScanResult apInfo) {
-            if (apInfo == null) {
-                throw new IllegalArgumentException("Null ScanResult!");
-            }
-            return addResponder(ResponderConfig.fromScanResult(apInfo));
-        }
-
-        /**
-         * Add the devices specified by the {@link ScanResult}s to the list of devices with
-         * which to measure range. The total number of peers added to a request cannot exceed the
-         * limit specified by {@link #getMaxPeers()}.
-         * <p>
-         * Ranging may not be supported if the Access Point does not support IEEE 802.11mc. Use
-         * {@link ScanResult#is80211mcResponder()} to verify the Access Point's capabilities. If
-         * not supported the result status will be
-         * {@link RangingResult#STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC}.
-         *
-         * @param apInfos Information of an Access Points (APs) obtained in a Scan Result.
-         * @return The builder to facilitate chaining
-         *         {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder addAccessPoints(@NonNull List<ScanResult> apInfos) {
-            if (apInfos == null) {
-                throw new IllegalArgumentException("Null list of ScanResults!");
-            }
-            for (ScanResult scanResult : apInfos) {
-                addAccessPoint(scanResult);
-            }
-            return this;
-        }
-
-        /**
-         * Add the device specified by the {@code peerMacAddress} to the list of devices with
-         * which to measure range.
-         * <p>
-         * The MAC address may be obtained out-of-band from a peer Wi-Fi Aware device. A Wi-Fi
-         * Aware device may obtain its MAC address using the {@link IdentityChangedListener}
-         * provided to
-         * {@link WifiAwareManager#attach(AttachCallback, IdentityChangedListener, Handler)}.
-         * <p>
-         * Note: in order to use this API the device must support Wi-Fi Aware
-         * {@link android.net.wifi.aware}. The peer device which is being ranged to must be
-         * configured to publish a service (with any name) with:
-         * <li>Type {@link android.net.wifi.aware.PublishConfig#PUBLISH_TYPE_UNSOLICITED}.
-         * <li>Ranging enabled
-         * {@link android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean)}.
-         *
-         * @param peerMacAddress The MAC address of the Wi-Fi Aware peer.
-         * @return The builder, to facilitate chaining {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder addWifiAwarePeer(@NonNull MacAddress peerMacAddress) {
-            if (peerMacAddress == null) {
-                throw new IllegalArgumentException("Null peer MAC address");
-            }
-            return addResponder(
-                    ResponderConfig.fromWifiAwarePeerMacAddressWithDefaults(peerMacAddress));
-        }
-
-        /**
-         * Add a device specified by a {@link PeerHandle} to the list of devices with which to
-         * measure range.
-         * <p>
-         * The {@link PeerHandle} may be obtained as part of the Wi-Fi Aware discovery process. E.g.
-         * using {@link DiscoverySessionCallback#onServiceDiscovered(PeerHandle, byte[], List)}.
-         * <p>
-         * Note: in order to use this API the device must support Wi-Fi Aware
-         * {@link android.net.wifi.aware}. The peer device which is being ranged to must be
-         * configured to publish a service (with any name) with:
-         * <li>Type {@link android.net.wifi.aware.PublishConfig#PUBLISH_TYPE_UNSOLICITED}.
-         * <li>Ranging enabled
-         * {@link android.net.wifi.aware.PublishConfig.Builder#setRangingEnabled(boolean)}.
-         *
-         * @param peerHandle The peer handler of the peer Wi-Fi Aware device.
-         * @return The builder, to facilitate chaining {@code builder.setXXX(..).setXXX(..)}.
-         */
-        public Builder addWifiAwarePeer(@NonNull PeerHandle peerHandle) {
-            if (peerHandle == null) {
-                throw new IllegalArgumentException("Null peer handler (identifier)");
-            }
-
-            return addResponder(ResponderConfig.fromWifiAwarePeerHandleWithDefaults(peerHandle));
-        }
-
-        /**
-         * Add the Responder device specified by the {@link ResponderConfig} to the list of devices
-         * with which to measure range. The total number of peers added to the request cannot exceed
-         * the limit specified by {@link #getMaxPeers()}.
-         *
-         * @param responder Information on the RTT Responder.
-         * @return The builder, to facilitate chaining {@code builder.setXXX(..).setXXX(..)}.
-         *
-         * @hide
-         */
-        @SystemApi
-        public Builder addResponder(@NonNull ResponderConfig responder) {
-            if (responder == null) {
-                throw new IllegalArgumentException("Null Responder!");
-            }
-
-            mRttPeers.add(responder);
-            return this;
-        }
-
-        /**
-         * Build {@link RangingRequest} given the current configurations made on the
-         * builder.
-         */
-        public RangingRequest build() {
-            return new RangingRequest(mRttPeers);
-        }
-    }
-
-    @Override
-    public boolean equals(@Nullable Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (!(o instanceof RangingRequest)) {
-            return false;
-        }
-
-        RangingRequest lhs = (RangingRequest) o;
-
-        return mRttPeers.size() == lhs.mRttPeers.size() && mRttPeers.containsAll(lhs.mRttPeers);
-    }
-
-    @Override
-    public int hashCode() {
-        return mRttPeers.hashCode();
-    }
-}
diff --git a/wifi/java/android/net/wifi/rtt/RangingResult.java b/wifi/java/android/net/wifi/rtt/RangingResult.java
deleted file mode 100644
index a065bbc..0000000
--- a/wifi/java/android/net/wifi/rtt/RangingResult.java
+++ /dev/null
@@ -1,438 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.net.MacAddress;
-import android.net.wifi.aware.PeerHandle;
-import android.os.Parcel;
-import android.os.Parcelable;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * Ranging result for a request started by
- * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)}.
- * Results are returned in {@link RangingResultCallback#onRangingResults(List)}.
- * <p>
- * A ranging result is the distance measurement result for a single device specified in the
- * {@link RangingRequest}.
- */
-public final class RangingResult implements Parcelable {
-    private static final String TAG = "RangingResult";
-    private static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
-
-    /** @hide */
-    @IntDef({STATUS_SUCCESS, STATUS_FAIL, STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface RangeResultStatus {
-    }
-
-    /**
-     * Individual range request status, {@link #getStatus()}. Indicates ranging operation was
-     * successful and distance value is valid.
-     */
-    public static final int STATUS_SUCCESS = 0;
-
-    /**
-     * Individual range request status, {@link #getStatus()}. Indicates ranging operation failed
-     * and the distance value is invalid.
-     */
-    public static final int STATUS_FAIL = 1;
-
-    /**
-     * Individual range request status, {@link #getStatus()}. Indicates that the ranging operation
-     * failed because the specified peer does not support IEEE 802.11mc RTT operations. Support by
-     * an Access Point can be confirmed using
-     * {@link android.net.wifi.ScanResult#is80211mcResponder()}.
-     * <p>
-     * On such a failure, the individual result fields of {@link RangingResult} such as
-     * {@link RangingResult#getDistanceMm()} are invalid.
-     */
-    public static final int STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC = 2;
-
-    private final int mStatus;
-    private final MacAddress mMac;
-    private final PeerHandle mPeerHandle;
-    private final int mDistanceMm;
-    private final int mDistanceStdDevMm;
-    private final int mRssi;
-    private final int mNumAttemptedMeasurements;
-    private final int mNumSuccessfulMeasurements;
-    private final byte[] mLci;
-    private final byte[] mLcr;
-    private final ResponderLocation mResponderLocation;
-    private final long mTimestamp;
-
-    /** @hide */
-    public RangingResult(@RangeResultStatus int status, @NonNull MacAddress mac, int distanceMm,
-            int distanceStdDevMm, int rssi, int numAttemptedMeasurements,
-            int numSuccessfulMeasurements, byte[] lci, byte[] lcr,
-            ResponderLocation responderLocation, long timestamp) {
-        mStatus = status;
-        mMac = mac;
-        mPeerHandle = null;
-        mDistanceMm = distanceMm;
-        mDistanceStdDevMm = distanceStdDevMm;
-        mRssi = rssi;
-        mNumAttemptedMeasurements = numAttemptedMeasurements;
-        mNumSuccessfulMeasurements = numSuccessfulMeasurements;
-        mLci = lci == null ? EMPTY_BYTE_ARRAY : lci;
-        mLcr = lcr == null ? EMPTY_BYTE_ARRAY : lcr;
-        mResponderLocation = responderLocation;
-        mTimestamp = timestamp;
-    }
-
-    /** @hide */
-    public RangingResult(@RangeResultStatus int status, PeerHandle peerHandle, int distanceMm,
-            int distanceStdDevMm, int rssi, int numAttemptedMeasurements,
-            int numSuccessfulMeasurements, byte[] lci, byte[] lcr,
-            ResponderLocation responderLocation, long timestamp) {
-        mStatus = status;
-        mMac = null;
-        mPeerHandle = peerHandle;
-        mDistanceMm = distanceMm;
-        mDistanceStdDevMm = distanceStdDevMm;
-        mRssi = rssi;
-        mNumAttemptedMeasurements = numAttemptedMeasurements;
-        mNumSuccessfulMeasurements = numSuccessfulMeasurements;
-        mLci = lci == null ? EMPTY_BYTE_ARRAY : lci;
-        mLcr = lcr == null ? EMPTY_BYTE_ARRAY : lcr;
-        mResponderLocation = responderLocation;
-        mTimestamp = timestamp;
-    }
-
-    /**
-     * @return The status of ranging measurement: {@link #STATUS_SUCCESS} in case of success, and
-     * {@link #STATUS_FAIL} in case of failure.
-     */
-    @RangeResultStatus
-    public int getStatus() {
-        return mStatus;
-    }
-
-    /**
-     * @return The MAC address of the device whose range measurement was requested. Will correspond
-     * to the MAC address of the device in the {@link RangingRequest}.
-     * <p>
-     * Will return a {@code null} for results corresponding to requests issued using a {@code
-     * PeerHandle}, i.e. using the {@link RangingRequest.Builder#addWifiAwarePeer(PeerHandle)} API.
-     */
-    @Nullable
-    public MacAddress getMacAddress() {
-        return mMac;
-    }
-
-    /**
-     * @return The PeerHandle of the device whose reange measurement was requested. Will correspond
-     * to the PeerHandle of the devices requested using
-     * {@link RangingRequest.Builder#addWifiAwarePeer(PeerHandle)}.
-     * <p>
-     * Will return a {@code null} for results corresponding to requests issued using a MAC address.
-     */
-    @Nullable public PeerHandle getPeerHandle() {
-        return mPeerHandle;
-    }
-
-    /**
-     * @return The distance (in mm) to the device specified by {@link #getMacAddress()} or
-     * {@link #getPeerHandle()}.
-     * <p>
-     * Note: the measured distance may be negative for very close devices.
-     * <p>
-     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
-     * exception.
-     */
-    public int getDistanceMm() {
-        if (mStatus != STATUS_SUCCESS) {
-            throw new IllegalStateException(
-                    "getDistanceMm(): invoked on an invalid result: getStatus()=" + mStatus);
-        }
-        return mDistanceMm;
-    }
-
-    /**
-     * @return The standard deviation of the measured distance (in mm) to the device specified by
-     * {@link #getMacAddress()} or {@link #getPeerHandle()}. The standard deviation is calculated
-     * over the measurements executed in a single RTT burst. The number of measurements is returned
-     * by {@link #getNumSuccessfulMeasurements()} - 0 successful measurements indicate that the
-     * standard deviation is not valid (a valid standard deviation requires at least 2 data points).
-     * <p>
-     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
-     * exception.
-     */
-    public int getDistanceStdDevMm() {
-        if (mStatus != STATUS_SUCCESS) {
-            throw new IllegalStateException(
-                    "getDistanceStdDevMm(): invoked on an invalid result: getStatus()=" + mStatus);
-        }
-        return mDistanceStdDevMm;
-    }
-
-    /**
-     * @return The average RSSI, in units of dBm, observed during the RTT measurement.
-     * <p>
-     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
-     * exception.
-     */
-    public int getRssi() {
-        if (mStatus != STATUS_SUCCESS) {
-            throw new IllegalStateException(
-                    "getRssi(): invoked on an invalid result: getStatus()=" + mStatus);
-        }
-        return mRssi;
-    }
-
-    /**
-     * @return The number of attempted measurements used in the RTT exchange resulting in this set
-     * of results. The number of successful measurements is returned by
-     * {@link #getNumSuccessfulMeasurements()} which at most, if there are no errors, will be 1 less
-     * that the number of attempted measurements.
-     * <p>
-     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
-     * exception.
-     */
-    public int getNumAttemptedMeasurements() {
-        if (mStatus != STATUS_SUCCESS) {
-            throw new IllegalStateException(
-                    "getNumAttemptedMeasurements(): invoked on an invalid result: getStatus()="
-                            + mStatus);
-        }
-        return mNumAttemptedMeasurements;
-    }
-
-    /**
-     * @return The number of successful measurements used to calculate the distance and standard
-     * deviation. If the number of successful measurements if 1 then then standard deviation,
-     * returned by {@link #getDistanceStdDevMm()}, is not valid (a 0 is returned for the standard
-     * deviation).
-     * <p>
-     * The total number of measurement attempts is returned by
-     * {@link #getNumAttemptedMeasurements()}. The number of successful measurements will be at
-     * most 1 less then the number of attempted measurements.
-     * <p>
-     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
-     * exception.
-     */
-    public int getNumSuccessfulMeasurements() {
-        if (mStatus != STATUS_SUCCESS) {
-            throw new IllegalStateException(
-                    "getNumSuccessfulMeasurements(): invoked on an invalid result: getStatus()="
-                            + mStatus);
-        }
-        return mNumSuccessfulMeasurements;
-    }
-
-    /**
-     * @return The unverified responder location represented as {@link ResponderLocation} which
-     * captures location information the responder is programmed to broadcast. The responder
-     * location is referred to as unverified, because we are relying on the device/site
-     * administrator to correctly configure its location data.
-     * <p>
-     * Will return a {@code null} when the location information cannot be parsed.
-     * <p>
-     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
-     * exception.
-     */
-    @Nullable
-    public ResponderLocation getUnverifiedResponderLocation() {
-        if (mStatus != STATUS_SUCCESS) {
-            throw new IllegalStateException(
-                    "getUnverifiedResponderLocation(): invoked on an invalid result: getStatus()="
-                            + mStatus);
-        }
-        return mResponderLocation;
-    }
-
-    /**
-     * @return The Location Configuration Information (LCI) as self-reported by the peer. The format
-     * is specified in the IEEE 802.11-2016 specifications, section 9.4.2.22.10.
-     * <p>
-     * Note: the information is NOT validated - use with caution. Consider validating it with
-     * other sources of information before using it.
-     *
-     * @hide
-     */
-    @SystemApi
-    @NonNull
-    public byte[] getLci() {
-        if (mStatus != STATUS_SUCCESS) {
-            throw new IllegalStateException(
-                    "getLci(): invoked on an invalid result: getStatus()=" + mStatus);
-        }
-        return mLci;
-    }
-
-    /**
-     * @return The Location Civic report (LCR) as self-reported by the peer. The format
-     * is specified in the IEEE 802.11-2016 specifications, section 9.4.2.22.13.
-     * <p>
-     * Note: the information is NOT validated - use with caution. Consider validating it with
-     * other sources of information before using it.
-     *
-     * @hide
-     */
-    @SystemApi
-    @NonNull
-    public byte[] getLcr() {
-        if (mStatus != STATUS_SUCCESS) {
-            throw new IllegalStateException(
-                    "getReportedLocationCivic(): invoked on an invalid result: getStatus()="
-                            + mStatus);
-        }
-        return mLcr;
-    }
-
-    /**
-     * @return The timestamp at which the ranging operation was performed. The timestamp is in
-     * milliseconds since boot, including time spent in sleep, corresponding to values provided by
-     * {@link android.os.SystemClock#elapsedRealtime()}.
-     * <p>
-     * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
-     * exception.
-     */
-    public long getRangingTimestampMillis() {
-        if (mStatus != STATUS_SUCCESS) {
-            throw new IllegalStateException(
-                    "getRangingTimestampMillis(): invoked on an invalid result: getStatus()="
-                            + mStatus);
-        }
-        return mTimestamp;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        dest.writeInt(mStatus);
-        if (mMac == null) {
-            dest.writeBoolean(false);
-        } else {
-            dest.writeBoolean(true);
-            mMac.writeToParcel(dest, flags);
-        }
-        if (mPeerHandle == null) {
-            dest.writeBoolean(false);
-        } else {
-            dest.writeBoolean(true);
-            dest.writeInt(mPeerHandle.peerId);
-        }
-        dest.writeInt(mDistanceMm);
-        dest.writeInt(mDistanceStdDevMm);
-        dest.writeInt(mRssi);
-        dest.writeInt(mNumAttemptedMeasurements);
-        dest.writeInt(mNumSuccessfulMeasurements);
-        dest.writeByteArray(mLci);
-        dest.writeByteArray(mLcr);
-        dest.writeParcelable(mResponderLocation, flags);
-        dest.writeLong(mTimestamp);
-    }
-
-    public static final @android.annotation.NonNull Creator<RangingResult> CREATOR = new Creator<RangingResult>() {
-        @Override
-        public RangingResult[] newArray(int size) {
-            return new RangingResult[size];
-        }
-
-        @Override
-        public RangingResult createFromParcel(Parcel in) {
-            int status = in.readInt();
-            boolean macAddressPresent = in.readBoolean();
-            MacAddress mac = null;
-            if (macAddressPresent) {
-                mac = MacAddress.CREATOR.createFromParcel(in);
-            }
-            boolean peerHandlePresent = in.readBoolean();
-            PeerHandle peerHandle = null;
-            if (peerHandlePresent) {
-                peerHandle = new PeerHandle(in.readInt());
-            }
-            int distanceMm = in.readInt();
-            int distanceStdDevMm = in.readInt();
-            int rssi = in.readInt();
-            int numAttemptedMeasurements = in.readInt();
-            int numSuccessfulMeasurements = in.readInt();
-            byte[] lci = in.createByteArray();
-            byte[] lcr = in.createByteArray();
-            ResponderLocation responderLocation =
-                    in.readParcelable(this.getClass().getClassLoader());
-            long timestamp = in.readLong();
-            if (peerHandlePresent) {
-                return new RangingResult(status, peerHandle, distanceMm, distanceStdDevMm, rssi,
-                        numAttemptedMeasurements, numSuccessfulMeasurements, lci, lcr,
-                        responderLocation, timestamp);
-            } else {
-                return new RangingResult(status, mac, distanceMm, distanceStdDevMm, rssi,
-                        numAttemptedMeasurements, numSuccessfulMeasurements, lci, lcr,
-                        responderLocation, timestamp);
-            }
-        }
-    };
-
-    /** @hide */
-    @Override
-    public String toString() {
-        return new StringBuilder("RangingResult: [status=").append(mStatus).append(", mac=").append(
-                mMac).append(", peerHandle=").append(
-                mPeerHandle == null ? "<null>" : mPeerHandle.peerId).append(", distanceMm=").append(
-                mDistanceMm).append(", distanceStdDevMm=").append(mDistanceStdDevMm).append(
-                ", rssi=").append(mRssi).append(", numAttemptedMeasurements=").append(
-                mNumAttemptedMeasurements).append(", numSuccessfulMeasurements=").append(
-                mNumSuccessfulMeasurements).append(", lci=").append(mLci).append(", lcr=").append(
-                mLcr).append(", responderLocation=").append(mResponderLocation)
-                .append(", timestamp=").append(mTimestamp).append("]").toString();
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (!(o instanceof RangingResult)) {
-            return false;
-        }
-
-        RangingResult lhs = (RangingResult) o;
-
-        return mStatus == lhs.mStatus && Objects.equals(mMac, lhs.mMac) && Objects.equals(
-                mPeerHandle, lhs.mPeerHandle) && mDistanceMm == lhs.mDistanceMm
-                && mDistanceStdDevMm == lhs.mDistanceStdDevMm && mRssi == lhs.mRssi
-                && mNumAttemptedMeasurements == lhs.mNumAttemptedMeasurements
-                && mNumSuccessfulMeasurements == lhs.mNumSuccessfulMeasurements
-                && Arrays.equals(mLci, lhs.mLci) && Arrays.equals(mLcr, lhs.mLcr)
-                && mTimestamp == lhs.mTimestamp
-                && Objects.equals(mResponderLocation, lhs.mResponderLocation);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mStatus, mMac, mPeerHandle, mDistanceMm, mDistanceStdDevMm, mRssi,
-                mNumAttemptedMeasurements, mNumSuccessfulMeasurements, mLci, mLcr,
-                mResponderLocation, mTimestamp);
-    }
-}
diff --git a/wifi/java/android/net/wifi/rtt/RangingResultCallback.java b/wifi/java/android/net/wifi/rtt/RangingResultCallback.java
deleted file mode 100644
index fa7d79e..0000000
--- a/wifi/java/android/net/wifi/rtt/RangingResultCallback.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.List;
-
-/**
- * Base class for ranging result callbacks. Should be extended by applications and set when calling
- * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)}.
- * If the ranging operation fails in whole (not attempted) then {@link #onRangingFailure(int)}
- * will be called with a failure code. If the ranging operation is performed for each of the
- * requested peers then the {@link #onRangingResults(List)} will be called with the set of
- * results (@link {@link RangingResult}, each of which has its own success/failure code
- * {@link RangingResult#getStatus()}.
- */
-public abstract class RangingResultCallback {
-    /** @hide */
-    @IntDef({STATUS_CODE_FAIL, STATUS_CODE_FAIL_RTT_NOT_AVAILABLE})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface RangingOperationStatus {
-    }
-
-    /**
-     * A failure code for the whole ranging request operation. Indicates a failure.
-     */
-    public static final int STATUS_CODE_FAIL = 1;
-
-    /**
-     * A failure code for the whole ranging request operation. Indicates that the request failed due
-     * to RTT not being available - e.g. Wi-Fi was disabled. Use the
-     * {@link WifiRttManager#isAvailable()} and {@link WifiRttManager#ACTION_WIFI_RTT_STATE_CHANGED}
-     * to track RTT availability.
-     */
-    public static final int STATUS_CODE_FAIL_RTT_NOT_AVAILABLE = 2;
-
-    /**
-     * Called when a ranging operation failed in whole - i.e. no ranging operation to any of the
-     * devices specified in the request was attempted.
-     *
-     * @param code A status code indicating the type of failure.
-     */
-    public abstract void onRangingFailure(@RangingOperationStatus int code);
-
-    /**
-     * Called when a ranging operation was executed. The list of results corresponds to devices
-     * specified in the ranging request.
-     *
-     * @param results List of range measurements, one per requested device.
-     */
-    public abstract void onRangingResults(@NonNull List<RangingResult> results);
-}
diff --git a/wifi/java/android/net/wifi/rtt/ResponderConfig.java b/wifi/java/android/net/wifi/rtt/ResponderConfig.java
deleted file mode 100644
index be4eecc..0000000
--- a/wifi/java/android/net/wifi/rtt/ResponderConfig.java
+++ /dev/null
@@ -1,514 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import static android.net.wifi.ScanResult.InformationElement.EID_EXTENSION_PRESENT;
-import static android.net.wifi.ScanResult.InformationElement.EID_EXT_HE_CAPABILITIES;
-import static android.net.wifi.ScanResult.InformationElement.EID_HT_CAPABILITIES;
-import static android.net.wifi.ScanResult.InformationElement.EID_VHT_CAPABILITIES;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SystemApi;
-import android.net.MacAddress;
-import android.net.wifi.ScanResult;
-import android.net.wifi.aware.PeerHandle;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.util.Log;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.util.Objects;
-
-/**
- * Defines the configuration of an IEEE 802.11mc Responder. The Responder may be an Access Point
- * (AP), a Wi-Fi Aware device, or a manually configured Responder.
- * <p>
- * A Responder configuration may be constructed from a {@link ScanResult} or manually (with the
- * data obtained out-of-band from a peer).
- *
- * @hide
- */
-@SystemApi
-public final class ResponderConfig implements Parcelable {
-    private static final String TAG = "ResponderConfig";
-    private static final int AWARE_BAND_2_DISCOVERY_CHANNEL = 2437;
-
-    /** @hide */
-    @IntDef({RESPONDER_AP, RESPONDER_STA, RESPONDER_P2P_GO, RESPONDER_P2P_CLIENT, RESPONDER_AWARE})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface ResponderType {
-    }
-
-    /**
-     * Responder is an AP.
-     */
-    public static final int RESPONDER_AP = 0;
-    /**
-     * Responder is a STA.
-     */
-    public static final int RESPONDER_STA = 1;
-    /**
-     * Responder is a Wi-Fi Direct Group Owner (GO).
-     */
-    public static final int RESPONDER_P2P_GO = 2;
-    /**
-     * Responder is a Wi-Fi Direct Group Client.
-     */
-    public static final int RESPONDER_P2P_CLIENT = 3;
-    /**
-     * Responder is a Wi-Fi Aware device.
-     */
-    public static final int RESPONDER_AWARE = 4;
-
-
-    /** @hide */
-    @IntDef({
-            CHANNEL_WIDTH_20MHZ, CHANNEL_WIDTH_40MHZ, CHANNEL_WIDTH_80MHZ, CHANNEL_WIDTH_160MHZ,
-            CHANNEL_WIDTH_80MHZ_PLUS_MHZ})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface ChannelWidth {
-    }
-
-    /**
-     * Channel bandwidth is 20 MHZ
-     */
-    public static final int CHANNEL_WIDTH_20MHZ = 0;
-    /**
-     * Channel bandwidth is 40 MHZ
-     */
-    public static final int CHANNEL_WIDTH_40MHZ = 1;
-    /**
-     * Channel bandwidth is 80 MHZ
-     */
-    public static final int CHANNEL_WIDTH_80MHZ = 2;
-    /**
-     * Channel bandwidth is 160 MHZ
-     */
-    public static final int CHANNEL_WIDTH_160MHZ = 3;
-    /**
-     * Channel bandwidth is 160 MHZ, but 80MHZ + 80MHZ
-     */
-    public static final int CHANNEL_WIDTH_80MHZ_PLUS_MHZ = 4;
-
-    /** @hide */
-    @IntDef({PREAMBLE_LEGACY, PREAMBLE_HT, PREAMBLE_VHT, PREAMBLE_HE})
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface PreambleType {
-    }
-
-    /**
-     * Preamble type: Legacy.
-     */
-    public static final int PREAMBLE_LEGACY = 0;
-
-    /**
-     * Preamble type: HT.
-     */
-    public static final int PREAMBLE_HT = 1;
-
-    /**
-     * Preamble type: VHT.
-     */
-    public static final int PREAMBLE_VHT = 2;
-
-    /**
-     * Preamble type: HE.
-     */
-    public static final int PREAMBLE_HE = 3;
-
-    /**
-     * The MAC address of the Responder. Will be null if a Wi-Fi Aware peer identifier (the
-     * peerHandle field) ise used to identify the Responder.
-     */
-    public final MacAddress macAddress;
-
-    /**
-     * The peer identifier of a Wi-Fi Aware Responder. Will be null if a MAC Address (the macAddress
-     * field) is used to identify the Responder.
-     */
-    public final PeerHandle peerHandle;
-
-    /**
-     * The device type of the Responder.
-     */
-    public final int responderType;
-
-    /**
-     * Indicates whether the Responder device supports IEEE 802.11mc.
-     */
-    public final boolean supports80211mc;
-
-    /**
-     * Responder channel bandwidth, specified using {@link ChannelWidth}.
-     */
-    public final int channelWidth;
-
-    /**
-     * The primary 20 MHz frequency (in MHz) of the channel of the Responder.
-     */
-    public final int frequency;
-
-    /**
-     * Not used if the {@link #channelWidth} is 20 MHz. If the Responder uses 40, 80 or 160 MHz,
-     * this is the center frequency (in MHz), if the Responder uses 80 + 80 MHz, this is the
-     * center frequency of the first segment (in MHz).
-     */
-    public final int centerFreq0;
-
-    /**
-     * Only used if the {@link #channelWidth} is 80 + 80 MHz. If the Responder uses 80 + 80 MHz,
-     * this is the center frequency of the second segment (in MHz).
-     */
-    public final int centerFreq1;
-
-    /**
-     * The preamble used by the Responder, specified using {@link PreambleType}.
-     */
-    public final int preamble;
-
-    /**
-     * Constructs Responder configuration, using a MAC address to identify the Responder.
-     *
-     * @param macAddress      The MAC address of the Responder.
-     * @param responderType   The type of the responder device, specified using
-     *                        {@link ResponderType}.
-     * @param supports80211mc Indicates whether the responder supports IEEE 802.11mc.
-     * @param channelWidth    Responder channel bandwidth, specified using {@link ChannelWidth}.
-     * @param frequency       The primary 20 MHz frequency (in MHz) of the channel of the Responder.
-     * @param centerFreq0     Not used if the {@code channelWidth} is 20 MHz. If the Responder uses
-     *                        40, 80 or 160 MHz, this is the center frequency (in MHz), if the
-     *                        Responder uses 80 + 80 MHz, this is the center frequency of the first
-     *                        segment (in MHz).
-     * @param centerFreq1     Only used if the {@code channelWidth} is 80 + 80 MHz. If the
-     *                        Responder
-     *                        uses 80 + 80 MHz, this is the center frequency of the second segment
-     *                        (in
-     *                        MHz).
-     * @param preamble        The preamble used by the Responder, specified using
-     *                        {@link PreambleType}.
-     */
-    public ResponderConfig(@NonNull MacAddress macAddress, @ResponderType int responderType,
-            boolean supports80211mc, @ChannelWidth int channelWidth, int frequency, int centerFreq0,
-            int centerFreq1, @PreambleType int preamble) {
-        if (macAddress == null) {
-            throw new IllegalArgumentException(
-                    "Invalid ResponderConfig - must specify a MAC address");
-        }
-        this.macAddress = macAddress;
-        this.peerHandle = null;
-        this.responderType = responderType;
-        this.supports80211mc = supports80211mc;
-        this.channelWidth = channelWidth;
-        this.frequency = frequency;
-        this.centerFreq0 = centerFreq0;
-        this.centerFreq1 = centerFreq1;
-        this.preamble = preamble;
-    }
-
-    /**
-     * Constructs Responder configuration, using a Wi-Fi Aware PeerHandle to identify the Responder.
-     *
-     * @param peerHandle      The Wi-Fi Aware peer identifier of the Responder.
-     * @param responderType   The type of the responder device, specified using
-     *                        {@link ResponderType}.
-     * @param supports80211mc Indicates whether the responder supports IEEE 802.11mc.
-     * @param channelWidth    Responder channel bandwidth, specified using {@link ChannelWidth}.
-     * @param frequency       The primary 20 MHz frequency (in MHz) of the channel of the Responder.
-     * @param centerFreq0     Not used if the {@code channelWidth} is 20 MHz. If the Responder uses
-     *                        40, 80 or 160 MHz, this is the center frequency (in MHz), if the
-     *                        Responder uses 80 + 80 MHz, this is the center frequency of the first
-     *                        segment (in MHz).
-     * @param centerFreq1     Only used if the {@code channelWidth} is 80 + 80 MHz. If the
-     *                        Responder
-     *                        uses 80 + 80 MHz, this is the center frequency of the second segment
-     *                        (in
-     *                        MHz).
-     * @param preamble        The preamble used by the Responder, specified using
-     *                        {@link PreambleType}.
-     */
-    public ResponderConfig(@NonNull PeerHandle peerHandle, @ResponderType int responderType,
-            boolean supports80211mc, @ChannelWidth int channelWidth, int frequency, int centerFreq0,
-            int centerFreq1, @PreambleType int preamble) {
-        this.macAddress = null;
-        this.peerHandle = peerHandle;
-        this.responderType = responderType;
-        this.supports80211mc = supports80211mc;
-        this.channelWidth = channelWidth;
-        this.frequency = frequency;
-        this.centerFreq0 = centerFreq0;
-        this.centerFreq1 = centerFreq1;
-        this.preamble = preamble;
-    }
-
-    /**
-     * Constructs Responder configuration. This is an internal-only constructor which specifies both
-     * a MAC address and a Wi-Fi PeerHandle to identify the Responder.
-     *
-     * @param macAddress      The MAC address of the Responder.
-     * @param peerHandle      The Wi-Fi Aware peer identifier of the Responder.
-     * @param responderType   The type of the responder device, specified using
-     *                        {@link ResponderType}.
-     * @param supports80211mc Indicates whether the responder supports IEEE 802.11mc.
-     * @param channelWidth    Responder channel bandwidth, specified using {@link ChannelWidth}.
-     * @param frequency       The primary 20 MHz frequency (in MHz) of the channel of the Responder.
-     * @param centerFreq0     Not used if the {@code channelWidth} is 20 MHz. If the Responder uses
-     *                        40, 80 or 160 MHz, this is the center frequency (in MHz), if the
-     *                        Responder uses 80 + 80 MHz, this is the center frequency of the first
-     *                        segment (in MHz).
-     * @param centerFreq1     Only used if the {@code channelWidth} is 80 + 80 MHz. If the
-     *                        Responder
-     *                        uses 80 + 80 MHz, this is the center frequency of the second segment
-     *                        (in
-     *                        MHz).
-     * @param preamble        The preamble used by the Responder, specified using
-     *                        {@link PreambleType}.
-     * @hide
-     */
-    public ResponderConfig(@NonNull MacAddress macAddress, @NonNull PeerHandle peerHandle,
-            @ResponderType int responderType, boolean supports80211mc,
-            @ChannelWidth int channelWidth, int frequency, int centerFreq0, int centerFreq1,
-            @PreambleType int preamble) {
-        this.macAddress = macAddress;
-        this.peerHandle = peerHandle;
-        this.responderType = responderType;
-        this.supports80211mc = supports80211mc;
-        this.channelWidth = channelWidth;
-        this.frequency = frequency;
-        this.centerFreq0 = centerFreq0;
-        this.centerFreq1 = centerFreq1;
-        this.preamble = preamble;
-    }
-
-    /**
-     * Creates a Responder configuration from a {@link ScanResult} corresponding to an Access
-     * Point (AP), which can be obtained from {@link android.net.wifi.WifiManager#getScanResults()}.
-     */
-    public static ResponderConfig fromScanResult(ScanResult scanResult) {
-        MacAddress macAddress = MacAddress.fromString(scanResult.BSSID);
-        int responderType = RESPONDER_AP;
-        boolean supports80211mc = scanResult.is80211mcResponder();
-        int channelWidth = translateScanResultChannelWidth(scanResult.channelWidth);
-        int frequency = scanResult.frequency;
-        int centerFreq0 = scanResult.centerFreq0;
-        int centerFreq1 = scanResult.centerFreq1;
-
-        int preamble;
-        if (scanResult.informationElements != null && scanResult.informationElements.length != 0) {
-            boolean htCapabilitiesPresent = false;
-            boolean vhtCapabilitiesPresent = false;
-            boolean heCapabilitiesPresent = false;
-
-            for (ScanResult.InformationElement ie : scanResult.informationElements) {
-                if (ie.id == EID_HT_CAPABILITIES) {
-                    htCapabilitiesPresent = true;
-                } else if (ie.id == EID_VHT_CAPABILITIES) {
-                    vhtCapabilitiesPresent = true;
-                } else if (ie.id == EID_EXTENSION_PRESENT && ie.idExt == EID_EXT_HE_CAPABILITIES) {
-                    heCapabilitiesPresent = true;
-                }
-            }
-
-            if (heCapabilitiesPresent) {
-                preamble = PREAMBLE_HE;
-            } else if (vhtCapabilitiesPresent) {
-                preamble = PREAMBLE_VHT;
-            } else if (htCapabilitiesPresent) {
-                preamble = PREAMBLE_HT;
-            } else {
-                preamble = PREAMBLE_LEGACY;
-            }
-        } else {
-            Log.e(TAG, "Scan Results do not contain IEs - using backup method to select preamble");
-            if (channelWidth == CHANNEL_WIDTH_80MHZ || channelWidth == CHANNEL_WIDTH_160MHZ) {
-                preamble = PREAMBLE_VHT;
-            } else {
-                preamble = PREAMBLE_HT;
-            }
-        }
-
-        return new ResponderConfig(macAddress, responderType, supports80211mc, channelWidth,
-                frequency, centerFreq0, centerFreq1, preamble);
-    }
-
-    /**
-     * Creates a Responder configuration from a MAC address corresponding to a Wi-Fi Aware
-     * Responder. The Responder parameters are set to defaults.
-     */
-    public static ResponderConfig fromWifiAwarePeerMacAddressWithDefaults(MacAddress macAddress) {
-        /* Note: the parameters are those of the Aware discovery channel (channel 6). A Responder
-         * is expected to be brought up and available to negotiate a maximum accuracy channel
-         * (i.e. Band 5 @ 80MHz). A Responder is brought up on the peer by starting an Aware
-         * Unsolicited Publisher with Ranging enabled.
-         */
-        return new ResponderConfig(macAddress, RESPONDER_AWARE, true, CHANNEL_WIDTH_20MHZ,
-                AWARE_BAND_2_DISCOVERY_CHANNEL, 0, 0, PREAMBLE_HT);
-    }
-
-    /**
-     * Creates a Responder configuration from a {@link PeerHandle} corresponding to a Wi-Fi Aware
-     * Responder. The Responder parameters are set to defaults.
-     */
-    public static ResponderConfig fromWifiAwarePeerHandleWithDefaults(PeerHandle peerHandle) {
-        /* Note: the parameters are those of the Aware discovery channel (channel 6). A Responder
-         * is expected to be brought up and available to negotiate a maximum accuracy channel
-         * (i.e. Band 5 @ 80MHz). A Responder is brought up on the peer by starting an Aware
-         * Unsolicited Publisher with Ranging enabled.
-         */
-        return new ResponderConfig(peerHandle, RESPONDER_AWARE, true, CHANNEL_WIDTH_20MHZ,
-                AWARE_BAND_2_DISCOVERY_CHANNEL, 0, 0, PREAMBLE_HT);
-    }
-
-    /**
-     * Check whether the Responder configuration is valid.
-     *
-     * @return true if valid, false otherwise.
-     * @hide
-     */
-    public boolean isValid(boolean awareSupported) {
-        if (macAddress == null && peerHandle == null || macAddress != null && peerHandle != null) {
-            return false;
-        }
-        if (!awareSupported && responderType == RESPONDER_AWARE) {
-            return false;
-        }
-
-        return true;
-    }
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel dest, int flags) {
-        if (macAddress == null) {
-            dest.writeBoolean(false);
-        } else {
-            dest.writeBoolean(true);
-            macAddress.writeToParcel(dest, flags);
-        }
-        if (peerHandle == null) {
-            dest.writeBoolean(false);
-        } else {
-            dest.writeBoolean(true);
-            dest.writeInt(peerHandle.peerId);
-        }
-        dest.writeInt(responderType);
-        dest.writeInt(supports80211mc ? 1 : 0);
-        dest.writeInt(channelWidth);
-        dest.writeInt(frequency);
-        dest.writeInt(centerFreq0);
-        dest.writeInt(centerFreq1);
-        dest.writeInt(preamble);
-    }
-
-    public static final @android.annotation.NonNull Creator<ResponderConfig> CREATOR = new Creator<ResponderConfig>() {
-        @Override
-        public ResponderConfig[] newArray(int size) {
-            return new ResponderConfig[size];
-        }
-
-        @Override
-        public ResponderConfig createFromParcel(Parcel in) {
-            boolean macAddressPresent = in.readBoolean();
-            MacAddress macAddress = null;
-            if (macAddressPresent) {
-                macAddress = MacAddress.CREATOR.createFromParcel(in);
-            }
-            boolean peerHandlePresent = in.readBoolean();
-            PeerHandle peerHandle = null;
-            if (peerHandlePresent) {
-                peerHandle = new PeerHandle(in.readInt());
-            }
-            int responderType = in.readInt();
-            boolean supports80211mc = in.readInt() == 1;
-            int channelWidth = in.readInt();
-            int frequency = in.readInt();
-            int centerFreq0 = in.readInt();
-            int centerFreq1 = in.readInt();
-            int preamble = in.readInt();
-
-            if (peerHandle == null) {
-                return new ResponderConfig(macAddress, responderType, supports80211mc, channelWidth,
-                        frequency, centerFreq0, centerFreq1, preamble);
-            } else {
-                return new ResponderConfig(peerHandle, responderType, supports80211mc, channelWidth,
-                        frequency, centerFreq0, centerFreq1, preamble);
-            }
-        }
-    };
-
-    @Override
-    public boolean equals(@Nullable Object o) {
-        if (this == o) {
-            return true;
-        }
-
-        if (!(o instanceof ResponderConfig)) {
-            return false;
-        }
-
-        ResponderConfig lhs = (ResponderConfig) o;
-
-        return Objects.equals(macAddress, lhs.macAddress) && Objects.equals(peerHandle,
-                lhs.peerHandle) && responderType == lhs.responderType
-                && supports80211mc == lhs.supports80211mc && channelWidth == lhs.channelWidth
-                && frequency == lhs.frequency && centerFreq0 == lhs.centerFreq0
-                && centerFreq1 == lhs.centerFreq1 && preamble == lhs.preamble;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(macAddress, peerHandle, responderType, supports80211mc, channelWidth,
-                frequency, centerFreq0, centerFreq1, preamble);
-    }
-
-    /** @hide */
-    @Override
-    public String toString() {
-        return new StringBuffer("ResponderConfig: macAddress=").append(macAddress).append(
-                ", peerHandle=").append(peerHandle == null ? "<null>" : peerHandle.peerId).append(
-                ", responderType=").append(responderType).append(", supports80211mc=").append(
-                supports80211mc).append(", channelWidth=").append(channelWidth).append(
-                ", frequency=").append(frequency).append(", centerFreq0=").append(
-                centerFreq0).append(", centerFreq1=").append(centerFreq1).append(
-                ", preamble=").append(preamble).toString();
-    }
-
-    /** @hide */
-    static int translateScanResultChannelWidth(int scanResultChannelWidth) {
-        switch (scanResultChannelWidth) {
-            case ScanResult.CHANNEL_WIDTH_20MHZ:
-                return CHANNEL_WIDTH_20MHZ;
-            case ScanResult.CHANNEL_WIDTH_40MHZ:
-                return CHANNEL_WIDTH_40MHZ;
-            case ScanResult.CHANNEL_WIDTH_80MHZ:
-                return CHANNEL_WIDTH_80MHZ;
-            case ScanResult.CHANNEL_WIDTH_160MHZ:
-                return CHANNEL_WIDTH_160MHZ;
-            case ScanResult.CHANNEL_WIDTH_80MHZ_PLUS_MHZ:
-                return CHANNEL_WIDTH_80MHZ_PLUS_MHZ;
-            default:
-                throw new IllegalArgumentException(
-                        "translateScanResultChannelWidth: bad " + scanResultChannelWidth);
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/rtt/ResponderLocation.java b/wifi/java/android/net/wifi/rtt/ResponderLocation.java
deleted file mode 100644
index 218b2dca..0000000
--- a/wifi/java/android/net/wifi/rtt/ResponderLocation.java
+++ /dev/null
@@ -1,1427 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import static java.lang.annotation.RetentionPolicy.SOURCE;
-
-import android.annotation.IntDef;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.SuppressLint;
-import android.annotation.SystemApi;
-import android.location.Address;
-import android.location.Location;
-import android.net.MacAddress;
-import android.net.Uri;
-import android.net.wifi.rtt.CivicLocationKeys.CivicLocationKeysType;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.text.TextUtils;
-import android.util.SparseArray;
-import android.webkit.MimeTypeMap;
-
-import java.lang.annotation.Retention;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-/**
- * ResponderLocation is both a Location Configuration Information (LCI) decoder and a Location Civic
- * Report (LCR) decoder for information received from a Wi-Fi Access Point (AP) during Wi-Fi RTT
- * ranging process.
- *
- * <p>This is based on the IEEE P802.11-REVmc/D8.0 spec section 9.4.2.22, under Measurement Report
- * Element. Subelement location data-fields parsed from separate input LCI and LCR Information
- * Elements are unified in this class.</p>
- *
- * <p>Note: The information provided by this class is broadcast by a responder (usually an Access
- * Point), and passed on as-is. There is no guarantee this information is accurate or correct, and
- * as a result developers should carefully consider how this information should be used and provide
- * corresponding advice to users.</p>
- */
-public final class ResponderLocation implements Parcelable {
-    private static final int BYTE_MASK = 0xFF;
-    private static final int LSB_IN_BYTE = 0x01;
-    private static final int MSB_IN_BYTE = 0x80;
-    private static final int MIN_BUFFER_SIZE = 3; // length of LEAD_LCI_ELEMENT_BYTES
-    private static final int MAX_BUFFER_SIZE = 256;
-
-    // Information Element (IE) fields
-    private static final byte MEASUREMENT_TOKEN_AUTONOMOUS = 0x01;
-    private static final byte MEASUREMENT_REPORT_MODE = 0x00;
-    private static final byte MEASUREMENT_TYPE_LCI = 0x08;
-    private static final byte MEASUREMENT_TYPE_LCR = 0x0b;
-
-    // LCI Subelement IDs
-    private static final byte SUBELEMENT_LCI = 0x00;
-    private static final byte SUBELEMENT_Z = 0x04;
-    private static final byte SUBELEMENT_USAGE = 0x06;
-    private static final byte SUBELEMENT_BSSID_LIST = 0x07;
-
-    // LCI Subelement Lengths
-    private static final int SUBELEMENT_LCI_LENGTH = 16;
-    private static final int SUBELEMENT_Z_LENGTH = 6;
-    private static final int SUBELEMENT_USAGE_LENGTH1 = 1;
-    private static final int SUBELEMENT_USAGE_LENGTH3 = 3;
-    private static final int SUBELEMENT_BSSID_LIST_MIN_BUFFER_LENGTH = 1;
-
-    private static final byte[] LEAD_LCI_ELEMENT_BYTES = {
-            MEASUREMENT_TOKEN_AUTONOMOUS, MEASUREMENT_REPORT_MODE, MEASUREMENT_TYPE_LCI
-    };
-
-    // Subelement LCI constants
-
-    /* The LCI subelement bit-field lengths are described in Figure 9-214 of the REVmc spec and
-    represented here as a an array of integers */
-    private static final int[] SUBELEMENT_LCI_BIT_FIELD_LENGTHS = {
-            6, 34, 6, 34, 4, 6, 30, 3, 1, 1, 1, 2
-    };
-    private static final int LATLNG_FRACTION_BITS = 25;
-    private static final int LATLNG_UNCERTAINTY_BASE = 8;
-    private static final int ALTITUDE_FRACTION_BITS = 8;
-    private static final int ALTITUDE_UNCERTAINTY_BASE = 21;
-    private static final double LAT_ABS_LIMIT = 90.0;
-    private static final double LNG_ABS_LIMIT = 180.0;
-    private static final int UNCERTAINTY_UNDEFINED = 0;
-
-    // Subelement LCI fields indices
-    private static final int SUBELEMENT_LCI_LAT_UNCERTAINTY_INDEX = 0;
-    private static final int SUBELEMENT_LCI_LAT_INDEX = 1;
-    private static final int SUBELEMENT_LCI_LNG_UNCERTAINTY_INDEX = 2;
-    private static final int SUBELEMENT_LCI_LNG_INDEX = 3;
-    private static final int SUBELEMENT_LCI_ALT_TYPE_INDEX = 4;
-    private static final int SUBELEMENT_LCI_ALT_UNCERTAINTY_INDEX = 5;
-    private static final int SUBELEMENT_LCI_ALT_INDEX = 6;
-    private static final int SUBELEMENT_LCI_DATUM_INDEX = 7;
-    private static final int SUBELEMENT_LCI_REGLOC_AGREEMENT_INDEX = 8;
-    private static final int SUBELEMENT_LCI_REGLOC_DSE_INDEX = 9;
-    private static final int SUBELEMENT_LCI_DEPENDENT_STA_INDEX = 10;
-    private static final int SUBELEMENT_LCI_VERSION_INDEX = 11;
-
-    /**
-     * The Altitude value is interpreted based on the Altitude Type, and the selected mDatum.
-     *
-     * @hide
-     */
-    @Retention(SOURCE)
-    @IntDef({ALTITUDE_UNDEFINED, ALTITUDE_METERS, ALTITUDE_FLOORS})
-    public @interface AltitudeType {
-    }
-
-    /**
-     * Altitude is not defined for the Responder.
-     * The altitude and altitude uncertainty should not be used: see section 2.4 of IETF RFC 6225.
-     */
-    public static final int ALTITUDE_UNDEFINED = 0;
-    /** Responder Altitude is measured in meters.  */
-    public static final int ALTITUDE_METERS = 1;
-    /** Responder Altitude is measured in floors. */
-    public static final int ALTITUDE_FLOORS = 2;
-
-    /**
-     * The Datum value determines how coordinates are organized in relation to the real world.
-     *
-     * @hide
-     */
-    @Retention(SOURCE)
-    @IntDef({DATUM_UNDEFINED, DATUM_WGS84, DATUM_NAD83_NAV88, DATUM_NAD83_MLLW})
-    public @interface DatumType {
-    }
-
-    /** Datum is not defined. */
-    public static final int DATUM_UNDEFINED = 0;
-    /** Datum used is WGS84. */
-    public static final int DATUM_WGS84 = 1;
-    /** Datum used is NAD83 NAV88. */
-    public static final int DATUM_NAD83_NAV88 = 2;
-    /** Datum used is NAD83 MLLW. */
-    public static final int DATUM_NAD83_MLLW = 3;
-
-
-    /** Version of the LCI protocol is 1.0, the only defined protocol at this time. */
-    public static final int LCI_VERSION_1 = 1;
-
-    /** Provider/Source of the location */
-    private static final String LOCATION_PROVIDER = "WiFi Access Point";
-
-    // LCI Subelement Z constants
-    private static final int[] SUBELEMENT_Z_BIT_FIELD_LENGTHS = {2, 14, 24, 8};
-    private static final int Z_FLOOR_NUMBER_FRACTION_BITS = 4;
-    private static final int Z_FLOOR_HEIGHT_FRACTION_BITS = 12;
-    private static final int Z_MAX_HEIGHT_UNCERTAINTY_FACTOR = 25;
-
-    // LCI Subelement Z fields indices
-    private static final int SUBELEMENT_Z_LAT_EXPECTED_TO_MOVE_INDEX = 0;
-    private static final int SUBELEMENT_Z_FLOOR_NUMBER_INDEX = 1;
-    private static final int SUBELEMENT_Z_HEIGHT_ABOVE_FLOOR_INDEX = 2;
-    private static final int SUBELEMENT_Z_HEIGHT_ABOVE_FLOOR_UNCERTAINTY_INDEX = 3;
-
-    // LCI Subelement Usage Rules constants
-    private static final int SUBELEMENT_USAGE_MASK_RETRANSMIT = 0x01;
-    private static final int SUBELEMENT_USAGE_MASK_RETENTION_EXPIRES = 0x02;
-    private static final int SUBELEMENT_USAGE_MASK_STA_LOCATION_POLICY = 0x04;
-
-    // LCI Subelement Usage Rules field indices
-    private static final int SUBELEMENT_USAGE_PARAMS_INDEX = 0; // 8 bits
-
-    // LCI Subelement BSSID List
-    private static final int SUBELEMENT_BSSID_MAX_INDICATOR_INDEX = 0;
-    private static final int SUBELEMENT_BSSID_LIST_INDEX = 1;
-    private static final int BYTES_IN_A_BSSID = 6;
-
-    /**
-     * The Expected-To-Move value determines how mobile we expect the STA to be.
-     *
-     * @hide
-     */
-    @Retention(SOURCE)
-    @IntDef({LOCATION_FIXED, LOCATION_VARIABLE, LOCATION_MOVEMENT_UNKNOWN, LOCATION_RESERVED})
-    public @interface ExpectedToMoveType {
-    }
-
-    /** Location of responder is fixed (does not move) */
-    public static final int LOCATION_FIXED = 0;
-    /** Location of the responder is variable, and may move */
-    public static final int LOCATION_VARIABLE = 1;
-    /** Location of the responder is not known to be either fixed or variable. */
-    public static final int LOCATION_MOVEMENT_UNKNOWN = 2;
-    /** Location of the responder status is a reserved value */
-    public static final int LOCATION_RESERVED = 3;
-
-    // LCR Subelement IDs
-    private static final byte SUBELEMENT_LOCATION_CIVIC = 0x00;
-    private static final byte SUBELEMENT_MAP_IMAGE = 0x05;
-
-    // LCR Subelement Lengths
-    private static final int SUBELEMENT_LOCATION_CIVIC_MIN_LENGTH = 2;
-    private static final int SUBELEMENT_LOCATION_CIVIC_MAX_LENGTH = 256;
-    private static final int SUBELEMENT_MAP_IMAGE_URL_MAX_LENGTH = 256;
-
-    private static final byte[] LEAD_LCR_ELEMENT_BYTES = {
-            MEASUREMENT_TOKEN_AUTONOMOUS, MEASUREMENT_REPORT_MODE, MEASUREMENT_TYPE_LCR
-    };
-
-    // LCR Location Civic Subelement
-    private static final int CIVIC_COUNTRY_CODE_INDEX = 0;
-    private static final int CIVIC_TLV_LIST_INDEX = 2;
-
-    // LCR Map Image Subelement field indexes.
-    private static final int SUBELEMENT_IMAGE_MAP_TYPE_INDEX = 0;
-    private static final int MAP_TYPE_URL_DEFINED = 0;
-    private static final String[] SUPPORTED_IMAGE_FILE_EXTENSIONS = {
-            "",
-            "png",
-            "gif",
-            "jpg",
-            "svg",
-            "dxf",
-            "dwg",
-            "dwf",
-            "cad",
-            "tif",
-            "gml",
-            "kml",
-            "bmp",
-            "pgm",
-            "ppm",
-            "xbm",
-            "xpm",
-            "ico"
-    };
-
-    // General LCI and LCR state
-    private final boolean mIsValid;
-
-    /*
-      These members are not final because we are not sure if the corresponding subelement will be
-      present until after the parsing process. However, the default value should be set as listed.
-    */
-    private boolean mIsLciValid = false;
-    private boolean mIsZValid = false;
-    private boolean mIsUsageValid = true; // By default this is assumed true
-    private boolean mIsBssidListValid = false;
-    private boolean mIsLocationCivicValid = false;
-    private boolean mIsMapImageValid = false;
-
-    // LCI Subelement LCI state
-    private double mLatitudeUncertainty;
-    private double mLatitude;
-    private double mLongitudeUncertainty;
-    private double mLongitude;
-    private int mAltitudeType;
-    private double mAltitudeUncertainty;
-    private double mAltitude;
-    private int mDatum;
-    private boolean mLciRegisteredLocationAgreement;
-    private boolean mLciRegisteredLocationDse;
-    private boolean mLciDependentStation;
-    private int mLciVersion;
-
-    // LCI Subelement Z state
-    private int mExpectedToMove;
-    private double mFloorNumber;
-    private double mHeightAboveFloorMeters;
-    private double mHeightAboveFloorUncertaintyMeters;
-
-    // LCI Subelement Usage Rights state
-    private boolean mUsageRetransmit;
-    private boolean mUsageRetentionExpires;
-    private boolean mUsageExtraInfoOnAssociation;
-
-    // LCI Subelement BSSID List state
-    private ArrayList<MacAddress> mBssidList;
-
-    // LCR Subelement Location Civic state
-    private String mCivicLocationCountryCode;
-    private String mCivicLocationString;
-    private CivicLocation mCivicLocation;
-
-    // LCR Subelement Map Image state
-    private int mMapImageType;
-    private Uri mMapImageUri;
-
-    /**
-     * Constructor
-     *
-     * @param lciBuffer the bytes received in the LCI Measurement Report Information Element
-     * @param lcrBuffer the bytes received in the LCR Measurement Report Information Element
-     *
-     * @hide
-     */
-    public ResponderLocation(byte[] lciBuffer, byte[] lcrBuffer) {
-        boolean isLciIeValid = false;
-        boolean isLcrIeValid = false;
-        setLciSubelementDefaults();
-        setZaxisSubelementDefaults();
-        setUsageSubelementDefaults();
-        setBssidListSubelementDefaults();
-        setCivicLocationSubelementDefaults();
-        setMapImageSubelementDefaults();
-        if (lciBuffer != null && lciBuffer.length > LEAD_LCI_ELEMENT_BYTES.length) {
-            isLciIeValid = parseInformationElementBuffer(
-                MEASUREMENT_TYPE_LCI, lciBuffer, LEAD_LCI_ELEMENT_BYTES);
-        }
-        if (lcrBuffer != null && lcrBuffer.length > LEAD_LCR_ELEMENT_BYTES.length) {
-            isLcrIeValid = parseInformationElementBuffer(
-                MEASUREMENT_TYPE_LCR, lcrBuffer, LEAD_LCR_ELEMENT_BYTES);
-        }
-
-        boolean isLciValid = isLciIeValid && mIsUsageValid
-                && (mIsLciValid || mIsZValid || mIsBssidListValid);
-
-        boolean isLcrValid = isLcrIeValid && mIsUsageValid
-                && (mIsLocationCivicValid || mIsMapImageValid);
-
-        mIsValid = isLciValid || isLcrValid;
-
-        if (!mIsValid) {
-            setLciSubelementDefaults();
-            setZaxisSubelementDefaults();
-            setCivicLocationSubelementDefaults();
-            setMapImageSubelementDefaults();
-        }
-    }
-
-    private ResponderLocation(Parcel in) {
-        // Object Validation
-        mIsValid = in.readByte() != 0;
-        mIsLciValid = in.readByte() != 0;
-        mIsZValid = in.readByte() != 0;
-        mIsUsageValid = in.readByte() != 0;
-        mIsBssidListValid = in.readByte() != 0;
-        mIsLocationCivicValid = in.readByte() != 0;
-        mIsMapImageValid = in.readByte() != 0;
-
-        // LCI Subelement LCI state
-        mLatitudeUncertainty = in.readDouble();
-        mLatitude = in.readDouble();
-        mLongitudeUncertainty = in.readDouble();
-        mLongitude = in.readDouble();
-        mAltitudeType = in.readInt();
-        mAltitudeUncertainty = in.readDouble();
-        mAltitude = in.readDouble();
-        mDatum = in.readInt();
-        mLciRegisteredLocationAgreement = in.readByte() != 0;
-        mLciRegisteredLocationDse = in.readByte() != 0;
-        mLciDependentStation = in.readByte() != 0;
-        mLciVersion = in.readInt();
-
-        // LCI Subelement Z state
-        mExpectedToMove = in.readInt();
-        mFloorNumber = in.readDouble();
-        mHeightAboveFloorMeters = in.readDouble();
-        mHeightAboveFloorUncertaintyMeters = in.readDouble();
-
-        // LCI Usage Rights
-        mUsageRetransmit = in.readByte() != 0;
-        mUsageRetentionExpires = in.readByte() != 0;
-        mUsageExtraInfoOnAssociation = in.readByte() != 0;
-
-        // LCI Subelement BSSID List
-        mBssidList = in.readArrayList(MacAddress.class.getClassLoader());
-
-        // LCR Subelement Location Civic
-        mCivicLocationCountryCode = in.readString();
-        mCivicLocationString = in.readString();
-        mCivicLocation = in.readParcelable(this.getClass().getClassLoader());
-
-        // LCR Subelement Map Image
-        mMapImageType = in.readInt();
-        String urlString = in.readString();
-        if (TextUtils.isEmpty(urlString)) {
-            mMapImageUri = null;
-        } else {
-            mMapImageUri = Uri.parse(urlString);
-        }
-    }
-
-    public static final @android.annotation.NonNull Creator<ResponderLocation> CREATOR = new Creator<ResponderLocation>() {
-        @Override
-        public ResponderLocation createFromParcel(Parcel in) {
-            return new ResponderLocation(in);
-        }
-
-        @Override
-        public ResponderLocation[] newArray(int size) {
-            return new ResponderLocation[size];
-        }
-    };
-
-    @Override
-    public int describeContents() {
-        return 0;
-    }
-
-    @Override
-    public void writeToParcel(Parcel parcel, int flags) {
-        // Object
-        parcel.writeByte((byte) (mIsValid ? 1 : 0));
-        parcel.writeByte((byte) (mIsLciValid ? 1 : 0));
-        parcel.writeByte((byte) (mIsZValid ? 1 : 0));
-        parcel.writeByte((byte) (mIsUsageValid ? 1 : 0));
-        parcel.writeByte((byte) (mIsBssidListValid ? 1 : 0));
-        parcel.writeByte((byte) (mIsLocationCivicValid ? 1 : 0));
-        parcel.writeByte((byte) (mIsMapImageValid ? 1 : 0));
-
-        // LCI Subelement LCI state
-        parcel.writeDouble(mLatitudeUncertainty);
-        parcel.writeDouble(mLatitude);
-        parcel.writeDouble(mLongitudeUncertainty);
-        parcel.writeDouble(mLongitude);
-        parcel.writeInt(mAltitudeType);
-        parcel.writeDouble(mAltitudeUncertainty);
-        parcel.writeDouble(mAltitude);
-        parcel.writeInt(mDatum);
-        parcel.writeByte((byte) (mLciRegisteredLocationAgreement ? 1 : 0));
-        parcel.writeByte((byte) (mLciRegisteredLocationDse ? 1 : 0));
-        parcel.writeByte((byte) (mLciDependentStation ? 1 : 0));
-        parcel.writeInt(mLciVersion);
-
-        // LCI Subelement Z state
-        parcel.writeInt(mExpectedToMove);
-        parcel.writeDouble(mFloorNumber);
-        parcel.writeDouble(mHeightAboveFloorMeters);
-        parcel.writeDouble(mHeightAboveFloorUncertaintyMeters);
-
-        // LCI Usage Rights
-        parcel.writeByte((byte) (mUsageRetransmit ? 1 : 0));
-        parcel.writeByte((byte) (mUsageRetentionExpires ? 1 : 0));
-        parcel.writeByte((byte) (mUsageExtraInfoOnAssociation ? 1 : 0));
-
-        // LCI Subelement BSSID List
-        parcel.writeList(mBssidList);
-
-        // LCR Subelement Location Civic
-        parcel.writeString(mCivicLocationCountryCode);
-        parcel.writeString(mCivicLocationString);
-        parcel.writeParcelable(mCivicLocation, flags);
-
-        // LCR Subelement Map Image
-        parcel.writeInt(mMapImageType);
-        if (mMapImageUri != null) {
-            parcel.writeString(mMapImageUri.toString());
-        } else {
-            parcel.writeString("");
-        }
-    }
-
-    /**
-     * Test if the Information Element (IE) is in the correct format, and then parse its Subelements
-     * based on their type, and setting state in this object when present.
-     *
-     * @return a boolean indicating the success of the parsing function
-     */
-    private boolean parseInformationElementBuffer(
-            int ieType, byte[] buffer, byte[] expectedLeadBytes) {
-        int bufferPtr = 0;
-        int bufferLength = buffer.length;
-
-        // Ensure the buffer size is within expected limits
-        if (bufferLength < MIN_BUFFER_SIZE || bufferLength > MAX_BUFFER_SIZE) {
-            return false;
-        }
-
-        // Ensure the IE contains the correct leading bytes
-        byte[] leadBufferBytes = Arrays.copyOfRange(buffer, bufferPtr, expectedLeadBytes.length);
-        if (!Arrays.equals(leadBufferBytes, expectedLeadBytes)) {
-            return false;
-        }
-
-        // Iterate through the sub-elements contained in the Information Element (IE)
-        bufferPtr += expectedLeadBytes.length;
-        // Loop over the buffer ensuring there are 2-bytes available for each new subelement tested.
-        while (bufferPtr + 1 < bufferLength) {
-            byte subelement = buffer[bufferPtr++];
-            int subelementLength = buffer[bufferPtr++];
-            // Check there is enough data for the next subelement
-            if ((bufferPtr + subelementLength) > bufferLength || subelementLength <= 0) {
-                return false;
-            }
-
-            byte[] subelementData =
-                    Arrays.copyOfRange(buffer, bufferPtr, bufferPtr + subelementLength);
-
-            if (ieType == MEASUREMENT_TYPE_LCI) {
-                switch (subelement) {
-                    case SUBELEMENT_LCI:
-                        mIsLciValid = parseSubelementLci(subelementData);
-                        if (!mIsLciValid || mLciVersion != LCI_VERSION_1) {
-                            setLciSubelementDefaults();
-                        }
-                        break;
-                    case SUBELEMENT_Z:
-                        mIsZValid = parseSubelementZ(subelementData);
-                        if (!mIsZValid) {
-                            setZaxisSubelementDefaults();
-                        }
-                        break;
-                    case SUBELEMENT_USAGE:
-                        mIsUsageValid = parseSubelementUsage(subelementData);
-                        // Note: if the Usage Subelement is not valid, don't reset the state, as
-                        // it is now indicating the whole ResponderLocation is invalid.
-                        break;
-                    case SUBELEMENT_BSSID_LIST:
-                        mIsBssidListValid = parseSubelementBssidList(subelementData);
-                        if (!mIsBssidListValid) {
-                            setBssidListSubelementDefaults();
-                        }
-                        break;
-                    default:
-                        break; // skip over unused or vendor specific subelements
-                }
-            } else if (ieType == MEASUREMENT_TYPE_LCR) {
-                switch (subelement) {
-                    case SUBELEMENT_LOCATION_CIVIC:
-                        mIsLocationCivicValid = parseSubelementLocationCivic(subelementData);
-                        if (!mIsLocationCivicValid) {
-                            setCivicLocationSubelementDefaults();
-                        }
-                        break;
-                    case SUBELEMENT_MAP_IMAGE:
-                        mIsMapImageValid = parseSubelementMapImage(subelementData);
-                        if (!mIsMapImageValid) {
-                            setMapImageSubelementDefaults();
-                        }
-                        break;
-                    default:
-                        break; // skip over unused or other vendor specific subelements
-                }
-            }
-
-            bufferPtr += subelementLength;
-        }
-        return true;
-    }
-
-    /**
-     * Parse the LCI Sub-Element in the LCI Information Element (IE).
-     *
-     * @param buffer a buffer containing the subelement
-     * @return boolean true indicates success
-     */
-    private boolean parseSubelementLci(byte[] buffer) {
-        if (buffer.length > SUBELEMENT_LCI_LENGTH) {
-            return false;
-        }
-        swapEndianByteByByte(buffer);
-        long[] subelementLciFields = getFieldData(buffer, SUBELEMENT_LCI_BIT_FIELD_LENGTHS);
-        if (subelementLciFields == null) {
-            return false;
-        }
-        // Set member state based on parsed buffer data
-        mLatitudeUncertainty = decodeLciLatLngUncertainty(
-                subelementLciFields[SUBELEMENT_LCI_LAT_UNCERTAINTY_INDEX]);
-        mLatitude = decodeLciLatLng(subelementLciFields, SUBELEMENT_LCI_BIT_FIELD_LENGTHS,
-                SUBELEMENT_LCI_LAT_INDEX, LAT_ABS_LIMIT);
-        mLongitudeUncertainty = decodeLciLatLngUncertainty(
-                subelementLciFields[SUBELEMENT_LCI_LNG_UNCERTAINTY_INDEX]);
-        mLongitude =
-                decodeLciLatLng(subelementLciFields, SUBELEMENT_LCI_BIT_FIELD_LENGTHS,
-                        SUBELEMENT_LCI_LNG_INDEX, LNG_ABS_LIMIT);
-        mAltitudeType = (int) subelementLciFields[SUBELEMENT_LCI_ALT_TYPE_INDEX] & BYTE_MASK;
-        mAltitudeUncertainty =
-                decodeLciAltUncertainty(subelementLciFields[SUBELEMENT_LCI_ALT_UNCERTAINTY_INDEX]);
-        mAltitude =
-                Math.scalb(subelementLciFields[SUBELEMENT_LCI_ALT_INDEX], -ALTITUDE_FRACTION_BITS);
-        mDatum = (int) subelementLciFields[SUBELEMENT_LCI_DATUM_INDEX] & BYTE_MASK;
-        mLciRegisteredLocationAgreement =
-                (subelementLciFields[SUBELEMENT_LCI_REGLOC_AGREEMENT_INDEX] == 1);
-        mLciRegisteredLocationDse =
-                (subelementLciFields[SUBELEMENT_LCI_REGLOC_DSE_INDEX] == 1);
-        mLciDependentStation =
-                (subelementLciFields[SUBELEMENT_LCI_DEPENDENT_STA_INDEX] == 1);
-        mLciVersion = (int) subelementLciFields[SUBELEMENT_LCI_VERSION_INDEX];
-        return true;
-    }
-
-    /**
-     * Decode the floating point value of an encoded lat or lng in the LCI subelement field.
-     *
-     * @param fields        the array of field data represented as longs
-     * @param bitFieldSizes the lengths of each field
-     * @param offset        the offset of the field being decoded
-     * @param limit the maximum absolute value (note: different for lat vs lng)
-     * @return the floating point value of the lat or lng
-     */
-    private double decodeLciLatLng(long[] fields, int[] bitFieldSizes, int offset, double limit) {
-        double angle;
-        if ((fields[offset] & (long) Math.pow(2, bitFieldSizes[offset] - 1)) != 0) {
-            // Negative 2's complement value
-            // Note: The Math.pow(...) method cannot return a NaN value because the bitFieldSize
-            // for Lat or Lng is limited to exactly 34 bits.
-            angle = Math.scalb((double) fields[offset] - Math.pow(2, bitFieldSizes[offset]),
-                    -LATLNG_FRACTION_BITS);
-        } else {
-            // Positive 2's complement value
-            angle = Math.scalb((double) fields[offset], -LATLNG_FRACTION_BITS);
-        }
-        if (angle > limit) {
-            angle = limit;
-        } else if (angle < -limit) {
-            angle = -limit;
-        }
-        return angle;
-    }
-
-    /**
-     * Coverts an encoded Lat/Lng uncertainty into a number of degrees.
-     *
-     * @param encodedValue the encoded uncertainty
-     * @return the value in degrees
-     */
-    private double decodeLciLatLngUncertainty(long encodedValue) {
-        return Math.pow(2, LATLNG_UNCERTAINTY_BASE - encodedValue);
-    }
-
-    /**
-     * Converts an encoded Alt uncertainty into a number of degrees.
-     *
-     * @param encodedValue the encoded uncertainty
-     * @return the value in degrees
-     */
-    private double decodeLciAltUncertainty(long encodedValue) {
-        return Math.pow(2, ALTITUDE_UNCERTAINTY_BASE - encodedValue);
-    }
-
-    /**
-     * Parse the Z subelement of the LCI IE.
-     *
-     * @param buffer a buffer containing the subelement
-     * @return boolean true indicates success
-     */
-    private boolean parseSubelementZ(byte[] buffer) {
-        if (buffer.length != SUBELEMENT_Z_LENGTH) {
-            return false;
-        }
-        swapEndianByteByByte(buffer);
-        long[] subelementZFields = getFieldData(buffer, SUBELEMENT_Z_BIT_FIELD_LENGTHS);
-        if (subelementZFields == null) {
-            return false;
-        }
-
-        mExpectedToMove =
-                (int) subelementZFields[SUBELEMENT_Z_LAT_EXPECTED_TO_MOVE_INDEX] & BYTE_MASK;
-        mFloorNumber = decodeZUnsignedToSignedValue(subelementZFields,
-                SUBELEMENT_Z_BIT_FIELD_LENGTHS, SUBELEMENT_Z_FLOOR_NUMBER_INDEX,
-                Z_FLOOR_NUMBER_FRACTION_BITS);
-
-        mHeightAboveFloorMeters = decodeZUnsignedToSignedValue(subelementZFields,
-                SUBELEMENT_Z_BIT_FIELD_LENGTHS, SUBELEMENT_Z_HEIGHT_ABOVE_FLOOR_INDEX,
-                Z_FLOOR_HEIGHT_FRACTION_BITS);
-
-        long zHeightUncertainty =
-                subelementZFields[SUBELEMENT_Z_HEIGHT_ABOVE_FLOOR_UNCERTAINTY_INDEX];
-        if (zHeightUncertainty > 0 && zHeightUncertainty < Z_MAX_HEIGHT_UNCERTAINTY_FACTOR) {
-            mHeightAboveFloorUncertaintyMeters =
-                    Math.pow(2, Z_FLOOR_HEIGHT_FRACTION_BITS - zHeightUncertainty - 1);
-        } else {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Decode a two's complement encoded value, to a signed double based on the field length.
-     *
-     * @param fieldValues the array of field values reprented as longs
-     * @param fieldLengths the array of field lengths
-     * @param index the index of the field being decoded
-     * @param fraction the number of fractional bits in the value
-     * @return the signed value represented as a double
-     */
-    private double decodeZUnsignedToSignedValue(long[] fieldValues, int[] fieldLengths, int index,
-            int fraction) {
-        int value = (int) fieldValues[index];
-        int maxPositiveValue = (int) Math.pow(2, fieldLengths[index] - 1) - 1;
-        if (value > maxPositiveValue) {
-            value -= Math.pow(2, fieldLengths[index]);
-        }
-        return Math.scalb(value, -fraction);
-    }
-
-    /**
-     * Parse Subelement Usage Rights
-     */
-    private boolean parseSubelementUsage(byte[] buffer) {
-        if (buffer.length != SUBELEMENT_USAGE_LENGTH1
-                && buffer.length != SUBELEMENT_USAGE_LENGTH3) {
-            return false;
-        }
-        mUsageRetransmit =
-                (buffer[SUBELEMENT_USAGE_PARAMS_INDEX] & SUBELEMENT_USAGE_MASK_RETRANSMIT) != 0;
-        mUsageRetentionExpires =
-                (buffer[SUBELEMENT_USAGE_PARAMS_INDEX] & SUBELEMENT_USAGE_MASK_RETENTION_EXPIRES)
-                        != 0;
-        mUsageExtraInfoOnAssociation =
-                (buffer[SUBELEMENT_USAGE_PARAMS_INDEX] & SUBELEMENT_USAGE_MASK_STA_LOCATION_POLICY)
-                        != 0;
-        // Note: the Retransmit flag must be true, and RetentionExpires, false for the
-        // ResponderLocation object to be usable by public applications.
-        return (mUsageRetransmit && !mUsageRetentionExpires);
-    }
-
-    /**
-     * Parse the BSSID List Subelement of the LCI IE.
-     *
-     * @param buffer a buffer containing the subelement
-     * @return boolean true indicates success
-     */
-    private boolean parseSubelementBssidList(byte[] buffer) {
-        if (buffer.length < SUBELEMENT_BSSID_LIST_MIN_BUFFER_LENGTH) {
-            return false;
-        }
-        if ((buffer.length - 1) % BYTES_IN_A_BSSID != 0) {
-            return false;
-        }
-
-        int maxBssidIndicator = (int) buffer[SUBELEMENT_BSSID_MAX_INDICATOR_INDEX] & BYTE_MASK;
-        int bssidListLength = (buffer.length - 1) / BYTES_IN_A_BSSID;
-        // The maxBSSIDIndicator is ignored. Its use is still being clarified in 802.11REVmd,
-        // which is not published at this time. This field will be used in a future
-        // release of Android after 802.11REVmd is public. Here, we interpret the following
-        // params as an explicit list of BSSIDs.
-
-
-        int bssidOffset = SUBELEMENT_BSSID_LIST_INDEX;
-        for (int i = 0; i < bssidListLength; i++) {
-            byte[] bssid = Arrays.copyOfRange(buffer, bssidOffset, bssidOffset + BYTES_IN_A_BSSID);
-            MacAddress macAddress = MacAddress.fromBytes(bssid);
-            mBssidList.add(macAddress);
-            bssidOffset += BYTES_IN_A_BSSID;
-        }
-        return true;
-    }
-
-    /**
-     * Parse the Location Civic subelement in the LCR IE.
-     *
-     * @param buffer a buffer containing the subelement
-     * @return boolean true indicates success
-     */
-    private boolean parseSubelementLocationCivic(byte[] buffer) {
-        if (buffer.length <  SUBELEMENT_LOCATION_CIVIC_MIN_LENGTH
-                || buffer.length > SUBELEMENT_LOCATION_CIVIC_MAX_LENGTH) {
-            return false;
-        }
-        mCivicLocationCountryCode =
-                new String(Arrays.copyOfRange(buffer, CIVIC_COUNTRY_CODE_INDEX,
-                        CIVIC_TLV_LIST_INDEX)).toUpperCase();
-        CivicLocation civicLocation =
-                new CivicLocation(
-                        Arrays.copyOfRange(buffer, CIVIC_TLV_LIST_INDEX, buffer.length),
-                        mCivicLocationCountryCode);
-        if (!civicLocation.isValid()) {
-            return false;
-        }
-        this.mCivicLocation = civicLocation;
-        mCivicLocationString = civicLocation.toString();
-        return true;
-    }
-
-    /**
-     * Parse the Map Image subelement in the LCR IE.
-     *
-     * @param buffer a buffer containing the subelement
-     * @return boolean true indicates success
-     */
-    private boolean parseSubelementMapImage(byte[] buffer) {
-        if (buffer.length > SUBELEMENT_MAP_IMAGE_URL_MAX_LENGTH) {
-            return false;
-        }
-        int mapImageType = buffer[SUBELEMENT_IMAGE_MAP_TYPE_INDEX];
-        int supportedTypesMax = SUPPORTED_IMAGE_FILE_EXTENSIONS.length - 1;
-        if (mapImageType < MAP_TYPE_URL_DEFINED || mapImageType > supportedTypesMax) {
-            return false;
-        }
-        this.mMapImageType = mapImageType;
-        byte[] urlBytes = Arrays.copyOfRange(buffer, 1, buffer.length);
-        mMapImageUri = Uri.parse(new String(urlBytes, StandardCharsets.UTF_8));
-        return true;
-    }
-
-    /**
-     * Convert an image type code to a Mime type
-     *
-     * @param imageTypeCode encoded as an integer
-     * @return the mime type of the image file
-     */
-    private String imageTypeToMime(int imageTypeCode, String imageUrl) {
-        int supportedExtensionsMax = SUPPORTED_IMAGE_FILE_EXTENSIONS.length - 1;
-        if ((imageTypeCode == 0 && imageUrl == null) || imageTypeCode > supportedExtensionsMax) {
-            return null;
-        }
-        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
-        if (imageTypeCode == 0) {
-            return mimeTypeMap.getMimeTypeFromExtension(
-                    MimeTypeMap.getFileExtensionFromUrl(imageUrl));
-        } else {
-            return mimeTypeMap.getMimeTypeFromExtension(
-                    SUPPORTED_IMAGE_FILE_EXTENSIONS[imageTypeCode]);
-        }
-    }
-
-    /**
-     * Converts a byte array containing fields of variable size, into an array of longs where the
-     * field boundaries are defined in a constant int array passed as an argument.
-     *
-     * @param buffer        the byte array containing all the fields
-     * @param bitFieldSizes the int array defining the size of each field
-     */
-    private long[] getFieldData(byte[] buffer, int[] bitFieldSizes) {
-        int bufferLengthBits = buffer.length * Byte.SIZE;
-        int sumBitFieldSizes = 0;
-        for (int i : bitFieldSizes) {
-            if (i > Long.SIZE) {
-                return null;
-            }
-            sumBitFieldSizes += i;
-        }
-        if (bufferLengthBits != sumBitFieldSizes) {
-            return null;
-        }
-        long[] fieldData = new long[bitFieldSizes.length];
-        int bufferBitPos = 0;
-        for (int fieldIndex = 0; fieldIndex < bitFieldSizes.length; fieldIndex++) {
-            int bitFieldSize = bitFieldSizes[fieldIndex];
-            long field = 0;
-            for (int n = 0; n < bitFieldSize; n++) {
-                field |= ((long) getBitAtBitOffsetInByteArray(buffer, bufferBitPos + n) << n);
-            }
-            fieldData[fieldIndex] = field;
-            bufferBitPos += bitFieldSize;
-        }
-        return fieldData;
-    }
-
-    /**
-     * Retrieves state of a bit at the bit-offset in a byte array, where the offset represents the
-     * bytes in contiguous data with each value in big endian order.
-     *
-     * @param buffer          the data buffer of bytes containing all the fields
-     * @param bufferBitOffset the bit offset into the entire buffer
-     * @return a zero or one value, representing the state of that bit.
-     */
-    private int getBitAtBitOffsetInByteArray(byte[] buffer, int bufferBitOffset) {
-        int bufferIndex = bufferBitOffset / Byte.SIZE; // The byte index that contains the bit
-        int bitOffsetInByte = bufferBitOffset % Byte.SIZE; // The bit offset within that byte
-        int result = (buffer[bufferIndex] & (MSB_IN_BYTE >> bitOffsetInByte)) == 0 ? 0 : 1;
-        return result;
-    }
-
-    /**
-     * Reverses the order of the bits in each byte of a byte array.
-     *
-     * @param buffer the array containing each byte that will be reversed
-     */
-    private void swapEndianByteByByte(byte[] buffer) {
-        for (int n = 0; n < buffer.length; n++) {
-            byte currentByte = buffer[n];
-            byte reversedByte = 0; // Cleared value
-            byte bitSelectorMask = LSB_IN_BYTE;
-            for (int i = 0; i < Byte.SIZE; i++) {
-                reversedByte = (byte) (reversedByte << 1);
-                if ((currentByte & bitSelectorMask) != 0) {
-                    reversedByte = (byte) (reversedByte | LSB_IN_BYTE);
-                }
-                bitSelectorMask = (byte) (bitSelectorMask << 1);
-            }
-            buffer[n] = reversedByte;
-        }
-    }
-
-    /**
-     * Sets the LCI subelement fields to the default undefined values.
-     */
-    private void setLciSubelementDefaults() {
-        mIsLciValid = false;
-        mLatitudeUncertainty = UNCERTAINTY_UNDEFINED;
-        mLatitude = 0;
-        mLongitudeUncertainty = UNCERTAINTY_UNDEFINED;
-        mLongitude = 0;
-        mAltitudeType = ALTITUDE_UNDEFINED;
-        mAltitudeUncertainty = UNCERTAINTY_UNDEFINED;
-        mAltitude = 0;
-        mDatum = DATUM_UNDEFINED;
-        mLciRegisteredLocationAgreement = false;
-        mLciRegisteredLocationDse = false;
-        mLciDependentStation = false;
-        mLciVersion = 0;
-    }
-
-    /**
-     * Sets the Z subelement fields to the default values when undefined.
-     */
-    private void setZaxisSubelementDefaults() {
-        mIsZValid = false;
-        mExpectedToMove = 0;
-        mFloorNumber = 0;
-        mHeightAboveFloorMeters = 0;
-        mHeightAboveFloorUncertaintyMeters = 0;
-    }
-
-    /**
-     * Sets the Usage Policy subelement fields to the default undefined values.
-     */
-    private void setUsageSubelementDefaults() {
-        mUsageRetransmit = true;
-        mUsageRetentionExpires = false;
-        mUsageExtraInfoOnAssociation = false;
-    }
-
-    /**
-     * Sets the BSSID List subelement fields to the default values when undefined.
-     */
-    private void setBssidListSubelementDefaults() {
-        mIsBssidListValid = false;
-        mBssidList = new ArrayList<>();
-    }
-
-    /**
-     * Sets the LCR Civic Location subelement field to the default undefined value.
-     *
-     * @hide
-     */
-    public void setCivicLocationSubelementDefaults() {
-        mIsLocationCivicValid = false;
-        mCivicLocationCountryCode = "";
-        mCivicLocationString = "";
-        mCivicLocation = null;
-    }
-
-    /**
-     * Sets the LCR Map Image subelement field to the default values when undefined.
-     */
-    private void setMapImageSubelementDefaults() {
-        mIsMapImageValid = false;
-        mMapImageType = MAP_TYPE_URL_DEFINED;
-        mMapImageUri = null;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        ResponderLocation other = (ResponderLocation) obj;
-        return mIsValid == other.mIsValid
-                && mIsLciValid == other.mIsLciValid
-                && mIsZValid == other.mIsZValid
-                && mIsUsageValid == other.mIsUsageValid
-                && mIsBssidListValid == other.mIsBssidListValid
-                && mIsLocationCivicValid == other.mIsLocationCivicValid
-                && mIsMapImageValid == other.mIsMapImageValid
-                && mLatitudeUncertainty == other.mLatitudeUncertainty
-                && mLatitude == other.mLatitude
-                && mLongitudeUncertainty == other.mLongitudeUncertainty
-                && mLongitude == other.mLongitude
-                && mAltitudeType == other.mAltitudeType
-                && mAltitudeUncertainty == other.mAltitudeUncertainty
-                && mAltitude == other.mAltitude
-                && mDatum == other.mDatum
-                && mLciRegisteredLocationAgreement == other.mLciRegisteredLocationAgreement
-                && mLciRegisteredLocationDse == other.mLciRegisteredLocationDse
-                && mLciDependentStation == other.mLciDependentStation
-                && mLciVersion == other.mLciVersion
-                && mExpectedToMove == other.mExpectedToMove
-                && mFloorNumber == other.mFloorNumber
-                && mHeightAboveFloorMeters == other.mHeightAboveFloorMeters
-                && mHeightAboveFloorUncertaintyMeters
-                        == other.mHeightAboveFloorUncertaintyMeters
-                && mUsageRetransmit == other.mUsageRetransmit
-                && mUsageRetentionExpires == other.mUsageRetentionExpires
-                && mUsageExtraInfoOnAssociation == other.mUsageExtraInfoOnAssociation
-                && mBssidList.equals(other.mBssidList)
-                && mCivicLocationCountryCode.equals(other.mCivicLocationCountryCode)
-                && mCivicLocationString.equals(other.mCivicLocationString)
-                && Objects.equals(mCivicLocation, other.mCivicLocation)
-                && mMapImageType == other.mMapImageType
-                && Objects.equals(mMapImageUri, other.mMapImageUri);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(mIsValid, mIsLciValid, mIsZValid, mIsUsageValid, mIsBssidListValid,
-                mIsLocationCivicValid, mIsMapImageValid, mLatitudeUncertainty, mLatitude,
-                mLongitudeUncertainty, mLongitude, mAltitudeType, mAltitudeUncertainty, mAltitude,
-                mDatum, mLciRegisteredLocationAgreement,
-                mLciRegisteredLocationDse, mLciDependentStation, mLciVersion,
-                mExpectedToMove, mFloorNumber, mHeightAboveFloorMeters,
-                mHeightAboveFloorUncertaintyMeters, mUsageRetransmit, mUsageRetentionExpires,
-                mUsageExtraInfoOnAssociation, mBssidList, mCivicLocationCountryCode,
-                mCivicLocationString, mCivicLocation, mMapImageType, mMapImageUri);
-    }
-
-    /**
-     * @return true if the ResponderLocation object is valid and contains useful information
-     * relevant to the location of the Responder. If this is ever false, this object will not be
-     * available to developers, and have a null value.
-     *
-     * @hide
-     */
-    public boolean isValid() {
-        return mIsValid;
-    }
-
-    /**
-     * @return true if the LCI subelement (containing Latitude, Longitude and Altitude) is valid.
-     *
-     * <p> This method tells us if the responder has provided its Location Configuration
-     * Information (LCI) directly, and is useful when an external database of responder locations
-     * is not available</p>
-     *
-     * <p>If isLciSubelementValid() returns true, all the LCI values provided by the corresponding
-     * getter methods will have been set as described by the responder, or else if false, they
-     * should not be used and will throw an IllegalStateException.</p>
-     */
-    public boolean isLciSubelementValid() {
-        return mIsLciValid;
-    }
-
-    /**
-     * @return the latitude uncertainty in degrees.
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     * </p>
-     * <p> An unknown uncertainty is indicated by 0.</p>
-     */
-    public double getLatitudeUncertainty() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getLatitudeUncertainty(): invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mLatitudeUncertainty;
-    }
-
-    /**
-     * @return the latitude in degrees
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     */
-    public double getLatitude() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getLatitude(): invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mLatitude;
-    }
-
-    /**
-     * @return the Longitude uncertainty in degrees.
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     * </p>
-     * <p> An unknown uncertainty is indicated by 0.</p>
-     */
-    public double getLongitudeUncertainty() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getLongitudeUncertainty(): invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mLongitudeUncertainty;
-    }
-
-    /**
-     * @return the Longitude in degrees..
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     */
-    public double getLongitude() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getLatitudeUncertainty(): invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mLongitude;
-    }
-
-    /**
-     * @return the Altitude type.
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     */
-    @AltitudeType
-    public int getAltitudeType() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getLatitudeUncertainty(): invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mAltitudeType;
-    }
-
-    /**
-     * @return the Altitude uncertainty in meters.
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     * </p>
-     * <p>An unknown uncertainty is indicated by 0.</p>
-     */
-    public double getAltitudeUncertainty() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getLatitudeUncertainty(): invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mAltitudeUncertainty;
-    }
-
-    /**
-     * @return the Altitude in units defined by the altitude type.
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     */
-    public double getAltitude() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getAltitude(): invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mAltitude;
-    }
-
-    /**
-     * @return the Datum used for the LCI positioning information.
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     */
-    @DatumType
-    public int getDatum() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getDatum(): invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mDatum;
-    }
-
-    /**
-     * @return true if the station is operating within a national policy area or an international
-     * agreement area near a national border, otherwise false
-     * (see 802.11REVmc Section 11.12.3 - Registered STA Operation).
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     */
-    public boolean getRegisteredLocationAgreementIndication() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getRegisteredLocationAgreementIndication(): "
-                        + "invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mLciRegisteredLocationAgreement;
-    }
-
-    /**
-     * @return true indicating this is an enabling station, enabling the operation of nearby STAs
-     * with Dynamic Station Enablement (DSE), otherwise false.
-     * (see 802.11REVmc Section 11.12.3 - Registered STA Operation).
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     *
-     * @hide
-     */
-    public boolean getRegisteredLocationDseIndication() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getRegisteredLocationDseIndication(): "
-                    + "invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mLciRegisteredLocationDse;
-    }
-
-    /**
-     * @return true indicating this is a dependent station that is operating with the enablement of
-     * an enabling station whose LCI is being reported, otherwise false.
-     * (see 802.11REVmc Section 11.12.3 - Registered STA Operation).
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     *
-     * @hide
-     */
-    public boolean getDependentStationIndication() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getDependentStationIndication(): "
-                    + "invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mLciDependentStation;
-    }
-
-    /**
-     * @return a value greater or equal to 1, indicating the current version number
-     * of the LCI protocol.
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     */
-    public int getLciVersion() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "getLciVersion(): "
-                    + "invoked on an invalid result: mIsLciValid = false.");
-        }
-        return mLciVersion;
-    }
-
-    /**
-     * @return the LCI location represented as a {@link Location} object (best effort).
-     * <p>
-     * Only valid if {@link #isLciSubelementValid()} returns true, or will throw an exception.
-     */
-    @NonNull
-    public Location toLocation() {
-        if (!mIsLciValid) {
-            throw new IllegalStateException(
-                "toLocation(): "
-                    + "invoked on an invalid result: mIsLciValid = false.");
-        }
-        Location location = new Location(LOCATION_PROVIDER);
-        location.setLatitude(mLatitude);
-        location.setLongitude(mLongitude);
-        location.setAccuracy((float) (mLatitudeUncertainty + mLongitudeUncertainty) / 2);
-        location.setAltitude(mAltitude);
-        location.setVerticalAccuracyMeters((float) mAltitudeUncertainty);
-        location.setTime(System.currentTimeMillis());
-        return location;
-    }
-
-    /**
-     * @return if the Z subelement (containing mobility, Floor, Height above floor) is valid.
-     */
-    public boolean isZaxisSubelementValid() {
-        return mIsZValid;
-    }
-
-    /**
-     * @return an integer representing the mobility of the responder.
-     * <p>
-     * Only valid if {@link #isZaxisSubelementValid()} returns true, or will throw an exception.
-     */
-    @ExpectedToMoveType
-    public int getExpectedToMove() {
-        if (!mIsZValid) {
-            throw new IllegalStateException(
-                "getExpectedToMove(): invoked on an invalid result: mIsZValid = false.");
-        }
-        return mExpectedToMove;
-    }
-
-    /**
-     * @return the Z sub element Floor Number.
-     * <p>
-     * Only valid if {@link #isZaxisSubelementValid()} returns true, or will throw an exception.
-     * </p>
-     * <p>Note: this number can be positive or negative, with value increments of +/- 1/16 of a
-     * floor.</p>.
-     */
-    public double getFloorNumber() {
-        if (!mIsZValid) {
-            throw new IllegalStateException(
-                "getFloorNumber(): invoked on an invalid result: mIsZValid = false)");
-        }
-        return mFloorNumber;
-    }
-
-    /**
-     * @return the Z subelement Height above the floor in meters.
-     * <p>
-     * Only valid if {@link #isZaxisSubelementValid()} returns true, or will throw an exception.
-     * </p>
-     * <p>This value can be positive or negative. </p>
-     */
-    public double getHeightAboveFloorMeters() {
-        if (!mIsZValid) {
-            throw new IllegalStateException(
-                "getHeightAboveFloorMeters(): invoked on an invalid result: mIsZValid = false)");
-        }
-        return mHeightAboveFloorMeters;
-    }
-
-    /**
-     * @return the Z subelement Height above the floor uncertainty in meters.
-     * <p>
-     * Only valid if {@link #isZaxisSubelementValid()} returns true, or will throw an exception.
-     * </p>
-     * <p>An unknown uncertainty is indicated by 0.</p>
-     */
-    public double getHeightAboveFloorUncertaintyMeters() {
-        if (!mIsZValid) {
-            throw new IllegalStateException(
-                "getHeightAboveFloorUncertaintyMeters():"
-                    + "invoked on an invalid result: mIsZValid = false)");
-        }
-        return mHeightAboveFloorUncertaintyMeters;
-    }
-
-    /**
-     * @return true if the location information received from the responder can be
-     * retransmitted to another device, physically separate from the one that received it.
-     *
-     * @hide
-     */
-    public boolean getRetransmitPolicyIndication() {
-        return mUsageRetransmit;
-    }
-
-    /**
-     * @return true if location-data received should expire (and be deleted)
-     * by the time provided in the getRelativeExpirationTimeHours() method.
-     *
-     * @hide
-     */
-    public boolean getRetentionExpiresIndication() {
-        return mUsageRetentionExpires;
-    }
-
-    /**
-     * @return true if there is extra location info available on association.
-     *
-     * @hide
-     */
-    @SystemApi
-    public boolean getExtraInfoOnAssociationIndication() {
-        return mUsageExtraInfoOnAssociation;
-    }
-
-    /**
-     * @return the Immutable list of colocated BSSIDs at the responder.
-     *
-     * <p> Will return an empty list when there are no bssids listed.
-     */
-    public List<MacAddress> getColocatedBssids() {
-        return Collections.unmodifiableList(mBssidList);
-    }
-
-    /**
-     * @return the civic location represented as an {@link Address} object (best effort).
-     *
-     * <p> Will return a {@code null} when there is no Civic Location defined.
-     */
-    @Nullable
-    public Address toCivicLocationAddress() {
-        if (mCivicLocation != null && mCivicLocation.isValid()) {
-            return mCivicLocation.toAddress();
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * @return the civic location represented as a {@link SparseArray}
-     * <p>
-     * Valid keys to access the SparseArray can be found in {@code CivicLocationKeys}.
-     * </p>
-     * <p> Will return a {@code null} when there is no Civic Location defined.
-     *
-     */
-    @Nullable
-    @SuppressLint("ChangedType")
-    public SparseArray<String> toCivicLocationSparseArray() {
-        if (mCivicLocation != null && mCivicLocation.isValid()) {
-            return mCivicLocation.toSparseArray();
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * @return the civic location two upper-case ASCII character country code defined in ISO 3166.
-     *
-     * <p> Will return a {@code null} when there is no country code defined.
-     *
-     * @hide
-     */
-    @Nullable
-    public String getCivicLocationCountryCode() {
-        return mCivicLocationCountryCode;
-    }
-
-    /**
-     * @return the value of the Civic Location String associated with a key.
-     *
-     * <p> Will return a {@code null} when there is no value associated with the key provided.
-     *
-     * @param key used to find a corresponding value in the Civic Location Tuple list
-     *
-     * @hide
-     */
-    @Nullable
-    public String getCivicLocationElementValue(@CivicLocationKeysType int key) {
-        return mCivicLocation.getCivicElementValue(key);
-    }
-
-    /**
-     * @return the Map Image file Mime type, referred to by getMapImageUrl().
-     */
-    @Nullable
-    public String getMapImageMimeType() {
-        if (mMapImageUri == null) {
-            return null;
-        } else {
-            return imageTypeToMime(mMapImageType, mMapImageUri.toString());
-        }
-    }
-
-    /**
-     * @return a URI referencing a map-file showing the local floor plan.
-     *
-     * <p> Will return a {@code null} when there is no URI defined.
-     */
-    @Nullable
-    public Uri getMapImageUri() {
-        return mMapImageUri;
-    }
-}
diff --git a/wifi/java/android/net/wifi/rtt/WifiRttManager.java b/wifi/java/android/net/wifi/rtt/WifiRttManager.java
deleted file mode 100644
index 865702a..0000000
--- a/wifi/java/android/net/wifi/rtt/WifiRttManager.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import static android.Manifest.permission.ACCESS_FINE_LOCATION;
-import static android.Manifest.permission.ACCESS_WIFI_STATE;
-import static android.Manifest.permission.CHANGE_WIFI_STATE;
-import static android.Manifest.permission.LOCATION_HARDWARE;
-
-import android.annotation.CallbackExecutor;
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.annotation.RequiresPermission;
-import android.annotation.SdkConstant;
-import android.annotation.SystemApi;
-import android.annotation.SystemService;
-import android.content.Context;
-import android.os.Binder;
-import android.os.RemoteException;
-import android.os.WorkSource;
-import android.util.Log;
-
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/**
- * This class provides the primary API for measuring distance (range) to other devices using the
- * IEEE 802.11mc Wi-Fi Round Trip Time (RTT) technology.
- * <p>
- * The devices which can be ranged include:
- * <li>Access Points (APs)
- * <li>Wi-Fi Aware peers
- * <p>
- * Ranging requests are triggered using
- * {@link #startRanging(RangingRequest, Executor, RangingResultCallback)}. Results (in case of
- * successful operation) are returned in the {@link RangingResultCallback#onRangingResults(List)}
- * callback.
- * <p>
- *     Wi-Fi RTT may not be usable at some points, e.g. when Wi-Fi is disabled. To validate that
- *     the functionality is available use the {@link #isAvailable()} function. To track
- *     changes in RTT usability register for the {@link #ACTION_WIFI_RTT_STATE_CHANGED}
- *     broadcast. Note that this broadcast is not sticky - you should register for it and then
- *     check the above API to avoid a race condition.
- */
-@SystemService(Context.WIFI_RTT_RANGING_SERVICE)
-public class WifiRttManager {
-    private static final String TAG = "WifiRttManager";
-    private static final boolean VDBG = false;
-
-    private final Context mContext;
-    private final IWifiRttManager mService;
-
-    /**
-     * Broadcast intent action to indicate that the state of Wi-Fi RTT availability has changed.
-     * Use the {@link #isAvailable()} to query the current status.
-     * This broadcast is <b>not</b> sticky, use the {@link #isAvailable()} API after registering
-     * the broadcast to check the current state of Wi-Fi RTT.
-     * <p>Note: The broadcast is only delivered to registered receivers - no manifest registered
-     * components will be launched.
-     */
-    @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
-    public static final String ACTION_WIFI_RTT_STATE_CHANGED =
-            "android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED";
-
-    /** @hide */
-    public WifiRttManager(@NonNull Context context, @NonNull IWifiRttManager service) {
-        mContext = context;
-        mService = service;
-    }
-
-    /**
-     * Returns the current status of RTT API: whether or not RTT is available. To track
-     * changes in the state of RTT API register for the
-     * {@link #ACTION_WIFI_RTT_STATE_CHANGED} broadcast.
-     * <p>Note: availability of RTT does not mean that the app can use the API. The app's
-     * permissions and platform Location Mode are validated at run-time.
-     *
-     * @return A boolean indicating whether the app can use the RTT API at this time (true) or
-     * not (false).
-     */
-    public boolean isAvailable() {
-        try {
-            return mService.isAvailable();
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Initiate a request to range to a set of devices specified in the {@link RangingRequest}.
-     * Results will be returned in the {@link RangingResultCallback} set of callbacks.
-     *
-     * @param request  A request specifying a set of devices whose distance measurements are
-     *                 requested.
-     * @param executor The Executor on which to run the callback.
-     * @param callback A callback for the result of the ranging request.
-     */
-    @RequiresPermission(allOf = {ACCESS_FINE_LOCATION, CHANGE_WIFI_STATE, ACCESS_WIFI_STATE})
-    public void startRanging(@NonNull RangingRequest request,
-            @NonNull @CallbackExecutor Executor executor, @NonNull RangingResultCallback callback) {
-        startRanging(null, request, executor, callback);
-    }
-
-    /**
-     * Initiate a request to range to a set of devices specified in the {@link RangingRequest}.
-     * Results will be returned in the {@link RangingResultCallback} set of callbacks.
-     *
-     * @param workSource A mechanism to specify an alternative work-source for the request.
-     * @param request  A request specifying a set of devices whose distance measurements are
-     *                 requested.
-     * @param executor The Executor on which to run the callback.
-     * @param callback A callback for the result of the ranging request.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(allOf = {LOCATION_HARDWARE, ACCESS_FINE_LOCATION, CHANGE_WIFI_STATE,
-            ACCESS_WIFI_STATE})
-    public void startRanging(@Nullable WorkSource workSource, @NonNull RangingRequest request,
-            @NonNull @CallbackExecutor Executor executor, @NonNull RangingResultCallback callback) {
-        if (VDBG) {
-            Log.v(TAG, "startRanging: workSource=" + workSource + ", request=" + request
-                    + ", callback=" + callback + ", executor=" + executor);
-        }
-
-        if (executor == null) {
-            throw new IllegalArgumentException("Null executor provided");
-        }
-        if (callback == null) {
-            throw new IllegalArgumentException("Null callback provided");
-        }
-
-        Binder binder = new Binder();
-        try {
-            mService.startRanging(binder, mContext.getOpPackageName(),
-                    mContext.getAttributionTag(), workSource, request, new IRttCallback.Stub() {
-                        @Override
-                        public void onRangingFailure(int status) throws RemoteException {
-                            clearCallingIdentity();
-                            executor.execute(() -> callback.onRangingFailure(status));
-                        }
-
-                        @Override
-                        public void onRangingResults(List<RangingResult> results)
-                                throws RemoteException {
-                            clearCallingIdentity();
-                            executor.execute(() -> callback.onRangingResults(results));
-                        }
-                    });
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-
-    /**
-     * Cancel all ranging requests for the specified work sources. The requests have been requested
-     * using {@link #startRanging(WorkSource, RangingRequest, Executor, RangingResultCallback)}.
-     *
-     * @param workSource The work-sources of the requesters.
-     *
-     * @hide
-     */
-    @SystemApi
-    @RequiresPermission(allOf = {LOCATION_HARDWARE})
-    public void cancelRanging(@Nullable WorkSource workSource) {
-        if (VDBG) {
-            Log.v(TAG, "cancelRanging: workSource=" + workSource);
-        }
-
-        try {
-            mService.cancelRanging(workSource);
-        } catch (RemoteException e) {
-            throw e.rethrowFromSystemServer();
-        }
-    }
-}
diff --git a/wifi/java/android/net/wifi/rtt/package.html b/wifi/java/android/net/wifi/rtt/package.html
deleted file mode 100644
index 4a32f52..0000000
--- a/wifi/java/android/net/wifi/rtt/package.html
+++ /dev/null
@@ -1,45 +0,0 @@
-<HTML>
-<BODY>
-<p>Provides classes which allow applications to use Wi-Fi RTT (IEEE 802.11mc) to measure distance
-    to supporting Access Points and peer devices.</p>
-<p>The primary entry point to Wi-Fi RTT capabilities is the
-    {@link android.net.wifi.rtt.WifiRttManager} class, which is acquired by calling
-    {@link android.content.Context#getSystemService(String)
-    Context.getSystemService(Context.WIFI_RTT_RANGING_SERVICE)}</p>
-
-<p>Some APIs may require the following user permissions:</p>
-<ul>
-    <li>{@link android.Manifest.permission#ACCESS_WIFI_STATE}</li>
-    <li>{@link android.Manifest.permission#CHANGE_WIFI_STATE}</li>
-    <li>{@link android.Manifest.permission#ACCESS_FINE_LOCATION}</li>
-</ul>
-<p>Usage of the API is also gated by the device's Location Mode: whether it permits Wi-Fi based
-location to be queried.</p>
-
-<p class="note"><strong>Note:</strong> Not all Android-powered devices support Wi-Fi RTT
-    functionality.
-    If your application only works with Wi-Fi RTT (i.e. it should only be installed on devices which
-    support Wi-Fi RTT), declare so with a <a
-            href="{@docRoot}guide/topics/manifest/uses-feature-element.html">
-        {@code <uses-feature>}</a>
-    element in the manifest file:</p>
-<pre>
-&lt;manifest ...>
-    &lt;uses-feature android:name="android.hardware.wifi.rtt" />
-    ...
-&lt;/manifest>
-</pre>
-<p>Alternatively, if your application does not require Wi-Fi RTT but can take advantage of it if
-    available, you can perform
-    the check at run-time in your code using {@link
-    android.content.pm.PackageManager#hasSystemFeature(String)} with {@link
-    android.content.pm.PackageManager#FEATURE_WIFI_RTT}:</p>
-<pre>
-    getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_RTT)
-</pre>
-
-<p>For an example of this functionality, see
-<a href="{@docRoot}guide/topics/connectivity/wifi-rtt" class="external">Wi-Fi location: ranging
-with RTT</a>.</p>
-</BODY>
-</HTML>
diff --git a/wifi/java/android/net/wifi/util/HexEncoding.java b/wifi/java/android/net/wifi/util/HexEncoding.java
deleted file mode 100644
index 9ebf947..0000000
--- a/wifi/java/android/net/wifi/util/HexEncoding.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Copyright (C) 2014 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.util;
-
-/**
- * Hexadecimal encoding where each byte is represented by two hexadecimal digits.
- *
- * Note: this is copied from {@link libcore.util.HexEncoding}.
- *
- * @hide
- */
-public class HexEncoding {
-
-    private static final char[] LOWER_CASE_DIGITS = {
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
-    };
-
-    private static final char[] UPPER_CASE_DIGITS = {
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
-    };
-
-    /** Hidden constructor to prevent instantiation. */
-    private HexEncoding() {}
-
-    /**
-     * Encodes the provided byte as a two-digit hexadecimal String value.
-     */
-    public static String encodeToString(byte b, boolean upperCase) {
-        char[] digits = upperCase ? UPPER_CASE_DIGITS : LOWER_CASE_DIGITS;
-        char[] buf = new char[2]; // We always want two digits.
-        buf[0] = digits[(b >> 4) & 0xf];
-        buf[1] = digits[b & 0xf];
-        return new String(buf, 0, 2);
-    }
-
-    /**
-     * Encodes the provided data as a sequence of hexadecimal characters.
-     */
-    public static char[] encode(byte[] data) {
-        return encode(data, 0, data.length, true /* upperCase */);
-    }
-
-    /**
-     * Encodes the provided data as a sequence of hexadecimal characters.
-     */
-    public static char[] encode(byte[] data, boolean upperCase) {
-        return encode(data, 0, data.length, upperCase);
-    }
-
-    /**
-     * Encodes the provided data as a sequence of hexadecimal characters.
-     */
-    public static char[] encode(byte[] data, int offset, int len) {
-        return encode(data, offset, len, true /* upperCase */);
-    }
-
-    /**
-     * Encodes the provided data as a sequence of hexadecimal characters.
-     */
-    private static char[] encode(byte[] data, int offset, int len, boolean upperCase) {
-        char[] digits = upperCase ? UPPER_CASE_DIGITS : LOWER_CASE_DIGITS;
-        char[] result = new char[len * 2];
-        for (int i = 0; i < len; i++) {
-            byte b = data[offset + i];
-            int resultIndex = 2 * i;
-            result[resultIndex] = (digits[(b >> 4) & 0x0f]);
-            result[resultIndex + 1] = (digits[b & 0x0f]);
-        }
-
-        return result;
-    }
-
-    /**
-     * Encodes the provided data as a sequence of hexadecimal characters.
-     */
-    public static String encodeToString(byte[] data) {
-        return encodeToString(data, true /* upperCase */);
-    }
-
-    /**
-     * Encodes the provided data as a sequence of hexadecimal characters.
-     */
-    public static String encodeToString(byte[] data, boolean upperCase) {
-        return new String(encode(data, upperCase));
-    }
-
-    /**
-     * Decodes the provided hexadecimal string into a byte array.  Odd-length inputs
-     * are not allowed.
-     *
-     * Throws an {@code IllegalArgumentException} if the input is malformed.
-     */
-    public static byte[] decode(String encoded) throws IllegalArgumentException {
-        return decode(encoded.toCharArray());
-    }
-
-    /**
-     * Decodes the provided hexadecimal string into a byte array. If {@code allowSingleChar}
-     * is {@code true} odd-length inputs are allowed and the first character is interpreted
-     * as the lower bits of the first result byte.
-     *
-     * Throws an {@code IllegalArgumentException} if the input is malformed.
-     */
-    public static byte[] decode(String encoded, boolean allowSingleChar)
-            throws IllegalArgumentException {
-        return decode(encoded.toCharArray(), allowSingleChar);
-    }
-
-    /**
-     * Decodes the provided hexadecimal string into a byte array.  Odd-length inputs
-     * are not allowed.
-     *
-     * Throws an {@code IllegalArgumentException} if the input is malformed.
-     */
-    public static byte[] decode(char[] encoded) throws IllegalArgumentException {
-        return decode(encoded, false);
-    }
-
-    /**
-     * Decodes the provided hexadecimal string into a byte array. If {@code allowSingleChar}
-     * is {@code true} odd-length inputs are allowed and the first character is interpreted
-     * as the lower bits of the first result byte.
-     *
-     * Throws an {@code IllegalArgumentException} if the input is malformed.
-     */
-    public static byte[] decode(char[] encoded, boolean allowSingleChar)
-            throws IllegalArgumentException {
-        int encodedLength = encoded.length;
-        int resultLengthBytes = (encodedLength + 1) / 2;
-        byte[] result = new byte[resultLengthBytes];
-
-        int resultOffset = 0;
-        int i = 0;
-        if (allowSingleChar) {
-            if ((encodedLength % 2) != 0) {
-                // Odd number of digits -- the first digit is the lower 4 bits of the first result
-                // byte.
-                result[resultOffset++] = (byte) toDigit(encoded, i);
-                i++;
-            }
-        } else {
-            if ((encodedLength % 2) != 0) {
-                throw new IllegalArgumentException("Invalid input length: " + encodedLength);
-            }
-        }
-
-        for (; i < encodedLength; i += 2) {
-            result[resultOffset++] = (byte) ((toDigit(encoded, i) << 4) | toDigit(encoded, i + 1));
-        }
-
-        return result;
-    }
-
-    private static int toDigit(char[] str, int offset) throws IllegalArgumentException {
-        // NOTE: that this isn't really a code point in the traditional sense, since we're
-        // just rejecting surrogate pairs outright.
-        int pseudoCodePoint = str[offset];
-
-        if ('0' <= pseudoCodePoint && pseudoCodePoint <= '9') {
-            return pseudoCodePoint - '0';
-        } else if ('a' <= pseudoCodePoint && pseudoCodePoint <= 'f') {
-            return 10 + (pseudoCodePoint - 'a');
-        } else if ('A' <= pseudoCodePoint && pseudoCodePoint <= 'F') {
-            return 10 + (pseudoCodePoint - 'A');
-        }
-
-        throw new IllegalArgumentException("Illegal char: " + str[offset] + " at offset " + offset);
-    }
-}
diff --git a/wifi/non-updatable/java/Android.bp b/wifi/non-updatable/java/Android.bp
new file mode 100644
index 0000000..b35b4be
--- /dev/null
+++ b/wifi/non-updatable/java/Android.bp
@@ -0,0 +1,35 @@
+// Copyright (C) 2020 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+// This directory contains framework Wifi APIs that are not part of the Wifi module (i.e. not
+// updatable), and are generally only called by the Wifi module.
+
+// necessary since we only want the `path` property to only refer to these files
+filegroup {
+    name: "framework-wifi-non-updatable-sources-internal",
+    srcs: ["src/**/*.java"],
+    path: "src",
+    visibility: ["//visibility:private"],
+}
+
+filegroup {
+    name: "framework-wifi-non-updatable-sources",
+    srcs: [
+        // TODO(b/146011398) package android.net.wifi is now split amongst 2 jars: framework.jar and
+        // framework-wifi.jar. This is not a good idea, should move WifiNetworkScoreCache
+        // to a separate package.
+        ":framework-wifi-non-updatable-sources-internal",
+        ":libwificond_ipc_aidl",
+    ],
+}
diff --git a/wifi/java/android/net/wifi/SoftApConfToXmlMigrationUtil.java b/wifi/non-updatable/java/src/android/net/wifi/SoftApConfToXmlMigrationUtil.java
similarity index 100%
rename from wifi/java/android/net/wifi/SoftApConfToXmlMigrationUtil.java
rename to wifi/non-updatable/java/src/android/net/wifi/SoftApConfToXmlMigrationUtil.java
diff --git a/wifi/java/android/net/wifi/WifiMigration.java b/wifi/non-updatable/java/src/android/net/wifi/WifiMigration.java
similarity index 98%
rename from wifi/java/android/net/wifi/WifiMigration.java
rename to wifi/non-updatable/java/src/android/net/wifi/WifiMigration.java
index 5792d27..4fabc0b 100755
--- a/wifi/java/android/net/wifi/WifiMigration.java
+++ b/wifi/non-updatable/java/src/android/net/wifi/WifiMigration.java
@@ -139,8 +139,8 @@
     /**
      * Load data from legacy shared wifi config store file.
      * <p>
-     * Expected AOSP format is available in the sample files under {@code /frameworks/base/wifi/
-     * java/android/net/wifi/migration_samples}.
+     * Expected AOSP format is available in the sample files under {@code
+     * frameworks/base/wifi/non-updatable/migration_samples/}.
      * </p>
      * <p>
      * Note:
@@ -218,8 +218,8 @@
     /**
      * Load data from legacy user wifi config store file.
      * <p>
-     * Expected AOSP format is available in the sample files under {@code /frameworks/base/wifi/
-     * java/android/net/wifi/migration_samples}.
+     * Expected AOSP format is available in the sample files under {@code
+     * frameworks/base/wifi/non-updatable/migration_samples/}.
      * </p>
      * <p>
      * Note:
diff --git a/wifi/java/android/net/wifi/WifiNetworkScoreCache.java b/wifi/non-updatable/java/src/android/net/wifi/WifiNetworkScoreCache.java
similarity index 98%
rename from wifi/java/android/net/wifi/WifiNetworkScoreCache.java
rename to wifi/non-updatable/java/src/android/net/wifi/WifiNetworkScoreCache.java
index 378549d..3903658 100755
--- a/wifi/java/android/net/wifi/WifiNetworkScoreCache.java
+++ b/wifi/non-updatable/java/src/android/net/wifi/WifiNetworkScoreCache.java
@@ -89,7 +89,7 @@
 
     @Override public final void updateScores(List<ScoredNetwork> networks) {
         if (networks == null || networks.isEmpty()) {
-           return;
+            return;
         }
         if (DBG) {
             Log.d(TAG, "updateScores list size=" + networks.size());
@@ -97,7 +97,7 @@
 
         boolean changed = false;
 
-        synchronized(mLock) {
+        synchronized (mLock) {
             for (ScoredNetwork network : networks) {
                 String networkKey = buildNetworkKey(network);
                 if (networkKey == null) {
@@ -189,7 +189,7 @@
         String key = buildNetworkKey(result);
         if (key == null) return null;
 
-        synchronized(mLock) {
+        synchronized (mLock) {
             ScoredNetwork network = mCache.get(key);
             return network;
         }
diff --git a/wifi/java/android/net/wifi/nl80211/ChannelSettings.java b/wifi/non-updatable/java/src/android/net/wifi/nl80211/ChannelSettings.java
similarity index 100%
rename from wifi/java/android/net/wifi/nl80211/ChannelSettings.java
rename to wifi/non-updatable/java/src/android/net/wifi/nl80211/ChannelSettings.java
diff --git a/wifi/java/android/net/wifi/nl80211/DeviceWiphyCapabilities.java b/wifi/non-updatable/java/src/android/net/wifi/nl80211/DeviceWiphyCapabilities.java
similarity index 100%
rename from wifi/java/android/net/wifi/nl80211/DeviceWiphyCapabilities.java
rename to wifi/non-updatable/java/src/android/net/wifi/nl80211/DeviceWiphyCapabilities.java
diff --git a/wifi/java/android/net/wifi/nl80211/HiddenNetwork.java b/wifi/non-updatable/java/src/android/net/wifi/nl80211/HiddenNetwork.java
similarity index 100%
rename from wifi/java/android/net/wifi/nl80211/HiddenNetwork.java
rename to wifi/non-updatable/java/src/android/net/wifi/nl80211/HiddenNetwork.java
diff --git a/wifi/java/android/net/wifi/nl80211/NativeScanResult.java b/wifi/non-updatable/java/src/android/net/wifi/nl80211/NativeScanResult.java
similarity index 100%
rename from wifi/java/android/net/wifi/nl80211/NativeScanResult.java
rename to wifi/non-updatable/java/src/android/net/wifi/nl80211/NativeScanResult.java
diff --git a/wifi/java/android/net/wifi/nl80211/NativeWifiClient.java b/wifi/non-updatable/java/src/android/net/wifi/nl80211/NativeWifiClient.java
similarity index 100%
rename from wifi/java/android/net/wifi/nl80211/NativeWifiClient.java
rename to wifi/non-updatable/java/src/android/net/wifi/nl80211/NativeWifiClient.java
diff --git a/wifi/java/android/net/wifi/nl80211/PnoNetwork.java b/wifi/non-updatable/java/src/android/net/wifi/nl80211/PnoNetwork.java
similarity index 100%
rename from wifi/java/android/net/wifi/nl80211/PnoNetwork.java
rename to wifi/non-updatable/java/src/android/net/wifi/nl80211/PnoNetwork.java
diff --git a/wifi/java/android/net/wifi/nl80211/PnoSettings.java b/wifi/non-updatable/java/src/android/net/wifi/nl80211/PnoSettings.java
similarity index 100%
rename from wifi/java/android/net/wifi/nl80211/PnoSettings.java
rename to wifi/non-updatable/java/src/android/net/wifi/nl80211/PnoSettings.java
diff --git a/wifi/java/android/net/wifi/nl80211/RadioChainInfo.java b/wifi/non-updatable/java/src/android/net/wifi/nl80211/RadioChainInfo.java
similarity index 100%
rename from wifi/java/android/net/wifi/nl80211/RadioChainInfo.java
rename to wifi/non-updatable/java/src/android/net/wifi/nl80211/RadioChainInfo.java
diff --git a/wifi/java/android/net/wifi/nl80211/SingleScanSettings.java b/wifi/non-updatable/java/src/android/net/wifi/nl80211/SingleScanSettings.java
similarity index 100%
rename from wifi/java/android/net/wifi/nl80211/SingleScanSettings.java
rename to wifi/non-updatable/java/src/android/net/wifi/nl80211/SingleScanSettings.java
diff --git a/wifi/java/android/net/wifi/nl80211/WifiNl80211Manager.java b/wifi/non-updatable/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java
similarity index 100%
rename from wifi/java/android/net/wifi/nl80211/WifiNl80211Manager.java
rename to wifi/non-updatable/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java
diff --git a/wifi/java/android/net/wifi/migration_samples/README.txt b/wifi/non-updatable/migration_samples/README.txt
similarity index 100%
rename from wifi/java/android/net/wifi/migration_samples/README.txt
rename to wifi/non-updatable/migration_samples/README.txt
diff --git a/wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStore.xml b/wifi/non-updatable/migration_samples/Shared_WifiConfigStore.xml
similarity index 100%
rename from wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStore.xml
rename to wifi/non-updatable/migration_samples/Shared_WifiConfigStore.xml
diff --git a/wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStoreSoftAp.xml b/wifi/non-updatable/migration_samples/Shared_WifiConfigStoreSoftAp.xml
similarity index 100%
rename from wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStoreSoftAp.xml
rename to wifi/non-updatable/migration_samples/Shared_WifiConfigStoreSoftAp.xml
diff --git a/wifi/java/android/net/wifi/migration_samples/User_WifiConfigStore.xml b/wifi/non-updatable/migration_samples/User_WifiConfigStore.xml
similarity index 100%
rename from wifi/java/android/net/wifi/migration_samples/User_WifiConfigStore.xml
rename to wifi/non-updatable/migration_samples/User_WifiConfigStore.xml
diff --git a/wifi/java/android/net/wifi/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml b/wifi/non-updatable/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml
similarity index 100%
rename from wifi/java/android/net/wifi/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml
rename to wifi/non-updatable/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml
diff --git a/wifi/tests/Android.bp b/wifi/non-updatable/tests/Android.bp
similarity index 69%
rename from wifi/tests/Android.bp
rename to wifi/non-updatable/tests/Android.bp
index b710a14..3f5cacf 100644
--- a/wifi/tests/Android.bp
+++ b/wifi/non-updatable/tests/Android.bp
@@ -12,15 +12,12 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// Make test APK
-// ============================================================
-
 android_test {
-    name: "FrameworksWifiApiTests",
+    name: "FrameworksWifiNonUpdatableApiTests",
 
     defaults: ["framework-wifi-test-defaults"],
 
-    srcs: ["**/*.java"],
+    srcs: ["src/**/*.java"],
 
     jacoco: {
         include_filter: ["android.net.wifi.*"],
@@ -30,12 +27,9 @@
 
     static_libs: [
         "androidx.test.rules",
-        "core-test-rules",
         "frameworks-base-testutils",
         "guava",
         "mockito-target-minus-junit4",
-        "modules-utils-build",
-        "net-tests-utils",
         "truth-prebuilt",
     ],
 
@@ -45,11 +39,6 @@
     ],
 
     test_suites: [
-        "device-tests",
-        "mts",
+        "general-tests",
     ],
-
-    // static libs used by both framework-wifi & FrameworksWifiApiTests. Need to rename test usage
-    // to a different package name to prevent conflict with the copy in production code.
-    jarjar_rules: "test-jarjar-rules.txt",
 }
diff --git a/wifi/tests/AndroidManifest.xml b/wifi/non-updatable/tests/AndroidManifest.xml
similarity index 75%
rename from wifi/tests/AndroidManifest.xml
rename to wifi/non-updatable/tests/AndroidManifest.xml
index b6c38bc..b4b6b2d 100644
--- a/wifi/tests/AndroidManifest.xml
+++ b/wifi/non-updatable/tests/AndroidManifest.xml
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
-
 <!--
-  ~ Copyright (C) 2016 The Android Open Source Project
+  ~ Copyright (C) 2020 The Android Open Source Project
   ~
   ~ Licensed under the Apache License, Version 2.0 (the "License");
   ~ you may not use this file except in compliance with the License.
@@ -17,22 +16,23 @@
   -->
 
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="android.net.wifi.test">
+     package="android.net.wifi.test">
 
     <application>
-        <uses-library android:name="android.test.runner" />
+        <uses-library android:name="android.test.runner"/>
         <activity android:label="WifiTestDummyLabel"
-                  android:name="WifiTestDummyName">
+             android:name="WifiTestDummyName"
+             android:exported="true">
             <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.intent.action.MAIN"/>
                 <category android:name="android.intent.category.LAUNCHER"/>
             </intent-filter>
         </activity>
     </application>
 
     <instrumentation android:name="androidx.test.runner.AndroidJUnitRunner"
-        android:targetPackage="android.net.wifi.test"
-        android:label="Frameworks Wifi API Tests">
+         android:targetPackage="android.net.wifi.test"
+         android:label="Frameworks Wifi Non-updatable API Tests">
     </instrumentation>
 
 </manifest>
diff --git a/wifi/tests/AndroidTest.xml b/wifi/non-updatable/tests/AndroidTest.xml
similarity index 64%
rename from wifi/tests/AndroidTest.xml
rename to wifi/non-updatable/tests/AndroidTest.xml
index 34e2e3a..5f3fdd4 100644
--- a/wifi/tests/AndroidTest.xml
+++ b/wifi/non-updatable/tests/AndroidTest.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
+<!-- Copyright (C) 2020 The Android Open Source Project
 
      Licensed under the Apache License, Version 2.0 (the "License");
      you may not use this file except in compliance with the License.
@@ -13,22 +13,16 @@
      See the License for the specific language governing permissions and
      limitations under the License.
 -->
-<configuration description="Runs Frameworks Wifi API Tests.">
+<configuration description="Runs Frameworks Wifi Non-updatable API Tests.">
     <target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
-        <option name="test-file-name" value="FrameworksWifiApiTests.apk" />
+        <option name="test-file-name" value="FrameworksWifiNonUpdatableApiTests.apk" />
     </target_preparer>
 
     <option name="test-suite-tag" value="apct" />
-    <option name="test-tag" value="FrameworksWifiApiTests" />
+    <option name="test-tag" value="FrameworksWifiNonUpdatableApiTests" />
     <test class="com.android.tradefed.testtype.AndroidJUnitTest" >
         <option name="package" value="android.net.wifi.test" />
         <option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
         <option name="hidden-api-checks" value="false"/>
     </test>
-
-    <!-- Only run FrameworksWifiApiTests in MTS if the Wifi Mainline module is installed. -->
-    <object type="module_controller"
-            class="com.android.tradefed.testtype.suite.module.MainlineTestModuleController">
-        <option name="mainline-module-package-name" value="com.google.android.wifi" />
-    </object>
 </configuration>
diff --git a/wifi/tests/README.md b/wifi/non-updatable/tests/README.md
similarity index 85%
rename from wifi/tests/README.md
rename to wifi/non-updatable/tests/README.md
index f909404..ad535f4 100644
--- a/wifi/tests/README.md
+++ b/wifi/non-updatable/tests/README.md
@@ -1,5 +1,6 @@
-# Wifi Unit Tests
-This package contains unit tests for the android wifi framework APIs based on the
+# Wifi Non-Updatable Framework Unit Tests
+This package contains unit tests for the non-updatable part (i.e. outside the Wifi module) of the
+Android Wifi framework APIs based on the
 [Android Testing Support Library](http://developer.android.com/tools/testing-support-library/index.html).
 The test cases are built using the [JUnit](http://junit.org/) and [Mockito](http://mockito.org/)
 libraries.
diff --git a/wifi/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java b/wifi/non-updatable/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java
similarity index 100%
rename from wifi/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java
rename to wifi/non-updatable/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkScoreCacheTest.java b/wifi/non-updatable/tests/src/android/net/wifi/WifiNetworkScoreCacheTest.java
similarity index 99%
rename from wifi/tests/src/android/net/wifi/WifiNetworkScoreCacheTest.java
rename to wifi/non-updatable/tests/src/android/net/wifi/WifiNetworkScoreCacheTest.java
index fdd11a3..c4967eb 100644
--- a/wifi/tests/src/android/net/wifi/WifiNetworkScoreCacheTest.java
+++ b/wifi/non-updatable/tests/src/android/net/wifi/WifiNetworkScoreCacheTest.java
@@ -11,7 +11,7 @@
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
- * limitations under the License
+ * limitations under the License.
  */
 
 package android.net.wifi;
diff --git a/wifi/tests/src/android/net/wifi/nl80211/DeviceWiphyCapabilitiesTest.java b/wifi/non-updatable/tests/src/android/net/wifi/nl80211/DeviceWiphyCapabilitiesTest.java
similarity index 100%
rename from wifi/tests/src/android/net/wifi/nl80211/DeviceWiphyCapabilitiesTest.java
rename to wifi/non-updatable/tests/src/android/net/wifi/nl80211/DeviceWiphyCapabilitiesTest.java
diff --git a/wifi/tests/src/android/net/wifi/nl80211/NativeScanResultTest.java b/wifi/non-updatable/tests/src/android/net/wifi/nl80211/NativeScanResultTest.java
similarity index 100%
rename from wifi/tests/src/android/net/wifi/nl80211/NativeScanResultTest.java
rename to wifi/non-updatable/tests/src/android/net/wifi/nl80211/NativeScanResultTest.java
diff --git a/wifi/tests/src/android/net/wifi/nl80211/PnoSettingsTest.java b/wifi/non-updatable/tests/src/android/net/wifi/nl80211/PnoSettingsTest.java
similarity index 100%
rename from wifi/tests/src/android/net/wifi/nl80211/PnoSettingsTest.java
rename to wifi/non-updatable/tests/src/android/net/wifi/nl80211/PnoSettingsTest.java
diff --git a/wifi/tests/src/android/net/wifi/nl80211/SingleScanSettingsTest.java b/wifi/non-updatable/tests/src/android/net/wifi/nl80211/SingleScanSettingsTest.java
similarity index 100%
rename from wifi/tests/src/android/net/wifi/nl80211/SingleScanSettingsTest.java
rename to wifi/non-updatable/tests/src/android/net/wifi/nl80211/SingleScanSettingsTest.java
diff --git a/wifi/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java b/wifi/non-updatable/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java
similarity index 100%
rename from wifi/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java
rename to wifi/non-updatable/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java
diff --git a/wifi/tests/assets/hsr1/HSR1ProfileWithCACert.base64 b/wifi/tests/assets/hsr1/HSR1ProfileWithCACert.base64
deleted file mode 100644
index 760c839..0000000
--- a/wifi/tests/assets/hsr1/HSR1ProfileWithCACert.base64
+++ /dev/null
@@ -1,86 +0,0 @@
-TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5
-PXtib3VuZGFyeX07IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFz
-ZTY0CgotLXtib3VuZGFyeX0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXBhc3Nwb2ludC1w
-cm9maWxlOyBjaGFyc2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAoK
-UEUxbmJYUlVjbVZsSUhodGJHNXpQU0p6ZVc1amJXdzZaRzFrWkdZeExqSWlQZ29nSUR4V1pYSkVW
-RVErTVM0eVBDOVdaWEpFVkVRKwpDaUFnUEU1dlpHVStDaUFnSUNBOFRtOWtaVTVoYldVK1VHVnlV
-SEp2ZG1sa1pYSlRkV0p6WTNKcGNIUnBiMjQ4TDA1dlpHVk9ZVzFsClBnb2dJQ0FnUEZKVVVISnZj
-R1Z5ZEdsbGN6NEtJQ0FnSUNBZ1BGUjVjR1UrQ2lBZ0lDQWdJQ0FnUEVSRVJrNWhiV1UrZFhKdU9u
-ZG0KWVRwdGJ6cG9iM1J6Y0c5ME1tUnZkREF0Y0dWeWNISnZkbWxrWlhKemRXSnpZM0pwY0hScGIy
-NDZNUzR3UEM5RVJFWk9ZVzFsUGdvZwpJQ0FnSUNBOEwxUjVjR1UrQ2lBZ0lDQThMMUpVVUhKdmNH
-VnlkR2xsY3o0S0lDQWdJRHhPYjJSbFBnb2dJQ0FnSUNBOFRtOWtaVTVoCmJXVSthVEF3TVR3dlRt
-OWtaVTVoYldVK0NpQWdJQ0FnSUR4T2IyUmxQZ29nSUNBZ0lDQWdJRHhPYjJSbFRtRnRaVDVJYjIx
-bFUxQTgKTDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUR4T2IyUmxQZ29nSUNBZ0lDQWdJQ0FnUEU1
-dlpHVk9ZVzFsUGtaeWFXVnVaR3g1VG1GdApaVHd2VG05a1pVNWhiV1UrQ2lBZ0lDQWdJQ0FnSUNB
-OFZtRnNkV1UrUlhoaGJYQnNaU0JPWlhSM2IzSnJQQzlXWVd4MVpUNEtJQ0FnCklDQWdJQ0E4TDA1
-dlpHVStDaUFnSUNBZ0lDQWdQRTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQThUbTlrWlU1aGJXVStSbEZF
-VGp3dlRtOWsKWlU1aGJXVStDaUFnSUNBZ0lDQWdJQ0E4Vm1Gc2RXVSthRzkwYzNCdmRDNWxlR0Z0
-Y0d4bExtNWxkRHd2Vm1Gc2RXVStDaUFnSUNBZwpJQ0FnUEM5T2IyUmxQZ29nSUNBZ0lDQWdJRHhP
-YjJSbFBnb2dJQ0FnSUNBZ0lDQWdQRTV2WkdWT1lXMWxQbEp2WVcxcGJtZERiMjV6CmIzSjBhWFZ0
-VDBrOEwwNXZaR1ZPWVcxbFBnb2dJQ0FnSUNBZ0lDQWdQRlpoYkhWbFBqRXhNakl6TXl3ME5EVTFO
-alk4TDFaaGJIVmwKUGdvZ0lDQWdJQ0FnSUR3dlRtOWtaVDRLSUNBZ0lDQWdQQzlPYjJSbFBnb2dJ
-Q0FnSUNBOFRtOWtaVDRLSUNBZ0lDQWdJQ0E4VG05awpaVTVoYldVK1EzSmxaR1Z1ZEdsaGJEd3ZU
-bTlrWlU1aGJXVStDaUFnSUNBZ0lDQWdQRTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQThUbTlrClpVNWhi
-V1UrVW1WaGJHMDhMMDV2WkdWT1lXMWxQZ29nSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQbVY0WVcxd2JH
-VXVZMjl0UEM5V1lXeDEKWlQ0S0lDQWdJQ0FnSUNBOEwwNXZaR1UrQ2lBZ0lDQWdJQ0FnUEU1dlpH
-VStDaUFnSUNBZ0lDQWdJQ0E4VG05a1pVNWhiV1UrVlhObApjbTVoYldWUVlYTnpkMjl5WkR3dlRt
-OWtaVTVoYldVK0NpQWdJQ0FnSUNBZ0lDQThUbTlrWlQ0S0lDQWdJQ0FnSUNBZ0lDQWdQRTV2ClpH
-Vk9ZVzFsUGxWelpYSnVZVzFsUEM5T2IyUmxUbUZ0WlQ0S0lDQWdJQ0FnSUNBZ0lDQWdQRlpoYkhW
-bFBuVnpaWEk4TDFaaGJIVmwKUGdvZ0lDQWdJQ0FnSUNBZ1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUNB
-Z1BFNXZaR1UrQ2lBZ0lDQWdJQ0FnSUNBZ0lEeE9iMlJsVG1GdApaVDVRWVhOemQyOXlaRHd2VG05
-a1pVNWhiV1UrQ2lBZ0lDQWdJQ0FnSUNBZ0lEeFdZV3gxWlQ1alIwWjZZek5rZG1OdFVUMDhMMVpo
-CmJIVmxQZ29nSUNBZ0lDQWdJQ0FnUEM5T2IyUmxQZ29nSUNBZ0lDQWdJQ0FnUEU1dlpHVStDaUFn
-SUNBZ0lDQWdJQ0FnSUR4T2IyUmwKVG1GdFpUNUZRVkJOWlhSb2IyUThMMDV2WkdWT1lXMWxQZ29n
-SUNBZ0lDQWdJQ0FnSUNBOFRtOWtaVDRLSUNBZ0lDQWdJQ0FnSUNBZwpJQ0E4VG05a1pVNWhiV1Ur
-UlVGUVZIbHdaVHd2VG05a1pVNWhiV1UrQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdQRlpoYkhWbFBqSXhQ
-QzlXCllXeDFaVDRLSUNBZ0lDQWdJQ0FnSUNBZ1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ0lDQThU
-bTlrWlQ0S0lDQWdJQ0FnSUNBZ0lDQWcKSUNBOFRtOWtaVTVoYldVK1NXNXVaWEpOWlhSb2IyUThM
-MDV2WkdWT1lXMWxQZ29nSUNBZ0lDQWdJQ0FnSUNBZ0lEeFdZV3gxWlQ1TgpVeTFEU0VGUUxWWXlQ
-QzlXWVd4MVpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEM5T2IyUmxQZ29nSUNBZ0lDQWdJQ0FnUEM5T2Iy
-UmxQZ29nCklDQWdJQ0FnSUR3dlRtOWtaVDRLSUNBZ0lDQWdJQ0E4VG05a1pUNEtJQ0FnSUNBZ0lD
-QWdJRHhPYjJSbFRtRnRaVDVFYVdkcGRHRnMKUTJWeWRHbG1hV05oZEdVOEwwNXZaR1ZPWVcxbFBn
-b2dJQ0FnSUNBZ0lDQWdQRTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQWdJRHhPYjJSbApUbUZ0WlQ1RFpY
-SjBhV1pwWTJGMFpWUjVjR1U4TDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUNBZ0lDQThWbUZzZFdV
-K2VEVXdPWFl6ClBDOVdZV3gxWlQ0S0lDQWdJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnSUNB
-Z0lEeE9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ0lDQTgKVG05a1pVNWhiV1UrUTJWeWRGTklRVEkxTmta
-cGJtZGxjbkJ5YVc1MFBDOU9iMlJsVG1GdFpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEZaaApiSFZsUGpG
-bU1XWXhaakZtTVdZeFpqRm1NV1l4WmpGbU1XWXhaakZtTVdZeFpqRm1NV1l4WmpGbU1XWXhaakZt
-TVdZeFpqRm1NV1l4ClpqRm1NV1l4WmpGbU1XWThMMVpoYkhWbFBnb2dJQ0FnSUNBZ0lDQWdQQzlP
-YjJSbFBnb2dJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWcKSUNBZ0lDQThUbTlrWlQ0S0lDQWdJQ0Fn
-SUNBZ0lEeE9iMlJsVG1GdFpUNVRTVTA4TDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUNBZwpQRTV2
-WkdVK0NpQWdJQ0FnSUNBZ0lDQWdJRHhPYjJSbFRtRnRaVDVKVFZOSlBDOU9iMlJsVG1GdFpUNEtJ
-Q0FnSUNBZ0lDQWdJQ0FnClBGWmhiSFZsUGpFeU16UTFOaW84TDFaaGJIVmxQZ29nSUNBZ0lDQWdJ
-Q0FnUEM5T2IyUmxQZ29nSUNBZ0lDQWdJQ0FnUEU1dlpHVSsKQ2lBZ0lDQWdJQ0FnSUNBZ0lEeE9i
-MlJsVG1GdFpUNUZRVkJVZVhCbFBDOU9iMlJsVG1GdFpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEZaaApi
-SFZsUGpJelBDOVdZV3gxWlQ0S0lDQWdJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnSUNBOEww
-NXZaR1UrQ2lBZ0lDQWdJRHd2ClRtOWtaVDRLSUNBZ0lEd3ZUbTlrWlQ0S0lDQThMMDV2WkdVK0Nq
-d3ZUV2R0ZEZSeVpXVSsKCi0te2JvdW5kYXJ5fQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gt
-eDUwOS1jYS1jZXJ0CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAoKTFMwdExTMUNS
-VWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVUkxSRU5EUVdoRFowRjNTVUpCWjBsS1FV
-bE1iRVprZDNwTQpWblZ5VFVFd1IwTlRjVWRUU1dJelJGRkZRa04zVlVGTlFrbDRSVVJCVDBKblRs
-WUtRa0ZOVkVJd1ZrSlZRMEpFVVZSRmQwaG9ZMDVOClZGbDNUVlJGZVUxVVJURk5SRVV4VjJoalRr
-MXFXWGROVkVFMVRWUkZNVTFFUlRGWGFrRlRUVkpCZHdwRVoxbEVWbEZSUkVWM1pFWlIKVmtGblVU
-QkZlRTFKU1VKSmFrRk9RbWRyY1docmFVYzVkekJDUVZGRlJrRkJUME5CVVRoQlRVbEpRa05uUzBO
-QlVVVkJDbnB1UVZCVgplakkyVFhOaFpUUjNjelF6WTNwU05ERXZTakpSZEhKVFNWcFZTMjFXVlhO
-V2RXMUVZbGxJY2xCT2RsUllTMU5OV0VGalpYZFBVa1JSCldWZ0tVbkYyU0had2JqaERjMk5DTVN0
-dlIxaGFka2gzZUdvMGVsWXdWMHR2U3pKNlpWaHJZWFV6ZG1ONWJETklTVXQxY0VwbWNUSlUKUlVG
-RFpXWldhbW93ZEFwS1Z5dFlNelZRUjFkd09TOUlOWHBKVlU1V1RsWnFVemRWYlhNNE5FbDJTMmhT
-UWpnMU1USlFRamxWZVVoaApaMWhaVmxnMVIxZHdRV05XY0hsbWNteFNDa1pKT1ZGa2FHZ3JVR0py
-TUhWNWEzUmtZbVl2UTJSbVowaFBiMlZpY2xSMGQxSnNhazB3CmIwUjBXQ3N5UTNZMmFqQjNRa3Mz
-YUVRNGNGQjJaakVyZFhrS1IzcGplbWxuUVZVdk5FdDNOMlZhY1hsa1pqbENLelZTZFhCU0swbGEK
-YVhCWU5ERjRSV2xKY2t0U2QzRnBOVEUzVjFkNldHTnFZVWN5WTA1aVpqUTFNUXA0Y0VnMVVHNVdN
-Mmt4ZEhFd05HcE5SMUZWZWtaMwpTVVJCVVVGQ2J6UkhRVTFJTkhkSVVWbEVWbEl3VDBKQ1dVVkdT
-WGRZTkhaek9FSnBRbU5UWTI5a0NqVnViMXBJVWswNFJUUXJhVTFGClNVZEJNVlZrU1hkUk4wMUVi
-VUZHU1hkWU5IWnpPRUpwUW1OVFkyOWtOVzV2V2toU1RUaEZOQ3RwYjFKaGEwWkVRVk1LVFZKQmQw
-Um4KV1VSV1VWRkVSWGRrUmxGV1FXZFJNRVY0WjJkclFXZDFWVll6UkUxMFZ6WnpkMFJCV1VSV1Vq
-QlVRa0ZWZDBGM1JVSXZla0ZNUW1kTwpWZ3BJVVRoRlFrRk5RMEZSV1hkRVVWbEtTMjlhU1doMlkw
-NUJVVVZNUWxGQlJHZG5SVUpCUm1aUmNVOVVRVGRTZGpkTEsyeDFVVGR3CmJtRnpORUpaZDBoRkNq
-bEhSVkF2ZFc5b2RqWkxUM2t3VkVkUlJtSnlVbFJxUm05TVZrNUNPVUphTVhsdFRVUmFNQzlVU1hk
-SlZXTTMKZDJrM1lUaDBOVzFGY1ZsSU1UVXpkMWNLWVZkdmIybFRhbmxNVEdoMVNUUnpUbkpPUTA5
-MGFYTmtRbkV5Y2pKTlJsaDBObWd3YlVGUgpXVTlRZGpoU09FczNMMlpuVTNoSFJuRjZhSGxPYlcx
-V1RBb3hjVUpLYkdSNE16UlRjSGR6VkVGTVVWWlFZalJvUjNkS2VscG1jakZRClkzQkZVWGcyZUUx
-dVZHdzRlRVZYV2tVelRYTTVPWFZoVlhoaVVYRkpkMUoxQ2t4blFVOXJUa050V1RKdE9EbFdhSHBo
-U0VveGRWWTQKTlVGa1RTOTBSQ3RaYzIxc2JtNXFkRGxNVWtObGFtSkNhWEJxU1VkcVQxaHlaekZL
-VUN0c2VGWUtiWFZOTkhaSUsxQXZiV3h0ZUhOUQpVSG93WkRZMVlpdEZSMjFLV25CdlRHdFBMM1Jr
-VGs1MlExbDZha3B3VkVWWGNFVnpUelpPVFdoTFdXODlDaTB0TFMwdFJVNUVJRU5GClVsUkpSa2xE
-UVZSRkxTMHRMUzBLCi0te2JvdW5kYXJ5fS0tCg==
\ No newline at end of file
diff --git a/wifi/tests/assets/hsr1/HSR1ProfileWithCACert.conf b/wifi/tests/assets/hsr1/HSR1ProfileWithCACert.conf
deleted file mode 100644
index 5b4e4cb..0000000
--- a/wifi/tests/assets/hsr1/HSR1ProfileWithCACert.conf
+++ /dev/null
@@ -1,74 +0,0 @@
-MIME-Version: 1.0
-Content-Type: multipart/mixed; boundary={boundary}; charset=UTF-8
-Content-Transfer-Encoding: base64
-
---{boundary}
-Content-Type: application/x-passpoint-profile; charset=UTF-8
-Content-Transfer-Encoding: base64
-
-PE1nbXRUcmVlIHhtbG5zPSJzeW5jbWw6ZG1kZGYxLjIiPgogIDxWZXJEVEQ+MS4yPC9WZXJEVEQ+
-CiAgPE5vZGU+CiAgICA8Tm9kZU5hbWU+UGVyUHJvdmlkZXJTdWJzY3JpcHRpb248L05vZGVOYW1l
-PgogICAgPFJUUHJvcGVydGllcz4KICAgICAgPFR5cGU+CiAgICAgICAgPERERk5hbWU+dXJuOndm
-YTptbzpob3RzcG90MmRvdDAtcGVycHJvdmlkZXJzdWJzY3JpcHRpb246MS4wPC9EREZOYW1lPgog
-ICAgICA8L1R5cGU+CiAgICA8L1JUUHJvcGVydGllcz4KICAgIDxOb2RlPgogICAgICA8Tm9kZU5h
-bWU+aTAwMTwvTm9kZU5hbWU+CiAgICAgIDxOb2RlPgogICAgICAgIDxOb2RlTmFtZT5Ib21lU1A8
-L05vZGVOYW1lPgogICAgICAgIDxOb2RlPgogICAgICAgICAgPE5vZGVOYW1lPkZyaWVuZGx5TmFt
-ZTwvTm9kZU5hbWU+CiAgICAgICAgICA8VmFsdWU+RXhhbXBsZSBOZXR3b3JrPC9WYWx1ZT4KICAg
-ICAgICA8L05vZGU+CiAgICAgICAgPE5vZGU+CiAgICAgICAgICA8Tm9kZU5hbWU+RlFETjwvTm9k
-ZU5hbWU+CiAgICAgICAgICA8VmFsdWU+aG90c3BvdC5leGFtcGxlLm5ldDwvVmFsdWU+CiAgICAg
-ICAgPC9Ob2RlPgogICAgICAgIDxOb2RlPgogICAgICAgICAgPE5vZGVOYW1lPlJvYW1pbmdDb25z
-b3J0aXVtT0k8L05vZGVOYW1lPgogICAgICAgICAgPFZhbHVlPjExMjIzMyw0NDU1NjY8L1ZhbHVl
-PgogICAgICAgIDwvTm9kZT4KICAgICAgPC9Ob2RlPgogICAgICA8Tm9kZT4KICAgICAgICA8Tm9k
-ZU5hbWU+Q3JlZGVudGlhbDwvTm9kZU5hbWU+CiAgICAgICAgPE5vZGU+CiAgICAgICAgICA8Tm9k
-ZU5hbWU+UmVhbG08L05vZGVOYW1lPgogICAgICAgICAgPFZhbHVlPmV4YW1wbGUuY29tPC9WYWx1
-ZT4KICAgICAgICA8L05vZGU+CiAgICAgICAgPE5vZGU+CiAgICAgICAgICA8Tm9kZU5hbWU+VXNl
-cm5hbWVQYXNzd29yZDwvTm9kZU5hbWU+CiAgICAgICAgICA8Tm9kZT4KICAgICAgICAgICAgPE5v
-ZGVOYW1lPlVzZXJuYW1lPC9Ob2RlTmFtZT4KICAgICAgICAgICAgPFZhbHVlPnVzZXI8L1ZhbHVl
-PgogICAgICAgICAgPC9Ob2RlPgogICAgICAgICAgPE5vZGU+CiAgICAgICAgICAgIDxOb2RlTmFt
-ZT5QYXNzd29yZDwvTm9kZU5hbWU+CiAgICAgICAgICAgIDxWYWx1ZT5jR0Z6YzNkdmNtUT08L1Zh
-bHVlPgogICAgICAgICAgPC9Ob2RlPgogICAgICAgICAgPE5vZGU+CiAgICAgICAgICAgIDxOb2Rl
-TmFtZT5FQVBNZXRob2Q8L05vZGVOYW1lPgogICAgICAgICAgICA8Tm9kZT4KICAgICAgICAgICAg
-ICA8Tm9kZU5hbWU+RUFQVHlwZTwvTm9kZU5hbWU+CiAgICAgICAgICAgICAgPFZhbHVlPjIxPC9W
-YWx1ZT4KICAgICAgICAgICAgPC9Ob2RlPgogICAgICAgICAgICA8Tm9kZT4KICAgICAgICAgICAg
-ICA8Tm9kZU5hbWU+SW5uZXJNZXRob2Q8L05vZGVOYW1lPgogICAgICAgICAgICAgIDxWYWx1ZT5N
-Uy1DSEFQLVYyPC9WYWx1ZT4KICAgICAgICAgICAgPC9Ob2RlPgogICAgICAgICAgPC9Ob2RlPgog
-ICAgICAgIDwvTm9kZT4KICAgICAgICA8Tm9kZT4KICAgICAgICAgIDxOb2RlTmFtZT5EaWdpdGFs
-Q2VydGlmaWNhdGU8L05vZGVOYW1lPgogICAgICAgICAgPE5vZGU+CiAgICAgICAgICAgIDxOb2Rl
-TmFtZT5DZXJ0aWZpY2F0ZVR5cGU8L05vZGVOYW1lPgogICAgICAgICAgICA8VmFsdWU+eDUwOXYz
-PC9WYWx1ZT4KICAgICAgICAgIDwvTm9kZT4KICAgICAgICAgIDxOb2RlPgogICAgICAgICAgICA8
-Tm9kZU5hbWU+Q2VydFNIQTI1NkZpbmdlcnByaW50PC9Ob2RlTmFtZT4KICAgICAgICAgICAgPFZh
-bHVlPjFmMWYxZjFmMWYxZjFmMWYxZjFmMWYxZjFmMWYxZjFmMWYxZjFmMWYxZjFmMWYxZjFmMWYx
-ZjFmMWYxZjFmMWY8L1ZhbHVlPgogICAgICAgICAgPC9Ob2RlPgogICAgICAgIDwvTm9kZT4KICAg
-ICAgICA8Tm9kZT4KICAgICAgICAgIDxOb2RlTmFtZT5TSU08L05vZGVOYW1lPgogICAgICAgICAg
-PE5vZGU+CiAgICAgICAgICAgIDxOb2RlTmFtZT5JTVNJPC9Ob2RlTmFtZT4KICAgICAgICAgICAg
-PFZhbHVlPjEyMzQ1Nio8L1ZhbHVlPgogICAgICAgICAgPC9Ob2RlPgogICAgICAgICAgPE5vZGU+
-CiAgICAgICAgICAgIDxOb2RlTmFtZT5FQVBUeXBlPC9Ob2RlTmFtZT4KICAgICAgICAgICAgPFZh
-bHVlPjIzPC9WYWx1ZT4KICAgICAgICAgIDwvTm9kZT4KICAgICAgICA8L05vZGU+CiAgICAgIDwv
-Tm9kZT4KICAgIDwvTm9kZT4KICA8L05vZGU+CjwvTWdtdFRyZWU+
-
---{boundary}
-Content-Type: application/x-x509-ca-cert
-Content-Transfer-Encoding: base64
-
-LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURLRENDQWhDZ0F3SUJBZ0lKQUlMbEZkd3pM
-VnVyTUEwR0NTcUdTSWIzRFFFQkN3VUFNQkl4RURBT0JnTlYKQkFNVEIwVkJVQ0JEUVRFd0hoY05N
-VFl3TVRFeU1URTFNREUxV2hjTk1qWXdNVEE1TVRFMU1ERTFXakFTTVJBdwpEZ1lEVlFRREV3ZEZR
-VkFnUTBFeE1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBCnpuQVBV
-ejI2TXNhZTR3czQzY3pSNDEvSjJRdHJTSVpVS21WVXNWdW1EYllIclBOdlRYS1NNWEFjZXdPUkRR
-WVgKUnF2SHZwbjhDc2NCMStvR1hadkh3eGo0elYwV0tvSzJ6ZVhrYXUzdmN5bDNISUt1cEpmcTJU
-RUFDZWZWamowdApKVytYMzVQR1dwOS9INXpJVU5WTlZqUzdVbXM4NEl2S2hSQjg1MTJQQjlVeUhh
-Z1hZVlg1R1dwQWNWcHlmcmxSCkZJOVFkaGgrUGJrMHV5a3RkYmYvQ2RmZ0hPb2ViclR0d1Jsak0w
-b0R0WCsyQ3Y2ajB3Qks3aEQ4cFB2ZjErdXkKR3pjemlnQVUvNEt3N2VacXlkZjlCKzVSdXBSK0la
-aXBYNDF4RWlJcktSd3FpNTE3V1d6WGNqYUcyY05iZjQ1MQp4cEg1UG5WM2kxdHEwNGpNR1FVekZ3
-SURBUUFCbzRHQU1INHdIUVlEVlIwT0JCWUVGSXdYNHZzOEJpQmNTY29kCjVub1pIUk04RTQraU1F
-SUdBMVVkSXdRN01EbUFGSXdYNHZzOEJpQmNTY29kNW5vWkhSTThFNCtpb1Jha0ZEQVMKTVJBd0Rn
-WURWUVFERXdkRlFWQWdRMEV4Z2drQWd1VVYzRE10VzZzd0RBWURWUjBUQkFVd0F3RUIvekFMQmdO
-VgpIUThFQkFNQ0FRWXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRmZRcU9UQTdSdjdLK2x1UTdw
-bmFzNEJZd0hFCjlHRVAvdW9odjZLT3kwVEdRRmJyUlRqRm9MVk5COUJaMXltTURaMC9USXdJVWM3
-d2k3YTh0NW1FcVlIMTUzd1cKYVdvb2lTanlMTGh1STRzTnJOQ090aXNkQnEycjJNRlh0NmgwbUFR
-WU9QdjhSOEs3L2ZnU3hHRnF6aHlObW1WTAoxcUJKbGR4MzRTcHdzVEFMUVZQYjRoR3dKelpmcjFQ
-Y3BFUXg2eE1uVGw4eEVXWkUzTXM5OXVhVXhiUXFJd1J1CkxnQU9rTkNtWTJtODlWaHphSEoxdVY4
-NUFkTS90RCtZc21sbm5qdDlMUkNlamJCaXBqSUdqT1hyZzFKUCtseFYKbXVNNHZIK1AvbWxteHNQ
-UHowZDY1YitFR21KWnBvTGtPL3RkTk52Q1l6akpwVEVXcEVzTzZOTWhLWW89Ci0tLS0tRU5EIENF
-UlRJRklDQVRFLS0tLS0K
---{boundary}--
diff --git a/wifi/tests/assets/hsr1/HSR1ProfileWithInvalidContentType.base64 b/wifi/tests/assets/hsr1/HSR1ProfileWithInvalidContentType.base64
deleted file mode 100644
index 2775a9f..0000000
--- a/wifi/tests/assets/hsr1/HSR1ProfileWithInvalidContentType.base64
+++ /dev/null
@@ -1,86 +0,0 @@
-TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5
-PXtib3VuZGFyeX07IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFz
-ZTY0CgotLXtib3VuZGFyeX0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9wYXNzcG9pbnQtcHJv
-ZmlsZTsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKClBF
-MW5iWFJVY21WbElIaHRiRzV6UFNKemVXNWpiV3c2Wkcxa1pHWXhMaklpUGdvZ0lEeFdaWEpFVkVR
-K01TNHlQQzlXWlhKRVZFUSsKQ2lBZ1BFNXZaR1UrQ2lBZ0lDQThUbTlrWlU1aGJXVStVR1Z5VUhK
-dmRtbGtaWEpUZFdKelkzSnBjSFJwYjI0OEwwNXZaR1ZPWVcxbApQZ29nSUNBZ1BGSlVVSEp2Y0dW
-eWRHbGxjejRLSUNBZ0lDQWdQRlI1Y0dVK0NpQWdJQ0FnSUNBZ1BFUkVSazVoYldVK2RYSnVPbmRt
-CllUcHRienBvYjNSemNHOTBNbVJ2ZERBdGNHVnljSEp2ZG1sa1pYSnpkV0p6WTNKcGNIUnBiMjQ2
-TVM0d1BDOUVSRVpPWVcxbFBnb2cKSUNBZ0lDQThMMVI1Y0dVK0NpQWdJQ0E4TDFKVVVISnZjR1Z5
-ZEdsbGN6NEtJQ0FnSUR4T2IyUmxQZ29nSUNBZ0lDQThUbTlrWlU1aApiV1UrYVRBd01Ud3ZUbTlr
-WlU1aGJXVStDaUFnSUNBZ0lEeE9iMlJsUGdvZ0lDQWdJQ0FnSUR4T2IyUmxUbUZ0WlQ1SWIyMWxV
-MUE4CkwwNXZaR1ZPWVcxbFBnb2dJQ0FnSUNBZ0lEeE9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ1BFNXZa
-R1ZPWVcxbFBrWnlhV1Z1Wkd4NVRtRnQKWlR3dlRtOWtaVTVoYldVK0NpQWdJQ0FnSUNBZ0lDQThW
-bUZzZFdVK1JYaGhiWEJzWlNCT1pYUjNiM0pyUEM5V1lXeDFaVDRLSUNBZwpJQ0FnSUNBOEwwNXZa
-R1UrQ2lBZ0lDQWdJQ0FnUEU1dlpHVStDaUFnSUNBZ0lDQWdJQ0E4VG05a1pVNWhiV1UrUmxGRVRq
-d3ZUbTlrClpVNWhiV1UrQ2lBZ0lDQWdJQ0FnSUNBOFZtRnNkV1UrYUc5MGMzQnZkQzVsZUdGdGNH
-eGxMbTVsZER3dlZtRnNkV1UrQ2lBZ0lDQWcKSUNBZ1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUR4T2Iy
-UmxQZ29nSUNBZ0lDQWdJQ0FnUEU1dlpHVk9ZVzFsUGxKdllXMXBibWREYjI1egpiM0owYVhWdFQw
-azhMMDV2WkdWT1lXMWxQZ29nSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQakV4TWpJek15dzBORFUxTmpZ
-OEwxWmhiSFZsClBnb2dJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnUEM5T2IyUmxQZ29nSUNB
-Z0lDQThUbTlrWlQ0S0lDQWdJQ0FnSUNBOFRtOWsKWlU1aGJXVStRM0psWkdWdWRHbGhiRHd2VG05
-a1pVNWhiV1UrQ2lBZ0lDQWdJQ0FnUEU1dlpHVStDaUFnSUNBZ0lDQWdJQ0E4VG05awpaVTVoYldV
-K1VtVmhiRzA4TDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUNBZ1BGWmhiSFZsUG1WNFlXMXdiR1V1
-WTI5dFBDOVdZV3gxClpUNEtJQ0FnSUNBZ0lDQThMMDV2WkdVK0NpQWdJQ0FnSUNBZ1BFNXZaR1Ur
-Q2lBZ0lDQWdJQ0FnSUNBOFRtOWtaVTVoYldVK1ZYTmwKY201aGJXVlFZWE56ZDI5eVpEd3ZUbTlr
-WlU1aGJXVStDaUFnSUNBZ0lDQWdJQ0E4VG05a1pUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEU1dgpaR1ZP
-WVcxbFBsVnpaWEp1WVcxbFBDOU9iMlJsVG1GdFpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQ
-blZ6WlhJOEwxWmhiSFZsClBnb2dJQ0FnSUNBZ0lDQWdQQzlPYjJSbFBnb2dJQ0FnSUNBZ0lDQWdQ
-RTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQWdJRHhPYjJSbFRtRnQKWlQ1UVlYTnpkMjl5WkR3dlRtOWta
-VTVoYldVK0NpQWdJQ0FnSUNBZ0lDQWdJRHhXWVd4MVpUNWpSMFo2WXpOa2RtTnRVVDA4TDFaaApi
-SFZsUGdvZ0lDQWdJQ0FnSUNBZ1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ1BFNXZaR1UrQ2lBZ0lD
-QWdJQ0FnSUNBZ0lEeE9iMlJsClRtRnRaVDVGUVZCTlpYUm9iMlE4TDA1dlpHVk9ZVzFsUGdvZ0lD
-QWdJQ0FnSUNBZ0lDQThUbTlrWlQ0S0lDQWdJQ0FnSUNBZ0lDQWcKSUNBOFRtOWtaVTVoYldVK1JV
-RlFWSGx3WlR3dlRtOWtaVTVoYldVK0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQakl4UEM5
-VwpZV3gxWlQ0S0lDQWdJQ0FnSUNBZ0lDQWdQQzlPYjJSbFBnb2dJQ0FnSUNBZ0lDQWdJQ0E4VG05
-a1pUNEtJQ0FnSUNBZ0lDQWdJQ0FnCklDQThUbTlrWlU1aGJXVStTVzV1WlhKTlpYUm9iMlE4TDA1
-dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUNBZ0lDQWdJRHhXWVd4MVpUNU4KVXkxRFNFRlFMVll5UEM5
-V1lXeDFaVDRLSUNBZ0lDQWdJQ0FnSUNBZ1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ1BDOU9iMlJs
-UGdvZwpJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnSUNBOFRtOWtaVDRLSUNBZ0lDQWdJQ0Fn
-SUR4T2IyUmxUbUZ0WlQ1RWFXZHBkR0ZzClEyVnlkR2xtYVdOaGRHVThMMDV2WkdWT1lXMWxQZ29n
-SUNBZ0lDQWdJQ0FnUEU1dlpHVStDaUFnSUNBZ0lDQWdJQ0FnSUR4T2IyUmwKVG1GdFpUNURaWEow
-YVdacFkyRjBaVlI1Y0dVOEwwNXZaR1ZPWVcxbFBnb2dJQ0FnSUNBZ0lDQWdJQ0E4Vm1Gc2RXVStl
-RFV3T1hZegpQQzlXWVd4MVpUNEtJQ0FnSUNBZ0lDQWdJRHd2VG05a1pUNEtJQ0FnSUNBZ0lDQWdJ
-RHhPYjJSbFBnb2dJQ0FnSUNBZ0lDQWdJQ0E4ClRtOWtaVTVoYldVK1EyVnlkRk5JUVRJMU5rWnBi
-bWRsY25CeWFXNTBQQzlPYjJSbFRtRnRaVDRLSUNBZ0lDQWdJQ0FnSUNBZ1BGWmgKYkhWbFBqRm1N
-V1l4WmpGbU1XWXhaakZtTVdZeFpqRm1NV1l4WmpGbU1XWXhaakZtTVdZeFpqRm1NV1l4WmpGbU1X
-WXhaakZtTVdZeApaakZtTVdZeFpqRm1NV1k4TDFaaGJIVmxQZ29nSUNBZ0lDQWdJQ0FnUEM5T2Iy
-UmxQZ29nSUNBZ0lDQWdJRHd2VG05a1pUNEtJQ0FnCklDQWdJQ0E4VG05a1pUNEtJQ0FnSUNBZ0lD
-QWdJRHhPYjJSbFRtRnRaVDVUU1UwOEwwNXZaR1ZPWVcxbFBnb2dJQ0FnSUNBZ0lDQWcKUEU1dlpH
-VStDaUFnSUNBZ0lDQWdJQ0FnSUR4T2IyUmxUbUZ0WlQ1SlRWTkpQQzlPYjJSbFRtRnRaVDRLSUNB
-Z0lDQWdJQ0FnSUNBZwpQRlpoYkhWbFBqRXlNelExTmlvOEwxWmhiSFZsUGdvZ0lDQWdJQ0FnSUNB
-Z1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ1BFNXZaR1UrCkNpQWdJQ0FnSUNBZ0lDQWdJRHhPYjJS
-bFRtRnRaVDVGUVZCVWVYQmxQQzlPYjJSbFRtRnRaVDRLSUNBZ0lDQWdJQ0FnSUNBZ1BGWmgKYkhW
-bFBqSXpQQzlXWVd4MVpUNEtJQ0FnSUNBZ0lDQWdJRHd2VG05a1pUNEtJQ0FnSUNBZ0lDQThMMDV2
-WkdVK0NpQWdJQ0FnSUR3dgpUbTlrWlQ0S0lDQWdJRHd2VG05a1pUNEtJQ0E4TDA1dlpHVStDand2
-VFdkdGRGUnlaV1UrCgotLXtib3VuZGFyeX0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXg1
-MDktY2EtY2VydApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKCkxTMHRMUzFDUlVk
-SlRpQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENrMUpTVVJMUkVORFFXaERaMEYzU1VKQlowbEtRVWxN
-YkVaa2QzcE0KVm5WeVRVRXdSME5UY1VkVFNXSXpSRkZGUWtOM1ZVRk5Ra2w0UlVSQlQwSm5UbFlL
-UWtGTlZFSXdWa0pWUTBKRVVWUkZkMGhvWTA1TgpWRmwzVFZSRmVVMVVSVEZOUkVVeFYyaGpUazFx
-V1hkTlZFRTFUVlJGTVUxRVJURlhha0ZUVFZKQmR3cEVaMWxFVmxGUlJFVjNaRVpSClZrRm5VVEJG
-ZUUxSlNVSkpha0ZPUW1kcmNXaHJhVWM1ZHpCQ1FWRkZSa0ZCVDBOQlVUaEJUVWxKUWtOblMwTkJV
-VVZCQ25wdVFWQlYKZWpJMlRYTmhaVFIzY3pRelkzcFNOREV2U2pKUmRISlRTVnBWUzIxV1ZYTldk
-VzFFWWxsSWNsQk9kbFJZUzFOTldFRmpaWGRQVWtSUgpXVmdLVW5GMlNIWndiamhEYzJOQ01TdHZS
-MWhhZGtoM2VHbzBlbFl3VjB0dlN6SjZaVmhyWVhVemRtTjViRE5JU1V0MWNFcG1jVEpVClJVRkRa
-V1pXYW1vd2RBcEtWeXRZTXpWUVIxZHdPUzlJTlhwSlZVNVdUbFpxVXpkVmJYTTRORWwyUzJoU1Fq
-ZzFNVEpRUWpsVmVVaGgKWjFoWlZsZzFSMWR3UVdOV2NIbG1jbXhTQ2taSk9WRmthR2dyVUdKck1I
-VjVhM1JrWW1ZdlEyUm1aMGhQYjJWaWNsUjBkMUpzYWswdwpiMFIwV0NzeVEzWTJhakIzUWtzM2FF
-UTRjRkIyWmpFcmRYa0tSM3BqZW1sblFWVXZORXQzTjJWYWNYbGtaamxDS3pWU2RYQlNLMGxhCmFY
-QllOREY0UldsSmNrdFNkM0ZwTlRFM1YxZDZXR05xWVVjeVkwNWlaalExTVFwNGNFZzFVRzVXTTJr
-eGRIRXdOR3BOUjFGVmVrWjMKU1VSQlVVRkNielJIUVUxSU5IZElVVmxFVmxJd1QwSkNXVVZHU1hk
-WU5IWnpPRUpwUW1OVFkyOWtDalZ1YjFwSVVrMDRSVFFyYVUxRgpTVWRCTVZWa1NYZFJOMDFFYlVG
-R1NYZFlOSFp6T0VKcFFtTlRZMjlrTlc1dldraFNUVGhGTkN0cGIxSmhhMFpFUVZNS1RWSkJkMFJu
-CldVUldVVkZFUlhka1JsRldRV2RSTUVWNFoyZHJRV2QxVlZZelJFMTBWelp6ZDBSQldVUldVakJV
-UWtGVmQwRjNSVUl2ZWtGTVFtZE8KVmdwSVVUaEZRa0ZOUTBGUldYZEVVVmxLUzI5YVNXaDJZMDVC
-VVVWTVFsRkJSR2RuUlVKQlJtWlJjVTlVUVRkU2RqZExLMngxVVRkdwpibUZ6TkVKWmQwaEZDamxI
-UlZBdmRXOW9kalpMVDNrd1ZFZFJSbUp5VWxScVJtOU1WazVDT1VKYU1YbHRUVVJhTUM5VVNYZEpW
-V00zCmQyazNZVGgwTlcxRmNWbElNVFV6ZDFjS1lWZHZiMmxUYW5sTVRHaDFTVFJ6VG5KT1EwOTBh
-WE5rUW5FeWNqSk5SbGgwTm1nd2JVRlIKV1U5UWRqaFNPRXMzTDJablUzaEhSbkY2YUhsT2JXMVdU
-QW94Y1VKS2JHUjRNelJUY0hkelZFRk1VVlpRWWpSb1IzZEtlbHBtY2pGUQpZM0JGVVhnMmVFMXVW
-R3c0ZUVWWFdrVXpUWE01T1hWaFZYaGlVWEZKZDFKMUNreG5RVTlyVGtOdFdUSnRPRGxXYUhwaFNF
-b3hkVlk0Ck5VRmtUUzkwUkN0WmMyMXNibTVxZERsTVVrTmxhbUpDYVhCcVNVZHFUMWh5WnpGS1VD
-dHNlRllLYlhWTk5IWklLMUF2Yld4dGVITlEKVUhvd1pEWTFZaXRGUjIxS1duQnZUR3RQTDNSa1Rr
-NTJRMWw2YWtwd1ZFVlhjRVZ6VHpaT1RXaExXVzg5Q2kwdExTMHRSVTVFSUVORgpVbFJKUmtsRFFW
-UkZMUzB0TFMwSwotLXtib3VuZGFyeX0tLQo=
\ No newline at end of file
diff --git a/wifi/tests/assets/hsr1/HSR1ProfileWithMissingBoundary.base64 b/wifi/tests/assets/hsr1/HSR1ProfileWithMissingBoundary.base64
deleted file mode 100644
index 7023453..0000000
--- a/wifi/tests/assets/hsr1/HSR1ProfileWithMissingBoundary.base64
+++ /dev/null
@@ -1,86 +0,0 @@
-TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5
-PXtib3VuZGFyeX07IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFz
-ZTY0CgotLXtib3VuZGFyeX0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXBhc3Nwb2ludC1w
-cm9maWxlOyBjaGFyc2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAoK
-UEUxbmJYUlVjbVZsSUhodGJHNXpQU0p6ZVc1amJXdzZaRzFrWkdZeExqSWlQZ29nSUR4V1pYSkVW
-RVErTVM0eVBDOVdaWEpFVkVRKwpDaUFnUEU1dlpHVStDaUFnSUNBOFRtOWtaVTVoYldVK1VHVnlV
-SEp2ZG1sa1pYSlRkV0p6WTNKcGNIUnBiMjQ4TDA1dlpHVk9ZVzFsClBnb2dJQ0FnUEZKVVVISnZj
-R1Z5ZEdsbGN6NEtJQ0FnSUNBZ1BGUjVjR1UrQ2lBZ0lDQWdJQ0FnUEVSRVJrNWhiV1UrZFhKdU9u
-ZG0KWVRwdGJ6cG9iM1J6Y0c5ME1tUnZkREF0Y0dWeWNISnZkbWxrWlhKemRXSnpZM0pwY0hScGIy
-NDZNUzR3UEM5RVJFWk9ZVzFsUGdvZwpJQ0FnSUNBOEwxUjVjR1UrQ2lBZ0lDQThMMUpVVUhKdmNH
-VnlkR2xsY3o0S0lDQWdJRHhPYjJSbFBnb2dJQ0FnSUNBOFRtOWtaVTVoCmJXVSthVEF3TVR3dlRt
-OWtaVTVoYldVK0NpQWdJQ0FnSUR4T2IyUmxQZ29nSUNBZ0lDQWdJRHhPYjJSbFRtRnRaVDVJYjIx
-bFUxQTgKTDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUR4T2IyUmxQZ29nSUNBZ0lDQWdJQ0FnUEU1
-dlpHVk9ZVzFsUGtaeWFXVnVaR3g1VG1GdApaVHd2VG05a1pVNWhiV1UrQ2lBZ0lDQWdJQ0FnSUNB
-OFZtRnNkV1UrUlhoaGJYQnNaU0JPWlhSM2IzSnJQQzlXWVd4MVpUNEtJQ0FnCklDQWdJQ0E4TDA1
-dlpHVStDaUFnSUNBZ0lDQWdQRTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQThUbTlrWlU1aGJXVStSbEZF
-VGp3dlRtOWsKWlU1aGJXVStDaUFnSUNBZ0lDQWdJQ0E4Vm1Gc2RXVSthRzkwYzNCdmRDNWxlR0Z0
-Y0d4bExtNWxkRHd2Vm1Gc2RXVStDaUFnSUNBZwpJQ0FnUEM5T2IyUmxQZ29nSUNBZ0lDQWdJRHhP
-YjJSbFBnb2dJQ0FnSUNBZ0lDQWdQRTV2WkdWT1lXMWxQbEp2WVcxcGJtZERiMjV6CmIzSjBhWFZ0
-VDBrOEwwNXZaR1ZPWVcxbFBnb2dJQ0FnSUNBZ0lDQWdQRlpoYkhWbFBqRXhNakl6TXl3ME5EVTFO
-alk4TDFaaGJIVmwKUGdvZ0lDQWdJQ0FnSUR3dlRtOWtaVDRLSUNBZ0lDQWdQQzlPYjJSbFBnb2dJ
-Q0FnSUNBOFRtOWtaVDRLSUNBZ0lDQWdJQ0E4VG05awpaVTVoYldVK1EzSmxaR1Z1ZEdsaGJEd3ZU
-bTlrWlU1aGJXVStDaUFnSUNBZ0lDQWdQRTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQThUbTlrClpVNWhi
-V1UrVW1WaGJHMDhMMDV2WkdWT1lXMWxQZ29nSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQbVY0WVcxd2JH
-VXVZMjl0UEM5V1lXeDEKWlQ0S0lDQWdJQ0FnSUNBOEwwNXZaR1UrQ2lBZ0lDQWdJQ0FnUEU1dlpH
-VStDaUFnSUNBZ0lDQWdJQ0E4VG05a1pVNWhiV1UrVlhObApjbTVoYldWUVlYTnpkMjl5WkR3dlRt
-OWtaVTVoYldVK0NpQWdJQ0FnSUNBZ0lDQThUbTlrWlQ0S0lDQWdJQ0FnSUNBZ0lDQWdQRTV2ClpH
-Vk9ZVzFsUGxWelpYSnVZVzFsUEM5T2IyUmxUbUZ0WlQ0S0lDQWdJQ0FnSUNBZ0lDQWdQRlpoYkhW
-bFBuVnpaWEk4TDFaaGJIVmwKUGdvZ0lDQWdJQ0FnSUNBZ1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUNB
-Z1BFNXZaR1UrQ2lBZ0lDQWdJQ0FnSUNBZ0lEeE9iMlJsVG1GdApaVDVRWVhOemQyOXlaRHd2VG05
-a1pVNWhiV1UrQ2lBZ0lDQWdJQ0FnSUNBZ0lEeFdZV3gxWlQ1alIwWjZZek5rZG1OdFVUMDhMMVpo
-CmJIVmxQZ29nSUNBZ0lDQWdJQ0FnUEM5T2IyUmxQZ29nSUNBZ0lDQWdJQ0FnUEU1dlpHVStDaUFn
-SUNBZ0lDQWdJQ0FnSUR4T2IyUmwKVG1GdFpUNUZRVkJOWlhSb2IyUThMMDV2WkdWT1lXMWxQZ29n
-SUNBZ0lDQWdJQ0FnSUNBOFRtOWtaVDRLSUNBZ0lDQWdJQ0FnSUNBZwpJQ0E4VG05a1pVNWhiV1Ur
-UlVGUVZIbHdaVHd2VG05a1pVNWhiV1UrQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdQRlpoYkhWbFBqSXhQ
-QzlXCllXeDFaVDRLSUNBZ0lDQWdJQ0FnSUNBZ1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ0lDQThU
-bTlrWlQ0S0lDQWdJQ0FnSUNBZ0lDQWcKSUNBOFRtOWtaVTVoYldVK1NXNXVaWEpOWlhSb2IyUThM
-MDV2WkdWT1lXMWxQZ29nSUNBZ0lDQWdJQ0FnSUNBZ0lEeFdZV3gxWlQ1TgpVeTFEU0VGUUxWWXlQ
-QzlXWVd4MVpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEM5T2IyUmxQZ29nSUNBZ0lDQWdJQ0FnUEM5T2Iy
-UmxQZ29nCklDQWdJQ0FnSUR3dlRtOWtaVDRLSUNBZ0lDQWdJQ0E4VG05a1pUNEtJQ0FnSUNBZ0lD
-QWdJRHhPYjJSbFRtRnRaVDVFYVdkcGRHRnMKUTJWeWRHbG1hV05oZEdVOEwwNXZaR1ZPWVcxbFBn
-b2dJQ0FnSUNBZ0lDQWdQRTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQWdJRHhPYjJSbApUbUZ0WlQ1RFpY
-SjBhV1pwWTJGMFpWUjVjR1U4TDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUNBZ0lDQThWbUZzZFdV
-K2VEVXdPWFl6ClBDOVdZV3gxWlQ0S0lDQWdJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnSUNB
-Z0lEeE9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ0lDQTgKVG05a1pVNWhiV1UrUTJWeWRGTklRVEkxTmta
-cGJtZGxjbkJ5YVc1MFBDOU9iMlJsVG1GdFpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEZaaApiSFZsUGpG
-bU1XWXhaakZtTVdZeFpqRm1NV1l4WmpGbU1XWXhaakZtTVdZeFpqRm1NV1l4WmpGbU1XWXhaakZt
-TVdZeFpqRm1NV1l4ClpqRm1NV1l4WmpGbU1XWThMMVpoYkhWbFBnb2dJQ0FnSUNBZ0lDQWdQQzlP
-YjJSbFBnb2dJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWcKSUNBZ0lDQThUbTlrWlQ0S0lDQWdJQ0Fn
-SUNBZ0lEeE9iMlJsVG1GdFpUNVRTVTA4TDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUNBZwpQRTV2
-WkdVK0NpQWdJQ0FnSUNBZ0lDQWdJRHhPYjJSbFRtRnRaVDVKVFZOSlBDOU9iMlJsVG1GdFpUNEtJ
-Q0FnSUNBZ0lDQWdJQ0FnClBGWmhiSFZsUGpFeU16UTFOaW84TDFaaGJIVmxQZ29nSUNBZ0lDQWdJ
-Q0FnUEM5T2IyUmxQZ29nSUNBZ0lDQWdJQ0FnUEU1dlpHVSsKQ2lBZ0lDQWdJQ0FnSUNBZ0lEeE9i
-MlJsVG1GdFpUNUZRVkJVZVhCbFBDOU9iMlJsVG1GdFpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEZaaApi
-SFZsUGpJelBDOVdZV3gxWlQ0S0lDQWdJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnSUNBOEww
-NXZaR1UrQ2lBZ0lDQWdJRHd2ClRtOWtaVDRLSUNBZ0lEd3ZUbTlrWlQ0S0lDQThMMDV2WkdVK0Nq
-d3ZUV2R0ZEZSeVpXVSsKCi0te2JvdW5kYXJ5fQpDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gt
-eDUwOS1jYS1jZXJ0CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAoKTFMwdExTMUNS
-VWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVUkxSRU5EUVdoRFowRjNTVUpCWjBsS1FV
-bE1iRVprZDNwTQpWblZ5VFVFd1IwTlRjVWRUU1dJelJGRkZRa04zVlVGTlFrbDRSVVJCVDBKblRs
-WUtRa0ZOVkVJd1ZrSlZRMEpFVVZSRmQwaG9ZMDVOClZGbDNUVlJGZVUxVVJURk5SRVV4VjJoalRr
-MXFXWGROVkVFMVRWUkZNVTFFUlRGWGFrRlRUVkpCZHdwRVoxbEVWbEZSUkVWM1pFWlIKVmtGblVU
-QkZlRTFKU1VKSmFrRk9RbWRyY1docmFVYzVkekJDUVZGRlJrRkJUME5CVVRoQlRVbEpRa05uUzBO
-QlVVVkJDbnB1UVZCVgplakkyVFhOaFpUUjNjelF6WTNwU05ERXZTakpSZEhKVFNWcFZTMjFXVlhO
-V2RXMUVZbGxJY2xCT2RsUllTMU5OV0VGalpYZFBVa1JSCldWZ0tVbkYyU0had2JqaERjMk5DTVN0
-dlIxaGFka2gzZUdvMGVsWXdWMHR2U3pKNlpWaHJZWFV6ZG1ONWJETklTVXQxY0VwbWNUSlUKUlVG
-RFpXWldhbW93ZEFwS1Z5dFlNelZRUjFkd09TOUlOWHBKVlU1V1RsWnFVemRWYlhNNE5FbDJTMmhT
-UWpnMU1USlFRamxWZVVoaApaMWhaVmxnMVIxZHdRV05XY0hsbWNteFNDa1pKT1ZGa2FHZ3JVR0py
-TUhWNWEzUmtZbVl2UTJSbVowaFBiMlZpY2xSMGQxSnNhazB3CmIwUjBXQ3N5UTNZMmFqQjNRa3Mz
-YUVRNGNGQjJaakVyZFhrS1IzcGplbWxuUVZVdk5FdDNOMlZhY1hsa1pqbENLelZTZFhCU0swbGEK
-YVhCWU5ERjRSV2xKY2t0U2QzRnBOVEUzVjFkNldHTnFZVWN5WTA1aVpqUTFNUXA0Y0VnMVVHNVdN
-Mmt4ZEhFd05HcE5SMUZWZWtaMwpTVVJCVVVGQ2J6UkhRVTFJTkhkSVVWbEVWbEl3VDBKQ1dVVkdT
-WGRZTkhaek9FSnBRbU5UWTI5a0NqVnViMXBJVWswNFJUUXJhVTFGClNVZEJNVlZrU1hkUk4wMUVi
-VUZHU1hkWU5IWnpPRUpwUW1OVFkyOWtOVzV2V2toU1RUaEZOQ3RwYjFKaGEwWkVRVk1LVFZKQmQw
-Um4KV1VSV1VWRkVSWGRrUmxGV1FXZFJNRVY0WjJkclFXZDFWVll6UkUxMFZ6WnpkMFJCV1VSV1Vq
-QlVRa0ZWZDBGM1JVSXZla0ZNUW1kTwpWZ3BJVVRoRlFrRk5RMEZSV1hkRVVWbEtTMjlhU1doMlkw
-NUJVVVZNUWxGQlJHZG5SVUpCUm1aUmNVOVVRVGRTZGpkTEsyeDFVVGR3CmJtRnpORUpaZDBoRkNq
-bEhSVkF2ZFc5b2RqWkxUM2t3VkVkUlJtSnlVbFJxUm05TVZrNUNPVUphTVhsdFRVUmFNQzlVU1hk
-SlZXTTMKZDJrM1lUaDBOVzFGY1ZsSU1UVXpkMWNLWVZkdmIybFRhbmxNVEdoMVNUUnpUbkpPUTA5
-MGFYTmtRbkV5Y2pKTlJsaDBObWd3YlVGUgpXVTlRZGpoU09FczNMMlpuVTNoSFJuRjZhSGxPYlcx
-V1RBb3hjVUpLYkdSNE16UlRjSGR6VkVGTVVWWlFZalJvUjNkS2VscG1jakZRClkzQkZVWGcyZUUx
-dVZHdzRlRVZYV2tVelRYTTVPWFZoVlhoaVVYRkpkMUoxQ2t4blFVOXJUa050V1RKdE9EbFdhSHBo
-U0VveGRWWTQKTlVGa1RTOTBSQ3RaYzIxc2JtNXFkRGxNVWtObGFtSkNhWEJxU1VkcVQxaHlaekZL
-VUN0c2VGWUtiWFZOTkhaSUsxQXZiV3h0ZUhOUQpVSG93WkRZMVlpdEZSMjFLV25CdlRHdFBMM1Jr
-VGs1MlExbDZha3B3VkVWWGNFVnpUelpPVFdoTFdXODlDaTB0TFMwdFJVNUVJRU5GClVsUkpSa2xE
-UVZSRkxTMHRMUzBLCg==
\ No newline at end of file
diff --git a/wifi/tests/assets/hsr1/HSR1ProfileWithNonBase64Part.base64 b/wifi/tests/assets/hsr1/HSR1ProfileWithNonBase64Part.base64
deleted file mode 100644
index 5c23f61..0000000
--- a/wifi/tests/assets/hsr1/HSR1ProfileWithNonBase64Part.base64
+++ /dev/null
@@ -1,86 +0,0 @@
-TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5
-PXtib3VuZGFyeX07IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJp
-dAoKLS17Ym91bmRhcnl9CkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1wYXNzcG9pbnQtcHJv
-ZmlsZTsgY2hhcnNldD1VVEYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKClBF
-MW5iWFJVY21WbElIaHRiRzV6UFNKemVXNWpiV3c2Wkcxa1pHWXhMaklpUGdvZ0lEeFdaWEpFVkVR
-K01TNHlQQzlXWlhKRVZFUSsKQ2lBZ1BFNXZaR1UrQ2lBZ0lDQThUbTlrWlU1aGJXVStVR1Z5VUhK
-dmRtbGtaWEpUZFdKelkzSnBjSFJwYjI0OEwwNXZaR1ZPWVcxbApQZ29nSUNBZ1BGSlVVSEp2Y0dW
-eWRHbGxjejRLSUNBZ0lDQWdQRlI1Y0dVK0NpQWdJQ0FnSUNBZ1BFUkVSazVoYldVK2RYSnVPbmRt
-CllUcHRienBvYjNSemNHOTBNbVJ2ZERBdGNHVnljSEp2ZG1sa1pYSnpkV0p6WTNKcGNIUnBiMjQ2
-TVM0d1BDOUVSRVpPWVcxbFBnb2cKSUNBZ0lDQThMMVI1Y0dVK0NpQWdJQ0E4TDFKVVVISnZjR1Z5
-ZEdsbGN6NEtJQ0FnSUR4T2IyUmxQZ29nSUNBZ0lDQThUbTlrWlU1aApiV1UrYVRBd01Ud3ZUbTlr
-WlU1aGJXVStDaUFnSUNBZ0lEeE9iMlJsUGdvZ0lDQWdJQ0FnSUR4T2IyUmxUbUZ0WlQ1SWIyMWxV
-MUE4CkwwNXZaR1ZPWVcxbFBnb2dJQ0FnSUNBZ0lEeE9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ1BFNXZa
-R1ZPWVcxbFBrWnlhV1Z1Wkd4NVRtRnQKWlR3dlRtOWtaVTVoYldVK0NpQWdJQ0FnSUNBZ0lDQThW
-bUZzZFdVK1JYaGhiWEJzWlNCT1pYUjNiM0pyUEM5V1lXeDFaVDRLSUNBZwpJQ0FnSUNBOEwwNXZa
-R1UrQ2lBZ0lDQWdJQ0FnUEU1dlpHVStDaUFnSUNBZ0lDQWdJQ0E4VG05a1pVNWhiV1UrUmxGRVRq
-d3ZUbTlrClpVNWhiV1UrQ2lBZ0lDQWdJQ0FnSUNBOFZtRnNkV1UrYUc5MGMzQnZkQzVsZUdGdGNH
-eGxMbTVsZER3dlZtRnNkV1UrQ2lBZ0lDQWcKSUNBZ1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUR4T2Iy
-UmxQZ29nSUNBZ0lDQWdJQ0FnUEU1dlpHVk9ZVzFsUGxKdllXMXBibWREYjI1egpiM0owYVhWdFQw
-azhMMDV2WkdWT1lXMWxQZ29nSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQakV4TWpJek15dzBORFUxTmpZ
-OEwxWmhiSFZsClBnb2dJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnUEM5T2IyUmxQZ29nSUNB
-Z0lDQThUbTlrWlQ0S0lDQWdJQ0FnSUNBOFRtOWsKWlU1aGJXVStRM0psWkdWdWRHbGhiRHd2VG05
-a1pVNWhiV1UrQ2lBZ0lDQWdJQ0FnUEU1dlpHVStDaUFnSUNBZ0lDQWdJQ0E4VG05awpaVTVoYldV
-K1VtVmhiRzA4TDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUNBZ1BGWmhiSFZsUG1WNFlXMXdiR1V1
-WTI5dFBDOVdZV3gxClpUNEtJQ0FnSUNBZ0lDQThMMDV2WkdVK0NpQWdJQ0FnSUNBZ1BFNXZaR1Ur
-Q2lBZ0lDQWdJQ0FnSUNBOFRtOWtaVTVoYldVK1ZYTmwKY201aGJXVlFZWE56ZDI5eVpEd3ZUbTlr
-WlU1aGJXVStDaUFnSUNBZ0lDQWdJQ0E4VG05a1pUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEU1dgpaR1ZP
-WVcxbFBsVnpaWEp1WVcxbFBDOU9iMlJsVG1GdFpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQ
-blZ6WlhJOEwxWmhiSFZsClBnb2dJQ0FnSUNBZ0lDQWdQQzlPYjJSbFBnb2dJQ0FnSUNBZ0lDQWdQ
-RTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQWdJRHhPYjJSbFRtRnQKWlQ1UVlYTnpkMjl5WkR3dlRtOWta
-VTVoYldVK0NpQWdJQ0FnSUNBZ0lDQWdJRHhXWVd4MVpUNWpSMFo2WXpOa2RtTnRVVDA4TDFaaApi
-SFZsUGdvZ0lDQWdJQ0FnSUNBZ1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ1BFNXZaR1UrQ2lBZ0lD
-QWdJQ0FnSUNBZ0lEeE9iMlJsClRtRnRaVDVGUVZCTlpYUm9iMlE4TDA1dlpHVk9ZVzFsUGdvZ0lD
-QWdJQ0FnSUNBZ0lDQThUbTlrWlQ0S0lDQWdJQ0FnSUNBZ0lDQWcKSUNBOFRtOWtaVTVoYldVK1JV
-RlFWSGx3WlR3dlRtOWtaVTVoYldVK0NpQWdJQ0FnSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQakl4UEM5
-VwpZV3gxWlQ0S0lDQWdJQ0FnSUNBZ0lDQWdQQzlPYjJSbFBnb2dJQ0FnSUNBZ0lDQWdJQ0E4VG05
-a1pUNEtJQ0FnSUNBZ0lDQWdJQ0FnCklDQThUbTlrWlU1aGJXVStTVzV1WlhKTlpYUm9iMlE4TDA1
-dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUNBZ0lDQWdJRHhXWVd4MVpUNU4KVXkxRFNFRlFMVll5UEM5
-V1lXeDFaVDRLSUNBZ0lDQWdJQ0FnSUNBZ1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ1BDOU9iMlJs
-UGdvZwpJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnSUNBOFRtOWtaVDRLSUNBZ0lDQWdJQ0Fn
-SUR4T2IyUmxUbUZ0WlQ1RWFXZHBkR0ZzClEyVnlkR2xtYVdOaGRHVThMMDV2WkdWT1lXMWxQZ29n
-SUNBZ0lDQWdJQ0FnUEU1dlpHVStDaUFnSUNBZ0lDQWdJQ0FnSUR4T2IyUmwKVG1GdFpUNURaWEow
-YVdacFkyRjBaVlI1Y0dVOEwwNXZaR1ZPWVcxbFBnb2dJQ0FnSUNBZ0lDQWdJQ0E4Vm1Gc2RXVStl
-RFV3T1hZegpQQzlXWVd4MVpUNEtJQ0FnSUNBZ0lDQWdJRHd2VG05a1pUNEtJQ0FnSUNBZ0lDQWdJ
-RHhPYjJSbFBnb2dJQ0FnSUNBZ0lDQWdJQ0E4ClRtOWtaVTVoYldVK1EyVnlkRk5JUVRJMU5rWnBi
-bWRsY25CeWFXNTBQQzlPYjJSbFRtRnRaVDRLSUNBZ0lDQWdJQ0FnSUNBZ1BGWmgKYkhWbFBqRm1N
-V1l4WmpGbU1XWXhaakZtTVdZeFpqRm1NV1l4WmpGbU1XWXhaakZtTVdZeFpqRm1NV1l4WmpGbU1X
-WXhaakZtTVdZeApaakZtTVdZeFpqRm1NV1k4TDFaaGJIVmxQZ29nSUNBZ0lDQWdJQ0FnUEM5T2Iy
-UmxQZ29nSUNBZ0lDQWdJRHd2VG05a1pUNEtJQ0FnCklDQWdJQ0E4VG05a1pUNEtJQ0FnSUNBZ0lD
-QWdJRHhPYjJSbFRtRnRaVDVUU1UwOEwwNXZaR1ZPWVcxbFBnb2dJQ0FnSUNBZ0lDQWcKUEU1dlpH
-VStDaUFnSUNBZ0lDQWdJQ0FnSUR4T2IyUmxUbUZ0WlQ1SlRWTkpQQzlPYjJSbFRtRnRaVDRLSUNB
-Z0lDQWdJQ0FnSUNBZwpQRlpoYkhWbFBqRXlNelExTmlvOEwxWmhiSFZsUGdvZ0lDQWdJQ0FnSUNB
-Z1BDOU9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ1BFNXZaR1UrCkNpQWdJQ0FnSUNBZ0lDQWdJRHhPYjJS
-bFRtRnRaVDVGUVZCVWVYQmxQQzlPYjJSbFRtRnRaVDRLSUNBZ0lDQWdJQ0FnSUNBZ1BGWmgKYkhW
-bFBqSXpQQzlXWVd4MVpUNEtJQ0FnSUNBZ0lDQWdJRHd2VG05a1pUNEtJQ0FnSUNBZ0lDQThMMDV2
-WkdVK0NpQWdJQ0FnSUR3dgpUbTlrWlQ0S0lDQWdJRHd2VG05a1pUNEtJQ0E4TDA1dlpHVStDand2
-VFdkdGRGUnlaV1UrCgotLXtib3VuZGFyeX0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXg1
-MDktY2EtY2VydApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKCkxTMHRMUzFDUlVk
-SlRpQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENrMUpTVVJMUkVORFFXaERaMEYzU1VKQlowbEtRVWxN
-YkVaa2QzcE0KVm5WeVRVRXdSME5UY1VkVFNXSXpSRkZGUWtOM1ZVRk5Ra2w0UlVSQlQwSm5UbFlL
-UWtGTlZFSXdWa0pWUTBKRVVWUkZkMGhvWTA1TgpWRmwzVFZSRmVVMVVSVEZOUkVVeFYyaGpUazFx
-V1hkTlZFRTFUVlJGTVUxRVJURlhha0ZUVFZKQmR3cEVaMWxFVmxGUlJFVjNaRVpSClZrRm5VVEJG
-ZUUxSlNVSkpha0ZPUW1kcmNXaHJhVWM1ZHpCQ1FWRkZSa0ZCVDBOQlVUaEJUVWxKUWtOblMwTkJV
-VVZCQ25wdVFWQlYKZWpJMlRYTmhaVFIzY3pRelkzcFNOREV2U2pKUmRISlRTVnBWUzIxV1ZYTldk
-VzFFWWxsSWNsQk9kbFJZUzFOTldFRmpaWGRQVWtSUgpXVmdLVW5GMlNIWndiamhEYzJOQ01TdHZS
-MWhhZGtoM2VHbzBlbFl3VjB0dlN6SjZaVmhyWVhVemRtTjViRE5JU1V0MWNFcG1jVEpVClJVRkRa
-V1pXYW1vd2RBcEtWeXRZTXpWUVIxZHdPUzlJTlhwSlZVNVdUbFpxVXpkVmJYTTRORWwyUzJoU1Fq
-ZzFNVEpRUWpsVmVVaGgKWjFoWlZsZzFSMWR3UVdOV2NIbG1jbXhTQ2taSk9WRmthR2dyVUdKck1I
-VjVhM1JrWW1ZdlEyUm1aMGhQYjJWaWNsUjBkMUpzYWswdwpiMFIwV0NzeVEzWTJhakIzUWtzM2FF
-UTRjRkIyWmpFcmRYa0tSM3BqZW1sblFWVXZORXQzTjJWYWNYbGtaamxDS3pWU2RYQlNLMGxhCmFY
-QllOREY0UldsSmNrdFNkM0ZwTlRFM1YxZDZXR05xWVVjeVkwNWlaalExTVFwNGNFZzFVRzVXTTJr
-eGRIRXdOR3BOUjFGVmVrWjMKU1VSQlVVRkNielJIUVUxSU5IZElVVmxFVmxJd1QwSkNXVVZHU1hk
-WU5IWnpPRUpwUW1OVFkyOWtDalZ1YjFwSVVrMDRSVFFyYVUxRgpTVWRCTVZWa1NYZFJOMDFFYlVG
-R1NYZFlOSFp6T0VKcFFtTlRZMjlrTlc1dldraFNUVGhGTkN0cGIxSmhhMFpFUVZNS1RWSkJkMFJu
-CldVUldVVkZFUlhka1JsRldRV2RSTUVWNFoyZHJRV2QxVlZZelJFMTBWelp6ZDBSQldVUldVakJV
-UWtGVmQwRjNSVUl2ZWtGTVFtZE8KVmdwSVVUaEZRa0ZOUTBGUldYZEVVVmxLUzI5YVNXaDJZMDVC
-VVVWTVFsRkJSR2RuUlVKQlJtWlJjVTlVUVRkU2RqZExLMngxVVRkdwpibUZ6TkVKWmQwaEZDamxI
-UlZBdmRXOW9kalpMVDNrd1ZFZFJSbUp5VWxScVJtOU1WazVDT1VKYU1YbHRUVVJhTUM5VVNYZEpW
-V00zCmQyazNZVGgwTlcxRmNWbElNVFV6ZDFjS1lWZHZiMmxUYW5sTVRHaDFTVFJ6VG5KT1EwOTBh
-WE5rUW5FeWNqSk5SbGgwTm1nd2JVRlIKV1U5UWRqaFNPRXMzTDJablUzaEhSbkY2YUhsT2JXMVdU
-QW94Y1VKS2JHUjRNelJUY0hkelZFRk1VVlpRWWpSb1IzZEtlbHBtY2pGUQpZM0JGVVhnMmVFMXVW
-R3c0ZUVWWFdrVXpUWE01T1hWaFZYaGlVWEZKZDFKMUNreG5RVTlyVGtOdFdUSnRPRGxXYUhwaFNF
-b3hkVlk0Ck5VRmtUUzkwUkN0WmMyMXNibTVxZERsTVVrTmxhbUpDYVhCcVNVZHFUMWh5WnpGS1VD
-dHNlRllLYlhWTk5IWklLMUF2Yld4dGVITlEKVUhvd1pEWTFZaXRGUjIxS1duQnZUR3RQTDNSa1Rr
-NTJRMWw2YWtwd1ZFVlhjRVZ6VHpaT1RXaExXVzg5Q2kwdExTMHRSVTVFSUVORgpVbFJKUmtsRFFW
-UkZMUzB0TFMwSwotLXtib3VuZGFyeX0tLQo=
\ No newline at end of file
diff --git a/wifi/tests/assets/hsr1/HSR1ProfileWithUpdateIdentifier.base64 b/wifi/tests/assets/hsr1/HSR1ProfileWithUpdateIdentifier.base64
deleted file mode 100644
index bab7607..0000000
--- a/wifi/tests/assets/hsr1/HSR1ProfileWithUpdateIdentifier.base64
+++ /dev/null
@@ -1,88 +0,0 @@
-TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5
-PXtib3VuZGFyeX07IGNoYXJzZXQ9VVRGLTgKQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFz
-ZTY0CgotLXtib3VuZGFyeX0KQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXBhc3Nwb2ludC1w
-cm9maWxlOyBjaGFyc2V0PVVURi04CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAoK
-UEUxbmJYUlVjbVZsSUhodGJHNXpQU0p6ZVc1amJXdzZaRzFrWkdZeExqSWlQZ29nSUR4V1pYSkVW
-RVErTVM0eVBDOVdaWEpFVkVRKwpDaUFnUEU1dlpHVStDaUFnSUNBOFRtOWtaVTVoYldVK1VHVnlV
-SEp2ZG1sa1pYSlRkV0p6WTNKcGNIUnBiMjQ4TDA1dlpHVk9ZVzFsClBnb2dJQ0FnUEZKVVVISnZj
-R1Z5ZEdsbGN6NEtJQ0FnSUNBZ1BGUjVjR1UrQ2lBZ0lDQWdJQ0FnUEVSRVJrNWhiV1UrZFhKdU9u
-ZG0KWVRwdGJ6cG9iM1J6Y0c5ME1tUnZkREF0Y0dWeWNISnZkbWxrWlhKemRXSnpZM0pwY0hScGIy
-NDZNUzR3UEM5RVJFWk9ZVzFsUGdvZwpJQ0FnSUNBOEwxUjVjR1UrQ2lBZ0lDQThMMUpVVUhKdmNH
-VnlkR2xsY3o0S0lDQWdJRHhPYjJSbFBnb2dJQ0FnSUNBOFRtOWtaVTVoCmJXVStWWEJrWVhSbFNX
-UmxiblJwWm1sbGNqd3ZUbTlrWlU1aGJXVStDaUFnSUNBZ0lEeFdZV3gxWlQ0eE1qTTBQQzlXWVd4
-MVpUNEsKSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJRHhPYjJSbFBnb2dJQ0FnSUNBOFRtOWtaVTVoYldV
-K2FUQXdNVHd2VG05a1pVNWhiV1UrQ2lBZwpJQ0FnSUR4T2IyUmxQZ29nSUNBZ0lDQWdJRHhPYjJS
-bFRtRnRaVDVJYjIxbFUxQThMMDV2WkdWT1lXMWxQZ29nSUNBZ0lDQWdJRHhPCmIyUmxQZ29nSUNB
-Z0lDQWdJQ0FnUEU1dlpHVk9ZVzFsUGtaeWFXVnVaR3g1VG1GdFpUd3ZUbTlrWlU1aGJXVStDaUFn
-SUNBZ0lDQWcKSUNBOFZtRnNkV1UrUlhoaGJYQnNaU0JPWlhSM2IzSnJQQzlXWVd4MVpUNEtJQ0Fn
-SUNBZ0lDQThMMDV2WkdVK0NpQWdJQ0FnSUNBZwpQRTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQThUbTlr
-WlU1aGJXVStSbEZFVGp3dlRtOWtaVTVoYldVK0NpQWdJQ0FnSUNBZ0lDQThWbUZzCmRXVSthRzkw
-YzNCdmRDNWxlR0Z0Y0d4bExtNWxkRHd2Vm1Gc2RXVStDaUFnSUNBZ0lDQWdQQzlPYjJSbFBnb2dJ
-Q0FnSUNBZ0lEeE8KYjJSbFBnb2dJQ0FnSUNBZ0lDQWdQRTV2WkdWT1lXMWxQbEp2WVcxcGJtZERi
-MjV6YjNKMGFYVnRUMGs4TDA1dlpHVk9ZVzFsUGdvZwpJQ0FnSUNBZ0lDQWdQRlpoYkhWbFBqRXhN
-akl6TXl3ME5EVTFOalk4TDFaaGJIVmxQZ29nSUNBZ0lDQWdJRHd2VG05a1pUNEtJQ0FnCklDQWdQ
-QzlPYjJSbFBnb2dJQ0FnSUNBOFRtOWtaVDRLSUNBZ0lDQWdJQ0E4VG05a1pVNWhiV1UrUTNKbFpH
-VnVkR2xoYkR3dlRtOWsKWlU1aGJXVStDaUFnSUNBZ0lDQWdQRTV2WkdVK0NpQWdJQ0FnSUNBZ0lD
-QThUbTlrWlU1aGJXVStVbVZoYkcwOEwwNXZaR1ZPWVcxbApQZ29nSUNBZ0lDQWdJQ0FnUEZaaGJI
-VmxQbVY0WVcxd2JHVXVZMjl0UEM5V1lXeDFaVDRLSUNBZ0lDQWdJQ0E4TDA1dlpHVStDaUFnCklD
-QWdJQ0FnUEU1dlpHVStDaUFnSUNBZ0lDQWdJQ0E4VG05a1pVNWhiV1UrVlhObGNtNWhiV1ZRWVhO
-emQyOXlaRHd2VG05a1pVNWgKYldVK0NpQWdJQ0FnSUNBZ0lDQThUbTlrWlQ0S0lDQWdJQ0FnSUNB
-Z0lDQWdQRTV2WkdWT1lXMWxQbFZ6WlhKdVlXMWxQQzlPYjJSbApUbUZ0WlQ0S0lDQWdJQ0FnSUNB
-Z0lDQWdQRlpoYkhWbFBuVnpaWEk4TDFaaGJIVmxQZ29nSUNBZ0lDQWdJQ0FnUEM5T2IyUmxQZ29n
-CklDQWdJQ0FnSUNBZ1BFNXZaR1UrQ2lBZ0lDQWdJQ0FnSUNBZ0lEeE9iMlJsVG1GdFpUNVFZWE56
-ZDI5eVpEd3ZUbTlrWlU1aGJXVSsKQ2lBZ0lDQWdJQ0FnSUNBZ0lEeFdZV3gxWlQ1alIwWjZZek5r
-ZG1OdFVUMDhMMVpoYkhWbFBnb2dJQ0FnSUNBZ0lDQWdQQzlPYjJSbApQZ29nSUNBZ0lDQWdJQ0Fn
-UEU1dlpHVStDaUFnSUNBZ0lDQWdJQ0FnSUR4T2IyUmxUbUZ0WlQ1RlFWQk5aWFJvYjJROEwwNXZa
-R1ZPCllXMWxQZ29nSUNBZ0lDQWdJQ0FnSUNBOFRtOWtaVDRLSUNBZ0lDQWdJQ0FnSUNBZ0lDQThU
-bTlrWlU1aGJXVStSVUZRVkhsd1pUd3YKVG05a1pVNWhiV1UrQ2lBZ0lDQWdJQ0FnSUNBZ0lDQWdQ
-RlpoYkhWbFBqSXhQQzlXWVd4MVpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEM5TwpiMlJsUGdvZ0lDQWdJ
-Q0FnSUNBZ0lDQThUbTlrWlQ0S0lDQWdJQ0FnSUNBZ0lDQWdJQ0E4VG05a1pVNWhiV1UrU1c1dVpY
-Sk5aWFJvCmIyUThMMDV2WkdWT1lXMWxQZ29nSUNBZ0lDQWdJQ0FnSUNBZ0lEeFdZV3gxWlQ1TlV5
-MURTRUZRTFZZeVBDOVdZV3gxWlQ0S0lDQWcKSUNBZ0lDQWdJQ0FnUEM5T2IyUmxQZ29nSUNBZ0lD
-QWdJQ0FnUEM5T2IyUmxQZ29nSUNBZ0lDQWdJRHd2VG05a1pUNEtJQ0FnSUNBZwpJQ0E4VG05a1pU
-NEtJQ0FnSUNBZ0lDQWdJRHhPYjJSbFRtRnRaVDVFYVdkcGRHRnNRMlZ5ZEdsbWFXTmhkR1U4TDA1
-dlpHVk9ZVzFsClBnb2dJQ0FnSUNBZ0lDQWdQRTV2WkdVK0NpQWdJQ0FnSUNBZ0lDQWdJRHhPYjJS
-bFRtRnRaVDVEWlhKMGFXWnBZMkYwWlZSNWNHVTgKTDA1dlpHVk9ZVzFsUGdvZ0lDQWdJQ0FnSUNB
-Z0lDQThWbUZzZFdVK2VEVXdPWFl6UEM5V1lXeDFaVDRLSUNBZ0lDQWdJQ0FnSUR3dgpUbTlrWlQ0
-S0lDQWdJQ0FnSUNBZ0lEeE9iMlJsUGdvZ0lDQWdJQ0FnSUNBZ0lDQThUbTlrWlU1aGJXVStRMlZ5
-ZEZOSVFUSTFOa1pwCmJtZGxjbkJ5YVc1MFBDOU9iMlJsVG1GdFpUNEtJQ0FnSUNBZ0lDQWdJQ0Fn
-UEZaaGJIVmxQakZtTVdZeFpqRm1NV1l4WmpGbU1XWXgKWmpGbU1XWXhaakZtTVdZeFpqRm1NV1l4
-WmpGbU1XWXhaakZtTVdZeFpqRm1NV1l4WmpGbU1XWXhaakZtTVdZOEwxWmhiSFZsUGdvZwpJQ0Fn
-SUNBZ0lDQWdQQzlPYjJSbFBnb2dJQ0FnSUNBZ0lEd3ZUbTlrWlQ0S0lDQWdJQ0FnSUNBOFRtOWta
-VDRLSUNBZ0lDQWdJQ0FnCklEeE9iMlJsVG1GdFpUNVRTVTA4TDA1dlpHVk9ZVzFsUGdvZ0lDQWdJ
-Q0FnSUNBZ1BFNXZaR1UrQ2lBZ0lDQWdJQ0FnSUNBZ0lEeE8KYjJSbFRtRnRaVDVKVFZOSlBDOU9i
-MlJsVG1GdFpUNEtJQ0FnSUNBZ0lDQWdJQ0FnUEZaaGJIVmxQakV5TXpRMU5pbzhMMVpoYkhWbApQ
-Z29nSUNBZ0lDQWdJQ0FnUEM5T2IyUmxQZ29nSUNBZ0lDQWdJQ0FnUEU1dlpHVStDaUFnSUNBZ0lD
-QWdJQ0FnSUR4T2IyUmxUbUZ0ClpUNUZRVkJVZVhCbFBDOU9iMlJsVG1GdFpUNEtJQ0FnSUNBZ0lD
-QWdJQ0FnUEZaaGJIVmxQakl6UEM5V1lXeDFaVDRLSUNBZ0lDQWcKSUNBZ0lEd3ZUbTlrWlQ0S0lD
-QWdJQ0FnSUNBOEwwNXZaR1UrQ2lBZ0lDQWdJRHd2VG05a1pUNEtJQ0FnSUR3dlRtOWtaVDRLSUNB
-OApMMDV2WkdVK0Nqd3ZUV2R0ZEZSeVpXVSsKCi0te2JvdW5kYXJ5fQpDb250ZW50LVR5cGU6IGFw
-cGxpY2F0aW9uL3gteDUwOS1jYS1jZXJ0CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2
-NAoKTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVUkxSRU5EUVdoRFow
-RjNTVUpCWjBsS1FVbE1iRVprZDNwTQpWblZ5VFVFd1IwTlRjVWRUU1dJelJGRkZRa04zVlVGTlFr
-bDRSVVJCVDBKblRsWUtRa0ZOVkVJd1ZrSlZRMEpFVVZSRmQwaG9ZMDVOClZGbDNUVlJGZVUxVVJU
-Rk5SRVV4VjJoalRrMXFXWGROVkVFMVRWUkZNVTFFUlRGWGFrRlRUVkpCZHdwRVoxbEVWbEZSUkVW
-M1pFWlIKVmtGblVUQkZlRTFKU1VKSmFrRk9RbWRyY1docmFVYzVkekJDUVZGRlJrRkJUME5CVVRo
-QlRVbEpRa05uUzBOQlVVVkJDbnB1UVZCVgplakkyVFhOaFpUUjNjelF6WTNwU05ERXZTakpSZEhK
-VFNWcFZTMjFXVlhOV2RXMUVZbGxJY2xCT2RsUllTMU5OV0VGalpYZFBVa1JSCldWZ0tVbkYyU0ha
-d2JqaERjMk5DTVN0dlIxaGFka2gzZUdvMGVsWXdWMHR2U3pKNlpWaHJZWFV6ZG1ONWJETklTVXQx
-Y0VwbWNUSlUKUlVGRFpXWldhbW93ZEFwS1Z5dFlNelZRUjFkd09TOUlOWHBKVlU1V1RsWnFVemRW
-YlhNNE5FbDJTMmhTUWpnMU1USlFRamxWZVVoaApaMWhaVmxnMVIxZHdRV05XY0hsbWNteFNDa1pK
-T1ZGa2FHZ3JVR0pyTUhWNWEzUmtZbVl2UTJSbVowaFBiMlZpY2xSMGQxSnNhazB3CmIwUjBXQ3N5
-UTNZMmFqQjNRa3MzYUVRNGNGQjJaakVyZFhrS1IzcGplbWxuUVZVdk5FdDNOMlZhY1hsa1pqbENL
-elZTZFhCU0swbGEKYVhCWU5ERjRSV2xKY2t0U2QzRnBOVEUzVjFkNldHTnFZVWN5WTA1aVpqUTFN
-UXA0Y0VnMVVHNVdNMmt4ZEhFd05HcE5SMUZWZWtaMwpTVVJCVVVGQ2J6UkhRVTFJTkhkSVVWbEVW
-bEl3VDBKQ1dVVkdTWGRZTkhaek9FSnBRbU5UWTI5a0NqVnViMXBJVWswNFJUUXJhVTFGClNVZEJN
-VlZrU1hkUk4wMUViVUZHU1hkWU5IWnpPRUpwUW1OVFkyOWtOVzV2V2toU1RUaEZOQ3RwYjFKaGEw
-WkVRVk1LVFZKQmQwUm4KV1VSV1VWRkVSWGRrUmxGV1FXZFJNRVY0WjJkclFXZDFWVll6UkUxMFZ6
-WnpkMFJCV1VSV1VqQlVRa0ZWZDBGM1JVSXZla0ZNUW1kTwpWZ3BJVVRoRlFrRk5RMEZSV1hkRVVW
-bEtTMjlhU1doMlkwNUJVVVZNUWxGQlJHZG5SVUpCUm1aUmNVOVVRVGRTZGpkTEsyeDFVVGR3CmJt
-RnpORUpaZDBoRkNqbEhSVkF2ZFc5b2RqWkxUM2t3VkVkUlJtSnlVbFJxUm05TVZrNUNPVUphTVhs
-dFRVUmFNQzlVU1hkSlZXTTMKZDJrM1lUaDBOVzFGY1ZsSU1UVXpkMWNLWVZkdmIybFRhbmxNVEdo
-MVNUUnpUbkpPUTA5MGFYTmtRbkV5Y2pKTlJsaDBObWd3YlVGUgpXVTlRZGpoU09FczNMMlpuVTNo
-SFJuRjZhSGxPYlcxV1RBb3hjVUpLYkdSNE16UlRjSGR6VkVGTVVWWlFZalJvUjNkS2VscG1jakZR
-ClkzQkZVWGcyZUUxdVZHdzRlRVZYV2tVelRYTTVPWFZoVlhoaVVYRkpkMUoxQ2t4blFVOXJUa050
-V1RKdE9EbFdhSHBoU0VveGRWWTQKTlVGa1RTOTBSQ3RaYzIxc2JtNXFkRGxNVWtObGFtSkNhWEJx
-U1VkcVQxaHlaekZLVUN0c2VGWUtiWFZOTkhaSUsxQXZiV3h0ZUhOUQpVSG93WkRZMVlpdEZSMjFL
-V25CdlRHdFBMM1JrVGs1MlExbDZha3B3VkVWWGNFVnpUelpPVFdoTFdXODlDaTB0TFMwdFJVNUVJ
-RU5GClVsUkpSa2xEUVZSRkxTMHRMUzBLCi0te2JvdW5kYXJ5fS0tCg==
\ No newline at end of file
diff --git a/wifi/tests/assets/hsr1/HSR1ProfileWithoutProfile.base64 b/wifi/tests/assets/hsr1/HSR1ProfileWithoutProfile.base64
deleted file mode 100644
index 833c527..0000000
--- a/wifi/tests/assets/hsr1/HSR1ProfileWithoutProfile.base64
+++ /dev/null
@@ -1,31 +0,0 @@
-Q29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PXtib3VuZGFyeX0KQ29udGVu
-dC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0CgotLXtib3VuZGFyeX0KQ29udGVudC1UeXBlOiBh
-cHBsaWNhdGlvbi94LXg1MDktY2EtY2VydApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNl
-NjQKCkxTMHRMUzFDUlVkSlRpQkRSVkpVU1VaSlEwRlVSUzB0TFMwdENrMUpTVVJMUkVORFFXaERa
-MEYzU1VKQlowbEtRVWxNYkVaa2QzcE0KVm5WeVRVRXdSME5UY1VkVFNXSXpSRkZGUWtOM1ZVRk5R
-a2w0UlVSQlQwSm5UbFlLUWtGTlZFSXdWa0pWUTBKRVVWUkZkMGhvWTA1TgpWRmwzVFZSRmVVMVVS
-VEZOUkVVeFYyaGpUazFxV1hkTlZFRTFUVlJGTVUxRVJURlhha0ZUVFZKQmR3cEVaMWxFVmxGUlJF
-VjNaRVpSClZrRm5VVEJGZUUxSlNVSkpha0ZPUW1kcmNXaHJhVWM1ZHpCQ1FWRkZSa0ZCVDBOQlVU
-aEJUVWxKUWtOblMwTkJVVVZCQ25wdVFWQlYKZWpJMlRYTmhaVFIzY3pRelkzcFNOREV2U2pKUmRI
-SlRTVnBWUzIxV1ZYTldkVzFFWWxsSWNsQk9kbFJZUzFOTldFRmpaWGRQVWtSUgpXVmdLVW5GMlNI
-WndiamhEYzJOQ01TdHZSMWhhZGtoM2VHbzBlbFl3VjB0dlN6SjZaVmhyWVhVemRtTjViRE5JU1V0
-MWNFcG1jVEpVClJVRkRaV1pXYW1vd2RBcEtWeXRZTXpWUVIxZHdPUzlJTlhwSlZVNVdUbFpxVXpk
-VmJYTTRORWwyUzJoU1FqZzFNVEpRUWpsVmVVaGgKWjFoWlZsZzFSMWR3UVdOV2NIbG1jbXhTQ2ta
-Sk9WRmthR2dyVUdKck1IVjVhM1JrWW1ZdlEyUm1aMGhQYjJWaWNsUjBkMUpzYWswdwpiMFIwV0Nz
-eVEzWTJhakIzUWtzM2FFUTRjRkIyWmpFcmRYa0tSM3BqZW1sblFWVXZORXQzTjJWYWNYbGtaamxD
-S3pWU2RYQlNLMGxhCmFYQllOREY0UldsSmNrdFNkM0ZwTlRFM1YxZDZXR05xWVVjeVkwNWlaalEx
-TVFwNGNFZzFVRzVXTTJreGRIRXdOR3BOUjFGVmVrWjMKU1VSQlVVRkNielJIUVUxSU5IZElVVmxF
-VmxJd1QwSkNXVVZHU1hkWU5IWnpPRUpwUW1OVFkyOWtDalZ1YjFwSVVrMDRSVFFyYVUxRgpTVWRC
-TVZWa1NYZFJOMDFFYlVGR1NYZFlOSFp6T0VKcFFtTlRZMjlrTlc1dldraFNUVGhGTkN0cGIxSmhh
-MFpFUVZNS1RWSkJkMFJuCldVUldVVkZFUlhka1JsRldRV2RSTUVWNFoyZHJRV2QxVlZZelJFMTBW
-elp6ZDBSQldVUldVakJVUWtGVmQwRjNSVUl2ZWtGTVFtZE8KVmdwSVVUaEZRa0ZOUTBGUldYZEVV
-VmxLUzI5YVNXaDJZMDVCVVVWTVFsRkJSR2RuUlVKQlJtWlJjVTlVUVRkU2RqZExLMngxVVRkdwpi
-bUZ6TkVKWmQwaEZDamxIUlZBdmRXOW9kalpMVDNrd1ZFZFJSbUp5VWxScVJtOU1WazVDT1VKYU1Y
-bHRUVVJhTUM5VVNYZEpWV00zCmQyazNZVGgwTlcxRmNWbElNVFV6ZDFjS1lWZHZiMmxUYW5sTVRH
-aDFTVFJ6VG5KT1EwOTBhWE5rUW5FeWNqSk5SbGgwTm1nd2JVRlIKV1U5UWRqaFNPRXMzTDJablUz
-aEhSbkY2YUhsT2JXMVdUQW94Y1VKS2JHUjRNelJUY0hkelZFRk1VVlpRWWpSb1IzZEtlbHBtY2pG
-UQpZM0JGVVhnMmVFMXVWR3c0ZUVWWFdrVXpUWE01T1hWaFZYaGlVWEZKZDFKMUNreG5RVTlyVGtO
-dFdUSnRPRGxXYUhwaFNFb3hkVlk0Ck5VRmtUUzkwUkN0WmMyMXNibTVxZERsTVVrTmxhbUpDYVhC
-cVNVZHFUMWh5WnpGS1VDdHNlRllLYlhWTk5IWklLMUF2Yld4dGVITlEKVUhvd1pEWTFZaXRGUjIx
-S1duQnZUR3RQTDNSa1RrNTJRMWw2YWtwd1ZFVlhjRVZ6VHpaT1RXaExXVzg5Q2kwdExTMHRSVTVF
-SUVORgpVbFJKUmtsRFFWUkZMUzB0TFMwSwotLXtib3VuZGFyeX0tLQo=
diff --git a/wifi/tests/assets/hsr1/README.txt b/wifi/tests/assets/hsr1/README.txt
deleted file mode 100644
index 9f3cdc2..0000000
--- a/wifi/tests/assets/hsr1/README.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-HSR1ProfileWithCACert.conf - unencoded installation file that contains a Passpoint profile and a CA Certificate
-HSR1ProfileWithCACert.base64 - base64 encoded of the data contained in HSR1ProfileWithCAWith.conf
-HSR1ProfileWithNonBase64Part.base64 - base64 encoded installation file that contains a part of non-base64 encoding type
-HSR1ProfileWithMissingBoundary.base64 - base64 encoded installation file with missing end-boundary in the MIME data
-HSR1ProfileWithInvalidContentType.base64 - base64 encoded installation file with that contains a MIME part with an invalid content type
-HSR1ProfileWithUpdateIdentifier.base64 - base64 encoded installation file with that contains an R2 update identifier
diff --git a/wifi/tests/assets/pps/PerProviderSubscription.xml b/wifi/tests/assets/pps/PerProviderSubscription.xml
deleted file mode 100644
index e9afb35..0000000
--- a/wifi/tests/assets/pps/PerProviderSubscription.xml
+++ /dev/null
@@ -1,430 +0,0 @@
-<MgmtTree xmlns="syncml:dmddf1.2">
-  <VerDTD>1.2</VerDTD>
-  <Node>
-    <NodeName>PerProviderSubscription</NodeName>
-    <RTProperties>
-      <Type>
-        <DDFName>urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0</DDFName>
-      </Type>
-    </RTProperties>
-    <Node>
-      <NodeName>UpdateIdentifier</NodeName>
-      <Value>12</Value>
-    </Node>
-    <Node>
-      <NodeName>i001</NodeName>
-      <Node>
-        <NodeName>Extension</NodeName>
-        <Node>
-          <NodeName>VendorSpecific</NodeName>
-          <Value>Test</Value>
-        </Node>
-        <Node>
-          <NodeName>VendorExtension</NodeName>
-          <Node>
-            <NodeName>VendorAttribute</NodeName>
-            <Value>VendorValue</Value>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>Android</NodeName>
-          <Node>
-            <NodeName>AAAServerTrustedNames</NodeName>
-            <Node>
-              <NodeName>FQDN</NodeName>
-              <Value>trusted.fqdn.com;another-trusted.fqdn.com</Value>
-            </Node>
-          </Node>
-          <Node>
-            <NodeName>NewSubTree</NodeName>
-            <Node>
-              <NodeName>NewAttribute</NodeName>
-              <Value>NewValue</Value>
-            </Node>
-          </Node>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>HomeSP</NodeName>
-        <Node>
-          <NodeName>FriendlyName</NodeName>
-          <Value>Century House</Value>
-        </Node>
-        <Node>
-          <NodeName>FQDN</NodeName>
-          <Value>mi6.co.uk</Value>
-        </Node>
-        <Node>
-          <NodeName>RoamingConsortiumOI</NodeName>
-          <Value>112233,445566</Value>
-        </Node>
-        <Node>
-          <NodeName>IconURL</NodeName>
-          <Value>icon.test.com</Value>
-        </Node>
-        <Node>
-          <NodeName>NetworkID</NodeName>
-          <Node>
-            <NodeName>n001</NodeName>
-            <Node>
-              <NodeName>SSID</NodeName>
-              <Value>TestSSID</Value>
-            </Node>
-            <Node>
-              <NodeName>HESSID</NodeName>
-              <Value>12345678</Value>
-            </Node>
-          </Node>
-          <Node>
-            <NodeName>n002</NodeName>
-            <Node>
-              <NodeName>SSID</NodeName>
-              <Value>NullHESSID</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>HomeOIList</NodeName>
-          <Node>
-            <NodeName>h001</NodeName>
-            <Node>
-              <NodeName>HomeOI</NodeName>
-              <Value>11223344</Value>
-            </Node>
-            <Node>
-              <NodeName>HomeOIRequired</NodeName>
-              <Value>true</Value>
-            </Node>
-          </Node>
-          <Node>
-            <NodeName>h002</NodeName>
-            <Node>
-              <NodeName>HomeOI</NodeName>
-              <Value>55667788</Value>
-            </Node>
-            <Node>
-              <NodeName>HomeOIRequired</NodeName>
-              <Value>false</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>OtherHomePartners</NodeName>
-          <Node>
-            <NodeName>o001</NodeName>
-            <Node>
-              <NodeName>FQDN</NodeName>
-              <Value>other.fqdn.com</Value>
-            </Node>
-          </Node>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>Credential</NodeName>
-        <Node>
-          <NodeName>CreationDate</NodeName>
-          <Value>2016-01-01T10:00:00Z</Value>
-        </Node>
-        <Node>
-          <NodeName>ExpirationDate</NodeName>
-          <Value>2016-02-01T10:00:00Z</Value>
-        </Node>
-        <Node>
-          <NodeName>Realm</NodeName>
-          <Value>shaken.stirred.com</Value>
-        </Node>
-        <Node>
-          <NodeName>CheckAAAServerCertStatus</NodeName>
-          <Value>true</Value>
-        </Node>
-        <Node>
-          <NodeName>UsernamePassword</NodeName>
-          <Node>
-            <NodeName>Username</NodeName>
-            <Value>james</Value>
-          </Node>
-          <Node>
-            <NodeName>Password</NodeName>
-            <Value>Ym9uZDAwNw==</Value>
-          </Node>
-          <Node>
-            <NodeName>MachineManaged</NodeName>
-            <Value>true</Value>
-          </Node>
-          <Node>
-            <NodeName>SoftTokenApp</NodeName>
-            <Value>TestApp</Value>
-          </Node>
-          <Node>
-            <NodeName>AbleToShare</NodeName>
-            <Value>true</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPMethod</NodeName>
-            <Node>
-              <NodeName>EAPType</NodeName>
-              <Value>21</Value>
-            </Node>
-            <Node>
-              <NodeName>InnerMethod</NodeName>
-              <Value>MS-CHAP-V2</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>DigitalCertificate</NodeName>
-          <Node>
-            <NodeName>CertificateType</NodeName>
-            <Value>x509v3</Value>
-          </Node>
-          <Node>
-            <NodeName>CertSHA256Fingerprint</NodeName>
-            <Value>1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f</Value>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>SIM</NodeName>
-          <Node>
-            <NodeName>IMSI</NodeName>
-            <Value>imsi</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPType</NodeName>
-            <Value>24</Value>
-          </Node>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>Policy</NodeName>
-        <Node>
-          <NodeName>PreferredRoamingPartnerList</NodeName>
-          <Node>
-            <NodeName>p001</NodeName>
-            <Node>
-              <NodeName>FQDN_Match</NodeName>
-              <Value>test1.fqdn.com,exactMatch</Value>
-            </Node>
-            <Node>
-              <NodeName>Priority</NodeName>
-              <Value>127</Value>
-            </Node>
-            <Node>
-              <NodeName>Country</NodeName>
-              <Value>us,fr</Value>
-            </Node>
-          </Node>
-          <Node>
-            <NodeName>p002</NodeName>
-            <Node>
-              <NodeName>FQDN_Match</NodeName>
-              <Value>test2.fqdn.com,includeSubdomains</Value>
-            </Node>
-            <Node>
-              <NodeName>Priority</NodeName>
-              <Value>200</Value>
-            </Node>
-            <Node>
-              <NodeName>Country</NodeName>
-              <Value>*</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>MinBackhaulThreshold</NodeName>
-          <Node>
-            <NodeName>m001</NodeName>
-            <Node>
-              <NodeName>NetworkType</NodeName>
-              <Value>home</Value>
-            </Node>
-            <Node>
-              <NodeName>DLBandwidth</NodeName>
-              <Value>23412</Value>
-            </Node>
-            <Node>
-              <NodeName>ULBandwidth</NodeName>
-              <Value>9823</Value>
-            </Node>
-          </Node>
-          <Node>
-            <NodeName>m002</NodeName>
-            <Node>
-              <NodeName>NetworkType</NodeName>
-              <Value>roaming</Value>
-            </Node>
-            <Node>
-              <NodeName>DLBandwidth</NodeName>
-              <Value>9271</Value>
-            </Node>
-            <Node>
-              <NodeName>ULBandwidth</NodeName>
-              <Value>2315</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>PolicyUpdate</NodeName>
-          <Node>
-            <NodeName>UpdateInterval</NodeName>
-            <Value>120</Value>
-          </Node>
-          <Node>
-            <NodeName>UpdateMethod</NodeName>
-            <Value>OMA-DM-ClientInitiated</Value>
-          </Node>
-          <Node>
-            <NodeName>Restriction</NodeName>
-            <Value>HomeSP</Value>
-          </Node>
-          <Node>
-            <NodeName>URI</NodeName>
-            <Value>policy.update.com</Value>
-          </Node>
-          <Node>
-            <NodeName>UsernamePassword</NodeName>
-            <Node>
-              <NodeName>Username</NodeName>
-              <Value>updateUser</Value>
-            </Node>
-            <Node>
-              <NodeName>Password</NodeName>
-              <Value>updatePass</Value>
-            </Node>
-          </Node>
-          <Node>
-            <NodeName>TrustRoot</NodeName>
-            <Node>
-              <NodeName>CertURL</NodeName>
-              <Value>update.cert.com</Value>
-            </Node>
-            <Node>
-              <NodeName>CertSHA256Fingerprint</NodeName>
-              <Value>1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>SPExclusionList</NodeName>
-          <Node>
-            <NodeName>s001</NodeName>
-            <Node>
-              <NodeName>SSID</NodeName>
-              <Value>excludeSSID</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>RequiredProtoPortTuple</NodeName>
-          <Node>
-            <NodeName>r001</NodeName>
-            <Node>
-              <NodeName>IPProtocol</NodeName>
-              <Value>12</Value>
-            </Node>
-            <Node>
-              <NodeName>PortNumber</NodeName>
-              <Value>34,92,234</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>MaximumBSSLoadValue</NodeName>
-          <Value>23</Value>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>CredentialPriority</NodeName>
-        <Value>99</Value>
-      </Node>
-      <Node>
-        <NodeName>AAAServerTrustRoot</NodeName>
-        <Node>
-          <NodeName>a001</NodeName>
-          <Node>
-            <NodeName>CertURL</NodeName>
-            <Value>server1.trust.root.com</Value>
-          </Node>
-          <Node>
-            <NodeName>CertSHA256Fingerprint</NodeName>
-            <Value>1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f</Value>
-          </Node>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>SubscriptionUpdate</NodeName>
-        <Node>
-          <NodeName>UpdateInterval</NodeName>
-          <Value>120</Value>
-        </Node>
-        <Node>
-          <NodeName>UpdateMethod</NodeName>
-          <Value>SSP-ClientInitiated</Value>
-        </Node>
-        <Node>
-          <NodeName>Restriction</NodeName>
-          <Value>RoamingPartner</Value>
-        </Node>
-        <Node>
-          <NodeName>URI</NodeName>
-          <Value>subscription.update.com</Value>
-        </Node>
-        <Node>
-          <NodeName>UsernamePassword</NodeName>
-          <Node>
-            <NodeName>Username</NodeName>
-            <Value>subscriptionUser</Value>
-          </Node>
-          <Node>
-            <NodeName>Password</NodeName>
-            <Value>subscriptionPass</Value>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>TrustRoot</NodeName>
-          <Node>
-            <NodeName>CertURL</NodeName>
-            <Value>subscription.update.cert.com</Value>
-          </Node>
-          <Node>
-            <NodeName>CertSHA256Fingerprint</NodeName>
-            <Value>1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f</Value>
-          </Node>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>SubscriptionParameters</NodeName>
-        <Node>
-          <NodeName>CreationDate</NodeName>
-          <Value>2016-02-01T10:00:00Z</Value>
-        </Node>
-        <Node>
-          <NodeName>ExpirationDate</NodeName>
-          <Value>2016-03-01T10:00:00Z</Value>
-        </Node>
-        <Node>
-          <NodeName>TypeOfSubscription</NodeName>
-          <Value>Gold</Value>
-        </Node>
-        <Node>
-          <NodeName>UsageLimits</NodeName>
-          <Node>
-            <NodeName>DataLimit</NodeName>
-            <Value>921890</Value>
-          </Node>
-          <Node>
-            <NodeName>StartDate</NodeName>
-            <Value>2016-12-01T10:00:00Z</Value>
-          </Node>
-          <Node>
-            <NodeName>TimeLimit</NodeName>
-            <Value>120</Value>
-          </Node>
-          <Node>
-            <NodeName>UsageTimePeriod</NodeName>
-            <Value>99910</Value>
-          </Node>
-        </Node>
-      </Node>
-    </Node>
-  </Node>
-</MgmtTree>
diff --git a/wifi/tests/assets/pps/PerProviderSubscription_DuplicateHomeSP.xml b/wifi/tests/assets/pps/PerProviderSubscription_DuplicateHomeSP.xml
deleted file mode 100644
index e13eb2a..0000000
--- a/wifi/tests/assets/pps/PerProviderSubscription_DuplicateHomeSP.xml
+++ /dev/null
@@ -1,95 +0,0 @@
-<MgmtTree xmlns="syncml:dmddf1.2">
-  <VerDTD>1.2</VerDTD>
-  <Node>
-    <NodeName>PerProviderSubscription</NodeName>
-    <RTProperties>
-      <Type>
-        <DDFName>urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0</DDFName>
-      </Type>
-    </RTProperties>
-    <Node>
-      <NodeName>i001</NodeName>
-      <Node>
-        <NodeName>HomeSP</NodeName>
-        <Node>
-          <NodeName>FriendlyName</NodeName>
-          <Value>Century House</Value>
-        </Node>
-        <Node>
-          <NodeName>FQDN</NodeName>
-          <Value>mi6.co.uk</Value>
-        </Node>
-        <Node>
-          <NodeName>RoamingConsortiumOI</NodeName>
-          <Value>112233,445566</Value>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>HomeSP</NodeName>
-        <Node>
-          <NodeName>FriendlyName</NodeName>
-          <Value>Century House</Value>
-        </Node>
-        <Node>
-          <NodeName>FQDN</NodeName>
-          <Value>mi6.co.uk</Value>
-        </Node>
-        <Node>
-          <NodeName>RoamingConsortiumOI</NodeName>
-          <Value>112233,445566</Value>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>Credential</NodeName>
-        <Node>
-          <NodeName>Realm</NodeName>
-          <Value>shaken.stirred.com</Value>
-        </Node>
-        <Node>
-          <NodeName>UsernamePassword</NodeName>
-          <Node>
-            <NodeName>Username</NodeName>
-            <Value>james</Value>
-          </Node>
-          <Node>
-            <NodeName>Password</NodeName>
-            <Value>Ym9uZDAwNw==</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPMethod</NodeName>
-            <Node>
-              <NodeName>EAPType</NodeName>
-              <Value>21</Value>
-            </Node>
-            <Node>
-              <NodeName>InnerMethod</NodeName>
-              <Value>MS-CHAP-V2</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>DigitalCertificate</NodeName>
-          <Node>
-            <NodeName>CertificateType</NodeName>
-            <Value>x509v3</Value>
-          </Node>
-          <Node>
-            <NodeName>CertSHA256FingerPrint</NodeName>
-            <Value>1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f</Value>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>SIM</NodeName>
-          <Node>
-            <NodeName>IMSI</NodeName>
-            <Value>imsi</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPType</NodeName>
-            <Value>24</Value>
-          </Node>
-        </Node>
-      </Node>
-    </Node>
-  </Node>
-</MgmtTree>
diff --git a/wifi/tests/assets/pps/PerProviderSubscription_DuplicateValue.xml b/wifi/tests/assets/pps/PerProviderSubscription_DuplicateValue.xml
deleted file mode 100644
index 8719ffa..0000000
--- a/wifi/tests/assets/pps/PerProviderSubscription_DuplicateValue.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<MgmtTree xmlns="syncml:dmddf1.2">
-  <VerDTD>1.2</VerDTD>
-  <Node>
-    <NodeName>PerProviderSubscription</NodeName>
-    <RTProperties>
-      <Type>
-        <DDFName>urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0</DDFName>
-      </Type>
-    </RTProperties>
-    <Node>
-      <NodeName>i001</NodeName>
-      <Node>
-        <NodeName>HomeSP</NodeName>
-        <Node>
-          <NodeName>FriendlyName</NodeName>
-          <Value>Century House</Value>
-          <Value>Century House</Value>
-        </Node>
-        <Node>
-          <NodeName>FQDN</NodeName>
-          <Value>mi6.co.uk</Value>
-        </Node>
-        <Node>
-          <NodeName>RoamingConsortiumOI</NodeName>
-          <Value>112233,445566</Value>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>Credential</NodeName>
-        <Node>
-          <NodeName>Realm</NodeName>
-          <Value>shaken.stirred.com</Value>
-        </Node>
-        <Node>
-          <NodeName>UsernamePassword</NodeName>
-          <Node>
-            <NodeName>Username</NodeName>
-            <Value>james</Value>
-          </Node>
-          <Node>
-            <NodeName>Password</NodeName>
-            <Value>Ym9uZDAwNw==</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPMethod</NodeName>
-            <Node>
-              <NodeName>EAPType</NodeName>
-              <Value>21</Value>
-            </Node>
-            <Node>
-              <NodeName>InnerMethod</NodeName>
-              <Value>MS-CHAP-V2</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>DigitalCertificate</NodeName>
-          <Node>
-            <NodeName>CertificateType</NodeName>
-            <Value>x509v3</Value>
-          </Node>
-          <Node>
-            <NodeName>CertSHA256FingerPrint</NodeName>
-            <Value>1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f</Value>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>SIM</NodeName>
-          <Node>
-            <NodeName>IMSI</NodeName>
-            <Value>imsi</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPType</NodeName>
-            <Value>24</Value>
-          </Node>
-        </Node>
-      </Node>
-    </Node>
-  </Node>
-</MgmtTree>
diff --git a/wifi/tests/assets/pps/PerProviderSubscription_InvalidName.xml b/wifi/tests/assets/pps/PerProviderSubscription_InvalidName.xml
deleted file mode 100644
index c761237..0000000
--- a/wifi/tests/assets/pps/PerProviderSubscription_InvalidName.xml
+++ /dev/null
@@ -1,80 +0,0 @@
-<MgmtTree xmlns="syncml:dmddf1.2">
-  <VerDTD>1.2</VerDTD>
-  <Node>
-    <NodeName>PerProviderSubscription</NodeName>
-    <RTProperties>
-      <Type>
-        <DDFName>urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0</DDFName>
-      </Type>
-    </RTProperties>
-    <Node>
-      <NodeName>i001</NodeName>
-      <Node>
-        <NodeName>HomeSP</NodeName>
-        <Node>
-          <NodeName>FriendName</NodeName>
-          <Value>Century House</Value>
-        </Node>
-        <Node>
-          <NodeName>FQDN</NodeName>
-          <Value>mi6.co.uk</Value>
-        </Node>
-        <Node>
-          <NodeName>RoamingConsortiumOI</NodeName>
-          <Value>112233,445566</Value>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>Credential</NodeName>
-        <Node>
-          <NodeName>Realm</NodeName>
-          <Value>shaken.stirred.com</Value>
-        </Node>
-        <Node>
-          <NodeName>UsernamePassword</NodeName>
-          <Node>
-            <NodeName>Username</NodeName>
-            <Value>james</Value>
-          </Node>
-          <Node>
-            <NodeName>Password</NodeName>
-            <Value>Ym9uZDAwNw==</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPMethod</NodeName>
-            <Node>
-              <NodeName>EAPType</NodeName>
-              <Value>21</Value>
-            </Node>
-            <Node>
-              <NodeName>InnerMethod</NodeName>
-              <Value>MS-CHAP-V2</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>DigitalCertificate</NodeName>
-          <Node>
-            <NodeName>CertificateType</NodeName>
-            <Value>x509v3</Value>
-          </Node>
-          <Node>
-            <NodeName>CertSHA256FingerPrint</NodeName>
-            <Value>1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f</Value>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>SIM</NodeName>
-          <Node>
-            <NodeName>IMSI</NodeName>
-            <Value>imsi</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPType</NodeName>
-            <Value>24</Value>
-          </Node>
-        </Node>
-      </Node>
-    </Node>
-  </Node>
-</MgmtTree>
diff --git a/wifi/tests/assets/pps/PerProviderSubscription_InvalidNode.xml b/wifi/tests/assets/pps/PerProviderSubscription_InvalidNode.xml
deleted file mode 100644
index 6b807af..0000000
--- a/wifi/tests/assets/pps/PerProviderSubscription_InvalidNode.xml
+++ /dev/null
@@ -1,84 +0,0 @@
-<MgmtTree xmlns="syncml:dmddf1.2">
-  <VerDTD>1.2</VerDTD>
-  <Node>
-    <NodeName>PerProviderSubscription</NodeName>
-    <RTProperties>
-      <Type>
-        <DDFName>urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0</DDFName>
-      </Type>
-    </RTProperties>
-    <Node>
-      <NodeName>i001</NodeName>
-      <Node>
-        <NodeName>HomeSP</NodeName>
-        <Node>
-          <NodeName>FriendlyName</NodeName>
-          <Value>Century House</Value>
-        </Node>
-        <Node>
-          <NodeName>FQDN</NodeName>
-          <Value>mi6.co.uk</Value>
-          <Node>
-            <NodeName>InvalidNode</NodeName>
-            <Value>Test</Value>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>RoamingConsortiumOI</NodeName>
-          <Value>112233,445566</Value>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>Credential</NodeName>
-        <Node>
-          <NodeName>Realm</NodeName>
-          <Value>shaken.stirred.com</Value>
-        </Node>
-        <Node>
-          <NodeName>UsernamePassword</NodeName>
-          <Node>
-            <NodeName>Username</NodeName>
-            <Value>james</Value>
-          </Node>
-          <Node>
-            <NodeName>Password</NodeName>
-            <Value>Ym9uZDAwNw==</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPMethod</NodeName>
-            <Node>
-              <NodeName>EAPType</NodeName>
-              <Value>21</Value>
-            </Node>
-            <Node>
-              <NodeName>InnerMethod</NodeName>
-              <Value>MS-CHAP-V2</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>DigitalCertificate</NodeName>
-          <Node>
-            <NodeName>CertificateType</NodeName>
-            <Value>x509v3</Value>
-          </Node>
-          <Node>
-            <NodeName>CertSHA256FingerPrint</NodeName>
-            <Value>1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f</Value>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>SIM</NodeName>
-          <Node>
-            <NodeName>IMSI</NodeName>
-            <Value>imsi</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPType</NodeName>
-            <Value>24</Value>
-          </Node>
-        </Node>
-      </Node>
-    </Node>
-  </Node>
-</MgmtTree>
diff --git a/wifi/tests/assets/pps/PerProviderSubscription_MissingName.xml b/wifi/tests/assets/pps/PerProviderSubscription_MissingName.xml
deleted file mode 100644
index ed06b47..0000000
--- a/wifi/tests/assets/pps/PerProviderSubscription_MissingName.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<MgmtTree xmlns="syncml:dmddf1.2">
-  <VerDTD>1.2</VerDTD>
-  <Node>
-    <NodeName>PerProviderSubscription</NodeName>
-    <RTProperties>
-      <Type>
-        <DDFName>urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0</DDFName>
-      </Type>
-    </RTProperties>
-    <Node>
-      <NodeName>i001</NodeName>
-      <Node>
-        <Node>
-          <NodeName>FriendlyName</NodeName>
-          <Value>Century House</Value>
-        </Node>
-        <Node>
-          <NodeName>FQDN</NodeName>
-          <Value>mi6.co.uk</Value>
-        </Node>
-        <Node>
-          <NodeName>RoamingConsortiumOI</NodeName>
-          <Value>112233,445566</Value>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>Credential</NodeName>
-        <Node>
-          <NodeName>Realm</NodeName>
-          <Value>shaken.stirred.com</Value>
-        </Node>
-        <Node>
-          <NodeName>UsernamePassword</NodeName>
-          <Node>
-            <NodeName>Username</NodeName>
-            <Value>james</Value>
-          </Node>
-          <Node>
-            <NodeName>Password</NodeName>
-            <Value>Ym9uZDAwNw==</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPMethod</NodeName>
-            <Node>
-              <NodeName>EAPType</NodeName>
-              <Value>21</Value>
-            </Node>
-            <Node>
-              <NodeName>InnerMethod</NodeName>
-              <Value>MS-CHAP-V2</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>DigitalCertificate</NodeName>
-          <Node>
-            <NodeName>CertificateType</NodeName>
-            <Value>x509v3</Value>
-          </Node>
-          <Node>
-            <NodeName>CertSHA256FingerPrint</NodeName>
-            <Value>1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f</Value>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>SIM</NodeName>
-          <Node>
-            <NodeName>IMSI</NodeName>
-            <Value>imsi</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPType</NodeName>
-            <Value>24</Value>
-          </Node>
-        </Node>
-      </Node>
-    </Node>
-  </Node>
-</MgmtTree>
diff --git a/wifi/tests/assets/pps/PerProviderSubscription_MissingValue.xml b/wifi/tests/assets/pps/PerProviderSubscription_MissingValue.xml
deleted file mode 100644
index f7e35dd..0000000
--- a/wifi/tests/assets/pps/PerProviderSubscription_MissingValue.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<MgmtTree xmlns="syncml:dmddf1.2">
-  <VerDTD>1.2</VerDTD>
-  <Node>
-    <NodeName>PerProviderSubscription</NodeName>
-    <RTProperties>
-      <Type>
-        <DDFName>urn:wfa:mo:hotspot2dot0-perprovidersubscription:1.0</DDFName>
-      </Type>
-    </RTProperties>
-    <Node>
-      <NodeName>i001</NodeName>
-      <Node>
-        <NodeName>HomeSP</NodeName>
-        <Node>
-          <NodeName>FriendlyName</NodeName>
-        </Node>
-        <Node>
-          <NodeName>FQDN</NodeName>
-          <Value>mi6.co.uk</Value>
-        </Node>
-        <Node>
-          <NodeName>RoamingConsortiumOI</NodeName>
-          <Value>112233,445566</Value>
-        </Node>
-      </Node>
-      <Node>
-        <NodeName>Credential</NodeName>
-        <Node>
-          <NodeName>Realm</NodeName>
-          <Value>shaken.stirred.com</Value>
-        </Node>
-        <Node>
-          <NodeName>UsernamePassword</NodeName>
-          <Node>
-            <NodeName>Username</NodeName>
-            <Value>james</Value>
-          </Node>
-          <Node>
-            <NodeName>Password</NodeName>
-            <Value>Ym9uZDAwNw==</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPMethod</NodeName>
-            <Node>
-              <NodeName>EAPType</NodeName>
-              <Value>21</Value>
-            </Node>
-            <Node>
-              <NodeName>InnerMethod</NodeName>
-              <Value>MS-CHAP-V2</Value>
-            </Node>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>DigitalCertificate</NodeName>
-          <Node>
-            <NodeName>CertificateType</NodeName>
-            <Value>x509v3</Value>
-          </Node>
-          <Node>
-            <NodeName>CertSHA256FingerPrint</NodeName>
-            <Value>1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f</Value>
-          </Node>
-        </Node>
-        <Node>
-          <NodeName>SIM</NodeName>
-          <Node>
-            <NodeName>IMSI</NodeName>
-            <Value>imsi</Value>
-          </Node>
-          <Node>
-            <NodeName>EAPType</NodeName>
-            <Value>24</Value>
-          </Node>
-        </Node>
-      </Node>
-    </Node>
-  </Node>
-</MgmtTree>
diff --git a/wifi/tests/assets/pps/README.txt b/wifi/tests/assets/pps/README.txt
deleted file mode 100644
index 369c0a9..0000000
--- a/wifi/tests/assets/pps/README.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-PerProviderSubscription.xml - valid PPS XML file
-PerProviderSubscription_DuplicateHomeSP.xml - containing multiple HomeSP node
-PerProviderSubscription_DuplicateValue.xml - FriendlyName node contains multiple Value
-PerProviderSubscription_MissingValue.xml - FriendlyName node is missing Value
-PerProviderSubscription_MissingName.xml - HomeSP node is missing NodeName
-PerProviderSubscription_InvalidNode.xml - FQDN node contains both Value and a child node
-PerProviderSubscription_InvalidName.xml - FriendlyName node have a typo in its name
diff --git a/wifi/tests/src/android/net/wifi/EasyConnectStatusCallbackTest.java b/wifi/tests/src/android/net/wifi/EasyConnectStatusCallbackTest.java
deleted file mode 100644
index b101414..0000000
--- a/wifi/tests/src/android/net/wifi/EasyConnectStatusCallbackTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.util.SparseArray;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests for {@link android.net.wifi.EasyConnectStatusCallbackTest}.
- */
-@SmallTest
-public class EasyConnectStatusCallbackTest {
-    private EasyConnectStatusCallback mEasyConnectStatusCallback = new EasyConnectStatusCallback() {
-        @Override
-        public void onEnrolleeSuccess(int newNetworkId) {
-
-        }
-
-        @Override
-        public void onConfiguratorSuccess(int code) {
-
-        }
-
-        @Override
-        public void onProgress(int code) {
-
-        }
-
-        @Override
-        public void onFailure(int code) {
-            mOnFailureR1EventReceived = true;
-            mLastCode = code;
-        }
-    };
-    private boolean mOnFailureR1EventReceived;
-    private int mLastCode;
-
-    @Before
-    public void setUp() {
-        mOnFailureR1EventReceived = false;
-        mLastCode = 0;
-    }
-
-    /**
-     * Test that the legacy R1 onFailure is called by default if the R2 onFailure is not overridden
-     * by the app.
-     */
-    @Test
-    public void testR1OnFailureCalled() {
-
-        SparseArray<int[]> channelList = new SparseArray<>();
-        int[] channelArray = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
-
-        channelList.append(81, channelArray);
-        mEasyConnectStatusCallback.onFailure(
-                EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK,
-                "SomeSSID", channelList, new int[] {81});
-
-        assertTrue(mOnFailureR1EventReceived);
-        assertEquals(mLastCode,
-                EasyConnectStatusCallback.EASY_CONNECT_EVENT_FAILURE_CANNOT_FIND_NETWORK);
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/FakeKeys.java b/wifi/tests/src/android/net/wifi/FakeKeys.java
deleted file mode 100644
index 8aa6add..0000000
--- a/wifi/tests/src/android/net/wifi/FakeKeys.java
+++ /dev/null
@@ -1,673 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.security.KeyFactory;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.cert.CertificateFactory;
-import java.security.cert.X509Certificate;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.PKCS8EncodedKeySpec;
-
-/**
- * A class containing test certificates and private keys.
- */
-public class FakeKeys {
-    private static final String CA_CERT0_STRING = "-----BEGIN CERTIFICATE-----\n" +
-            "MIIDKDCCAhCgAwIBAgIJAILlFdwzLVurMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV\n" +
-            "BAMTB0VBUCBDQTEwHhcNMTYwMTEyMTE1MDE1WhcNMjYwMTA5MTE1MDE1WjASMRAw\n" +
-            "DgYDVQQDEwdFQVAgQ0ExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n" +
-            "znAPUz26Msae4ws43czR41/J2QtrSIZUKmVUsVumDbYHrPNvTXKSMXAcewORDQYX\n" +
-            "RqvHvpn8CscB1+oGXZvHwxj4zV0WKoK2zeXkau3vcyl3HIKupJfq2TEACefVjj0t\n" +
-            "JW+X35PGWp9/H5zIUNVNVjS7Ums84IvKhRB8512PB9UyHagXYVX5GWpAcVpyfrlR\n" +
-            "FI9Qdhh+Pbk0uyktdbf/CdfgHOoebrTtwRljM0oDtX+2Cv6j0wBK7hD8pPvf1+uy\n" +
-            "GzczigAU/4Kw7eZqydf9B+5RupR+IZipX41xEiIrKRwqi517WWzXcjaG2cNbf451\n" +
-            "xpH5PnV3i1tq04jMGQUzFwIDAQABo4GAMH4wHQYDVR0OBBYEFIwX4vs8BiBcScod\n" +
-            "5noZHRM8E4+iMEIGA1UdIwQ7MDmAFIwX4vs8BiBcScod5noZHRM8E4+ioRakFDAS\n" +
-            "MRAwDgYDVQQDEwdFQVAgQ0ExggkAguUV3DMtW6swDAYDVR0TBAUwAwEB/zALBgNV\n" +
-            "HQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAFfQqOTA7Rv7K+luQ7pnas4BYwHE\n" +
-            "9GEP/uohv6KOy0TGQFbrRTjFoLVNB9BZ1ymMDZ0/TIwIUc7wi7a8t5mEqYH153wW\n" +
-            "aWooiSjyLLhuI4sNrNCOtisdBq2r2MFXt6h0mAQYOPv8R8K7/fgSxGFqzhyNmmVL\n" +
-            "1qBJldx34SpwsTALQVPb4hGwJzZfr1PcpEQx6xMnTl8xEWZE3Ms99uaUxbQqIwRu\n" +
-            "LgAOkNCmY2m89VhzaHJ1uV85AdM/tD+Ysmlnnjt9LRCejbBipjIGjOXrg1JP+lxV\n" +
-            "muM4vH+P/mlmxsPPz0d65b+EGmJZpoLkO/tdNNvCYzjJpTEWpEsO6NMhKYo=\n" +
-            "-----END CERTIFICATE-----\n";
-    public static final X509Certificate CA_CERT0 = loadCertificate(CA_CERT0_STRING);
-
-    private static final String CA_CERT1_STRING = "-----BEGIN CERTIFICATE-----\n" +
-            "MIIDKDCCAhCgAwIBAgIJAOM5SzKO2pzCMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV\n" +
-            "BAMTB0VBUCBDQTAwHhcNMTYwMTEyMDAxMDQ3WhcNMjYwMTA5MDAxMDQ3WjASMRAw\n" +
-            "DgYDVQQDEwdFQVAgQ0EwMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA\n" +
-            "89ug+IEKVQXnJGKg5g4uVHg6J/8iRUxR5k2eH5o03hrJNMfN2D+cBe/wCiZcnWbI\n" +
-            "GbGZACWm2nQth2wy9Zgm2LOd3b4ocrHYls3XLq6Qb5Dd7a0JKU7pdGufiNVEkrmF\n" +
-            "EB+N64wgwH4COTvCiN4erp5kyJwkfqAl2xLkZo0C464c9XoyQOXbmYD9A8v10wZu\n" +
-            "jyNsEo7Nr2USyw+qhjWSbFbEirP77Tvx+7pJQJwdtk1V9Tn73T2dGF2WHYejei9S\n" +
-            "mcWpdIUqsu9etYH+zDmtu7I1xlkwiaVsNr2+D+qaCJyOYqrDTKVNK5nmbBPXDWZc\n" +
-            "NoDbTOoqquX7xONpq9M6jQIDAQABo4GAMH4wHQYDVR0OBBYEFAZ3A2S4qJZZwuNY\n" +
-            "wkJ6mAdc0gVdMEIGA1UdIwQ7MDmAFAZ3A2S4qJZZwuNYwkJ6mAdc0gVdoRakFDAS\n" +
-            "MRAwDgYDVQQDEwdFQVAgQ0EwggkA4zlLMo7anMIwDAYDVR0TBAUwAwEB/zALBgNV\n" +
-            "HQ8EBAMCAQYwDQYJKoZIhvcNAQELBQADggEBAHmdMwEhtys4d0E+t7owBmoVR+lU\n" +
-            "hMCcRtWs8YKX5WIM2kTweT0h/O1xwE1mWmRv/IbDAEb8od4BjAQLhIcolStr2JaO\n" +
-            "9ZzyxjOnNzqeErh/1DHDbb/moPpqfeJ8YiEz7nH/YU56Q8iCPO7TsgS0sNNE7PfN\n" +
-            "IUsBW0yHRgpQ4OxWmiZG2YZWiECRzAC0ecPzo59N5iH4vLQIMTMYquiDeMPQnn1e\n" +
-            "NDGxG8gCtDKIaS6tMg3a28MvWB094pr2ETou8O1C8Ji0Y4hE8QJmSdT7I4+GZjgW\n" +
-            "g94DZ5RiL7sdp3vC48CXOmeT61YBIvhGUsE1rPhXqkpqQ3Z3C4TFF0jXZZc=\n" +
-            "-----END CERTIFICATE-----\n";
-    public static final X509Certificate CA_CERT1 = loadCertificate(CA_CERT1_STRING);
-
-    private static final String CLIENT_CERT_STR = "-----BEGIN CERTIFICATE-----\n" +
-            "MIIE/DCCAuQCAQEwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxCzAJBgNV\n" +
-            "BAgMAkNBMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdUZXN0aW5n\n" +
-            "MB4XDTE2MDkzMDIwNTQyOFoXDTE3MDkzMDIwNTQyOFowRDELMAkGA1UEBhMCVVMx\n" +
-            "CzAJBgNVBAgMAkNBMRYwFAYDVQQHDA1Nb3VudGFpbiBWaWV3MRAwDgYDVQQKDAdU\n" +
-            "ZXN0aW5nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAnpmcbuaeHfnJ\n" +
-            "k+2QNvxmdVFTawyFMNk0USCq5sexscwmxbewG/Rb8YnixwJWS44v2XkSujB67z5C\n" +
-            "s2qudFEhRXKdEuC6idbAuA97KjipHh0AAniWMsyv61fvbgsUC0b0canx3LiDq81p\n" +
-            "y28NNGmAvoazLZUZ4AhBRiwYZY6FKk723gmZoGbEIeG7J1dlXPusc1662rIjz4eU\n" +
-            "zlmmlvqyHfNqnNk8L14Vug6Xh+lOEGN85xhu1YHAEKGrS89kZxs5rum/cZU8KH2V\n" +
-            "v6eKnY03kxjiVLQtnLpm/7VUEoCMGHyruRj+p3my4+DgqMsmsH52RZCBsjyGlpbU\n" +
-            "NOwOTIX6xh+Rqloduz4AnrMYYIiIw2s8g+2zJM7VbcVKx0fGS26BKdrxgrXWfmNE\n" +
-            "nR0/REQ5AxDGw0jfTUvtdTkXAf+K4MDjcNLEZ+MA4rHfAfQWZtUR5BkHCQYxNpJk\n" +
-            "pA0gyk+BpKdC4WdzI14NSWsu5sRCmBCFqH6BTOSEq/V1cNorBxNwLSSTwFFqUDqx\n" +
-            "Y5nQLXygkJf9WHZWtSKeSjtOYgilz7UKzC2s3CsjmIyGFe+SwpuHJnuE4Uc8Z5Cb\n" +
-            "bjNGHPzqL6XnmzZHJp7RF8kBdKdjGC7dCUltzOfICZeKlzOOq+Kw42T/nXjuXvpb\n" +
-            "nkXNxg741Nwd6RecykXJbseFwm3EYxkCAwEAATANBgkqhkiG9w0BAQsFAAOCAgEA\n" +
-            "Ga1mGwI9aXkL2fTPXO9YkAPzoGeX8aeuVYSQaSkNq+5vnogYCyAt3YDHjRG+ewTT\n" +
-            "WbnPA991xRAPac+biJeXWmwvgGj0YuT7e79phAiGkTTnbAjFHGfYnBy/tI/v7btO\n" +
-            "hRNElA5yTJ1m2fVbBEKXzMR83jrT9iyI+YLRN86zUZIaC86xxSbqnrdWN2jOK6MX\n" +
-            "dS8Arp9tPQjC/4gW+2Ilxv68jiYh+5auWHQZVjppWVY//iu4mAbkq1pTwQEhZ8F8\n" +
-            "Zrmh9DHh60hLFcfSuhIAwf/NMzppwdkjy1ruKVrpijhGKGp4OWu8nvOUgHSzxc7F\n" +
-            "PwpVZ5N2Ku4L8MLO6BG2VasRJK7l17TzDXlfLZHJjkuryOFxVaQKt8ZNFgTOaCXS\n" +
-            "E+gpTLksKU7riYckoiP4+H1sn9qcis0e8s4o/uf1UVc8GSdDw61ReGM5oZEDm1u8\n" +
-            "H9x20QU6igLqzyBpqvCKv7JNgU1uB2PAODHH78zJiUfnKd1y+o+J1iWzaGj3EFji\n" +
-            "T8AXksbTP733FeFXfggXju2dyBH+Z1S5BBTEOd1brWgXlHSAZGm97MKZ94r6/tkX\n" +
-            "qfv3fCos0DKz0oV7qBxYS8wiYhzrRVxG6ITAoH8uuUVVQaZF+G4nJ2jEqNbfuKyX\n" +
-            "ATQsVNjNNlDA0J33GobPMjT326wa4YAWMx8PI5PJZ3g=\n" +
-            "-----END CERTIFICATE-----\n";
-    public static final X509Certificate CLIENT_CERT = loadCertificate(CLIENT_CERT_STR);
-
-    private static final byte[] FAKE_RSA_KEY_1 = new byte[] {
-            (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x78, (byte) 0x02, (byte) 0x01,
-            (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
-            (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
-            (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x82,
-            (byte) 0x02, (byte) 0x62, (byte) 0x30, (byte) 0x82, (byte) 0x02, (byte) 0x5e,
-            (byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x02, (byte) 0x81, (byte) 0x81,
-            (byte) 0x00, (byte) 0xce, (byte) 0x29, (byte) 0xeb, (byte) 0xf6, (byte) 0x5b,
-            (byte) 0x25, (byte) 0xdc, (byte) 0xa1, (byte) 0xa6, (byte) 0x2c, (byte) 0x66,
-            (byte) 0xcb, (byte) 0x20, (byte) 0x90, (byte) 0x27, (byte) 0x86, (byte) 0x8a,
-            (byte) 0x44, (byte) 0x71, (byte) 0x50, (byte) 0xda, (byte) 0xd3, (byte) 0x02,
-            (byte) 0x77, (byte) 0x55, (byte) 0xe9, (byte) 0xe8, (byte) 0x08, (byte) 0xf3,
-            (byte) 0x36, (byte) 0x9a, (byte) 0xae, (byte) 0xab, (byte) 0x04, (byte) 0x6d,
-            (byte) 0x00, (byte) 0x99, (byte) 0xbf, (byte) 0x7d, (byte) 0x0f, (byte) 0x67,
-            (byte) 0x8b, (byte) 0x1d, (byte) 0xd4, (byte) 0x2b, (byte) 0x7c, (byte) 0xcb,
-            (byte) 0xcd, (byte) 0x33, (byte) 0xc7, (byte) 0x84, (byte) 0x30, (byte) 0xe2,
-            (byte) 0x45, (byte) 0x21, (byte) 0xb3, (byte) 0x75, (byte) 0xf5, (byte) 0x79,
-            (byte) 0x02, (byte) 0xda, (byte) 0x50, (byte) 0xa3, (byte) 0x8b, (byte) 0xce,
-            (byte) 0xc3, (byte) 0x8e, (byte) 0x0f, (byte) 0x25, (byte) 0xeb, (byte) 0x08,
-            (byte) 0x2c, (byte) 0xdd, (byte) 0x1c, (byte) 0xcf, (byte) 0xff, (byte) 0x3b,
-            (byte) 0xde, (byte) 0xb6, (byte) 0xaa, (byte) 0x2a, (byte) 0xa9, (byte) 0xc4,
-            (byte) 0x8a, (byte) 0x24, (byte) 0x24, (byte) 0xe6, (byte) 0x29, (byte) 0x0d,
-            (byte) 0x98, (byte) 0x4c, (byte) 0x32, (byte) 0xa1, (byte) 0x7b, (byte) 0x23,
-            (byte) 0x2b, (byte) 0x42, (byte) 0x30, (byte) 0xee, (byte) 0x78, (byte) 0x08,
-            (byte) 0x47, (byte) 0xad, (byte) 0xf2, (byte) 0x96, (byte) 0xd5, (byte) 0xf1,
-            (byte) 0x62, (byte) 0x42, (byte) 0x2d, (byte) 0x35, (byte) 0x19, (byte) 0xb4,
-            (byte) 0x3c, (byte) 0xc9, (byte) 0xc3, (byte) 0x5f, (byte) 0x03, (byte) 0x16,
-            (byte) 0x3a, (byte) 0x23, (byte) 0xac, (byte) 0xcb, (byte) 0xce, (byte) 0x9e,
-            (byte) 0x51, (byte) 0x2e, (byte) 0x6d, (byte) 0x02, (byte) 0x03, (byte) 0x01,
-            (byte) 0x00, (byte) 0x01, (byte) 0x02, (byte) 0x81, (byte) 0x80, (byte) 0x16,
-            (byte) 0x59, (byte) 0xc3, (byte) 0x24, (byte) 0x1d, (byte) 0x33, (byte) 0x98,
-            (byte) 0x9c, (byte) 0xc9, (byte) 0xc8, (byte) 0x2c, (byte) 0x88, (byte) 0xbf,
-            (byte) 0x0a, (byte) 0x01, (byte) 0xce, (byte) 0xfb, (byte) 0x34, (byte) 0x7a,
-            (byte) 0x58, (byte) 0x7a, (byte) 0xb0, (byte) 0xbf, (byte) 0xa6, (byte) 0xb2,
-            (byte) 0x60, (byte) 0xbe, (byte) 0x70, (byte) 0x21, (byte) 0xf5, (byte) 0xfc,
-            (byte) 0x85, (byte) 0x0d, (byte) 0x33, (byte) 0x58, (byte) 0xa1, (byte) 0xe5,
-            (byte) 0x09, (byte) 0x36, (byte) 0x84, (byte) 0xb2, (byte) 0x04, (byte) 0x0a,
-            (byte) 0x02, (byte) 0xd3, (byte) 0x88, (byte) 0x1f, (byte) 0x0c, (byte) 0x2b,
-            (byte) 0x1d, (byte) 0xe9, (byte) 0x3d, (byte) 0xe7, (byte) 0x79, (byte) 0xf9,
-            (byte) 0x32, (byte) 0x5c, (byte) 0x8a, (byte) 0x75, (byte) 0x49, (byte) 0x12,
-            (byte) 0xe4, (byte) 0x05, (byte) 0x26, (byte) 0xd4, (byte) 0x2e, (byte) 0x9e,
-            (byte) 0x1f, (byte) 0xcc, (byte) 0x54, (byte) 0xad, (byte) 0x33, (byte) 0x8d,
-            (byte) 0x99, (byte) 0x00, (byte) 0xdc, (byte) 0xf5, (byte) 0xb4, (byte) 0xa2,
-            (byte) 0x2f, (byte) 0xba, (byte) 0xe5, (byte) 0x62, (byte) 0x30, (byte) 0x6d,
-            (byte) 0xe6, (byte) 0x3d, (byte) 0xeb, (byte) 0x24, (byte) 0xc2, (byte) 0xdc,
-            (byte) 0x5f, (byte) 0xb7, (byte) 0x16, (byte) 0x35, (byte) 0xa3, (byte) 0x98,
-            (byte) 0x98, (byte) 0xa8, (byte) 0xef, (byte) 0xe8, (byte) 0xc4, (byte) 0x96,
-            (byte) 0x6d, (byte) 0x38, (byte) 0xab, (byte) 0x26, (byte) 0x6d, (byte) 0x30,
-            (byte) 0xc2, (byte) 0xa0, (byte) 0x44, (byte) 0xe4, (byte) 0xff, (byte) 0x7e,
-            (byte) 0xbe, (byte) 0x7c, (byte) 0x33, (byte) 0xa5, (byte) 0x10, (byte) 0xad,
-            (byte) 0xd7, (byte) 0x1e, (byte) 0x13, (byte) 0x20, (byte) 0xb3, (byte) 0x1f,
-            (byte) 0x41, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xf1, (byte) 0x89,
-            (byte) 0x07, (byte) 0x0f, (byte) 0xe8, (byte) 0xcf, (byte) 0xab, (byte) 0x13,
-            (byte) 0x2a, (byte) 0x8f, (byte) 0x88, (byte) 0x80, (byte) 0x11, (byte) 0x9a,
-            (byte) 0x79, (byte) 0xb6, (byte) 0x59, (byte) 0x3a, (byte) 0x50, (byte) 0x6e,
-            (byte) 0x57, (byte) 0x37, (byte) 0xab, (byte) 0x2a, (byte) 0xd2, (byte) 0xaa,
-            (byte) 0xd9, (byte) 0x72, (byte) 0x73, (byte) 0xff, (byte) 0x8b, (byte) 0x47,
-            (byte) 0x76, (byte) 0xdd, (byte) 0xdc, (byte) 0xf5, (byte) 0x97, (byte) 0x44,
-            (byte) 0x3a, (byte) 0x78, (byte) 0xbe, (byte) 0x17, (byte) 0xb4, (byte) 0x22,
-            (byte) 0x6f, (byte) 0xe5, (byte) 0x23, (byte) 0x70, (byte) 0x1d, (byte) 0x10,
-            (byte) 0x5d, (byte) 0xba, (byte) 0x16, (byte) 0x81, (byte) 0xf1, (byte) 0x45,
-            (byte) 0xce, (byte) 0x30, (byte) 0xb4, (byte) 0xab, (byte) 0x80, (byte) 0xe4,
-            (byte) 0x98, (byte) 0x31, (byte) 0x02, (byte) 0x41, (byte) 0x00, (byte) 0xda,
-            (byte) 0x82, (byte) 0x9d, (byte) 0x3f, (byte) 0xca, (byte) 0x2f, (byte) 0xe1,
-            (byte) 0xd4, (byte) 0x86, (byte) 0x77, (byte) 0x48, (byte) 0xa6, (byte) 0xab,
-            (byte) 0xab, (byte) 0x1c, (byte) 0x42, (byte) 0x5c, (byte) 0xd5, (byte) 0xc7,
-            (byte) 0x46, (byte) 0x59, (byte) 0x91, (byte) 0x3f, (byte) 0xfc, (byte) 0xcc,
-            (byte) 0xec, (byte) 0xc2, (byte) 0x40, (byte) 0x12, (byte) 0x2c, (byte) 0x8d,
-            (byte) 0x1f, (byte) 0xa2, (byte) 0x18, (byte) 0x88, (byte) 0xee, (byte) 0x82,
-            (byte) 0x4a, (byte) 0x5a, (byte) 0x5e, (byte) 0x88, (byte) 0x20, (byte) 0xe3,
-            (byte) 0x7b, (byte) 0xe0, (byte) 0xd8, (byte) 0x3a, (byte) 0x52, (byte) 0x9a,
-            (byte) 0x26, (byte) 0x6a, (byte) 0x04, (byte) 0xec, (byte) 0xe8, (byte) 0xb9,
-            (byte) 0x48, (byte) 0x40, (byte) 0xe1, (byte) 0xe1, (byte) 0x83, (byte) 0xa6,
-            (byte) 0x67, (byte) 0xa6, (byte) 0xfd, (byte) 0x02, (byte) 0x41, (byte) 0x00,
-            (byte) 0x89, (byte) 0x72, (byte) 0x3e, (byte) 0xb0, (byte) 0x90, (byte) 0xfd,
-            (byte) 0x4c, (byte) 0x0e, (byte) 0xd6, (byte) 0x13, (byte) 0x63, (byte) 0xcb,
-            (byte) 0xed, (byte) 0x38, (byte) 0x88, (byte) 0xb6, (byte) 0x79, (byte) 0xc4,
-            (byte) 0x33, (byte) 0x6c, (byte) 0xf6, (byte) 0xf8, (byte) 0xd8, (byte) 0xd0,
-            (byte) 0xbf, (byte) 0x9d, (byte) 0x35, (byte) 0xac, (byte) 0x69, (byte) 0xd2,
-            (byte) 0x2b, (byte) 0xc1, (byte) 0xf9, (byte) 0x24, (byte) 0x7b, (byte) 0xce,
-            (byte) 0xcd, (byte) 0xcb, (byte) 0xa7, (byte) 0xb2, (byte) 0x7a, (byte) 0x0a,
-            (byte) 0x27, (byte) 0x19, (byte) 0xc9, (byte) 0xaf, (byte) 0x0d, (byte) 0x21,
-            (byte) 0x89, (byte) 0x88, (byte) 0x7c, (byte) 0xad, (byte) 0x9e, (byte) 0x8d,
-            (byte) 0x47, (byte) 0x6d, (byte) 0x3f, (byte) 0xce, (byte) 0x7b, (byte) 0xa1,
-            (byte) 0x74, (byte) 0xf1, (byte) 0xa0, (byte) 0xa1, (byte) 0x02, (byte) 0x41,
-            (byte) 0x00, (byte) 0xd9, (byte) 0xa8, (byte) 0xf5, (byte) 0xfe, (byte) 0xce,
-            (byte) 0xe6, (byte) 0x77, (byte) 0x6b, (byte) 0xfe, (byte) 0x2d, (byte) 0xe0,
-            (byte) 0x1e, (byte) 0xb6, (byte) 0x2e, (byte) 0x12, (byte) 0x4e, (byte) 0x40,
-            (byte) 0xaf, (byte) 0x6a, (byte) 0x7b, (byte) 0x37, (byte) 0x49, (byte) 0x2a,
-            (byte) 0x96, (byte) 0x25, (byte) 0x83, (byte) 0x49, (byte) 0xd4, (byte) 0x0c,
-            (byte) 0xc6, (byte) 0x78, (byte) 0x25, (byte) 0x24, (byte) 0x90, (byte) 0x90,
-            (byte) 0x06, (byte) 0x15, (byte) 0x9e, (byte) 0xfe, (byte) 0xf9, (byte) 0xdf,
-            (byte) 0x5b, (byte) 0xf3, (byte) 0x7e, (byte) 0x38, (byte) 0x70, (byte) 0xeb,
-            (byte) 0x57, (byte) 0xd0, (byte) 0xd9, (byte) 0xa7, (byte) 0x0e, (byte) 0x14,
-            (byte) 0xf7, (byte) 0x95, (byte) 0x68, (byte) 0xd5, (byte) 0xc8, (byte) 0xab,
-            (byte) 0x9d, (byte) 0x3a, (byte) 0x2b, (byte) 0x51, (byte) 0xf9, (byte) 0x02,
-            (byte) 0x41, (byte) 0x00, (byte) 0x96, (byte) 0xdf, (byte) 0xe9, (byte) 0x67,
-            (byte) 0x6c, (byte) 0xdc, (byte) 0x90, (byte) 0x14, (byte) 0xb4, (byte) 0x1d,
-            (byte) 0x22, (byte) 0x33, (byte) 0x4a, (byte) 0x31, (byte) 0xc1, (byte) 0x9d,
-            (byte) 0x2e, (byte) 0xff, (byte) 0x9a, (byte) 0x2a, (byte) 0x95, (byte) 0x4b,
-            (byte) 0x27, (byte) 0x74, (byte) 0xcb, (byte) 0x21, (byte) 0xc3, (byte) 0xd2,
-            (byte) 0x0b, (byte) 0xb2, (byte) 0x46, (byte) 0x87, (byte) 0xf8, (byte) 0x28,
-            (byte) 0x01, (byte) 0x8b, (byte) 0xd8, (byte) 0xb9, (byte) 0x4b, (byte) 0xcd,
-            (byte) 0x9a, (byte) 0x96, (byte) 0x41, (byte) 0x0e, (byte) 0x36, (byte) 0x6d,
-            (byte) 0x40, (byte) 0x42, (byte) 0xbc, (byte) 0xd9, (byte) 0xd3, (byte) 0x7b,
-            (byte) 0xbc, (byte) 0xa7, (byte) 0x92, (byte) 0x90, (byte) 0xdd, (byte) 0xa1,
-            (byte) 0x9c, (byte) 0xce, (byte) 0xa1, (byte) 0x87, (byte) 0x11, (byte) 0x51
-    };
-    public static final PrivateKey RSA_KEY1 = loadPrivateKey("RSA", FAKE_RSA_KEY_1);
-
-    private static final String CA_SUITE_B_RSA3072_CERT_STRING =
-            "-----BEGIN CERTIFICATE-----\n"
-                    + "MIIEnTCCAwWgAwIBAgIUD87Y8fFLzLr1HQ/64aEnjNq2R/4wDQYJKoZIhvcNAQEM\n"
-                    + "BQAwXjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANNVFYxEDAO\n"
-                    + "BgNVBAoMB0FuZHJvaWQxDjAMBgNVBAsMBVdpLUZpMRIwEAYDVQQDDAl1bml0ZXN0\n"
-                    + "Q0EwHhcNMjAwNzIxMDIxNzU0WhcNMzAwNTMwMDIxNzU0WjBeMQswCQYDVQQGEwJV\n"
-                    + "UzELMAkGA1UECAwCQ0ExDDAKBgNVBAcMA01UVjEQMA4GA1UECgwHQW5kcm9pZDEO\n"
-                    + "MAwGA1UECwwFV2ktRmkxEjAQBgNVBAMMCXVuaXRlc3RDQTCCAaIwDQYJKoZIhvcN\n"
-                    + "AQEBBQADggGPADCCAYoCggGBAMtrsT0otlxh0QS079KpRRbU1PQjCihSoltXnrxF\n"
-                    + "sTWZs2weVEeYVyYU5LaauCDDgISCMtjtfbfylMBeYjpWB5hYzYQOiTzo0anWhMyb\n"
-                    + "Ngb7gpMVZuIl6lwMYRyVRKwHWnTo2EUg1ZzW5rGe5fs/KHj6//hoNFm+3Oju0TQd\n"
-                    + "nraQULpoERPF5B7p85Cssk8uNbviBfZXvtCuJ4N6w7PNceOY/9bbwc1mC+pPZmzV\n"
-                    + "SOAg0vvbIQRzChm63C3jBC3xmxSOOZVrKN4zKDG2s8P0oCNGt0NlgRMrgbPRekzg\n"
-                    + "4avkbA0vTuc2AyriTEYkdea/Mt4EpRg9XuOb43U/GJ/d/vQv2/9fsxhXmsZrn8kr\n"
-                    + "Qo5MMHJFUd96GgHmvYSU3Mf/5r8gF626lvqHioGuTAuHUSnr02ri1WUxZ15LDRgY\n"
-                    + "quMjDCFZfucjJPDAdtiHcFSej/4SLJlN39z8oKKNPn3aL9Gv49oAKs9S8tfDVzMk\n"
-                    + "fDLROQFHFuW715GnnMgEAoOpRwIDAQABo1MwUTAdBgNVHQ4EFgQUeVuGmSVN4ARs\n"
-                    + "mesUMWSJ2qWLbxUwHwYDVR0jBBgwFoAUeVuGmSVN4ARsmesUMWSJ2qWLbxUwDwYD\n"
-                    + "VR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQwFAAOCAYEAit1Lo/hegZpPuT9dlWZJ\n"
-                    + "bC8JvAf95O8lnn6LFb69pgYOHCLgCIlvYXu9rdBUJgZo+V1MzJJljiO6RxWRfKbQ\n"
-                    + "8WBYkoqR1EqriR3Kn8q/SjIZCdFSaznTyU1wQMveBQ6RJWXSUhYVfE9RjyFTp7B4\n"
-                    + "UyH2uCluR/0T06HQNGfH5XpIYQqCk1Zgng5lmEmheLDPoJpa92lKeQFJMC6eYz9g\n"
-                    + "lF1GHxPxkPfbMJ6ZDp5X6Yopu6Q6uEXhVKM/iQVcgzRkx9rid+xTYl+nOKyK/XfC\n"
-                    + "z8P0/TFIoPTW02DLge5wKagdoCpy1B7HdrAXyUjoH4B8MsUkq3kYPFSjPzScuTtV\n"
-                    + "kUuDw5ipCNeXCRnhbYqRDk6PX5GUu2cmN9jtaH3tbgm3fKNOsd/BO1fLIl7qjXlR\n"
-                    + "27HHbC0JXjNvlm2DLp23v4NTxS7WZGYsxyUj5DZrxBxqCsTXu/01w1BrQKWKh9FM\n"
-                    + "aVrlA8omfVODK2CSuw+KhEMHepRv/AUgsLl4L4+RMoa+\n"
-                    + "-----END CERTIFICATE-----\n";
-    public static final X509Certificate CA_SUITE_B_RSA3072_CERT =
-            loadCertificate(CA_SUITE_B_RSA3072_CERT_STRING);
-
-    private static final String CA_SUITE_B_ECDSA_CERT_STRING =
-            "-----BEGIN CERTIFICATE-----\n"
-                    + "MIICTzCCAdSgAwIBAgIUdnLttwNPnQzFufplGOr9bTrGCqMwCgYIKoZIzj0EAwMw\n"
-                    + "XjELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMQwwCgYDVQQHDANNVFYxEDAOBgNV\n"
-                    + "BAoMB0FuZHJvaWQxDjAMBgNVBAsMBVdpLUZpMRIwEAYDVQQDDAl1bml0ZXN0Q0Ew\n"
-                    + "HhcNMjAwNzIxMDIyNDA1WhcNMzAwNTMwMDIyNDA1WjBeMQswCQYDVQQGEwJVUzEL\n"
-                    + "MAkGA1UECAwCQ0ExDDAKBgNVBAcMA01UVjEQMA4GA1UECgwHQW5kcm9pZDEOMAwG\n"
-                    + "A1UECwwFV2ktRmkxEjAQBgNVBAMMCXVuaXRlc3RDQTB2MBAGByqGSM49AgEGBSuB\n"
-                    + "BAAiA2IABFmntXwk9icqhDQFUP1xy04WyEpaGW4q6Q+8pujlSl/X3iotPZ++GZfp\n"
-                    + "Mfv3YDHDBl6sELPQ2BEjyPXmpsKjOUdiUe69e88oGEdeqT2xXiQ6uzpTfJD4170i\n"
-                    + "O/TwLrQGKKNTMFEwHQYDVR0OBBYEFCjptsX3g4g5W0L4oEP6N3gfyiZXMB8GA1Ud\n"
-                    + "IwQYMBaAFCjptsX3g4g5W0L4oEP6N3gfyiZXMA8GA1UdEwEB/wQFMAMBAf8wCgYI\n"
-                    + "KoZIzj0EAwMDaQAwZgIxAK61brUYRbLmQKiaEboZgrHtnPAcGo7Yzx3MwHecx3Dm\n"
-                    + "5soIeLVYc8bPYN1pbhXW1gIxALdEe2sh03nBHyQH4adYoZungoCwt8mp/7sJFxou\n"
-                    + "9UnRegyBgGzf74ROWdpZHzh+Pg==\n"
-                    + "-----END CERTIFICATE-----\n";
-    public static final X509Certificate CA_SUITE_B_ECDSA_CERT =
-            loadCertificate(CA_SUITE_B_ECDSA_CERT_STRING);
-
-    private static final String CLIENT_SUITE_B_RSA3072_CERT_STRING =
-            "-----BEGIN CERTIFICATE-----\n"
-                    + "MIIERzCCAq8CFDopjyNgaj+c2TN2k06h7okEWpHJMA0GCSqGSIb3DQEBDAUAMF4x\n"
-                    + "CzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDTVRWMRAwDgYDVQQK\n"
-                    + "DAdBbmRyb2lkMQ4wDAYDVQQLDAVXaS1GaTESMBAGA1UEAwwJdW5pdGVzdENBMB4X\n"
-                    + "DTIwMDcyMTAyMjkxMVoXDTMwMDUzMDAyMjkxMVowYjELMAkGA1UEBhMCVVMxCzAJ\n"
-                    + "BgNVBAgMAkNBMQwwCgYDVQQHDANNVFYxEDAOBgNVBAoMB0FuZHJvaWQxDjAMBgNV\n"
-                    + "BAsMBVdpLUZpMRYwFAYDVQQDDA11bml0ZXN0Q2xpZW50MIIBojANBgkqhkiG9w0B\n"
-                    + "AQEFAAOCAY8AMIIBigKCAYEAwSK3C5K5udtCKTnE14e8z2cZvwmB4Xe+a8+7QLud\n"
-                    + "Hooc/lQzClgK4MbVUC0D3FE+U32C78SxKoTaRWtvPmNm+UaFT8KkwyUno/dv+2XD\n"
-                    + "pd/zARQ+3FwAfWopAhEyCVSxwsCa+slQ4juRIMIuUC1Mm0NaptZyM3Tj/ICQEfpk\n"
-                    + "o9qVIbiK6eoJMTkY8EWfAn7RTFdfR1OLuO0mVOjgLW9/+upYv6hZ19nAMAxw4QTJ\n"
-                    + "x7lLwALX7B+tDYNEZHDqYL2zyvQWAj2HClere8QYILxkvktgBg2crEJJe4XbDH7L\n"
-                    + "A3rrXmsiqf1ZbfFFEzK9NFqovL+qGh+zIP+588ShJFO9H/RDnDpiTnAFTWXQdTwg\n"
-                    + "szSS0Vw2PB+JqEABAa9DeMvXT1Oy+NY3ItPHyy63nQZVI2rXANw4NhwS0Z6DF+Qs\n"
-                    + "TNrj+GU7e4SG/EGR8SvldjYfQTWFLg1l/UT1hOOkQZwdsaW1zgKyeuiFB2KdMmbA\n"
-                    + "Sq+Ux1L1KICo0IglwWcB/8nnAgMBAAEwDQYJKoZIhvcNAQEMBQADggGBAMYwJkNw\n"
-                    + "BaCviKFmReDTMwWPRy4AMNViEeqAXgERwDEKwM7efjsaj5gctWfKsxX6UdLzkhgg\n"
-                    + "6S/T6PxVWKzJ6l7SoOuTa6tMQOZp+h3R1mdfEQbw8B5cXBxZ+batzAai6Fiy1FKS\n"
-                    + "/ka3INbcGfYuIYghfTrb4/NJKN06ZaQ1bpPwq0e4gN7800T2nbawvSf7r+8ZLcG3\n"
-                    + "6bGCjRMwDSIipNvOwoj3TG315XC7TccX5difQ4sKOY+d2MkVJ3RiO0Ciw2ZbEW8d\n"
-                    + "1FH5vUQJWnBUfSFznosGzLwH3iWfqlP+27jNE+qB2igEwCRFgVAouURx5ou43xuX\n"
-                    + "qf6JkdI3HTJGLIWxkp7gOeln4dEaYzKjYw+P0VqJvKVqQ0IXiLjHgE0J9p0vgyD6\n"
-                    + "HVVcP7U8RgqrbIjL1QgHU4KBhGi+WSUh/mRplUCNvHgcYdcHi/gHpj/j6ubwqIGV\n"
-                    + "z4iSolAHYTmBWcLyE0NgpzE6ntp+53r2KaUJA99l2iGVzbWTwqPSm0XAVw==\n"
-                    + "-----END CERTIFICATE-----\n";
-    public static final X509Certificate CLIENT_SUITE_B_RSA3072_CERT =
-            loadCertificate(CLIENT_SUITE_B_RSA3072_CERT_STRING);
-
-    private static final byte[] CLIENT_SUITE_B_RSA3072_KEY_DATA = new byte[]{
-            (byte) 0x30, (byte) 0x82, (byte) 0x06, (byte) 0xfe, (byte) 0x02, (byte) 0x01,
-            (byte) 0x00, (byte) 0x30, (byte) 0x0d, (byte) 0x06, (byte) 0x09, (byte) 0x2a,
-            (byte) 0x86, (byte) 0x48, (byte) 0x86, (byte) 0xf7, (byte) 0x0d, (byte) 0x01,
-            (byte) 0x01, (byte) 0x01, (byte) 0x05, (byte) 0x00, (byte) 0x04, (byte) 0x82,
-            (byte) 0x06, (byte) 0xe8, (byte) 0x30, (byte) 0x82, (byte) 0x06, (byte) 0xe4,
-            (byte) 0x02, (byte) 0x01, (byte) 0x00, (byte) 0x02, (byte) 0x82, (byte) 0x01,
-            (byte) 0x81, (byte) 0x00, (byte) 0xc1, (byte) 0x22, (byte) 0xb7, (byte) 0x0b,
-            (byte) 0x92, (byte) 0xb9, (byte) 0xb9, (byte) 0xdb, (byte) 0x42, (byte) 0x29,
-            (byte) 0x39, (byte) 0xc4, (byte) 0xd7, (byte) 0x87, (byte) 0xbc, (byte) 0xcf,
-            (byte) 0x67, (byte) 0x19, (byte) 0xbf, (byte) 0x09, (byte) 0x81, (byte) 0xe1,
-            (byte) 0x77, (byte) 0xbe, (byte) 0x6b, (byte) 0xcf, (byte) 0xbb, (byte) 0x40,
-            (byte) 0xbb, (byte) 0x9d, (byte) 0x1e, (byte) 0x8a, (byte) 0x1c, (byte) 0xfe,
-            (byte) 0x54, (byte) 0x33, (byte) 0x0a, (byte) 0x58, (byte) 0x0a, (byte) 0xe0,
-            (byte) 0xc6, (byte) 0xd5, (byte) 0x50, (byte) 0x2d, (byte) 0x03, (byte) 0xdc,
-            (byte) 0x51, (byte) 0x3e, (byte) 0x53, (byte) 0x7d, (byte) 0x82, (byte) 0xef,
-            (byte) 0xc4, (byte) 0xb1, (byte) 0x2a, (byte) 0x84, (byte) 0xda, (byte) 0x45,
-            (byte) 0x6b, (byte) 0x6f, (byte) 0x3e, (byte) 0x63, (byte) 0x66, (byte) 0xf9,
-            (byte) 0x46, (byte) 0x85, (byte) 0x4f, (byte) 0xc2, (byte) 0xa4, (byte) 0xc3,
-            (byte) 0x25, (byte) 0x27, (byte) 0xa3, (byte) 0xf7, (byte) 0x6f, (byte) 0xfb,
-            (byte) 0x65, (byte) 0xc3, (byte) 0xa5, (byte) 0xdf, (byte) 0xf3, (byte) 0x01,
-            (byte) 0x14, (byte) 0x3e, (byte) 0xdc, (byte) 0x5c, (byte) 0x00, (byte) 0x7d,
-            (byte) 0x6a, (byte) 0x29, (byte) 0x02, (byte) 0x11, (byte) 0x32, (byte) 0x09,
-            (byte) 0x54, (byte) 0xb1, (byte) 0xc2, (byte) 0xc0, (byte) 0x9a, (byte) 0xfa,
-            (byte) 0xc9, (byte) 0x50, (byte) 0xe2, (byte) 0x3b, (byte) 0x91, (byte) 0x20,
-            (byte) 0xc2, (byte) 0x2e, (byte) 0x50, (byte) 0x2d, (byte) 0x4c, (byte) 0x9b,
-            (byte) 0x43, (byte) 0x5a, (byte) 0xa6, (byte) 0xd6, (byte) 0x72, (byte) 0x33,
-            (byte) 0x74, (byte) 0xe3, (byte) 0xfc, (byte) 0x80, (byte) 0x90, (byte) 0x11,
-            (byte) 0xfa, (byte) 0x64, (byte) 0xa3, (byte) 0xda, (byte) 0x95, (byte) 0x21,
-            (byte) 0xb8, (byte) 0x8a, (byte) 0xe9, (byte) 0xea, (byte) 0x09, (byte) 0x31,
-            (byte) 0x39, (byte) 0x18, (byte) 0xf0, (byte) 0x45, (byte) 0x9f, (byte) 0x02,
-            (byte) 0x7e, (byte) 0xd1, (byte) 0x4c, (byte) 0x57, (byte) 0x5f, (byte) 0x47,
-            (byte) 0x53, (byte) 0x8b, (byte) 0xb8, (byte) 0xed, (byte) 0x26, (byte) 0x54,
-            (byte) 0xe8, (byte) 0xe0, (byte) 0x2d, (byte) 0x6f, (byte) 0x7f, (byte) 0xfa,
-            (byte) 0xea, (byte) 0x58, (byte) 0xbf, (byte) 0xa8, (byte) 0x59, (byte) 0xd7,
-            (byte) 0xd9, (byte) 0xc0, (byte) 0x30, (byte) 0x0c, (byte) 0x70, (byte) 0xe1,
-            (byte) 0x04, (byte) 0xc9, (byte) 0xc7, (byte) 0xb9, (byte) 0x4b, (byte) 0xc0,
-            (byte) 0x02, (byte) 0xd7, (byte) 0xec, (byte) 0x1f, (byte) 0xad, (byte) 0x0d,
-            (byte) 0x83, (byte) 0x44, (byte) 0x64, (byte) 0x70, (byte) 0xea, (byte) 0x60,
-            (byte) 0xbd, (byte) 0xb3, (byte) 0xca, (byte) 0xf4, (byte) 0x16, (byte) 0x02,
-            (byte) 0x3d, (byte) 0x87, (byte) 0x0a, (byte) 0x57, (byte) 0xab, (byte) 0x7b,
-            (byte) 0xc4, (byte) 0x18, (byte) 0x20, (byte) 0xbc, (byte) 0x64, (byte) 0xbe,
-            (byte) 0x4b, (byte) 0x60, (byte) 0x06, (byte) 0x0d, (byte) 0x9c, (byte) 0xac,
-            (byte) 0x42, (byte) 0x49, (byte) 0x7b, (byte) 0x85, (byte) 0xdb, (byte) 0x0c,
-            (byte) 0x7e, (byte) 0xcb, (byte) 0x03, (byte) 0x7a, (byte) 0xeb, (byte) 0x5e,
-            (byte) 0x6b, (byte) 0x22, (byte) 0xa9, (byte) 0xfd, (byte) 0x59, (byte) 0x6d,
-            (byte) 0xf1, (byte) 0x45, (byte) 0x13, (byte) 0x32, (byte) 0xbd, (byte) 0x34,
-            (byte) 0x5a, (byte) 0xa8, (byte) 0xbc, (byte) 0xbf, (byte) 0xaa, (byte) 0x1a,
-            (byte) 0x1f, (byte) 0xb3, (byte) 0x20, (byte) 0xff, (byte) 0xb9, (byte) 0xf3,
-            (byte) 0xc4, (byte) 0xa1, (byte) 0x24, (byte) 0x53, (byte) 0xbd, (byte) 0x1f,
-            (byte) 0xf4, (byte) 0x43, (byte) 0x9c, (byte) 0x3a, (byte) 0x62, (byte) 0x4e,
-            (byte) 0x70, (byte) 0x05, (byte) 0x4d, (byte) 0x65, (byte) 0xd0, (byte) 0x75,
-            (byte) 0x3c, (byte) 0x20, (byte) 0xb3, (byte) 0x34, (byte) 0x92, (byte) 0xd1,
-            (byte) 0x5c, (byte) 0x36, (byte) 0x3c, (byte) 0x1f, (byte) 0x89, (byte) 0xa8,
-            (byte) 0x40, (byte) 0x01, (byte) 0x01, (byte) 0xaf, (byte) 0x43, (byte) 0x78,
-            (byte) 0xcb, (byte) 0xd7, (byte) 0x4f, (byte) 0x53, (byte) 0xb2, (byte) 0xf8,
-            (byte) 0xd6, (byte) 0x37, (byte) 0x22, (byte) 0xd3, (byte) 0xc7, (byte) 0xcb,
-            (byte) 0x2e, (byte) 0xb7, (byte) 0x9d, (byte) 0x06, (byte) 0x55, (byte) 0x23,
-            (byte) 0x6a, (byte) 0xd7, (byte) 0x00, (byte) 0xdc, (byte) 0x38, (byte) 0x36,
-            (byte) 0x1c, (byte) 0x12, (byte) 0xd1, (byte) 0x9e, (byte) 0x83, (byte) 0x17,
-            (byte) 0xe4, (byte) 0x2c, (byte) 0x4c, (byte) 0xda, (byte) 0xe3, (byte) 0xf8,
-            (byte) 0x65, (byte) 0x3b, (byte) 0x7b, (byte) 0x84, (byte) 0x86, (byte) 0xfc,
-            (byte) 0x41, (byte) 0x91, (byte) 0xf1, (byte) 0x2b, (byte) 0xe5, (byte) 0x76,
-            (byte) 0x36, (byte) 0x1f, (byte) 0x41, (byte) 0x35, (byte) 0x85, (byte) 0x2e,
-            (byte) 0x0d, (byte) 0x65, (byte) 0xfd, (byte) 0x44, (byte) 0xf5, (byte) 0x84,
-            (byte) 0xe3, (byte) 0xa4, (byte) 0x41, (byte) 0x9c, (byte) 0x1d, (byte) 0xb1,
-            (byte) 0xa5, (byte) 0xb5, (byte) 0xce, (byte) 0x02, (byte) 0xb2, (byte) 0x7a,
-            (byte) 0xe8, (byte) 0x85, (byte) 0x07, (byte) 0x62, (byte) 0x9d, (byte) 0x32,
-            (byte) 0x66, (byte) 0xc0, (byte) 0x4a, (byte) 0xaf, (byte) 0x94, (byte) 0xc7,
-            (byte) 0x52, (byte) 0xf5, (byte) 0x28, (byte) 0x80, (byte) 0xa8, (byte) 0xd0,
-            (byte) 0x88, (byte) 0x25, (byte) 0xc1, (byte) 0x67, (byte) 0x01, (byte) 0xff,
-            (byte) 0xc9, (byte) 0xe7, (byte) 0x02, (byte) 0x03, (byte) 0x01, (byte) 0x00,
-            (byte) 0x01, (byte) 0x02, (byte) 0x82, (byte) 0x01, (byte) 0x80, (byte) 0x04,
-            (byte) 0xb1, (byte) 0xcc, (byte) 0x53, (byte) 0x3a, (byte) 0xb0, (byte) 0xcb,
-            (byte) 0x04, (byte) 0xba, (byte) 0x59, (byte) 0xf8, (byte) 0x2e, (byte) 0x81,
-            (byte) 0xb2, (byte) 0xa9, (byte) 0xf3, (byte) 0x3c, (byte) 0xa5, (byte) 0x52,
-            (byte) 0x90, (byte) 0x6f, (byte) 0x98, (byte) 0xc4, (byte) 0x69, (byte) 0x5b,
-            (byte) 0x83, (byte) 0x84, (byte) 0x20, (byte) 0xb1, (byte) 0xae, (byte) 0xc3,
-            (byte) 0x04, (byte) 0x46, (byte) 0x6a, (byte) 0x24, (byte) 0x2f, (byte) 0xcd,
-            (byte) 0x6b, (byte) 0x90, (byte) 0x70, (byte) 0x20, (byte) 0x45, (byte) 0x25,
-            (byte) 0x1a, (byte) 0xc3, (byte) 0x02, (byte) 0x42, (byte) 0xf3, (byte) 0x49,
-            (byte) 0xe2, (byte) 0x3e, (byte) 0x21, (byte) 0x87, (byte) 0xdd, (byte) 0x6a,
-            (byte) 0x94, (byte) 0x2a, (byte) 0x1e, (byte) 0x0f, (byte) 0xdb, (byte) 0x77,
-            (byte) 0x5f, (byte) 0xc1, (byte) 0x2c, (byte) 0x03, (byte) 0xfb, (byte) 0xcf,
-            (byte) 0x91, (byte) 0x82, (byte) 0xa1, (byte) 0xbf, (byte) 0xb0, (byte) 0x73,
-            (byte) 0xfa, (byte) 0xda, (byte) 0xbc, (byte) 0xf8, (byte) 0x9f, (byte) 0x45,
-            (byte) 0xd3, (byte) 0xe8, (byte) 0xbb, (byte) 0x38, (byte) 0xfb, (byte) 0xc2,
-            (byte) 0x2d, (byte) 0x76, (byte) 0x51, (byte) 0x96, (byte) 0x18, (byte) 0x03,
-            (byte) 0x15, (byte) 0xd9, (byte) 0xea, (byte) 0x82, (byte) 0x25, (byte) 0x83,
-            (byte) 0xff, (byte) 0x5c, (byte) 0x85, (byte) 0x06, (byte) 0x09, (byte) 0xb2,
-            (byte) 0x46, (byte) 0x12, (byte) 0x64, (byte) 0x02, (byte) 0x74, (byte) 0x4f,
-            (byte) 0xbc, (byte) 0x9a, (byte) 0x25, (byte) 0x18, (byte) 0x01, (byte) 0x07,
-            (byte) 0x17, (byte) 0x25, (byte) 0x55, (byte) 0x7c, (byte) 0xdc, (byte) 0xe1,
-            (byte) 0xd1, (byte) 0x5a, (byte) 0x2f, (byte) 0x25, (byte) 0xaf, (byte) 0xf6,
-            (byte) 0x8f, (byte) 0xa4, (byte) 0x9a, (byte) 0x5a, (byte) 0x3a, (byte) 0xfe,
-            (byte) 0x2e, (byte) 0x93, (byte) 0x24, (byte) 0xa0, (byte) 0x27, (byte) 0xac,
-            (byte) 0x07, (byte) 0x75, (byte) 0x33, (byte) 0x01, (byte) 0x54, (byte) 0x23,
-            (byte) 0x0f, (byte) 0xe8, (byte) 0x9f, (byte) 0xfa, (byte) 0x36, (byte) 0xe6,
-            (byte) 0x3a, (byte) 0xd5, (byte) 0x78, (byte) 0xb0, (byte) 0xe4, (byte) 0x6a,
-            (byte) 0x16, (byte) 0x50, (byte) 0xbd, (byte) 0x0f, (byte) 0x9f, (byte) 0x32,
-            (byte) 0xa1, (byte) 0x6b, (byte) 0xf5, (byte) 0xa4, (byte) 0x34, (byte) 0x58,
-            (byte) 0xb6, (byte) 0xa4, (byte) 0xb3, (byte) 0xc3, (byte) 0x83, (byte) 0x08,
-            (byte) 0x18, (byte) 0xc7, (byte) 0xef, (byte) 0x95, (byte) 0xe2, (byte) 0x1b,
-            (byte) 0xba, (byte) 0x35, (byte) 0x61, (byte) 0xa3, (byte) 0xb4, (byte) 0x30,
-            (byte) 0xe0, (byte) 0xd1, (byte) 0xc1, (byte) 0xa2, (byte) 0x3a, (byte) 0xc6,
-            (byte) 0xb4, (byte) 0xd2, (byte) 0x80, (byte) 0x5a, (byte) 0xaf, (byte) 0xa4,
-            (byte) 0x54, (byte) 0x3c, (byte) 0x66, (byte) 0x5a, (byte) 0x1c, (byte) 0x4d,
-            (byte) 0xe1, (byte) 0xd9, (byte) 0x98, (byte) 0x44, (byte) 0x01, (byte) 0x1b,
-            (byte) 0x8c, (byte) 0xe9, (byte) 0x80, (byte) 0x54, (byte) 0x83, (byte) 0x3d,
-            (byte) 0x96, (byte) 0x25, (byte) 0x41, (byte) 0x1c, (byte) 0xad, (byte) 0xae,
-            (byte) 0x3b, (byte) 0x7a, (byte) 0xd7, (byte) 0x9d, (byte) 0x10, (byte) 0x7c,
-            (byte) 0xd1, (byte) 0xa7, (byte) 0x96, (byte) 0x39, (byte) 0xa5, (byte) 0x2f,
-            (byte) 0xbe, (byte) 0xc3, (byte) 0x2c, (byte) 0x64, (byte) 0x01, (byte) 0xfe,
-            (byte) 0xa2, (byte) 0xd1, (byte) 0x6a, (byte) 0xcf, (byte) 0x4c, (byte) 0x76,
-            (byte) 0x3b, (byte) 0xc8, (byte) 0x35, (byte) 0x21, (byte) 0xda, (byte) 0x98,
-            (byte) 0xcf, (byte) 0xf9, (byte) 0x29, (byte) 0xff, (byte) 0x30, (byte) 0x59,
-            (byte) 0x36, (byte) 0x53, (byte) 0x0b, (byte) 0xbb, (byte) 0xfa, (byte) 0xba,
-            (byte) 0xc4, (byte) 0x03, (byte) 0x23, (byte) 0xe0, (byte) 0xd3, (byte) 0x33,
-            (byte) 0xff, (byte) 0x32, (byte) 0xdb, (byte) 0x30, (byte) 0x64, (byte) 0xc7,
-            (byte) 0x56, (byte) 0xca, (byte) 0x55, (byte) 0x14, (byte) 0xee, (byte) 0x58,
-            (byte) 0xfe, (byte) 0x96, (byte) 0x7e, (byte) 0x1c, (byte) 0x34, (byte) 0x16,
-            (byte) 0xeb, (byte) 0x76, (byte) 0x26, (byte) 0x48, (byte) 0xe2, (byte) 0xe5,
-            (byte) 0x5c, (byte) 0xd5, (byte) 0x83, (byte) 0x37, (byte) 0xd9, (byte) 0x09,
-            (byte) 0x71, (byte) 0xbc, (byte) 0x54, (byte) 0x25, (byte) 0xca, (byte) 0x2e,
-            (byte) 0xdb, (byte) 0x36, (byte) 0x39, (byte) 0xcc, (byte) 0x3a, (byte) 0x81,
-            (byte) 0x95, (byte) 0x9e, (byte) 0xf4, (byte) 0x01, (byte) 0xa7, (byte) 0xc0,
-            (byte) 0x20, (byte) 0xce, (byte) 0x70, (byte) 0x55, (byte) 0x2c, (byte) 0xe0,
-            (byte) 0x93, (byte) 0x72, (byte) 0xa6, (byte) 0x25, (byte) 0xda, (byte) 0x64,
-            (byte) 0x19, (byte) 0x18, (byte) 0xd2, (byte) 0x31, (byte) 0xe2, (byte) 0x7c,
-            (byte) 0xf2, (byte) 0x30, (byte) 0x9e, (byte) 0x8d, (byte) 0xc6, (byte) 0x14,
-            (byte) 0x8a, (byte) 0x38, (byte) 0xf0, (byte) 0x94, (byte) 0xeb, (byte) 0xf4,
-            (byte) 0x64, (byte) 0x92, (byte) 0x3d, (byte) 0x67, (byte) 0xa6, (byte) 0x2c,
-            (byte) 0x52, (byte) 0xfc, (byte) 0x60, (byte) 0xca, (byte) 0x2a, (byte) 0xcf,
-            (byte) 0x24, (byte) 0xd5, (byte) 0x42, (byte) 0x5f, (byte) 0xc7, (byte) 0x9f,
-            (byte) 0xf3, (byte) 0xb4, (byte) 0xdf, (byte) 0x76, (byte) 0x6e, (byte) 0x53,
-            (byte) 0xa1, (byte) 0x7b, (byte) 0xae, (byte) 0xa5, (byte) 0x84, (byte) 0x1f,
-            (byte) 0xfa, (byte) 0xc0, (byte) 0xb4, (byte) 0x6c, (byte) 0xc9, (byte) 0x02,
-            (byte) 0x81, (byte) 0xc1, (byte) 0x00, (byte) 0xf3, (byte) 0x17, (byte) 0xd9,
-            (byte) 0x48, (byte) 0x17, (byte) 0x87, (byte) 0x84, (byte) 0x16, (byte) 0xea,
-            (byte) 0x2d, (byte) 0x31, (byte) 0x1b, (byte) 0xce, (byte) 0xec, (byte) 0xaf,
-            (byte) 0xdc, (byte) 0x6b, (byte) 0xaf, (byte) 0xc8, (byte) 0xf1, (byte) 0x40,
-            (byte) 0xa7, (byte) 0x4f, (byte) 0xef, (byte) 0x48, (byte) 0x08, (byte) 0x5e,
-            (byte) 0x9a, (byte) 0xd1, (byte) 0xc0, (byte) 0xb1, (byte) 0xfe, (byte) 0xe7,
-            (byte) 0x03, (byte) 0xd5, (byte) 0x96, (byte) 0x01, (byte) 0xe8, (byte) 0x40,
-            (byte) 0xca, (byte) 0x78, (byte) 0xcb, (byte) 0xb3, (byte) 0x28, (byte) 0x1a,
-            (byte) 0xf0, (byte) 0xe5, (byte) 0xf6, (byte) 0x46, (byte) 0xef, (byte) 0xcd,
-            (byte) 0x1a, (byte) 0x0f, (byte) 0x13, (byte) 0x2d, (byte) 0x38, (byte) 0xf8,
-            (byte) 0xf7, (byte) 0x88, (byte) 0x21, (byte) 0x15, (byte) 0xce, (byte) 0x48,
-            (byte) 0xf4, (byte) 0x92, (byte) 0x7e, (byte) 0x9b, (byte) 0x2e, (byte) 0x2f,
-            (byte) 0x22, (byte) 0x3e, (byte) 0x5c, (byte) 0x67, (byte) 0xd7, (byte) 0x58,
-            (byte) 0xf6, (byte) 0xef, (byte) 0x1f, (byte) 0xb4, (byte) 0x04, (byte) 0xc7,
-            (byte) 0xfd, (byte) 0x8c, (byte) 0x4e, (byte) 0x27, (byte) 0x9e, (byte) 0xb9,
-            (byte) 0xef, (byte) 0x0f, (byte) 0xf7, (byte) 0x4a, (byte) 0xc2, (byte) 0xf4,
-            (byte) 0x64, (byte) 0x6b, (byte) 0xe0, (byte) 0xfb, (byte) 0xe3, (byte) 0x45,
-            (byte) 0xd5, (byte) 0x37, (byte) 0xa0, (byte) 0x2a, (byte) 0xc6, (byte) 0xf3,
-            (byte) 0xf6, (byte) 0xcc, (byte) 0xb5, (byte) 0x94, (byte) 0xbf, (byte) 0x56,
-            (byte) 0xa0, (byte) 0x61, (byte) 0x36, (byte) 0x88, (byte) 0x35, (byte) 0xd5,
-            (byte) 0xa5, (byte) 0xad, (byte) 0x20, (byte) 0x48, (byte) 0xda, (byte) 0x70,
-            (byte) 0x35, (byte) 0xd9, (byte) 0x75, (byte) 0x66, (byte) 0xa5, (byte) 0xac,
-            (byte) 0x86, (byte) 0x7a, (byte) 0x75, (byte) 0x49, (byte) 0x88, (byte) 0x40,
-            (byte) 0xce, (byte) 0xb0, (byte) 0x6f, (byte) 0x57, (byte) 0x15, (byte) 0x54,
-            (byte) 0xd3, (byte) 0x2f, (byte) 0x11, (byte) 0x9b, (byte) 0xe3, (byte) 0x87,
-            (byte) 0xc8, (byte) 0x8d, (byte) 0x98, (byte) 0xc6, (byte) 0xe0, (byte) 0xbc,
-            (byte) 0x85, (byte) 0xb9, (byte) 0x04, (byte) 0x43, (byte) 0xa9, (byte) 0x41,
-            (byte) 0xce, (byte) 0x42, (byte) 0x1a, (byte) 0x57, (byte) 0x10, (byte) 0xd8,
-            (byte) 0xe4, (byte) 0x6a, (byte) 0x51, (byte) 0x10, (byte) 0x0a, (byte) 0xec,
-            (byte) 0xe4, (byte) 0x57, (byte) 0xc7, (byte) 0xee, (byte) 0xe9, (byte) 0xd6,
-            (byte) 0xcb, (byte) 0x3e, (byte) 0xba, (byte) 0xfa, (byte) 0xe9, (byte) 0x0e,
-            (byte) 0xed, (byte) 0x87, (byte) 0x04, (byte) 0x9a, (byte) 0x48, (byte) 0xba,
-            (byte) 0xaf, (byte) 0x08, (byte) 0xf5, (byte) 0x02, (byte) 0x81, (byte) 0xc1,
-            (byte) 0x00, (byte) 0xcb, (byte) 0x63, (byte) 0xd6, (byte) 0x54, (byte) 0xb6,
-            (byte) 0xf3, (byte) 0xf3, (byte) 0x8c, (byte) 0xf8, (byte) 0xd0, (byte) 0xd2,
-            (byte) 0x84, (byte) 0xc1, (byte) 0xf5, (byte) 0x12, (byte) 0xe0, (byte) 0x02,
-            (byte) 0x80, (byte) 0x42, (byte) 0x92, (byte) 0x4e, (byte) 0xa4, (byte) 0x5c,
-            (byte) 0xa5, (byte) 0x64, (byte) 0xec, (byte) 0xb7, (byte) 0xdc, (byte) 0xe0,
-            (byte) 0x2d, (byte) 0x5d, (byte) 0xac, (byte) 0x0e, (byte) 0x24, (byte) 0x48,
-            (byte) 0x13, (byte) 0x05, (byte) 0xe8, (byte) 0xff, (byte) 0x96, (byte) 0x93,
-            (byte) 0xba, (byte) 0x3c, (byte) 0x88, (byte) 0xcc, (byte) 0x80, (byte) 0xf9,
-            (byte) 0xdb, (byte) 0xa8, (byte) 0x4d, (byte) 0x86, (byte) 0x47, (byte) 0xc8,
-            (byte) 0xbf, (byte) 0x34, (byte) 0x2d, (byte) 0xda, (byte) 0xb6, (byte) 0x28,
-            (byte) 0xf0, (byte) 0x1e, (byte) 0xd2, (byte) 0x46, (byte) 0x0d, (byte) 0x6f,
-            (byte) 0x36, (byte) 0x8e, (byte) 0x84, (byte) 0xd8, (byte) 0xaf, (byte) 0xf7,
-            (byte) 0x69, (byte) 0x23, (byte) 0x77, (byte) 0xfb, (byte) 0xc5, (byte) 0x04,
-            (byte) 0x08, (byte) 0x18, (byte) 0xac, (byte) 0x85, (byte) 0x80, (byte) 0x87,
-            (byte) 0x1c, (byte) 0xfe, (byte) 0x8e, (byte) 0x5d, (byte) 0x00, (byte) 0x7f,
-            (byte) 0x5b, (byte) 0x33, (byte) 0xf5, (byte) 0xdf, (byte) 0x70, (byte) 0x81,
-            (byte) 0xad, (byte) 0x81, (byte) 0xf4, (byte) 0x5a, (byte) 0x37, (byte) 0x8a,
-            (byte) 0x79, (byte) 0x09, (byte) 0xc5, (byte) 0x55, (byte) 0xab, (byte) 0x58,
-            (byte) 0x7c, (byte) 0x47, (byte) 0xca, (byte) 0xa5, (byte) 0x80, (byte) 0x49,
-            (byte) 0x5f, (byte) 0x71, (byte) 0x83, (byte) 0xfb, (byte) 0x3b, (byte) 0x06,
-            (byte) 0xec, (byte) 0x75, (byte) 0x23, (byte) 0xc4, (byte) 0x32, (byte) 0xc7,
-            (byte) 0x18, (byte) 0xf6, (byte) 0x82, (byte) 0x95, (byte) 0x98, (byte) 0x39,
-            (byte) 0xf7, (byte) 0x92, (byte) 0x31, (byte) 0xc0, (byte) 0x89, (byte) 0xba,
-            (byte) 0xd4, (byte) 0xd4, (byte) 0x58, (byte) 0x4e, (byte) 0x38, (byte) 0x35,
-            (byte) 0x10, (byte) 0xb9, (byte) 0xf1, (byte) 0x27, (byte) 0xdc, (byte) 0xff,
-            (byte) 0xc7, (byte) 0xb2, (byte) 0xba, (byte) 0x1f, (byte) 0x27, (byte) 0xaf,
-            (byte) 0x99, (byte) 0xd5, (byte) 0xb0, (byte) 0x39, (byte) 0xe7, (byte) 0x43,
-            (byte) 0x88, (byte) 0xd3, (byte) 0xce, (byte) 0x38, (byte) 0xc2, (byte) 0x99,
-            (byte) 0x43, (byte) 0xfc, (byte) 0x8a, (byte) 0xe3, (byte) 0x60, (byte) 0x0d,
-            (byte) 0x0a, (byte) 0xb8, (byte) 0xc4, (byte) 0x29, (byte) 0xca, (byte) 0x0d,
-            (byte) 0x30, (byte) 0xaf, (byte) 0xca, (byte) 0xd0, (byte) 0xaa, (byte) 0x67,
-            (byte) 0xb1, (byte) 0xdd, (byte) 0xdb, (byte) 0x7a, (byte) 0x11, (byte) 0xad,
-            (byte) 0xeb, (byte) 0x02, (byte) 0x81, (byte) 0xc0, (byte) 0x71, (byte) 0xb8,
-            (byte) 0xcf, (byte) 0x72, (byte) 0x35, (byte) 0x67, (byte) 0xb5, (byte) 0x38,
-            (byte) 0x8f, (byte) 0x16, (byte) 0xd3, (byte) 0x29, (byte) 0x82, (byte) 0x35,
-            (byte) 0x21, (byte) 0xd4, (byte) 0x49, (byte) 0x20, (byte) 0x74, (byte) 0x2d,
-            (byte) 0xc0, (byte) 0xa4, (byte) 0x44, (byte) 0xf5, (byte) 0xd8, (byte) 0xc9,
-            (byte) 0xe9, (byte) 0x90, (byte) 0x1d, (byte) 0xde, (byte) 0x3a, (byte) 0xa6,
-            (byte) 0xd7, (byte) 0xe5, (byte) 0xe8, (byte) 0x4e, (byte) 0x83, (byte) 0xd7,
-            (byte) 0xe6, (byte) 0x2f, (byte) 0x92, (byte) 0x31, (byte) 0x21, (byte) 0x3f,
-            (byte) 0xfa, (byte) 0xd2, (byte) 0x85, (byte) 0x92, (byte) 0x1f, (byte) 0xff,
-            (byte) 0x61, (byte) 0x00, (byte) 0xf6, (byte) 0xda, (byte) 0x6e, (byte) 0xc6,
-            (byte) 0x7f, (byte) 0x5a, (byte) 0x35, (byte) 0x79, (byte) 0xdc, (byte) 0xdc,
-            (byte) 0xa3, (byte) 0x2e, (byte) 0x9f, (byte) 0x35, (byte) 0xd1, (byte) 0x5c,
-            (byte) 0xda, (byte) 0xb9, (byte) 0xf7, (byte) 0x58, (byte) 0x7d, (byte) 0x4f,
-            (byte) 0xb6, (byte) 0x13, (byte) 0xd7, (byte) 0x2c, (byte) 0x0a, (byte) 0xa8,
-            (byte) 0x4d, (byte) 0xf2, (byte) 0xe4, (byte) 0x67, (byte) 0x4f, (byte) 0x8b,
-            (byte) 0xa6, (byte) 0xca, (byte) 0x1a, (byte) 0xbb, (byte) 0x02, (byte) 0x63,
-            (byte) 0x8f, (byte) 0xb7, (byte) 0x46, (byte) 0xec, (byte) 0x7a, (byte) 0x8a,
-            (byte) 0x09, (byte) 0x0a, (byte) 0x45, (byte) 0x3a, (byte) 0x8d, (byte) 0xa8,
-            (byte) 0x83, (byte) 0x4b, (byte) 0x0a, (byte) 0xdb, (byte) 0x4b, (byte) 0x99,
-            (byte) 0xf3, (byte) 0x69, (byte) 0x95, (byte) 0xf0, (byte) 0xcf, (byte) 0xe9,
-            (byte) 0xf7, (byte) 0x67, (byte) 0xc9, (byte) 0x45, (byte) 0x18, (byte) 0x2f,
-            (byte) 0xf0, (byte) 0x5c, (byte) 0x90, (byte) 0xbd, (byte) 0xa6, (byte) 0x66,
-            (byte) 0x8c, (byte) 0xfe, (byte) 0x60, (byte) 0x5d, (byte) 0x6c, (byte) 0x27,
-            (byte) 0xec, (byte) 0xc1, (byte) 0x84, (byte) 0xb2, (byte) 0xa1, (byte) 0x97,
-            (byte) 0x9e, (byte) 0x16, (byte) 0x29, (byte) 0xa7, (byte) 0xe0, (byte) 0x38,
-            (byte) 0xa2, (byte) 0x36, (byte) 0x05, (byte) 0x5f, (byte) 0xda, (byte) 0x72,
-            (byte) 0x1a, (byte) 0x5f, (byte) 0xa8, (byte) 0x7d, (byte) 0x41, (byte) 0x35,
-            (byte) 0xf6, (byte) 0x4e, (byte) 0x0a, (byte) 0x88, (byte) 0x8e, (byte) 0x00,
-            (byte) 0x98, (byte) 0xa6, (byte) 0xca, (byte) 0xc1, (byte) 0xdf, (byte) 0x72,
-            (byte) 0x6c, (byte) 0xfe, (byte) 0x29, (byte) 0xbe, (byte) 0xa3, (byte) 0x9b,
-            (byte) 0x0b, (byte) 0x5c, (byte) 0x0b, (byte) 0x9d, (byte) 0xa7, (byte) 0x71,
-            (byte) 0xce, (byte) 0x04, (byte) 0xfa, (byte) 0xac, (byte) 0x01, (byte) 0x8d,
-            (byte) 0x52, (byte) 0xa0, (byte) 0x3d, (byte) 0xdd, (byte) 0x02, (byte) 0x81,
-            (byte) 0xc1, (byte) 0x00, (byte) 0xc1, (byte) 0xc0, (byte) 0x2e, (byte) 0xa9,
-            (byte) 0xee, (byte) 0xca, (byte) 0xff, (byte) 0xe4, (byte) 0xf8, (byte) 0x15,
-            (byte) 0xfd, (byte) 0xa5, (byte) 0x68, (byte) 0x1b, (byte) 0x2d, (byte) 0x4a,
-            (byte) 0xe6, (byte) 0x37, (byte) 0x06, (byte) 0xb3, (byte) 0xd7, (byte) 0x64,
-            (byte) 0xad, (byte) 0xb9, (byte) 0x05, (byte) 0x26, (byte) 0x97, (byte) 0x94,
-            (byte) 0x3a, (byte) 0x9e, (byte) 0x1c, (byte) 0xd0, (byte) 0xcd, (byte) 0x7b,
-            (byte) 0xf4, (byte) 0x88, (byte) 0xe2, (byte) 0xa5, (byte) 0x6d, (byte) 0xed,
-            (byte) 0x24, (byte) 0x77, (byte) 0x52, (byte) 0x39, (byte) 0x43, (byte) 0x0f,
-            (byte) 0x4e, (byte) 0x75, (byte) 0xd8, (byte) 0xa3, (byte) 0x59, (byte) 0x5a,
-            (byte) 0xc2, (byte) 0xba, (byte) 0x9a, (byte) 0x5b, (byte) 0x60, (byte) 0x31,
-            (byte) 0x0d, (byte) 0x58, (byte) 0x89, (byte) 0x13, (byte) 0xe8, (byte) 0x95,
-            (byte) 0xdd, (byte) 0xae, (byte) 0xcc, (byte) 0x1f, (byte) 0x73, (byte) 0x48,
-            (byte) 0x55, (byte) 0xd8, (byte) 0xfb, (byte) 0x67, (byte) 0xce, (byte) 0x18,
-            (byte) 0x85, (byte) 0x59, (byte) 0xad, (byte) 0x1f, (byte) 0x93, (byte) 0xe1,
-            (byte) 0xb7, (byte) 0x54, (byte) 0x80, (byte) 0x8e, (byte) 0x5f, (byte) 0xbc,
-            (byte) 0x1c, (byte) 0x96, (byte) 0x66, (byte) 0x2e, (byte) 0x40, (byte) 0x17,
-            (byte) 0x2e, (byte) 0x01, (byte) 0x7a, (byte) 0x7d, (byte) 0xaa, (byte) 0xff,
-            (byte) 0xa3, (byte) 0xd2, (byte) 0xdf, (byte) 0xe2, (byte) 0xf3, (byte) 0x54,
-            (byte) 0x51, (byte) 0xeb, (byte) 0xba, (byte) 0x7c, (byte) 0x2a, (byte) 0x22,
-            (byte) 0xc6, (byte) 0x42, (byte) 0xbc, (byte) 0xa1, (byte) 0x6c, (byte) 0xcf,
-            (byte) 0x73, (byte) 0x2e, (byte) 0x07, (byte) 0xfc, (byte) 0xf5, (byte) 0x67,
-            (byte) 0x25, (byte) 0xd0, (byte) 0xfa, (byte) 0xeb, (byte) 0xb4, (byte) 0xd4,
-            (byte) 0x19, (byte) 0xcc, (byte) 0x64, (byte) 0xa1, (byte) 0x2e, (byte) 0x78,
-            (byte) 0x45, (byte) 0xd9, (byte) 0x7f, (byte) 0x1b, (byte) 0x4c, (byte) 0x10,
-            (byte) 0x31, (byte) 0x44, (byte) 0xe8, (byte) 0xcc, (byte) 0xf9, (byte) 0x1b,
-            (byte) 0x87, (byte) 0x31, (byte) 0xd6, (byte) 0x69, (byte) 0x85, (byte) 0x4a,
-            (byte) 0x49, (byte) 0xf6, (byte) 0xb2, (byte) 0xe0, (byte) 0xb8, (byte) 0x98,
-            (byte) 0x3c, (byte) 0xf6, (byte) 0x78, (byte) 0x46, (byte) 0xc8, (byte) 0x3d,
-            (byte) 0x60, (byte) 0xc1, (byte) 0xaa, (byte) 0x2f, (byte) 0x28, (byte) 0xa1,
-            (byte) 0x14, (byte) 0x6b, (byte) 0x75, (byte) 0x4d, (byte) 0xb1, (byte) 0x3d,
-            (byte) 0x80, (byte) 0x49, (byte) 0x33, (byte) 0xfd, (byte) 0x71, (byte) 0xc0,
-            (byte) 0x13, (byte) 0x1e, (byte) 0x16, (byte) 0x69, (byte) 0x80, (byte) 0xa4,
-            (byte) 0x9c, (byte) 0xd7, (byte) 0x02, (byte) 0x81, (byte) 0xc1, (byte) 0x00,
-            (byte) 0x8c, (byte) 0x33, (byte) 0x2d, (byte) 0xd9, (byte) 0xf3, (byte) 0x42,
-            (byte) 0x4d, (byte) 0xca, (byte) 0x5e, (byte) 0x60, (byte) 0x14, (byte) 0x10,
-            (byte) 0xf6, (byte) 0xf3, (byte) 0x71, (byte) 0x15, (byte) 0x88, (byte) 0x54,
-            (byte) 0x84, (byte) 0x21, (byte) 0x04, (byte) 0xb1, (byte) 0xaf, (byte) 0x02,
-            (byte) 0x11, (byte) 0x7f, (byte) 0x42, (byte) 0x3e, (byte) 0x86, (byte) 0xcb,
-            (byte) 0x6c, (byte) 0xf5, (byte) 0x57, (byte) 0x78, (byte) 0x4a, (byte) 0x03,
-            (byte) 0x9b, (byte) 0x80, (byte) 0xc2, (byte) 0x04, (byte) 0x3a, (byte) 0x6b,
-            (byte) 0xb3, (byte) 0x30, (byte) 0x31, (byte) 0x7e, (byte) 0xc3, (byte) 0x89,
-            (byte) 0x09, (byte) 0x4e, (byte) 0x86, (byte) 0x59, (byte) 0x41, (byte) 0xb5,
-            (byte) 0xae, (byte) 0xd5, (byte) 0xc6, (byte) 0x38, (byte) 0xbc, (byte) 0xd7,
-            (byte) 0xd7, (byte) 0x8e, (byte) 0xa3, (byte) 0x1a, (byte) 0xde, (byte) 0x32,
-            (byte) 0xad, (byte) 0x8d, (byte) 0x15, (byte) 0x81, (byte) 0xfe, (byte) 0xac,
-            (byte) 0xbd, (byte) 0xd0, (byte) 0xca, (byte) 0xbc, (byte) 0xd8, (byte) 0x6a,
-            (byte) 0xe1, (byte) 0xfe, (byte) 0xda, (byte) 0xc4, (byte) 0xd8, (byte) 0x62,
-            (byte) 0x71, (byte) 0x20, (byte) 0xa3, (byte) 0xd3, (byte) 0x06, (byte) 0x11,
-            (byte) 0xa9, (byte) 0x53, (byte) 0x7a, (byte) 0x44, (byte) 0x89, (byte) 0x3d,
-            (byte) 0x28, (byte) 0x5e, (byte) 0x7d, (byte) 0xf0, (byte) 0x60, (byte) 0xeb,
-            (byte) 0xb5, (byte) 0xdf, (byte) 0xed, (byte) 0x4f, (byte) 0x6d, (byte) 0x05,
-            (byte) 0x59, (byte) 0x06, (byte) 0xb0, (byte) 0x62, (byte) 0x50, (byte) 0x1c,
-            (byte) 0xb7, (byte) 0x2c, (byte) 0x44, (byte) 0xa4, (byte) 0x49, (byte) 0xf8,
-            (byte) 0x4f, (byte) 0x4b, (byte) 0xab, (byte) 0x71, (byte) 0x5b, (byte) 0xcb,
-            (byte) 0x31, (byte) 0x10, (byte) 0x41, (byte) 0xe0, (byte) 0x1a, (byte) 0x15,
-            (byte) 0xdc, (byte) 0x4c, (byte) 0x5d, (byte) 0x4f, (byte) 0x62, (byte) 0x83,
-            (byte) 0xa4, (byte) 0x80, (byte) 0x06, (byte) 0x36, (byte) 0xba, (byte) 0xc9,
-            (byte) 0xe2, (byte) 0xa4, (byte) 0x11, (byte) 0x98, (byte) 0x6b, (byte) 0x4c,
-            (byte) 0xe9, (byte) 0x90, (byte) 0x55, (byte) 0x18, (byte) 0xde, (byte) 0xe1,
-            (byte) 0x42, (byte) 0x38, (byte) 0x28, (byte) 0xa3, (byte) 0x54, (byte) 0x56,
-            (byte) 0x31, (byte) 0xaf, (byte) 0x5a, (byte) 0xd6, (byte) 0xf0, (byte) 0x26,
-            (byte) 0xe0, (byte) 0x7a, (byte) 0xd9, (byte) 0x6c, (byte) 0x64, (byte) 0xca,
-            (byte) 0x5d, (byte) 0x6d, (byte) 0x3d, (byte) 0x9a, (byte) 0xfe, (byte) 0x36,
-            (byte) 0x93, (byte) 0x9e, (byte) 0x62, (byte) 0x94, (byte) 0xc6, (byte) 0x07,
-            (byte) 0x83, (byte) 0x96, (byte) 0xd6, (byte) 0x27, (byte) 0xa6, (byte) 0xd8
-    };
-    public static final PrivateKey CLIENT_SUITE_B_RSA3072_KEY =
-            loadPrivateKey("RSA", CLIENT_SUITE_B_RSA3072_KEY_DATA);
-
-    private static final String CLIENT_SUITE_B_ECDSA_CERT_STRING =
-            "-----BEGIN CERTIFICATE-----\n"
-                    + "MIIB9zCCAX4CFDpfSZh3AH07BEfGWuMDa7Ynz6y+MAoGCCqGSM49BAMDMF4xCzAJ\n"
-                    + "BgNVBAYTAlVTMQswCQYDVQQIDAJDQTEMMAoGA1UEBwwDTVRWMRAwDgYDVQQKDAdB\n"
-                    + "bmRyb2lkMQ4wDAYDVQQLDAVXaS1GaTESMBAGA1UEAwwJdW5pdGVzdENBMB4XDTIw\n"
-                    + "MDcyMTAyMjk1MFoXDTMwMDUzMDAyMjk1MFowYjELMAkGA1UEBhMCVVMxCzAJBgNV\n"
-                    + "BAgMAkNBMQwwCgYDVQQHDANNVFYxEDAOBgNVBAoMB0FuZHJvaWQxDjAMBgNVBAsM\n"
-                    + "BVdpLUZpMRYwFAYDVQQDDA11bml0ZXN0Q2xpZW50MHYwEAYHKoZIzj0CAQYFK4EE\n"
-                    + "ACIDYgAEhxhVJ7dcSqrto0X+dgRxtd8BWG8cWmPjBji3MIxDLfpcMDoIB84ae1Ew\n"
-                    + "gJn4YUYHrWsUDiVNihv8j7a/Ol1qcIY2ybH7tbezefLmagqA4vXEUXZXoUyL4ZNC\n"
-                    + "DWcdw6LrMAoGCCqGSM49BAMDA2cAMGQCMH4aP73HrriRUJRguiuRic+X4Cqj/7YQ\n"
-                    + "ueJmP87KF92/thhoQ9OrRo8uJITPmNDswwIwP2Q1AZCSL4BI9dYrqu07Ar+pSkXE\n"
-                    + "R7oOqGdZR+d/MvXcFSrbIaLKEoHXmQamIHLe\n"
-                    + "-----END CERTIFICATE-----\n";
-    public static final X509Certificate CLIENT_SUITE_B_ECDSA_CERT =
-            loadCertificate(CLIENT_SUITE_B_ECDSA_CERT_STRING);
-
-    private static final byte[] CLIENT_SUITE_B_ECC_KEY_DATA = new byte[]{
-            (byte) 0x30, (byte) 0x81, (byte) 0xb6, (byte) 0x02, (byte) 0x01, (byte) 0x00,
-            (byte) 0x30, (byte) 0x10, (byte) 0x06, (byte) 0x07, (byte) 0x2a, (byte) 0x86,
-            (byte) 0x48, (byte) 0xce, (byte) 0x3d, (byte) 0x02, (byte) 0x01, (byte) 0x06,
-            (byte) 0x05, (byte) 0x2b, (byte) 0x81, (byte) 0x04, (byte) 0x00, (byte) 0x22,
-            (byte) 0x04, (byte) 0x81, (byte) 0x9e, (byte) 0x30, (byte) 0x81, (byte) 0x9b,
-            (byte) 0x02, (byte) 0x01, (byte) 0x01, (byte) 0x04, (byte) 0x30, (byte) 0xea,
-            (byte) 0x6c, (byte) 0x4b, (byte) 0x6d, (byte) 0x43, (byte) 0xf9, (byte) 0x6c,
-            (byte) 0x91, (byte) 0xdc, (byte) 0x2d, (byte) 0x6e, (byte) 0x87, (byte) 0x4f,
-            (byte) 0x0a, (byte) 0x0b, (byte) 0x97, (byte) 0x25, (byte) 0x1c, (byte) 0x79,
-            (byte) 0xa2, (byte) 0x07, (byte) 0xdc, (byte) 0x94, (byte) 0xc2, (byte) 0xee,
-            (byte) 0x64, (byte) 0x51, (byte) 0x6d, (byte) 0x4e, (byte) 0x35, (byte) 0x1c,
-            (byte) 0x22, (byte) 0x2f, (byte) 0xc0, (byte) 0xea, (byte) 0x09, (byte) 0x47,
-            (byte) 0x3e, (byte) 0xb9, (byte) 0xb6, (byte) 0xb8, (byte) 0x83, (byte) 0x9e,
-            (byte) 0xed, (byte) 0x59, (byte) 0xe5, (byte) 0xe7, (byte) 0x0f, (byte) 0xa1,
-            (byte) 0x64, (byte) 0x03, (byte) 0x62, (byte) 0x00, (byte) 0x04, (byte) 0x87,
-            (byte) 0x18, (byte) 0x55, (byte) 0x27, (byte) 0xb7, (byte) 0x5c, (byte) 0x4a,
-            (byte) 0xaa, (byte) 0xed, (byte) 0xa3, (byte) 0x45, (byte) 0xfe, (byte) 0x76,
-            (byte) 0x04, (byte) 0x71, (byte) 0xb5, (byte) 0xdf, (byte) 0x01, (byte) 0x58,
-            (byte) 0x6f, (byte) 0x1c, (byte) 0x5a, (byte) 0x63, (byte) 0xe3, (byte) 0x06,
-            (byte) 0x38, (byte) 0xb7, (byte) 0x30, (byte) 0x8c, (byte) 0x43, (byte) 0x2d,
-            (byte) 0xfa, (byte) 0x5c, (byte) 0x30, (byte) 0x3a, (byte) 0x08, (byte) 0x07,
-            (byte) 0xce, (byte) 0x1a, (byte) 0x7b, (byte) 0x51, (byte) 0x30, (byte) 0x80,
-            (byte) 0x99, (byte) 0xf8, (byte) 0x61, (byte) 0x46, (byte) 0x07, (byte) 0xad,
-            (byte) 0x6b, (byte) 0x14, (byte) 0x0e, (byte) 0x25, (byte) 0x4d, (byte) 0x8a,
-            (byte) 0x1b, (byte) 0xfc, (byte) 0x8f, (byte) 0xb6, (byte) 0xbf, (byte) 0x3a,
-            (byte) 0x5d, (byte) 0x6a, (byte) 0x70, (byte) 0x86, (byte) 0x36, (byte) 0xc9,
-            (byte) 0xb1, (byte) 0xfb, (byte) 0xb5, (byte) 0xb7, (byte) 0xb3, (byte) 0x79,
-            (byte) 0xf2, (byte) 0xe6, (byte) 0x6a, (byte) 0x0a, (byte) 0x80, (byte) 0xe2,
-            (byte) 0xf5, (byte) 0xc4, (byte) 0x51, (byte) 0x76, (byte) 0x57, (byte) 0xa1,
-            (byte) 0x4c, (byte) 0x8b, (byte) 0xe1, (byte) 0x93, (byte) 0x42, (byte) 0x0d,
-            (byte) 0x67, (byte) 0x1d, (byte) 0xc3, (byte) 0xa2, (byte) 0xeb
-    };
-    public static final PrivateKey CLIENT_SUITE_B_ECC_KEY =
-            loadPrivateKey("EC", CLIENT_SUITE_B_ECC_KEY_DATA);
-
-    private static X509Certificate loadCertificate(String blob) {
-        try {
-            final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
-            InputStream stream = new ByteArrayInputStream(blob.getBytes(StandardCharsets.UTF_8));
-
-            return (X509Certificate) certFactory.generateCertificate(stream);
-        } catch (Exception e) {
-            e.printStackTrace();
-            return null;
-        }
-    }
-
-    private static PrivateKey loadPrivateKey(String algorithm, byte[] fakeKey) {
-        try {
-            KeyFactory kf = KeyFactory.getInstance(algorithm);
-            return kf.generatePrivate(new PKCS8EncodedKeySpec(fakeKey));
-        } catch (InvalidKeySpecException | NoSuchAlgorithmException e) {
-            return null;
-        }
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/ParcelUtilTest.java b/wifi/tests/src/android/net/wifi/ParcelUtilTest.java
deleted file mode 100644
index 917b1df..0000000
--- a/wifi/tests/src/android/net/wifi/ParcelUtilTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-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.assertNull;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-
-/**
- * Unit tests for {@link android.net.wifi.ParcelUtil}.
- */
-@SmallTest
-public class ParcelUtilTest {
-    private Parcel mParcel;
-
-    @Before
-    public void setUp() throws Exception {
-        mParcel = Parcel.obtain();
-    }
-
-    @Test
-    public void readWriteNullPrivateKey() throws Exception {
-        ParcelUtil.writePrivateKey(mParcel, null);
-
-        mParcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        PrivateKey readKey = ParcelUtil.readPrivateKey(mParcel);
-        assertNull(readKey);
-    }
-
-    @Test
-    public void readWriteValidPrivateKey() throws Exception {
-        PrivateKey writeKey = FakeKeys.RSA_KEY1;
-        ParcelUtil.writePrivateKey(mParcel, writeKey);
-
-        mParcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        PrivateKey readKey = ParcelUtil.readPrivateKey(mParcel);
-        assertNotNull(readKey);
-        assertEquals(writeKey.getAlgorithm(), readKey.getAlgorithm());
-        assertArrayEquals(writeKey.getEncoded(), readKey.getEncoded());
-    }
-
-    @Test
-    public void readWriteNullCertificate() throws Exception {
-        ParcelUtil.writeCertificate(mParcel, null);
-
-        mParcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        X509Certificate readCert = ParcelUtil.readCertificate(mParcel);
-        assertNull(readCert);
-    }
-
-    @Test
-    public void readWriteValidCertificate() throws Exception {
-        X509Certificate writeCert = FakeKeys.CA_CERT1;
-        ParcelUtil.writeCertificate(mParcel, writeCert);
-
-        mParcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        X509Certificate readCert = ParcelUtil.readCertificate(mParcel);
-        assertNotNull(readCert);
-        assertArrayEquals(writeCert.getEncoded(), readCert.getEncoded());
-    }
-
-    @Test
-    public void readWriteNullCertificates() throws Exception {
-        ParcelUtil.writeCertificates(mParcel, null);
-
-        mParcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        X509Certificate[] readCerts = ParcelUtil.readCertificates(mParcel);
-        assertNull(readCerts);
-    }
-
-    @Test
-    public void readWriteValidCertificates() throws Exception {
-        X509Certificate[] writeCerts = new X509Certificate[2];
-        writeCerts[0] = FakeKeys.CA_CERT0;
-        writeCerts[1] = FakeKeys.CA_CERT1;
-        ParcelUtil.writeCertificates(mParcel, writeCerts);
-
-        mParcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        X509Certificate[] readCerts = ParcelUtil.readCertificates(mParcel);
-        assertNotNull(readCerts);
-        assertEquals(writeCerts.length, readCerts.length);
-        for (int i = 0; i < writeCerts.length; i++) {
-            assertNotNull(readCerts[i]);
-            assertArrayEquals(writeCerts[i].getEncoded(), readCerts[i].getEncoded());
-        }
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/ScanResultTest.java b/wifi/tests/src/android/net/wifi/ScanResultTest.java
deleted file mode 100644
index f1ec5e8..0000000
--- a/wifi/tests/src/android/net/wifi/ScanResultTest.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.mockito.Mockito.validateMockitoUsage;
-
-import android.net.wifi.ScanResult.InformationElement;
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.MockitoAnnotations;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiScanner}.
- */
-@SmallTest
-public class ScanResultTest {
-    public static final String TEST_SSID = "\"test_ssid\"";
-    public static final String TEST_BSSID = "04:ac:fe:45:34:10";
-    public static final String TEST_CAPS = "CCMP";
-    public static final int TEST_LEVEL = -56;
-    public static final int TEST_FREQUENCY = 2412;
-    public static final long TEST_TSF = 04660l;
-    public static final @WifiAnnotations.WifiStandard int TEST_WIFI_STANDARD =
-            ScanResult.WIFI_STANDARD_11AC;
-
-    /**
-     * Frequency to channel map. This include some frequencies used outside the US.
-     * Representing it using a vector (instead of map) for simplification.
-     */
-    private static final int[] FREQUENCY_TO_CHANNEL_MAP = {
-            2412, WifiScanner.WIFI_BAND_24_GHZ, 1,
-            2417, WifiScanner.WIFI_BAND_24_GHZ, 2,
-            2422, WifiScanner.WIFI_BAND_24_GHZ, 3,
-            2427, WifiScanner.WIFI_BAND_24_GHZ, 4,
-            2432, WifiScanner.WIFI_BAND_24_GHZ, 5,
-            2437, WifiScanner.WIFI_BAND_24_GHZ, 6,
-            2442, WifiScanner.WIFI_BAND_24_GHZ, 7,
-            2447, WifiScanner.WIFI_BAND_24_GHZ, 8,
-            2452, WifiScanner.WIFI_BAND_24_GHZ, 9,
-            2457, WifiScanner.WIFI_BAND_24_GHZ, 10,
-            2462, WifiScanner.WIFI_BAND_24_GHZ, 11,
-            /* 12, 13 are only legitimate outside the US. */
-            2467, WifiScanner.WIFI_BAND_24_GHZ, 12,
-            2472, WifiScanner.WIFI_BAND_24_GHZ, 13,
-            /* 14 is for Japan, DSSS and CCK only. */
-            2484, WifiScanner.WIFI_BAND_24_GHZ, 14,
-            /* 34 valid in Japan. */
-            5170, WifiScanner.WIFI_BAND_5_GHZ, 34,
-            5180, WifiScanner.WIFI_BAND_5_GHZ, 36,
-            5190, WifiScanner.WIFI_BAND_5_GHZ, 38,
-            5200, WifiScanner.WIFI_BAND_5_GHZ, 40,
-            5210, WifiScanner.WIFI_BAND_5_GHZ, 42,
-            5220, WifiScanner.WIFI_BAND_5_GHZ, 44,
-            5230, WifiScanner.WIFI_BAND_5_GHZ, 46,
-            5240, WifiScanner.WIFI_BAND_5_GHZ, 48,
-            5260, WifiScanner.WIFI_BAND_5_GHZ, 52,
-            5280, WifiScanner.WIFI_BAND_5_GHZ, 56,
-            5300, WifiScanner.WIFI_BAND_5_GHZ, 60,
-            5320, WifiScanner.WIFI_BAND_5_GHZ, 64,
-            5500, WifiScanner.WIFI_BAND_5_GHZ, 100,
-            5520, WifiScanner.WIFI_BAND_5_GHZ, 104,
-            5540, WifiScanner.WIFI_BAND_5_GHZ, 108,
-            5560, WifiScanner.WIFI_BAND_5_GHZ, 112,
-            5580, WifiScanner.WIFI_BAND_5_GHZ, 116,
-            /* 120, 124, 128 valid in Europe/Japan. */
-            5600, WifiScanner.WIFI_BAND_5_GHZ, 120,
-            5620, WifiScanner.WIFI_BAND_5_GHZ, 124,
-            5640, WifiScanner.WIFI_BAND_5_GHZ, 128,
-            /* 132+ valid in US. */
-            5660, WifiScanner.WIFI_BAND_5_GHZ, 132,
-            5680, WifiScanner.WIFI_BAND_5_GHZ, 136,
-            5700, WifiScanner.WIFI_BAND_5_GHZ, 140,
-            /* 144 is supported by a subset of WiFi chips. */
-            5720, WifiScanner.WIFI_BAND_5_GHZ, 144,
-            5745, WifiScanner.WIFI_BAND_5_GHZ, 149,
-            5765, WifiScanner.WIFI_BAND_5_GHZ, 153,
-            5785, WifiScanner.WIFI_BAND_5_GHZ, 157,
-            5805, WifiScanner.WIFI_BAND_5_GHZ, 161,
-            5825, WifiScanner.WIFI_BAND_5_GHZ, 165,
-            5845, WifiScanner.WIFI_BAND_5_GHZ, 169,
-            5865, WifiScanner.WIFI_BAND_5_GHZ, 173,
-            /* Now some 6GHz channels */
-            5955, WifiScanner.WIFI_BAND_6_GHZ, 1,
-            5935, WifiScanner.WIFI_BAND_6_GHZ, 2,
-            5970, WifiScanner.WIFI_BAND_6_GHZ, 4,
-            6110, WifiScanner.WIFI_BAND_6_GHZ, 32
-    };
-
-    /**
-     * Setup before tests.
-     */
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    /**
-     * Clean up after tests.
-     */
-    @After
-    public void cleanup() {
-        validateMockitoUsage();
-    }
-
-    /**
-     * Verify parcel read/write for ScanResult.
-     */
-    @Test
-    public void verifyScanResultParcelWithoutRadioChainInfo() throws Exception {
-        ScanResult writeScanResult = createScanResult();
-        ScanResult readScanResult = parcelReadWrite(writeScanResult);
-        assertScanResultEquals(writeScanResult, readScanResult);
-    }
-
-    /**
-     * Verify parcel read/write for ScanResult.
-     */
-    @Test
-    public void verifyScanResultParcelWithZeroRadioChainInfo() throws Exception {
-        ScanResult writeScanResult = createScanResult();
-        writeScanResult.radioChainInfos = new ScanResult.RadioChainInfo[0];
-        ScanResult readScanResult = parcelReadWrite(writeScanResult);
-        assertNull(readScanResult.radioChainInfos);
-    }
-
-    /**
-     * Verify parcel read/write for ScanResult.
-     */
-    @Test
-    public void verifyScanResultParcelWithRadioChainInfo() throws Exception {
-        ScanResult writeScanResult = createScanResult();
-        writeScanResult.radioChainInfos = new ScanResult.RadioChainInfo[2];
-        writeScanResult.radioChainInfos[0] = new ScanResult.RadioChainInfo();
-        writeScanResult.radioChainInfos[0].id = 0;
-        writeScanResult.radioChainInfos[0].level = -45;
-        writeScanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
-        writeScanResult.radioChainInfos[1].id = 1;
-        writeScanResult.radioChainInfos[1].level = -54;
-        ScanResult readScanResult = parcelReadWrite(writeScanResult);
-        assertScanResultEquals(writeScanResult, readScanResult);
-    }
-
-    /**
-     * Verify copy constructor for ScanResult.
-     */
-    @Test
-    public void verifyScanResultCopyWithoutRadioChainInfo() throws Exception {
-        ScanResult scanResult = createScanResult();
-        ScanResult copyScanResult = new ScanResult(scanResult);
-        assertScanResultEquals(scanResult, copyScanResult);
-    }
-
-    /**
-     * Verify copy constructor for ScanResult.
-     */
-    @Test
-    public void verifyScanResultCopyWithRadioChainInfo() throws Exception {
-        ScanResult scanResult = createScanResult();
-        scanResult.radioChainInfos = new ScanResult.RadioChainInfo[2];
-        scanResult.radioChainInfos[0] = new ScanResult.RadioChainInfo();
-        scanResult.radioChainInfos[0].id = 0;
-        scanResult.radioChainInfos[0].level = -45;
-        scanResult.radioChainInfos[1] = new ScanResult.RadioChainInfo();
-        scanResult.radioChainInfos[1].id = 1;
-        scanResult.radioChainInfos[1].level = -54;
-        ScanResult copyScanResult = new ScanResult(scanResult);
-        assertScanResultEquals(scanResult, copyScanResult);
-    }
-
-    /**
-     * Verify parcel read/write for ScanResult with Information Element
-     */
-    @Test
-    public void verifyScanResultParcelWithInformationElement() throws Exception {
-        ScanResult writeScanResult = createScanResult();
-        writeScanResult.informationElements = new ScanResult.InformationElement[2];
-        writeScanResult.informationElements[0] = new ScanResult.InformationElement();
-        writeScanResult.informationElements[0].id = InformationElement.EID_HT_OPERATION;
-        writeScanResult.informationElements[0].idExt = 0;
-        writeScanResult.informationElements[0].bytes = new byte[]{0x11, 0x22, 0x33};
-        writeScanResult.informationElements[1] = new ScanResult.InformationElement();
-        writeScanResult.informationElements[1].id = InformationElement.EID_EXTENSION_PRESENT;
-        writeScanResult.informationElements[1].idExt = InformationElement.EID_EXT_HE_OPERATION;
-        writeScanResult.informationElements[1].bytes = new byte[]{0x44, 0x55, 0x66};
-        ScanResult readScanResult = new ScanResult(writeScanResult);
-        assertScanResultEquals(writeScanResult, readScanResult);
-    }
-
-    /**
-     * Verify toString for ScanResult.
-     */
-    @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, "
-                + "standard: 11ac, "
-                + "80211mcResponder: is not supported, "
-                + "Radio Chain Infos: null", scanResult.toString());
-    }
-
-    /**
-     * Verify toString for ScanResult.
-     */
-    @Test
-    public void verifyScanResultToStringWithRadioChainInfo() throws Exception {
-        ScanResult scanResult = createScanResult();
-        scanResult.radioChainInfos = new ScanResult.RadioChainInfo[2];
-        scanResult.radioChainInfos[0] = new ScanResult.RadioChainInfo();
-        scanResult.radioChainInfos[0].id = 0;
-        scanResult.radioChainInfos[0].level = -45;
-        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, "
-                + "standard: 11ac, "
-                + "80211mcResponder: is not supported, "
-                + "Radio Chain Infos: [RadioChainInfo: id=0, level=-45, "
-                + "RadioChainInfo: id=1, level=-54]", scanResult.toString());
-    }
-
-    /**
-     * verify frequency to channel conversion for all possible frequencies.
-     */
-    @Test
-    public void convertFrequencyToChannel() throws Exception {
-        for (int i = 0; i < FREQUENCY_TO_CHANNEL_MAP.length; i += 3) {
-            assertEquals(FREQUENCY_TO_CHANNEL_MAP[i + 2],
-                    ScanResult.convertFrequencyMhzToChannel(FREQUENCY_TO_CHANNEL_MAP[i]));
-        }
-    }
-
-    /**
-     * Verify frequency to channel conversion failed for an invalid frequency.
-     */
-    @Test
-    public void convertFrequencyToChannelWithInvalidFreq() throws Exception {
-        assertEquals(-1, ScanResult.convertFrequencyMhzToChannel(8000));
-    }
-
-    /**
-     * Write the provided {@link ScanResult} to a parcel and deserialize it.
-     */
-    private static ScanResult parcelReadWrite(ScanResult writeResult) throws Exception {
-        Parcel parcel = Parcel.obtain();
-        writeResult.writeToParcel(parcel, 0);
-        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        return ScanResult.CREATOR.createFromParcel(parcel);
-    }
-
-    private static ScanResult createScanResult() {
-        ScanResult result = new ScanResult();
-        result.wifiSsid = WifiSsid.createFromAsciiEncoded(TEST_SSID);
-        result.BSSID = TEST_BSSID;
-        result.capabilities = TEST_CAPS;
-        result.level = TEST_LEVEL;
-        result.frequency = TEST_FREQUENCY;
-        result.timestamp = TEST_TSF;
-        result.setWifiStandard(TEST_WIFI_STANDARD);
-        return result;
-    }
-
-    private static void assertScanResultEquals(ScanResult expected, ScanResult actual) {
-        assertEquals(expected.SSID, actual.SSID);
-        assertEquals(expected.BSSID, actual.BSSID);
-        assertEquals(expected.capabilities, actual.capabilities);
-        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/SoftApCapabilityTest.java b/wifi/tests/src/android/net/wifi/SoftApCapabilityTest.java
deleted file mode 100644
index 73b501a..0000000
--- a/wifi/tests/src/android/net/wifi/SoftApCapabilityTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.os.Parcel;
-
-import static org.junit.Assert.assertEquals;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link android.net.wifi.SoftApCapability}.
- */
-@SmallTest
-public class SoftApCapabilityTest {
-
-    /**
-     * Verifies copy constructor.
-     */
-    @Test
-    public void testCopyOperator() throws Exception {
-        long testSoftApFeature = SoftApCapability.SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT
-                | SoftApCapability.SOFTAP_FEATURE_ACS_OFFLOAD;
-        SoftApCapability capability = new SoftApCapability(testSoftApFeature);
-        capability.setMaxSupportedClients(10);
-
-        SoftApCapability copiedCapability = new SoftApCapability(capability);
-
-        assertEquals(capability, copiedCapability);
-        assertEquals(capability.hashCode(), copiedCapability.hashCode());
-    }
-
-    /**
-     * Verifies parcel serialization/deserialization.
-     */
-    @Test
-    public void testParcelOperation() throws Exception {
-        long testSoftApFeature = SoftApCapability.SOFTAP_FEATURE_CLIENT_FORCE_DISCONNECT
-                | SoftApCapability.SOFTAP_FEATURE_ACS_OFFLOAD;
-        SoftApCapability capability = new SoftApCapability(testSoftApFeature);
-        capability.setMaxSupportedClients(10);
-
-        Parcel parcelW = Parcel.obtain();
-        capability.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        SoftApCapability fromParcel = SoftApCapability.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(capability, fromParcel);
-        assertEquals(capability.hashCode(), fromParcel.hashCode());
-    }
-
-}
diff --git a/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java b/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java
deleted file mode 100644
index 2d7e535..0000000
--- a/wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java
+++ /dev/null
@@ -1,339 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertNull;
-
-import android.net.MacAddress;
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Random;
-
-@SmallTest
-public class SoftApConfigurationTest {
-    private static final String TEST_CHAR_SET_AS_STRING = "abcdefghijklmnopqrstuvwxyz0123456789";
-
-    private SoftApConfiguration parcelUnparcel(SoftApConfiguration configIn) {
-        Parcel parcel = Parcel.obtain();
-        parcel.writeParcelable(configIn, 0);
-        parcel.setDataPosition(0);
-        SoftApConfiguration configOut =
-                parcel.readParcelable(SoftApConfiguration.class.getClassLoader());
-        parcel.recycle();
-        return configOut;
-    }
-
-    /**
-     * Helper method to generate random string.
-     *
-     * Note: this method has limited use as a random string generator.
-     * The characters used in this method do no not cover all valid inputs.
-     * @param length number of characters to generate for the string
-     * @return String generated string of random characters
-     */
-    private String generateRandomString(int length) {
-        Random random = new Random();
-        StringBuilder stringBuilder = new StringBuilder(length);
-        int index = -1;
-        while (stringBuilder.length() < length) {
-            index = random.nextInt(TEST_CHAR_SET_AS_STRING.length());
-            stringBuilder.append(TEST_CHAR_SET_AS_STRING.charAt(index));
-        }
-        return stringBuilder.toString();
-    }
-
-    @Test
-    public void testBasicSettings() {
-        SoftApConfiguration original = new SoftApConfiguration.Builder()
-                .setSsid("ssid")
-                .setBssid(MacAddress.fromString("11:22:33:44:55:66"))
-                .build();
-        assertThat(original.getSsid()).isEqualTo("ssid");
-        assertThat(original.getBssid()).isEqualTo(MacAddress.fromString("11:22:33:44:55:66"));
-        assertThat(original.getPassphrase()).isNull();
-        assertThat(original.getSecurityType()).isEqualTo(SoftApConfiguration.SECURITY_TYPE_OPEN);
-        assertThat(original.getBand()).isEqualTo(SoftApConfiguration.BAND_2GHZ);
-        assertThat(original.getChannel()).isEqualTo(0);
-        assertThat(original.isHiddenSsid()).isEqualTo(false);
-        assertThat(original.getMaxNumberOfClients()).isEqualTo(0);
-
-        SoftApConfiguration unparceled = parcelUnparcel(original);
-        assertThat(unparceled).isNotSameInstanceAs(original);
-        assertThat(unparceled).isEqualTo(original);
-        assertThat(unparceled.hashCode()).isEqualTo(original.hashCode());
-
-        SoftApConfiguration copy = new SoftApConfiguration.Builder(original).build();
-        assertThat(copy).isNotSameInstanceAs(original);
-        assertThat(copy).isEqualTo(original);
-        assertThat(copy.hashCode()).isEqualTo(original.hashCode());
-    }
-
-    @Test
-    public void testWpa2() {
-        SoftApConfiguration original = new SoftApConfiguration.Builder()
-                .setPassphrase("secretsecret", SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
-                .build();
-        assertThat(original.getPassphrase()).isEqualTo("secretsecret");
-        assertThat(original.getSecurityType()).isEqualTo(
-                SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
-        assertThat(original.getBand()).isEqualTo(SoftApConfiguration.BAND_2GHZ);
-        assertThat(original.getChannel()).isEqualTo(0);
-        assertThat(original.isHiddenSsid()).isEqualTo(false);
-        assertThat(original.getMaxNumberOfClients()).isEqualTo(0);
-
-        SoftApConfiguration unparceled = parcelUnparcel(original);
-        assertThat(unparceled).isNotSameInstanceAs(original);
-        assertThat(unparceled).isEqualTo(original);
-        assertThat(unparceled.hashCode()).isEqualTo(original.hashCode());
-
-        SoftApConfiguration copy = new SoftApConfiguration.Builder(original).build();
-        assertThat(copy).isNotSameInstanceAs(original);
-        assertThat(copy).isEqualTo(original);
-        assertThat(copy.hashCode()).isEqualTo(original.hashCode());
-    }
-
-    @Test
-    public void testWpa2WithAllFieldCustomized() {
-        List<MacAddress> testBlockedClientList = new ArrayList<>();
-        List<MacAddress> testAllowedClientList = new ArrayList<>();
-        testBlockedClientList.add(MacAddress.fromString("11:22:33:44:55:66"));
-        testAllowedClientList.add(MacAddress.fromString("aa:bb:cc:dd:ee:ff"));
-        SoftApConfiguration original = new SoftApConfiguration.Builder()
-                .setPassphrase("secretsecret", SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
-                .setChannel(149, SoftApConfiguration.BAND_5GHZ)
-                .setHiddenSsid(true)
-                .setMaxNumberOfClients(10)
-                .setAutoShutdownEnabled(true)
-                .setShutdownTimeoutMillis(500000)
-                .setClientControlByUserEnabled(true)
-                .setBlockedClientList(testBlockedClientList)
-                .setAllowedClientList(testAllowedClientList)
-                .build();
-        assertThat(original.getPassphrase()).isEqualTo("secretsecret");
-        assertThat(original.getSecurityType()).isEqualTo(
-                SoftApConfiguration.SECURITY_TYPE_WPA2_PSK);
-        assertThat(original.getBand()).isEqualTo(SoftApConfiguration.BAND_5GHZ);
-        assertThat(original.getChannel()).isEqualTo(149);
-        assertThat(original.isHiddenSsid()).isEqualTo(true);
-        assertThat(original.getMaxNumberOfClients()).isEqualTo(10);
-        assertThat(original.isAutoShutdownEnabled()).isEqualTo(true);
-        assertThat(original.getShutdownTimeoutMillis()).isEqualTo(500000);
-        assertThat(original.isClientControlByUserEnabled()).isEqualTo(true);
-        assertThat(original.getBlockedClientList()).isEqualTo(testBlockedClientList);
-        assertThat(original.getAllowedClientList()).isEqualTo(testAllowedClientList);
-
-        SoftApConfiguration unparceled = parcelUnparcel(original);
-        assertThat(unparceled).isNotSameInstanceAs(original);
-        assertThat(unparceled).isEqualTo(original);
-        assertThat(unparceled.hashCode()).isEqualTo(original.hashCode());
-
-        SoftApConfiguration copy = new SoftApConfiguration.Builder(original).build();
-        assertThat(copy).isNotSameInstanceAs(original);
-        assertThat(copy).isEqualTo(original);
-        assertThat(copy.hashCode()).isEqualTo(original.hashCode());
-    }
-
-    @Test
-    public void testWpa3Sae() {
-        SoftApConfiguration original = new SoftApConfiguration.Builder()
-                .setPassphrase("secretsecret", SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)
-                .setChannel(149, SoftApConfiguration.BAND_5GHZ)
-                .setHiddenSsid(true)
-                .build();
-        assertThat(original.getPassphrase()).isEqualTo("secretsecret");
-        assertThat(original.getSecurityType()).isEqualTo(
-                SoftApConfiguration.SECURITY_TYPE_WPA3_SAE);
-        assertThat(original.getBand()).isEqualTo(SoftApConfiguration.BAND_5GHZ);
-        assertThat(original.getChannel()).isEqualTo(149);
-        assertThat(original.isHiddenSsid()).isEqualTo(true);
-
-
-        SoftApConfiguration unparceled = parcelUnparcel(original);
-        assertThat(unparceled).isNotSameInstanceAs(original);
-        assertThat(unparceled).isEqualTo(original);
-        assertThat(unparceled.hashCode()).isEqualTo(original.hashCode());
-
-        SoftApConfiguration copy = new SoftApConfiguration.Builder(original).build();
-        assertThat(copy).isNotSameInstanceAs(original);
-        assertThat(copy).isEqualTo(original);
-        assertThat(copy.hashCode()).isEqualTo(original.hashCode());
-    }
-
-    @Test
-    public void testWpa3SaeTransition() {
-        SoftApConfiguration original = new SoftApConfiguration.Builder()
-                .setPassphrase("secretsecret",
-                        SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)
-                .setChannel(149, SoftApConfiguration.BAND_5GHZ)
-                .setHiddenSsid(true)
-                .build();
-        assertThat(original.getSecurityType()).isEqualTo(
-                SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION);
-        assertThat(original.getPassphrase()).isEqualTo("secretsecret");
-        assertThat(original.getBand()).isEqualTo(SoftApConfiguration.BAND_5GHZ);
-        assertThat(original.getChannel()).isEqualTo(149);
-        assertThat(original.isHiddenSsid()).isEqualTo(true);
-
-
-        SoftApConfiguration unparceled = parcelUnparcel(original);
-        assertThat(unparceled).isNotSameInstanceAs(original);
-        assertThat(unparceled).isEqualTo(original);
-        assertThat(unparceled.hashCode()).isEqualTo(original.hashCode());
-
-        SoftApConfiguration copy = new SoftApConfiguration.Builder(original).build();
-        assertThat(copy).isNotSameInstanceAs(original);
-        assertThat(copy).isEqualTo(original);
-        assertThat(copy.hashCode()).isEqualTo(original.hashCode());
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testInvalidShortPasswordLengthForWpa2() {
-        SoftApConfiguration original = new SoftApConfiguration.Builder()
-                .setPassphrase(generateRandomString(SoftApConfiguration.PSK_MIN_LEN - 1),
-                        SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
-                .setChannel(149, SoftApConfiguration.BAND_5GHZ)
-                .setHiddenSsid(true)
-                .build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testInvalidLongPasswordLengthForWpa2() {
-        SoftApConfiguration original = new SoftApConfiguration.Builder()
-                .setPassphrase(generateRandomString(SoftApConfiguration.PSK_MAX_LEN + 1),
-                        SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
-                .setChannel(149, SoftApConfiguration.BAND_5GHZ)
-                .setHiddenSsid(true)
-                .build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testInvalidShortPasswordLengthForWpa3SaeTransition() {
-        SoftApConfiguration original = new SoftApConfiguration.Builder()
-                .setPassphrase(generateRandomString(SoftApConfiguration.PSK_MIN_LEN - 1),
-                        SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)
-                .setChannel(149, SoftApConfiguration.BAND_5GHZ)
-                .setHiddenSsid(true)
-                .build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testInvalidLongPasswordLengthForWpa3SaeTransition() {
-        SoftApConfiguration original = new SoftApConfiguration.Builder()
-                .setPassphrase(generateRandomString(SoftApConfiguration.PSK_MAX_LEN + 1),
-                        SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)
-                .setChannel(149, SoftApConfiguration.BAND_5GHZ)
-                .setHiddenSsid(true)
-                .build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testInvalieShutdownTimeoutMillis() {
-        SoftApConfiguration original = new SoftApConfiguration.Builder()
-                .setShutdownTimeoutMillis(-1)
-                .build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testSetClientListExceptionWhenExistMacAddressInBothList() {
-        final MacAddress testMacAddress_1 = MacAddress.fromString("22:33:44:55:66:77");
-        final MacAddress testMacAddress_2 = MacAddress.fromString("aa:bb:cc:dd:ee:ff");
-        ArrayList<MacAddress> testAllowedClientList = new ArrayList<>();
-        testAllowedClientList.add(testMacAddress_1);
-        testAllowedClientList.add(testMacAddress_2);
-        ArrayList<MacAddress> testBlockedClientList = new ArrayList<>();
-        testBlockedClientList.add(testMacAddress_1);
-        SoftApConfiguration.Builder configBuilder = new SoftApConfiguration.Builder();
-        configBuilder.setBlockedClientList(testBlockedClientList)
-                .setAllowedClientList(testAllowedClientList)
-                .build();
-    }
-
-    @Test
-    public void testToWifiConfigurationWithUnsupportedParameter() {
-        SoftApConfiguration sae_config = new SoftApConfiguration.Builder()
-                .setPassphrase("secretsecret", SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)
-                .build();
-
-        assertNull(sae_config.toWifiConfiguration());
-        SoftApConfiguration band_6g_config = new SoftApConfiguration.Builder()
-                .setBand(SoftApConfiguration.BAND_6GHZ)
-                .build();
-
-        assertNull(band_6g_config.toWifiConfiguration());
-    }
-
-    @Test
-    public void testToWifiConfigurationWithSupportedParameter() {
-        SoftApConfiguration softApConfig_2g = new SoftApConfiguration.Builder()
-                .setPassphrase("secretsecret",
-                        SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
-                .setChannel(11, SoftApConfiguration.BAND_2GHZ)
-                .setHiddenSsid(true)
-                .build();
-        WifiConfiguration wifiConfig_2g = softApConfig_2g.toWifiConfiguration();
-        assertThat(wifiConfig_2g.getAuthType()).isEqualTo(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        assertThat(wifiConfig_2g.preSharedKey).isEqualTo("secretsecret");
-        assertThat(wifiConfig_2g.apBand).isEqualTo(WifiConfiguration.AP_BAND_2GHZ);
-        assertThat(wifiConfig_2g.apChannel).isEqualTo(11);
-        assertThat(wifiConfig_2g.hiddenSSID).isEqualTo(true);
-
-        SoftApConfiguration softApConfig_5g = new SoftApConfiguration.Builder()
-                .setPassphrase("secretsecret",
-                        SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
-                .setChannel(149, SoftApConfiguration.BAND_5GHZ)
-                .setHiddenSsid(true)
-                .build();
-        WifiConfiguration wifiConfig_5g = softApConfig_5g.toWifiConfiguration();
-        assertThat(wifiConfig_5g.getAuthType()).isEqualTo(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        assertThat(wifiConfig_5g.preSharedKey).isEqualTo("secretsecret");
-        assertThat(wifiConfig_5g.apBand).isEqualTo(WifiConfiguration.AP_BAND_5GHZ);
-        assertThat(wifiConfig_5g.apChannel).isEqualTo(149);
-        assertThat(wifiConfig_5g.hiddenSSID).isEqualTo(true);
-
-        SoftApConfiguration softApConfig_2g5g = new SoftApConfiguration.Builder()
-                .setPassphrase("secretsecret",
-                        SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
-                .setBand(SoftApConfiguration.BAND_2GHZ | SoftApConfiguration.BAND_5GHZ)
-                .setHiddenSsid(true)
-                .build();
-        WifiConfiguration wifiConfig_2g5g = softApConfig_2g5g.toWifiConfiguration();
-        assertThat(wifiConfig_2g5g.getAuthType()).isEqualTo(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        assertThat(wifiConfig_2g5g.preSharedKey).isEqualTo("secretsecret");
-        assertThat(wifiConfig_2g5g.apBand).isEqualTo(WifiConfiguration.AP_BAND_ANY);
-        assertThat(wifiConfig_2g5g.apChannel).isEqualTo(0);
-        assertThat(wifiConfig_2g5g.hiddenSSID).isEqualTo(true);
-
-        SoftApConfiguration softApConfig_sae_transition = new SoftApConfiguration.Builder()
-                .setPassphrase("secretsecret",
-                SoftApConfiguration.SECURITY_TYPE_WPA3_SAE_TRANSITION)
-                .build();
-
-        WifiConfiguration wifiConfig_sae_transition =
-                softApConfig_sae_transition.toWifiConfiguration();
-        assertThat(wifiConfig_sae_transition.getAuthType())
-                .isEqualTo(WifiConfiguration.KeyMgmt.WPA2_PSK);
-        assertThat(wifiConfig_sae_transition.preSharedKey).isEqualTo("secretsecret");
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/SoftApInfoTest.java b/wifi/tests/src/android/net/wifi/SoftApInfoTest.java
deleted file mode 100644
index 929f3ab..0000000
--- a/wifi/tests/src/android/net/wifi/SoftApInfoTest.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import android.os.Parcel;
-
-import static org.junit.Assert.assertEquals;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link android.net.wifi.SoftApInfo}.
- */
-@SmallTest
-public class SoftApInfoTest {
-
-    /**
-     * Verifies copy constructor.
-     */
-    @Test
-    public void testCopyOperator() throws Exception {
-        SoftApInfo info = new SoftApInfo();
-        info.setFrequency(2412);
-        info.setBandwidth(SoftApInfo.CHANNEL_WIDTH_20MHZ);
-
-        SoftApInfo copiedInfo = new SoftApInfo(info);
-
-        assertEquals(info, copiedInfo);
-        assertEquals(info.hashCode(), copiedInfo.hashCode());
-    }
-
-    /**
-     * Verifies parcel serialization/deserialization.
-     */
-    @Test
-    public void testParcelOperation() throws Exception {
-        SoftApInfo info = new SoftApInfo();
-        info.setFrequency(2412);
-        info.setBandwidth(SoftApInfo.CHANNEL_WIDTH_20MHZ);
-
-        Parcel parcelW = Parcel.obtain();
-        info.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        SoftApInfo fromParcel = SoftApInfo.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(info, fromParcel);
-        assertEquals(info.hashCode(), fromParcel.hashCode());
-    }
-
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiClientTest.java b/wifi/tests/src/android/net/wifi/WifiClientTest.java
deleted file mode 100644
index 7a3baf9..0000000
--- a/wifi/tests/src/android/net/wifi/WifiClientTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static com.android.testutils.MiscAsserts.assertFieldCountEquals;
-import static com.android.testutils.ParcelUtils.assertParcelSane;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-import android.net.MacAddress;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiClient}.
- */
-@SmallTest
-public class WifiClientTest {
-    private static final String INTERFACE_NAME = "wlan0";
-    private static final String MAC_ADDRESS_STRING = "00:0a:95:9d:68:16";
-    private static final MacAddress MAC_ADDRESS = MacAddress.fromString(MAC_ADDRESS_STRING);
-
-    /**
-     *  Verify parcel write/read with WifiClient.
-     */
-    @Test
-    public void testWifiClientParcelWriteRead() throws Exception {
-        WifiClient writeWifiClient = new WifiClient(MAC_ADDRESS);
-
-        assertParcelSane(writeWifiClient, 1);
-    }
-
-    /**
-     *  Verify equals with WifiClient.
-     */
-    @Test
-    public void testWifiClientEquals() throws Exception {
-        WifiClient writeWifiClient = new WifiClient(MAC_ADDRESS);
-        WifiClient writeWifiClientEquals = new WifiClient(MAC_ADDRESS);
-
-        assertEquals(writeWifiClient, writeWifiClientEquals);
-        assertEquals(writeWifiClient.hashCode(), writeWifiClientEquals.hashCode());
-        assertFieldCountEquals(1, WifiClient.class);
-    }
-
-    /**
-     *  Verify not-equals with WifiClient.
-     */
-    @Test
-    public void testWifiClientNotEquals() throws Exception {
-        final MacAddress macAddressNotEquals = MacAddress.fromString("00:00:00:00:00:00");
-        WifiClient writeWifiClient = new WifiClient(MAC_ADDRESS);
-        WifiClient writeWifiClientNotEquals = new WifiClient(macAddressNotEquals);
-
-        assertNotEquals(writeWifiClient, writeWifiClientNotEquals);
-        assertNotEquals(writeWifiClient.hashCode(), writeWifiClientNotEquals.hashCode());
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java b/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
deleted file mode 100644
index a7b6765..0000000
--- a/wifi/tests/src/android/net/wifi/WifiConfigurationTest.java
+++ /dev/null
@@ -1,540 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_EAP;
-import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_EAP_SUITE_B;
-import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_OPEN;
-import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_OWE;
-import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_PSK;
-import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_SAE;
-import static android.net.wifi.WifiConfiguration.SECURITY_TYPE_WAPI_PSK;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
-
-import android.net.MacAddress;
-import android.net.util.MacAddressUtils;
-import android.net.wifi.WifiConfiguration.KeyMgmt;
-import android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiConfiguration}.
- */
-@SmallTest
-public class WifiConfigurationTest {
-
-    @Before
-    public void setUp() {
-    }
-
-    /**
-     * Check that parcel marshalling/unmarshalling works
-     *
-     * Create and populate a WifiConfiguration.
-     * Marshall and unmashall it, and expect to recover a copy of the original.
-     * Marshall the resulting object, and expect the bytes to match the
-     * first marshall result.
-     */
-    @Test
-    public void testWifiConfigurationParcel() {
-        String cookie = "C O.o |<IE";
-        WifiConfiguration config = new WifiConfiguration();
-        config.setPasspointManagementObjectTree(cookie);
-        config.trusted = false;
-        config.updateIdentifier = "1234";
-        config.fromWifiNetworkSpecifier = true;
-        config.fromWifiNetworkSuggestion = true;
-        config.setRandomizedMacAddress(MacAddressUtils.createRandomUnicastAddress());
-        MacAddress macBeforeParcel = config.getRandomizedMacAddress();
-        Parcel parcelW = Parcel.obtain();
-        config.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiConfiguration reconfig = WifiConfiguration.CREATOR.createFromParcel(parcelR);
-
-        // lacking a useful config.equals, check two fields near the end.
-        assertEquals(cookie, reconfig.getMoTree());
-        assertEquals(macBeforeParcel, reconfig.getRandomizedMacAddress());
-        assertEquals(config.updateIdentifier, reconfig.updateIdentifier);
-        assertFalse(reconfig.trusted);
-        assertTrue(config.fromWifiNetworkSpecifier);
-        assertTrue(config.fromWifiNetworkSuggestion);
-
-        Parcel parcelWW = Parcel.obtain();
-        reconfig.writeToParcel(parcelWW, 0);
-        byte[] rebytes = parcelWW.marshall();
-        parcelWW.recycle();
-
-        assertArrayEquals(bytes, rebytes);
-    }
-
-    @Test
-    public void testIsOpenNetwork_IsOpen_NullWepKeys() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.clear();
-        config.wepKeys = null;
-
-        assertTrue(config.isOpenNetwork());
-    }
-
-    @Test
-    public void testIsOpenNetwork_IsOpen_ZeroLengthWepKeysArray() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.clear();
-        config.wepKeys = new String[0];
-
-        assertTrue(config.isOpenNetwork());
-    }
-
-    @Test
-    public void testIsOpenNetwork_IsOpen_NullWepKeysArray() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.clear();
-        config.wepKeys = new String[1];
-
-        assertTrue(config.isOpenNetwork());
-    }
-
-    @Test
-    public void testIsOpenNetwork_NotOpen_HasWepKeys() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.clear();
-        config.wepKeys = new String[] {"test"};
-
-        assertFalse(config.isOpenNetwork());
-    }
-
-    @Test
-    public void testIsOpenNetwork_NotOpen_HasNullWepKeyFollowedByNonNullKey() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.clear();
-        config.wepKeys = new String[] {null, null, "test"};
-
-        assertFalse(config.isOpenNetwork());
-    }
-
-    @Test
-    public void testIsOpenNetwork_NotOpen_HasAuthType() {
-        for (int keyMgmt = 0; keyMgmt < WifiConfiguration.KeyMgmt.strings.length; keyMgmt++) {
-            if (keyMgmt == WifiConfiguration.KeyMgmt.NONE
-                    || keyMgmt == WifiConfiguration.KeyMgmt.OWE) {
-                continue;
-            }
-            WifiConfiguration config = new WifiConfiguration();
-            config.allowedKeyManagement.clear();
-            config.allowedKeyManagement.set(keyMgmt);
-            config.wepKeys = null;
-
-            assertFalse("Open network reported when key mgmt was set to "
-                            + WifiConfiguration.KeyMgmt.strings[keyMgmt], config.isOpenNetwork());
-        }
-    }
-
-    @Test
-    public void testIsOpenNetwork_NotOpen_HasAuthTypeNoneAndMore() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
-        config.wepKeys = null;
-
-        assertFalse(config.isOpenNetwork());
-    }
-
-    @Test
-    public void testSetRandomizedMacAddress_ChangesSavedAddress() {
-        WifiConfiguration config = new WifiConfiguration();
-        MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
-        assertEquals(defaultMac, config.getRandomizedMacAddress());
-
-        MacAddress macToChangeInto = MacAddressUtils.createRandomUnicastAddress();
-        config.setRandomizedMacAddress(macToChangeInto);
-        MacAddress macAfterChange = config.getRandomizedMacAddress();
-
-        assertEquals(macToChangeInto, macAfterChange);
-    }
-
-    @Test
-    public void testSetRandomizedMacAddress_DoesNothingWhenNull() {
-        WifiConfiguration config = new WifiConfiguration();
-        MacAddress defaultMac = MacAddress.fromString(WifiInfo.DEFAULT_MAC_ADDRESS);
-        config.setRandomizedMacAddress(null);
-        assertEquals(defaultMac, config.getRandomizedMacAddress());
-    }
-
-    /**
-     * Verifies that updateIdentifier should be copied for copy constructor.
-     */
-    @Test
-    public void testUpdateIdentifierForCopyConstructor() {
-        WifiConfiguration config = new WifiConfiguration();
-        config.updateIdentifier = "1234";
-        WifiConfiguration copyConfig = new WifiConfiguration(config);
-
-        assertEquals(config.updateIdentifier, copyConfig.updateIdentifier);
-    }
-
-    /**
-     * Verifies that getKeyIdForCredentials returns the expected string for Enterprise networks
-     * @throws Exception
-     */
-    @Test
-    public void testGetKeyIdForCredentials() throws Exception {
-        WifiConfiguration config = new WifiConfiguration();
-        final String mSsid = "TestAP";
-        config.SSID = mSsid;
-
-        // Test various combinations
-        // EAP with TLS
-        config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
-        config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
-        String keyId = config.getKeyIdForCredentials(config);
-        assertEquals(keyId, mSsid + "_WPA_EAP_TLS_NULL");
-
-        // EAP with TTLS & MSCHAPv2
-        config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
-        config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TTLS);
-        config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.MSCHAPV2);
-        keyId = config.getKeyIdForCredentials(config);
-        assertEquals(keyId, mSsid + "_WPA_EAP_TTLS_MSCHAPV2");
-
-        // Suite-B 192 with PWD & GTC
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.SUITE_B_192);
-        config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.PWD);
-        config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
-        keyId = config.getKeyIdForCredentials(config);
-        assertEquals(keyId, mSsid + "_SUITE_B_192_PWD_GTC");
-
-        // IEEE8021X with SIM
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
-        config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
-        config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
-        keyId = config.getKeyIdForCredentials(config);
-        assertEquals(keyId, mSsid + "_IEEE8021X_SIM_NULL");
-
-        // Try calling this method with non-Enterprise network, expect an exception
-        boolean exceptionThrown = false;
-        try {
-            config.allowedKeyManagement.clear();
-            config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK);
-            config.preSharedKey = "TestPsk";
-            keyId = config.getKeyIdForCredentials(config);
-        } catch (IllegalStateException e) {
-            exceptionThrown = true;
-        }
-        assertTrue(exceptionThrown);
-    }
-
-    /**
-     * Verifies that getKeyIdForCredentials returns the expected string for Suggestion Enterprise
-     * networks
-     * @throws Exception
-     */
-    @Test
-    public void testGetKeyIdForCredentialsForSuggestion() throws Exception {
-        WifiConfiguration config = new WifiConfiguration();
-        final String mSsid = "TestAP";
-        final String packageName = "TestApp";
-        final String bSsid = MacAddressUtils.createRandomUnicastAddress().toString();
-        String suggestionSuffix = "_" + bSsid + "_" + packageName;
-        config.SSID = mSsid;
-        config.fromWifiNetworkSuggestion = true;
-        config.creatorName = packageName;
-        config.BSSID = bSsid;
-
-        // Test various combinations
-        // EAP with TLS
-        config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
-        config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
-        String keyId = config.getKeyIdForCredentials(config);
-        assertEquals(keyId, mSsid + "_WPA_EAP_TLS_NULL" + suggestionSuffix);
-
-        // EAP with TTLS & MSCHAPv2
-        config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
-        config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TTLS);
-        config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.MSCHAPV2);
-        keyId = config.getKeyIdForCredentials(config);
-        assertEquals(keyId, mSsid + "_WPA_EAP_TTLS_MSCHAPV2" + suggestionSuffix);
-
-        // Suite-B 192 with PWD & GTC
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.SUITE_B_192);
-        config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.PWD);
-        config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
-        keyId = config.getKeyIdForCredentials(config);
-        assertEquals(keyId, mSsid + "_SUITE_B_192_PWD_GTC" + suggestionSuffix);
-
-        // IEEE8021X with SIM
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.IEEE8021X);
-        config.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
-        config.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
-        keyId = config.getKeyIdForCredentials(config);
-        assertEquals(keyId, mSsid + "_IEEE8021X_SIM_NULL" + suggestionSuffix);
-
-        // Try calling this method with non-Enterprise network, expect an exception
-        boolean exceptionThrown = false;
-        try {
-            config.allowedKeyManagement.clear();
-            config.allowedKeyManagement.set(KeyMgmt.WPA2_PSK);
-            config.preSharedKey = "TestPsk";
-            keyId = config.getKeyIdForCredentials(config);
-        } catch (IllegalStateException e) {
-            exceptionThrown = true;
-        }
-        assertTrue(exceptionThrown);
-    }
-
-    /**
-     * Verifies that getSsidAndSecurityTypeString returns the correct String for networks of
-     * various different security types
-     */
-    @Test
-    public void testGetSsidAndSecurityTypeString() {
-        WifiConfiguration config = new WifiConfiguration();
-        final String mSsid = "TestAP";
-        config.SSID = mSsid;
-
-        // Test various combinations
-        config.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
-        assertEquals(mSsid + KeyMgmt.strings[KeyMgmt.WPA_PSK],
-                config.getSsidAndSecurityTypeString());
-
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
-        assertEquals(mSsid + KeyMgmt.strings[KeyMgmt.WPA_EAP],
-                config.getSsidAndSecurityTypeString());
-
-        config.wepKeys[0] = "TestWep";
-        config.allowedKeyManagement.clear();
-        assertEquals(mSsid + "WEP", config.getSsidAndSecurityTypeString());
-
-        // set WEP key and give a valid index.
-        config.wepKeys[0] = null;
-        config.wepKeys[2] = "TestWep";
-        config.wepTxKeyIndex = 2;
-        config.allowedKeyManagement.clear();
-        assertEquals(mSsid + "WEP", config.getSsidAndSecurityTypeString());
-
-        // set WEP key but does not give a valid index.
-        config.wepKeys[0] = null;
-        config.wepKeys[2] = "TestWep";
-        config.wepTxKeyIndex = 0;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.OWE);
-        assertEquals(mSsid + KeyMgmt.strings[KeyMgmt.OWE], config.getSsidAndSecurityTypeString());
-
-        config.wepKeys[0] = null;
-        config.wepTxKeyIndex = 0;
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.OWE);
-        assertEquals(mSsid + KeyMgmt.strings[KeyMgmt.OWE], config.getSsidAndSecurityTypeString());
-
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.SAE);
-        assertEquals(mSsid + KeyMgmt.strings[KeyMgmt.SAE], config.getSsidAndSecurityTypeString());
-
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.SUITE_B_192);
-        assertEquals(mSsid + KeyMgmt.strings[KeyMgmt.SUITE_B_192],
-                config.getSsidAndSecurityTypeString());
-
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.NONE);
-        assertEquals(mSsid + KeyMgmt.strings[KeyMgmt.NONE], config.getSsidAndSecurityTypeString());
-
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.WAPI_PSK);
-        assertEquals(mSsid + KeyMgmt.strings[KeyMgmt.WAPI_PSK],
-                config.getSsidAndSecurityTypeString());
-
-        config.allowedKeyManagement.clear();
-        config.allowedKeyManagement.set(KeyMgmt.WAPI_CERT);
-        assertEquals(mSsid + KeyMgmt.strings[KeyMgmt.WAPI_CERT],
-                config.getSsidAndSecurityTypeString());
-    }
-
-    /**
-     * Ensure that the {@link NetworkSelectionStatus.DisableReasonInfo}s are populated in
-     * {@link NetworkSelectionStatus#DISABLE_REASON_INFOS} for reason codes from 0 to
-     * {@link NetworkSelectionStatus#NETWORK_SELECTION_DISABLED_MAX} - 1.
-     */
-    @Test
-    public void testNetworkSelectionDisableReasonInfosPopulated() {
-        assertEquals(NetworkSelectionStatus.NETWORK_SELECTION_DISABLED_MAX,
-                NetworkSelectionStatus.DISABLE_REASON_INFOS.size());
-        for (int i = 0; i < NetworkSelectionStatus.NETWORK_SELECTION_DISABLED_MAX; i++) {
-            assertNotNull(NetworkSelectionStatus.DISABLE_REASON_INFOS.get(i));
-        }
-    }
-
-    /**
-     * Ensure that {@link NetworkSelectionStatus#getMaxNetworkSelectionDisableReason()} returns
-     * the maximum disable reason.
-     */
-    @Test
-    public void testNetworkSelectionGetMaxNetworkSelectionDisableReason() {
-        int maxReason = Integer.MIN_VALUE;
-        for (int i = 0; i < NetworkSelectionStatus.DISABLE_REASON_INFOS.size(); i++) {
-            int reason = NetworkSelectionStatus.DISABLE_REASON_INFOS.keyAt(i);
-            maxReason = Math.max(maxReason, reason);
-        }
-        assertEquals(maxReason, NetworkSelectionStatus.getMaxNetworkSelectionDisableReason());
-    }
-
-    /**
-     * Ensure that {@link WifiConfiguration#setSecurityParams(int)} sets up the
-     * {@link WifiConfiguration} object correctly for SAE security type.
-     * @throws Exception
-     */
-    @Test
-    public void testSetSecurityParamsForSae() throws Exception {
-        WifiConfiguration config = new WifiConfiguration();
-
-        config.setSecurityParams(SECURITY_TYPE_SAE);
-
-        assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.SAE));
-        assertTrue(config.allowedPairwiseCiphers.get(WifiConfiguration.PairwiseCipher.CCMP));
-        assertTrue(config.allowedPairwiseCiphers.get(WifiConfiguration.PairwiseCipher.GCMP_256));
-        assertTrue(config.allowedGroupCiphers.get(WifiConfiguration.GroupCipher.CCMP));
-        assertTrue(config.allowedGroupCiphers.get(WifiConfiguration.GroupCipher.GCMP_256));
-        assertTrue(config.requirePmf);
-    }
-
-    /**
-     * Ensure that {@link WifiConfiguration#setSecurityParams(int)} sets up the
-     * {@link WifiConfiguration} object correctly for OWE security type.
-     * @throws Exception
-     */
-    @Test
-    public void testSetSecurityParamsForOwe() throws Exception {
-        WifiConfiguration config = new WifiConfiguration();
-
-        config.setSecurityParams(SECURITY_TYPE_OWE);
-
-        assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.OWE));
-        assertTrue(config.allowedPairwiseCiphers.get(WifiConfiguration.PairwiseCipher.CCMP));
-        assertTrue(config.allowedPairwiseCiphers.get(WifiConfiguration.PairwiseCipher.GCMP_256));
-        assertTrue(config.allowedGroupCiphers.get(WifiConfiguration.GroupCipher.CCMP));
-        assertTrue(config.allowedGroupCiphers.get(WifiConfiguration.GroupCipher.GCMP_256));
-        assertTrue(config.requirePmf);
-    }
-
-    /**
-     * Ensure that {@link WifiConfiguration#setSecurityParams(int)} sets up the
-     * {@link WifiConfiguration} object correctly for Suite-B security type.
-     * @throws Exception
-     */
-    @Test
-    public void testSetSecurityParamsForSuiteB() throws Exception {
-        WifiConfiguration config = new WifiConfiguration();
-
-        config.setSecurityParams(SECURITY_TYPE_EAP_SUITE_B);
-
-        assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.SUITE_B_192));
-        assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP));
-        assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X));
-        assertTrue(config.allowedPairwiseCiphers.get(WifiConfiguration.PairwiseCipher.GCMP_256));
-        assertTrue(config.allowedGroupCiphers.get(WifiConfiguration.GroupCipher.GCMP_256));
-        assertTrue(config.allowedGroupManagementCiphers
-                .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
-        assertTrue(config.requirePmf);
-    }
-
-    /**
-     * Test that the NetworkSelectionStatus Builder returns the same values that was set, and that
-     * calling build multiple times returns different instances.
-     */
-    @Test
-    public void testNetworkSelectionStatusBuilder() throws Exception {
-        NetworkSelectionStatus.Builder builder = new NetworkSelectionStatus.Builder()
-                .setNetworkSelectionDisableReason(
-                        NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION)
-                .setNetworkSelectionStatus(
-                        NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED);
-
-        NetworkSelectionStatus status1 = builder.build();
-
-        assertEquals(NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION,
-                status1.getNetworkSelectionDisableReason());
-        assertEquals(NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED,
-                status1.getNetworkSelectionStatus());
-
-        NetworkSelectionStatus status2 = builder
-                .setNetworkSelectionDisableReason(NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD)
-                .build();
-
-        // different instances
-        assertNotSame(status1, status2);
-
-        // assert that status1 didn't change
-        assertEquals(NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION,
-                status1.getNetworkSelectionDisableReason());
-        assertEquals(NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED,
-                status1.getNetworkSelectionStatus());
-
-        // assert that status2 changed
-        assertEquals(NetworkSelectionStatus.DISABLED_BY_WRONG_PASSWORD,
-                status2.getNetworkSelectionDisableReason());
-        assertEquals(NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED,
-                status2.getNetworkSelectionStatus());
-    }
-
-    @Test
-    public void testNeedsPreSharedKey() throws Exception {
-        WifiConfiguration configuration = new WifiConfiguration();
-
-        configuration.setSecurityParams(SECURITY_TYPE_PSK);
-        assertTrue(configuration.needsPreSharedKey());
-
-        configuration.setSecurityParams(SECURITY_TYPE_SAE);
-        assertTrue(configuration.needsPreSharedKey());
-
-        configuration.setSecurityParams(SECURITY_TYPE_WAPI_PSK);
-        assertTrue(configuration.needsPreSharedKey());
-
-        configuration.setSecurityParams(SECURITY_TYPE_OPEN);
-        assertFalse(configuration.needsPreSharedKey());
-
-        configuration.setSecurityParams(SECURITY_TYPE_OWE);
-        assertFalse(configuration.needsPreSharedKey());
-
-        configuration.setSecurityParams(SECURITY_TYPE_EAP);
-        assertFalse(configuration.needsPreSharedKey());
-
-        configuration.setSecurityParams(SECURITY_TYPE_EAP_SUITE_B);
-        assertFalse(configuration.needsPreSharedKey());
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiEnterpriseConfigTest.java b/wifi/tests/src/android/net/wifi/WifiEnterpriseConfigTest.java
deleted file mode 100644
index 62485ec..0000000
--- a/wifi/tests/src/android/net/wifi/WifiEnterpriseConfigTest.java
+++ /dev/null
@@ -1,577 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import android.net.wifi.WifiEnterpriseConfig.Eap;
-import android.net.wifi.WifiEnterpriseConfig.Phase2;
-import android.os.Parcel;
-import android.security.Credentials;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import java.security.PrivateKey;
-import java.security.cert.X509Certificate;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiEnterpriseConfig}.
- */
-@SmallTest
-public class WifiEnterpriseConfigTest {
-    // Maintain a ground truth of the keystore uri prefix which is expected by wpa_supplicant.
-    public static final String KEYSTORE_URI = "keystore://";
-    public static final String CA_CERT_PREFIX = KEYSTORE_URI + Credentials.CA_CERTIFICATE;
-    public static final String KEYSTORES_URI = "keystores://";
-    private static final String TEST_DOMAIN_SUFFIX_MATCH = "domainSuffixMatch";
-
-    private WifiEnterpriseConfig mEnterpriseConfig;
-
-    @Before
-    public void setUp() throws Exception {
-        mEnterpriseConfig = new WifiEnterpriseConfig();
-    }
-
-    @Test
-    public void testGetEmptyCaCertificate() {
-        // A newly-constructed WifiEnterpriseConfig object should have no CA certificate.
-        assertNull(mEnterpriseConfig.getCaCertificate());
-        assertNull(mEnterpriseConfig.getCaCertificates());
-        // Setting CA certificate to null explicitly.
-        mEnterpriseConfig.setCaCertificate(null);
-        assertNull(mEnterpriseConfig.getCaCertificate());
-        // Setting CA certificate to null using setCaCertificates().
-        mEnterpriseConfig.setCaCertificates(null);
-        assertNull(mEnterpriseConfig.getCaCertificates());
-        // Setting CA certificate to zero-length array.
-        mEnterpriseConfig.setCaCertificates(new X509Certificate[0]);
-        assertNull(mEnterpriseConfig.getCaCertificates());
-    }
-
-    @Test
-    public void testSetGetSingleCaCertificate() {
-        X509Certificate cert0 = FakeKeys.CA_CERT0;
-        mEnterpriseConfig.setCaCertificate(cert0);
-        assertEquals(mEnterpriseConfig.getCaCertificate(), cert0);
-    }
-
-    @Test
-    public void testSetGetMultipleCaCertificates() {
-        X509Certificate cert0 = FakeKeys.CA_CERT0;
-        X509Certificate cert1 = FakeKeys.CA_CERT1;
-        mEnterpriseConfig.setCaCertificates(new X509Certificate[] {cert0, cert1});
-        X509Certificate[] result = mEnterpriseConfig.getCaCertificates();
-        assertEquals(result.length, 2);
-        assertTrue(result[0] == cert0 && result[1] == cert1);
-    }
-
-    @Test
-    public void testSetClientKeyEntryWithNull() {
-        mEnterpriseConfig.setClientKeyEntry(null, null);
-        assertNull(mEnterpriseConfig.getClientCertificateChain());
-        assertNull(mEnterpriseConfig.getClientCertificate());
-        mEnterpriseConfig.setClientKeyEntryWithCertificateChain(null, null);
-        assertNull(mEnterpriseConfig.getClientCertificateChain());
-        assertNull(mEnterpriseConfig.getClientCertificate());
-
-        // Setting the client certificate to null should clear the existing chain.
-        PrivateKey clientKey = FakeKeys.RSA_KEY1;
-        X509Certificate clientCert0 = FakeKeys.CLIENT_CERT;
-        X509Certificate clientCert1 = FakeKeys.CA_CERT1;
-        mEnterpriseConfig.setClientKeyEntry(clientKey, clientCert0);
-        assertNotNull(mEnterpriseConfig.getClientCertificate());
-        mEnterpriseConfig.setClientKeyEntry(null, null);
-        assertNull(mEnterpriseConfig.getClientCertificate());
-        assertNull(mEnterpriseConfig.getClientCertificateChain());
-
-        // Setting the chain to null should clear the existing chain.
-        X509Certificate[] clientChain = new X509Certificate[] {clientCert0, clientCert1};
-        mEnterpriseConfig.setClientKeyEntryWithCertificateChain(clientKey, clientChain);
-        assertNotNull(mEnterpriseConfig.getClientCertificateChain());
-        mEnterpriseConfig.setClientKeyEntryWithCertificateChain(null, null);
-        assertNull(mEnterpriseConfig.getClientCertificate());
-        assertNull(mEnterpriseConfig.getClientCertificateChain());
-    }
-
-    @Test
-    public void testSetClientCertificateChain() {
-        PrivateKey clientKey = FakeKeys.RSA_KEY1;
-        X509Certificate cert0 = FakeKeys.CLIENT_CERT;
-        X509Certificate cert1 = FakeKeys.CA_CERT1;
-        X509Certificate[] clientChain = new X509Certificate[] {cert0, cert1};
-        mEnterpriseConfig.setClientKeyEntryWithCertificateChain(clientKey, clientChain);
-        X509Certificate[] result = mEnterpriseConfig.getClientCertificateChain();
-        assertEquals(result.length, 2);
-        assertTrue(result[0] == cert0 && result[1] == cert1);
-        assertTrue(mEnterpriseConfig.getClientCertificate() == cert0);
-    }
-
-    private boolean isClientCertificateChainInvalid(X509Certificate[] clientChain) {
-        boolean exceptionThrown = false;
-        try {
-            PrivateKey clientKey = FakeKeys.RSA_KEY1;
-            mEnterpriseConfig.setClientKeyEntryWithCertificateChain(clientKey, clientChain);
-        } catch (IllegalArgumentException e) {
-            exceptionThrown = true;
-        }
-        return exceptionThrown;
-    }
-
-    @Test
-    public void testSetInvalidClientCertificateChain() {
-        X509Certificate clientCert = FakeKeys.CLIENT_CERT;
-        X509Certificate caCert = FakeKeys.CA_CERT1;
-        assertTrue("Invalid client certificate",
-                isClientCertificateChainInvalid(new X509Certificate[] {caCert, caCert}));
-        assertTrue("Invalid CA certificate",
-                isClientCertificateChainInvalid(new X509Certificate[] {clientCert, clientCert}));
-        assertTrue("Both certificates invalid",
-                isClientCertificateChainInvalid(new X509Certificate[] {caCert, clientCert}));
-    }
-
-    @Test
-    public void testSaveSingleCaCertificateAlias() {
-        final String alias = "single_alias 0";
-        mEnterpriseConfig.setCaCertificateAliases(new String[] {alias});
-        assertEquals(getCaCertField(), CA_CERT_PREFIX + alias);
-    }
-
-    @Test
-    public void testLoadSingleCaCertificateAlias() {
-        final String alias = "single_alias 1";
-        setCaCertField(CA_CERT_PREFIX + alias);
-        String[] aliases = mEnterpriseConfig.getCaCertificateAliases();
-        assertEquals(aliases.length, 1);
-        assertEquals(aliases[0], alias);
-    }
-
-    @Test
-    public void testSaveMultipleCaCertificates() {
-        final String alias0 = "single_alias 0";
-        final String alias1 = "single_alias 1";
-        mEnterpriseConfig.setCaCertificateAliases(new String[] {alias0, alias1});
-        assertEquals(getCaCertField(), String.format("%s%s %s",
-                KEYSTORES_URI,
-                WifiEnterpriseConfig.encodeCaCertificateAlias(Credentials.CA_CERTIFICATE + alias0),
-                WifiEnterpriseConfig.encodeCaCertificateAlias(Credentials.CA_CERTIFICATE + alias1)));
-    }
-
-    @Test
-    public void testLoadMultipleCaCertificates() {
-        final String alias0 = "single_alias 0";
-        final String alias1 = "single_alias 1";
-        setCaCertField(String.format("%s%s %s",
-                KEYSTORES_URI,
-                WifiEnterpriseConfig.encodeCaCertificateAlias(Credentials.CA_CERTIFICATE + alias0),
-                WifiEnterpriseConfig.encodeCaCertificateAlias(Credentials.CA_CERTIFICATE + alias1)));
-        String[] aliases = mEnterpriseConfig.getCaCertificateAliases();
-        assertEquals(aliases.length, 2);
-        assertEquals(aliases[0], alias0);
-        assertEquals(aliases[1], alias1);
-    }
-
-    private String getCaCertField() {
-        return mEnterpriseConfig.getFieldValue(WifiEnterpriseConfig.CA_CERT_KEY);
-    }
-
-    private void setCaCertField(String value) {
-        mEnterpriseConfig.setFieldValue(WifiEnterpriseConfig.CA_CERT_KEY, value);
-    }
-
-    // Retrieves the value for a specific key supplied to wpa_supplicant.
-    private class SupplicantConfigExtractor implements WifiEnterpriseConfig.SupplicantSaver {
-        private String mValue = null;
-        private String mKey;
-
-        SupplicantConfigExtractor(String key) {
-            mKey = key;
-        }
-
-        @Override
-        public boolean saveValue(String key, String value) {
-            if (key.equals(mKey)) {
-                mValue = value;
-            }
-            return true;
-        }
-
-        public String getValue() {
-            return mValue;
-        }
-    }
-
-    private String getSupplicantEapMethod() {
-        SupplicantConfigExtractor entryExtractor = new SupplicantConfigExtractor(
-                WifiEnterpriseConfig.EAP_KEY);
-        mEnterpriseConfig.saveToSupplicant(entryExtractor);
-        return entryExtractor.getValue();
-    }
-
-    private String getSupplicantPhase2Method() {
-        SupplicantConfigExtractor entryExtractor = new SupplicantConfigExtractor(
-                WifiEnterpriseConfig.PHASE2_KEY);
-        mEnterpriseConfig.saveToSupplicant(entryExtractor);
-        return entryExtractor.getValue();
-    }
-
-    /** Verifies the default value for EAP outer and inner methods */
-    @Test
-    public void eapInnerDefault() {
-        assertEquals(null, getSupplicantEapMethod());
-        assertEquals(null, getSupplicantPhase2Method());
-    }
-
-    /** Verifies that the EAP inner method is reset when we switch to TLS */
-    @Test
-    public void eapPhase2MethodForTls() {
-        // Initially select an EAP method that supports an phase2.
-        mEnterpriseConfig.setEapMethod(Eap.PEAP);
-        mEnterpriseConfig.setPhase2Method(Phase2.MSCHAPV2);
-        assertEquals("PEAP", getSupplicantEapMethod());
-        assertEquals("\"auth=MSCHAPV2\"", getSupplicantPhase2Method());
-
-        // Change the EAP method to another type which supports a phase2.
-        mEnterpriseConfig.setEapMethod(Eap.TTLS);
-        assertEquals("TTLS", getSupplicantEapMethod());
-        assertEquals("\"auth=MSCHAPV2\"", getSupplicantPhase2Method());
-
-        // Change the EAP method to TLS which does not support a phase2.
-        mEnterpriseConfig.setEapMethod(Eap.TLS);
-        assertEquals(null, getSupplicantPhase2Method());
-    }
-
-    /** Verfies that the EAP inner method is reset when we switch phase2 to NONE */
-    @Test
-    public void eapPhase2None() {
-        // Initially select an EAP method that supports an phase2.
-        mEnterpriseConfig.setEapMethod(Eap.PEAP);
-        mEnterpriseConfig.setPhase2Method(Phase2.MSCHAPV2);
-        assertEquals("PEAP", getSupplicantEapMethod());
-        assertEquals("\"auth=MSCHAPV2\"", getSupplicantPhase2Method());
-
-        // Change the phase2 method to NONE and ensure the value is cleared.
-        mEnterpriseConfig.setPhase2Method(Phase2.NONE);
-        assertEquals(null, getSupplicantPhase2Method());
-    }
-
-    /** Verfies that the correct "autheap" parameter is supplied for TTLS/GTC. */
-    @Test
-    public void peapGtcToTtls() {
-        mEnterpriseConfig.setEapMethod(Eap.PEAP);
-        mEnterpriseConfig.setPhase2Method(Phase2.GTC);
-        assertEquals("PEAP", getSupplicantEapMethod());
-        assertEquals("\"auth=GTC\"", getSupplicantPhase2Method());
-
-        mEnterpriseConfig.setEapMethod(Eap.TTLS);
-        assertEquals("TTLS", getSupplicantEapMethod());
-        assertEquals("\"autheap=GTC\"", getSupplicantPhase2Method());
-    }
-
-    /** Verfies that the correct "auth" parameter is supplied for PEAP/GTC. */
-    @Test
-    public void ttlsGtcToPeap() {
-        mEnterpriseConfig.setEapMethod(Eap.TTLS);
-        mEnterpriseConfig.setPhase2Method(Phase2.GTC);
-        assertEquals("TTLS", getSupplicantEapMethod());
-        assertEquals("\"autheap=GTC\"", getSupplicantPhase2Method());
-
-        mEnterpriseConfig.setEapMethod(Eap.PEAP);
-        assertEquals("PEAP", getSupplicantEapMethod());
-        assertEquals("\"auth=GTC\"", getSupplicantPhase2Method());
-    }
-
-    /** Verfies PEAP/SIM, PEAP/AKA, PEAP/AKA'. */
-    @Test
-    public void peapSimAkaAkaPrime() {
-        mEnterpriseConfig.setEapMethod(Eap.PEAP);
-        mEnterpriseConfig.setPhase2Method(Phase2.SIM);
-        assertEquals("PEAP", getSupplicantEapMethod());
-        assertEquals("\"auth=SIM\"", getSupplicantPhase2Method());
-
-        mEnterpriseConfig.setPhase2Method(Phase2.AKA);
-        assertEquals("\"auth=AKA\"", getSupplicantPhase2Method());
-
-        mEnterpriseConfig.setPhase2Method(Phase2.AKA_PRIME);
-        assertEquals("\"auth=AKA'\"", getSupplicantPhase2Method());
-    }
-
-    /**
-     * Verifies that the copy constructor preseves both the masked password and inner method
-     * information.
-     */
-    @Test
-    public void copyConstructor() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setPassword("*");
-        enterpriseConfig.setEapMethod(Eap.TTLS);
-        enterpriseConfig.setPhase2Method(Phase2.GTC);
-        mEnterpriseConfig = new WifiEnterpriseConfig(enterpriseConfig);
-        assertEquals("TTLS", getSupplicantEapMethod());
-        assertEquals("\"autheap=GTC\"", getSupplicantPhase2Method());
-        assertEquals("*", mEnterpriseConfig.getPassword());
-    }
-
-    /**
-     * Verifies that the copy from external ignores masked passwords and preserves the
-     * inner method information.
-     */
-    @Test
-    public void copyFromExternal() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setPassword("*");
-        enterpriseConfig.setEapMethod(Eap.TTLS);
-        enterpriseConfig.setPhase2Method(Phase2.GTC);
-        enterpriseConfig.setOcsp(WifiEnterpriseConfig.OCSP_REQUIRE_CERT_STATUS);
-        mEnterpriseConfig = new WifiEnterpriseConfig();
-        mEnterpriseConfig.copyFromExternal(enterpriseConfig, "*");
-        assertEquals("TTLS", getSupplicantEapMethod());
-        assertEquals("\"autheap=GTC\"", getSupplicantPhase2Method());
-        assertNotEquals("*", mEnterpriseConfig.getPassword());
-        assertEquals(enterpriseConfig.getOcsp(), mEnterpriseConfig.getOcsp());
-    }
-
-    /** Verfies that parceling a WifiEnterpriseConfig preseves method information. */
-    @Test
-    public void parcelConstructor() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(Eap.TTLS);
-        enterpriseConfig.setPhase2Method(Phase2.GTC);
-        Parcel parcel = Parcel.obtain();
-        enterpriseConfig.writeToParcel(parcel, 0);
-        parcel.setDataPosition(0);  // Allow parcel to be read from the beginning.
-        mEnterpriseConfig = WifiEnterpriseConfig.CREATOR.createFromParcel(parcel);
-        assertEquals("TTLS", getSupplicantEapMethod());
-        assertEquals("\"autheap=GTC\"", getSupplicantPhase2Method());
-    }
-
-    /**
-     * Verifies that parceling a WifiEnterpriseConfig preserves the key
-     * and certificates information.
-     */
-    @Test
-    public void parcelConfigWithKeyAndCerts() throws Exception {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        PrivateKey clientKey = FakeKeys.RSA_KEY1;
-        X509Certificate clientCert = FakeKeys.CLIENT_CERT;
-        X509Certificate[] caCerts = new X509Certificate[] {FakeKeys.CA_CERT0, FakeKeys.CA_CERT1};
-        enterpriseConfig.setClientKeyEntry(clientKey, clientCert);
-        enterpriseConfig.setCaCertificates(caCerts);
-        Parcel parcel = Parcel.obtain();
-        enterpriseConfig.writeToParcel(parcel, 0);
-
-        parcel.setDataPosition(0);  // Allow parcel to be read from the beginning.
-        mEnterpriseConfig = WifiEnterpriseConfig.CREATOR.createFromParcel(parcel);
-        PrivateKey actualClientKey = mEnterpriseConfig.getClientPrivateKey();
-        X509Certificate actualClientCert = mEnterpriseConfig.getClientCertificate();
-        X509Certificate[] actualCaCerts = mEnterpriseConfig.getCaCertificates();
-
-        /* Verify client private key. */
-        assertNotNull(actualClientKey);
-        assertEquals(clientKey.getAlgorithm(), actualClientKey.getAlgorithm());
-        assertArrayEquals(clientKey.getEncoded(), actualClientKey.getEncoded());
-
-        /* Verify client certificate. */
-        assertNotNull(actualClientCert);
-        assertArrayEquals(clientCert.getEncoded(), actualClientCert.getEncoded());
-
-        /* Verify CA certificates. */
-        assertNotNull(actualCaCerts);
-        assertEquals(caCerts.length, actualCaCerts.length);
-        for (int i = 0; i < caCerts.length; i++) {
-            assertNotNull(actualCaCerts[i]);
-            assertArrayEquals(caCerts[i].getEncoded(), actualCaCerts[i].getEncoded());
-        }
-    }
-
-    /** Verifies proper operation of the getKeyId() method. */
-    @Test
-    public void getKeyId() {
-        assertEquals("NULL", mEnterpriseConfig.getKeyId(null));
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(Eap.TTLS);
-        enterpriseConfig.setPhase2Method(Phase2.GTC);
-        assertEquals("TTLS_GTC", mEnterpriseConfig.getKeyId(enterpriseConfig));
-        mEnterpriseConfig.setEapMethod(Eap.PEAP);
-        mEnterpriseConfig.setPhase2Method(Phase2.MSCHAPV2);
-        assertEquals("PEAP_MSCHAPV2", mEnterpriseConfig.getKeyId(enterpriseConfig));
-    }
-
-    /** Verifies that passwords are not displayed in toString. */
-    @Test
-    public void passwordNotInToString() {
-        String password = "supersecret";
-        mEnterpriseConfig.setPassword(password);
-        assertFalse(mEnterpriseConfig.toString().contains(password));
-    }
-
-    /** Verifies that certificate ownership flag is set correctly */
-    @Test
-    public void testIsAppInstalledDeviceKeyAndCert() {
-        // First make sure that app didn't install anything
-        assertFalse(mEnterpriseConfig.isAppInstalledDeviceKeyAndCert());
-        assertFalse(mEnterpriseConfig.isAppInstalledCaCert());
-
-        // Then app loads keys via the enterprise config API
-        PrivateKey clientKey = FakeKeys.RSA_KEY1;
-        X509Certificate cert0 = FakeKeys.CLIENT_CERT;
-        X509Certificate cert1 = FakeKeys.CA_CERT1;
-        X509Certificate[] clientChain = new X509Certificate[] {cert0, cert1};
-        mEnterpriseConfig.setClientKeyEntryWithCertificateChain(clientKey, clientChain);
-        X509Certificate[] result = mEnterpriseConfig.getClientCertificateChain();
-        assertEquals(result.length, 2);
-        assertTrue(result[0] == cert0 && result[1] == cert1);
-        assertTrue(mEnterpriseConfig.getClientCertificate() == cert0);
-
-        // Make sure it is the owner now
-        assertTrue(mEnterpriseConfig.isAppInstalledDeviceKeyAndCert());
-        assertFalse(mEnterpriseConfig.isAppInstalledCaCert());
-    }
-
-    /** Verifies that certificate ownership flag is set correctly */
-    @Test
-    public void testIsAppInstalledCaCert() {
-        // First make sure that app didn't install anything
-        assertFalse(mEnterpriseConfig.isAppInstalledDeviceKeyAndCert());
-        assertFalse(mEnterpriseConfig.isAppInstalledCaCert());
-
-        // Then app loads CA cert via the enterprise config API
-        X509Certificate cert = FakeKeys.CA_CERT1;
-        mEnterpriseConfig.setCaCertificate(cert);
-        X509Certificate result = mEnterpriseConfig.getCaCertificate();
-        assertTrue(result == cert);
-
-        // Make sure it is the owner now
-        assertFalse(mEnterpriseConfig.isAppInstalledDeviceKeyAndCert());
-        assertTrue(mEnterpriseConfig.isAppInstalledCaCert());
-    }
-
-    /** Verifies that certificate ownership flag is set correctly */
-    @Test
-    public void testIsAppInstalledCaCerts() {
-        // First make sure that app didn't install anything
-        assertFalse(mEnterpriseConfig.isAppInstalledDeviceKeyAndCert());
-        assertFalse(mEnterpriseConfig.isAppInstalledCaCert());
-
-        // Then app loads CA cert via the enterprise config API
-        X509Certificate cert0 = FakeKeys.CA_CERT0;
-        X509Certificate cert1 = FakeKeys.CA_CERT1;
-        X509Certificate[] cert = new X509Certificate[] {cert0, cert1};
-
-        mEnterpriseConfig.setCaCertificates(cert);
-        X509Certificate[] result = mEnterpriseConfig.getCaCertificates();
-        assertEquals(result.length, 2);
-        assertTrue(result[0] == cert0 && result[1] == cert1);
-//        assertTrue(mEnterpriseConfig.getClientCertificate() == cert0);
-
-        // Make sure it is the owner now
-        assertFalse(mEnterpriseConfig.isAppInstalledDeviceKeyAndCert());
-        assertTrue(mEnterpriseConfig.isAppInstalledCaCert());
-    }
-
-    /** Verifies that OCSP value is set correctly. */
-    @Test
-    public void testOcspSetGet() throws Exception {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-
-        enterpriseConfig.setOcsp(WifiEnterpriseConfig.OCSP_NONE);
-        assertEquals(WifiEnterpriseConfig.OCSP_NONE, enterpriseConfig.getOcsp());
-
-        enterpriseConfig.setOcsp(WifiEnterpriseConfig.OCSP_REQUIRE_CERT_STATUS);
-        assertEquals(WifiEnterpriseConfig.OCSP_REQUIRE_CERT_STATUS, enterpriseConfig.getOcsp());
-
-        enterpriseConfig.setOcsp(WifiEnterpriseConfig.OCSP_REQUEST_CERT_STATUS);
-        assertEquals(WifiEnterpriseConfig.OCSP_REQUEST_CERT_STATUS, enterpriseConfig.getOcsp());
-
-        enterpriseConfig.setOcsp(WifiEnterpriseConfig.OCSP_REQUIRE_ALL_NON_TRUSTED_CERTS_STATUS);
-        assertEquals(WifiEnterpriseConfig.OCSP_REQUIRE_ALL_NON_TRUSTED_CERTS_STATUS,
-                enterpriseConfig.getOcsp());
-    }
-
-    /** Verifies that an exception is thrown when invalid OCSP is set. */
-    @Test
-    public void testInvalidOcspValue() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        try {
-            enterpriseConfig.setOcsp(-1);
-            fail("Should raise an IllegalArgumentException here.");
-        } catch (IllegalArgumentException e) {
-            // expected exception.
-        }
-    }
-
-    /** Verifies that the EAP inner method is reset when we switch to Unauth-TLS */
-    @Test
-    public void eapPhase2MethodForUnauthTls() {
-        // Initially select an EAP method that supports an phase2.
-        mEnterpriseConfig.setEapMethod(Eap.PEAP);
-        mEnterpriseConfig.setPhase2Method(Phase2.MSCHAPV2);
-        assertEquals("PEAP", getSupplicantEapMethod());
-        assertEquals("\"auth=MSCHAPV2\"", getSupplicantPhase2Method());
-
-        // Change the EAP method to another type which supports a phase2.
-        mEnterpriseConfig.setEapMethod(Eap.TTLS);
-        assertEquals("TTLS", getSupplicantEapMethod());
-        assertEquals("\"auth=MSCHAPV2\"", getSupplicantPhase2Method());
-
-        // Change the EAP method to Unauth-TLS which does not support a phase2.
-        mEnterpriseConfig.setEapMethod(Eap.UNAUTH_TLS);
-        assertEquals(null, getSupplicantPhase2Method());
-    }
-
-    @Test
-    public void testIsEnterpriseConfigSecure() {
-        WifiEnterpriseConfig baseConfig = new WifiEnterpriseConfig();
-        baseConfig.setEapMethod(Eap.PEAP);
-        baseConfig.setPhase2Method(Phase2.MSCHAPV2);
-        assertTrue(baseConfig.isInsecure());
-
-        WifiEnterpriseConfig noMatchConfig = new WifiEnterpriseConfig(baseConfig);
-        noMatchConfig.setCaCertificate(FakeKeys.CA_CERT0);
-        // Missing match is insecure.
-        assertTrue(noMatchConfig.isInsecure());
-
-        WifiEnterpriseConfig noCaConfig = new WifiEnterpriseConfig(baseConfig);
-        noCaConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
-        // Missing CA certificate is insecure.
-        assertTrue(noCaConfig.isInsecure());
-
-        WifiEnterpriseConfig secureConfig = new WifiEnterpriseConfig();
-        secureConfig.setEapMethod(Eap.PEAP);
-        secureConfig.setPhase2Method(Phase2.MSCHAPV2);
-        secureConfig.setCaCertificate(FakeKeys.CA_CERT0);
-        secureConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
-        assertFalse(secureConfig.isInsecure());
-
-        WifiEnterpriseConfig secureConfigWithCaAlias = new WifiEnterpriseConfig();
-        secureConfigWithCaAlias.setEapMethod(Eap.PEAP);
-        secureConfigWithCaAlias.setPhase2Method(Phase2.MSCHAPV2);
-        secureConfigWithCaAlias.setCaCertificateAliases(new String[]{"alias1", "alisa2"});
-        secureConfigWithCaAlias.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
-        assertFalse(secureConfigWithCaAlias.isInsecure());
-    }
-
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiInfoTest.java b/wifi/tests/src/android/net/wifi/WifiInfoTest.java
deleted file mode 100644
index 311bbc4..0000000
--- a/wifi/tests/src/android/net/wifi/WifiInfoTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertTrue;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.nio.charset.StandardCharsets;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiInfo}.
- */
-@SmallTest
-public class WifiInfoTest {
-    private static final long TEST_TX_SUCCESS = 1;
-    private static final long TEST_TX_RETRIES = 2;
-    private static final long TEST_TX_BAD = 3;
-    private static final long TEST_RX_SUCCESS = 4;
-    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 = ScanResult.WIFI_STANDARD_11AC;
-    private static final int TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS = 866;
-    private static final int TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS = 1200;
-    private static final String TEST_SSID = "Test123";
-    private static final String TEST_BSSID = "12:12:12:12:12:12";
-    private static final int TEST_RSSI = -60;
-    private static final int TEST_NETWORK_ID = 5;
-    private static final int TEST_NETWORK_ID2 = 6;
-
-    /**
-     *  Verify parcel write/read with WifiInfo.
-     */
-    @Test
-    public void testWifiInfoParcelWriteRead() throws Exception {
-        WifiInfo writeWifiInfo = new WifiInfo();
-        writeWifiInfo.txSuccess = TEST_TX_SUCCESS;
-        writeWifiInfo.txRetries = TEST_TX_RETRIES;
-        writeWifiInfo.txBad = TEST_TX_BAD;
-        writeWifiInfo.rxSuccess = TEST_RX_SUCCESS;
-        writeWifiInfo.setTrusted(true);
-        writeWifiInfo.setOsuAp(true);
-        writeWifiInfo.setFQDN(TEST_FQDN);
-        writeWifiInfo.setProviderFriendlyName(TEST_PROVIDER_NAME);
-        writeWifiInfo.setRequestingPackageName(TEST_PACKAGE_NAME);
-        writeWifiInfo.setWifiStandard(TEST_WIFI_STANDARD);
-        writeWifiInfo.setMaxSupportedTxLinkSpeedMbps(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS);
-        writeWifiInfo.setMaxSupportedRxLinkSpeedMbps(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS);
-
-        Parcel parcel = Parcel.obtain();
-        writeWifiInfo.writeToParcel(parcel, 0);
-        // Rewind the pointer to the head of the parcel.
-        parcel.setDataPosition(0);
-        WifiInfo readWifiInfo = WifiInfo.CREATOR.createFromParcel(parcel);
-
-        assertNotNull(readWifiInfo);
-        assertEquals(TEST_TX_SUCCESS, readWifiInfo.txSuccess);
-        assertEquals(TEST_TX_RETRIES, readWifiInfo.txRetries);
-        assertEquals(TEST_TX_BAD, readWifiInfo.txBad);
-        assertEquals(TEST_RX_SUCCESS, readWifiInfo.rxSuccess);
-        assertTrue(readWifiInfo.isTrusted());
-        assertTrue(readWifiInfo.isOsuAp());
-        assertTrue(readWifiInfo.isPasspointAp());
-        assertEquals(TEST_PACKAGE_NAME, readWifiInfo.getRequestingPackageName());
-        assertEquals(TEST_FQDN, readWifiInfo.getPasspointFqdn());
-        assertEquals(TEST_PROVIDER_NAME, readWifiInfo.getPasspointProviderFriendlyName());
-        assertEquals(TEST_WIFI_STANDARD, readWifiInfo.getWifiStandard());
-        assertEquals(TEST_MAX_SUPPORTED_TX_LINK_SPEED_MBPS,
-                readWifiInfo.getMaxSupportedTxLinkSpeedMbps());
-        assertEquals(TEST_MAX_SUPPORTED_RX_LINK_SPEED_MBPS,
-                readWifiInfo.getMaxSupportedRxLinkSpeedMbps());
-    }
-
-    /**
-     *  Verify values after reset()
-     */
-    @Test
-    public void testWifiInfoResetValue() throws Exception {
-        WifiInfo wifiInfo = new WifiInfo();
-        wifiInfo.reset();
-        assertEquals(WifiInfo.LINK_SPEED_UNKNOWN, wifiInfo.getMaxSupportedTxLinkSpeedMbps());
-        assertEquals(WifiInfo.LINK_SPEED_UNKNOWN, wifiInfo.getMaxSupportedRxLinkSpeedMbps());
-        assertEquals(WifiInfo.LINK_SPEED_UNKNOWN, wifiInfo.getTxLinkSpeedMbps());
-        assertEquals(WifiInfo.LINK_SPEED_UNKNOWN, wifiInfo.getRxLinkSpeedMbps());
-        assertEquals(WifiInfo.INVALID_RSSI, wifiInfo.getRssi());
-        assertEquals(WifiManager.UNKNOWN_SSID, wifiInfo.getSSID());
-        assertEquals(null, wifiInfo.getBSSID());
-        assertEquals(-1, wifiInfo.getNetworkId());
-    }
-
-    /**
-     * Test that the WifiInfo Builder returns the same values that was set, and that
-     * calling build multiple times returns different instances.
-     */
-    @Test
-    public void testWifiInfoBuilder() throws Exception {
-        WifiInfo.Builder builder = new WifiInfo.Builder()
-                .setSsid(TEST_SSID.getBytes(StandardCharsets.UTF_8))
-                .setBssid(TEST_BSSID)
-                .setRssi(TEST_RSSI)
-                .setNetworkId(TEST_NETWORK_ID);
-
-        WifiInfo info1 = builder.build();
-
-        assertEquals("\"" + TEST_SSID + "\"", info1.getSSID());
-        assertEquals(TEST_BSSID, info1.getBSSID());
-        assertEquals(TEST_RSSI, info1.getRssi());
-        assertEquals(TEST_NETWORK_ID, info1.getNetworkId());
-
-        WifiInfo info2 = builder
-                .setNetworkId(TEST_NETWORK_ID2)
-                .build();
-
-        // different instances
-        assertNotSame(info1, info2);
-
-        // assert that info1 didn't change
-        assertEquals("\"" + TEST_SSID + "\"", info1.getSSID());
-        assertEquals(TEST_BSSID, info1.getBSSID());
-        assertEquals(TEST_RSSI, info1.getRssi());
-        assertEquals(TEST_NETWORK_ID, info1.getNetworkId());
-
-        // assert that info2 changed
-        assertEquals("\"" + TEST_SSID + "\"", info2.getSSID());
-        assertEquals(TEST_BSSID, info2.getBSSID());
-        assertEquals(TEST_RSSI, info2.getRssi());
-        assertEquals(TEST_NETWORK_ID2, info2.getNetworkId());
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiManagerTest.java b/wifi/tests/src/android/net/wifi/WifiManagerTest.java
deleted file mode 100644
index 1398bfe..0000000
--- a/wifi/tests/src/android/net/wifi/WifiManagerTest.java
+++ /dev/null
@@ -1,2389 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static android.net.wifi.WifiConfiguration.METERED_OVERRIDE_METERED;
-import static android.net.wifi.WifiManager.ActionListener;
-import static android.net.wifi.WifiManager.BUSY;
-import static android.net.wifi.WifiManager.ERROR;
-import static android.net.wifi.WifiManager.LocalOnlyHotspotCallback.ERROR_GENERIC;
-import static android.net.wifi.WifiManager.LocalOnlyHotspotCallback.ERROR_INCOMPATIBLE_MODE;
-import static android.net.wifi.WifiManager.LocalOnlyHotspotCallback.ERROR_NO_CHANNEL;
-import static android.net.wifi.WifiManager.LocalOnlyHotspotCallback.ERROR_TETHERING_DISALLOWED;
-import static android.net.wifi.WifiManager.LocalOnlyHotspotCallback.REQUEST_REGISTERED;
-import static android.net.wifi.WifiManager.NOT_AUTHORIZED;
-import static android.net.wifi.WifiManager.OnWifiActivityEnergyInfoListener;
-import static android.net.wifi.WifiManager.SAP_START_FAILURE_GENERAL;
-import static android.net.wifi.WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS;
-import static android.net.wifi.WifiManager.STATUS_SUGGESTION_CONNECTION_FAILURE_AUTHENTICATION;
-import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLED;
-import static android.net.wifi.WifiManager.WIFI_AP_STATE_ENABLING;
-import static android.net.wifi.WifiManager.WIFI_AP_STATE_FAILED;
-import static android.net.wifi.WifiManager.WIFI_FEATURE_DPP;
-import static android.net.wifi.WifiManager.WIFI_FEATURE_OWE;
-import static android.net.wifi.WifiManager.WIFI_FEATURE_P2P;
-import static android.net.wifi.WifiManager.WIFI_FEATURE_PASSPOINT;
-import static android.net.wifi.WifiManager.WIFI_FEATURE_SCANNER;
-import static android.net.wifi.WifiManager.WIFI_FEATURE_WPA3_SAE;
-import static android.net.wifi.WifiManager.WIFI_FEATURE_WPA3_SUITE_B;
-import static android.net.wifi.WifiManager.WpsCallback;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-import static org.mockito.ArgumentMatchers.anyBoolean;
-import static org.mockito.ArgumentMatchers.nullable;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.anyInt;
-import static org.mockito.Mockito.anyList;
-import static org.mockito.Mockito.anyString;
-import static org.mockito.Mockito.doThrow;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.inOrder;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
-
-import android.app.ActivityManager;
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.net.DhcpInfo;
-import android.net.MacAddress;
-import android.net.wifi.WifiManager.LocalOnlyHotspotCallback;
-import android.net.wifi.WifiManager.LocalOnlyHotspotObserver;
-import android.net.wifi.WifiManager.LocalOnlyHotspotReservation;
-import android.net.wifi.WifiManager.LocalOnlyHotspotSubscription;
-import android.net.wifi.WifiManager.NetworkRequestMatchCallback;
-import android.net.wifi.WifiManager.NetworkRequestUserSelectionCallback;
-import android.net.wifi.WifiManager.OnWifiUsabilityStatsListener;
-import android.net.wifi.WifiManager.ScanResultsCallback;
-import android.net.wifi.WifiManager.SoftApCallback;
-import android.net.wifi.WifiManager.SuggestionConnectionStatusListener;
-import android.net.wifi.WifiManager.TrafficStateCallback;
-import android.net.wifi.WifiManager.WifiConnectedNetworkScorer;
-import android.os.Binder;
-import android.os.Build;
-import android.os.Handler;
-import android.os.HandlerExecutor;
-import android.os.IBinder;
-import android.os.RemoteException;
-import android.os.connectivity.WifiActivityEnergyInfo;
-import android.os.test.TestLooper;
-import android.util.SparseArray;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.InOrder;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.Executor;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiManager}.
- */
-@SmallTest
-public class WifiManagerTest {
-
-    private static final int ERROR_NOT_SET = -1;
-    private static final int ERROR_TEST_REASON = 5;
-    private static final int TEST_UID = 14553;
-    private static final int TEST_NETWORK_ID = 143;
-    private static final String TEST_PACKAGE_NAME = "TestPackage";
-    private static final String TEST_FEATURE_ID = "TestFeature";
-    private static final String TEST_COUNTRY_CODE = "US";
-    private static final String[] TEST_MAC_ADDRESSES = {"da:a1:19:0:0:0"};
-    private static final int TEST_AP_FREQUENCY = 2412;
-    private static final int TEST_AP_BANDWIDTH = SoftApInfo.CHANNEL_WIDTH_20MHZ;
-
-    @Mock Context mContext;
-    @Mock android.net.wifi.IWifiManager mWifiService;
-    @Mock ApplicationInfo mApplicationInfo;
-    @Mock WifiConfiguration mApConfig;
-    @Mock SoftApCallback mSoftApCallback;
-    @Mock TrafficStateCallback mTrafficStateCallback;
-    @Mock NetworkRequestMatchCallback mNetworkRequestMatchCallback;
-    @Mock OnWifiUsabilityStatsListener mOnWifiUsabilityStatsListener;
-    @Mock OnWifiActivityEnergyInfoListener mOnWifiActivityEnergyInfoListener;
-    @Mock SuggestionConnectionStatusListener mListener;
-    @Mock Runnable mRunnable;
-    @Mock Executor mExecutor;
-    @Mock Executor mAnotherExecutor;
-    @Mock ActivityManager mActivityManager;
-    @Mock WifiConnectedNetworkScorer mWifiConnectedNetworkScorer;
-
-    private Handler mHandler;
-    private TestLooper mLooper;
-    private WifiManager mWifiManager;
-    private WifiNetworkSuggestion mWifiNetworkSuggestion;
-    private ScanResultsCallback mScanResultsCallback;
-    private WifiActivityEnergyInfo mWifiActivityEnergyInfo;
-
-    /**
-     * Util function to check public field which used for softap  in WifiConfiguration
-     * same as the value in SoftApConfiguration.
-     *
-     */
-    private boolean compareWifiAndSoftApConfiguration(
-            SoftApConfiguration softApConfig, WifiConfiguration wifiConfig) {
-        if (!Objects.equals(wifiConfig.SSID, softApConfig.getSsid())) {
-            return false;
-        }
-        if (!Objects.equals(wifiConfig.BSSID, softApConfig.getBssid())) {
-            return false;
-        }
-        if (!Objects.equals(wifiConfig.preSharedKey, softApConfig.getPassphrase())) {
-            return false;
-        }
-
-        if (wifiConfig.hiddenSSID != softApConfig.isHiddenSsid()) {
-            return false;
-        }
-        switch (softApConfig.getSecurityType()) {
-            case SoftApConfiguration.SECURITY_TYPE_OPEN:
-                if (wifiConfig.getAuthType() != WifiConfiguration.KeyMgmt.NONE) {
-                    return false;
-                }
-                break;
-            case SoftApConfiguration.SECURITY_TYPE_WPA2_PSK:
-                if (wifiConfig.getAuthType() != WifiConfiguration.KeyMgmt.WPA2_PSK) {
-                    return false;
-                }
-                break;
-            default:
-                return false;
-        }
-        return true;
-    }
-
-    private SoftApConfiguration generatorTestSoftApConfig() {
-        return new SoftApConfiguration.Builder()
-                .setSsid("TestSSID")
-                .setPassphrase("TestPassphrase", SoftApConfiguration.SECURITY_TYPE_WPA2_PSK)
-                .build();
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        mLooper = new TestLooper();
-        mHandler = spy(new Handler(mLooper.getLooper()));
-        mApplicationInfo.targetSdkVersion = Build.VERSION_CODES.Q;
-        when(mContext.getApplicationInfo()).thenReturn(mApplicationInfo);
-        when(mContext.getOpPackageName()).thenReturn(TEST_PACKAGE_NAME);
-        mWifiManager = new WifiManager(mContext, mWifiService, mLooper.getLooper());
-        verify(mWifiService).getVerboseLoggingLevel();
-        mWifiNetworkSuggestion = new WifiNetworkSuggestion();
-        mScanResultsCallback = new ScanResultsCallback() {
-            @Override
-            public void onScanResultsAvailable() {
-                mRunnable.run();
-            }
-        };
-        mWifiActivityEnergyInfo = new WifiActivityEnergyInfo(0, 0, 0, 0, 0, 0);
-    }
-
-    /**
-     * Check the call to startSoftAp calls WifiService to startSoftAp with the provided
-     * WifiConfiguration.  Verify that the return value is propagated to the caller.
-     */
-    @Test
-    public void testStartSoftApCallsServiceWithWifiConfig() throws Exception {
-        when(mWifiService.startSoftAp(eq(mApConfig))).thenReturn(true);
-        assertTrue(mWifiManager.startSoftAp(mApConfig));
-
-        when(mWifiService.startSoftAp(eq(mApConfig))).thenReturn(false);
-        assertFalse(mWifiManager.startSoftAp(mApConfig));
-    }
-
-    /**
-     * Check the call to startSoftAp calls WifiService to startSoftAp with a null config.  Verify
-     * that the return value is propagated to the caller.
-     */
-    @Test
-    public void testStartSoftApCallsServiceWithNullConfig() throws Exception {
-        when(mWifiService.startSoftAp(eq(null))).thenReturn(true);
-        assertTrue(mWifiManager.startSoftAp(null));
-
-        when(mWifiService.startSoftAp(eq(null))).thenReturn(false);
-        assertFalse(mWifiManager.startSoftAp(null));
-    }
-
-    /**
-     * Check the call to stopSoftAp calls WifiService to stopSoftAp.
-     */
-    @Test
-    public void testStopSoftApCallsService() throws Exception {
-        when(mWifiService.stopSoftAp()).thenReturn(true);
-        assertTrue(mWifiManager.stopSoftAp());
-
-        when(mWifiService.stopSoftAp()).thenReturn(false);
-        assertFalse(mWifiManager.stopSoftAp());
-    }
-
-    /**
-     * Check the call to startSoftAp calls WifiService to startSoftAp with the provided
-     * WifiConfiguration.  Verify that the return value is propagated to the caller.
-     */
-    @Test
-    public void testStartTetheredHotspotCallsServiceWithSoftApConfig() throws Exception {
-        SoftApConfiguration softApConfig = generatorTestSoftApConfig();
-        when(mWifiService.startTetheredHotspot(eq(softApConfig))).thenReturn(true);
-        assertTrue(mWifiManager.startTetheredHotspot(softApConfig));
-
-        when(mWifiService.startTetheredHotspot(eq(softApConfig))).thenReturn(false);
-        assertFalse(mWifiManager.startTetheredHotspot(softApConfig));
-    }
-
-    /**
-     * Check the call to startSoftAp calls WifiService to startSoftAp with a null config.  Verify
-     * that the return value is propagated to the caller.
-     */
-    @Test
-    public void testStartTetheredHotspotCallsServiceWithNullConfig() throws Exception {
-        when(mWifiService.startTetheredHotspot(eq(null))).thenReturn(true);
-        assertTrue(mWifiManager.startTetheredHotspot(null));
-
-        when(mWifiService.startTetheredHotspot(eq(null))).thenReturn(false);
-        assertFalse(mWifiManager.startTetheredHotspot(null));
-    }
-
-    /**
-     * Test creation of a LocalOnlyHotspotReservation and verify that close properly calls
-     * WifiService.stopLocalOnlyHotspot.
-     */
-    @Test
-    public void testCreationAndCloseOfLocalOnlyHotspotReservation() throws Exception {
-        SoftApConfiguration softApConfig = generatorTestSoftApConfig();
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        when(mWifiService.startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class), anyString(),
-                nullable(String.class), eq(null))).thenReturn(REQUEST_REGISTERED);
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-
-        callback.onStarted(mWifiManager.new LocalOnlyHotspotReservation(softApConfig));
-
-        assertEquals(softApConfig, callback.mRes.getSoftApConfiguration());
-        WifiConfiguration wifiConfig = callback.mRes.getWifiConfiguration();
-        assertTrue(compareWifiAndSoftApConfiguration(softApConfig, wifiConfig));
-
-        callback.mRes.close();
-        verify(mWifiService).stopLocalOnlyHotspot();
-    }
-
-    /**
-     * Verify stopLOHS is called when try-with-resources is used properly.
-     */
-    @Test
-    public void testLocalOnlyHotspotReservationCallsStopProperlyInTryWithResources()
-            throws Exception {
-        SoftApConfiguration softApConfig = generatorTestSoftApConfig();
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        when(mWifiService.startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class), anyString(),
-                nullable(String.class), eq(null))).thenReturn(REQUEST_REGISTERED);
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-
-        callback.onStarted(mWifiManager.new LocalOnlyHotspotReservation(softApConfig));
-
-        try (WifiManager.LocalOnlyHotspotReservation res = callback.mRes) {
-            assertEquals(softApConfig, res.getSoftApConfiguration());
-            WifiConfiguration wifiConfig = callback.mRes.getWifiConfiguration();
-            assertTrue(compareWifiAndSoftApConfiguration(softApConfig, wifiConfig));
-        }
-
-        verify(mWifiService).stopLocalOnlyHotspot();
-    }
-
-    /**
-     * Test creation of a LocalOnlyHotspotSubscription.
-     * TODO: when registrations are tracked, verify removal on close.
-     */
-    @Test
-    public void testCreationOfLocalOnlyHotspotSubscription() throws Exception {
-        try (WifiManager.LocalOnlyHotspotSubscription sub =
-                     mWifiManager.new LocalOnlyHotspotSubscription()) {
-            sub.close();
-        }
-    }
-
-    public class TestLocalOnlyHotspotCallback extends LocalOnlyHotspotCallback {
-        public boolean mOnStartedCalled = false;
-        public boolean mOnStoppedCalled = false;
-        public int mFailureReason = -1;
-        public LocalOnlyHotspotReservation mRes = null;
-        public long mCallingThreadId = -1;
-
-        @Override
-        public void onStarted(LocalOnlyHotspotReservation r) {
-            mRes = r;
-            mOnStartedCalled = true;
-            mCallingThreadId = Thread.currentThread().getId();
-        }
-
-        @Override
-        public void onStopped() {
-            mOnStoppedCalled = true;
-            mCallingThreadId = Thread.currentThread().getId();
-        }
-
-        @Override
-        public void onFailed(int reason) {
-            mFailureReason = reason;
-            mCallingThreadId = Thread.currentThread().getId();
-        }
-    }
-
-    /**
-     * Verify callback is properly plumbed when called.
-     */
-    @Test
-    public void testLocalOnlyHotspotCallback() {
-        SoftApConfiguration softApConfig = generatorTestSoftApConfig();
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        assertFalse(callback.mOnStartedCalled);
-        assertFalse(callback.mOnStoppedCalled);
-        assertEquals(ERROR_NOT_SET, callback.mFailureReason);
-        assertEquals(null, callback.mRes);
-
-        // test onStarted
-        WifiManager.LocalOnlyHotspotReservation res =
-                mWifiManager.new LocalOnlyHotspotReservation(softApConfig);
-        callback.onStarted(res);
-        assertEquals(res, callback.mRes);
-        assertTrue(callback.mOnStartedCalled);
-        assertFalse(callback.mOnStoppedCalled);
-        assertEquals(ERROR_NOT_SET, callback.mFailureReason);
-
-        // test onStopped
-        callback.onStopped();
-        assertEquals(res, callback.mRes);
-        assertTrue(callback.mOnStartedCalled);
-        assertTrue(callback.mOnStoppedCalled);
-        assertEquals(ERROR_NOT_SET, callback.mFailureReason);
-
-        // test onFailed
-        callback.onFailed(ERROR_TEST_REASON);
-        assertEquals(res, callback.mRes);
-        assertTrue(callback.mOnStartedCalled);
-        assertTrue(callback.mOnStoppedCalled);
-        assertEquals(ERROR_TEST_REASON, callback.mFailureReason);
-    }
-
-    public class TestLocalOnlyHotspotObserver extends LocalOnlyHotspotObserver {
-        public boolean mOnRegistered = false;
-        public boolean mOnStartedCalled = false;
-        public boolean mOnStoppedCalled = false;
-        public SoftApConfiguration mConfig = null;
-        public LocalOnlyHotspotSubscription mSub = null;
-        public long mCallingThreadId = -1;
-
-        @Override
-        public void onRegistered(LocalOnlyHotspotSubscription sub) {
-            mOnRegistered = true;
-            mSub = sub;
-            mCallingThreadId = Thread.currentThread().getId();
-        }
-
-        @Override
-        public void onStarted(SoftApConfiguration config) {
-            mOnStartedCalled = true;
-            mConfig = config;
-            mCallingThreadId = Thread.currentThread().getId();
-        }
-
-        @Override
-        public void onStopped() {
-            mOnStoppedCalled = true;
-            mCallingThreadId = Thread.currentThread().getId();
-        }
-    }
-
-    /**
-     * Verify observer is properly plumbed when called.
-     */
-    @Test
-    public void testLocalOnlyHotspotObserver() {
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-        SoftApConfiguration softApConfig = generatorTestSoftApConfig();
-        assertFalse(observer.mOnRegistered);
-        assertFalse(observer.mOnStartedCalled);
-        assertFalse(observer.mOnStoppedCalled);
-        assertEquals(null, observer.mConfig);
-        assertEquals(null, observer.mSub);
-
-        WifiManager.LocalOnlyHotspotSubscription sub =
-                mWifiManager.new LocalOnlyHotspotSubscription();
-        observer.onRegistered(sub);
-        assertTrue(observer.mOnRegistered);
-        assertFalse(observer.mOnStartedCalled);
-        assertFalse(observer.mOnStoppedCalled);
-        assertEquals(null, observer.mConfig);
-        assertEquals(sub, observer.mSub);
-
-        observer.onStarted(softApConfig);
-        assertTrue(observer.mOnRegistered);
-        assertTrue(observer.mOnStartedCalled);
-        assertFalse(observer.mOnStoppedCalled);
-        assertEquals(softApConfig, observer.mConfig);
-        assertEquals(sub, observer.mSub);
-
-        observer.onStopped();
-        assertTrue(observer.mOnRegistered);
-        assertTrue(observer.mOnStartedCalled);
-        assertTrue(observer.mOnStoppedCalled);
-        assertEquals(softApConfig, observer.mConfig);
-        assertEquals(sub, observer.mSub);
-    }
-
-    /**
-     * Verify call to startLocalOnlyHotspot goes to WifiServiceImpl.
-     */
-    @Test
-    public void testStartLocalOnlyHotspot() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-
-        verify(mWifiService).startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class),
-                anyString(), nullable(String.class), eq(null));
-    }
-
-    /**
-     * Verify a SecurityException is thrown for callers without proper permissions for
-     * startLocalOnlyHotspot.
-     */
-    @Test(expected = SecurityException.class)
-    public void testStartLocalOnlyHotspotThrowsSecurityException() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        doThrow(new SecurityException()).when(mWifiService).startLocalOnlyHotspot(
-                any(ILocalOnlyHotspotCallback.class), anyString(), nullable(String.class),
-                eq(null));
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-    }
-
-    /**
-     * Verify an IllegalStateException is thrown for callers that already have a pending request for
-     * startLocalOnlyHotspot.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testStartLocalOnlyHotspotThrowsIllegalStateException() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        doThrow(new IllegalStateException()).when(mWifiService).startLocalOnlyHotspot(
-                any(ILocalOnlyHotspotCallback.class), anyString(), nullable(String.class),
-                eq(null));
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-    }
-
-    /**
-     * Verify that the handler provided by the caller is used for the callbacks.
-     */
-    @Test
-    public void testCorrectLooperIsUsedForHandler() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        when(mWifiService.startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class), anyString(),
-                nullable(String.class), eq(null))).thenReturn(ERROR_INCOMPATIBLE_MODE);
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-        mLooper.dispatchAll();
-        assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
-        verify(mContext, never()).getMainLooper();
-        verify(mContext, never()).getMainExecutor();
-    }
-
-    /**
-     * Verify that the main looper's thread is used if a handler is not provided by the reqiestomg
-     * application.
-     */
-    @Test
-    public void testMainLooperIsUsedWhenHandlerNotProvided() throws Exception {
-        // record thread from looper.getThread and check ids.
-        TestLooper altLooper = new TestLooper();
-        when(mContext.getMainExecutor()).thenReturn(altLooper.getNewExecutor());
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        when(mWifiService.startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class), anyString(),
-                nullable(String.class), eq(null))).thenReturn(ERROR_INCOMPATIBLE_MODE);
-        mWifiManager.startLocalOnlyHotspot(callback, null);
-        altLooper.dispatchAll();
-        assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
-        assertEquals(altLooper.getLooper().getThread().getId(), callback.mCallingThreadId);
-        verify(mContext).getMainExecutor();
-    }
-
-    /**
-     * Verify the LOHS onStarted callback is triggered when WifiManager receives a HOTSPOT_STARTED
-     * message from WifiServiceImpl.
-     */
-    @Test
-    public void testOnStartedIsCalledWithReservation() throws Exception {
-        SoftApConfiguration softApConfig = generatorTestSoftApConfig();
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        TestLooper callbackLooper = new TestLooper();
-        Handler callbackHandler = new Handler(callbackLooper.getLooper());
-        ArgumentCaptor<ILocalOnlyHotspotCallback> internalCallback =
-                ArgumentCaptor.forClass(ILocalOnlyHotspotCallback.class);
-        when(mWifiService.startLocalOnlyHotspot(internalCallback.capture(), anyString(),
-                nullable(String.class), eq(null))).thenReturn(REQUEST_REGISTERED);
-        mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
-        callbackLooper.dispatchAll();
-        mLooper.dispatchAll();
-        assertFalse(callback.mOnStartedCalled);
-        assertEquals(null, callback.mRes);
-        // now trigger the callback
-        internalCallback.getValue().onHotspotStarted(softApConfig);
-        mLooper.dispatchAll();
-        callbackLooper.dispatchAll();
-        assertTrue(callback.mOnStartedCalled);
-        assertEquals(softApConfig, callback.mRes.getSoftApConfiguration());
-        WifiConfiguration wifiConfig = callback.mRes.getWifiConfiguration();
-        assertTrue(compareWifiAndSoftApConfiguration(softApConfig, wifiConfig));
-    }
-
-    /**
-     * Verify the LOHS onStarted callback is triggered when WifiManager receives a HOTSPOT_STARTED
-     * message from WifiServiceImpl when softap enabled with SAE security type.
-     */
-    @Test
-    public void testOnStartedIsCalledWithReservationAndSaeSoftApConfig() throws Exception {
-        SoftApConfiguration softApConfig = new SoftApConfiguration.Builder()
-                .setSsid("TestSSID")
-                .setPassphrase("TestPassphrase", SoftApConfiguration.SECURITY_TYPE_WPA3_SAE)
-                .build();
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        TestLooper callbackLooper = new TestLooper();
-        Handler callbackHandler = new Handler(callbackLooper.getLooper());
-        ArgumentCaptor<ILocalOnlyHotspotCallback> internalCallback =
-                ArgumentCaptor.forClass(ILocalOnlyHotspotCallback.class);
-        when(mWifiService.startLocalOnlyHotspot(internalCallback.capture(), anyString(),
-                nullable(String.class), eq(null))).thenReturn(REQUEST_REGISTERED);
-        mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
-        callbackLooper.dispatchAll();
-        mLooper.dispatchAll();
-        assertFalse(callback.mOnStartedCalled);
-        assertEquals(null, callback.mRes);
-        // now trigger the callback
-        internalCallback.getValue().onHotspotStarted(softApConfig);
-        mLooper.dispatchAll();
-        callbackLooper.dispatchAll();
-        assertTrue(callback.mOnStartedCalled);
-        assertEquals(softApConfig, callback.mRes.getSoftApConfiguration());
-        assertEquals(null, callback.mRes.getWifiConfiguration());
-    }
-
-    /**
-     * Verify onFailed is called if WifiServiceImpl sends a HOTSPOT_STARTED message with a null
-     * config.
-     */
-    @Test
-    public void testOnStartedIsCalledWithNullConfig() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        TestLooper callbackLooper = new TestLooper();
-        Handler callbackHandler = new Handler(callbackLooper.getLooper());
-        ArgumentCaptor<ILocalOnlyHotspotCallback> internalCallback =
-                ArgumentCaptor.forClass(ILocalOnlyHotspotCallback.class);
-        when(mWifiService.startLocalOnlyHotspot(internalCallback.capture(), anyString(),
-                nullable(String.class), eq(null))).thenReturn(REQUEST_REGISTERED);
-        mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
-        callbackLooper.dispatchAll();
-        mLooper.dispatchAll();
-        assertFalse(callback.mOnStartedCalled);
-        assertEquals(null, callback.mRes);
-        // now trigger the callback
-        internalCallback.getValue().onHotspotStarted(null);
-        mLooper.dispatchAll();
-        callbackLooper.dispatchAll();
-        assertFalse(callback.mOnStartedCalled);
-        assertEquals(ERROR_GENERIC, callback.mFailureReason);
-    }
-
-    /**
-     * Verify onStopped is called if WifiServiceImpl sends a HOTSPOT_STOPPED message.
-     */
-    @Test
-    public void testOnStoppedIsCalled() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        TestLooper callbackLooper = new TestLooper();
-        Handler callbackHandler = new Handler(callbackLooper.getLooper());
-        ArgumentCaptor<ILocalOnlyHotspotCallback> internalCallback =
-                ArgumentCaptor.forClass(ILocalOnlyHotspotCallback.class);
-        when(mWifiService.startLocalOnlyHotspot(internalCallback.capture(), anyString(),
-                nullable(String.class), eq(null))).thenReturn(REQUEST_REGISTERED);
-        mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
-        callbackLooper.dispatchAll();
-        mLooper.dispatchAll();
-        assertFalse(callback.mOnStoppedCalled);
-        // now trigger the callback
-        internalCallback.getValue().onHotspotStopped();
-        mLooper.dispatchAll();
-        callbackLooper.dispatchAll();
-        assertTrue(callback.mOnStoppedCalled);
-    }
-
-    /**
-     * Verify onFailed is called if WifiServiceImpl sends a HOTSPOT_FAILED message.
-     */
-    @Test
-    public void testOnFailedIsCalled() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        TestLooper callbackLooper = new TestLooper();
-        Handler callbackHandler = new Handler(callbackLooper.getLooper());
-        ArgumentCaptor<ILocalOnlyHotspotCallback> internalCallback =
-                ArgumentCaptor.forClass(ILocalOnlyHotspotCallback.class);
-        when(mWifiService.startLocalOnlyHotspot(internalCallback.capture(), anyString(),
-                nullable(String.class), eq(null))).thenReturn(REQUEST_REGISTERED);
-        mWifiManager.startLocalOnlyHotspot(callback, callbackHandler);
-        callbackLooper.dispatchAll();
-        mLooper.dispatchAll();
-        assertEquals(ERROR_NOT_SET, callback.mFailureReason);
-        // now trigger the callback
-        internalCallback.getValue().onHotspotFailed(ERROR_NO_CHANNEL);
-        mLooper.dispatchAll();
-        callbackLooper.dispatchAll();
-        assertEquals(ERROR_NO_CHANNEL, callback.mFailureReason);
-    }
-
-    /**
-     * Verify callback triggered from startLocalOnlyHotspot with an incompatible mode failure.
-     */
-    @Test
-    public void testLocalOnlyHotspotCallbackFullOnIncompatibleMode() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        when(mWifiService.startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class), anyString(),
-                nullable(String.class), eq(null))).thenReturn(ERROR_INCOMPATIBLE_MODE);
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-        mLooper.dispatchAll();
-        assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
-        assertFalse(callback.mOnStartedCalled);
-        assertFalse(callback.mOnStoppedCalled);
-        assertEquals(null, callback.mRes);
-    }
-
-    /**
-     * Verify callback triggered from startLocalOnlyHotspot with a tethering disallowed failure.
-     */
-    @Test
-    public void testLocalOnlyHotspotCallbackFullOnTetheringDisallowed() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        when(mWifiService.startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class), anyString(),
-                nullable(String.class), eq(null))).thenReturn(ERROR_TETHERING_DISALLOWED);
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-        mLooper.dispatchAll();
-        assertEquals(ERROR_TETHERING_DISALLOWED, callback.mFailureReason);
-        assertFalse(callback.mOnStartedCalled);
-        assertFalse(callback.mOnStoppedCalled);
-        assertEquals(null, callback.mRes);
-    }
-
-    /**
-     * Verify a SecurityException resulting from an application without necessary permissions will
-     * bubble up through the call to start LocalOnlyHotspot and will not trigger other callbacks.
-     */
-    @Test(expected = SecurityException.class)
-    public void testLocalOnlyHotspotCallbackFullOnSecurityException() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        doThrow(new SecurityException()).when(mWifiService).startLocalOnlyHotspot(
-                any(ILocalOnlyHotspotCallback.class), anyString(), nullable(String.class),
-                eq(null));
-        try {
-            mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-        } catch (SecurityException e) {
-            assertEquals(ERROR_NOT_SET, callback.mFailureReason);
-            assertFalse(callback.mOnStartedCalled);
-            assertFalse(callback.mOnStoppedCalled);
-            assertEquals(null, callback.mRes);
-            throw e;
-        }
-
-    }
-
-    /**
-     * Verify the handler passed to startLocalOnlyHotspot is correctly used for callbacks when
-     * SoftApMode fails due to a underlying error.
-     */
-    @Test
-    public void testLocalOnlyHotspotCallbackFullOnNoChannelError() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        when(mWifiService.startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class), anyString(),
-                nullable(String.class), eq(null))).thenReturn(REQUEST_REGISTERED);
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-        mLooper.dispatchAll();
-        //assertEquals(ERROR_NO_CHANNEL, callback.mFailureReason);
-        assertFalse(callback.mOnStartedCalled);
-        assertFalse(callback.mOnStoppedCalled);
-        assertEquals(null, callback.mRes);
-    }
-
-    /**
-     * Verify that the call to cancel a LOHS request does call stopLOHS.
-     */
-    @Test
-    public void testCancelLocalOnlyHotspotRequestCallsStopOnWifiService() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        when(mWifiService.startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class), anyString(),
-                nullable(String.class), eq(null))).thenReturn(REQUEST_REGISTERED);
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-        mWifiManager.cancelLocalOnlyHotspotRequest();
-        verify(mWifiService).stopLocalOnlyHotspot();
-    }
-
-    /**
-     * Verify that we do not crash if cancelLocalOnlyHotspotRequest is called without an existing
-     * callback stored.
-     */
-    @Test
-    public void testCancelLocalOnlyHotspotReturnsWithoutExistingRequest() {
-        mWifiManager.cancelLocalOnlyHotspotRequest();
-    }
-
-    /**
-     * Verify that the callback is not triggered if the LOHS request was already cancelled.
-     */
-    @Test
-    public void testCallbackAfterLocalOnlyHotspotWasCancelled() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        when(mWifiService.startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class), anyString(),
-                nullable(String.class), eq(null))).thenReturn(REQUEST_REGISTERED);
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-        mWifiManager.cancelLocalOnlyHotspotRequest();
-        verify(mWifiService).stopLocalOnlyHotspot();
-        mLooper.dispatchAll();
-        assertEquals(ERROR_NOT_SET, callback.mFailureReason);
-        assertFalse(callback.mOnStartedCalled);
-        assertFalse(callback.mOnStoppedCalled);
-        assertEquals(null, callback.mRes);
-    }
-
-    /**
-     * Verify that calling cancel LOHS request does not crash if an error callback was already
-     * handled.
-     */
-    @Test
-    public void testCancelAfterLocalOnlyHotspotCallbackTriggered() throws Exception {
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        when(mWifiService.startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class), anyString(),
-                nullable(String.class), eq(null))).thenReturn(ERROR_INCOMPATIBLE_MODE);
-        mWifiManager.startLocalOnlyHotspot(callback, mHandler);
-        mLooper.dispatchAll();
-        assertEquals(ERROR_INCOMPATIBLE_MODE, callback.mFailureReason);
-        assertFalse(callback.mOnStartedCalled);
-        assertFalse(callback.mOnStoppedCalled);
-        assertEquals(null, callback.mRes);
-        mWifiManager.cancelLocalOnlyHotspotRequest();
-        verify(mWifiService, never()).stopLocalOnlyHotspot();
-    }
-
-    @Test
-    public void testStartLocalOnlyHotspotForwardsCustomConfig() throws Exception {
-        SoftApConfiguration customConfig = new SoftApConfiguration.Builder()
-                .setSsid("customSsid")
-                .build();
-        TestLocalOnlyHotspotCallback callback = new TestLocalOnlyHotspotCallback();
-        mWifiManager.startLocalOnlyHotspot(customConfig, mExecutor, callback);
-        verify(mWifiService).startLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class),
-                anyString(), nullable(String.class), eq(customConfig));
-    }
-
-    /**
-     * Verify the watchLocalOnlyHotspot call goes to WifiServiceImpl.
-     */
-    @Test
-    public void testWatchLocalOnlyHotspot() throws Exception {
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-
-        mWifiManager.watchLocalOnlyHotspot(observer, mHandler);
-        verify(mWifiService).startWatchLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class));
-    }
-
-    /**
-     * Verify a SecurityException is thrown for callers without proper permissions for
-     * startWatchLocalOnlyHotspot.
-     */
-    @Test(expected = SecurityException.class)
-    public void testStartWatchLocalOnlyHotspotThrowsSecurityException() throws Exception {
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-        doThrow(new SecurityException()).when(mWifiService)
-                .startWatchLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class));
-        mWifiManager.watchLocalOnlyHotspot(observer, mHandler);
-    }
-
-    /**
-     * Verify an IllegalStateException is thrown for callers that already have a pending request for
-     * watchLocalOnlyHotspot.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testStartWatchLocalOnlyHotspotThrowsIllegalStateException() throws Exception {
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-        doThrow(new IllegalStateException()).when(mWifiService)
-                .startWatchLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class));
-        mWifiManager.watchLocalOnlyHotspot(observer, mHandler);
-    }
-
-    /**
-     * Verify an IllegalArgumentException is thrown if callback is not provided.
-     */
-    @Test
-    public void registerSoftApCallbackThrowsIllegalArgumentExceptionOnNullArgumentForCallback() {
-        try {
-            mWifiManager.registerSoftApCallback(new HandlerExecutor(mHandler), null);
-            fail("expected IllegalArgumentException");
-        } catch (IllegalArgumentException expected) {
-        }
-    }
-
-    /**
-     * Verify an IllegalArgumentException is thrown if executor is null.
-     */
-    @Test
-    public void registerSoftApCallbackThrowsIllegalArgumentExceptionOnNullArgumentForExecutor() {
-        try {
-            mWifiManager.registerSoftApCallback(null, mSoftApCallback);
-            fail("expected IllegalArgumentException");
-        } catch (IllegalArgumentException expected) {
-        }
-    }
-
-    /**
-     * Verify an IllegalArgumentException is thrown if callback is not provided.
-     */
-    @Test
-    public void unregisterSoftApCallbackThrowsIllegalArgumentExceptionOnNullArgumentForCallback() {
-        try {
-            mWifiManager.unregisterSoftApCallback(null);
-            fail("expected IllegalArgumentException");
-        } catch (IllegalArgumentException expected) {
-        }
-    }
-
-    /**
-     * Verify the call to registerSoftApCallback goes to WifiServiceImpl.
-     */
-    @Test
-    public void registerSoftApCallbackCallGoesToWifiServiceImpl() throws Exception {
-        mWifiManager.registerSoftApCallback(new HandlerExecutor(mHandler), mSoftApCallback);
-        verify(mWifiService).registerSoftApCallback(any(IBinder.class),
-                any(ISoftApCallback.Stub.class), anyInt());
-    }
-
-    /**
-     * Verify the call to unregisterSoftApCallback goes to WifiServiceImpl.
-     */
-    @Test
-    public void unregisterSoftApCallbackCallGoesToWifiServiceImpl() throws Exception {
-        ArgumentCaptor<Integer> callbackIdentifier = ArgumentCaptor.forClass(Integer.class);
-        mWifiManager.registerSoftApCallback(new HandlerExecutor(mHandler), mSoftApCallback);
-        verify(mWifiService).registerSoftApCallback(any(IBinder.class),
-                any(ISoftApCallback.Stub.class), callbackIdentifier.capture());
-
-        mWifiManager.unregisterSoftApCallback(mSoftApCallback);
-        verify(mWifiService).unregisterSoftApCallback(eq((int) callbackIdentifier.getValue()));
-    }
-
-    /*
-     * Verify client-provided callback is being called through callback proxy
-     */
-    @Test
-    public void softApCallbackProxyCallsOnStateChanged() throws Exception {
-        ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ISoftApCallback.Stub.class);
-        mWifiManager.registerSoftApCallback(new HandlerExecutor(mHandler), mSoftApCallback);
-        verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(),
-                anyInt());
-
-        callbackCaptor.getValue().onStateChanged(WIFI_AP_STATE_ENABLED, 0);
-        mLooper.dispatchAll();
-        verify(mSoftApCallback).onStateChanged(WIFI_AP_STATE_ENABLED, 0);
-    }
-
-    /*
-     * Verify client-provided callback is being called through callback proxy
-     */
-    @Test
-    public void softApCallbackProxyCallsOnConnectedClientsChanged() throws Exception {
-        ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ISoftApCallback.Stub.class);
-        mWifiManager.registerSoftApCallback(new HandlerExecutor(mHandler), mSoftApCallback);
-        verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(),
-                anyInt());
-
-        final List<WifiClient> testClients = new ArrayList();
-        callbackCaptor.getValue().onConnectedClientsChanged(testClients);
-        mLooper.dispatchAll();
-        verify(mSoftApCallback).onConnectedClientsChanged(testClients);
-    }
-
-
-    /*
-     * Verify client-provided callback is being called through callback proxy
-     */
-    @Test
-    public void softApCallbackProxyCallsOnSoftApInfoChanged() throws Exception {
-        SoftApInfo testSoftApInfo = new SoftApInfo();
-        testSoftApInfo.setFrequency(TEST_AP_FREQUENCY);
-        testSoftApInfo.setBandwidth(TEST_AP_BANDWIDTH);
-        ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ISoftApCallback.Stub.class);
-        mWifiManager.registerSoftApCallback(new HandlerExecutor(mHandler), mSoftApCallback);
-        verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(),
-                anyInt());
-
-        callbackCaptor.getValue().onInfoChanged(testSoftApInfo);
-        mLooper.dispatchAll();
-        verify(mSoftApCallback).onInfoChanged(testSoftApInfo);
-    }
-
-
-    /*
-     * Verify client-provided callback is being called through callback proxy
-     */
-    @Test
-    public void softApCallbackProxyCallsOnCapabilityChanged() throws Exception {
-        SoftApCapability testSoftApCapability = new SoftApCapability(0);
-        testSoftApCapability.setMaxSupportedClients(10);
-        ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ISoftApCallback.Stub.class);
-        mWifiManager.registerSoftApCallback(new HandlerExecutor(mHandler), mSoftApCallback);
-        verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(),
-                anyInt());
-
-        callbackCaptor.getValue().onCapabilityChanged(testSoftApCapability);
-        mLooper.dispatchAll();
-        verify(mSoftApCallback).onCapabilityChanged(testSoftApCapability);
-    }
-
-    /*
-     * Verify client-provided callback is being called through callback proxy
-     */
-    @Test
-    public void softApCallbackProxyCallsOnBlockedClientConnecting() throws Exception {
-        WifiClient testWifiClient = new WifiClient(MacAddress.fromString("22:33:44:55:66:77"));
-        ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ISoftApCallback.Stub.class);
-        mWifiManager.registerSoftApCallback(new HandlerExecutor(mHandler), mSoftApCallback);
-        verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(),
-                anyInt());
-
-        callbackCaptor.getValue().onBlockedClientConnecting(testWifiClient,
-                WifiManager.SAP_CLIENT_BLOCK_REASON_CODE_NO_MORE_STAS);
-        mLooper.dispatchAll();
-        verify(mSoftApCallback).onBlockedClientConnecting(testWifiClient,
-                WifiManager.SAP_CLIENT_BLOCK_REASON_CODE_NO_MORE_STAS);
-    }
-
-    /*
-     * Verify client-provided callback is being called through callback proxy on multiple events
-     */
-    @Test
-    public void softApCallbackProxyCallsOnMultipleUpdates() throws Exception {
-        SoftApInfo testSoftApInfo = new SoftApInfo();
-        testSoftApInfo.setFrequency(TEST_AP_FREQUENCY);
-        testSoftApInfo.setBandwidth(TEST_AP_BANDWIDTH);
-        SoftApCapability testSoftApCapability = new SoftApCapability(0);
-        testSoftApCapability.setMaxSupportedClients(10);
-        ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ISoftApCallback.Stub.class);
-        mWifiManager.registerSoftApCallback(new HandlerExecutor(mHandler), mSoftApCallback);
-        verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(),
-                anyInt());
-
-        final List<WifiClient> testClients = new ArrayList();
-        callbackCaptor.getValue().onStateChanged(WIFI_AP_STATE_ENABLING, 0);
-        callbackCaptor.getValue().onConnectedClientsChanged(testClients);
-        callbackCaptor.getValue().onInfoChanged(testSoftApInfo);
-        callbackCaptor.getValue().onStateChanged(WIFI_AP_STATE_FAILED, SAP_START_FAILURE_GENERAL);
-        callbackCaptor.getValue().onCapabilityChanged(testSoftApCapability);
-
-
-        mLooper.dispatchAll();
-        verify(mSoftApCallback).onStateChanged(WIFI_AP_STATE_ENABLING, 0);
-        verify(mSoftApCallback).onConnectedClientsChanged(testClients);
-        verify(mSoftApCallback).onInfoChanged(testSoftApInfo);
-        verify(mSoftApCallback).onStateChanged(WIFI_AP_STATE_FAILED, SAP_START_FAILURE_GENERAL);
-        verify(mSoftApCallback).onCapabilityChanged(testSoftApCapability);
-    }
-
-    /*
-     * Verify client-provided callback is being called on the correct thread
-     */
-    @Test
-    public void softApCallbackIsCalledOnCorrectThread() throws Exception {
-        ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ISoftApCallback.Stub.class);
-        TestLooper altLooper = new TestLooper();
-        Handler altHandler = new Handler(altLooper.getLooper());
-        mWifiManager.registerSoftApCallback(new HandlerExecutor(altHandler), mSoftApCallback);
-        verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(),
-                anyInt());
-
-        callbackCaptor.getValue().onStateChanged(WIFI_AP_STATE_ENABLED, 0);
-        altLooper.dispatchAll();
-        verify(mSoftApCallback).onStateChanged(WIFI_AP_STATE_ENABLED, 0);
-    }
-
-    /**
-     * Verify that the handler provided by the caller is used for registering soft AP callback.
-     */
-    @Test
-    public void testCorrectLooperIsUsedForSoftApCallbackHandler() throws Exception {
-        mWifiManager.registerSoftApCallback(new HandlerExecutor(mHandler), mSoftApCallback);
-        mLooper.dispatchAll();
-        verify(mWifiService).registerSoftApCallback(any(IBinder.class),
-                any(ISoftApCallback.Stub.class), anyInt());
-        verify(mContext, never()).getMainLooper();
-        verify(mContext, never()).getMainExecutor();
-    }
-
-    /**
-     * Verify that the handler provided by the caller is used for the observer.
-     */
-    @Test
-    public void testCorrectLooperIsUsedForObserverHandler() throws Exception {
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-        mWifiManager.watchLocalOnlyHotspot(observer, mHandler);
-        mLooper.dispatchAll();
-        assertTrue(observer.mOnRegistered);
-        verify(mContext, never()).getMainLooper();
-        verify(mContext, never()).getMainExecutor();
-    }
-
-    /**
-     * Verify that the main looper's thread is used if a handler is not provided by the requesting
-     * application.
-     */
-    @Test
-    public void testMainLooperIsUsedWhenHandlerNotProvidedForObserver() throws Exception {
-        // record thread from looper.getThread and check ids.
-        TestLooper altLooper = new TestLooper();
-        when(mContext.getMainExecutor()).thenReturn(altLooper.getNewExecutor());
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-        mWifiManager.watchLocalOnlyHotspot(observer, null);
-        altLooper.dispatchAll();
-        assertTrue(observer.mOnRegistered);
-        assertEquals(altLooper.getLooper().getThread().getId(), observer.mCallingThreadId);
-        verify(mContext).getMainExecutor();
-    }
-
-    /**
-     * Verify the LOHS onRegistered observer callback is triggered when WifiManager receives a
-     * HOTSPOT_OBSERVER_REGISTERED message from WifiServiceImpl.
-     */
-    @Test
-    public void testOnRegisteredIsCalledWithSubscription() throws Exception {
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-        TestLooper observerLooper = new TestLooper();
-        Handler observerHandler = new Handler(observerLooper.getLooper());
-        assertFalse(observer.mOnRegistered);
-        assertEquals(null, observer.mSub);
-        mWifiManager.watchLocalOnlyHotspot(observer, observerHandler);
-        verify(mWifiService).startWatchLocalOnlyHotspot(any(ILocalOnlyHotspotCallback.class));
-        // now trigger the callback
-        observerLooper.dispatchAll();
-        mLooper.dispatchAll();
-        assertTrue(observer.mOnRegistered);
-        assertNotNull(observer.mSub);
-    }
-
-    /**
-     * Verify the LOHS onStarted observer callback is triggered when WifiManager receives a
-     * HOTSPOT_STARTED message from WifiServiceImpl.
-     */
-    @Test
-    public void testObserverOnStartedIsCalledWithWifiConfig() throws Exception {
-        SoftApConfiguration softApConfig = generatorTestSoftApConfig();
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-        TestLooper observerLooper = new TestLooper();
-        Handler observerHandler = new Handler(observerLooper.getLooper());
-        mWifiManager.watchLocalOnlyHotspot(observer, observerHandler);
-        ArgumentCaptor<ILocalOnlyHotspotCallback> internalCallback =
-                ArgumentCaptor.forClass(ILocalOnlyHotspotCallback.class);
-        verify(mWifiService).startWatchLocalOnlyHotspot(internalCallback.capture());
-        observerLooper.dispatchAll();
-        mLooper.dispatchAll();
-        assertFalse(observer.mOnStartedCalled);
-        // now trigger the callback
-        internalCallback.getValue().onHotspotStarted(softApConfig);
-        mLooper.dispatchAll();
-        observerLooper.dispatchAll();
-        assertTrue(observer.mOnStartedCalled);
-        assertEquals(softApConfig, observer.mConfig);
-    }
-
-    /**
-     * Verify the LOHS onStarted observer callback is triggered not when WifiManager receives a
-     * HOTSPOT_STARTED message from WifiServiceImpl with a null config.
-     */
-    @Test
-    public void testObserverOnStartedNotCalledWithNullConfig() throws Exception {
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-        TestLooper observerLooper = new TestLooper();
-        Handler observerHandler = new Handler(observerLooper.getLooper());
-        mWifiManager.watchLocalOnlyHotspot(observer, observerHandler);
-        ArgumentCaptor<ILocalOnlyHotspotCallback> internalCallback =
-                ArgumentCaptor.forClass(ILocalOnlyHotspotCallback.class);
-        verify(mWifiService).startWatchLocalOnlyHotspot(internalCallback.capture());
-        observerLooper.dispatchAll();
-        mLooper.dispatchAll();
-        assertFalse(observer.mOnStartedCalled);
-        // now trigger the callback
-        internalCallback.getValue().onHotspotStarted(null);
-        mLooper.dispatchAll();
-        observerLooper.dispatchAll();
-        assertFalse(observer.mOnStartedCalled);
-        assertEquals(null, observer.mConfig);
-    }
-
-
-    /**
-     * Verify the LOHS onStopped observer callback is triggered when WifiManager receives a
-     * HOTSPOT_STOPPED message from WifiServiceImpl.
-     */
-    @Test
-    public void testObserverOnStoppedIsCalled() throws Exception {
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-        TestLooper observerLooper = new TestLooper();
-        Handler observerHandler = new Handler(observerLooper.getLooper());
-        mWifiManager.watchLocalOnlyHotspot(observer, observerHandler);
-        ArgumentCaptor<ILocalOnlyHotspotCallback> internalCallback =
-                ArgumentCaptor.forClass(ILocalOnlyHotspotCallback.class);
-        verify(mWifiService).startWatchLocalOnlyHotspot(internalCallback.capture());
-        observerLooper.dispatchAll();
-        mLooper.dispatchAll();
-        assertFalse(observer.mOnStoppedCalled);
-        // now trigger the callback
-        internalCallback.getValue().onHotspotStopped();
-        mLooper.dispatchAll();
-        observerLooper.dispatchAll();
-        assertTrue(observer.mOnStoppedCalled);
-    }
-
-    /**
-     * Verify WifiServiceImpl is not called if there is not a registered LOHS observer callback.
-     */
-    @Test
-    public void testUnregisterWifiServiceImplNotCalledWithoutRegisteredObserver() throws Exception {
-        mWifiManager.unregisterLocalOnlyHotspotObserver();
-        verifyZeroInteractions(mWifiService);
-    }
-
-    /**
-     * Verify WifiServiceImpl is called when there is a registered LOHS observer callback.
-     */
-    @Test
-    public void testUnregisterWifiServiceImplCalledWithRegisteredObserver() throws Exception {
-        TestLocalOnlyHotspotObserver observer = new TestLocalOnlyHotspotObserver();
-        TestLooper observerLooper = new TestLooper();
-        Handler observerHandler = new Handler(observerLooper.getLooper());
-        mWifiManager.watchLocalOnlyHotspot(observer, observerHandler);
-        mWifiManager.unregisterLocalOnlyHotspotObserver();
-        verify(mWifiService).stopWatchLocalOnlyHotspot();
-    }
-
-    /**
-     * Test that calls to get the current WPS config token return null and do not have any
-     * interactions with WifiServiceImpl.
-     */
-    @Test
-    public void testGetCurrentNetworkWpsNfcConfigurationTokenReturnsNull() {
-        assertNull(mWifiManager.getCurrentNetworkWpsNfcConfigurationToken());
-        verifyNoMoreInteractions(mWifiService);
-    }
-
-
-    class WpsCallbackTester extends WpsCallback {
-        public boolean mStarted = false;
-        public boolean mSucceeded = false;
-        public boolean mFailed = false;
-        public int mFailureCode = -1;
-
-        @Override
-        public void onStarted(String pin) {
-            mStarted = true;
-        }
-
-        @Override
-        public void onSucceeded() {
-            mSucceeded = true;
-        }
-
-        @Override
-        public void onFailed(int reason) {
-            mFailed = true;
-            mFailureCode = reason;
-        }
-
-    }
-
-    /**
-     * Verify that a call to start WPS immediately returns a failure.
-     */
-    @Test
-    public void testStartWpsImmediatelyFailsWithCallback() {
-        WpsCallbackTester wpsCallback = new WpsCallbackTester();
-        mWifiManager.startWps(null, wpsCallback);
-        assertTrue(wpsCallback.mFailed);
-        assertEquals(ERROR, wpsCallback.mFailureCode);
-        assertFalse(wpsCallback.mStarted);
-        assertFalse(wpsCallback.mSucceeded);
-        verifyNoMoreInteractions(mWifiService);
-    }
-
-    /**
-     * Verify that a call to start WPS does not go to WifiServiceImpl if we do not have a callback.
-     */
-    @Test
-    public void testStartWpsDoesNotCallWifiServiceImpl() {
-        mWifiManager.startWps(null, null);
-        verifyNoMoreInteractions(mWifiService);
-    }
-
-    /**
-     * Verify that a call to cancel WPS immediately returns a failure.
-     */
-    @Test
-    public void testCancelWpsImmediatelyFailsWithCallback() {
-        WpsCallbackTester wpsCallback = new WpsCallbackTester();
-        mWifiManager.cancelWps(wpsCallback);
-        assertTrue(wpsCallback.mFailed);
-        assertEquals(ERROR, wpsCallback.mFailureCode);
-        assertFalse(wpsCallback.mStarted);
-        assertFalse(wpsCallback.mSucceeded);
-        verifyNoMoreInteractions(mWifiService);
-    }
-
-    /**
-     * Verify that a call to cancel WPS does not go to WifiServiceImpl if we do not have a callback.
-     */
-    @Test
-    public void testCancelWpsDoesNotCallWifiServiceImpl() {
-        mWifiManager.cancelWps(null);
-        verifyNoMoreInteractions(mWifiService);
-    }
-
-    /**
-     * Verify that a successful call properly returns true.
-     */
-    @Test
-    public void testSetWifiApConfigurationSuccessReturnsTrue() throws Exception {
-        WifiConfiguration apConfig = new WifiConfiguration();
-
-        when(mWifiService.setWifiApConfiguration(eq(apConfig), eq(TEST_PACKAGE_NAME)))
-                .thenReturn(true);
-        assertTrue(mWifiManager.setWifiApConfiguration(apConfig));
-    }
-
-    /**
-     * Verify that a failed call properly returns false.
-     */
-    @Test
-    public void testSetWifiApConfigurationFailureReturnsFalse() throws Exception {
-        WifiConfiguration apConfig = new WifiConfiguration();
-
-        when(mWifiService.setWifiApConfiguration(eq(apConfig), eq(TEST_PACKAGE_NAME)))
-                .thenReturn(false);
-        assertFalse(mWifiManager.setWifiApConfiguration(apConfig));
-    }
-
-    /**
-     * Verify Exceptions are rethrown when underlying calls to WifiService throw exceptions.
-     */
-    @Test
-    public void testSetWifiApConfigurationRethrowsException() throws Exception {
-        doThrow(new SecurityException()).when(mWifiService).setWifiApConfiguration(any(), any());
-
-        try {
-            mWifiManager.setWifiApConfiguration(new WifiConfiguration());
-            fail("setWifiApConfiguration should rethrow Exceptions from WifiService");
-        } catch (SecurityException e) { }
-    }
-
-    /**
-     * Verify that a successful call properly returns true.
-     */
-    @Test
-    public void testSetSoftApConfigurationSuccessReturnsTrue() throws Exception {
-        SoftApConfiguration apConfig = generatorTestSoftApConfig();
-
-        when(mWifiService.setSoftApConfiguration(eq(apConfig), eq(TEST_PACKAGE_NAME)))
-                .thenReturn(true);
-        assertTrue(mWifiManager.setSoftApConfiguration(apConfig));
-    }
-
-    /**
-     * Verify that a failed call properly returns false.
-     */
-    @Test
-    public void testSetSoftApConfigurationFailureReturnsFalse() throws Exception {
-        SoftApConfiguration apConfig = generatorTestSoftApConfig();
-
-        when(mWifiService.setSoftApConfiguration(eq(apConfig), eq(TEST_PACKAGE_NAME)))
-                .thenReturn(false);
-        assertFalse(mWifiManager.setSoftApConfiguration(apConfig));
-    }
-
-    /**
-     * Verify Exceptions are rethrown when underlying calls to WifiService throw exceptions.
-     */
-    @Test
-    public void testSetSoftApConfigurationRethrowsException() throws Exception {
-        doThrow(new SecurityException()).when(mWifiService).setSoftApConfiguration(any(), any());
-
-        try {
-            mWifiManager.setSoftApConfiguration(generatorTestSoftApConfig());
-            fail("setWifiApConfiguration should rethrow Exceptions from WifiService");
-        } catch (SecurityException e) { }
-    }
-
-    /**
-     * Check the call to startScan calls WifiService.
-     */
-    @Test
-    public void testStartScan() throws Exception {
-        when(mWifiService.startScan(eq(TEST_PACKAGE_NAME), nullable(String.class))).thenReturn(
-                true);
-        assertTrue(mWifiManager.startScan());
-
-        when(mWifiService.startScan(eq(TEST_PACKAGE_NAME), nullable(String.class))).thenReturn(
-                false);
-        assertFalse(mWifiManager.startScan());
-    }
-
-    /**
-     * Verify main looper is used when handler is not provided.
-     */
-    @Test
-    public void registerTrafficStateCallbackUsesMainLooperOnNullArgumentForHandler()
-            throws Exception {
-        ArgumentCaptor<ITrafficStateCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ITrafficStateCallback.Stub.class);
-        mWifiManager.registerTrafficStateCallback(
-                new HandlerExecutor(new Handler(mLooper.getLooper())), mTrafficStateCallback);
-        verify(mWifiService).registerTrafficStateCallback(
-                any(IBinder.class), callbackCaptor.capture(), anyInt());
-
-        assertEquals(0, mLooper.dispatchAll());
-        callbackCaptor.getValue().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_INOUT);
-        assertEquals(1, mLooper.dispatchAll());
-        verify(mTrafficStateCallback).onStateChanged(TrafficStateCallback.DATA_ACTIVITY_INOUT);
-    }
-
-    /**
-     * Verify the call to unregisterTrafficStateCallback goes to WifiServiceImpl.
-     */
-    @Test
-    public void unregisterTrafficStateCallbackCallGoesToWifiServiceImpl() throws Exception {
-        ArgumentCaptor<Integer> callbackIdentifier = ArgumentCaptor.forClass(Integer.class);
-        mWifiManager.registerTrafficStateCallback(new HandlerExecutor(mHandler),
-                mTrafficStateCallback);
-        verify(mWifiService).registerTrafficStateCallback(any(IBinder.class),
-                any(ITrafficStateCallback.Stub.class), callbackIdentifier.capture());
-
-        mWifiManager.unregisterTrafficStateCallback(mTrafficStateCallback);
-        verify(mWifiService).unregisterTrafficStateCallback(
-                eq((int) callbackIdentifier.getValue()));
-    }
-
-    /*
-     * Verify client-provided callback is being called through callback proxy on multiple events
-     */
-    @Test
-    public void trafficStateCallbackProxyCallsOnMultipleUpdates() throws Exception {
-        ArgumentCaptor<ITrafficStateCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ITrafficStateCallback.Stub.class);
-        mWifiManager.registerTrafficStateCallback(new HandlerExecutor(mHandler),
-                mTrafficStateCallback);
-        verify(mWifiService).registerTrafficStateCallback(
-                any(IBinder.class), callbackCaptor.capture(), anyInt());
-
-        InOrder inOrder = inOrder(mTrafficStateCallback);
-
-        callbackCaptor.getValue().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_IN);
-        callbackCaptor.getValue().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_INOUT);
-        callbackCaptor.getValue().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_OUT);
-
-        mLooper.dispatchAll();
-        inOrder.verify(mTrafficStateCallback).onStateChanged(
-                TrafficStateCallback.DATA_ACTIVITY_IN);
-        inOrder.verify(mTrafficStateCallback).onStateChanged(
-                TrafficStateCallback.DATA_ACTIVITY_INOUT);
-        inOrder.verify(mTrafficStateCallback).onStateChanged(
-                TrafficStateCallback.DATA_ACTIVITY_OUT);
-    }
-
-    /**
-     * Verify client-provided callback is being called on the correct thread
-     */
-    @Test
-    public void trafficStateCallbackIsCalledOnCorrectThread() throws Exception {
-        ArgumentCaptor<ITrafficStateCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ITrafficStateCallback.Stub.class);
-        TestLooper altLooper = new TestLooper();
-        Handler altHandler = new Handler(altLooper.getLooper());
-        mWifiManager.registerTrafficStateCallback(new HandlerExecutor(altHandler),
-                mTrafficStateCallback);
-        verify(mContext, never()).getMainLooper();
-        verify(mContext, never()).getMainExecutor();
-        verify(mWifiService).registerTrafficStateCallback(
-                any(IBinder.class), callbackCaptor.capture(), anyInt());
-
-        assertEquals(0, altLooper.dispatchAll());
-        callbackCaptor.getValue().onStateChanged(TrafficStateCallback.DATA_ACTIVITY_INOUT);
-        assertEquals(1, altLooper.dispatchAll());
-        verify(mTrafficStateCallback).onStateChanged(TrafficStateCallback.DATA_ACTIVITY_INOUT);
-    }
-
-    /**
-     * Verify the call to registerNetworkRequestMatchCallback goes to WifiServiceImpl.
-     */
-    @Test
-    public void registerNetworkRequestMatchCallbackCallGoesToWifiServiceImpl()
-            throws Exception {
-        ArgumentCaptor<INetworkRequestMatchCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(INetworkRequestMatchCallback.Stub.class);
-        mWifiManager.registerNetworkRequestMatchCallback(
-                new HandlerExecutor(new Handler(mLooper.getLooper())),
-                mNetworkRequestMatchCallback);
-        verify(mWifiService).registerNetworkRequestMatchCallback(
-                any(IBinder.class), callbackCaptor.capture(), anyInt());
-
-        INetworkRequestUserSelectionCallback iUserSelectionCallback =
-                mock(INetworkRequestUserSelectionCallback.class);
-
-        assertEquals(0, mLooper.dispatchAll());
-
-        callbackCaptor.getValue().onAbort();
-        assertEquals(1, mLooper.dispatchAll());
-        verify(mNetworkRequestMatchCallback).onAbort();
-
-        callbackCaptor.getValue().onMatch(new ArrayList<ScanResult>());
-        assertEquals(1, mLooper.dispatchAll());
-        verify(mNetworkRequestMatchCallback).onMatch(anyList());
-
-        callbackCaptor.getValue().onUserSelectionConnectSuccess(new WifiConfiguration());
-        assertEquals(1, mLooper.dispatchAll());
-        verify(mNetworkRequestMatchCallback).onUserSelectionConnectSuccess(
-                any(WifiConfiguration.class));
-
-        callbackCaptor.getValue().onUserSelectionConnectFailure(new WifiConfiguration());
-        assertEquals(1, mLooper.dispatchAll());
-        verify(mNetworkRequestMatchCallback).onUserSelectionConnectFailure(
-                any(WifiConfiguration.class));
-    }
-
-    /**
-     * Verify the call to unregisterNetworkRequestMatchCallback goes to WifiServiceImpl.
-     */
-    @Test
-    public void unregisterNetworkRequestMatchCallbackCallGoesToWifiServiceImpl() throws Exception {
-        ArgumentCaptor<Integer> callbackIdentifier = ArgumentCaptor.forClass(Integer.class);
-        mWifiManager.registerNetworkRequestMatchCallback(new HandlerExecutor(mHandler),
-                mNetworkRequestMatchCallback);
-        verify(mWifiService).registerNetworkRequestMatchCallback(
-                any(IBinder.class), any(INetworkRequestMatchCallback.class),
-                callbackIdentifier.capture());
-
-        mWifiManager.unregisterNetworkRequestMatchCallback(mNetworkRequestMatchCallback);
-        verify(mWifiService).unregisterNetworkRequestMatchCallback(
-                eq((int) callbackIdentifier.getValue()));
-    }
-
-    /**
-     * Verify the call to NetworkRequestUserSelectionCallback goes to
-     * WifiServiceImpl.
-     */
-    @Test
-    public void networkRequestUserSelectionCallbackCallGoesToWifiServiceImpl()
-            throws Exception {
-        ArgumentCaptor<INetworkRequestMatchCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(INetworkRequestMatchCallback.Stub.class);
-        mWifiManager.registerNetworkRequestMatchCallback(
-                new HandlerExecutor(new Handler(mLooper.getLooper())),
-                mNetworkRequestMatchCallback);
-        verify(mWifiService).registerNetworkRequestMatchCallback(
-                any(IBinder.class), callbackCaptor.capture(), anyInt());
-
-        INetworkRequestUserSelectionCallback iUserSelectionCallback =
-                mock(INetworkRequestUserSelectionCallback.class);
-        ArgumentCaptor<NetworkRequestUserSelectionCallback> userSelectionCallbackCaptor =
-                ArgumentCaptor.forClass(NetworkRequestUserSelectionCallback.class);
-        callbackCaptor.getValue().onUserSelectionCallbackRegistration(
-                iUserSelectionCallback);
-        assertEquals(1, mLooper.dispatchAll());
-        verify(mNetworkRequestMatchCallback).onUserSelectionCallbackRegistration(
-                userSelectionCallbackCaptor.capture());
-
-        WifiConfiguration selected = new WifiConfiguration();
-        userSelectionCallbackCaptor.getValue().select(selected);
-        verify(iUserSelectionCallback).select(selected);
-
-        userSelectionCallbackCaptor.getValue().reject();
-        verify(iUserSelectionCallback).reject();
-    }
-
-    /**
-     * Check the call to getAllMatchingWifiConfigs calls getAllMatchingFqdnsForScanResults and
-     * getWifiConfigsForPasspointProfiles of WifiService in order.
-     */
-    @Test
-    public void testGetAllMatchingWifiConfigs() throws Exception {
-        Map<String, List<ScanResult>> passpointProfiles = new HashMap<>();
-        passpointProfiles.put("www.test.com_987a69bca26", new ArrayList<>());
-        when(mWifiService.getAllMatchingPasspointProfilesForScanResults(
-                any(List.class))).thenReturn(passpointProfiles);
-        InOrder inOrder = inOrder(mWifiService);
-
-        mWifiManager.getAllMatchingWifiConfigs(new ArrayList<>());
-
-        inOrder.verify(mWifiService).getAllMatchingPasspointProfilesForScanResults(any(List.class));
-        inOrder.verify(mWifiService).getWifiConfigsForPasspointProfiles(any(List.class));
-    }
-
-    /**
-     * Check the call to getMatchingOsuProviders calls getMatchingOsuProviders of WifiService
-     * with the provided a list of ScanResult.
-     */
-    @Test
-    public void testGetMatchingOsuProviders() throws Exception {
-        mWifiManager.getMatchingOsuProviders(new ArrayList<>());
-
-        verify(mWifiService).getMatchingOsuProviders(any(List.class));
-    }
-
-    /**
-     * Verify calls to {@link WifiManager#addNetworkSuggestions(List)},
-     * {@link WifiManager#getNetworkSuggestions()} and
-     * {@link WifiManager#removeNetworkSuggestions(List)}.
-     */
-    @Test
-    public void addGetRemoveNetworkSuggestions() throws Exception {
-        List<WifiNetworkSuggestion> testList = new ArrayList<>();
-        when(mWifiService.addNetworkSuggestions(any(List.class), anyString(),
-                nullable(String.class))).thenReturn(STATUS_NETWORK_SUGGESTIONS_SUCCESS);
-        when(mWifiService.removeNetworkSuggestions(any(List.class), anyString())).thenReturn(
-                STATUS_NETWORK_SUGGESTIONS_SUCCESS);
-        when(mWifiService.getNetworkSuggestions(anyString()))
-                .thenReturn(testList);
-
-        assertEquals(STATUS_NETWORK_SUGGESTIONS_SUCCESS,
-                mWifiManager.addNetworkSuggestions(testList));
-        verify(mWifiService).addNetworkSuggestions(anyList(), eq(TEST_PACKAGE_NAME),
-                nullable(String.class));
-
-        assertEquals(testList, mWifiManager.getNetworkSuggestions());
-        verify(mWifiService).getNetworkSuggestions(eq(TEST_PACKAGE_NAME));
-
-        assertEquals(STATUS_NETWORK_SUGGESTIONS_SUCCESS,
-                mWifiManager.removeNetworkSuggestions(new ArrayList<>()));
-        verify(mWifiService).removeNetworkSuggestions(anyList(), eq(TEST_PACKAGE_NAME));
-    }
-
-    /**
-     * Verify call to {@link WifiManager#getMaxNumberOfNetworkSuggestionsPerApp()}.
-     */
-    @Test
-    public void getMaxNumberOfNetworkSuggestionsPerApp() {
-        when(mContext.getSystemServiceName(ActivityManager.class))
-                .thenReturn(Context.ACTIVITY_SERVICE);
-        when(mContext.getSystemService(Context.ACTIVITY_SERVICE))
-                .thenReturn(mActivityManager);
-        when(mActivityManager.isLowRamDevice()).thenReturn(true);
-        assertEquals(256, mWifiManager.getMaxNumberOfNetworkSuggestionsPerApp());
-
-        when(mActivityManager.isLowRamDevice()).thenReturn(false);
-        assertEquals(1024, mWifiManager.getMaxNumberOfNetworkSuggestionsPerApp());
-    }
-
-    /**
-     * Verify getting the factory MAC address.
-     */
-    @Test
-    public void testGetFactoryMacAddress() throws Exception {
-        when(mWifiService.getFactoryMacAddresses()).thenReturn(TEST_MAC_ADDRESSES);
-        assertArrayEquals(TEST_MAC_ADDRESSES, mWifiManager.getFactoryMacAddresses());
-        verify(mWifiService).getFactoryMacAddresses();
-    }
-
-    /**
-     * Verify the call to addOnWifiUsabilityStatsListener goes to WifiServiceImpl.
-     */
-    @Test
-    public void addOnWifiUsabilityStatsListeneroesToWifiServiceImpl() throws Exception {
-        mExecutor = new SynchronousExecutor();
-        mWifiManager.addOnWifiUsabilityStatsListener(mExecutor, mOnWifiUsabilityStatsListener);
-        verify(mWifiService).addOnWifiUsabilityStatsListener(any(IBinder.class),
-                any(IOnWifiUsabilityStatsListener.Stub.class), anyInt());
-    }
-
-    /**
-     * Verify the call to removeOnWifiUsabilityStatsListener goes to WifiServiceImpl.
-     */
-    @Test
-    public void removeOnWifiUsabilityListenerGoesToWifiServiceImpl() throws Exception {
-        ArgumentCaptor<Integer> listenerIdentifier = ArgumentCaptor.forClass(Integer.class);
-        mExecutor = new SynchronousExecutor();
-        mWifiManager.addOnWifiUsabilityStatsListener(mExecutor, mOnWifiUsabilityStatsListener);
-        verify(mWifiService).addOnWifiUsabilityStatsListener(any(IBinder.class),
-                any(IOnWifiUsabilityStatsListener.Stub.class), listenerIdentifier.capture());
-
-        mWifiManager.removeOnWifiUsabilityStatsListener(mOnWifiUsabilityStatsListener);
-        verify(mWifiService).removeOnWifiUsabilityStatsListener(
-                eq((int) listenerIdentifier.getValue()));
-    }
-
-    /**
-     * Test behavior of isEnhancedOpenSupported
-     */
-    @Test
-    public void testIsEnhancedOpenSupported() throws Exception {
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(new Long(WIFI_FEATURE_OWE));
-        assertTrue(mWifiManager.isEnhancedOpenSupported());
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(new Long(~WIFI_FEATURE_OWE));
-        assertFalse(mWifiManager.isEnhancedOpenSupported());
-    }
-
-    /**
-     * Test behavior of isWpa3SaeSupported
-     */
-    @Test
-    public void testIsWpa3SaeSupported() throws Exception {
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(new Long(WIFI_FEATURE_WPA3_SAE));
-        assertTrue(mWifiManager.isWpa3SaeSupported());
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(new Long(~WIFI_FEATURE_WPA3_SAE));
-        assertFalse(mWifiManager.isWpa3SaeSupported());
-    }
-
-    /**
-     * Test behavior of isWpa3SuiteBSupported
-     */
-    @Test
-    public void testIsWpa3SuiteBSupported() throws Exception {
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(new Long(WIFI_FEATURE_WPA3_SUITE_B));
-        assertTrue(mWifiManager.isWpa3SuiteBSupported());
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(new Long(~WIFI_FEATURE_WPA3_SUITE_B));
-        assertFalse(mWifiManager.isWpa3SuiteBSupported());
-    }
-
-    /**
-     * Test behavior of isEasyConnectSupported
-     */
-    @Test
-    public void testIsEasyConnectSupported() throws Exception {
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(new Long(WIFI_FEATURE_DPP));
-        assertTrue(mWifiManager.isEasyConnectSupported());
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(new Long(~WIFI_FEATURE_DPP));
-        assertFalse(mWifiManager.isEasyConnectSupported());
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#addNetwork(WifiConfiguration)}
-     */
-    @Test
-    public void testAddNetwork() throws Exception {
-        WifiConfiguration configuration = new WifiConfiguration();
-        when(mWifiService.addOrUpdateNetwork(any(), anyString()))
-                .thenReturn(TEST_NETWORK_ID);
-
-        assertEquals(mWifiManager.addNetwork(configuration), TEST_NETWORK_ID);
-        verify(mWifiService).addOrUpdateNetwork(configuration, mContext.getOpPackageName());
-
-        // send a null config
-        assertEquals(mWifiManager.addNetwork(null), -1);
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#addNetwork(WifiConfiguration)}
-     */
-    @Test
-    public void testUpdateNetwork() throws Exception {
-        WifiConfiguration configuration = new WifiConfiguration();
-        when(mWifiService.addOrUpdateNetwork(any(), anyString()))
-                .thenReturn(TEST_NETWORK_ID);
-
-        configuration.networkId = TEST_NETWORK_ID;
-        assertEquals(mWifiManager.updateNetwork(configuration), TEST_NETWORK_ID);
-        verify(mWifiService).addOrUpdateNetwork(configuration, mContext.getOpPackageName());
-
-        // config with invalid network ID
-        configuration.networkId = -1;
-        assertEquals(mWifiManager.updateNetwork(configuration), -1);
-
-        // send a null config
-        assertEquals(mWifiManager.updateNetwork(null), -1);
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#enableNetwork(int, boolean)}
-     */
-    @Test
-    public void testEnableNetwork() throws Exception {
-        when(mWifiService.enableNetwork(anyInt(), anyBoolean(), anyString()))
-                .thenReturn(true);
-        assertTrue(mWifiManager.enableNetwork(TEST_NETWORK_ID, true));
-        verify(mWifiService).enableNetwork(TEST_NETWORK_ID, true, mContext.getOpPackageName());
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#disableNetwork(int)}
-     */
-    @Test
-    public void testDisableNetwork() throws Exception {
-        when(mWifiService.disableNetwork(anyInt(), anyString()))
-                .thenReturn(true);
-        assertTrue(mWifiManager.disableNetwork(TEST_NETWORK_ID));
-        verify(mWifiService).disableNetwork(TEST_NETWORK_ID, mContext.getOpPackageName());
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#allowAutojoin(int, boolean)}
-     * @throws Exception
-     */
-    @Test
-    public void testAllowAutojoin() throws Exception {
-        mWifiManager.allowAutojoin(1, true);
-        verify(mWifiService).allowAutojoin(1, true);
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#allowAutojoinPasspoint(String, boolean)}
-     * @throws Exception
-     */
-    @Test
-    public void testAllowAutojoinPasspoint() throws Exception {
-        final String fqdn = "FullyQualifiedDomainName";
-        mWifiManager.allowAutojoinPasspoint(fqdn, true);
-        verify(mWifiService).allowAutojoinPasspoint(fqdn, true);
-    }
-
-    /**
-     * Test behavior of
-     * {@link WifiManager#setMacRandomizationSettingPasspointEnabled(String, boolean)}
-     */
-    @Test
-    public void testSetMacRandomizationSettingPasspointEnabled() throws Exception {
-        final String fqdn = "FullyQualifiedDomainName";
-        mWifiManager.setMacRandomizationSettingPasspointEnabled(fqdn, true);
-        verify(mWifiService).setMacRandomizationSettingPasspointEnabled(fqdn, true);
-    }
-
-    /**
-     * Test behavior of
-     * {@link WifiManager#setMacRandomizationSettingPasspointEnabled(String, boolean)}
-     */
-    @Test
-    public void testSetPasspointMeteredOverride() throws Exception {
-        final String fqdn = "FullyQualifiedDomainName";
-        mWifiManager.setPasspointMeteredOverride(fqdn, METERED_OVERRIDE_METERED);
-        verify(mWifiService).setPasspointMeteredOverride(fqdn, METERED_OVERRIDE_METERED);
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#disconnect()}
-     */
-    @Test
-    public void testDisconnect() throws Exception {
-        when(mWifiService.disconnect(anyString())).thenReturn(true);
-        assertTrue(mWifiManager.disconnect());
-        verify(mWifiService).disconnect(mContext.getOpPackageName());
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#reconnect()}
-     */
-    @Test
-    public void testReconnect() throws Exception {
-        when(mWifiService.reconnect(anyString())).thenReturn(true);
-        assertTrue(mWifiManager.reconnect());
-        verify(mWifiService).reconnect(mContext.getOpPackageName());
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#reassociate()}
-     */
-    @Test
-    public void testReassociate() throws Exception {
-        when(mWifiService.reassociate(anyString())).thenReturn(true);
-        assertTrue(mWifiManager.reassociate());
-        verify(mWifiService).reassociate(mContext.getOpPackageName());
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#getSupportedFeatures()}
-     */
-    @Test
-    public void testGetSupportedFeatures() throws Exception {
-        long supportedFeatures =
-                WIFI_FEATURE_SCANNER
-                        | WIFI_FEATURE_PASSPOINT
-                        | WIFI_FEATURE_P2P;
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(Long.valueOf(supportedFeatures));
-
-        assertTrue(mWifiManager.isWifiScannerSupported());
-        assertTrue(mWifiManager.isPasspointSupported());
-        assertTrue(mWifiManager.isP2pSupported());
-        assertFalse(mWifiManager.isPortableHotspotSupported());
-        assertFalse(mWifiManager.isDeviceToDeviceRttSupported());
-        assertFalse(mWifiManager.isDeviceToApRttSupported());
-        assertFalse(mWifiManager.isPreferredNetworkOffloadSupported());
-        assertFalse(mWifiManager.isAdditionalStaSupported());
-        assertFalse(mWifiManager.isTdlsSupported());
-        assertFalse(mWifiManager.isOffChannelTdlsSupported());
-        assertFalse(mWifiManager.isEnhancedPowerReportingSupported());
-    }
-
-    /**
-     * Tests that passing a null Executor to {@link WifiManager#getWifiActivityEnergyInfoAsync}
-     * throws an exception.
-     */
-    @Test(expected = NullPointerException.class)
-    public void testGetWifiActivityInfoNullExecutor() throws Exception {
-        mWifiManager.getWifiActivityEnergyInfoAsync(null, mOnWifiActivityEnergyInfoListener);
-    }
-
-    /**
-     * Tests that passing a null listener to {@link WifiManager#getWifiActivityEnergyInfoAsync}
-     * throws an exception.
-     */
-    @Test(expected = NullPointerException.class)
-    public void testGetWifiActivityInfoNullListener() throws Exception {
-        mWifiManager.getWifiActivityEnergyInfoAsync(mExecutor, null);
-    }
-
-    /** Tests that the listener runs on the correct Executor. */
-    @Test
-    public void testGetWifiActivityInfoRunsOnCorrectExecutor() throws Exception {
-        mWifiManager.getWifiActivityEnergyInfoAsync(mExecutor, mOnWifiActivityEnergyInfoListener);
-        ArgumentCaptor<IOnWifiActivityEnergyInfoListener> listenerCaptor =
-                ArgumentCaptor.forClass(IOnWifiActivityEnergyInfoListener.class);
-        verify(mWifiService).getWifiActivityEnergyInfoAsync(listenerCaptor.capture());
-        IOnWifiActivityEnergyInfoListener listener = listenerCaptor.getValue();
-        listener.onWifiActivityEnergyInfo(mWifiActivityEnergyInfo);
-        verify(mExecutor).execute(any());
-
-        // ensure that the executor is only triggered once
-        listener.onWifiActivityEnergyInfo(mWifiActivityEnergyInfo);
-        verify(mExecutor).execute(any());
-    }
-
-    /** Tests that the correct listener runs. */
-    @Test
-    public void testGetWifiActivityInfoRunsCorrectListener() throws Exception {
-        int[] flag = {0};
-        mWifiManager.getWifiActivityEnergyInfoAsync(
-                new SynchronousExecutor(), info -> flag[0]++);
-        ArgumentCaptor<IOnWifiActivityEnergyInfoListener> listenerCaptor =
-                ArgumentCaptor.forClass(IOnWifiActivityEnergyInfoListener.class);
-        verify(mWifiService).getWifiActivityEnergyInfoAsync(listenerCaptor.capture());
-        IOnWifiActivityEnergyInfoListener listener = listenerCaptor.getValue();
-        listener.onWifiActivityEnergyInfo(mWifiActivityEnergyInfo);
-        assertEquals(1, flag[0]);
-
-        // ensure that the listener is only triggered once
-        listener.onWifiActivityEnergyInfo(mWifiActivityEnergyInfo);
-        assertEquals(1, flag[0]);
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#getConnectionInfo()}
-     */
-    @Test
-    public void testGetConnectionInfo() throws Exception {
-        WifiInfo wifiInfo = new WifiInfo();
-        when(mWifiService.getConnectionInfo(anyString(), nullable(String.class))).thenReturn(
-                wifiInfo);
-
-        assertEquals(wifiInfo, mWifiManager.getConnectionInfo());
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#is5GHzBandSupported()}
-     */
-    @Test
-    public void testIs5GHzBandSupported() throws Exception {
-        when(mWifiService.is5GHzBandSupported()).thenReturn(true);
-        assertTrue(mWifiManager.is5GHzBandSupported());
-        verify(mWifiService).is5GHzBandSupported();
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#is6GHzBandSupported()}
-     */
-    @Test
-    public void testIs6GHzBandSupported() throws Exception {
-        when(mWifiService.is6GHzBandSupported()).thenReturn(true);
-        assertTrue(mWifiManager.is6GHzBandSupported());
-        verify(mWifiService).is6GHzBandSupported();
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#isWifiStandardSupported()}
-     */
-    @Test
-    public void testIsWifiStandardSupported() throws Exception {
-        int standard = ScanResult.WIFI_STANDARD_11AX;
-        when(mWifiService.isWifiStandardSupported(standard)).thenReturn(true);
-        assertTrue(mWifiManager.isWifiStandardSupported(standard));
-        verify(mWifiService).isWifiStandardSupported(standard);
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#getDhcpInfo()}
-     */
-    @Test
-    public void testGetDhcpInfo() throws Exception {
-        DhcpInfo dhcpInfo = new DhcpInfo();
-
-        when(mWifiService.getDhcpInfo()).thenReturn(dhcpInfo);
-        assertEquals(dhcpInfo, mWifiManager.getDhcpInfo());
-        verify(mWifiService).getDhcpInfo();
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#setWifiEnabled(boolean)}
-     */
-    @Test
-    public void testSetWifiEnabled() throws Exception {
-        when(mWifiService.setWifiEnabled(anyString(), anyBoolean())).thenReturn(true);
-        assertTrue(mWifiManager.setWifiEnabled(true));
-        verify(mWifiService).setWifiEnabled(mContext.getOpPackageName(), true);
-        assertTrue(mWifiManager.setWifiEnabled(false));
-        verify(mWifiService).setWifiEnabled(mContext.getOpPackageName(), false);
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#connect(int, ActionListener)}
-     */
-    @Test
-    public void testConnectWithListener() throws Exception {
-        ActionListener externalListener = mock(ActionListener.class);
-        mWifiManager.connect(TEST_NETWORK_ID, externalListener);
-
-        ArgumentCaptor<IActionListener> binderListenerCaptor =
-                ArgumentCaptor.forClass(IActionListener.class);
-        verify(mWifiService).connect(eq(null), eq(TEST_NETWORK_ID), any(Binder.class),
-                binderListenerCaptor.capture(), anyInt());
-        assertNotNull(binderListenerCaptor.getValue());
-
-        // Trigger on success.
-        binderListenerCaptor.getValue().onSuccess();
-        mLooper.dispatchAll();
-        verify(externalListener).onSuccess();
-
-        // Trigger on failure.
-        binderListenerCaptor.getValue().onFailure(BUSY);
-        mLooper.dispatchAll();
-        verify(externalListener).onFailure(BUSY);
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#connect(int, ActionListener)}
-     */
-    @Test
-    public void testConnectWithListenerHandleSecurityException() throws Exception {
-        doThrow(new SecurityException()).when(mWifiService)
-                .connect(eq(null), anyInt(), any(IBinder.class),
-                        any(IActionListener.class), anyInt());
-        ActionListener externalListener = mock(ActionListener.class);
-        mWifiManager.connect(TEST_NETWORK_ID, externalListener);
-
-        mLooper.dispatchAll();
-        verify(externalListener).onFailure(NOT_AUTHORIZED);
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#connect(int, ActionListener)}
-     */
-    @Test
-    public void testConnectWithListenerHandleRemoteException() throws Exception {
-        doThrow(new RemoteException()).when(mWifiService)
-                .connect(eq(null), anyInt(), any(IBinder.class),
-                        any(IActionListener.class), anyInt());
-        ActionListener externalListener = mock(ActionListener.class);
-        mWifiManager.connect(TEST_NETWORK_ID, externalListener);
-
-        mLooper.dispatchAll();
-        verify(externalListener).onFailure(ERROR);
-    }
-
-    /**
-     * Test behavior of {@link WifiManager#connect(int, ActionListener)}
-     */
-    @Test
-    public void testConnectWithoutListener() throws Exception {
-        WifiConfiguration configuration = new WifiConfiguration();
-        mWifiManager.connect(configuration, null);
-
-        verify(mWifiService).connect(configuration, WifiConfiguration.INVALID_NETWORK_ID, null,
-                null, 0);
-    }
-
-    /**
-     * Verify an IllegalArgumentException is thrown if callback is not provided.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testRegisterScanResultsCallbackWithNullCallback() throws Exception {
-        mWifiManager.registerScanResultsCallback(mExecutor, null);
-    }
-
-    /**
-     * Verify an IllegalArgumentException is thrown if executor is not provided.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testRegisterCallbackWithNullExecutor() throws Exception {
-        mWifiManager.registerScanResultsCallback(null, mScanResultsCallback);
-    }
-
-    /**
-     * Verify client provided callback is being called to the right callback.
-     */
-    @Test
-    public void testAddScanResultsCallbackAndReceiveEvent() throws Exception {
-        ArgumentCaptor<IScanResultsCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(IScanResultsCallback.Stub.class);
-        mWifiManager.registerScanResultsCallback(new SynchronousExecutor(), mScanResultsCallback);
-        verify(mWifiService).registerScanResultsCallback(callbackCaptor.capture());
-        callbackCaptor.getValue().onScanResultsAvailable();
-        verify(mRunnable).run();
-    }
-
-    /**
-     * Verify client provided callback is being called to the right executor.
-     */
-    @Test
-    public void testRegisterScanResultsCallbackWithTheTargetExecutor() throws Exception {
-        ArgumentCaptor<IScanResultsCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(IScanResultsCallback.Stub.class);
-        mWifiManager.registerScanResultsCallback(mExecutor, mScanResultsCallback);
-        verify(mWifiService).registerScanResultsCallback(callbackCaptor.capture());
-        mWifiManager.registerScanResultsCallback(mAnotherExecutor, mScanResultsCallback);
-        callbackCaptor.getValue().onScanResultsAvailable();
-        verify(mExecutor, never()).execute(any(Runnable.class));
-        verify(mAnotherExecutor).execute(any(Runnable.class));
-    }
-
-    /**
-     * Verify client register unregister then register again, to ensure callback still works.
-     */
-    @Test
-    public void testRegisterUnregisterThenRegisterAgainWithScanResultCallback() throws Exception {
-        ArgumentCaptor<IScanResultsCallback.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(IScanResultsCallback.Stub.class);
-        mWifiManager.registerScanResultsCallback(new SynchronousExecutor(), mScanResultsCallback);
-        verify(mWifiService).registerScanResultsCallback(callbackCaptor.capture());
-        mWifiManager.unregisterScanResultsCallback(mScanResultsCallback);
-        callbackCaptor.getValue().onScanResultsAvailable();
-        verify(mRunnable, never()).run();
-        mWifiManager.registerScanResultsCallback(new SynchronousExecutor(), mScanResultsCallback);
-        callbackCaptor.getValue().onScanResultsAvailable();
-        verify(mRunnable).run();
-    }
-
-    /**
-     * Verify client unregisterScanResultsCallback.
-     */
-    @Test
-    public void testUnregisterScanResultsCallback() throws Exception {
-        mWifiManager.unregisterScanResultsCallback(mScanResultsCallback);
-        verify(mWifiService).unregisterScanResultsCallback(any());
-    }
-
-    /**
-     * Verify client unregisterScanResultsCallback with null callback will cause an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testUnregisterScanResultsCallbackWithNullCallback() throws Exception {
-        mWifiManager.unregisterScanResultsCallback(null);
-    }
-
-    /**
-     * Verify an IllegalArgumentException is thrown if executor not provided.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testAddSuggestionConnectionStatusListenerWithNullExecutor() {
-        mWifiManager.addSuggestionConnectionStatusListener(null, mListener);
-    }
-
-    /**
-     * Verify an IllegalArgumentException is thrown if listener is not provided.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testAddSuggestionConnectionStatusListenerWithNullListener() {
-        mWifiManager.addSuggestionConnectionStatusListener(mExecutor, null);
-    }
-
-    /**
-     * Verify client provided listener is being called to the right listener.
-     */
-    @Test
-    public void testAddSuggestionConnectionStatusListenerAndReceiveEvent() throws Exception {
-        int errorCode = STATUS_SUGGESTION_CONNECTION_FAILURE_AUTHENTICATION;
-        ArgumentCaptor<ISuggestionConnectionStatusListener.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ISuggestionConnectionStatusListener.Stub.class);
-        Executor executor = new SynchronousExecutor();
-        mWifiManager.addSuggestionConnectionStatusListener(executor, mListener);
-        verify(mWifiService).registerSuggestionConnectionStatusListener(any(IBinder.class),
-                callbackCaptor.capture(), anyInt(), anyString(), nullable(String.class));
-        callbackCaptor.getValue().onConnectionStatus(mWifiNetworkSuggestion, errorCode);
-        verify(mListener).onConnectionStatus(any(WifiNetworkSuggestion.class), eq(errorCode));
-    }
-
-    /**
-     * Verify client provided listener is being called to the right executor.
-     */
-    @Test
-    public void testAddSuggestionConnectionStatusListenerWithTheTargetExecutor() throws Exception {
-        int errorCode = STATUS_SUGGESTION_CONNECTION_FAILURE_AUTHENTICATION;
-        ArgumentCaptor<ISuggestionConnectionStatusListener.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(ISuggestionConnectionStatusListener.Stub.class);
-        mWifiManager.addSuggestionConnectionStatusListener(mExecutor, mListener);
-        verify(mWifiService).registerSuggestionConnectionStatusListener(any(IBinder.class),
-                callbackCaptor.capture(), anyInt(), anyString(), nullable(String.class));
-        callbackCaptor.getValue().onConnectionStatus(any(WifiNetworkSuggestion.class), errorCode);
-        verify(mExecutor).execute(any(Runnable.class));
-    }
-
-    /**
-     * Verify an IllegalArgumentException is thrown if listener is not provided.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testRemoveSuggestionConnectionListenerWithNullListener() {
-        mWifiManager.removeSuggestionConnectionStatusListener(null);
-    }
-
-    /**
-     * Verify removeSuggestionConnectionListener.
-     */
-    @Test
-    public void testRemoveSuggestionConnectionListener() throws Exception {
-        mWifiManager.removeSuggestionConnectionStatusListener(mListener);
-        verify(mWifiService).unregisterSuggestionConnectionStatusListener(anyInt(), anyString());
-    }
-
-    /** Test {@link WifiManager#calculateSignalLevel(int)} */
-    @Test
-    public void testCalculateSignalLevel() throws Exception {
-        when(mWifiService.calculateSignalLevel(anyInt())).thenReturn(3);
-        int actual = mWifiManager.calculateSignalLevel(-60);
-        verify(mWifiService).calculateSignalLevel(-60);
-        assertEquals(3, actual);
-    }
-
-    /** Test {@link WifiManager#getMaxSignalLevel()} */
-    @Test
-    public void testGetMaxSignalLevel() throws Exception {
-        when(mWifiService.calculateSignalLevel(anyInt())).thenReturn(4);
-        int actual = mWifiManager.getMaxSignalLevel();
-        verify(mWifiService).calculateSignalLevel(Integer.MAX_VALUE);
-        assertEquals(4, actual);
-    }
-
-    /*
-     * Test behavior of isWapiSupported
-     * @throws Exception
-     */
-    @Test
-    public void testIsWapiSupported() throws Exception {
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(new Long(WifiManager.WIFI_FEATURE_WAPI));
-        assertTrue(mWifiManager.isWapiSupported());
-        when(mWifiService.getSupportedFeatures())
-                .thenReturn(new Long(~WifiManager.WIFI_FEATURE_WAPI));
-        assertFalse(mWifiManager.isWapiSupported());
-    }
-
-    /*
-     * Test that DPP channel list is parsed correctly
-     */
-    @Test
-    public void testparseDppChannelList() throws Exception {
-        String channelList = "81/1,2,3,4,5,6,7,8,9,10,11,115/36,40,44,48";
-        SparseArray<int[]> expectedResult = new SparseArray<>();
-        expectedResult.append(81, new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11});
-        expectedResult.append(115, new int[]{36, 40, 44, 48});
-
-        SparseArray<int[]> result = WifiManager.parseDppChannelList(channelList);
-        assertEquals(expectedResult.size(), result.size());
-
-        int index = 0;
-        int key;
-
-        // Compare the two primitive int arrays
-        do {
-            try {
-                key = result.keyAt(index);
-            } catch (java.lang.ArrayIndexOutOfBoundsException e) {
-                break;
-            }
-            int[] expected = expectedResult.get(key);
-            int[] output = result.get(key);
-            assertEquals(expected.length, output.length);
-            for (int i = 0; i < output.length; i++) {
-                assertEquals(expected[i], output[i]);
-            }
-            index++;
-        } while (true);
-    }
-
-    /*
-     * Test that DPP channel list parser gracefully fails for invalid input
-     */
-    @Test
-    public void testparseDppChannelListWithInvalidFormats() throws Exception {
-        String channelList = "1,2,3,4,5,6,7,8,9,10,11,36,40,44,48";
-        SparseArray<int[]> result = WifiManager.parseDppChannelList(channelList);
-        assertEquals(result.size(), 0);
-
-        channelList = "ajgalskgjalskjg3-09683dh";
-        result = WifiManager.parseDppChannelList(channelList);
-        assertEquals(result.size(), 0);
-
-        channelList = "13/abc,46////";
-        result = WifiManager.parseDppChannelList(channelList);
-        assertEquals(result.size(), 0);
-
-        channelList = "11/4,5,13/";
-        result = WifiManager.parseDppChannelList(channelList);
-        assertEquals(result.size(), 0);
-
-        channelList = "/24,6";
-        result = WifiManager.parseDppChannelList(channelList);
-        assertEquals(result.size(), 0);
-    }
-
-    /**
-     * Test getWifiConfigsForMatchedNetworkSuggestions for given scanResults.
-     */
-    @Test
-    public void testGetWifiConfigsForMatchedNetworkSuggestions() throws Exception {
-        List<WifiConfiguration> testResults = new ArrayList<>();
-        testResults.add(new WifiConfiguration());
-
-        when(mWifiService.getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(any(List.class)))
-                .thenReturn(testResults);
-        assertEquals(testResults, mWifiManager
-                .getWifiConfigForMatchedNetworkSuggestionsSharedWithUser(new ArrayList<>()));
-    }
-
-    /**
-     * Verify the call to setWifiConnectedNetworkScorer goes to WifiServiceImpl.
-     */
-    @Test
-    public void setWifiConnectedNetworkScorerGoesToWifiServiceImpl() throws Exception {
-        mExecutor = new SynchronousExecutor();
-        mWifiManager.setWifiConnectedNetworkScorer(mExecutor, mWifiConnectedNetworkScorer);
-        verify(mWifiService).setWifiConnectedNetworkScorer(any(IBinder.class),
-                any(IWifiConnectedNetworkScorer.Stub.class));
-    }
-
-    /**
-     * Verify the call to clearWifiConnectedNetworkScorer goes to WifiServiceImpl.
-     */
-    @Test
-    public void clearWifiConnectedNetworkScorerGoesToWifiServiceImpl() throws Exception {
-        mExecutor = new SynchronousExecutor();
-        mWifiManager.setWifiConnectedNetworkScorer(mExecutor, mWifiConnectedNetworkScorer);
-        verify(mWifiService).setWifiConnectedNetworkScorer(any(IBinder.class),
-                any(IWifiConnectedNetworkScorer.Stub.class));
-
-        mWifiManager.clearWifiConnectedNetworkScorer();
-        verify(mWifiService).clearWifiConnectedNetworkScorer();
-    }
-
-    /**
-     * Verify that Wi-Fi connected scorer receives score update observer after registeration.
-     */
-    @Test
-    public void verifyScorerReceiveScoreUpdateObserverAfterRegistration() throws Exception {
-        mExecutor = new SynchronousExecutor();
-        mWifiManager.setWifiConnectedNetworkScorer(mExecutor, mWifiConnectedNetworkScorer);
-        ArgumentCaptor<IWifiConnectedNetworkScorer.Stub> scorerCaptor =
-                ArgumentCaptor.forClass(IWifiConnectedNetworkScorer.Stub.class);
-        verify(mWifiService).setWifiConnectedNetworkScorer(any(IBinder.class),
-                scorerCaptor.capture());
-        scorerCaptor.getValue().onSetScoreUpdateObserver(any());
-        mLooper.dispatchAll();
-        verify(mWifiConnectedNetworkScorer).onSetScoreUpdateObserver(any());
-    }
-
-    /**
-     * Verify that Wi-Fi connected scorer receives session ID when onStart/onStop methods
-     * are called.
-     */
-    @Test
-    public void verifyScorerReceiveSessionIdWhenStartStopIsCalled() throws Exception {
-        mExecutor = new SynchronousExecutor();
-        mWifiManager.setWifiConnectedNetworkScorer(mExecutor, mWifiConnectedNetworkScorer);
-        ArgumentCaptor<IWifiConnectedNetworkScorer.Stub> callbackCaptor =
-                ArgumentCaptor.forClass(IWifiConnectedNetworkScorer.Stub.class);
-        verify(mWifiService).setWifiConnectedNetworkScorer(any(IBinder.class),
-                callbackCaptor.capture());
-        callbackCaptor.getValue().onStart(0);
-        callbackCaptor.getValue().onStop(10);
-        mLooper.dispatchAll();
-        verify(mWifiConnectedNetworkScorer).onStart(0);
-        verify(mWifiConnectedNetworkScorer).onStop(10);
-    }
-
-    @Test
-    public void testScanThrottle() throws Exception {
-        mWifiManager.setScanThrottleEnabled(true);
-        verify(mWifiService).setScanThrottleEnabled(true);
-
-        when(mWifiService.isScanThrottleEnabled()).thenReturn(false);
-        assertFalse(mWifiManager.isScanThrottleEnabled());
-        verify(mWifiService).isScanThrottleEnabled();
-    }
-
-    @Test
-    public void testAutoWakeup() throws Exception {
-        mWifiManager.setAutoWakeupEnabled(true);
-        verify(mWifiService).setAutoWakeupEnabled(true);
-
-        when(mWifiService.isAutoWakeupEnabled()).thenReturn(false);
-        assertFalse(mWifiManager.isAutoWakeupEnabled());
-        verify(mWifiService).isAutoWakeupEnabled();
-    }
-
-
-    @Test
-    public void testScanAvailable() throws Exception {
-        mWifiManager.setScanAlwaysAvailable(true);
-        verify(mWifiService).setScanAlwaysAvailable(true);
-
-        when(mWifiService.isScanAlwaysAvailable()).thenReturn(false);
-        assertFalse(mWifiManager.isScanAlwaysAvailable());
-        verify(mWifiService).isScanAlwaysAvailable();
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkAgentSpecifierTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkAgentSpecifierTest.java
deleted file mode 100644
index d479aac..0000000
--- a/wifi/tests/src/android/net/wifi/WifiNetworkAgentSpecifierTest.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.net.MacAddress;
-import android.net.MatchAllNetworkSpecifier;
-import android.os.Parcel;
-import android.os.PatternMatcher;
-import android.util.Pair;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiNetworkAgentSpecifier}.
- */
-@SmallTest
-public class WifiNetworkAgentSpecifierTest {
-    private static final String TEST_SSID = "Test123";
-    private static final String TEST_SSID_PATTERN = "Test";
-    private static final String TEST_SSID_1 = "456test";
-    private static final String TEST_BSSID = "12:12:12:aa:0b:c0";
-    private static final String TEST_BSSID_OUI_BASE_ADDRESS = "12:12:12:00:00:00";
-    private static final String TEST_BSSID_OUI_MASK = "ff:ff:ff:00:00:00";
-    private static final String TEST_BSSID_1 = "aa:cc:12:aa:0b:c0";
-    private static final String TEST_PRESHARED_KEY = "\"Test123\"";
-
-    /**
-     * Validate that parcel marshalling/unmarshalling works
-     */
-    @Test
-    public void testWifiNetworkAgentSpecifierParcel() {
-        WifiNetworkAgentSpecifier specifier = createDefaultNetworkAgentSpecifier();
-
-        Parcel parcelW = Parcel.obtain();
-        specifier.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiNetworkAgentSpecifier parcelSpecifier =
-                WifiNetworkAgentSpecifier.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(specifier, parcelSpecifier);
-    }
-
-    /**
-     * Validate NetworkAgentSpecifier equals with itself.
-     * a) Create network agent specifier 1 for WPA_PSK network
-     * b) Create network agent specifier 2 with the same params as specifier 1.
-     * c) Ensure that the specifier 2 equals specifier 1.
-     */
-    @Test
-    public void testWifiNetworkAgentSpecifierEqualsSame() {
-        WifiNetworkAgentSpecifier specifier1 = createDefaultNetworkAgentSpecifier();
-        WifiNetworkAgentSpecifier specifier2 = createDefaultNetworkAgentSpecifier();
-
-        assertTrue(specifier2.equals(specifier1));
-    }
-
-    /**
-     * Validate NetworkAgentSpecifier equals between instances of {@link WifiNetworkAgentSpecifier}.
-     * a) Create network agent specifier 1 for WPA_PSK network
-     * b) Create network agent specifier 2 with different key mgmt params.
-     * c) Ensure that the specifier 2 does not equal specifier 1.
-     */
-    @Test
-    public void testWifiNetworkAgentSpecifierDoesNotEqualsWhenKeyMgmtDifferent() {
-        WifiConfiguration wifiConfiguration1 = createDefaultWifiConfiguration();
-        WifiNetworkAgentSpecifier specifier1 =
-                new WifiNetworkAgentSpecifier(
-                        wifiConfiguration1);
-
-        WifiConfiguration wifiConfiguration2 = new WifiConfiguration(wifiConfiguration1);
-        wifiConfiguration2.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        WifiNetworkAgentSpecifier specifier2 =
-                new WifiNetworkAgentSpecifier(
-                        wifiConfiguration2);
-
-        assertFalse(specifier2.equals(specifier1));
-    }
-
-    /**
-     * Validate NetworkAgentSpecifier equals between instances of {@link WifiNetworkAgentSpecifier}.
-     * a) Create network agent specifier 1 for WPA_PSK network
-     * b) Create network agent specifier 2 with different SSID.
-     * c) Ensure that the specifier 2 does not equal specifier 1.
-     */
-    @Test
-    public void testWifiNetworkAgentSpecifierDoesNotSatisifyWhenSsidDifferent() {
-        WifiConfiguration wifiConfiguration1 = createDefaultWifiConfiguration();
-        WifiNetworkAgentSpecifier specifier1 =
-                new WifiNetworkAgentSpecifier(
-                        wifiConfiguration1);
-
-        WifiConfiguration wifiConfiguration2 = new WifiConfiguration(wifiConfiguration1);
-        wifiConfiguration2.SSID = TEST_SSID_1;
-        WifiNetworkAgentSpecifier specifier2 =
-                new WifiNetworkAgentSpecifier(
-                        wifiConfiguration2);
-
-        assertFalse(specifier2.equals(specifier1));
-    }
-
-    /**
-     * Validate NetworkAgentSpecifier equals between instances of {@link WifiNetworkAgentSpecifier}.
-     * a) Create network agent specifier 1 for WPA_PSK network
-     * b) Create network agent specifier 2 with different BSSID.
-     * c) Ensure that the specifier 2 does not equal specifier 1.
-     */
-    @Test
-    public void testWifiNetworkAgentSpecifierDoesNotSatisifyWhenBssidDifferent() {
-        WifiConfiguration wifiConfiguration1 = createDefaultWifiConfiguration();
-        WifiNetworkAgentSpecifier specifier1 =
-                new WifiNetworkAgentSpecifier(
-                        wifiConfiguration1);
-
-        WifiConfiguration wifiConfiguration2 = new WifiConfiguration(wifiConfiguration1);
-        wifiConfiguration2.BSSID = TEST_BSSID_1;
-        WifiNetworkAgentSpecifier specifier2 =
-                new WifiNetworkAgentSpecifier(
-                        wifiConfiguration2);
-
-        assertFalse(specifier2.equals(specifier1));
-    }
-
-    /**
-     * Validate NetworkAgentSpecifier matching.
-     * a) Create a network agent specifier for WPA_PSK network
-     * b) Ensure that the specifier matches {@code null} and {@link MatchAllNetworkSpecifier}
-     * specifiers.
-     */
-    @Test
-    public void testWifiNetworkAgentSpecifierSatisifiesNullAndAllMatch() {
-        WifiNetworkAgentSpecifier specifier = createDefaultNetworkAgentSpecifier();
-
-        assertTrue(specifier.canBeSatisfiedBy(null));
-        assertTrue(specifier.canBeSatisfiedBy(new MatchAllNetworkSpecifier()));
-    }
-
-    /**
-     * Validate NetworkAgentSpecifier matching with itself.
-     * a) Create network agent specifier 1 for WPA_PSK network
-     * b) Create network agent specifier 2 with the same params as specifier 1.
-     * c) Ensure that the agent specifier is satisfied by itself.
-     */
-    @Test
-    public void testWifiNetworkAgentSpecifierDoesSatisifySame() {
-        WifiNetworkAgentSpecifier specifier1 = createDefaultNetworkAgentSpecifier();
-        WifiNetworkAgentSpecifier specifier2 = createDefaultNetworkAgentSpecifier();
-
-        assertTrue(specifier2.canBeSatisfiedBy(specifier1));
-    }
-
-    /**
-     * Validate {@link WifiNetworkAgentSpecifier} with {@link WifiNetworkSpecifier} matching.
-     * a) Create network agent specifier for WPA_PSK network
-     * b) Create network specifier with matching SSID pattern.
-     * c) Ensure that the agent specifier is satisfied by specifier.
-     */
-    @Test
-    public void
-            testWifiNetworkAgentSpecifierSatisfiesNetworkSpecifierWithSsidPattern() {
-        WifiNetworkAgentSpecifier wifiNetworkAgentSpecifier = createDefaultNetworkAgentSpecifier();
-
-        PatternMatcher ssidPattern =
-                new PatternMatcher(TEST_SSID_PATTERN, PatternMatcher.PATTERN_PREFIX);
-        Pair<MacAddress, MacAddress> bssidPattern =
-                Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS, WifiManager.ALL_ZEROS_MAC_ADDRESS);
-        WifiConfiguration wificonfigurationNetworkSpecifier = new WifiConfiguration();
-        wificonfigurationNetworkSpecifier.allowedKeyManagement
-                .set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier(
-                ssidPattern,
-                bssidPattern,
-                wificonfigurationNetworkSpecifier);
-
-        assertTrue(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier));
-        assertTrue(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier));
-    }
-
-    /**
-     * Validate {@link WifiNetworkAgentSpecifier} with {@link WifiNetworkSpecifier} matching.
-     * a) Create network agent specifier for WPA_PSK network
-     * b) Create network specifier with matching BSSID pattern.
-     * c) Ensure that the agent specifier is satisfied by specifier.
-     */
-    @Test
-    public void
-            testWifiNetworkAgentSpecifierSatisfiesNetworkSpecifierWithBssidPattern() {
-        WifiNetworkAgentSpecifier wifiNetworkAgentSpecifier = createDefaultNetworkAgentSpecifier();
-
-        PatternMatcher ssidPattern =
-                new PatternMatcher(".*", PatternMatcher.PATTERN_SIMPLE_GLOB);
-        Pair<MacAddress, MacAddress> bssidPattern =
-                Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                        MacAddress.fromString(TEST_BSSID_OUI_MASK));
-        WifiConfiguration wificonfigurationNetworkSpecifier = new WifiConfiguration();
-        wificonfigurationNetworkSpecifier.allowedKeyManagement
-                .set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier(
-                ssidPattern,
-                bssidPattern,
-                wificonfigurationNetworkSpecifier);
-
-        assertTrue(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier));
-        assertTrue(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier));
-    }
-
-    /**
-     * Validate {@link WifiNetworkAgentSpecifier} with {@link WifiNetworkSpecifier} matching.
-     * a) Create network agent specifier for WPA_PSK network
-     * b) Create network specifier with matching SSID & BSSID pattern.
-     * c) Ensure that the agent specifier is satisfied by specifier.
-     */
-    @Test
-    public void
-            testWifiNetworkAgentSpecifierSatisfiesNetworkSpecifierWithSsidAndBssidPattern() {
-        WifiNetworkAgentSpecifier wifiNetworkAgentSpecifier = createDefaultNetworkAgentSpecifier();
-
-        PatternMatcher ssidPattern =
-                new PatternMatcher(TEST_SSID_PATTERN, PatternMatcher.PATTERN_PREFIX);
-        Pair<MacAddress, MacAddress> bssidPattern =
-                Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                        MacAddress.fromString(TEST_BSSID_OUI_MASK));
-        WifiConfiguration wificonfigurationNetworkSpecifier = new WifiConfiguration();
-        wificonfigurationNetworkSpecifier.allowedKeyManagement
-                .set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier(
-                ssidPattern,
-                bssidPattern,
-                wificonfigurationNetworkSpecifier);
-
-        assertTrue(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier));
-        assertTrue(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier));
-    }
-
-    /**
-     * Validate {@link WifiNetworkAgentSpecifier} with {@link WifiNetworkSpecifier} matching.
-     * a) Create network agent specifier for WPA_PSK network
-     * b) Create network specifier with non-matching SSID pattern.
-     * c) Ensure that the agent specifier is not satisfied by specifier.
-     */
-    @Test
-    public void
-            testWifiNetworkAgentSpecifierDoesNotSatisfyNetworkSpecifierWithSsidPattern() {
-        WifiConfiguration wifiConfigurationNetworkAgent = createDefaultWifiConfiguration();
-        wifiConfigurationNetworkAgent.SSID = "\"" + TEST_SSID_1 + "\"";
-        WifiNetworkAgentSpecifier wifiNetworkAgentSpecifier =
-                new WifiNetworkAgentSpecifier(
-                        wifiConfigurationNetworkAgent);
-
-        PatternMatcher ssidPattern =
-                new PatternMatcher(TEST_SSID_PATTERN, PatternMatcher.PATTERN_PREFIX);
-        Pair<MacAddress, MacAddress> bssidPattern =
-                Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS, WifiManager.ALL_ZEROS_MAC_ADDRESS);
-        WifiConfiguration wificonfigurationNetworkSpecifier = new WifiConfiguration();
-        wificonfigurationNetworkSpecifier.allowedKeyManagement
-                .set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier(
-                ssidPattern,
-                bssidPattern,
-                wificonfigurationNetworkSpecifier);
-
-        assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier));
-        assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier));
-    }
-
-    /**
-     * Validate {@link WifiNetworkAgentSpecifier} with {@link WifiNetworkSpecifier} matching.
-     * a) Create network agent specifier for WPA_PSK network
-     * b) Create network specifier with non-matching BSSID pattern.
-     * c) Ensure that the agent specifier is not satisfied by specifier.
-     */
-    @Test
-    public void
-            testWifiNetworkAgentSpecifierDoesNotSatisfyNetworkSpecifierWithBssidPattern() {
-        WifiConfiguration wifiConfigurationNetworkAgent = createDefaultWifiConfiguration();
-        wifiConfigurationNetworkAgent.BSSID = TEST_BSSID_1;
-        WifiNetworkAgentSpecifier wifiNetworkAgentSpecifier =
-                new WifiNetworkAgentSpecifier(
-                        wifiConfigurationNetworkAgent);
-
-        PatternMatcher ssidPattern =
-                new PatternMatcher(".*", PatternMatcher.PATTERN_SIMPLE_GLOB);
-        Pair<MacAddress, MacAddress> bssidPattern =
-                Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                        MacAddress.fromString(TEST_BSSID_OUI_MASK));
-        WifiConfiguration wificonfigurationNetworkSpecifier = new WifiConfiguration();
-        wificonfigurationNetworkSpecifier.allowedKeyManagement
-                .set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier(
-                ssidPattern,
-                bssidPattern,
-                wificonfigurationNetworkSpecifier);
-
-        assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier));
-        assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier));
-    }
-
-    /**
-     * Validate {@link WifiNetworkAgentSpecifier} with {@link WifiNetworkSpecifier} matching.
-     * a) Create network agent specifier for WPA_PSK network
-     * b) Create network specifier with non-matching SSID and BSSID pattern.
-     * c) Ensure that the agent specifier is not satisfied by specifier.
-     */
-    @Test
-    public void
-            testWifiNetworkAgentSpecifierDoesNotSatisfyNetworkSpecifierWithSsidAndBssidPattern() {
-        WifiConfiguration wifiConfigurationNetworkAgent = createDefaultWifiConfiguration();
-        wifiConfigurationNetworkAgent.BSSID = TEST_BSSID_1;
-        WifiNetworkAgentSpecifier wifiNetworkAgentSpecifier =
-                new WifiNetworkAgentSpecifier(
-                        wifiConfigurationNetworkAgent);
-
-        PatternMatcher ssidPattern =
-                new PatternMatcher(TEST_SSID_PATTERN, PatternMatcher.PATTERN_PREFIX);
-        Pair<MacAddress, MacAddress> bssidPattern =
-                Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                        MacAddress.fromString(TEST_BSSID_OUI_MASK));
-        WifiConfiguration wificonfigurationNetworkSpecifier = new WifiConfiguration();
-        wificonfigurationNetworkSpecifier.allowedKeyManagement
-                .set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier(
-                ssidPattern,
-                bssidPattern,
-                wificonfigurationNetworkSpecifier);
-
-        assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier));
-        assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier));
-    }
-
-    /**
-     * Validate {@link WifiNetworkAgentSpecifier} with {@link WifiNetworkSpecifier} matching.
-     * a) Create network agent specifier for WPA_PSK network
-     * b) Create network specifier with matching SSID and BSSID pattern, but different key mgmt.
-     * c) Ensure that the agent specifier is not satisfied by specifier.
-     */
-    @Test
-    public void
-            testWifiNetworkAgentSpecifierDoesNotSatisfyNetworkSpecifierWithDifferentKeyMgmt() {
-        WifiNetworkAgentSpecifier wifiNetworkAgentSpecifier = createDefaultNetworkAgentSpecifier();
-
-        PatternMatcher ssidPattern =
-                new PatternMatcher(TEST_SSID_PATTERN, PatternMatcher.PATTERN_PREFIX);
-        Pair<MacAddress, MacAddress> bssidPattern =
-                Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                        MacAddress.fromString(TEST_BSSID_OUI_MASK));
-        WifiConfiguration wificonfigurationNetworkSpecifier = new WifiConfiguration();
-        wificonfigurationNetworkSpecifier.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        WifiNetworkSpecifier wifiNetworkSpecifier = new WifiNetworkSpecifier(
-                ssidPattern,
-                bssidPattern,
-                wificonfigurationNetworkSpecifier);
-
-        assertFalse(wifiNetworkSpecifier.canBeSatisfiedBy(wifiNetworkAgentSpecifier));
-        assertFalse(wifiNetworkAgentSpecifier.canBeSatisfiedBy(wifiNetworkSpecifier));
-    }
-
-
-    private WifiConfiguration createDefaultWifiConfiguration() {
-        WifiConfiguration wifiConfiguration = new WifiConfiguration();
-        wifiConfiguration.SSID = "\"" + TEST_SSID + "\"";
-        wifiConfiguration.BSSID = TEST_BSSID;
-        wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
-        return wifiConfiguration;
-    }
-
-    private WifiNetworkAgentSpecifier createDefaultNetworkAgentSpecifier() {
-        return new WifiNetworkAgentSpecifier(createDefaultWifiConfiguration());
-    }
-
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
deleted file mode 100644
index 6f47f3d..0000000
--- a/wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java
+++ /dev/null
@@ -1,617 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static android.os.PatternMatcher.PATTERN_LITERAL;
-import static android.os.PatternMatcher.PATTERN_PREFIX;
-import static android.os.PatternMatcher.PATTERN_SIMPLE_GLOB;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.net.MacAddress;
-import android.net.MatchAllNetworkSpecifier;
-import android.net.NetworkSpecifier;
-import android.os.Parcel;
-import android.os.PatternMatcher;
-import android.util.Pair;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.security.cert.X509Certificate;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiNetworkSpecifier}.
- */
-@SmallTest
-public class WifiNetworkSpecifierTest {
-    private static final String TEST_SSID = "Test123";
-    private static final String TEST_BSSID_OUI_BASE_ADDRESS = "12:12:12:00:00:00";
-    private static final String TEST_BSSID_OUI_MASK = "ff:ff:ff:00:00:00";
-    private static final String TEST_BSSID = "12:12:12:12:12:12";
-    private static final String TEST_PRESHARED_KEY = "\"Test123\"";
-    private static final String TEST_DOMAIN_SUFFIX_MATCH = "domainSuffixMatch";
-
-    /**
-     * Validate correctness of WifiNetworkSpecifier object created by
-     * {@link WifiNetworkSpecifier.Builder#build()} for open network with SSID pattern.
-     */
-    @Test
-    public void testWifiNetworkSpecifierBuilderForOpenNetworkWithSsidPattern() {
-        NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_PREFIX))
-                .build();
-
-        assertTrue(specifier instanceof WifiNetworkSpecifier);
-        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
-
-        assertEquals(TEST_SSID, wifiNetworkSpecifier.ssidPatternMatcher.getPath());
-        assertEquals(PATTERN_PREFIX, wifiNetworkSpecifier.ssidPatternMatcher.getType());
-        assertEquals(WifiManager.ALL_ZEROS_MAC_ADDRESS,
-                wifiNetworkSpecifier.bssidPatternMatcher.first);
-        assertEquals(WifiManager.ALL_ZEROS_MAC_ADDRESS,
-                wifiNetworkSpecifier.bssidPatternMatcher.second);
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.NONE));
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSpecifier object created by
-     * {@link WifiNetworkSpecifier.Builder#build()} for WPA_PSK network with BSSID
-     * pattern.
-     */
-    @Test
-    public void testWifiNetworkSpecifierBuilderForWpa2PskNetworkWithBssidPattern() {
-        NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
-                .setBssidPattern(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                        MacAddress.fromString(TEST_BSSID_OUI_MASK))
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .build();
-
-        assertTrue(specifier instanceof WifiNetworkSpecifier);
-        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
-
-        assertEquals(".*", wifiNetworkSpecifier.ssidPatternMatcher.getPath());
-        assertEquals(PATTERN_SIMPLE_GLOB, wifiNetworkSpecifier.ssidPatternMatcher.getType());
-        assertEquals(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                wifiNetworkSpecifier.bssidPatternMatcher.first);
-        assertEquals(MacAddress.fromString(TEST_BSSID_OUI_MASK),
-                wifiNetworkSpecifier.bssidPatternMatcher.second);
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_PSK));
-        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
-                wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSpecifier object created by
-     * {@link WifiNetworkSpecifier.Builder#build()} for WPA_EAP network with
-     * SSID and BSSID pattern.
-     */
-    @Test
-    public void testWifiNetworkSpecifierBuilderForWpa2EapHiddenNetworkWithSsidAndBssid() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
-
-        NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
-                .setSsid(TEST_SSID)
-                .setBssid(MacAddress.fromString(TEST_BSSID))
-                .setWpa2EnterpriseConfig(enterpriseConfig)
-                .setIsHiddenSsid(true)
-                .build();
-
-        assertTrue(specifier instanceof WifiNetworkSpecifier);
-        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
-
-        assertEquals(TEST_SSID, wifiNetworkSpecifier.ssidPatternMatcher.getPath());
-        assertEquals(PATTERN_LITERAL, wifiNetworkSpecifier.ssidPatternMatcher.getType());
-        assertEquals(MacAddress.fromString(TEST_BSSID),
-                wifiNetworkSpecifier.bssidPatternMatcher.first);
-        assertEquals(MacAddress.BROADCAST_ADDRESS,
-                wifiNetworkSpecifier.bssidPatternMatcher.second);
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_EAP));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.IEEE8021X));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.hiddenSSID);
-        assertEquals(enterpriseConfig.getEapMethod(),
-                wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig.getEapMethod());
-        assertEquals(enterpriseConfig.getPhase2Method(),
-                wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig.getPhase2Method());
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWpa3EapNetwork() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
-        enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
-
-        NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa3EnterpriseConfig(enterpriseConfig)
-                .build();
-
-        assertTrue(specifier instanceof WifiNetworkSpecifier);
-        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
-
-        assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.IEEE8021X));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_EAP));
-        assertFalse(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.CCMP));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
-        assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
-        assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit RSA SuiteB network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWpa3SuiteBRsaEapNetwork() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_RSA3072_CERT);
-        enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_RSA3072_KEY,
-                new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_RSA3072_CERT});
-
-        enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
-
-        NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa3EnterpriseConfig(enterpriseConfig)
-                .build();
-
-        assertTrue(specifier instanceof WifiNetworkSpecifier);
-        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
-
-        assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.GCMP_256));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupManagementCiphers
-                .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
-        assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
-        assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit ECC SuiteB network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWpa3SuiteBEccEapNetwork() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_ECDSA_CERT);
-        enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_ECC_KEY,
-                new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_ECDSA_CERT});
-
-        enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
-
-        NetworkSpecifier specifier = new WifiNetworkSpecifier.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa3EnterpriseConfig(enterpriseConfig)
-                .build();
-
-        assertTrue(specifier instanceof WifiNetworkSpecifier);
-        WifiNetworkSpecifier wifiNetworkSpecifier = (WifiNetworkSpecifier) specifier;
-
-        assertEquals("\"" + TEST_SSID + "\"", wifiNetworkSpecifier.wifiConfiguration.SSID);
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.GCMP_256));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.allowedGroupManagementCiphers
-                .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
-        assertTrue(wifiNetworkSpecifier.wifiConfiguration.requirePmf);
-        assertNull(wifiNetworkSpecifier.wifiConfiguration.preSharedKey);
-        assertNotNull(wifiNetworkSpecifier.wifiConfiguration.enterpriseConfig);
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#setSsid(String)} throws an exception
-     * when the string is not Unicode.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testWifiNetworkSpecifierBuilderSetSsidWithNonUnicodeString() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsid("\ud800")
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#setWpa2Passphrase(String)} throws an exception
-     * when the string is not ASCII encodable.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testWifiNetworkSpecifierSetWpa2PasphraseWithNonAsciiString() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase("salvē")
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when neither SSID nor BSSID patterns were set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithNoSsidAndBssidPattern() {
-        new WifiNetworkSpecifier.Builder().build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when match-all SSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern1() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher(".*", PATTERN_SIMPLE_GLOB))
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when match-all SSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern2() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher(".*", PatternMatcher.PATTERN_ADVANCED_GLOB))
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when match-all SSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchAllSsidPattern3() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher("", PATTERN_PREFIX))
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when match-all BSSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchAllBssidPattern() {
-        new WifiNetworkSpecifier.Builder()
-                .setBssidPattern(WifiManager.ALL_ZEROS_MAC_ADDRESS,
-                        WifiManager.ALL_ZEROS_MAC_ADDRESS)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when match-none SSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchNoneSsidPattern1() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher("", PatternMatcher.PATTERN_LITERAL))
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when match-none SSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchNoneSsidPattern2() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsid("")
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when match-none BSSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern1() {
-        new WifiNetworkSpecifier.Builder()
-                .setBssidPattern(MacAddress.BROADCAST_ADDRESS, MacAddress.BROADCAST_ADDRESS)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when match-none BSSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern2() {
-        new WifiNetworkSpecifier.Builder()
-                .setBssid(MacAddress.BROADCAST_ADDRESS)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when match-none BSSID pattern is set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithMatchNoneBssidPattern3() {
-        new WifiNetworkSpecifier.Builder()
-                .setBssid(WifiManager.ALL_ZEROS_MAC_ADDRESS)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when SSID pattern is set for hidden network.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithBssidMatchPatternForHiddenNetwork() {
-        new WifiNetworkSpecifier.Builder()
-                .setBssidPattern(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                        MacAddress.fromString(TEST_BSSID_OUI_MASK))
-                .setIsHiddenSsid(true)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSpecifier.Builder#setWpa2Passphrase(String)} and
-     * {@link WifiNetworkSpecifier.Builder#setWpa2EnterpriseConfig(WifiEnterpriseConfig)} are
-     * invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithBothWpa2PasphraseAndEnterpriseConfig() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setWpa2EnterpriseConfig(new WifiEnterpriseConfig())
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when SSID pattern is set for hidden network.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithSsidMatchPatternForHiddenNetwork() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_PREFIX))
-                .setIsHiddenSsid(true)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSpecifier.Builder#setWpa2Passphrase(String)} and
-     * {@link WifiNetworkSpecifier.Builder#setWpa3Passphrase(String)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithBothWpa2PasphraseAndWpa3Passphrase() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSpecifier.Builder#setWpa3Passphrase(String)} and
-     * {@link WifiNetworkSpecifier.Builder#setWpa3EnterpriseConfig(WifiEnterpriseConfig)} are
-     * invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithBothWpa3PasphraseAndEnterprise() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .setWpa3EnterpriseConfig(new WifiEnterpriseConfig())
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSpecifier.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSpecifier.Builder#setWpa3Passphrase(String)} and
-     * {@link WifiNetworkSpecifier.Builder#setIsEnhancedOpen(boolean)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSpecifierBuilderWithBothWpa3PasphraseAndEnhancedOpen() {
-        new WifiNetworkSpecifier.Builder()
-                .setSsidPattern(new PatternMatcher(TEST_SSID, PATTERN_LITERAL))
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .setIsEnhancedOpen(true)
-                .build();
-    }
-
-    /**
-     * Validate that parcel marshalling/unmarshalling works
-     */
-    @Test
-    public void testWifiNetworkSpecifierParcel() {
-        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)),
-                        wifiConfiguration);
-
-        Parcel parcelW = Parcel.obtain();
-        specifier.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiNetworkSpecifier parcelSpecifier =
-                WifiNetworkSpecifier.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(specifier, parcelSpecifier);
-    }
-
-    /**
-     * Validate NetworkSpecifier matching.
-     * a) Create a network specifier for WPA_PSK network
-     * b) Ensure that the specifier does not match {@code null} and {@link MatchAllNetworkSpecifier}
-     * specifiers.
-     */
-    @Test
-    public void testWifiNetworkSpecifierDoesNotSatisfyNullAndAllMatch() {
-        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)),
-                        wifiConfiguration);
-
-        assertFalse(specifier.canBeSatisfiedBy(null));
-        assertFalse(specifier.canBeSatisfiedBy(new MatchAllNetworkSpecifier()));
-    }
-
-    /**
-     * Validate NetworkSpecifier matching.
-     * a) Create network specifier 1 for WPA_PSK network
-     * b) Create network specifier 2 with the same params as specifier 1.
-     * c) Ensure that the specifier 2 is satisfied by specifier 1.
-     */
-    @Test
-    public void testWifiNetworkSpecifierSatisfiesSame() {
-        WifiConfiguration wifiConfiguration = new WifiConfiguration();
-        wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
-
-        WifiNetworkSpecifier specifier1 =
-                new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
-                        Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                                MacAddress.fromString(TEST_BSSID_OUI_MASK)),
-                        wifiConfiguration);
-
-        WifiNetworkSpecifier specifier2 =
-                new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
-                        Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                                MacAddress.fromString(TEST_BSSID_OUI_MASK)),
-                        wifiConfiguration);
-
-        assertTrue(specifier2.canBeSatisfiedBy(specifier1));
-    }
-
-    /**
-     * Validate NetworkSpecifier matching.
-     * a) Create network specifier 1 for WPA_PSK network
-     * b) Create network specifier 2 with different key mgmt params.
-     * c) Ensure that the specifier 2 is not satisfied by specifier 1.
-     */
-    @Test
-    public void testWifiNetworkSpecifierDoesNotSatisfyWhenKeyMgmtDifferent() {
-        WifiConfiguration wifiConfiguration1 = new WifiConfiguration();
-        wifiConfiguration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        wifiConfiguration1.preSharedKey = TEST_PRESHARED_KEY;
-
-        WifiNetworkSpecifier specifier1 =
-                new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
-                        Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                                MacAddress.fromString(TEST_BSSID_OUI_MASK)),
-                        wifiConfiguration1);
-
-        WifiConfiguration wifiConfiguration2 = new WifiConfiguration();
-        wifiConfiguration2.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        WifiNetworkSpecifier specifier2 =
-                new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
-                        Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                                MacAddress.fromString(TEST_BSSID_OUI_MASK)),
-                        wifiConfiguration2);
-
-        assertFalse(specifier2.canBeSatisfiedBy(specifier1));
-    }
-
-    /**
-     * Validate NetworkSpecifier matching.
-     * a) Create network specifier 1 for WPA_PSK network
-     * b) Create network specifier 2 with different SSID pattern.
-     * c) Ensure that the specifier 2 is not satisfied by specifier 1.
-     */
-    @Test
-    public void testWifiNetworkSpecifierDoesNotSatisfyWhenSsidDifferent() {
-        WifiConfiguration wifiConfiguration = new WifiConfiguration();
-        wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
-
-        WifiNetworkSpecifier specifier1 =
-                new WifiNetworkSpecifier(new PatternMatcher("", PATTERN_LITERAL),
-                        Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                                MacAddress.fromString(TEST_BSSID_OUI_MASK)),
-                        wifiConfiguration);
-
-        WifiNetworkSpecifier specifier2 =
-                new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
-                        Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                                MacAddress.fromString(TEST_BSSID_OUI_MASK)),
-                        wifiConfiguration);
-
-        assertFalse(specifier2.canBeSatisfiedBy(specifier1));
-    }
-
-    /**
-     * Validate NetworkSpecifier matching.
-     * a) Create network specifier 1 for WPA_PSK network
-     * b) Create network specifier 2 with different BSSID pattern.
-     * c) Ensure that the specifier 2 is not satisfied by specifier 1.
-     */
-    @Test
-    public void testWifiNetworkSpecifierDoesNotSatisfyWhenBssidDifferent() {
-        WifiConfiguration wifiConfiguration = new WifiConfiguration();
-        wifiConfiguration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        wifiConfiguration.preSharedKey = TEST_PRESHARED_KEY;
-
-        WifiNetworkSpecifier specifier1 =
-                new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
-                        Pair.create(MacAddress.fromString(TEST_BSSID_OUI_BASE_ADDRESS),
-                                MacAddress.fromString(TEST_BSSID_OUI_MASK)),
-                        wifiConfiguration);
-
-        WifiNetworkSpecifier specifier2 =
-                new WifiNetworkSpecifier(new PatternMatcher(TEST_SSID, PATTERN_LITERAL),
-                        Pair.create(WifiManager.ALL_ZEROS_MAC_ADDRESS,
-                                WifiManager.ALL_ZEROS_MAC_ADDRESS),
-                        wifiConfiguration);
-
-        assertFalse(specifier2.canBeSatisfiedBy(specifier1));
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java b/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
deleted file mode 100644
index 00a0442..0000000
--- a/wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java
+++ /dev/null
@@ -1,965 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static org.junit.Assert.*;
-
-import android.net.MacAddress;
-import android.net.wifi.hotspot2.PasspointConfiguration;
-import android.net.wifi.hotspot2.PasspointTestUtils;
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.security.cert.X509Certificate;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiNetworkSuggestion}.
- */
-@SmallTest
-public class WifiNetworkSuggestionTest {
-    private static final String TEST_SSID = "\"Test123\"";
-    private static final String TEST_BSSID = "12:12:12:12:12:12";
-    private static final String TEST_SSID_1 = "\"Test1234\"";
-    private static final String TEST_PRESHARED_KEY = "Test123";
-    private static final String TEST_FQDN = "fqdn";
-    private static final String TEST_WAPI_CERT_SUITE = "suite";
-    private static final String TEST_DOMAIN_SUFFIX_MATCH = "domainSuffixMatch";
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for Open network which requires
-     * app interaction.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForOpenNetworkWithReqAppInteraction() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setIsAppInteractionRequired(true)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.NONE));
-        assertTrue(suggestion.isAppInteractionRequired);
-        assertFalse(suggestion.isUserInteractionRequired);
-        assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE,
-                suggestion.wifiConfiguration.meteredOverride);
-        assertEquals(-1, suggestion.wifiConfiguration.priority);
-        assertFalse(suggestion.isUserAllowedToManuallyConnect);
-        assertTrue(suggestion.isInitialAutoJoinEnabled);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WPA_EAP network which requires
-     * app interaction, not share credential and has a priority of zero set.
-     */
-    @Test
-    public void
-            testWifiNetworkSuggestionBuilderForWpa2EapNetworkWithPriorityAndReqAppInteraction() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setIsAppInteractionRequired(true)
-                .setCredentialSharedWithUser(false)
-                .setPriority(0)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_PSK));
-        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
-                suggestion.wifiConfiguration.preSharedKey);
-        assertTrue(suggestion.isAppInteractionRequired);
-        assertFalse(suggestion.isUserInteractionRequired);
-        assertEquals(WifiConfiguration.METERED_OVERRIDE_NONE,
-                suggestion.wifiConfiguration.meteredOverride);
-        assertEquals(0, suggestion.wifiConfiguration.priority);
-        assertFalse(suggestion.isUserAllowedToManuallyConnect);
-        assertTrue(suggestion.isInitialAutoJoinEnabled);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WPA_PSK network which requires
-     * user interaction and is metered.
-     */
-    @Test
-    public void
-            testWifiNetworkSuggestionBuilderForWpa2PskNetworkWithMeteredAndReqUserInteraction() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setIsUserInteractionRequired(true)
-                .setIsInitialAutojoinEnabled(false)
-                .setIsMetered(true)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_PSK));
-        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
-                suggestion.wifiConfiguration.preSharedKey);
-        assertFalse(suggestion.isAppInteractionRequired);
-        assertTrue(suggestion.isUserInteractionRequired);
-        assertEquals(WifiConfiguration.METERED_OVERRIDE_METERED,
-                suggestion.wifiConfiguration.meteredOverride);
-        assertEquals(-1, suggestion.wifiConfiguration.priority);
-        assertTrue(suggestion.isUserAllowedToManuallyConnect);
-        assertFalse(suggestion.isInitialAutoJoinEnabled);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WPA_PSK network which requires
-     * user interaction and is not metered.
-     */
-    @Test
-    public void
-            testWifiNetworkSuggestionBuilderForWpa2PskNetworkWithNotMeteredAndReqUserInteraction() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setIsUserInteractionRequired(true)
-                .setIsInitialAutojoinEnabled(false)
-                .setIsMetered(false)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_PSK));
-        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
-                suggestion.wifiConfiguration.preSharedKey);
-        assertFalse(suggestion.isAppInteractionRequired);
-        assertTrue(suggestion.isUserInteractionRequired);
-        assertEquals(WifiConfiguration.METERED_OVERRIDE_NOT_METERED,
-                suggestion.wifiConfiguration.meteredOverride);
-        assertEquals(-1, suggestion.wifiConfiguration.priority);
-        assertTrue(suggestion.isUserAllowedToManuallyConnect);
-        assertFalse(suggestion.isInitialAutoJoinEnabled);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for OWE network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForEnhancedOpenNetworkWithBssid() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setBssid(MacAddress.fromString(TEST_BSSID))
-                .setIsEnhancedOpen(true)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertEquals(TEST_BSSID, suggestion.wifiConfiguration.BSSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.OWE));
-        assertNull(suggestion.wifiConfiguration.preSharedKey);
-        assertTrue(suggestion.wifiConfiguration.requirePmf);
-        assertFalse(suggestion.isUserAllowedToManuallyConnect);
-        assertTrue(suggestion.isInitialAutoJoinEnabled);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for SAE network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWpa3PskNetwork() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .setCredentialSharedWithUser(true)
-                .setIsInitialAutojoinEnabled(false)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.SAE));
-        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
-                suggestion.wifiConfiguration.preSharedKey);
-        assertTrue(suggestion.wifiConfiguration.requirePmf);
-        assertTrue(suggestion.isUserAllowedToManuallyConnect);
-        assertFalse(suggestion.isInitialAutoJoinEnabled);
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWpa3EapNetwork() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
-        enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
-
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa3EnterpriseConfig(enterpriseConfig)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.IEEE8021X));
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WPA_EAP));
-        assertFalse(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
-        assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.CCMP));
-        assertTrue(suggestion.wifiConfiguration.requirePmf);
-        assertNull(suggestion.wifiConfiguration.preSharedKey);
-        // allowedSuiteBCiphers are set according to the loaded certificate and cannot be tested
-        // here.
-        assertTrue(suggestion.isUserAllowedToManuallyConnect);
-        assertTrue(suggestion.isInitialAutoJoinEnabled);
-        assertNotNull(suggestion.getEnterpriseConfig());
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit RSA SuiteB network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWpa3SuiteBRsaEapNetwork() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_RSA3072_CERT);
-        enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_RSA3072_KEY,
-                new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_RSA3072_CERT});
-
-        enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
-
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa3EnterpriseConfig(enterpriseConfig)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
-        assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.GCMP_256));
-        assertTrue(suggestion.wifiConfiguration.allowedGroupManagementCiphers
-                .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
-        assertTrue(suggestion.wifiConfiguration.requirePmf);
-        assertNull(suggestion.wifiConfiguration.preSharedKey);
-        // allowedSuiteBCiphers are set according to the loaded certificate and cannot be tested
-        // here.
-        assertTrue(suggestion.isUserAllowedToManuallyConnect);
-        assertTrue(suggestion.isInitialAutoJoinEnabled);
-        assertNotNull(suggestion.getEnterpriseConfig());
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WPA3-Enterprise 192-bit ECC SuiteB network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWpa3SuiteBEccEapNetwork() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setCaCertificate(FakeKeys.CA_SUITE_B_ECDSA_CERT);
-        enterpriseConfig.setClientKeyEntryWithCertificateChain(FakeKeys.CLIENT_SUITE_B_ECC_KEY,
-                new X509Certificate[] {FakeKeys.CLIENT_SUITE_B_ECDSA_CERT});
-
-        enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
-
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa3EnterpriseConfig(enterpriseConfig)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.SUITE_B_192));
-        assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.GCMP_256));
-        assertTrue(suggestion.wifiConfiguration.allowedGroupManagementCiphers
-                .get(WifiConfiguration.GroupMgmtCipher.BIP_GMAC_256));
-        assertTrue(suggestion.wifiConfiguration.requirePmf);
-        assertNull(suggestion.wifiConfiguration.preSharedKey);
-        // allowedSuiteBCiphers are set according to the loaded certificate and cannot be tested
-        // here.
-        assertTrue(suggestion.isUserAllowedToManuallyConnect);
-        assertTrue(suggestion.isInitialAutoJoinEnabled);
-    }
-
-    /**
-     * Ensure create enterprise suggestion requires CA, when CA certificate is missing, will throw
-     * an exception.
-     */
-    @Test (expected = IllegalArgumentException.class)
-    public void testWifiNetworkSuggestionBuilderForEapNetworkWithoutCa() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
-        enterpriseConfig.setDomainSuffixMatch(TEST_DOMAIN_SUFFIX_MATCH);
-
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa2EnterpriseConfig(enterpriseConfig)
-                .build();
-    }
-
-    /**
-     * Ensure create enterprise suggestion requires CA, when both domain suffix and alt subject
-     * match are missing, will throw an exception.
-     */
-    @Test (expected = IllegalArgumentException.class)
-    public void testWifiNetworkSuggestionBuilderForEapNetworkWithoutMatch() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
-        enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.GTC);
-        enterpriseConfig.setCaCertificate(FakeKeys.CA_CERT0);
-
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa3EnterpriseConfig(enterpriseConfig)
-                .build();
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WAPI-PSK network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWapiPskNetwork() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWapiPassphrase(TEST_PRESHARED_KEY)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WAPI_PSK));
-        assertTrue(suggestion.wifiConfiguration.allowedPairwiseCiphers
-                .get(WifiConfiguration.PairwiseCipher.SMS4));
-        assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.SMS4));
-        assertEquals("\"" + TEST_PRESHARED_KEY + "\"",
-                suggestion.wifiConfiguration.preSharedKey);
-    }
-
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WAPI-CERT network.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWapiCertNetwork() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.WAPI_CERT);
-        enterpriseConfig.setWapiCertSuite(TEST_WAPI_CERT_SUITE);
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWapiEnterpriseConfig(enterpriseConfig)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WAPI_CERT));
-        assertTrue(suggestion.wifiConfiguration.allowedPairwiseCiphers
-                .get(WifiConfiguration.PairwiseCipher.SMS4));
-        assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.SMS4));
-        assertNull(suggestion.wifiConfiguration.preSharedKey);
-        assertNotNull(suggestion.wifiConfiguration.enterpriseConfig);
-        assertEquals(WifiEnterpriseConfig.Eap.WAPI_CERT,
-                suggestion.wifiConfiguration.enterpriseConfig.getEapMethod());
-        assertEquals(TEST_WAPI_CERT_SUITE,
-                suggestion.wifiConfiguration.enterpriseConfig.getWapiCertSuite());
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for WAPI-CERT network
-     * which selects the certificate suite automatically.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForWapiCertAutoNetwork() {
-        WifiEnterpriseConfig enterpriseConfig = new WifiEnterpriseConfig();
-        enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.WAPI_CERT);
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWapiEnterpriseConfig(enterpriseConfig)
-                .build();
-
-        assertEquals("\"" + TEST_SSID + "\"", suggestion.wifiConfiguration.SSID);
-        assertTrue(suggestion.wifiConfiguration.allowedKeyManagement
-                .get(WifiConfiguration.KeyMgmt.WAPI_CERT));
-        assertTrue(suggestion.wifiConfiguration.allowedPairwiseCiphers
-                .get(WifiConfiguration.PairwiseCipher.SMS4));
-        assertTrue(suggestion.wifiConfiguration.allowedGroupCiphers
-                .get(WifiConfiguration.GroupCipher.SMS4));
-        assertNull(suggestion.wifiConfiguration.preSharedKey);
-        assertNotNull(suggestion.wifiConfiguration.enterpriseConfig);
-        assertEquals(WifiEnterpriseConfig.Eap.WAPI_CERT,
-                suggestion.wifiConfiguration.enterpriseConfig.getEapMethod());
-        assertEquals("",
-                suggestion.wifiConfiguration.enterpriseConfig.getWapiCertSuite());
-    }
-
-    /**
-     * Validate correctness of WifiNetworkSuggestion object created by
-     * {@link WifiNetworkSuggestion.Builder#build()} for Passpoint network which requires
-     *  app interaction and metered.
-     */
-    @Test
-    public void testWifiNetworkSuggestionBuilderForPasspointNetworkWithReqAppInteractionMetered() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setPasspointConfig(passpointConfiguration)
-                .setIsAppInteractionRequired(true)
-                .setIsMetered(true)
-                .build();
-        assertEquals(TEST_FQDN, suggestion.wifiConfiguration.FQDN);
-        assertTrue(suggestion.isAppInteractionRequired);
-        assertEquals(suggestion.wifiConfiguration.meteredOverride,
-                WifiConfiguration.METERED_OVERRIDE_METERED);
-        assertEquals(suggestion.getPasspointConfig().getMeteredOverride(),
-                WifiConfiguration.METERED_OVERRIDE_METERED);
-        assertTrue(suggestion.isUserAllowedToManuallyConnect);
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#setSsid(String)} throws an exception
-     * when the string is not Unicode.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testWifiNetworkSuggestionBuilderSetSsidWithNonUnicodeString() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid("\ud800")
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#setWpa2Passphrase(String)} throws an exception
-     * when the string is not ASCII encodable.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testWifiNetworkSuggestionBuilderSetWpa2PasphraseWithNonAsciiString() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase("salvē")
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)}}
-     * throws an exception when the PasspointConfiguration is not valid.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testWifiNetworkSuggestionBuilderSetPasspointConfigWithNonValid() {
-        PasspointConfiguration passpointConfiguration = new PasspointConfiguration();
-        new WifiNetworkSuggestion.Builder()
-                .setPasspointConfig(passpointConfiguration)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when {@link WifiNetworkSuggestion.Builder#setSsid(String)} is not set.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithNoSsid() {
-        new WifiNetworkSuggestion.Builder()
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when {@link WifiNetworkSuggestion.Builder#setSsid(String)} is invoked with an invalid value.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithInvalidSsid() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid("")
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when {@link WifiNetworkSuggestion.Builder#setBssid(MacAddress)} is invoked with an invalid
-     * value.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithInvalidBroadcastBssid() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setBssid(MacAddress.BROADCAST_ADDRESS)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when {@link WifiNetworkSuggestion.Builder#setBssid(MacAddress)} is invoked with an invalid
-     * value.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithInvalidAllZeroBssid() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setBssid(WifiManager.ALL_ZEROS_MAC_ADDRESS)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#setPriority(int)} throws an exception
-     * when the value is negative.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testWifiNetworkSuggestionBuilderWithInvalidPriority() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setPriority(-2)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSuggestion.Builder#setWpa2Passphrase(String)} and
-     * {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithBothWpa2PasphraseAndWpa3Passphrase() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} and
-     * {@link WifiNetworkSuggestion.Builder#setWpa3EnterpriseConfig(WifiEnterpriseConfig)} are
-     * invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithBothWpa3PasphraseAndEnterprise() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .setWpa3EnterpriseConfig(new WifiEnterpriseConfig())
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} and
-     * {@link WifiNetworkSuggestion.Builder#setIsEnhancedOpen(boolean)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithBothWpa3PasphraseAndEnhancedOpen() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .setIsEnhancedOpen(true)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSuggestion.Builder#setSsid(String)} and
-     * {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithBothSsidAndPasspointConfig() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setPasspointConfig(passpointConfiguration)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSuggestion.Builder#setWpa2Passphrase(String)} and
-     * {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithBothWpa2PassphraseAndPasspointConfig() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        new WifiNetworkSuggestion.Builder()
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setPasspointConfig(passpointConfiguration)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSuggestion.Builder#setWpa3Passphrase(String)} and
-     * {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithBothWpa3PassphraseAndPasspointConfig() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        new WifiNetworkSuggestion.Builder()
-                .setWpa3Passphrase(TEST_PRESHARED_KEY)
-                .setPasspointConfig(passpointConfiguration)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSuggestion.Builder#setWpa3EnterpriseConfig(WifiEnterpriseConfig)}
-     * and {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are
-     * invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithBothEnterpriseAndPasspointConfig() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        new WifiNetworkSuggestion.Builder()
-                .setWpa3EnterpriseConfig(new WifiEnterpriseConfig())
-                .setPasspointConfig(passpointConfiguration)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSuggestion.Builder#setIsEnhancedOpen(boolean)} and
-     * {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithBothEnhancedOpenAndPasspointConfig() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        new WifiNetworkSuggestion.Builder()
-                .setIsEnhancedOpen(true)
-                .setPasspointConfig(passpointConfiguration)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when both {@link WifiNetworkSuggestion.Builder#setIsHiddenSsid(boolean)} and
-     * {@link WifiNetworkSuggestion.Builder#setPasspointConfig(PasspointConfiguration)} are invoked.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testWifiNetworkSuggestionBuilderWithBothHiddenSsidAndPasspointConfig() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        new WifiNetworkSuggestion.Builder()
-                .setIsHiddenSsid(true)
-                .setPasspointConfig(passpointConfiguration)
-                .build();
-    }
-
-    /**
-     * Check that parcel marshalling/unmarshalling works
-     */
-    @Test
-    public void testWifiNetworkSuggestionParcel() {
-        WifiConfiguration configuration = new WifiConfiguration();
-        configuration.SSID = TEST_SSID;
-        configuration.BSSID = TEST_BSSID;
-        configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion(
-                configuration, null, false, true, true, true);
-
-        Parcel parcelW = Parcel.obtain();
-        suggestion.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiNetworkSuggestion parcelSuggestion =
-                WifiNetworkSuggestion.CREATOR.createFromParcel(parcelR);
-
-        // Two suggestion objects are considered equal if they point to the same network (i.e same
-        // SSID + keyMgmt + same UID). |isAppInteractionRequired| & |isUserInteractionRequired| are
-        // not considered for equality and hence needs to be checked for explicitly below.
-        assertEquals(suggestion, parcelSuggestion);
-        assertEquals(suggestion.hashCode(), parcelSuggestion.hashCode());
-        assertEquals(suggestion.isAppInteractionRequired,
-                parcelSuggestion.isAppInteractionRequired);
-        assertEquals(suggestion.isUserInteractionRequired,
-                parcelSuggestion.isUserInteractionRequired);
-        assertEquals(suggestion.isInitialAutoJoinEnabled,
-                parcelSuggestion.isInitialAutoJoinEnabled);
-    }
-
-    /**
-     * Check that parcel marshalling/unmarshalling works
-     */
-    @Test
-    public void testPasspointNetworkSuggestionParcel() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setPasspointConfig(passpointConfiguration)
-                .build();
-
-        Parcel parcelW = Parcel.obtain();
-        suggestion.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiNetworkSuggestion parcelSuggestion =
-                WifiNetworkSuggestion.CREATOR.createFromParcel(parcelR);
-
-        // Two suggestion objects are considered equal if they point to the same network (i.e same
-        // SSID + keyMgmt + same UID). |isAppInteractionRequired| & |isUserInteractionRequired| are
-        // not considered for equality and hence needs to be checked for explicitly below.
-        assertEquals(suggestion, parcelSuggestion);
-        assertEquals(suggestion.hashCode(), parcelSuggestion.hashCode());
-        assertEquals(suggestion.isAppInteractionRequired,
-                parcelSuggestion.isAppInteractionRequired);
-        assertEquals(suggestion.isUserInteractionRequired,
-                parcelSuggestion.isUserInteractionRequired);
-        assertEquals(suggestion.isInitialAutoJoinEnabled,
-                parcelSuggestion.isInitialAutoJoinEnabled);
-    }
-
-    /**
-     * Check NetworkSuggestion equals returns {@code true} for 2 network suggestions with the same
-     * SSID, BSSID, key mgmt and UID.
-     */
-    @Test
-    public void testWifiNetworkSuggestionEqualsSame() {
-        WifiConfiguration configuration = new WifiConfiguration();
-        configuration.SSID = TEST_SSID;
-        configuration.BSSID = TEST_BSSID;
-        configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        WifiNetworkSuggestion suggestion =
-                new WifiNetworkSuggestion(configuration, null, true, false, true, true);
-
-        WifiConfiguration configuration1 = new WifiConfiguration();
-        configuration1.SSID = TEST_SSID;
-        configuration1.BSSID = TEST_BSSID;
-        configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        WifiNetworkSuggestion suggestion1 =
-                new WifiNetworkSuggestion(configuration1, null, false, true, true, true);
-
-        assertEquals(suggestion, suggestion1);
-        assertEquals(suggestion.hashCode(), suggestion1.hashCode());
-    }
-
-    /**
-     * Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same
-     * BSSID, key mgmt and UID, but different SSID.
-     */
-    @Test
-    public void testWifiNetworkSuggestionEqualsFailsWhenSsidIsDifferent() {
-        WifiConfiguration configuration = new WifiConfiguration();
-        configuration.SSID = TEST_SSID;
-        configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        WifiNetworkSuggestion suggestion =
-                new WifiNetworkSuggestion(configuration, null, false, false, true, true);
-
-        WifiConfiguration configuration1 = new WifiConfiguration();
-        configuration1.SSID = TEST_SSID_1;
-        configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        WifiNetworkSuggestion suggestion1 =
-                new WifiNetworkSuggestion(configuration1, null, false, false, true, true);
-
-        assertNotEquals(suggestion, suggestion1);
-    }
-
-    /**
-     * Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same
-     * SSID, key mgmt and UID, but different BSSID.
-     */
-    @Test
-    public void testWifiNetworkSuggestionEqualsFailsWhenBssidIsDifferent() {
-        WifiConfiguration configuration = new WifiConfiguration();
-        configuration.SSID = TEST_SSID;
-        configuration.BSSID = TEST_BSSID;
-        configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        WifiNetworkSuggestion suggestion =
-                new WifiNetworkSuggestion(configuration, null,  false, false, true, true);
-
-        WifiConfiguration configuration1 = new WifiConfiguration();
-        configuration1.SSID = TEST_SSID;
-        configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        WifiNetworkSuggestion suggestion1 =
-                new WifiNetworkSuggestion(configuration1, null, false, false, true, true);
-
-        assertNotEquals(suggestion, suggestion1);
-    }
-
-    /**
-     * Check NetworkSuggestion equals returns {@code false} for 2 network suggestions with the same
-     * SSID, BSSID and UID, but different key mgmt.
-     */
-    @Test
-    public void testWifiNetworkSuggestionEqualsFailsWhenKeyMgmtIsDifferent() {
-        WifiConfiguration configuration = new WifiConfiguration();
-        configuration.SSID = TEST_SSID;
-        configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
-        WifiNetworkSuggestion suggestion =
-                new WifiNetworkSuggestion(configuration, null, false, false, true, true);
-
-        WifiConfiguration configuration1 = new WifiConfiguration();
-        configuration1.SSID = TEST_SSID;
-        configuration1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
-        WifiNetworkSuggestion suggestion1 =
-                new WifiNetworkSuggestion(configuration1, null, false, false, true, true);
-
-        assertNotEquals(suggestion, suggestion1);
-    }
-
-    /**
-     * Check NetworkSuggestion equals returns {@code true} for 2 Passpoint network suggestions with
-     * same FQDN.
-     */
-    @Test
-    public void testPasspointNetworkSuggestionEqualsSameWithSameFQDN() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        PasspointConfiguration passpointConfiguration1 = PasspointTestUtils.createConfig();
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setPasspointConfig(passpointConfiguration)
-                .build();
-        WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder()
-                .setPasspointConfig(passpointConfiguration1)
-                .build();
-        assertEquals(suggestion, suggestion1);
-        assertEquals(suggestion.hashCode(), suggestion1.hashCode());
-    }
-
-    /**
-     * Check NetworkSuggestion equals returns {@code false} for 2 Passpoint network suggestions with
-     * different FQDN.
-     */
-    @Test
-    public void testPasspointNetworkSuggestionNotEqualsSameWithDifferentFQDN() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        PasspointConfiguration passpointConfiguration1 = PasspointTestUtils.createConfig();
-        passpointConfiguration1.getHomeSp().setFqdn(TEST_FQDN + 1);
-
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setPasspointConfig(passpointConfiguration)
-                .build();
-        WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder()
-                .setPasspointConfig(passpointConfiguration1)
-                .build();
-        assertNotEquals(suggestion, suggestion1);
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} to
-     * true on a open network suggestion.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testSetCredentialSharedWithUserWithOpenNetwork() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setCredentialSharedWithUser(true)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when {@link WifiNetworkSuggestion.Builder#setIsInitialAutojoinEnabled(boolean)} to
-     * false on a open network suggestion.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testSetIsAutoJoinDisabledWithOpenNetwork() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setIsInitialAutojoinEnabled(false)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when set both {@link WifiNetworkSuggestion.Builder#setIsInitialAutojoinEnabled(boolean)}
-     * and {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} (boolean)}
-     * to false on a network suggestion.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testSetIsAutoJoinDisabledWithSecureNetworkNotSharedWithUser() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setCredentialSharedWithUser(false)
-                .setIsInitialAutojoinEnabled(false)
-                .build();
-    }
-
-    /**
-     * Validate {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} set the
-     * correct value to the WifiConfiguration.
-     */
-    @Test
-    public void testSetIsNetworkAsUntrusted() {
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setUntrusted(true)
-                .build();
-        assertTrue(suggestion.isUntrusted());
-        assertFalse(suggestion.isUserAllowedToManuallyConnect);
-    }
-
-    /**
-     * Validate {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} set the
-     * correct value to the WifiConfiguration.
-     * Also the {@link WifiNetworkSuggestion#isUserAllowedToManuallyConnect} should be false;
-     */
-    @Test
-    public void testSetIsNetworkAsUntrustedOnPasspointNetwork() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
-                .setPasspointConfig(passpointConfiguration)
-                .setUntrusted(true)
-                .build();
-        assertTrue(suggestion.isUntrusted());
-        assertFalse(suggestion.isUserAllowedToManuallyConnect);
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when set {@link WifiNetworkSuggestion.Builder#setUntrusted(boolean)} to true and
-     * set {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} to true
-     * together.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testSetCredentialSharedWithUserWithSetIsNetworkAsUntrusted() {
-        new WifiNetworkSuggestion.Builder()
-                .setSsid(TEST_SSID)
-                .setWpa2Passphrase(TEST_PRESHARED_KEY)
-                .setCredentialSharedWithUser(true)
-                .setUntrusted(true)
-                .build();
-    }
-
-    /**
-     * Ensure {@link WifiNetworkSuggestion.Builder#build()} throws an exception
-     * when set both {@link WifiNetworkSuggestion.Builder#setIsInitialAutojoinEnabled(boolean)}
-     * and {@link WifiNetworkSuggestion.Builder#setCredentialSharedWithUser(boolean)} (boolean)}
-     * to false on a passpoint suggestion.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testSetIsAutoJoinDisabledWithSecureNetworkNotSharedWithUserForPasspoint() {
-        PasspointConfiguration passpointConfiguration = PasspointTestUtils.createConfig();
-        new WifiNetworkSuggestion.Builder()
-                .setPasspointConfig(passpointConfiguration)
-                .setCredentialSharedWithUser(false)
-                .setIsInitialAutojoinEnabled(false)
-                .build();
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiScannerTest.java b/wifi/tests/src/android/net/wifi/WifiScannerTest.java
deleted file mode 100644
index b68616f..0000000
--- a/wifi/tests/src/android/net/wifi/WifiScannerTest.java
+++ /dev/null
@@ -1,634 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.validateMockitoUsage;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-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.ScanListener;
-import android.net.wifi.WifiScanner.ScanSettings;
-import android.os.Bundle;
-import android.os.Handler;
-import android.os.Message;
-import android.os.Messenger;
-import android.os.Parcel;
-import android.os.test.TestLooper;
-
-import androidx.test.filters.SmallTest;
-
-import com.android.internal.util.test.BidirectionalAsyncChannelServer;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.Spy;
-
-import java.util.Arrays;
-import java.util.concurrent.Executor;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiScanner}.
- */
-@SmallTest
-public class WifiScannerTest {
-    @Mock
-    private Context mContext;
-    @Mock
-    private IWifiScanner mService;
-    @Spy
-    private Executor mExecutor = new SynchronousExecutor();
-    @Mock
-    private ScanListener mScanListener;
-    @Mock
-    private WifiScanner.ParcelableScanData mParcelableScanData;
-    private ScanData[] mScanData = {};
-
-    private static final boolean TEST_PNOSETTINGS_IS_CONNECTED = false;
-    private static final int TEST_PNOSETTINGS_MIN_5GHZ_RSSI = -60;
-    private static final int TEST_PNOSETTINGS_MIN_2GHZ_RSSI = -70;
-    private static final int TEST_PNOSETTINGS_MIN_6GHZ_RSSI = -55;
-    private static final String TEST_SSID_1 = "TEST1";
-    private static final String TEST_SSID_2 = "TEST2";
-    private static final int[] TEST_FREQUENCIES_1 = {};
-    private static final int[] TEST_FREQUENCIES_2 = {2500, 5124, 6245};
-    private static final String DESCRIPTION_NOT_AUTHORIZED = "Not authorized";
-
-    private WifiScanner mWifiScanner;
-    private TestLooper mLooper;
-    private Handler mHandler;
-    private BidirectionalAsyncChannelServer mBidirectionalAsyncChannelServer;
-
-    /**
-     * Setup before tests.
-     */
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-        mLooper = new TestLooper();
-        mHandler = spy(new Handler(mLooper.getLooper()));
-        mBidirectionalAsyncChannelServer = new BidirectionalAsyncChannelServer(
-                mContext, mLooper.getLooper(), mHandler);
-        when(mService.getMessenger()).thenReturn(mBidirectionalAsyncChannelServer.getMessenger());
-        mWifiScanner = new WifiScanner(mContext, mService, mLooper.getLooper());
-        mLooper.dispatchAll();
-        when(mParcelableScanData.getResults()).thenReturn(mScanData);
-    }
-
-    /**
-     * Clean up after tests.
-     */
-    @After
-    public void cleanup() {
-        validateMockitoUsage();
-    }
-
-    /**
-     * Verify parcel read/write for ScanSettings.
-     */
-    @Test
-    public void verifyScanSettingsParcelWithBand() throws Exception {
-        ScanSettings writeSettings = new ScanSettings();
-        writeSettings.type = WifiScanner.SCAN_TYPE_LOW_POWER;
-        writeSettings.band = WifiScanner.WIFI_BAND_BOTH_WITH_DFS;
-
-        ScanSettings readSettings = parcelWriteRead(writeSettings);
-        assertEquals(readSettings.type, writeSettings.type);
-        assertEquals(readSettings.band, writeSettings.band);
-        assertEquals(0, readSettings.channels.length);
-    }
-
-    /**
-     * Verify parcel read/write for ScanSettings.
-     */
-    @Test
-    public void verifyScanSettingsParcelWithChannels() throws Exception {
-        ScanSettings writeSettings = new ScanSettings();
-        writeSettings.type = WifiScanner.SCAN_TYPE_HIGH_ACCURACY;
-        writeSettings.band = WifiScanner.WIFI_BAND_UNSPECIFIED;
-        writeSettings.channels = new WifiScanner.ChannelSpec[] {
-                new WifiScanner.ChannelSpec(5),
-                new WifiScanner.ChannelSpec(7)
-        };
-
-        ScanSettings readSettings = parcelWriteRead(writeSettings);
-        assertEquals(writeSettings.type, readSettings.type);
-        assertEquals(writeSettings.band, readSettings.band);
-        assertEquals(2, readSettings.channels.length);
-        assertEquals(5, readSettings.channels[0].frequency);
-        assertEquals(7, readSettings.channels[1].frequency);
-    }
-
-    /**
-     * Write the provided {@link ScanSettings} to a parcel and deserialize it.
-     */
-    private static ScanSettings parcelWriteRead(ScanSettings writeSettings) throws Exception {
-        Parcel parcel = Parcel.obtain();
-        writeSettings.writeToParcel(parcel, 0);
-        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        return ScanSettings.CREATOR.createFromParcel(parcel);
-    }
-
-    /**
-     *  PnoSettings object can be serialized and deserialized, while keeping the
-     *  values unchanged.
-     */
-    @Test
-    public void canSerializeAndDeserializePnoSettings() throws Exception {
-
-        PnoSettings pnoSettings = new PnoSettings();
-
-        PnoNetwork pnoNetwork1 = new PnoNetwork(TEST_SSID_1);
-        PnoNetwork pnoNetwork2 = new PnoNetwork(TEST_SSID_2);
-        pnoNetwork1.frequencies = TEST_FREQUENCIES_1;
-        pnoNetwork2.frequencies = TEST_FREQUENCIES_2;
-
-        pnoSettings.networkList = new PnoNetwork[]{pnoNetwork1, pnoNetwork2};
-        pnoSettings.isConnected = TEST_PNOSETTINGS_IS_CONNECTED;
-        pnoSettings.min5GHzRssi = TEST_PNOSETTINGS_MIN_5GHZ_RSSI;
-        pnoSettings.min24GHzRssi = TEST_PNOSETTINGS_MIN_2GHZ_RSSI;
-        pnoSettings.min6GHzRssi = TEST_PNOSETTINGS_MIN_6GHZ_RSSI;
-
-        Parcel parcel = Parcel.obtain();
-        pnoSettings.writeToParcel(parcel, 0);
-        // Rewind the pointer to the head of the parcel.
-        parcel.setDataPosition(0);
-        PnoSettings pnoSettingsDeserialized =
-                pnoSettings.CREATOR.createFromParcel(parcel);
-
-        assertNotNull(pnoSettingsDeserialized);
-        assertEquals(TEST_PNOSETTINGS_IS_CONNECTED, pnoSettingsDeserialized.isConnected);
-        assertEquals(TEST_PNOSETTINGS_MIN_5GHZ_RSSI, pnoSettingsDeserialized.min5GHzRssi);
-        assertEquals(TEST_PNOSETTINGS_MIN_2GHZ_RSSI, pnoSettingsDeserialized.min24GHzRssi);
-        assertEquals(TEST_PNOSETTINGS_MIN_6GHZ_RSSI, pnoSettingsDeserialized.min6GHzRssi);
-
-        // Test parsing of PnoNetwork
-        assertEquals(pnoSettings.networkList.length, pnoSettingsDeserialized.networkList.length);
-        for (int i = 0; i < pnoSettings.networkList.length; i++) {
-            PnoNetwork expected = pnoSettings.networkList[i];
-            PnoNetwork actual = pnoSettingsDeserialized.networkList[i];
-            assertEquals(expected.ssid, actual.ssid);
-            assertEquals(expected.flags, actual.flags);
-            assertEquals(expected.authBitField, actual.authBitField);
-            assertTrue(Arrays.equals(expected.frequencies, actual.frequencies));
-        }
-    }
-
-    /**
-     *  Make sure that frequencies is not null by default.
-     */
-    @Test
-    public void pnoNetworkFrequencyIsNotNull() throws Exception {
-        PnoNetwork pnoNetwork = new PnoNetwork(TEST_SSID_1);
-        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);
-    }
-
-
-    /**
-     * Test behavior of {@link WifiScanner#startScan(ScanSettings, ScanListener)}
-     * @throws Exception
-     */
-    @Test
-    public void testStartScan() throws Exception {
-        ScanSettings scanSettings = new ScanSettings();
-        ScanListener scanListener = mock(ScanListener.class);
-
-        mWifiScanner.startScan(scanSettings, scanListener);
-        mLooper.dispatchAll();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler).handleMessage(messageArgumentCaptor.capture());
-        Message message = messageArgumentCaptor.getValue();
-        assertNotNull(message);
-
-        assertEquals(WifiScanner.CMD_START_SINGLE_SCAN, message.what);
-        assertTrue(message.obj instanceof Bundle);
-        Bundle messageBundle = (Bundle) message.obj;
-        assertEquals(scanSettings,
-                messageBundle.getParcelable(WifiScanner.SCAN_PARAMS_SCAN_SETTINGS_KEY));
-        assertNull(messageBundle.getParcelable(WifiScanner.SCAN_PARAMS_WORK_SOURCE_KEY));
-        assertEquals(mContext.getOpPackageName(),
-                messageBundle.getParcelable(WifiScanner.REQUEST_PACKAGE_NAME_KEY));
-        assertEquals(mContext.getAttributionTag(),
-                messageBundle.getParcelable(WifiScanner.REQUEST_FEATURE_ID_KEY));
-
-    }
-
-    /**
-     * Test behavior of {@link WifiScanner#stopScan(ScanListener)}
-     * @throws Exception
-     */
-    @Test
-    public void testStopScan() throws Exception {
-        ScanSettings scanSettings = new ScanSettings();
-        ScanListener scanListener = mock(ScanListener.class);
-
-        mWifiScanner.startScan(scanSettings, scanListener);
-        mLooper.dispatchAll();
-
-        mWifiScanner.stopScan(scanListener);
-        mLooper.dispatchAll();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler, times(2)).handleMessage(messageArgumentCaptor.capture());
-        Message message = messageArgumentCaptor.getValue();
-        assertNotNull(message);
-
-        assertEquals(WifiScanner.CMD_STOP_SINGLE_SCAN, message.what);
-        assertTrue(message.obj instanceof Bundle);
-        Bundle messageBundle = (Bundle) message.obj;
-        assertEquals(mContext.getOpPackageName(),
-                messageBundle.getParcelable(WifiScanner.REQUEST_PACKAGE_NAME_KEY));
-        assertEquals(mContext.getAttributionTag(),
-                messageBundle.getParcelable(WifiScanner.REQUEST_FEATURE_ID_KEY));
-    }
-
-    /**
-     * Test behavior of {@link WifiScanner#startScan(ScanSettings, ScanListener)}
-     * @throws Exception
-     */
-    @Test
-    public void testStartScanListenerOnSuccess() throws Exception {
-        ScanSettings scanSettings = new ScanSettings();
-        ScanListener scanListener = mock(ScanListener.class);
-
-        mWifiScanner.startScan(scanSettings, scanListener);
-        mLooper.dispatchAll();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler).handleMessage(messageArgumentCaptor.capture());
-        Message sentMessage = messageArgumentCaptor.getValue();
-        assertNotNull(sentMessage);
-
-        assertEquals(1, mBidirectionalAsyncChannelServer.getClientMessengers().size());
-        Messenger scannerMessenger =
-                mBidirectionalAsyncChannelServer.getClientMessengers().iterator().next();
-
-        Message responseMessage = Message.obtain();
-        responseMessage.what = WifiScanner.CMD_OP_SUCCEEDED;
-        responseMessage.arg2 = sentMessage.arg2;
-        scannerMessenger.send(responseMessage);
-        mLooper.dispatchAll();
-
-        verify(scanListener).onSuccess();
-    }
-
-    /**
-     * Test behavior of {@link WifiScanner#startScan(ScanSettings, ScanListener)}
-     * @throws Exception
-     */
-    @Test
-    public void testStartScanListenerOnResults() throws Exception {
-        ScanSettings scanSettings = new ScanSettings();
-        ScanListener scanListener = mock(ScanListener.class);
-
-        mWifiScanner.startScan(scanSettings, scanListener);
-        mLooper.dispatchAll();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler).handleMessage(messageArgumentCaptor.capture());
-        Message sentMessage = messageArgumentCaptor.getValue();
-        assertNotNull(sentMessage);
-
-        assertEquals(1, mBidirectionalAsyncChannelServer.getClientMessengers().size());
-        Messenger scannerMessenger =
-                mBidirectionalAsyncChannelServer.getClientMessengers().iterator().next();
-
-        ScanResult scanResult = new ScanResult();
-        ScanData scanDatas[] = new ScanData[]{new ScanData(0, 0 , new ScanResult[] {scanResult})};
-        Message responseMessage = Message.obtain();
-        responseMessage.what = WifiScanner.CMD_SCAN_RESULT;
-        responseMessage.arg2 = sentMessage.arg2;
-        responseMessage.obj = new WifiScanner.ParcelableScanData(scanDatas);
-        scannerMessenger.send(responseMessage);
-        mLooper.dispatchAll();
-
-        verify(scanListener).onResults(scanDatas);
-    }
-
-    /**
-     * Test behavior of {@link WifiScanner#startDisconnectedPnoScan(ScanSettings, PnoSettings,
-     * Executor, WifiScanner.PnoScanListener)}
-     * @throws Exception
-     */
-    @Test
-    public void testStartDisconnectedPnoScan() throws Exception {
-        ScanSettings scanSettings = new ScanSettings();
-        PnoSettings pnoSettings = new PnoSettings();
-        WifiScanner.PnoScanListener pnoScanListener = mock(WifiScanner.PnoScanListener.class);
-
-        mWifiScanner.startDisconnectedPnoScan(
-                scanSettings, pnoSettings, mock(Executor.class), pnoScanListener);
-        mLooper.dispatchAll();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler).handleMessage(messageArgumentCaptor.capture());
-        Message message = messageArgumentCaptor.getValue();
-        assertNotNull(message);
-
-        assertEquals(WifiScanner.CMD_START_PNO_SCAN, message.what);
-        assertTrue(message.obj instanceof Bundle);
-        Bundle messageBundle = (Bundle) message.obj;
-        assertEquals(scanSettings,
-                messageBundle.getParcelable(WifiScanner.PNO_PARAMS_SCAN_SETTINGS_KEY));
-        assertTrue(scanSettings.isPnoScan);
-        assertFalse(pnoSettings.isConnected);
-        assertEquals(pnoSettings,
-                messageBundle.getParcelable(WifiScanner.PNO_PARAMS_PNO_SETTINGS_KEY));
-    }
-
-    /**
-     * Test behavior of {@link WifiScanner#startConnectedPnoScan(ScanSettings, PnoSettings,
-     * Executor, WifiScanner.PnoScanListener)}
-     * @throws Exception
-     */
-    @Test
-    public void testStartConnectedPnoScan() throws Exception {
-        ScanSettings scanSettings = new ScanSettings();
-        PnoSettings pnoSettings = new PnoSettings();
-        WifiScanner.PnoScanListener pnoScanListener = mock(WifiScanner.PnoScanListener.class);
-
-        mWifiScanner.startConnectedPnoScan(
-                scanSettings, pnoSettings, mock(Executor.class), pnoScanListener);
-        mLooper.dispatchAll();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler).handleMessage(messageArgumentCaptor.capture());
-        Message message = messageArgumentCaptor.getValue();
-        assertNotNull(message);
-
-        assertEquals(WifiScanner.CMD_START_PNO_SCAN, message.what);
-        assertTrue(message.obj instanceof Bundle);
-        Bundle messageBundle = (Bundle) message.obj;
-        assertEquals(scanSettings,
-                messageBundle.getParcelable(WifiScanner.PNO_PARAMS_SCAN_SETTINGS_KEY));
-        assertTrue(scanSettings.isPnoScan);
-        assertTrue(pnoSettings.isConnected);
-        assertEquals(pnoSettings,
-                messageBundle.getParcelable(WifiScanner.PNO_PARAMS_PNO_SETTINGS_KEY));
-    }
-
-    /**
-     * Test behavior of {@link WifiScanner#stopPnoScan(ScanListener)}
-     * Executor, WifiScanner.PnoScanListener)}
-     * @throws Exception
-     */
-    @Test
-    public void testStopPnoScan() throws Exception {
-        ScanSettings scanSettings = new ScanSettings();
-        PnoSettings pnoSettings = new PnoSettings();
-        WifiScanner.PnoScanListener pnoScanListener = mock(WifiScanner.PnoScanListener.class);
-
-        mWifiScanner.startDisconnectedPnoScan(
-                scanSettings, pnoSettings, mock(Executor.class), pnoScanListener);
-        mLooper.dispatchAll();
-        mWifiScanner.stopPnoScan(pnoScanListener);
-        mLooper.dispatchAll();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler, times(2)).handleMessage(messageArgumentCaptor.capture());
-        Message message = messageArgumentCaptor.getValue();
-        assertNotNull(message);
-
-        assertEquals(WifiScanner.CMD_STOP_PNO_SCAN, message.what);
-    }
-
-    @Test
-    public void testScanDataAddResults() throws Exception {
-        ScanResult scanResult1 = new ScanResult();
-        scanResult1.SSID = TEST_SSID_1;
-        ScanData scanData = new ScanData(0, 0, new ScanResult[]{scanResult1});
-
-        ScanResult scanResult2 = new ScanResult();
-        scanResult2.SSID = TEST_SSID_2;
-        scanData.addResults(new ScanResult[]{scanResult2});
-
-        ScanResult[] consolidatedScanResults = scanData.getResults();
-        assertEquals(2, consolidatedScanResults.length);
-        assertEquals(TEST_SSID_1, consolidatedScanResults[0].SSID);
-        assertEquals(TEST_SSID_2, consolidatedScanResults[1].SSID);
-    }
-
-    @Test
-    public void testScanDataParcel() throws Exception {
-        ScanResult scanResult1 = new ScanResult();
-        scanResult1.SSID = TEST_SSID_1;
-        ScanData scanData = new ScanData(5, 4, new ScanResult[]{scanResult1});
-
-        Parcel parcel = Parcel.obtain();
-        scanData.writeToParcel(parcel, 0);
-        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        ScanData readScanData = ScanData.CREATOR.createFromParcel(parcel);
-
-        assertEquals(scanData.getId(), readScanData.getId());
-        assertEquals(scanData.getFlags(), readScanData.getFlags());
-        assertEquals(scanData.getResults().length, readScanData.getResults().length);
-        assertEquals(scanData.getResults()[0].SSID, readScanData.getResults()[0].SSID);
-    }
-
-    /** Tests that upon registration success, {@link ScanListener#onSuccess()} is called. */
-    @Test
-    public void testRegisterScanListenerSuccess() throws Exception {
-        mWifiScanner.registerScanListener(mExecutor, mScanListener);
-        mLooper.dispatchAll();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler).handleMessage(messageArgumentCaptor.capture());
-        Message sentMessage = messageArgumentCaptor.getValue();
-        assertNotNull(sentMessage);
-
-        assertEquals(1, mBidirectionalAsyncChannelServer.getClientMessengers().size());
-        Messenger scannerMessenger =
-                mBidirectionalAsyncChannelServer.getClientMessengers().iterator().next();
-
-        Message responseMessage = Message.obtain();
-        responseMessage.what = WifiScanner.CMD_OP_SUCCEEDED;
-        responseMessage.arg2 = sentMessage.arg2;
-        scannerMessenger.send(responseMessage);
-        mLooper.dispatchAll();
-
-        verify(mExecutor).execute(any());
-        verify(mScanListener).onSuccess();
-    }
-
-    /**
-     * Tests that upon registration failed, {@link ScanListener#onFailure(int, String)} is called.
-     */
-    @Test
-    public void testRegisterScanListenerFailed() throws Exception {
-        mWifiScanner.registerScanListener(mExecutor, mScanListener);
-        mLooper.dispatchAll();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler).handleMessage(messageArgumentCaptor.capture());
-        Message sentMessage = messageArgumentCaptor.getValue();
-        assertNotNull(sentMessage);
-
-        assertEquals(1, mBidirectionalAsyncChannelServer.getClientMessengers().size());
-        Messenger scannerMessenger =
-                mBidirectionalAsyncChannelServer.getClientMessengers().iterator().next();
-
-        {
-            Message responseMessage = Message.obtain();
-            responseMessage.what = WifiScanner.CMD_OP_FAILED;
-            responseMessage.arg2 = sentMessage.arg2;
-            responseMessage.obj = new WifiScanner.OperationResult(
-                    WifiScanner.REASON_NOT_AUTHORIZED, DESCRIPTION_NOT_AUTHORIZED);
-            scannerMessenger.send(responseMessage);
-            mLooper.dispatchAll();
-        }
-
-        verify(mExecutor).execute(any());
-        verify(mScanListener).onFailure(
-                WifiScanner.REASON_NOT_AUTHORIZED, DESCRIPTION_NOT_AUTHORIZED);
-
-        // CMD_OP_FAILED should have caused the removal of the listener, verify this
-        {
-            Message responseMessage = Message.obtain();
-            responseMessage.what = WifiScanner.CMD_SCAN_RESULT;
-            responseMessage.arg2 = sentMessage.arg2;
-            responseMessage.obj = mParcelableScanData;
-            scannerMessenger.send(responseMessage);
-            mLooper.dispatchAll();
-        }
-        // execute() called once before, not called again
-        verify(mExecutor, times(1)).execute(any());
-        // onResults() never triggered
-        verify(mScanListener, never()).onResults(any());
-    }
-
-    /**
-     * Tests that when the ScanListener is triggered, {@link ScanListener#onResults(ScanData[])}
-     * is called.
-     */
-    @Test
-    public void testRegisterScanListenerReceiveScanResults() throws Exception {
-        mWifiScanner.registerScanListener(mExecutor, mScanListener);
-        mLooper.dispatchAll();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler).handleMessage(messageArgumentCaptor.capture());
-        Message sentMessage = messageArgumentCaptor.getValue();
-        assertNotNull(sentMessage);
-
-        assertEquals(1, mBidirectionalAsyncChannelServer.getClientMessengers().size());
-        Messenger scannerMessenger =
-                mBidirectionalAsyncChannelServer.getClientMessengers().iterator().next();
-
-        Message responseMessage = Message.obtain();
-        responseMessage.what = WifiScanner.CMD_SCAN_RESULT;
-        responseMessage.arg2 = sentMessage.arg2;
-        responseMessage.obj = mParcelableScanData;
-        scannerMessenger.send(responseMessage);
-        mLooper.dispatchAll();
-
-        verify(mExecutor).execute(any());
-        verify(mScanListener).onResults(mScanData);
-    }
-
-    /**
-     * Tests that after unregistering a scan listener, {@link ScanListener#onResults(ScanData[])}
-     * is not called.
-     */
-    @Test
-    public void testUnregisterScanListener() throws Exception {
-        mWifiScanner.registerScanListener(mExecutor, mScanListener);
-        mWifiScanner.unregisterScanListener(mScanListener);
-        mLooper.dispatchAll();
-
-        assertEquals(1, mBidirectionalAsyncChannelServer.getClientMessengers().size());
-        Messenger scannerMessenger =
-                mBidirectionalAsyncChannelServer.getClientMessengers().iterator().next();
-
-        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
-        verify(mHandler, times(2)).handleMessage(messageArgumentCaptor.capture());
-        Message sentMessage = messageArgumentCaptor.getValue();
-        assertNotNull(sentMessage);
-
-        Message responseMessage = Message.obtain();
-        responseMessage.what = WifiScanner.CMD_SCAN_RESULT;
-        responseMessage.obj = mParcelableScanData;
-        responseMessage.arg2 = sentMessage.arg2;
-        scannerMessenger.send(responseMessage);
-        mLooper.dispatchAll();
-
-        verify(mExecutor, never()).execute(any());
-        verify(mScanListener, never()).onResults(mScanData);
-    }
-
-    /**
-     * Tests isFullBandScan() method with and without DFS check
-     */
-    @Test
-    public void testIsFullBandScan() throws Exception {
-        assertFalse(WifiScanner.isFullBandScan(WifiScanner.WIFI_BAND_24_GHZ, true));
-        assertFalse(WifiScanner.isFullBandScan(WifiScanner.WIFI_BAND_5_GHZ, true));
-        assertFalse(WifiScanner.isFullBandScan(WifiScanner.WIFI_BAND_6_GHZ, true));
-        assertFalse(WifiScanner.isFullBandScan(
-                WifiScanner.WIFI_BAND_6_GHZ | WifiScanner.WIFI_BAND_5_GHZ, true));
-        assertTrue(WifiScanner.isFullBandScan(
-                WifiScanner.WIFI_BAND_24_GHZ | WifiScanner.WIFI_BAND_5_GHZ, true));
-        assertFalse(WifiScanner.isFullBandScan(
-                WifiScanner.WIFI_BAND_24_GHZ | WifiScanner.WIFI_BAND_5_GHZ, false));
-        assertTrue(WifiScanner.isFullBandScan(WifiScanner.WIFI_BAND_BOTH_WITH_DFS, true));
-        assertTrue(WifiScanner.isFullBandScan(WifiScanner.WIFI_BAND_BOTH_WITH_DFS, false));
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiSsidTest.java b/wifi/tests/src/android/net/wifi/WifiSsidTest.java
deleted file mode 100644
index 10a37c0..0000000
--- a/wifi/tests/src/android/net/wifi/WifiSsidTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.nio.charset.StandardCharsets;
-
-/**
- * Unit tests for {@link android.net.wifi.WifiSsid}.
- */
-@SmallTest
-public class WifiSsidTest {
-
-    private static final String TEST_SSID = "Test SSID";
-    private static final byte[] TEST_SSID_BYTES = TEST_SSID.getBytes(StandardCharsets.US_ASCII);
-
-    /**
-     * Check that createFromByteArray() works.
-     */
-    @Test
-    public void testCreateFromByteArray() {
-        WifiSsid wifiSsid = WifiSsid.createFromByteArray(TEST_SSID_BYTES);
-        assertTrue(wifiSsid != null);
-        assertEquals(TEST_SSID, wifiSsid.toString());
-    }
-
-    /**
-     * Verify that SSID created from byte array and string with the same content are equal.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void testEquals() throws Exception {
-        WifiSsid fromBytes = WifiSsid.createFromByteArray(TEST_SSID_BYTES);
-        WifiSsid fromString = WifiSsid.createFromAsciiEncoded(TEST_SSID);
-        assertTrue(fromBytes != null);
-        assertTrue(fromString != null);
-        assertEquals(fromBytes, fromString);
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java b/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java
deleted file mode 100644
index 5184152..0000000
--- a/wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.validateMockitoUsage;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.MockitoAnnotations;
-
-
-/**
- * Unit tests for {@link android.net.wifi.WifiUsabilityStatsEntry}.
- */
-@SmallTest
-public class WifiUsabilityStatsEntryTest {
-
-    /**
-     * Setup before tests.
-     */
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    /**
-     * Clean up after tests.
-     */
-    @After
-    public void cleanup() {
-        validateMockitoUsage();
-    }
-
-    /**
-     * Verify parcel read/write for Wifi usability stats result.
-     */
-    @Test
-    public void verifyStatsResultWriteAndThenRead() throws Exception {
-        WifiUsabilityStatsEntry writeResult = createResult();
-        WifiUsabilityStatsEntry readResult = parcelWriteRead(writeResult);
-        assertWifiUsabilityStatsEntryEquals(writeResult, readResult);
-    }
-
-    /**
-     * Write the provided {@link WifiUsabilityStatsEntry} to a parcel and deserialize it.
-     */
-    private static WifiUsabilityStatsEntry parcelWriteRead(
-            WifiUsabilityStatsEntry writeResult) throws Exception {
-        Parcel parcel = Parcel.obtain();
-        writeResult.writeToParcel(parcel, 0);
-        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        return WifiUsabilityStatsEntry.CREATOR.createFromParcel(parcel);
-    }
-
-    private static WifiUsabilityStatsEntry createResult() {
-        return new WifiUsabilityStatsEntry(
-                0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
-                14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, true
-        );
-    }
-
-    private static void assertWifiUsabilityStatsEntryEquals(
-            WifiUsabilityStatsEntry expected,
-            WifiUsabilityStatsEntry actual) {
-        assertEquals(expected.getTimeStampMillis(), actual.getTimeStampMillis());
-        assertEquals(expected.getRssi(), actual.getRssi());
-        assertEquals(expected.getLinkSpeedMbps(), actual.getLinkSpeedMbps());
-        assertEquals(expected.getTotalTxSuccess(), actual.getTotalTxSuccess());
-        assertEquals(expected.getTotalTxRetries(), actual.getTotalTxRetries());
-        assertEquals(expected.getTotalTxBad(), actual.getTotalTxBad());
-        assertEquals(expected.getTotalRxSuccess(), actual.getTotalRxSuccess());
-        assertEquals(expected.getTotalRadioOnTimeMillis(), actual.getTotalRadioOnTimeMillis());
-        assertEquals(expected.getTotalRadioTxTimeMillis(), actual.getTotalRadioTxTimeMillis());
-        assertEquals(expected.getTotalRadioRxTimeMillis(), actual.getTotalRadioRxTimeMillis());
-        assertEquals(expected.getTotalScanTimeMillis(), actual.getTotalScanTimeMillis());
-        assertEquals(expected.getTotalNanScanTimeMillis(), actual.getTotalNanScanTimeMillis());
-        assertEquals(expected.getTotalBackgroundScanTimeMillis(),
-                actual.getTotalBackgroundScanTimeMillis());
-        assertEquals(expected.getTotalRoamScanTimeMillis(), actual.getTotalRoamScanTimeMillis());
-        assertEquals(expected.getTotalPnoScanTimeMillis(), actual.getTotalPnoScanTimeMillis());
-        assertEquals(expected.getTotalHotspot2ScanTimeMillis(),
-                actual.getTotalHotspot2ScanTimeMillis());
-        assertEquals(expected.getTotalCcaBusyFreqTimeMillis(),
-                actual.getTotalCcaBusyFreqTimeMillis());
-        assertEquals(expected.getTotalRadioOnFreqTimeMillis(),
-                actual.getTotalRadioOnFreqTimeMillis());
-        assertEquals(expected.getTotalBeaconRx(), actual.getTotalBeaconRx());
-        assertEquals(expected.getProbeStatusSinceLastUpdate(),
-                actual.getProbeStatusSinceLastUpdate());
-        assertEquals(expected.getProbeElapsedTimeSinceLastUpdateMillis(),
-                actual.getProbeElapsedTimeSinceLastUpdateMillis());
-        assertEquals(expected.getProbeMcsRateSinceLastUpdate(),
-                actual.getProbeMcsRateSinceLastUpdate());
-        assertEquals(expected.getRxLinkSpeedMbps(), actual.getRxLinkSpeedMbps());
-        assertEquals(expected.getCellularDataNetworkType(), actual.getCellularDataNetworkType());
-        assertEquals(expected.getCellularSignalStrengthDbm(),
-                actual.getCellularSignalStrengthDbm());
-        assertEquals(expected.getCellularSignalStrengthDb(), actual.getCellularSignalStrengthDb());
-        assertEquals(expected.isSameRegisteredCell(), actual.isSameRegisteredCell());
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/aware/TlvBufferUtilsTest.java b/wifi/tests/src/android/net/wifi/aware/TlvBufferUtilsTest.java
deleted file mode 100644
index 79e95e8..0000000
--- a/wifi/tests/src/android/net/wifi/aware/TlvBufferUtilsTest.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ErrorCollector;
-
-import java.nio.BufferOverflowException;
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * Unit test harness for TlvBufferUtils class.
- */
-@SmallTest
-public class TlvBufferUtilsTest {
-    @Rule
-    public ErrorCollector collector = new ErrorCollector();
-
-    /*
-     * TlvBufferUtils Tests
-     */
-
-    @Test
-    public void testTlvBuild() {
-        TlvBufferUtils.TlvConstructor tlv11 = new TlvBufferUtils.TlvConstructor(1, 1);
-        tlv11.allocate(15);
-        tlv11.putByte(0, (byte) 2);
-        tlv11.putByteArray(2, new byte[] {
-                0, 1, 2 });
-
-        collector.checkThat("tlv11-correct-construction",
-                tlv11.getArray(), equalTo(new byte[]{0, 1, 2, 2, 3, 0, 1, 2}));
-
-        TlvBufferUtils.TlvConstructor tlv01 = new TlvBufferUtils.TlvConstructor(0, 1);
-        tlv01.allocate(15);
-        tlv01.putByte(0, (byte) 2);
-        tlv01.putByteArray(2, new byte[] {
-                0, 1, 2 });
-
-        collector.checkThat("tlv01-correct-construction",
-                tlv01.getArray(), equalTo(new byte[] {1, 2, 3, 0, 1, 2 }));
-
-        collector.checkThat("tlv11-valid",
-                TlvBufferUtils.isValid(tlv11.getArray(), 1, 1),
-                equalTo(true));
-        collector.checkThat("tlv01-valid",
-                TlvBufferUtils.isValid(tlv01.getArray(), 0, 1),
-                equalTo(true));
-    }
-
-    /**
-     * Validate that re-using a TLV by any of the reallocation method resets it completely.
-     */
-    @Test
-    public void testTlvReuse() {
-        TlvBufferUtils.TlvConstructor tlv = new TlvBufferUtils.TlvConstructor(1, 1);
-
-        tlv.allocate(10);
-        tlv.putByte(0, (byte) 2);
-        tlv.putByte(1, (byte) 104);
-
-        collector.checkThat("initial", tlv.getArray(), equalTo(new byte[]{0, 1, 2, 1, 1, 104}));
-
-        tlv.allocate(8);
-        tlv.putByte(5, (byte) 7);
-        collector.checkThat("re-alloc", tlv.getArray(), equalTo(new byte[]{5, 1, 7}));
-    }
-
-    /**
-     * Verify that can build a valid TLV from a List of byte[].
-     */
-    @Test
-    public void testTlvListOperations() {
-        byte[] entry1 = { 1, 2, 3 };
-        byte[] entry2 = { 4, 5 };
-        byte[] entry3 = new byte[0];
-        List<byte[]> data = new ArrayList<>();
-        data.add(entry1);
-        data.add(entry2);
-        data.add(entry3);
-        data.add(null); // zero-length should work
-
-        TlvBufferUtils.TlvConstructor tlv01 = new TlvBufferUtils.TlvConstructor(0, 1);
-        tlv01.allocateAndPut(data);
-        byte[] tlvData = tlv01.getArray();
-        List<byte[]> parsedList = new TlvBufferUtils.TlvIterable(0, 1, tlvData).toList();
-
-        collector.checkThat("tlvData-correct-length", tlvData.length,
-                equalTo(entry1.length + 1 + entry2.length + 1 + entry3.length + 1 + 1));
-        collector.checkThat("parsedList-correct-length", parsedList.size(), equalTo(4));
-        collector.checkThat("parsedList-entry1", parsedList.get(0), equalTo(entry1));
-        collector.checkThat("parsedList-entry2", parsedList.get(1), equalTo(entry2));
-        collector.checkThat("parsedList-entry3", parsedList.get(2), equalTo(entry3));
-        collector.checkThat("parsedList-entry4", parsedList.get(3), equalTo(new byte[0]));
-    }
-
-    /**
-     * Verify that can parse a (correctly formatted) byte array to a list.
-     */
-    @Test
-    public void testTlvParseToList() {
-        byte[] validTlv01 = { 0, 1, 55, 2, 33, 66, 0 };
-
-        List<byte[]> parsedList = new TlvBufferUtils.TlvIterable(0, 1, validTlv01).toList();
-
-        collector.checkThat("parsedList-entry1", parsedList.get(0), equalTo(new byte[0]));
-        collector.checkThat("parsedList-entry2", parsedList.get(1), equalTo(new byte[] { 55 }));
-        collector.checkThat("parsedList-entry3", parsedList.get(2), equalTo(new byte[] { 33, 66 }));
-        collector.checkThat("parsedList-entry4", parsedList.get(3), equalTo(new byte[0]));
-    }
-
-    /**
-     * Verify that an exception is thrown when trying to parse an invalid array.
-     */
-    @Test(expected = BufferOverflowException.class)
-    public void testTlvParseToListError() {
-        byte[] invalidTlv01 = { 0, 1, 55, 2, 55, 66, 3 }; // bad data
-
-        List<byte[]> data = new TlvBufferUtils.TlvIterable(0, 1, invalidTlv01).toList();
-    }
-
-    /**
-     * Validate the API which places raw bytes into the TLV (without a TL structure).
-     */
-    @Test
-    public void testRawPuts() {
-        TlvBufferUtils.TlvConstructor tlv = new TlvBufferUtils.TlvConstructor(1, 1);
-
-        tlv.allocate(10);
-        tlv.putByte(0, (byte) 2);
-        tlv.putRawByte((byte) 55);
-        tlv.putByte(1, (byte) 104);
-        tlv.putRawByteArray(new byte[]{66, 77});
-
-        collector.checkThat("data", tlv.getArray(),
-                equalTo(new byte[]{0, 1, 2, 55, 1, 1, 104, 66, 77}));
-    }
-
-    @Test
-    public void testTlvIterate() {
-        final String ascii = "ABC";
-        final String nonAscii = "何かもっと複雑な";
-
-        TlvBufferUtils.TlvConstructor tlv22 = new TlvBufferUtils.TlvConstructor(2, 2);
-        tlv22.allocate(18);
-        tlv22.putInt(0, 2);
-        tlv22.putShort(2, (short) 3);
-        tlv22.putZeroLengthElement(55);
-
-        TlvBufferUtils.TlvIterable tlv22It = new TlvBufferUtils.TlvIterable(2, 2, tlv22.getArray());
-        int count = 0;
-        for (TlvBufferUtils.TlvElement tlv : tlv22It) {
-            if (count == 0) {
-                collector.checkThat("tlv22-correct-iteration-mType", tlv.type, equalTo(0));
-                collector.checkThat("tlv22-correct-iteration-mLength", tlv.length, equalTo(4));
-                collector.checkThat("tlv22-correct-iteration-DATA", tlv.getInt(), equalTo(2));
-            } else if (count == 1) {
-                collector.checkThat("tlv22-correct-iteration-mType", tlv.type, equalTo(2));
-                collector.checkThat("tlv22-correct-iteration-mLength", tlv.length, equalTo(2));
-                collector.checkThat("tlv22-correct-iteration-DATA", (int) tlv.getShort(),
-                        equalTo(3));
-            } else if (count == 2) {
-                collector.checkThat("tlv22-correct-iteration-mType", tlv.type, equalTo(55));
-                collector.checkThat("tlv22-correct-iteration-mLength", tlv.length, equalTo(0));
-            } else {
-                collector.checkThat("Invalid number of iterations in loop - tlv22", true,
-                        equalTo(false));
-            }
-            ++count;
-        }
-        if (count != 3) {
-            collector.checkThat("Invalid number of iterations outside loop - tlv22", true,
-                    equalTo(false));
-        }
-
-        TlvBufferUtils.TlvConstructor tlv02 = new TlvBufferUtils.TlvConstructor(0, 2);
-        tlv02.allocate(100);
-        tlv02.putByte(0, (byte) 2);
-        tlv02.putString(0, ascii);
-        tlv02.putString(0, nonAscii);
-        tlv02.putByteArray(0, new byte[]{5, 4, 3, 2, 1});
-
-        TlvBufferUtils.TlvIterable tlv02It = new TlvBufferUtils.TlvIterable(0, 2, tlv02.getArray());
-        count = 0;
-        for (TlvBufferUtils.TlvElement tlv : tlv02It) {
-            if (count == 0) {
-                collector.checkThat("tlv02-correct-iteration-mLength", tlv.length, equalTo(1));
-                collector.checkThat("tlv02-correct-iteration-DATA", (int) tlv.getByte(),
-                        equalTo(2));
-            } else if (count == 1) {
-                collector.checkThat("tlv02-correct-iteration-mLength", tlv.length,
-                        equalTo(ascii.length()));
-                collector.checkThat("tlv02-correct-iteration-DATA", tlv.getString().equals(ascii),
-                        equalTo(true));
-            } else if (count == 2) {
-                collector.checkThat("tlv02-correct-iteration-mLength", tlv.length,
-                        equalTo(nonAscii.getBytes().length));
-                collector.checkThat("tlv02-correct-iteration-DATA",
-                        tlv.getString().equals(nonAscii), equalTo(true));
-            } else if (count == 3) {
-                collector.checkThat("tlv02-correct-iteration-mLength", tlv.length,
-                        equalTo(5));
-                collector.checkThat("tlv02-correct-iteration-DATA", tlv.getRawData(),
-                        equalTo(new byte[]{5, 4, 3, 2, 1}));
-            } else {
-                collector.checkThat("Invalid number of iterations in loop - tlv02", true,
-                        equalTo(false));
-            }
-            ++count;
-        }
-        collector.checkThat("Invalid number of iterations outside loop - tlv02", count,
-                equalTo(4));
-
-        collector.checkThat("tlv22-valid",
-                TlvBufferUtils.isValid(tlv22.getArray(), 2, 2),
-                equalTo(true));
-        collector.checkThat("tlv02-valid",
-                TlvBufferUtils.isValid(tlv02.getArray(), 0, 2),
-                equalTo(true));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTlvInvalidSizeT1L0() {
-        TlvBufferUtils.TlvConstructor tlv10 = new TlvBufferUtils.TlvConstructor(1, 0);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTlvInvalidSizeTm3L2() {
-        TlvBufferUtils.TlvConstructor tlv10 = new TlvBufferUtils.TlvConstructor(-3, 2);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTlvInvalidSizeT1Lm2() {
-        TlvBufferUtils.TlvConstructor tlv10 = new TlvBufferUtils.TlvConstructor(1, -2);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTlvInvalidSizeT1L3() {
-        TlvBufferUtils.TlvConstructor tlv10 = new TlvBufferUtils.TlvConstructor(1, 3);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTlvInvalidSizeT3L1() {
-        TlvBufferUtils.TlvConstructor tlv10 = new TlvBufferUtils.TlvConstructor(3, 1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTlvItInvalidSizeT1L0() {
-        final byte[] testTlv = {
-                0, 1, 2 };
-        final int testLength = 3;
-        TlvBufferUtils.TlvIterable tlvIt10 = new TlvBufferUtils.TlvIterable(1, 0, testTlv);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTlvItInvalidSizeTm3L2() {
-        final byte[] testTlv = {
-                0, 1, 2 };
-        final int testLength = 3;
-        TlvBufferUtils.TlvIterable tlvIt10 = new TlvBufferUtils.TlvIterable(-3, 2, testTlv);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTlvItInvalidSizeT1Lm2() {
-        final byte[] testTlv = {
-                0, 1, 2 };
-        final int testLength = 3;
-        TlvBufferUtils.TlvIterable tlvIt10 = new TlvBufferUtils.TlvIterable(1, -2, testTlv);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTlvItInvalidSizeT1L3() {
-        final byte[] testTlv = {
-                0, 1, 2 };
-        final int testLength = 3;
-        TlvBufferUtils.TlvIterable tlvIt10 = new TlvBufferUtils.TlvIterable(1, 3, testTlv);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testTlvItInvalidSizeT3L1() {
-        final byte[] testTlv = {
-                0, 1, 2 };
-        final int testLength = 3;
-        TlvBufferUtils.TlvIterable tlvIt10 = new TlvBufferUtils.TlvIterable(3, 1, testTlv);
-    }
-
-    /**
-     * Validate that a malformed byte array fails the TLV validity test.
-     */
-    @Test
-    public void testTlvInvalidByteArray() {
-        TlvBufferUtils.TlvConstructor tlv01 = new TlvBufferUtils.TlvConstructor(0, 1);
-        tlv01.allocate(15);
-        tlv01.putByte(0, (byte) 2);
-        tlv01.putByteArray(2, new byte[]{0, 1, 2});
-
-        byte[] array = tlv01.getArray();
-        array[0] = 10;
-
-        collector.checkThat("tlv01-invalid",
-                TlvBufferUtils.isValid(array, 0, 1), equalTo(false));
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java b/wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java
deleted file mode 100644
index b65de6b..0000000
--- a/wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ErrorCollector;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Unit test harness for WifiAwareAgentNetworkSpecifier class.
- */
-@SmallTest
-public class WifiAwareAgentNetworkSpecifierTest {
-    @Rule
-    public ErrorCollector collector = new ErrorCollector();
-
-    @Test
-    public void testParcel() {
-        final int numNs = 10;
-
-        Set<WifiAwareNetworkSpecifier> nsSet = new HashSet<>();
-        for (int i = 0; i < numNs; ++i) {
-            nsSet.add(getMockNetworkSpecifier(10 + i));
-        }
-        WifiAwareAgentNetworkSpecifier dut = new WifiAwareAgentNetworkSpecifier(
-                nsSet.toArray(new WifiAwareNetworkSpecifier[numNs]));
-
-        Parcel parcelW = Parcel.obtain();
-        dut.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiAwareAgentNetworkSpecifier rereadDut =
-                WifiAwareAgentNetworkSpecifier.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(dut, rereadDut);
-        assertEquals(dut.hashCode(), rereadDut.hashCode());
-
-        // Ensure that individual network specifiers are satisfied by both the original & marshaled
-        // |WifiAwareNetworkAgentSpecifier instances.
-        for (WifiAwareNetworkSpecifier ns : nsSet) {
-            assertTrue(dut.satisfiesAwareNetworkSpecifier(ns));
-            assertTrue(rereadDut.satisfiesAwareNetworkSpecifier(ns));
-        }
-    }
-
-    /**
-     * Validate that an empty agent network specifier doesn't match any base network specifier.
-     */
-    @Test
-    public void testEmptyDoesntMatchAnything() {
-        WifiAwareAgentNetworkSpecifier dut = new WifiAwareAgentNetworkSpecifier();
-        WifiAwareNetworkSpecifier ns = getMockNetworkSpecifier(6);
-        collector.checkThat("No match expected", ns.canBeSatisfiedBy(dut), equalTo(false));
-    }
-
-    /**
-     * Validate that an agent network specifier constructed with a single entry matches that entry,
-     * and only that entry.
-     */
-    @Test
-    public void testSingleMatch() {
-        WifiAwareNetworkSpecifier nsThis = getMockNetworkSpecifier(6);
-        WifiAwareAgentNetworkSpecifier dut = new WifiAwareAgentNetworkSpecifier(nsThis);
-        WifiAwareNetworkSpecifier nsOther = getMockNetworkSpecifier(8);
-        collector.checkThat("Match expected", nsThis.canBeSatisfiedBy(dut), equalTo(true));
-        collector.checkThat("No match expected", nsOther.canBeSatisfiedBy(dut), equalTo(false));
-    }
-
-    /**
-     * Validate that an agent network specifier constructed with multiple entries matches all those
-     * entries - but none other.
-     */
-    @Test
-    public void testMultipleMatchesAllMembers() {
-        final int numNs = 10;
-
-        Set<WifiAwareNetworkSpecifier> nsSet = new HashSet<>();
-        for (int i = 0; i < numNs; ++i) {
-            nsSet.add(getMockNetworkSpecifier(10 + i));
-        }
-
-        WifiAwareAgentNetworkSpecifier dut = new WifiAwareAgentNetworkSpecifier(
-                nsSet.toArray(new WifiAwareNetworkSpecifier[numNs]));
-        WifiAwareNetworkSpecifier nsOther = getMockNetworkSpecifier(10000);
-
-        for (WifiAwareNetworkSpecifier nsThis: nsSet) {
-            collector.checkThat("Match expected", nsThis.canBeSatisfiedBy(dut), equalTo(true));
-        }
-        collector.checkThat("No match expected", nsOther.canBeSatisfiedBy(dut), equalTo(false));
-    }
-
-    /**
-     * Validate that agent network specifier matches against a super-set.
-     */
-    @Test
-    public void testMatchSuperset() {
-        final int numNs = 10;
-
-        Set<WifiAwareNetworkSpecifier> nsSet = new HashSet<>();
-        for (int i = 0; i < numNs; ++i) {
-            nsSet.add(getMockNetworkSpecifier(10 + i));
-        }
-
-        WifiAwareAgentNetworkSpecifier oldNs = new WifiAwareAgentNetworkSpecifier(
-                nsSet.toArray(new WifiAwareNetworkSpecifier[nsSet.size()]));
-
-        nsSet.add(getMockNetworkSpecifier(100 + numNs));
-        WifiAwareAgentNetworkSpecifier newNs = new WifiAwareAgentNetworkSpecifier(
-                nsSet.toArray(new WifiAwareNetworkSpecifier[nsSet.size()]));
-
-        collector.checkThat("Match expected", oldNs.canBeSatisfiedBy(newNs), equalTo(true));
-    }
-
-    /**
-     * Validate that agent network specifier does not match against a sub-set.
-     */
-    @Test
-    public void testNoMatchSubset() {
-        final int numNs = 10;
-
-        Set<WifiAwareNetworkSpecifier> nsSet = new HashSet<>();
-        for (int i = 0; i < numNs; ++i) {
-            nsSet.add(getMockNetworkSpecifier(10 + i));
-        }
-
-        WifiAwareAgentNetworkSpecifier newNs = new WifiAwareAgentNetworkSpecifier(
-                nsSet.toArray(new WifiAwareNetworkSpecifier[nsSet.size()]));
-
-        nsSet.add(getMockNetworkSpecifier(100 + numNs));
-        WifiAwareAgentNetworkSpecifier oldNs = new WifiAwareAgentNetworkSpecifier(
-                nsSet.toArray(new WifiAwareNetworkSpecifier[nsSet.size()]));
-
-        collector.checkThat("Match unexpected", oldNs.canBeSatisfiedBy(newNs), equalTo(false));
-    }
-
-    // utilities
-
-    /**
-     * Returns a WifiAwareNetworkSpecifier with mock (but valid) entries. Each can be
-     * differentiated (made unique) by specifying a different client ID.
-     */
-    WifiAwareNetworkSpecifier getMockNetworkSpecifier(int clientId) {
-        return new WifiAwareNetworkSpecifier(WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_OOB,
-                WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR, clientId, 0, 0, new byte[6],
-                null, null, 10, 5);
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
deleted file mode 100644
index 43d728b..0000000
--- a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java
+++ /dev/null
@@ -1,1639 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.aware;
-
-import static android.net.wifi.aware.WifiAwareNetworkSpecifier.NETWORK_SPECIFIER_TYPE_IB;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.isNull;
-import static org.mockito.Mockito.inOrder;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.pm.ApplicationInfo;
-import android.content.pm.PackageManager;
-import android.net.MacAddress;
-import android.net.wifi.RttManager;
-import android.net.wifi.util.HexEncoding;
-import android.os.Build;
-import android.os.Handler;
-import android.os.IBinder;
-import android.os.Parcel;
-import android.os.test.TestLooper;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ErrorCollector;
-import org.mockito.ArgumentCaptor;
-import org.mockito.InOrder;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.net.Inet6Address;
-import java.net.UnknownHostException;
-import java.util.List;
-
-/**
- * Unit test harness for WifiAwareManager class.
- */
-@SmallTest
-public class WifiAwareManagerTest {
-    private WifiAwareManager mDut;
-    private TestLooper mMockLooper;
-    private Handler mMockLooperHandler;
-
-    @Rule
-    public ErrorCollector collector = new ErrorCollector();
-
-    @Mock
-    public Context mockContext;
-
-    @Mock
-    public AttachCallback mockCallback;
-
-    @Mock
-    public DiscoverySessionCallback mockSessionCallback;
-
-    @Mock
-    public IWifiAwareManager mockAwareService;
-
-    @Mock
-    public PublishDiscoverySession mockPublishSession;
-
-    @Mock
-    public SubscribeDiscoverySession mockSubscribeSession;
-
-    @Mock
-    public RttManager.RttListener mockRttListener;
-
-    @Mock
-    public PackageManager mockPackageManager;
-
-    @Mock
-    public ApplicationInfo mockApplicationInfo;
-
-    private static final int AWARE_STATUS_ERROR = -1;
-
-    private static final byte[] PMK_VALID = "01234567890123456789012345678901".getBytes();
-    private static final byte[] PMK_INVALID = "012".getBytes();
-
-    private static final String PASSPHRASE_VALID = "SomeLongEnoughPassphrase";
-    private static final String PASSPHRASE_TOO_SHORT = "012";
-    private static final String PASSPHRASE_TOO_LONG =
-            "0123456789012345678901234567890123456789012345678901234567890123456789";
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        mockApplicationInfo.targetSdkVersion = Build.VERSION_CODES.Q;
-        when(mockPackageManager.getApplicationInfo(anyString(), anyInt())).thenReturn(
-                mockApplicationInfo);
-        when(mockContext.getOpPackageName()).thenReturn("XXX");
-        when(mockContext.getPackageManager()).thenReturn(mockPackageManager);
-
-        mDut = new WifiAwareManager(mockContext, mockAwareService);
-        mMockLooper = new TestLooper();
-        mMockLooperHandler = new Handler(mMockLooper.getLooper());
-    }
-
-    /*
-     * Straight pass-through tests
-     */
-
-    /**
-     * Validate pass-through of isUsageEnabled() API.
-     */
-    @Test
-    public void testIsUsageEnable() throws Exception {
-        mDut.isAvailable();
-
-        verify(mockAwareService).isUsageEnabled();
-    }
-
-    /**
-     * Validate pass-through of getCharacteristics() API.
-     */
-    @Test
-    public void testGetCharacteristics() throws Exception {
-        mDut.getCharacteristics();
-
-        verify(mockAwareService).getCharacteristics();
-    }
-
-    /*
-     * WifiAwareEventCallbackProxy Tests
-     */
-
-    /**
-     * Validate the successful connect flow: (1) connect + success (2) publish, (3) disconnect
-     * (4) try publishing on old session (5) connect again
-     */
-    @Test
-    public void testConnectFlow() throws Exception {
-        final int clientId = 4565;
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IBinder> binder = ArgumentCaptor.forClass(IBinder.class);
-
-        // (1) connect + success
-        mDut.attach(mockCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).connect(binder.capture(), any(), any(),
-                clientProxyCallback.capture(), isNull(), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-        WifiAwareSession session = sessionCaptor.getValue();
-
-        // (2) publish - should succeed
-        PublishConfig publishConfig = new PublishConfig.Builder().build();
-        session.publish(publishConfig, mockSessionCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).publish(any(), any(), eq(clientId), eq(publishConfig),
-                any());
-
-        // (3) disconnect
-        session.close();
-        inOrder.verify(mockAwareService).disconnect(eq(clientId), eq(binder.getValue()));
-
-        // (4) try publishing again - fails silently
-        session.publish(new PublishConfig.Builder().build(), mockSessionCallback,
-                mMockLooperHandler);
-
-        // (5) connect
-        mDut.attach(mockCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).connect(binder.capture(), any(), any(), any(), isNull(),
-                eq(false));
-
-        verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockAwareService);
-    }
-
-    /**
-     * Validate the failed connect flow: (1) connect + failure, (2) connect + success (3) subscribe
-     */
-    @Test
-    public void testConnectFailure() throws Exception {
-        final int clientId = 4565;
-        final int reason = AWARE_STATUS_ERROR;
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService);
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-
-        // (1) connect + failure
-        mDut.attach(mockCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                isNull(), eq(false));
-        clientProxyCallback.getValue().onConnectFail(reason);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttachFailed();
-
-        // (2) connect + success
-        mDut.attach(mockCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                isNull(), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-        WifiAwareSession session = sessionCaptor.getValue();
-
-        // (4) subscribe: should succeed
-        SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().build();
-        session.subscribe(subscribeConfig, mockSessionCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).subscribe(any(), any(), eq(clientId), eq(subscribeConfig),
-                any());
-
-        verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockAwareService);
-    }
-
-    /**
-     * Validate that can call connect to create multiple sessions: (1) connect
-     * + success, (2) try connect again
-     */
-    @Test
-    public void testInvalidConnectSequence() throws Exception {
-        final int clientId = 4565;
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-
-        // (1) connect + success
-        mDut.attach(mockCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                isNull(), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(any());
-
-        // (2) connect + success
-        mDut.attach(mockCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                isNull(), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId + 1);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(any());
-
-        verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockAwareService);
-    }
-
-    /*
-     * WifiAwareDiscoverySessionCallbackProxy Tests
-     */
-
-    /**
-     * Validate the publish flow: (0) connect + success, (1) publish, (2)
-     * success creates session, (3) pass through everything, (4) update publish
-     * through session, (5) terminate locally, (6) try another command -
-     * ignored.
-     */
-    @Test
-    public void testPublishFlow() throws Exception {
-        final int clientId = 4565;
-        final int sessionId = 123;
-        final ConfigRequest configRequest = new ConfigRequest.Builder().build();
-        final PublishConfig publishConfig = new PublishConfig.Builder().build();
-        final PeerHandle peerHandle = new PeerHandle(873);
-        final String string1 = "hey from here...";
-        final byte[] matchFilter = { 1, 12, 2, 31, 32 };
-        final int messageId = 2123;
-        final int reason = AWARE_STATUS_ERROR;
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession);
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-        ArgumentCaptor<IWifiAwareDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareDiscoverySessionCallback.class);
-        ArgumentCaptor<PublishDiscoverySession> publishSession = ArgumentCaptor
-                .forClass(PublishDiscoverySession.class);
-        ArgumentCaptor<PeerHandle> peerIdCaptor = ArgumentCaptor.forClass(PeerHandle.class);
-        ArgumentCaptor<List<byte[]>> matchFilterCaptor = ArgumentCaptor.forClass(
-                (Class) List.class);
-
-        // (0) connect + success
-        mDut.attach(mMockLooperHandler, configRequest, mockCallback, null);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                eq(configRequest), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-        WifiAwareSession session = sessionCaptor.getValue();
-
-        // (1) publish
-        session.publish(publishConfig, mockSessionCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).publish(any(), any(), eq(clientId), eq(publishConfig),
-                sessionProxyCallback.capture());
-
-        // (2) publish session created
-        sessionProxyCallback.getValue().onSessionStarted(sessionId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockSessionCallback).onPublishStarted(publishSession.capture());
-
-        // (3) ...
-        publishSession.getValue().sendMessage(peerHandle, messageId, string1.getBytes());
-        sessionProxyCallback.getValue().onMatch(peerHandle.peerId, string1.getBytes(), matchFilter);
-        sessionProxyCallback.getValue().onMessageReceived(peerHandle.peerId, string1.getBytes());
-        sessionProxyCallback.getValue().onMessageSendFail(messageId, reason);
-        sessionProxyCallback.getValue().onMessageSendSuccess(messageId);
-        mMockLooper.dispatchAll();
-
-        inOrder.verify(mockAwareService).sendMessage(eq(clientId), eq(sessionId),
-                eq(peerHandle.peerId), eq(string1.getBytes()), eq(messageId), eq(0));
-        inOrder.verify(mockSessionCallback).onServiceDiscovered(peerIdCaptor.capture(),
-                eq(string1.getBytes()),
-                matchFilterCaptor.capture());
-
-        // note: need to capture/compare elements since the Mockito eq() is a shallow comparator
-        List<byte[]> parsedMatchFilter = new TlvBufferUtils.TlvIterable(0, 1, matchFilter).toList();
-        collector.checkThat("match-filter-size", parsedMatchFilter.size(),
-                equalTo(matchFilterCaptor.getValue().size()));
-        collector.checkThat("match-filter-entry0", parsedMatchFilter.get(0),
-                equalTo(matchFilterCaptor.getValue().get(0)));
-        collector.checkThat("match-filter-entry1", parsedMatchFilter.get(1),
-                equalTo(matchFilterCaptor.getValue().get(1)));
-
-        assertEquals(peerIdCaptor.getValue().peerId, peerHandle.peerId);
-        inOrder.verify(mockSessionCallback).onMessageReceived(peerIdCaptor.capture(),
-                eq(string1.getBytes()));
-        assertEquals(peerIdCaptor.getValue().peerId, peerHandle.peerId);
-        inOrder.verify(mockSessionCallback).onMessageSendFailed(eq(messageId));
-        inOrder.verify(mockSessionCallback).onMessageSendSucceeded(eq(messageId));
-
-        // (4) update publish
-        publishSession.getValue().updatePublish(publishConfig);
-        sessionProxyCallback.getValue().onSessionConfigFail(reason);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockAwareService).updatePublish(eq(clientId), eq(sessionId),
-                eq(publishConfig));
-        inOrder.verify(mockSessionCallback).onSessionConfigFailed();
-
-        // (5) terminate
-        publishSession.getValue().close();
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockAwareService).terminateSession(clientId, sessionId);
-
-        // (6) try an update (nothing)
-        publishSession.getValue().updatePublish(publishConfig);
-        mMockLooper.dispatchAll();
-
-        verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession);
-    }
-
-    /**
-     * Validate race condition of session terminate and session action: (1)
-     * connect, (2) publish success + terminate, (3) update.
-     */
-    @Test
-    public void testPublishRemoteTerminate() throws Exception {
-        final int clientId = 4565;
-        final int sessionId = 123;
-        final ConfigRequest configRequest = new ConfigRequest.Builder().build();
-        final PublishConfig publishConfig = new PublishConfig.Builder().build();
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession);
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-        ArgumentCaptor<IWifiAwareDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareDiscoverySessionCallback.class);
-        ArgumentCaptor<PublishDiscoverySession> publishSession = ArgumentCaptor
-                .forClass(PublishDiscoverySession.class);
-
-        // (1) connect successfully
-        mDut.attach(mMockLooperHandler, configRequest, mockCallback, null);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                eq(configRequest), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-        WifiAwareSession session = sessionCaptor.getValue();
-
-        // (2) publish: successfully - then terminated
-        session.publish(publishConfig, mockSessionCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).publish(any(), any(), eq(clientId), eq(publishConfig),
-                sessionProxyCallback.capture());
-        sessionProxyCallback.getValue().onSessionStarted(sessionId);
-        sessionProxyCallback.getValue().onSessionTerminated(0);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockSessionCallback).onPublishStarted(publishSession.capture());
-        inOrder.verify(mockSessionCallback).onSessionTerminated();
-
-        // (3) failure when trying to update: NOP
-        publishSession.getValue().updatePublish(publishConfig);
-
-        verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession);
-    }
-
-    /**
-     * Validate the subscribe flow: (0) connect + success, (1) subscribe, (2)
-     * success creates session, (3) pass through everything, (4) update
-     * subscribe through session, (5) terminate locally, (6) try another command
-     * - ignored.
-     */
-    @Test
-    public void testSubscribeFlow() throws Exception {
-        final int clientId = 4565;
-        final int sessionId = 123;
-        final ConfigRequest configRequest = new ConfigRequest.Builder().build();
-        final SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().build();
-        final PeerHandle peerHandle = new PeerHandle(873);
-        final String string1 = "hey from here...";
-        final byte[] matchFilter = { 1, 12, 3, 31, 32 }; // bad data!
-        final int messageId = 2123;
-        final int reason = AWARE_STATUS_ERROR;
-        final int distanceMm = 100;
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService,
-                mockSubscribeSession);
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-        ArgumentCaptor<IWifiAwareDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareDiscoverySessionCallback.class);
-        ArgumentCaptor<SubscribeDiscoverySession> subscribeSession = ArgumentCaptor
-                .forClass(SubscribeDiscoverySession.class);
-        ArgumentCaptor<PeerHandle> peerIdCaptor = ArgumentCaptor.forClass(PeerHandle.class);
-
-        // (0) connect + success
-        mDut.attach(mMockLooperHandler, configRequest, mockCallback, null);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                eq(configRequest), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-        WifiAwareSession session = sessionCaptor.getValue();
-
-        // (1) subscribe
-        session.subscribe(subscribeConfig, mockSessionCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).subscribe(any(), any(), eq(clientId), eq(subscribeConfig),
-                sessionProxyCallback.capture());
-
-        // (2) subscribe session created
-        sessionProxyCallback.getValue().onSessionStarted(sessionId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockSessionCallback).onSubscribeStarted(subscribeSession.capture());
-
-        // (3) ...
-        subscribeSession.getValue().sendMessage(peerHandle, messageId, string1.getBytes());
-        sessionProxyCallback.getValue().onMatch(peerHandle.peerId, string1.getBytes(), matchFilter);
-        sessionProxyCallback.getValue().onMatchWithDistance(peerHandle.peerId, string1.getBytes(),
-                matchFilter, distanceMm);
-        sessionProxyCallback.getValue().onMessageReceived(peerHandle.peerId, string1.getBytes());
-        sessionProxyCallback.getValue().onMessageSendFail(messageId, reason);
-        sessionProxyCallback.getValue().onMessageSendSuccess(messageId);
-        mMockLooper.dispatchAll();
-
-        inOrder.verify(mockAwareService).sendMessage(eq(clientId), eq(sessionId),
-                eq(peerHandle.peerId), eq(string1.getBytes()), eq(messageId), eq(0));
-        inOrder.verify(mockSessionCallback).onServiceDiscovered(peerIdCaptor.capture(),
-                eq(string1.getBytes()), isNull());
-        inOrder.verify(mockSessionCallback).onServiceDiscoveredWithinRange(peerIdCaptor.capture(),
-                eq(string1.getBytes()), isNull(), eq(distanceMm));
-        assertEquals((peerIdCaptor.getValue()).peerId, peerHandle.peerId);
-        inOrder.verify(mockSessionCallback).onMessageReceived(peerIdCaptor.capture(),
-                eq(string1.getBytes()));
-        assertEquals((peerIdCaptor.getValue()).peerId, peerHandle.peerId);
-        inOrder.verify(mockSessionCallback).onMessageSendFailed(eq(messageId));
-        inOrder.verify(mockSessionCallback).onMessageSendSucceeded(eq(messageId));
-
-        // (4) update subscribe
-        subscribeSession.getValue().updateSubscribe(subscribeConfig);
-        sessionProxyCallback.getValue().onSessionConfigFail(reason);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockAwareService).updateSubscribe(eq(clientId), eq(sessionId),
-                eq(subscribeConfig));
-        inOrder.verify(mockSessionCallback).onSessionConfigFailed();
-
-        // (5) terminate
-        subscribeSession.getValue().close();
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockAwareService).terminateSession(clientId, sessionId);
-
-        // (6) try an update (nothing)
-        subscribeSession.getValue().updateSubscribe(subscribeConfig);
-        mMockLooper.dispatchAll();
-
-        verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockAwareService,
-                mockSubscribeSession);
-    }
-
-    /**
-     * Validate race condition of session terminate and session action: (1)
-     * connect, (2) subscribe success + terminate, (3) update.
-     */
-    @Test
-    public void testSubscribeRemoteTerminate() throws Exception {
-        final int clientId = 4565;
-        final int sessionId = 123;
-        final ConfigRequest configRequest = new ConfigRequest.Builder().build();
-        final SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().build();
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService,
-                mockSubscribeSession);
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-        ArgumentCaptor<IWifiAwareDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareDiscoverySessionCallback.class);
-        ArgumentCaptor<SubscribeDiscoverySession> subscribeSession = ArgumentCaptor
-                .forClass(SubscribeDiscoverySession.class);
-
-        // (1) connect successfully
-        mDut.attach(mMockLooperHandler, configRequest, mockCallback, null);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                eq(configRequest), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-        WifiAwareSession session = sessionCaptor.getValue();
-
-        // (2) subscribe: successfully - then terminated
-        session.subscribe(subscribeConfig, mockSessionCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).subscribe(any(), any(), eq(clientId), eq(subscribeConfig),
-                sessionProxyCallback.capture());
-        sessionProxyCallback.getValue().onSessionStarted(sessionId);
-        sessionProxyCallback.getValue().onSessionTerminated(0);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockSessionCallback).onSubscribeStarted(subscribeSession.capture());
-        inOrder.verify(mockSessionCallback).onSessionTerminated();
-
-        // (3) failure when trying to update: NOP
-        subscribeSession.getValue().updateSubscribe(subscribeConfig);
-
-        verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockAwareService,
-                mockSubscribeSession);
-    }
-
-    /*
-     * ConfigRequest Tests
-     */
-
-    @Test
-    public void testConfigRequestBuilderDefaults() {
-        ConfigRequest configRequest = new ConfigRequest.Builder().build();
-
-        collector.checkThat("mClusterHigh", ConfigRequest.CLUSTER_ID_MAX,
-                equalTo(configRequest.mClusterHigh));
-        collector.checkThat("mClusterLow", ConfigRequest.CLUSTER_ID_MIN,
-                equalTo(configRequest.mClusterLow));
-        collector.checkThat("mMasterPreference", 0,
-                equalTo(configRequest.mMasterPreference));
-        collector.checkThat("mSupport5gBand", true, equalTo(configRequest.mSupport5gBand));
-        collector.checkThat("mSupport6gBand", false, equalTo(configRequest.mSupport6gBand));
-        collector.checkThat("mDiscoveryWindowInterval.length", 3,
-                equalTo(configRequest.mDiscoveryWindowInterval.length));
-        collector.checkThat("mDiscoveryWindowInterval[2.4GHz]", ConfigRequest.DW_INTERVAL_NOT_INIT,
-                equalTo(configRequest.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_24GHZ]));
-        collector.checkThat("mDiscoveryWindowInterval[5Hz]", ConfigRequest.DW_INTERVAL_NOT_INIT,
-                equalTo(configRequest.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_5GHZ]));
-        collector.checkThat("mDiscoveryWindowInterval[6Hz]", ConfigRequest.DW_INTERVAL_NOT_INIT,
-                equalTo(configRequest.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_6GHZ]));
-    }
-
-    @Test
-    public void testConfigRequestBuilder() {
-        final int clusterHigh = 100;
-        final int clusterLow = 5;
-        final int masterPreference = 55;
-        final boolean supportBand5g = true;
-        final boolean supportBand6g = true;
-        final int dwWindow5GHz = 3;
-        final int dwWindow6GHz = 4;
-
-        ConfigRequest configRequest = new ConfigRequest.Builder().setClusterHigh(clusterHigh)
-                .setClusterLow(clusterLow).setMasterPreference(masterPreference)
-                .setSupport5gBand(supportBand5g)
-                .setSupport6gBand(supportBand6g)
-                .setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_5GHZ, dwWindow5GHz)
-                .setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_6GHZ, dwWindow6GHz)
-                .build();
-
-        collector.checkThat("mClusterHigh", clusterHigh, equalTo(configRequest.mClusterHigh));
-        collector.checkThat("mClusterLow", clusterLow, equalTo(configRequest.mClusterLow));
-        collector.checkThat("mMasterPreference", masterPreference,
-                equalTo(configRequest.mMasterPreference));
-        collector.checkThat("mSupport5gBand", supportBand5g, equalTo(configRequest.mSupport5gBand));
-        collector.checkThat("mSupport6gBand", supportBand6g, equalTo(configRequest.mSupport6gBand));
-        collector.checkThat("mDiscoveryWindowInterval.length", 3,
-                equalTo(configRequest.mDiscoveryWindowInterval.length));
-        collector.checkThat("mDiscoveryWindowInterval[2.4GHz]", ConfigRequest.DW_INTERVAL_NOT_INIT,
-                equalTo(configRequest.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_24GHZ]));
-        collector.checkThat("mDiscoveryWindowInterval[5GHz]", dwWindow5GHz,
-                equalTo(configRequest.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_5GHZ]));
-        collector.checkThat("mDiscoveryWindowInterval[6GHz]", dwWindow6GHz,
-                equalTo(configRequest.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_6GHZ]));
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderMasterPrefNegative() {
-        ConfigRequest.Builder builder = new ConfigRequest.Builder();
-        builder.setMasterPreference(-1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderMasterPrefReserved1() {
-        new ConfigRequest.Builder().setMasterPreference(1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderMasterPrefReserved255() {
-        new ConfigRequest.Builder().setMasterPreference(255);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderMasterPrefTooLarge() {
-        new ConfigRequest.Builder().setMasterPreference(256);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderClusterLowNegative() {
-        new ConfigRequest.Builder().setClusterLow(-1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderClusterHighNegative() {
-        new ConfigRequest.Builder().setClusterHigh(-1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderClusterLowAboveMax() {
-        new ConfigRequest.Builder().setClusterLow(ConfigRequest.CLUSTER_ID_MAX + 1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderClusterHighAboveMax() {
-        new ConfigRequest.Builder().setClusterHigh(ConfigRequest.CLUSTER_ID_MAX + 1);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderClusterLowLargerThanHigh() {
-        new ConfigRequest.Builder().setClusterLow(100).setClusterHigh(5).build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderDwIntervalInvalidBand() {
-        new ConfigRequest.Builder().setDiscoveryWindowInterval(5, 1).build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderDwIntervalInvalidValueZero() {
-        new ConfigRequest.Builder().setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_24GHZ,
-                0).build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderDwIntervalInvalidValueLarge() {
-        new ConfigRequest.Builder().setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_5GHZ,
-                6).build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testConfigRequestBuilderDwIntervalInvalidValueLargeValidate() {
-        ConfigRequest cr = new ConfigRequest.Builder().build();
-        cr.mDiscoveryWindowInterval[ConfigRequest.NAN_BAND_5GHZ] = 6;
-        cr.validate();
-    }
-
-    @Test
-    public void testConfigRequestParcel() {
-        final int clusterHigh = 189;
-        final int clusterLow = 25;
-        final int masterPreference = 177;
-        final boolean supportBand5g = true;
-        final boolean supportBand6g = false;
-        final int dwWindow24GHz = 1;
-        final int dwWindow5GHz = 5;
-        final int dwWindow6GHz = 4;
-
-        ConfigRequest configRequest = new ConfigRequest.Builder().setClusterHigh(clusterHigh)
-                .setClusterLow(clusterLow).setMasterPreference(masterPreference)
-                .setSupport5gBand(supportBand5g)
-                .setSupport6gBand(supportBand6g)
-                .setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_24GHZ, dwWindow24GHz)
-                .setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_5GHZ, dwWindow5GHz)
-                .setDiscoveryWindowInterval(ConfigRequest.NAN_BAND_6GHZ, dwWindow6GHz)
-                .build();
-
-        Parcel parcelW = Parcel.obtain();
-        configRequest.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        ConfigRequest rereadConfigRequest = ConfigRequest.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(configRequest, rereadConfigRequest);
-        assertEquals(configRequest.hashCode(), rereadConfigRequest.hashCode());
-    }
-
-    /*
-     * SubscribeConfig Tests
-     */
-
-    @Test
-    public void testSubscribeConfigBuilderDefaults() {
-        SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().build();
-
-        collector.checkThat("mServiceName", subscribeConfig.mServiceName, equalTo(null));
-        collector.checkThat("mServiceSpecificInfo", subscribeConfig.mServiceSpecificInfo,
-                equalTo(null));
-        collector.checkThat("mMatchFilter", subscribeConfig.mMatchFilter, equalTo(null));
-        collector.checkThat("mSubscribeType", subscribeConfig.mSubscribeType,
-                equalTo(SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE));
-        collector.checkThat("mTtlSec", subscribeConfig.mTtlSec, equalTo(0));
-        collector.checkThat("mEnableTerminateNotification",
-                subscribeConfig.mEnableTerminateNotification, equalTo(true));
-        collector.checkThat("mMinDistanceCmSet", subscribeConfig.mMinDistanceMmSet, equalTo(false));
-        collector.checkThat("mMinDistanceMm", subscribeConfig.mMinDistanceMm, equalTo(0));
-        collector.checkThat("mMaxDistanceMmSet", subscribeConfig.mMaxDistanceMmSet, equalTo(false));
-        collector.checkThat("mMaxDistanceMm", subscribeConfig.mMaxDistanceMm, equalTo(0));
-    }
-
-    @Test
-    public void testSubscribeConfigBuilder() {
-        final String serviceName = "some_service_or_other";
-        final String serviceSpecificInfo = "long arbitrary string with some info";
-        final byte[] matchFilter = { 1, 16, 1, 22 };
-        final int subscribeType = SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE;
-        final int subscribeTtl = 15;
-        final boolean enableTerminateNotification = false;
-        final int minDistance = 10;
-        final int maxDistance = 50;
-
-        SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().setServiceName(serviceName)
-                .setServiceSpecificInfo(serviceSpecificInfo.getBytes()).setMatchFilter(
-                    new TlvBufferUtils.TlvIterable(0, 1, matchFilter).toList())
-                .setSubscribeType(subscribeType)
-                .setTtlSec(subscribeTtl)
-                .setTerminateNotificationEnabled(enableTerminateNotification)
-                .setMinDistanceMm(minDistance)
-                .setMaxDistanceMm(maxDistance).build();
-
-        collector.checkThat("mServiceName", serviceName.getBytes(),
-                equalTo(subscribeConfig.mServiceName));
-        collector.checkThat("mServiceSpecificInfo",
-                serviceSpecificInfo.getBytes(), equalTo(subscribeConfig.mServiceSpecificInfo));
-        collector.checkThat("mMatchFilter", matchFilter, equalTo(subscribeConfig.mMatchFilter));
-        collector.checkThat("mSubscribeType", subscribeType,
-                equalTo(subscribeConfig.mSubscribeType));
-        collector.checkThat("mTtlSec", subscribeTtl, equalTo(subscribeConfig.mTtlSec));
-        collector.checkThat("mEnableTerminateNotification", enableTerminateNotification,
-                equalTo(subscribeConfig.mEnableTerminateNotification));
-        collector.checkThat("mMinDistanceMmSet", true, equalTo(subscribeConfig.mMinDistanceMmSet));
-        collector.checkThat("mMinDistanceMm", minDistance, equalTo(subscribeConfig.mMinDistanceMm));
-        collector.checkThat("mMaxDistanceMmSet", true, equalTo(subscribeConfig.mMaxDistanceMmSet));
-        collector.checkThat("mMaxDistanceMm", maxDistance, equalTo(subscribeConfig.mMaxDistanceMm));
-    }
-
-    @Test
-    public void testSubscribeConfigParcel() {
-        final String serviceName = "some_service_or_other";
-        final String serviceSpecificInfo = "long arbitrary string with some info";
-        final byte[] matchFilter = { 1, 16, 1, 22 };
-        final int subscribeType = SubscribeConfig.SUBSCRIBE_TYPE_PASSIVE;
-        final int subscribeTtl = 15;
-        final boolean enableTerminateNotification = true;
-        final int minDistance = 10;
-        final int maxDistance = 50;
-
-        SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().setServiceName(serviceName)
-                .setServiceSpecificInfo(serviceSpecificInfo.getBytes()).setMatchFilter(
-                        new TlvBufferUtils.TlvIterable(0, 1, matchFilter).toList())
-                .setSubscribeType(subscribeType)
-                .setTtlSec(subscribeTtl)
-                .setTerminateNotificationEnabled(enableTerminateNotification)
-                .setMinDistanceMm(minDistance)
-                .setMaxDistanceMm(maxDistance).build();
-
-        Parcel parcelW = Parcel.obtain();
-        subscribeConfig.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        SubscribeConfig rereadSubscribeConfig = SubscribeConfig.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(subscribeConfig, rereadSubscribeConfig);
-        assertEquals(subscribeConfig.hashCode(), rereadSubscribeConfig.hashCode());
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testSubscribeConfigBuilderBadSubscribeType() {
-        new SubscribeConfig.Builder().setSubscribeType(10);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testSubscribeConfigBuilderNegativeTtl() {
-        new SubscribeConfig.Builder().setTtlSec(-100);
-    }
-
-    /*
-     * PublishConfig Tests
-     */
-
-    @Test
-    public void testPublishConfigBuilderDefaults() {
-        PublishConfig publishConfig = new PublishConfig.Builder().build();
-
-        collector.checkThat("mServiceName", publishConfig.mServiceName, equalTo(null));
-        collector.checkThat("mServiceSpecificInfo", publishConfig.mServiceSpecificInfo,
-                equalTo(null));
-        collector.checkThat("mMatchFilter", publishConfig.mMatchFilter, equalTo(null));
-        collector.checkThat("mPublishType", publishConfig.mPublishType,
-                equalTo(PublishConfig.PUBLISH_TYPE_UNSOLICITED));
-        collector.checkThat("mTtlSec", publishConfig.mTtlSec, equalTo(0));
-        collector.checkThat("mEnableTerminateNotification",
-                publishConfig.mEnableTerminateNotification, equalTo(true));
-        collector.checkThat("mEnableRanging", publishConfig.mEnableRanging, equalTo(false));
-    }
-
-    @Test
-    public void testPublishConfigBuilder() {
-        final String serviceName = "some_service_or_other";
-        final String serviceSpecificInfo = "long arbitrary string with some info";
-        final byte[] matchFilter = { 1, 16, 1, 22 };
-        final int publishType = PublishConfig.PUBLISH_TYPE_SOLICITED;
-        final int publishTtl = 15;
-        final boolean enableTerminateNotification = false;
-        final boolean enableRanging = true;
-
-        PublishConfig publishConfig = new PublishConfig.Builder().setServiceName(serviceName)
-                .setServiceSpecificInfo(serviceSpecificInfo.getBytes()).setMatchFilter(
-                        new TlvBufferUtils.TlvIterable(0, 1, matchFilter).toList())
-                .setPublishType(publishType)
-                .setTtlSec(publishTtl)
-                .setTerminateNotificationEnabled(enableTerminateNotification)
-                .setRangingEnabled(enableRanging).build();
-
-        collector.checkThat("mServiceName", serviceName.getBytes(),
-                equalTo(publishConfig.mServiceName));
-        collector.checkThat("mServiceSpecificInfo",
-                serviceSpecificInfo.getBytes(), equalTo(publishConfig.mServiceSpecificInfo));
-        collector.checkThat("mMatchFilter", matchFilter, equalTo(publishConfig.mMatchFilter));
-        collector.checkThat("mPublishType", publishType, equalTo(publishConfig.mPublishType));
-        collector.checkThat("mTtlSec", publishTtl, equalTo(publishConfig.mTtlSec));
-        collector.checkThat("mEnableTerminateNotification", enableTerminateNotification,
-                equalTo(publishConfig.mEnableTerminateNotification));
-        collector.checkThat("mEnableRanging", enableRanging, equalTo(publishConfig.mEnableRanging));
-    }
-
-    @Test
-    public void testPublishConfigParcel() {
-        final String serviceName = "some_service_or_other";
-        final String serviceSpecificInfo = "long arbitrary string with some info";
-        final byte[] matchFilter = { 1, 16, 1, 22 };
-        final int publishType = PublishConfig.PUBLISH_TYPE_SOLICITED;
-        final int publishTtl = 15;
-        final boolean enableTerminateNotification = false;
-        final boolean enableRanging = true;
-
-        PublishConfig publishConfig = new PublishConfig.Builder().setServiceName(serviceName)
-                .setServiceSpecificInfo(serviceSpecificInfo.getBytes()).setMatchFilter(
-                        new TlvBufferUtils.TlvIterable(0, 1, matchFilter).toList())
-                .setPublishType(publishType)
-                .setTtlSec(publishTtl)
-                .setTerminateNotificationEnabled(enableTerminateNotification)
-                .setRangingEnabled(enableRanging).build();
-
-        Parcel parcelW = Parcel.obtain();
-        publishConfig.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        PublishConfig rereadPublishConfig = PublishConfig.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(publishConfig, rereadPublishConfig);
-        assertEquals(publishConfig.hashCode(), rereadPublishConfig.hashCode());
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testPublishConfigBuilderBadPublishType() {
-        new PublishConfig.Builder().setPublishType(5);
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void testPublishConfigBuilderNegativeTtl() {
-        new PublishConfig.Builder().setTtlSec(-10);
-    }
-
-    /*
-     * Data-path tests
-     */
-
-    /**
-     * Validate that correct network specifier is generated for client-based data-path.
-     */
-    @Test
-    public void testNetworkSpecifierWithClient() throws Exception {
-        final int clientId = 4565;
-        final int sessionId = 123;
-        final PeerHandle peerHandle = new PeerHandle(123412);
-        final byte[] pmk = PMK_VALID;
-        final String passphrase = PASSPHRASE_VALID;
-        final int port = 5;
-        final int transportProtocol = 10;
-        final ConfigRequest configRequest = new ConfigRequest.Builder().build();
-        final PublishConfig publishConfig = new PublishConfig.Builder().build();
-
-        mockApplicationInfo.targetSdkVersion = Build.VERSION_CODES.P;
-
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-        ArgumentCaptor<IWifiAwareDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareDiscoverySessionCallback.class);
-        ArgumentCaptor<PublishDiscoverySession> publishSession = ArgumentCaptor
-                .forClass(PublishDiscoverySession.class);
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession, mockRttListener);
-
-        // (1) connect successfully
-        mDut.attach(mMockLooperHandler, configRequest, mockCallback, null);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                eq(configRequest), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-        WifiAwareSession session = sessionCaptor.getValue();
-
-        // (2) publish successfully
-        session.publish(publishConfig, mockSessionCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).publish(any(), any(), eq(clientId), eq(publishConfig),
-                sessionProxyCallback.capture());
-        sessionProxyCallback.getValue().onSessionStarted(sessionId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockSessionCallback).onPublishStarted(publishSession.capture());
-
-        // (3) request an open (unencrypted) network specifier from the session
-        WifiAwareNetworkSpecifier ns =
-                (WifiAwareNetworkSpecifier) publishSession.getValue().createNetworkSpecifierOpen(
-                        peerHandle);
-        WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(
-                publishSession.getValue(), peerHandle).build();
-
-        // validate format
-        collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
-                equalTo(ns.role));
-        collector.checkThat("client_id", clientId, equalTo(ns.clientId));
-        collector.checkThat("session_id", sessionId, equalTo(ns.sessionId));
-        collector.checkThat("peer_id", peerHandle.peerId, equalTo(ns.peerId));
-
-        collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
-                equalTo(nsb.role));
-        collector.checkThat("client_id", clientId, equalTo(nsb.clientId));
-        collector.checkThat("session_id", sessionId, equalTo(nsb.sessionId));
-        collector.checkThat("peer_id", peerHandle.peerId, equalTo(nsb.peerId));
-        collector.checkThat("port", 0, equalTo(nsb.port));
-        collector.checkThat("transportProtocol", -1, equalTo(nsb.transportProtocol));
-
-        // (4) request an encrypted (PMK) network specifier from the session
-        ns = (WifiAwareNetworkSpecifier) publishSession.getValue().createNetworkSpecifierPmk(
-                peerHandle, pmk);
-        nsb = new WifiAwareNetworkSpecifier.Builder(publishSession.getValue(), peerHandle).setPmk(
-                pmk).setPort(port).setTransportProtocol(transportProtocol).build();
-
-        // validate format
-        collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
-                equalTo(ns.role));
-        collector.checkThat("client_id", clientId, equalTo(ns.clientId));
-        collector.checkThat("session_id", sessionId, equalTo(ns.sessionId));
-        collector.checkThat("peer_id", peerHandle.peerId, equalTo(ns.peerId));
-        collector.checkThat("pmk", pmk , equalTo(ns.pmk));
-
-        collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
-                equalTo(nsb.role));
-        collector.checkThat("client_id", clientId, equalTo(nsb.clientId));
-        collector.checkThat("session_id", sessionId, equalTo(nsb.sessionId));
-        collector.checkThat("peer_id", peerHandle.peerId, equalTo(nsb.peerId));
-        collector.checkThat("pmk", pmk , equalTo(nsb.pmk));
-        collector.checkThat("port", port, equalTo(nsb.port));
-        collector.checkThat("transportProtocol", transportProtocol, equalTo(nsb.transportProtocol));
-
-        // (5) request an encrypted (Passphrase) network specifier from the session
-        ns =
-                (WifiAwareNetworkSpecifier) publishSession.getValue()
-                        .createNetworkSpecifierPassphrase(
-                        peerHandle, passphrase);
-        nsb = new WifiAwareNetworkSpecifier.Builder(publishSession.getValue(),
-                peerHandle).setPskPassphrase(passphrase).setPort(port).setTransportProtocol(
-                transportProtocol).build();
-
-        // validate format
-        collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
-                equalTo(ns.role));
-        collector.checkThat("client_id", clientId, equalTo(ns.clientId));
-        collector.checkThat("session_id", sessionId, equalTo(ns.sessionId));
-        collector.checkThat("peer_id", peerHandle.peerId, equalTo(ns.peerId));
-        collector.checkThat("passphrase", passphrase, equalTo(ns.passphrase));
-
-        collector.checkThat("role", WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER,
-                equalTo(nsb.role));
-        collector.checkThat("client_id", clientId, equalTo(nsb.clientId));
-        collector.checkThat("session_id", sessionId, equalTo(nsb.sessionId));
-        collector.checkThat("peer_id", peerHandle.peerId, equalTo(nsb.peerId));
-        collector.checkThat("passphrase", passphrase, equalTo(nsb.passphrase));
-        collector.checkThat("port", port, equalTo(nsb.port));
-        collector.checkThat("transportProtocol", transportProtocol, equalTo(nsb.transportProtocol));
-
-        verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession, mockRttListener);
-    }
-
-    /**
-     * Validate that correct network specifier is generated for a direct data-path (i.e.
-     * specifying MAC address as opposed to a client-based oqaque specification).
-     */
-    @Test
-    public void testNetworkSpecifierDirect() throws Exception {
-        final int clientId = 134;
-        final ConfigRequest configRequest = new ConfigRequest.Builder().build();
-        final byte[] someMac = HexEncoding.decode("000102030405".toCharArray(), false);
-        final int role = WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR;
-        final byte[] pmk = PMK_VALID;
-        final String passphrase = PASSPHRASE_VALID;
-
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession, mockRttListener);
-
-        // (1) connect successfully
-        mDut.attach(mMockLooperHandler, configRequest, mockCallback, null);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                eq(configRequest), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-        WifiAwareSession session = sessionCaptor.getValue();
-
-        // (2) request an open (unencrypted) direct network specifier
-        WifiAwareNetworkSpecifier ns =
-                (WifiAwareNetworkSpecifier) session.createNetworkSpecifierOpen(role, someMac);
-
-        // validate format
-        collector.checkThat("role", role, equalTo(ns.role));
-        collector.checkThat("client_id", clientId, equalTo(ns.clientId));
-        collector.checkThat("peer_mac", someMac, equalTo(ns.peerMac));
-
-        // (3) request an encrypted (PMK) direct network specifier
-        ns = (WifiAwareNetworkSpecifier) session.createNetworkSpecifierPmk(role, someMac, pmk);
-
-        // validate format
-        collector.checkThat("role", role, equalTo(ns.role));
-        collector.checkThat("client_id", clientId, equalTo(ns.clientId));
-        collector.checkThat("peer_mac", someMac, equalTo(ns.peerMac));
-        collector.checkThat("pmk", pmk, equalTo(ns.pmk));
-
-        // (4) request an encrypted (Passphrase) direct network specifier
-        ns = (WifiAwareNetworkSpecifier) session.createNetworkSpecifierPassphrase(role, someMac,
-                passphrase);
-
-        // validate format
-        collector.checkThat("role", role, equalTo(ns.role));
-        collector.checkThat("client_id", clientId, equalTo(ns.clientId));
-        collector.checkThat("peer_mac", someMac, equalTo(ns.peerMac));
-        collector.checkThat("passphrase", passphrase, equalTo(ns.passphrase));
-
-        verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession, mockRttListener);
-    }
-
-    /**
-     * Validate that a null PMK triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientNullPmk() throws Exception {
-        executeNetworkSpecifierWithClient(new PeerHandle(123412), true, null, null, false);
-    }
-
-    /**
-     * Validate that a non-32-bytes PMK triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientIncorrectLengthPmk() throws Exception {
-        executeNetworkSpecifierWithClient(new PeerHandle(123412), true, PMK_INVALID, null, false);
-    }
-
-    /**
-     * Validate that a null Passphrase triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientNullPassphrase() throws Exception {
-        executeNetworkSpecifierWithClient(new PeerHandle(123412), false, null, null, false);
-    }
-
-    /**
-     * Validate that a too short Passphrase triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientTooShortPassphrase() throws Exception {
-        executeNetworkSpecifierWithClient(new PeerHandle(123412), false, null,
-                PASSPHRASE_TOO_SHORT, false);
-    }
-
-    /**
-     * Validate that a too long Passphrase triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientTooLongPassphrase() throws Exception {
-        executeNetworkSpecifierWithClient(new PeerHandle(123412), false, null, PASSPHRASE_TOO_LONG,
-                false);
-    }
-
-    /**
-     * Validate that a null PeerHandle triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientNullPeer() throws Exception {
-        mockApplicationInfo.targetSdkVersion = Build.VERSION_CODES.P;
-        executeNetworkSpecifierWithClient(null, false, null, PASSPHRASE_VALID, false);
-    }
-
-    /**
-     * Validate that a null PeerHandle does not trigger an exception for legacy API.
-     */
-    @Test
-    public void testNetworkSpecifierWithClientNullPeerLegacyApi() throws Exception {
-        mockApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
-        executeNetworkSpecifierWithClient(null, false, null, PASSPHRASE_VALID, false);
-    }
-
-    /**
-     * Validate that a null PMK triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientNullPmkBuilder() throws Exception {
-        executeNetworkSpecifierWithClient(new PeerHandle(123412), true, null, null, true);
-    }
-
-    /**
-     * Validate that a non-32-bytes PMK triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientIncorrectLengthPmkBuilder() throws Exception {
-        executeNetworkSpecifierWithClient(new PeerHandle(123412), true, PMK_INVALID, null, true);
-    }
-
-    /**
-     * Validate that a null Passphrase triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientNullPassphraseBuilder() throws Exception {
-        executeNetworkSpecifierWithClient(new PeerHandle(123412), false, null, null, true);
-    }
-
-    /**
-     * Validate that a too short Passphrase triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientTooShortPassphraseBuilder() throws Exception {
-        executeNetworkSpecifierWithClient(new PeerHandle(123412), false, null,
-                PASSPHRASE_TOO_SHORT, true);
-    }
-
-    /**
-     * Validate that a too long Passphrase triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientTooLongPassphraseBuilder() throws Exception {
-        executeNetworkSpecifierWithClient(new PeerHandle(123412), false, null, PASSPHRASE_TOO_LONG,
-                true);
-    }
-
-    /**
-     * Validate that a null PeerHandle triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierWithClientNullPeerBuilder() throws Exception {
-        executeNetworkSpecifierWithClient(null, false, null, PASSPHRASE_VALID, true);
-    }
-
-    /**
-     * Validate that a null PeerHandle does not trigger an exception for legacy API.
-     */
-    @Test
-    public void testNetworkSpecifierWithClientNullPeerLegacyApiBuilder() throws Exception {
-        mockApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
-        executeNetworkSpecifierWithClient(null, false, null, PASSPHRASE_VALID, false);
-    }
-
-    @Test(expected = UnsupportedOperationException.class)
-    public void testNetworkSpecifierDeprecatedOnNewApi() throws Exception {
-        executeNetworkSpecifierWithClient(null, false, null, PASSPHRASE_VALID, false);
-    }
-
-    private void executeNetworkSpecifierWithClient(PeerHandle peerHandle, boolean doPmk, byte[] pmk,
-            String passphrase, boolean useBuilder) throws Exception {
-        final int clientId = 4565;
-        final int sessionId = 123;
-        final ConfigRequest configRequest = new ConfigRequest.Builder().build();
-        final PublishConfig publishConfig = new PublishConfig.Builder().build();
-
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-        ArgumentCaptor<IWifiAwareDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareDiscoverySessionCallback.class);
-        ArgumentCaptor<PublishDiscoverySession> publishSession = ArgumentCaptor
-                .forClass(PublishDiscoverySession.class);
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession, mockRttListener);
-
-        // (1) connect successfully
-        mDut.attach(mMockLooperHandler, configRequest, mockCallback, null);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                eq(configRequest), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-        WifiAwareSession session = sessionCaptor.getValue();
-
-        // (2) publish successfully
-        session.publish(publishConfig, mockSessionCallback, mMockLooperHandler);
-        inOrder.verify(mockAwareService).publish(any(), any(), eq(clientId), eq(publishConfig),
-                sessionProxyCallback.capture());
-        sessionProxyCallback.getValue().onSessionStarted(sessionId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockSessionCallback).onPublishStarted(publishSession.capture());
-
-        // (3) create network specifier
-        if (doPmk) {
-            if (useBuilder) {
-                new WifiAwareNetworkSpecifier.Builder(publishSession.getValue(), peerHandle).setPmk(
-                        pmk).build();
-            } else {
-                publishSession.getValue().createNetworkSpecifierPmk(peerHandle, pmk);
-            }
-        } else {
-            if (useBuilder) {
-                new WifiAwareNetworkSpecifier.Builder(publishSession.getValue(),
-                        peerHandle).setPskPassphrase(passphrase).build();
-            } else {
-                publishSession.getValue().createNetworkSpecifierPassphrase(peerHandle, passphrase);
-            }
-        }
-    }
-
-    /**
-     * Validate that a null PMK triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierDirectNullPmk() throws Exception {
-        executeNetworkSpecifierDirect(HexEncoding.decode("000102030405".toCharArray(), false), true,
-                null, null, true);
-    }
-
-    /**
-     * Validate that a non-32-bytes PMK triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierDirectIncorrectLengthPmk() throws Exception {
-        executeNetworkSpecifierDirect(HexEncoding.decode("000102030405".toCharArray(), false), true,
-                PMK_INVALID, null, true);
-    }
-
-    /**
-     * Validate that a null Passphrase triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierDirectNullPassphrase() throws Exception {
-        executeNetworkSpecifierDirect(HexEncoding.decode("000102030405".toCharArray(), false),
-                false, null, null, true);
-    }
-
-    /**
-     * Validate that a too short Passphrase triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierDirectTooShortPassphrase() throws Exception {
-        executeNetworkSpecifierDirect(HexEncoding.decode("000102030405".toCharArray(), false),
-                false, null, PASSPHRASE_TOO_SHORT, true);
-    }
-
-    /**
-     * Validate that a too long Passphrase triggers an exception.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierDirectTooLongPassphrase() throws Exception {
-        executeNetworkSpecifierDirect(HexEncoding.decode("000102030405".toCharArray(), false),
-                false, null, PASSPHRASE_TOO_LONG, true);
-    }
-
-    /**
-     * Validate that a null peer MAC triggers an exception for an Initiator.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierDirectNullPeerInitiator() throws Exception {
-        executeNetworkSpecifierDirect(null, false, null, PASSPHRASE_VALID, true);
-    }
-
-    /**
-     * Validate that a null peer MAC triggers an exception for a Resonder.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierDirectNullPeerResponder() throws Exception {
-        executeNetworkSpecifierDirect(null, false, null, PASSPHRASE_VALID, false);
-    }
-
-    /**
-     * Validate that a null peer MAC does not trigger an exception for a Resonder on legacy API.
-     */
-    @Test
-    public void testNetworkSpecifierDirectNullPeerResponderLegacyApi() throws Exception {
-        mockApplicationInfo.targetSdkVersion = Build.VERSION_CODES.O;
-        executeNetworkSpecifierDirect(null, false, null, PASSPHRASE_VALID, false);
-    }
-
-    /**
-     * Validate that get an exception when creating a network specifier with an invalid port number
-     * (<=0).
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testNetworkSpecifierBuilderInvalidPortNumber() throws Exception {
-        final PeerHandle peerHandle = new PeerHandle(123412);
-        final byte[] pmk = PMK_VALID;
-        final int port = 0;
-
-        DiscoverySession publishSession = executeSessionStartup(true);
-
-        WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession,
-                peerHandle).setPmk(pmk).setPort(port).build();
-    }
-
-    /**
-     * Validate that get an exception when creating a network specifier with port information
-     * without also requesting a secure link.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testNetworkSpecifierBuilderInvalidPortOnInsecure() throws Exception {
-        final PeerHandle peerHandle = new PeerHandle(123412);
-        final int port = 5;
-
-        DiscoverySession publishSession = executeSessionStartup(true);
-
-        WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession,
-                peerHandle).setPort(port).build();
-    }
-
-    /**
-     * Validate that get an exception when creating a network specifier with port information on
-     * a responder.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testNetworkSpecifierBuilderInvalidPortOnResponder() throws Exception {
-        final PeerHandle peerHandle = new PeerHandle(123412);
-        final int port = 5;
-
-        DiscoverySession subscribeSession = executeSessionStartup(false);
-
-        WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(subscribeSession,
-                peerHandle).setPort(port).build();
-    }
-
-    /**
-     * Validate that get an exception when creating a network specifier with an invalid transport
-     * protocol number (not in [0, 255]).
-     */
-    @Test
-    public void testNetworkSpecifierBuilderInvalidTransportProtocolNumber() throws Exception {
-        final PeerHandle peerHandle = new PeerHandle(123412);
-        final byte[] pmk = PMK_VALID;
-        final int tpNegative = -1;
-        final int tpTooLarge = 256;
-        final int tpSmallest = 0;
-        final int tpLargest = 255;
-
-        DiscoverySession publishSession = executeSessionStartup(true);
-
-        try {
-            WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession,
-                    peerHandle).setPmk(pmk).setTransportProtocol(tpNegative).build();
-            assertTrue("No exception on negative transport protocol!", false);
-        } catch (IllegalArgumentException e) {
-            // nop - exception is correct!
-        }
-        try {
-            WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession,
-                    peerHandle).setPmk(pmk).setTransportProtocol(tpTooLarge).build();
-            assertTrue("No exception on >255 transport protocol!", false);
-        } catch (IllegalArgumentException e) {
-            // nop - exception is correct!
-        }
-        WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession,
-                peerHandle).setPmk(pmk).setTransportProtocol(tpSmallest).build();
-        nsb = new WifiAwareNetworkSpecifier.Builder(publishSession, peerHandle).setPmk(
-                pmk).setTransportProtocol(tpLargest).build();
-    }
-
-    /**
-     * Validate that get an exception when creating a network specifier with transport protocol
-     * information without also requesting a secure link.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testNetworkSpecifierBuilderInvalidTransportProtocolOnInsecure() throws Exception {
-        final PeerHandle peerHandle = new PeerHandle(123412);
-        final int transportProtocol = 5;
-
-        DiscoverySession publishSession = executeSessionStartup(true);
-
-        WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(publishSession,
-                peerHandle).setTransportProtocol(transportProtocol).build();
-    }
-
-    /**
-     * Validate that get an exception when creating a network specifier with transport protocol
-     * information on a responder.
-     */
-    @Test(expected = IllegalStateException.class)
-    public void testNetworkSpecifierBuilderInvalidTransportProtocolOnResponder() throws Exception {
-        final PeerHandle peerHandle = new PeerHandle(123412);
-        final int transportProtocol = 5;
-
-        DiscoverySession subscribeSession = executeSessionStartup(false);
-
-        WifiAwareNetworkSpecifier nsb = new WifiAwareNetworkSpecifier.Builder(subscribeSession,
-                peerHandle).setTransportProtocol(transportProtocol).build();
-    }
-
-    /*
-     * Utilities
-     */
-
-    private void executeNetworkSpecifierDirect(byte[] someMac, boolean doPmk, byte[] pmk,
-            String passphrase, boolean doInitiator) throws Exception {
-        final int clientId = 134;
-        final int role = doInitiator ? WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_INITIATOR
-                : WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER;
-        final ConfigRequest configRequest = new ConfigRequest.Builder().build();
-
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession, mockRttListener);
-
-        // (1) connect successfully
-        mDut.attach(mMockLooperHandler, configRequest, mockCallback, null);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                eq(configRequest), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-
-        // (2) create network specifier
-        if (doPmk) {
-            sessionCaptor.getValue().createNetworkSpecifierPmk(role, someMac, pmk);
-        } else {
-            sessionCaptor.getValue().createNetworkSpecifierPassphrase(role, someMac, passphrase);
-        }
-    }
-
-    private DiscoverySession executeSessionStartup(boolean isPublish) throws Exception {
-        final int clientId = 4565;
-        final int sessionId = 123;
-        final PeerHandle peerHandle = new PeerHandle(123412);
-        final int port = 5;
-        final ConfigRequest configRequest = new ConfigRequest.Builder().build();
-        final SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().build();
-        final PublishConfig publishConfig = new PublishConfig.Builder().build();
-
-        ArgumentCaptor<WifiAwareSession> sessionCaptor = ArgumentCaptor.forClass(
-                WifiAwareSession.class);
-        ArgumentCaptor<IWifiAwareEventCallback> clientProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareEventCallback.class);
-        ArgumentCaptor<IWifiAwareDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
-                .forClass(IWifiAwareDiscoverySessionCallback.class);
-        ArgumentCaptor<PublishDiscoverySession> publishSession = ArgumentCaptor
-                .forClass(PublishDiscoverySession.class);
-        ArgumentCaptor<SubscribeDiscoverySession> subscribeSession = ArgumentCaptor
-                .forClass(SubscribeDiscoverySession.class);
-
-
-        InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockAwareService,
-                mockPublishSession, mockRttListener);
-
-        // (1) connect successfully
-        mDut.attach(mMockLooperHandler, configRequest, mockCallback, null);
-        inOrder.verify(mockAwareService).connect(any(), any(), any(), clientProxyCallback.capture(),
-                eq(configRequest), eq(false));
-        clientProxyCallback.getValue().onConnectSuccess(clientId);
-        mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onAttached(sessionCaptor.capture());
-        WifiAwareSession session = sessionCaptor.getValue();
-
-        if (isPublish) {
-            // (2) publish successfully
-            session.publish(publishConfig, mockSessionCallback, mMockLooperHandler);
-            inOrder.verify(mockAwareService).publish(any(), any(), eq(clientId), eq(publishConfig),
-                    sessionProxyCallback.capture());
-            sessionProxyCallback.getValue().onSessionStarted(sessionId);
-            mMockLooper.dispatchAll();
-            inOrder.verify(mockSessionCallback).onPublishStarted(publishSession.capture());
-            return publishSession.getValue();
-        } else {
-            // (2) subscribe successfully
-            session.subscribe(subscribeConfig, mockSessionCallback, mMockLooperHandler);
-            inOrder.verify(mockAwareService).subscribe(any(), any(), eq(clientId),
-                    eq(subscribeConfig), sessionProxyCallback.capture());
-            sessionProxyCallback.getValue().onSessionStarted(sessionId);
-            mMockLooper.dispatchAll();
-            inOrder.verify(mockSessionCallback).onSubscribeStarted(subscribeSession.capture());
-            return subscribeSession.getValue();
-        }
-    }
-
-    // WifiAwareNetworkSpecifier && WifiAwareNetworkInfo tests
-
-    @Test
-    public void testWifiAwareNetworkSpecifierParcel() {
-        WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier(NETWORK_SPECIFIER_TYPE_IB,
-                WifiAwareManager.WIFI_AWARE_DATA_PATH_ROLE_RESPONDER, 5, 568, 334,
-                HexEncoding.decode("000102030405".toCharArray(), false),
-                "01234567890123456789012345678901".getBytes(), "blah blah", 666, 4);
-
-        Parcel parcelW = Parcel.obtain();
-        ns.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiAwareNetworkSpecifier rereadNs =
-                WifiAwareNetworkSpecifier.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(ns, rereadNs);
-        assertEquals(ns.hashCode(), rereadNs.hashCode());
-    }
-
-    @Test
-    public void testWifiAwareNetworkCapabilitiesParcel() throws UnknownHostException {
-        final Inet6Address inet6 = MacAddress.fromString(
-                "11:22:33:44:55:66").getLinkLocalIpv6FromEui48Mac();
-        // note: placeholder scope = 5
-        final Inet6Address inet6Scoped = Inet6Address.getByAddress(null, inet6.getAddress(), 5);
-        final int port = 5;
-        final int transportProtocol = 6;
-
-        assertEquals(inet6Scoped.toString(), "/fe80::1322:33ff:fe44:5566%5");
-        WifiAwareNetworkInfo cap = new WifiAwareNetworkInfo(inet6Scoped, port, transportProtocol);
-
-        Parcel parcelW = Parcel.obtain();
-        cap.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiAwareNetworkInfo rereadCap =
-                WifiAwareNetworkInfo.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(cap.getPeerIpv6Addr().toString(), "/fe80::1322:33ff:fe44:5566%5");
-        assertEquals(cap, rereadCap);
-        assertEquals(cap.hashCode(), rereadCap.hashCode());
-    }
-
-    // ParcelablePeerHandle tests
-
-    /**
-     * Verify parceling of ParcelablePeerHandle and interoperability with PeerHandle.
-     */
-    @Test
-    public void testParcelablePeerHandleParcel() {
-        final PeerHandle peerHandle = new PeerHandle(5);
-        final ParcelablePeerHandle parcelablePeerHandle = new ParcelablePeerHandle(peerHandle);
-
-        Parcel parcelW = Parcel.obtain();
-        parcelablePeerHandle.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        ParcelablePeerHandle rereadParcelablePeerHandle =
-                ParcelablePeerHandle.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(peerHandle, rereadParcelablePeerHandle);
-        assertEquals(peerHandle.hashCode(), rereadParcelablePeerHandle.hashCode());
-        assertEquals(parcelablePeerHandle, rereadParcelablePeerHandle);
-        assertEquals(parcelablePeerHandle.hashCode(), rereadParcelablePeerHandle.hashCode());
-
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/ConfigParserTest.java b/wifi/tests/src/android/net/wifi/hotspot2/ConfigParserTest.java
deleted file mode 100644
index 439e672..0000000
--- a/wifi/tests/src/android/net/wifi/hotspot2/ConfigParserTest.java
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi.hotspot2;
-
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import android.net.wifi.FakeKeys;
-import android.net.wifi.hotspot2.pps.Credential;
-import android.net.wifi.hotspot2.pps.HomeSp;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.Arrays;
-
-/**
- * Unit tests for {@link android.net.wifi.hotspot2.ConfigParser}.
- */
-@SmallTest
-public class ConfigParserTest {
-    /**
-     * Hotspot 2.0 Release 1 installation file that contains a Passpoint profile and a
-     * CA (Certificate Authority) X.509 certificate {@link FakeKeys#CA_CERT0}.
-     */
-    private static final String PASSPOINT_INSTALLATION_FILE_WITH_CA_CERT =
-            "assets/hsr1/HSR1ProfileWithCACert.base64";
-    private static final String PASSPOINT_INSTALLATION_FILE_WITH_UNENCODED_DATA =
-            "assets/hsr1/HSR1ProfileWithCACert.conf";
-    private static final String PASSPOINT_INSTALLATION_FILE_WITH_INVALID_PART =
-            "assets/hsr1/HSR1ProfileWithNonBase64Part.base64";
-    private static final String PASSPOINT_INSTALLATION_FILE_WITH_MISSING_BOUNDARY =
-            "assets/hsr1/HSR1ProfileWithMissingBoundary.base64";
-    private static final String PASSPOINT_INSTALLATION_FILE_WITH_INVALID_CONTENT_TYPE =
-            "assets/hsr1/HSR1ProfileWithInvalidContentType.base64";
-    private static final String PASSPOINT_INSTALLATION_FILE_WITHOUT_PROFILE =
-            "assets/hsr1/HSR1ProfileWithoutProfile.base64";
-    private static final String PASSPOINT_INSTALLATION_FILE_WITH_UPDATE_ID =
-            "assets/hsr1/HSR1ProfileWithUpdateIdentifier.base64";
-
-    /**
-     * Read the content of the given resource file into a String.
-     *
-     * @param filename String name of the file
-     * @return String
-     * @throws IOException
-     */
-    private String loadResourceFile(String filename) throws IOException {
-        InputStream in = getClass().getClassLoader().getResourceAsStream(filename);
-        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
-        StringBuilder builder = new StringBuilder();
-        String line;
-        while ((line = reader.readLine()) != null) {
-            builder.append(line).append("\n");
-        }
-
-        return builder.toString();
-    }
-
-    /**
-     * Generate a {@link PasspointConfiguration} that matches the configuration specified in the
-     * XML file {@link #PASSPOINT_INSTALLATION_FILE_WITH_CA_CERT}.
-     *
-     * @return {@link PasspointConfiguration}
-     */
-    private PasspointConfiguration generateConfigurationFromProfile() {
-        PasspointConfiguration config = new PasspointConfiguration();
-
-        // HomeSP configuration.
-        HomeSp homeSp = new HomeSp();
-        homeSp.setFriendlyName("Example Network");
-        homeSp.setFqdn("hotspot.example.net");
-        homeSp.setRoamingConsortiumOis(new long[] {0x112233L, 0x445566L});
-        config.setHomeSp(homeSp);
-
-        // Credential configuration.
-        Credential credential = new Credential();
-        credential.setRealm("example.com");
-        Credential.UserCredential userCredential = new Credential.UserCredential();
-        userCredential.setUsername("user");
-        userCredential.setPassword("cGFzc3dvcmQ=");
-        userCredential.setEapType(21);
-        userCredential.setNonEapInnerMethod("MS-CHAP-V2");
-        credential.setUserCredential(userCredential);
-        Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
-        certCredential.setCertType("x509v3");
-        byte[] certSha256Fingerprint = new byte[32];
-        Arrays.fill(certSha256Fingerprint, (byte)0x1f);
-        certCredential.setCertSha256Fingerprint(certSha256Fingerprint);
-        credential.setCertCredential(certCredential);
-        Credential.SimCredential simCredential = new Credential.SimCredential();
-        simCredential.setImsi("123456*");
-        simCredential.setEapType(23);
-        credential.setSimCredential(simCredential);
-        credential.setCaCertificate(FakeKeys.CA_CERT0);
-        config.setCredential(credential);
-        return config;
-    }
-
-    /**
-     * Verify a valid installation file is parsed successfully with the matching contents.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void parseConfigFile() throws Exception {
-        String configStr = loadResourceFile(PASSPOINT_INSTALLATION_FILE_WITH_CA_CERT);
-        PasspointConfiguration expectedConfig = generateConfigurationFromProfile();
-        PasspointConfiguration actualConfig =
-                ConfigParser.parsePasspointConfig(
-                        "application/x-wifi-config", configStr.getBytes());
-        assertTrue(actualConfig.equals(expectedConfig));
-    }
-
-    /**
-     * Verify that parsing an installation file with invalid MIME type will fail.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void parseConfigFileWithInvalidMimeType() throws Exception {
-        String configStr = loadResourceFile(PASSPOINT_INSTALLATION_FILE_WITH_CA_CERT);
-        assertNull(ConfigParser.parsePasspointConfig(
-                "application/wifi-config", configStr.getBytes()));
-    }
-
-    /**
-     * Verify that parsing an un-encoded installation file will fail.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void parseConfigFileWithUnencodedData() throws Exception {
-        String configStr = loadResourceFile(PASSPOINT_INSTALLATION_FILE_WITH_UNENCODED_DATA);
-        assertNull(ConfigParser.parsePasspointConfig(
-                "application/x-wifi-config", configStr.getBytes()));
-    }
-
-    /**
-     * Verify that parsing an installation file that contains a non-base64 part will fail.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void parseConfigFileWithInvalidPart() throws Exception {
-        String configStr = loadResourceFile(PASSPOINT_INSTALLATION_FILE_WITH_INVALID_PART);
-        assertNull(ConfigParser.parsePasspointConfig(
-                "application/x-wifi-config", configStr.getBytes()));
-    }
-
-    /**
-     * Verify that parsing an installation file that contains a missing boundary string will fail.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void parseConfigFileWithMissingBoundary() throws Exception {
-        String configStr = loadResourceFile(PASSPOINT_INSTALLATION_FILE_WITH_MISSING_BOUNDARY);
-        assertNull(ConfigParser.parsePasspointConfig(
-                "application/x-wifi-config", configStr.getBytes()));
-    }
-
-    /**
-     * Verify that parsing an installation file that contains a MIME part with an invalid content
-     * type will fail.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void parseConfigFileWithInvalidContentType() throws Exception {
-        String configStr = loadResourceFile(PASSPOINT_INSTALLATION_FILE_WITH_INVALID_CONTENT_TYPE);
-        assertNull(ConfigParser.parsePasspointConfig(
-                "application/x-wifi-config", configStr.getBytes()));
-    }
-
-    /**
-     * Verify that parsing an installation file that doesn't contain a Passpoint profile will fail.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void parseConfigFileWithoutPasspointProfile() throws Exception {
-        String configStr = loadResourceFile(PASSPOINT_INSTALLATION_FILE_WITHOUT_PROFILE);
-        assertNull(ConfigParser.parsePasspointConfig(
-                "application/x-wifi-config", configStr.getBytes()));
-    }
-
-    /**
-     * Verify a valid installation file is parsed successfully with the matching contents, and that
-     * Update identifier is cleared.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void parseConfigFileWithUpdateIdentifier() throws Exception {
-        String configStr = loadResourceFile(PASSPOINT_INSTALLATION_FILE_WITH_UPDATE_ID);
-        PasspointConfiguration expectedConfig = generateConfigurationFromProfile();
-        PasspointConfiguration actualConfig =
-                ConfigParser.parsePasspointConfig(
-                        "application/x-wifi-config", configStr.getBytes());
-        // Expected configuration does not contain an update identifier
-        assertTrue(actualConfig.equals(expectedConfig));
-    }
-}
\ No newline at end of file
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/OsuProviderTest.java b/wifi/tests/src/android/net/wifi/hotspot2/OsuProviderTest.java
deleted file mode 100644
index 2ded849..0000000
--- a/wifi/tests/src/android/net/wifi/hotspot2/OsuProviderTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi.hotspot2;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.net.Uri;
-import android.net.wifi.WifiSsid;
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Unit tests for {@link android.net.wifi.hotspot2.OsuProvider}.
- */
-@SmallTest
-public class OsuProviderTest {
-    private static final WifiSsid TEST_SSID =
-            WifiSsid.createFromByteArray("TEST SSID".getBytes(StandardCharsets.UTF_8));
-    private static final String TEST_FRIENDLY_NAME = "Friendly Name";
-    private static final Map<String, String> TEST_FRIENDLY_NAMES =
-            new HashMap<String, String>() {
-                {
-                    put("en", TEST_FRIENDLY_NAME);
-                    put("kr", TEST_FRIENDLY_NAME + 2);
-                    put("jp", TEST_FRIENDLY_NAME + 3);
-                }
-            };
-
-    private static final String TEST_SERVICE_DESCRIPTION = "Dummy Service";
-    private static final Uri TEST_SERVER_URI = Uri.parse("https://test.com");
-    private static final String TEST_NAI = "test.access.com";
-    private static final List<Integer> TEST_METHOD_LIST =
-            Arrays.asList(OsuProvider.METHOD_SOAP_XML_SPP);
-
-    /**
-     * Verify parcel write and read consistency for the given {@link OsuProvider}.
-     *
-     * @param writeInfo The {@link OsuProvider} to verify
-     * @throws Exception
-     */
-    private static void verifyParcel(OsuProvider writeInfo) throws Exception {
-        Parcel parcel = Parcel.obtain();
-        writeInfo.writeToParcel(parcel, 0);
-
-        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        OsuProvider readInfo = OsuProvider.CREATOR.createFromParcel(parcel);
-
-        assertEquals(writeInfo, readInfo);
-        assertEquals(writeInfo.hashCode(), readInfo.hashCode());
-    }
-
-    /**
-     * Verify parcel read/write for an OSU provider containing no information.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithEmptyProviderInfo() throws Exception {
-        verifyParcel(new OsuProvider((WifiSsid) null, null, null, null, null, null));
-    }
-
-    /**
-     * Verify parcel read/write for an OSU provider containing full information.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithFullProviderInfo() throws Exception {
-        verifyParcel(new OsuProvider(TEST_SSID, TEST_FRIENDLY_NAMES,
-                TEST_SERVICE_DESCRIPTION, TEST_SERVER_URI, TEST_NAI, TEST_METHOD_LIST));
-    }
-
-    /**
-     * Verify copy constructor with a null source.
-     * @throws Exception
-     */
-    @Test
-    public void verifyCopyConstructorWithNullSource() throws Exception {
-        OsuProvider expected = new OsuProvider((WifiSsid) null, null, null, null, null, null);
-        assertEquals(expected, new OsuProvider(null));
-    }
-
-    /**
-     * Verify copy constructor with a valid source.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyCopyConstructorWithValidSource() throws Exception {
-        OsuProvider source = new OsuProvider(TEST_SSID, TEST_FRIENDLY_NAMES,
-                TEST_SERVICE_DESCRIPTION, TEST_SERVER_URI, TEST_NAI, TEST_METHOD_LIST);
-        assertEquals(source, new OsuProvider(source));
-    }
-
-    /**
-     * Verify getter methods.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyGetters() throws Exception {
-        OsuProvider provider = new OsuProvider(TEST_SSID, TEST_FRIENDLY_NAMES,
-                TEST_SERVICE_DESCRIPTION, TEST_SERVER_URI, TEST_NAI, TEST_METHOD_LIST);
-
-        assertTrue(TEST_SSID.equals(provider.getOsuSsid()));
-        assertTrue(TEST_FRIENDLY_NAME.equals(provider.getFriendlyName()));
-        assertTrue(TEST_FRIENDLY_NAMES.equals(provider.getFriendlyNameList()));
-        assertTrue(TEST_SERVICE_DESCRIPTION.equals(provider.getServiceDescription()));
-        assertTrue(TEST_SERVER_URI.equals(provider.getServerUri()));
-        assertTrue(TEST_NAI.equals(provider.getNetworkAccessIdentifier()));
-        assertTrue(TEST_METHOD_LIST.equals(provider.getMethodList()));
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java b/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java
deleted file mode 100644
index 8270d64..0000000
--- a/wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java
+++ /dev/null
@@ -1,626 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi.hotspot2;
-
-import static android.net.wifi.WifiConfiguration.METERED_OVERRIDE_NONE;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.net.wifi.EAPConstants;
-import android.net.wifi.FakeKeys;
-import android.net.wifi.hotspot2.pps.Credential;
-import android.net.wifi.hotspot2.pps.HomeSp;
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.nio.charset.StandardCharsets;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.X509Certificate;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Unit tests for {@link android.net.wifi.hotspot2.PasspointConfiguration}.
- */
-@SmallTest
-public class PasspointConfigurationTest {
-    private static final int MAX_URL_BYTES = 1023;
-    private static final int CERTIFICATE_FINGERPRINT_BYTES = 32;
-
-    /**
-     * Verify parcel write and read consistency for the given configuration.
-     *
-     * @param writeConfig The configuration to verify
-     * @throws Exception
-     */
-    private static void verifyParcel(PasspointConfiguration writeConfig) throws Exception {
-        Parcel parcel = Parcel.obtain();
-        writeConfig.writeToParcel(parcel, 0);
-
-        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        PasspointConfiguration readConfig =
-                PasspointConfiguration.CREATOR.createFromParcel(parcel);
-        assertTrue(readConfig.equals(writeConfig));
-    }
-
-    /**
-     * Verify parcel read/write for a default configuration.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithDefault() throws Exception {
-        verifyParcel(new PasspointConfiguration());
-    }
-
-    /**
-     * Verify parcel read/write for a configuration that contained the full configuration.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithFullConfiguration() throws Exception {
-        verifyParcel(PasspointTestUtils.createConfig());
-    }
-
-    /**
-     * Verify parcel read/write for a configuration that doesn't contain a list of service names.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutServiceNames() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setServiceFriendlyNames(null);
-        verifyParcel(config);
-    }
-
-    /**
-     * Verify parcel read/write for a configuration that doesn't contain HomeSP.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutHomeSP() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setHomeSp(null);
-        verifyParcel(config);
-    }
-
-    /**
-     * Verify parcel read/write for a configuration that doesn't contain Credential.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutCredential() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setCredential(null);
-        verifyParcel(config);
-    }
-
-    /**
-     * Verify parcel read/write for a configuration that doesn't contain Policy.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutPolicy() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setPolicy(null);
-        verifyParcel(config);
-    }
-
-    /**
-     * Verify parcel read/write for a configuration that doesn't contain subscription update.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutSubscriptionUpdate() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setSubscriptionUpdate(null);
-        verifyParcel(config);
-    }
-
-    /**
-     * Verify parcel read/write for a configuration that doesn't contain trust root certificate
-     * list.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutTrustRootCertList() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setTrustRootCertList(null);
-        verifyParcel(config);
-    }
-
-    /**
-     * Verify parcel read/write for a configuration that doesn't contain AAA server trusted names
-     * list.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutAaaServerTrustedNames() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setAaaServerTrustedNames(null);
-        verifyParcel(config);
-    }
-
-    /**
-     * Verify that a default/empty configuration is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateDefaultConfig() throws Exception {
-        PasspointConfiguration config = new PasspointConfiguration();
-
-        assertFalse(config.validate());
-        assertFalse(config.validateForR2());
-        assertTrue(config.isAutojoinEnabled());
-        assertTrue(config.isMacRandomizationEnabled());
-        assertTrue(config.getMeteredOverride() == METERED_OVERRIDE_NONE);
-    }
-
-    /**
-     * Verify that a configuration containing all fields is valid for R1/R2.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateFullConfig() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-
-        assertTrue(config.validate());
-        assertFalse(config.isOsuProvisioned());
-    }
-
-    /**
-     * Verify that a configuration containing all fields except for UpdateIdentifier is valid for
-     * R1, but invalid for R2.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateFullConfigWithoutUpdateIdentifier() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setUpdateIdentifier(Integer.MIN_VALUE);
-
-        assertTrue(config.validate());
-        assertFalse(config.validateForR2());
-    }
-
-    /**
-     * Verify that a configuration without Credential is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateConfigWithoutCredential() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setCredential(null);
-
-        assertFalse(config.validate());
-        assertFalse(config.validateForR2());
-    }
-
-    /**
-     * Verify that a configuration without HomeSP is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateConfigWithoutHomeSp() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setHomeSp(null);
-
-        assertFalse(config.validate());
-        assertFalse(config.validateForR2());
-    }
-
-    /**
-     * Verify that a configuration without Policy is valid, since Policy configurations
-     * are optional for R1 and R2.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateConfigWithoutPolicy() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setPolicy(null);
-
-        assertTrue(config.validate());
-    }
-
-    /**
-     * Verify that a configuration without subscription update is valid for R1 and invalid for R2,
-     * since subscription update configuration is only applicable for R2.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateConfigWithoutSubscriptionUpdate() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setSubscriptionUpdate(null);
-
-        assertTrue(config.validate());
-        assertFalse(config.validateForR2());
-    }
-
-    /**
-     * Verify that a configuration without AAA server trusted names is valid for R1 and R2,
-     * since AAA server trusted names are optional for R1 and R2.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateConfigWithoutAaaServerTrustedNames() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setAaaServerTrustedNames(null);
-
-        assertTrue(config.validate());
-    }
-
-    /**
-     * Verify that a configuration with a trust root certificate URL exceeding the max size
-     * is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateConfigWithInvalidTrustRootCertUrl() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        byte[] rawUrlBytes = new byte[MAX_URL_BYTES + 1];
-        Map<String, byte[]> trustRootCertList = new HashMap<>();
-        Arrays.fill(rawUrlBytes, (byte) 'a');
-        trustRootCertList.put(new String(rawUrlBytes, StandardCharsets.UTF_8),
-                new byte[CERTIFICATE_FINGERPRINT_BYTES]);
-        config.setTrustRootCertList(trustRootCertList);
-
-        assertFalse(config.validate());
-
-        trustRootCertList = new HashMap<>();
-        trustRootCertList.put(null, new byte[CERTIFICATE_FINGERPRINT_BYTES]);
-        config.setTrustRootCertList(trustRootCertList);
-
-        assertFalse(config.validate());
-        assertFalse(config.validateForR2());
-    }
-
-    /**
-     * Verify that a configuration with an invalid trust root certificate fingerprint is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateConfigWithInvalidTrustRootCertFingerprint() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        Map<String, byte[]> trustRootCertList = new HashMap<>();
-        trustRootCertList.put("test.cert.com", new byte[CERTIFICATE_FINGERPRINT_BYTES + 1]);
-        config.setTrustRootCertList(trustRootCertList);
-        assertFalse(config.validate());
-
-        trustRootCertList = new HashMap<>();
-        trustRootCertList.put("test.cert.com", new byte[CERTIFICATE_FINGERPRINT_BYTES - 1]);
-        config.setTrustRootCertList(trustRootCertList);
-        assertFalse(config.validate());
-
-        trustRootCertList = new HashMap<>();
-        trustRootCertList.put("test.cert.com", null);
-        config.setTrustRootCertList(trustRootCertList);
-        assertFalse(config.validate());
-        assertFalse(config.validateForR2());
-    }
-
-    /**
-     * Verify that copy constructor works when pass in a null source.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCopyConstructorWithNullSource() throws Exception {
-        PasspointConfiguration copyConfig = new PasspointConfiguration(null);
-        PasspointConfiguration defaultConfig = new PasspointConfiguration();
-        assertTrue(copyConfig.equals(defaultConfig));
-    }
-
-    /**
-     * Verify that copy constructor works when pass in a valid source.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCopyConstructorWithValidSource() throws Exception {
-        PasspointConfiguration sourceConfig = PasspointTestUtils.createConfig();
-        PasspointConfiguration copyConfig = new PasspointConfiguration(sourceConfig);
-        assertTrue(copyConfig.equals(sourceConfig));
-    }
-
-    /**
-     * Verify that a configuration containing all fields is valid for R2.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateFullR2Config() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createR2Config();
-        assertTrue(config.validate());
-        assertTrue(config.validateForR2());
-        assertTrue(config.isOsuProvisioned());
-    }
-
-    /**
-     * Verify that the unique identifier generated is identical for two instances
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUniqueId() throws Exception {
-        PasspointConfiguration config1 = PasspointTestUtils.createConfig();
-        PasspointConfiguration config2 = PasspointTestUtils.createConfig();
-
-        assertEquals(config1.getUniqueId(), config2.getUniqueId());
-    }
-
-    /**
-     * Verify that the unique identifier generated is the same for two instances with different
-     * HomeSp node but same FQDN
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUniqueIdDifferentHomeSpSameFqdn() throws Exception {
-        PasspointConfiguration config1 = PasspointTestUtils.createConfig();
-
-        // Modify config2's RCOIs and friendly name to a different set of values
-        PasspointConfiguration config2 = PasspointTestUtils.createConfig();
-        HomeSp homeSp = config2.getHomeSp();
-        homeSp.setRoamingConsortiumOis(new long[] {0xaa, 0xbb});
-        homeSp.setFriendlyName("Some other name");
-        config2.setHomeSp(homeSp);
-
-        assertEquals(config1.getUniqueId(), config2.getUniqueId());
-    }
-
-    /**
-     * Verify that the unique identifier generated is different for two instances with the same
-     * HomeSp node but different FQDN
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUniqueIdSameHomeSpDifferentFqdn() throws Exception {
-        PasspointConfiguration config1 = PasspointTestUtils.createConfig();
-
-        // Modify config2's FQDN to a different value
-        PasspointConfiguration config2 = PasspointTestUtils.createConfig();
-        HomeSp homeSp = config2.getHomeSp();
-        homeSp.setFqdn("fqdn2.com");
-        config2.setHomeSp(homeSp);
-
-        assertNotEquals(config1.getUniqueId(), config2.getUniqueId());
-    }
-
-    /**
-     * Verify that the unique identifier generated is different for two instances with different
-     * SIM Credential node
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUniqueIdDifferentSimCredential() throws Exception {
-        PasspointConfiguration config1 = PasspointTestUtils.createConfig();
-
-        // Modify config2's realm and SIM credential to a different set of values
-        PasspointConfiguration config2 = PasspointTestUtils.createConfig();
-        Credential credential = config2.getCredential();
-        credential.setRealm("realm2.example.com");
-        credential.getSimCredential().setImsi("350460*");
-        config2.setCredential(credential);
-
-        assertNotEquals(config1.getUniqueId(), config2.getUniqueId());
-    }
-
-    /**
-     * Verify that the unique identifier generated is different for two instances with different
-     * Realm in the Credential node
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUniqueIdDifferentRealm() throws Exception {
-        PasspointConfiguration config1 = PasspointTestUtils.createConfig();
-
-        // Modify config2's realm to a different set of values
-        PasspointConfiguration config2 = PasspointTestUtils.createConfig();
-        Credential credential = config2.getCredential();
-        credential.setRealm("realm2.example.com");
-        config2.setCredential(credential);
-
-        assertNotEquals(config1.getUniqueId(), config2.getUniqueId());
-    }
-
-    /**
-     * Verify that the unique identifier generated is the same for two instances with different
-     * password and same username in the User Credential node
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUniqueIdSameUserInUserCredential() throws Exception {
-        PasspointConfiguration config1 = PasspointTestUtils.createConfig();
-        Credential credential = createCredentialWithUserCredential("user", "passwd");
-        config1.setCredential(credential);
-
-        // Modify config2's Passpowrd to a different set of values
-        PasspointConfiguration config2 = PasspointTestUtils.createConfig();
-        credential = createCredentialWithUserCredential("user", "newpasswd");
-        config2.setCredential(credential);
-
-        assertEquals(config1.getUniqueId(), config2.getUniqueId());
-    }
-
-    /**
-     * Verify that the unique identifier generated is different for two instances with different
-     * username in the User Credential node
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUniqueIdDifferentUserCredential() throws Exception {
-        PasspointConfiguration config1 = PasspointTestUtils.createConfig();
-        Credential credential = createCredentialWithUserCredential("user", "passwd");
-        config1.setCredential(credential);
-
-        // Modify config2's username to a different value
-        PasspointConfiguration config2 = PasspointTestUtils.createConfig();
-        credential = createCredentialWithUserCredential("user2", "passwd");
-        config2.setCredential(credential);
-
-        assertNotEquals(config1.getUniqueId(), config2.getUniqueId());
-    }
-
-    /**
-     * Verify that the unique identifier generated is different for two instances with different
-     * Cert Credential node
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUniqueIdDifferentCertCredential() throws Exception {
-        PasspointConfiguration config1 = PasspointTestUtils.createConfig();
-        Credential credential = createCredentialWithCertificateCredential(true, true);
-        config1.setCredential(credential);
-
-        // Modify config2's cert credential to a different set of values
-        PasspointConfiguration config2 = PasspointTestUtils.createConfig();
-        credential = createCredentialWithCertificateCredential(false, false);
-        config2.setCredential(credential);
-
-        assertNotEquals(config1.getUniqueId(), config2.getUniqueId());
-    }
-
-    /**
-     * Helper function for generating certificate credential for testing.
-     *
-     * @return {@link Credential}
-     */
-    private static Credential createCredentialWithCertificateCredential(Boolean useCaCert0,
-            Boolean useCert0)
-            throws NoSuchAlgorithmException, CertificateEncodingException {
-        Credential.CertificateCredential certCred = new Credential.CertificateCredential();
-        certCred.setCertType("x509v3");
-        if (useCert0) {
-            certCred.setCertSha256Fingerprint(
-                    MessageDigest.getInstance("SHA-256").digest(FakeKeys.CLIENT_CERT.getEncoded()));
-        } else {
-            certCred.setCertSha256Fingerprint(MessageDigest.getInstance("SHA-256")
-                    .digest(FakeKeys.CLIENT_SUITE_B_RSA3072_CERT.getEncoded()));
-        }
-        return createCredential(null, certCred, null, new X509Certificate[] {FakeKeys.CLIENT_CERT},
-                FakeKeys.RSA_KEY1, useCaCert0 ? FakeKeys.CA_CERT0 : FakeKeys.CA_CERT1);
-    }
-
-    /**
-     * Helper function for generating user credential for testing.
-     *
-     * @return {@link Credential}
-     */
-    private static Credential createCredentialWithUserCredential(String username, String password) {
-        Credential.UserCredential userCred = new Credential.UserCredential();
-        userCred.setUsername(username);
-        userCred.setPassword(password);
-        userCred.setMachineManaged(true);
-        userCred.setAbleToShare(true);
-        userCred.setSoftTokenApp("TestApp");
-        userCred.setEapType(EAPConstants.EAP_TTLS);
-        userCred.setNonEapInnerMethod("MS-CHAP");
-        return createCredential(userCred, null, null, null, null, FakeKeys.CA_CERT0);
-    }
-
-    /**
-     * Helper function for generating Credential for testing.
-     *
-     * @param userCred Instance of UserCredential
-     * @param certCred Instance of CertificateCredential
-     * @param simCred Instance of SimCredential
-     * @param clientCertificateChain Chain of client certificates
-     * @param clientPrivateKey Client private key
-     * @param caCerts CA certificates
-     * @return {@link Credential}
-     */
-    private static Credential createCredential(Credential.UserCredential userCred,
-            Credential.CertificateCredential certCred,
-            Credential.SimCredential simCred,
-            X509Certificate[] clientCertificateChain, PrivateKey clientPrivateKey,
-            X509Certificate... caCerts) {
-        Credential cred = new Credential();
-        cred.setCreationTimeInMillis(123455L);
-        cred.setExpirationTimeInMillis(2310093L);
-        cred.setRealm("realm");
-        cred.setCheckAaaServerCertStatus(true);
-        cred.setUserCredential(userCred);
-        cred.setCertCredential(certCred);
-        cred.setSimCredential(simCred);
-        if (caCerts != null && caCerts.length == 1) {
-            cred.setCaCertificate(caCerts[0]);
-        } else {
-            cred.setCaCertificates(caCerts);
-        }
-        cred.setClientCertificateChain(clientCertificateChain);
-        cred.setClientPrivateKey(clientPrivateKey);
-        return cred;
-    }
-
-    /**
-     * Verify that the unique identifier API generates an exception if HomeSP is not initialized.
-     *
-     * @throws Exception
-     */
-    @Test (expected = IllegalStateException.class)
-    public void validateUniqueIdExceptionWithEmptyHomeSp() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setHomeSp(null);
-        String uniqueId = config.getUniqueId();
-    }
-
-    /**
-     * Verify that the unique identifier API generates an exception if Credential is not
-     * initialized.
-     *
-     * @throws Exception
-     */
-    @Test (expected = IllegalStateException.class)
-    public void validateUniqueIdExceptionWithEmptyCredential() throws Exception {
-        PasspointConfiguration config = PasspointTestUtils.createConfig();
-        config.setCredential(null);
-        String uniqueId = config.getUniqueId();
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/PasspointTestUtils.java b/wifi/tests/src/android/net/wifi/hotspot2/PasspointTestUtils.java
deleted file mode 100644
index 8d55acb..0000000
--- a/wifi/tests/src/android/net/wifi/hotspot2/PasspointTestUtils.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2;
-
-import android.net.wifi.EAPConstants;
-import android.net.wifi.hotspot2.pps.Credential;
-import android.net.wifi.hotspot2.pps.HomeSp;
-import android.net.wifi.hotspot2.pps.Policy;
-import android.net.wifi.hotspot2.pps.UpdateParameter;
-import android.util.Base64;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-public class PasspointTestUtils {
-    private static final int CERTIFICATE_FINGERPRINT_BYTES = 32;
-
-    /**
-     * Utility function for creating a {@link android.net.wifi.hotspot2.pps.HomeSP}.
-     *
-     * @return {@link android.net.wifi.hotspot2.pps.HomeSP}
-     */
-    private static HomeSp createHomeSp() {
-        HomeSp homeSp = new HomeSp();
-        homeSp.setFqdn("fqdn");
-        homeSp.setFriendlyName("friendly name");
-        homeSp.setRoamingConsortiumOis(new long[] {0x55, 0x66});
-        return homeSp;
-    }
-
-    /**
-     * Utility function for creating a {@link android.net.wifi.hotspot2.pps.Credential}.
-     *
-     * @return {@link android.net.wifi.hotspot2.pps.Credential}
-     */
-    private static Credential createCredential() {
-        Credential cred = new Credential();
-        cred.setRealm("realm");
-        cred.setUserCredential(null);
-        cred.setCertCredential(null);
-        cred.setSimCredential(new Credential.SimCredential());
-        cred.getSimCredential().setImsi("1234*");
-        cred.getSimCredential().setEapType(EAPConstants.EAP_SIM);
-        cred.setCaCertificate(null);
-        cred.setClientCertificateChain(null);
-        cred.setClientPrivateKey(null);
-        return cred;
-    }
-
-    /**
-     * Helper function for creating a {@link Policy} for testing.
-     *
-     * @return {@link Policy}
-     */
-    private static Policy createPolicy() {
-        Policy policy = new Policy();
-        policy.setMinHomeDownlinkBandwidth(123);
-        policy.setMinHomeUplinkBandwidth(345);
-        policy.setMinRoamingDownlinkBandwidth(567);
-        policy.setMinRoamingUplinkBandwidth(789);
-        policy.setMaximumBssLoadValue(12);
-        policy.setExcludedSsidList(new String[] {"ssid1", "ssid2"});
-        HashMap<Integer, String> requiredProtoPortMap = new HashMap<>();
-        requiredProtoPortMap.put(12, "23,342,123");
-        requiredProtoPortMap.put(23, "789,372,1235");
-        policy.setRequiredProtoPortMap(requiredProtoPortMap);
-
-        List<Policy.RoamingPartner> preferredRoamingPartnerList = new ArrayList<>();
-        Policy.RoamingPartner partner1 = new Policy.RoamingPartner();
-        partner1.setFqdn("partner1.com");
-        partner1.setFqdnExactMatch(true);
-        partner1.setPriority(12);
-        partner1.setCountries("us,jp");
-        Policy.RoamingPartner partner2 = new Policy.RoamingPartner();
-        partner2.setFqdn("partner2.com");
-        partner2.setFqdnExactMatch(false);
-        partner2.setPriority(42);
-        partner2.setCountries("ca,fr");
-        preferredRoamingPartnerList.add(partner1);
-        preferredRoamingPartnerList.add(partner2);
-        policy.setPreferredRoamingPartnerList(preferredRoamingPartnerList);
-
-        UpdateParameter policyUpdate = new UpdateParameter();
-        policyUpdate.setUpdateIntervalInMinutes(1712);
-        policyUpdate.setUpdateMethod(UpdateParameter.UPDATE_METHOD_OMADM);
-        policyUpdate.setRestriction(UpdateParameter.UPDATE_RESTRICTION_HOMESP);
-        policyUpdate.setServerUri("policy.update.com");
-        policyUpdate.setUsername("username");
-        policyUpdate.setBase64EncodedPassword(
-                Base64.encodeToString("password".getBytes(), Base64.DEFAULT));
-        policyUpdate.setTrustRootCertUrl("trust.cert.com");
-        policyUpdate.setTrustRootCertSha256Fingerprint(
-                new byte[CERTIFICATE_FINGERPRINT_BYTES]);
-        policy.setPolicyUpdate(policyUpdate);
-
-        return policy;
-    }
-
-    private static UpdateParameter createSubscriptionUpdate() {
-        UpdateParameter subUpdate = new UpdateParameter();
-        subUpdate.setUpdateIntervalInMinutes(9021);
-        subUpdate.setUpdateMethod(UpdateParameter.UPDATE_METHOD_SSP);
-        subUpdate.setRestriction(UpdateParameter.UPDATE_RESTRICTION_ROAMING_PARTNER);
-        subUpdate.setServerUri("subscription.update.com");
-        subUpdate.setUsername("subUsername");
-        subUpdate.setBase64EncodedPassword(
-                Base64.encodeToString("subPassword".getBytes(), Base64.DEFAULT));
-        subUpdate.setTrustRootCertUrl("subscription.trust.cert.com");
-        subUpdate.setTrustRootCertSha256Fingerprint(new byte[CERTIFICATE_FINGERPRINT_BYTES]);
-        return subUpdate;
-    }
-    /**
-     * Helper function for creating a {@link PasspointConfiguration} for testing.
-     *
-     * @return {@link PasspointConfiguration}
-     */
-    public static PasspointConfiguration createConfig() {
-        PasspointConfiguration config = new PasspointConfiguration();
-        config.setHomeSp(createHomeSp());
-        config.setAaaServerTrustedNames(
-                new String[] {"trusted.fqdn.com", "another-trusted.fqdn.com"});
-        config.setCredential(createCredential());
-        config.setPolicy(createPolicy());
-        config.setSubscriptionUpdate(createSubscriptionUpdate());
-        Map<String, byte[]> trustRootCertList = new HashMap<>();
-        trustRootCertList.put("trustRoot.cert1.com",
-                new byte[CERTIFICATE_FINGERPRINT_BYTES]);
-        trustRootCertList.put("trustRoot.cert2.com",
-                new byte[CERTIFICATE_FINGERPRINT_BYTES]);
-        config.setTrustRootCertList(trustRootCertList);
-        config.setCredentialPriority(120);
-        config.setSubscriptionCreationTimeInMillis(231200);
-        config.setSubscriptionExpirationTimeInMillis(2134232);
-        config.setSubscriptionType("Gold");
-        config.setUsageLimitUsageTimePeriodInMinutes(3600);
-        config.setUsageLimitStartTimeInMillis(124214213);
-        config.setUsageLimitDataLimit(14121);
-        config.setUsageLimitTimeLimitInMinutes(78912);
-        Map<String, String> friendlyNames = new HashMap<>();
-        friendlyNames.put("en", "ServiceName1");
-        friendlyNames.put("kr", "ServiceName2");
-        config.setServiceFriendlyNames(friendlyNames);
-        return config;
-    }
-
-    /**
-     * Helper function for creating an R2 {@link PasspointConfiguration} for testing.
-     *
-     * @return {@link PasspointConfiguration}
-     */
-    public static PasspointConfiguration createR2Config() {
-        PasspointConfiguration config = createConfig();
-        config.setUpdateIdentifier(1234);
-        return config;
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/omadm/PpsMoParserTest.java b/wifi/tests/src/android/net/wifi/hotspot2/omadm/PpsMoParserTest.java
deleted file mode 100644
index 1ac9cb8..0000000
--- a/wifi/tests/src/android/net/wifi/hotspot2/omadm/PpsMoParserTest.java
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.omadm;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.net.wifi.hotspot2.PasspointConfiguration;
-import android.net.wifi.hotspot2.pps.Credential;
-import android.net.wifi.hotspot2.pps.HomeSp;
-import android.net.wifi.hotspot2.pps.Policy;
-import android.net.wifi.hotspot2.pps.UpdateParameter;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Unit tests for {@link android.net.wifi.hotspot2.omadm.PpsMoParser}.
- */
-@SmallTest
-public class PpsMoParserTest {
-    private static final String VALID_PPS_MO_XML_FILE = "assets/pps/PerProviderSubscription.xml";
-    private static final String PPS_MO_XML_FILE_DUPLICATE_HOMESP =
-            "assets/pps/PerProviderSubscription_DuplicateHomeSP.xml";
-    private static final String PPS_MO_XML_FILE_DUPLICATE_VALUE =
-            "assets/pps/PerProviderSubscription_DuplicateValue.xml";
-    private static final String PPS_MO_XML_FILE_MISSING_VALUE =
-            "assets/pps/PerProviderSubscription_MissingValue.xml";
-    private static final String PPS_MO_XML_FILE_MISSING_NAME =
-            "assets/pps/PerProviderSubscription_MissingName.xml";
-    private static final String PPS_MO_XML_FILE_INVALID_NODE =
-            "assets/pps/PerProviderSubscription_InvalidNode.xml";
-    private static final String PPS_MO_XML_FILE_INVALID_NAME =
-            "assets/pps/PerProviderSubscription_InvalidName.xml";
-
-    /**
-     * Read the content of the given resource file into a String.
-     *
-     * @param filename String name of the file
-     * @return String
-     * @throws IOException
-     */
-    private String loadResourceFile(String filename) throws IOException {
-        InputStream in = getClass().getClassLoader().getResourceAsStream(filename);
-        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
-        StringBuilder builder = new StringBuilder();
-        String line;
-        while ((line = reader.readLine()) != null) {
-            builder.append(line).append("\n");
-        }
-
-        return builder.toString();
-    }
-
-    /**
-     * Generate a {@link PasspointConfiguration} that matches the configuration specified in the
-     * XML file {@link #VALID_PPS_MO_XML_FILE}.
-     *
-     * @return {@link PasspointConfiguration}
-     */
-    private PasspointConfiguration generateConfigurationFromPPSMOTree() throws Exception {
-        DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
-        byte[] certFingerprint = new byte[32];
-        Arrays.fill(certFingerprint, (byte) 0x1f);
-
-        PasspointConfiguration config = new PasspointConfiguration();
-        config.setUpdateIdentifier(12);
-        config.setCredentialPriority(99);
-
-        // AAA Server trust root.
-        Map<String, byte[]> trustRootCertList = new HashMap<>();
-        trustRootCertList.put("server1.trust.root.com", certFingerprint);
-        config.setTrustRootCertList(trustRootCertList);
-
-        // Subscription update.
-        UpdateParameter subscriptionUpdate = new UpdateParameter();
-        subscriptionUpdate.setUpdateIntervalInMinutes(120);
-        subscriptionUpdate.setUpdateMethod(UpdateParameter.UPDATE_METHOD_SSP);
-        subscriptionUpdate.setRestriction(UpdateParameter.UPDATE_RESTRICTION_ROAMING_PARTNER);
-        subscriptionUpdate.setServerUri("subscription.update.com");
-        subscriptionUpdate.setUsername("subscriptionUser");
-        subscriptionUpdate.setBase64EncodedPassword("subscriptionPass");
-        subscriptionUpdate.setTrustRootCertUrl("subscription.update.cert.com");
-        subscriptionUpdate.setTrustRootCertSha256Fingerprint(certFingerprint);
-        config.setSubscriptionUpdate(subscriptionUpdate);
-
-        // Subscription parameters.
-        config.setSubscriptionCreationTimeInMillis(format.parse("2016-02-01T10:00:00Z").getTime());
-        config.setSubscriptionExpirationTimeInMillis(format.parse("2016-03-01T10:00:00Z").getTime());
-        config.setSubscriptionType("Gold");
-        config.setUsageLimitDataLimit(921890);
-        config.setUsageLimitStartTimeInMillis(format.parse("2016-12-01T10:00:00Z").getTime());
-        config.setUsageLimitTimeLimitInMinutes(120);
-        config.setUsageLimitUsageTimePeriodInMinutes(99910);
-
-        // HomeSP configuration.
-        HomeSp homeSp = new HomeSp();
-        homeSp.setFriendlyName("Century House");
-        homeSp.setFqdn("mi6.co.uk");
-        homeSp.setRoamingConsortiumOis(new long[] {0x112233L, 0x445566L});
-        homeSp.setIconUrl("icon.test.com");
-        Map<String, Long> homeNetworkIds = new HashMap<>();
-        homeNetworkIds.put("TestSSID", 0x12345678L);
-        homeNetworkIds.put("NullHESSID", null);
-        homeSp.setHomeNetworkIds(homeNetworkIds);
-        homeSp.setMatchAllOis(new long[] {0x11223344});
-        homeSp.setMatchAnyOis(new long[] {0x55667788});
-        homeSp.setOtherHomePartners(new String[] {"other.fqdn.com"});
-        config.setHomeSp(homeSp);
-
-        config.setAaaServerTrustedNames(
-                new String[] {"trusted.fqdn.com", "another-trusted.fqdn.com"});
-
-        // Credential configuration.
-        Credential credential = new Credential();
-        credential.setCreationTimeInMillis(format.parse("2016-01-01T10:00:00Z").getTime());
-        credential.setExpirationTimeInMillis(format.parse("2016-02-01T10:00:00Z").getTime());
-        credential.setRealm("shaken.stirred.com");
-        credential.setCheckAaaServerCertStatus(true);
-        Credential.UserCredential userCredential = new Credential.UserCredential();
-        userCredential.setUsername("james");
-        userCredential.setPassword("Ym9uZDAwNw==");
-        userCredential.setMachineManaged(true);
-        userCredential.setSoftTokenApp("TestApp");
-        userCredential.setAbleToShare(true);
-        userCredential.setEapType(21);
-        userCredential.setNonEapInnerMethod("MS-CHAP-V2");
-        credential.setUserCredential(userCredential);
-        Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
-        certCredential.setCertType("x509v3");
-        certCredential.setCertSha256Fingerprint(certFingerprint);
-        credential.setCertCredential(certCredential);
-        Credential.SimCredential simCredential = new Credential.SimCredential();
-        simCredential.setImsi("imsi");
-        simCredential.setEapType(24);
-        credential.setSimCredential(simCredential);
-        config.setCredential(credential);
-
-        // Policy configuration.
-        Policy policy = new Policy();
-        List<Policy.RoamingPartner> preferredRoamingPartnerList = new ArrayList<>();
-        Policy.RoamingPartner partner1 = new Policy.RoamingPartner();
-        partner1.setFqdn("test1.fqdn.com");
-        partner1.setFqdnExactMatch(true);
-        partner1.setPriority(127);
-        partner1.setCountries("us,fr");
-        Policy.RoamingPartner partner2 = new Policy.RoamingPartner();
-        partner2.setFqdn("test2.fqdn.com");
-        partner2.setFqdnExactMatch(false);
-        partner2.setPriority(200);
-        partner2.setCountries("*");
-        preferredRoamingPartnerList.add(partner1);
-        preferredRoamingPartnerList.add(partner2);
-        policy.setPreferredRoamingPartnerList(preferredRoamingPartnerList);
-        policy.setMinHomeDownlinkBandwidth(23412);
-        policy.setMinHomeUplinkBandwidth(9823);
-        policy.setMinRoamingDownlinkBandwidth(9271);
-        policy.setMinRoamingUplinkBandwidth(2315);
-        policy.setExcludedSsidList(new String[] {"excludeSSID"});
-        Map<Integer, String> requiredProtoPortMap = new HashMap<>();
-        requiredProtoPortMap.put(12, "34,92,234");
-        policy.setRequiredProtoPortMap(requiredProtoPortMap);
-        policy.setMaximumBssLoadValue(23);
-        UpdateParameter policyUpdate = new UpdateParameter();
-        policyUpdate.setUpdateIntervalInMinutes(120);
-        policyUpdate.setUpdateMethod(UpdateParameter.UPDATE_METHOD_OMADM);
-        policyUpdate.setRestriction(UpdateParameter.UPDATE_RESTRICTION_HOMESP);
-        policyUpdate.setServerUri("policy.update.com");
-        policyUpdate.setUsername("updateUser");
-        policyUpdate.setBase64EncodedPassword("updatePass");
-        policyUpdate.setTrustRootCertUrl("update.cert.com");
-        policyUpdate.setTrustRootCertSha256Fingerprint(certFingerprint);
-        policy.setPolicyUpdate(policyUpdate);
-        config.setPolicy(policy);
-        return config;
-    }
-
-    /**
-     * Parse and verify all supported fields under PPS MO tree.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void parseValidPPSMOTree() throws Exception {
-        String ppsMoTree = loadResourceFile(VALID_PPS_MO_XML_FILE);
-        PasspointConfiguration expectedConfig = generateConfigurationFromPPSMOTree();
-        PasspointConfiguration actualConfig = PpsMoParser.parseMoText(ppsMoTree);
-        assertTrue(actualConfig.equals(expectedConfig));
-    }
-
-    @Test
-    public void parseNullPPSMOTree() throws Exception {
-        assertEquals(null, PpsMoParser.parseMoText(null));
-    }
-
-    @Test
-    public void parseEmptyPPSMOTree() throws Exception {
-        assertEquals(null, PpsMoParser.parseMoText(new String()));
-    }
-
-    @Test
-    public void parsePPSMOTreeWithDuplicateHomeSP() throws Exception {
-        assertEquals(null, PpsMoParser.parseMoText(
-                loadResourceFile(PPS_MO_XML_FILE_DUPLICATE_HOMESP)));
-    }
-
-    @Test
-    public void parsePPSMOTreeWithDuplicateValue() throws Exception {
-        assertEquals(null, PpsMoParser.parseMoText(
-                loadResourceFile(PPS_MO_XML_FILE_DUPLICATE_VALUE)));
-    }
-
-    @Test
-    public void parsePPSMOTreeWithMissingValue() throws Exception {
-        assertEquals(null, PpsMoParser.parseMoText(
-                loadResourceFile(PPS_MO_XML_FILE_MISSING_VALUE)));
-    }
-
-    @Test
-    public void parsePPSMOTreeWithMissingName() throws Exception {
-        assertEquals(null, PpsMoParser.parseMoText(
-                loadResourceFile(PPS_MO_XML_FILE_MISSING_NAME)));
-    }
-
-    @Test
-    public void parsePPSMOTreeWithInvalidNode() throws Exception {
-        assertEquals(null, PpsMoParser.parseMoText(
-                loadResourceFile(PPS_MO_XML_FILE_INVALID_NODE)));
-    }
-
-    @Test
-    public void parsePPSMOTreeWithInvalidName() throws Exception {
-        assertEquals(null, PpsMoParser.parseMoText(
-                loadResourceFile(PPS_MO_XML_FILE_INVALID_NAME)));
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/omadm/XMLParserTest.java b/wifi/tests/src/android/net/wifi/hotspot2/omadm/XMLParserTest.java
deleted file mode 100644
index 85d0a90..0000000
--- a/wifi/tests/src/android/net/wifi/hotspot2/omadm/XMLParserTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.hotspot2.omadm;
-
-import static org.junit.Assert.assertTrue;
-
-import android.net.wifi.hotspot2.omadm.XMLNode;
-import android.net.wifi.hotspot2.omadm.XMLParser;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.xml.sax.SAXException;
-
-import java.io.IOException;
-
-/**
- * Unit tests for {@link android.net.wifi.hotspot2.omadm.XMLParser}.
- */
-@SmallTest
-public class XMLParserTest {
-    XMLParser mParser;
-
-    private static XMLNode createNode(XMLNode parent, String tag, String text) {
-        XMLNode node = new XMLNode(parent, tag);
-        node.addText(text);
-        if (parent != null)
-            parent.addChild(node);
-        node.close();
-        return node;
-    }
-
-    /**
-     * Setup before tests.
-     */
-    @Before
-    public void setUp() throws Exception {
-        mParser = new XMLParser();
-    }
-
-    @Test(expected = IOException.class)
-    public void parseNullXML() throws Exception {
-        mParser.parse(null);
-    }
-
-    @Test(expected = IOException.class)
-    public void parseEmptyXML() throws Exception {
-        mParser.parse(new String());
-    }
-
-    @Test(expected = SAXException.class)
-    public void parseMalformedXML() throws Exception {
-        String malformedXmlTree = "<root><child1>test1</child2></root>";
-        mParser.parse(malformedXmlTree);
-    }
-
-    @Test
-    public void parseValidXMLTree() throws Exception {
-        String xmlTree = "<root><child1>test1</child1><child2>test2</child2></root>";
-
-        // Construct the expected XML tree.
-        XMLNode expectedRoot = createNode(null, "root", "");
-        createNode(expectedRoot, "child1", "test1");
-        createNode(expectedRoot, "child2", "test2");
-
-        XMLNode actualRoot = mParser.parse(xmlTree);
-        assertTrue(actualRoot.equals(expectedRoot));
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
deleted file mode 100644
index a44df40..0000000
--- a/wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java
+++ /dev/null
@@ -1,636 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi.hotspot2.pps;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.net.wifi.EAPConstants;
-import android.net.wifi.FakeKeys;
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.security.PrivateKey;
-import java.security.cert.CertificateEncodingException;
-import java.security.cert.X509Certificate;
-
-/**
- * Unit tests for {@link android.net.wifi.hotspot2.pps.CredentialTest}.
- */
-@SmallTest
-public class CredentialTest {
-    /**
-     * Helper function for generating Credential for testing.
-     *
-     * @param userCred Instance of UserCredential
-     * @param certCred Instance of CertificateCredential
-     * @param simCred Instance of SimCredential
-     * @param clientCertificateChain Chain of client certificates
-     * @param clientPrivateKey Client private key
-     * @param caCerts CA certificates
-     * @return {@link Credential}
-     */
-    private static Credential createCredential(Credential.UserCredential userCred,
-            Credential.CertificateCredential certCred,
-            Credential.SimCredential simCred,
-            X509Certificate[] clientCertificateChain, PrivateKey clientPrivateKey,
-            X509Certificate... caCerts) {
-        Credential cred = new Credential();
-        cred.setCreationTimeInMillis(123455L);
-        cred.setExpirationTimeInMillis(2310093L);
-        cred.setRealm("realm");
-        cred.setCheckAaaServerCertStatus(true);
-        cred.setUserCredential(userCred);
-        cred.setCertCredential(certCred);
-        cred.setSimCredential(simCred);
-        if (caCerts != null && caCerts.length == 1) {
-            cred.setCaCertificate(caCerts[0]);
-        } else {
-            cred.setCaCertificates(caCerts);
-        }
-        cred.setClientCertificateChain(clientCertificateChain);
-        cred.setClientPrivateKey(clientPrivateKey);
-        return cred;
-    }
-
-    /**
-     * Helper function for generating certificate credential for testing.
-     *
-     * @return {@link Credential}
-     */
-    private static Credential createCredentialWithCertificateCredential()
-            throws NoSuchAlgorithmException, CertificateEncodingException {
-        Credential.CertificateCredential certCred = new Credential.CertificateCredential();
-        certCred.setCertType("x509v3");
-        certCred.setCertSha256Fingerprint(
-                MessageDigest.getInstance("SHA-256").digest(FakeKeys.CLIENT_CERT.getEncoded()));
-        return createCredential(null, certCred, null, new X509Certificate[] {FakeKeys.CLIENT_CERT},
-                FakeKeys.RSA_KEY1, FakeKeys.CA_CERT0, FakeKeys.CA_CERT1);
-    }
-
-    /**
-     * Helper function for generating SIM credential for testing.
-     *
-     * @return {@link Credential}
-     */
-    private static Credential createCredentialWithSimCredential() {
-        Credential.SimCredential simCred = new Credential.SimCredential();
-        simCred.setImsi("1234*");
-        simCred.setEapType(EAPConstants.EAP_SIM);
-        return createCredential(null, null, simCred, null, null, (X509Certificate[]) null);
-    }
-
-    /**
-     * Helper function for generating user credential for testing.
-     *
-     * @return {@link Credential}
-     */
-    private static Credential createCredentialWithUserCredential() {
-        Credential.UserCredential userCred = new Credential.UserCredential();
-        userCred.setUsername("username");
-        userCred.setPassword("password");
-        userCred.setMachineManaged(true);
-        userCred.setAbleToShare(true);
-        userCred.setSoftTokenApp("TestApp");
-        userCred.setEapType(EAPConstants.EAP_TTLS);
-        userCred.setNonEapInnerMethod("MS-CHAP");
-        return createCredential(userCred, null, null, null, null, FakeKeys.CA_CERT0);
-    }
-
-    private static void verifyParcel(Credential writeCred) {
-        Parcel parcel = Parcel.obtain();
-        writeCred.writeToParcel(parcel, 0);
-
-        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        Credential readCred = Credential.CREATOR.createFromParcel(parcel);
-        assertTrue(readCred.equals(writeCred));
-        assertEquals(writeCred.hashCode(), readCred.hashCode());
-    }
-
-    /**
-     * Verify parcel read/write for a default/empty credential.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithDefault() throws Exception {
-        verifyParcel(new Credential());
-    }
-
-    /**
-     * Verify parcel read/write for a certificate credential.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithCertificateCredential() throws Exception {
-        verifyParcel(createCredentialWithCertificateCredential());
-    }
-
-    /**
-     * Verify parcel read/write for a SIM credential.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithSimCredential() throws Exception {
-        verifyParcel(createCredentialWithSimCredential());
-    }
-
-    /**
-     * Verify parcel read/write for a user credential.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithUserCredential() throws Exception {
-        verifyParcel(createCredentialWithUserCredential());
-    }
-
-    /**
-     * Verify a valid user credential.
-     * @throws Exception
-     */
-    @Test
-    public void validateUserCredential() throws Exception {
-        Credential cred = createCredentialWithUserCredential();
-
-        // For R1 validation
-        assertTrue(cred.validate());
-
-        // For R2 validation
-        assertTrue(cred.validate());
-    }
-
-    /**
-     * Verify that a user credential without CA Certificate is valid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUserCredentialWithoutCaCert() throws Exception {
-        Credential cred = createCredentialWithUserCredential();
-        cred.setCaCertificate(null);
-
-        // Accept a configuration with no CA certificate, the system will use the default cert store
-        assertTrue(cred.validate());
-    }
-
-    /**
-     * Verify that a user credential with EAP type other than EAP-TTLS is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUserCredentialWithEapTls() throws Exception {
-        Credential cred = createCredentialWithUserCredential();
-        cred.getUserCredential().setEapType(EAPConstants.EAP_TLS);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-
-    /**
-     * Verify that a user credential without realm is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUserCredentialWithoutRealm() throws Exception {
-        Credential cred = createCredentialWithUserCredential();
-        cred.setRealm(null);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify that a user credential without username is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUserCredentialWithoutUsername() throws Exception {
-        Credential cred = createCredentialWithUserCredential();
-        cred.getUserCredential().setUsername(null);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify that a user credential without password is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUserCredentialWithoutPassword() throws Exception {
-        Credential cred = createCredentialWithUserCredential();
-        cred.getUserCredential().setPassword(null);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify that a user credential without auth methoh (non-EAP inner method) is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUserCredentialWithoutAuthMethod() throws Exception {
-        Credential cred = createCredentialWithUserCredential();
-        cred.getUserCredential().setNonEapInnerMethod(null);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify a certificate credential. CA Certificate, client certificate chain,
-     * and client private key are all required.  Also the digest for client
-     * certificate must match the fingerprint specified in the certificate credential.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCertCredential() throws Exception {
-        Credential cred = createCredentialWithCertificateCredential();
-
-        // For R1 validation
-        assertTrue(cred.validate());
-
-        // For R2 validation
-        assertTrue(cred.validate());
-    }
-
-    /**
-     * Verify that an certificate credential without CA Certificate is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCertCredentialWithoutCaCert() throws Exception {
-        Credential cred = createCredentialWithCertificateCredential();
-        cred.setCaCertificate(null);
-
-        // Accept a configuration with no CA certificate, the system will use the default cert store
-        assertTrue(cred.validate());
-    }
-
-    /**
-     * Verify that a certificate credential without client certificate chain is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCertCredentialWithoutClientCertChain() throws Exception {
-        Credential cred = createCredentialWithCertificateCredential();
-        cred.setClientCertificateChain(null);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify that a certificate credential without client private key is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCertCredentialWithoutClientPrivateKey() throws Exception {
-        Credential cred = createCredentialWithCertificateCredential();
-        cred.setClientPrivateKey(null);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify that a certificate credential with mismatch client certificate fingerprint
-     * is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCertCredentialWithMismatchFingerprint() throws Exception {
-        Credential cred = createCredentialWithCertificateCredential();
-        cred.getCertCredential().setCertSha256Fingerprint(new byte[32]);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify a SIM credential using EAP-SIM.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateSimCredentialWithEapSim() throws Exception {
-        Credential cred = createCredentialWithSimCredential();
-
-        // For R1 validation
-        assertTrue(cred.validate());
-
-        // For R2 validation
-        assertTrue(cred.validate());
-    }
-
-    /**
-     * Verify a SIM credential using EAP-AKA.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateSimCredentialWithEapAka() throws Exception {
-        Credential cred = createCredentialWithSimCredential();
-        cred.getSimCredential().setEapType(EAPConstants.EAP_AKA);
-
-        // For R1 validation
-        assertTrue(cred.validate());
-
-        // For R2 validation
-        assertTrue(cred.validate());
-    }
-
-    /**
-     * Verify a SIM credential using EAP-AKA-PRIME.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateSimCredentialWithEapAkaPrime() throws Exception {
-        Credential cred = createCredentialWithSimCredential();
-        cred.getSimCredential().setEapType(EAPConstants.EAP_AKA_PRIME);
-
-        // For R1 validation
-        assertTrue(cred.validate());
-
-        // For R2 validation
-        assertTrue(cred.validate());
-    }
-
-    /**
-     * Verify that a SIM credential without IMSI is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateSimCredentialWithoutIMSI() throws Exception {
-        Credential cred = createCredentialWithSimCredential();
-        cred.getSimCredential().setImsi(null);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify that a SIM credential with an invalid IMSI is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateSimCredentialWithInvalidIMSI() throws Exception {
-        Credential cred = createCredentialWithSimCredential();
-        cred.getSimCredential().setImsi("dummy");
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify that a SIM credential with invalid EAP type is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateSimCredentialWithEapTls() throws Exception {
-        Credential cred = createCredentialWithSimCredential();
-        cred.getSimCredential().setEapType(EAPConstants.EAP_TLS);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify that a credential contained both a user and a SIM credential is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCredentialWithUserAndSimCredential() throws Exception {
-        Credential cred = createCredentialWithUserCredential();
-        // Setup SIM credential.
-        Credential.SimCredential simCredential = new Credential.SimCredential();
-        simCredential.setImsi("1234*");
-        simCredential.setEapType(EAPConstants.EAP_SIM);
-        cred.setSimCredential(simCredential);
-
-        // For R1 validation
-        assertFalse(cred.validate());
-
-        // For R2 validation
-        assertFalse(cred.validate());
-    }
-
-    /**
-     * Verify that copy constructor works when pass in a null source.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCopyConstructorWithNullSource() throws Exception {
-        Credential copyCred = new Credential(null);
-        Credential defaultCred = new Credential();
-        assertTrue(copyCred.equals(defaultCred));
-    }
-
-    /**
-     * Verify that copy constructor works when pass in a source with user credential.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCopyConstructorWithSourceWithUserCred() throws Exception {
-        Credential sourceCred = createCredentialWithUserCredential();
-        Credential copyCred = new Credential(sourceCred);
-        assertTrue(copyCred.equals(sourceCred));
-    }
-
-    /**
-     * Verify that copy constructor works when pass in a source with certificate credential.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCopyConstructorWithSourceWithCertCred() throws Exception {
-        Credential sourceCred = createCredentialWithCertificateCredential();
-        Credential copyCred = new Credential(sourceCred);
-        assertTrue(copyCred.equals(sourceCred));
-    }
-
-    /**
-     * Verify that copy constructor works when pass in a source with SIM credential.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCopyConstructorWithSourceWithSimCred() throws Exception {
-        Credential sourceCred = createCredentialWithSimCredential();
-        Credential copyCred = new Credential(sourceCred);
-        assertTrue(copyCred.equals(sourceCred));
-    }
-
-    /**
-     * Verify that two certificates are identical.
-     */
-    @Test
-    public void validateTwoCertificateIdentical() {
-        assertTrue(Credential.isX509CertificateEquals(FakeKeys.CA_CERT1, FakeKeys.CA_CERT1));
-    }
-
-    /**
-     * Verify that two certificates are different.
-     */
-    @Test
-    public void validateTwoCertificateDifferent() {
-        assertFalse(Credential.isX509CertificateEquals(FakeKeys.CA_CERT0, FakeKeys.CA_CERT1));
-    }
-
-    /**
-     * Verify that unique identifiers are the same for objects with the same credentials
-     */
-    @Test
-    public void testUniqueIdSameCredentialTypes() throws Exception {
-        assertEquals(createCredentialWithSimCredential().getUniqueId(),
-                createCredentialWithSimCredential().getUniqueId());
-        assertEquals(createCredentialWithCertificateCredential().getUniqueId(),
-                createCredentialWithCertificateCredential().getUniqueId());
-        assertEquals(createCredentialWithUserCredential().getUniqueId(),
-                createCredentialWithUserCredential().getUniqueId());
-    }
-
-    /**
-     * Verify that unique identifiers are different for each credential
-     */
-    @Test
-    public void testUniqueIdDifferentForDifferentCredentialTypes() throws Exception {
-        Credential simCred = createCredentialWithSimCredential();
-        Credential certCred = createCredentialWithCertificateCredential();
-        Credential userCred = createCredentialWithUserCredential();
-
-        assertNotEquals(simCred.getUniqueId(), userCred.getUniqueId());
-        assertNotEquals(simCred.getUniqueId(), certCred.getUniqueId());
-        assertNotEquals(certCred.getUniqueId(), userCred.getUniqueId());
-    }
-
-    /**
-     * Verify that unique identifiers are different for a credential with different values
-     */
-    @Test
-    public void testUniqueIdDifferentForSimCredentialsWithDifferentValues() throws Exception {
-        Credential simCred1 = createCredentialWithSimCredential();
-        Credential simCred2 = createCredentialWithSimCredential();
-        simCred2.getSimCredential().setImsi("567890*");
-
-        assertNotEquals(simCred1.getUniqueId(), simCred2.getUniqueId());
-    }
-
-    /**
-     * Verify that unique identifiers are different for a credential with different username
-     */
-    @Test
-    public void testUniqueIdDifferentForUserCredentialsWithDifferentUsername() throws Exception {
-        Credential userCred1 = createCredentialWithUserCredential();
-        Credential userCred2 = createCredentialWithUserCredential();
-        userCred2.getUserCredential().setUsername("anotheruser");
-
-        assertNotEquals(userCred1.getUniqueId(), userCred2.getUniqueId());
-    }
-
-    /**
-     * Verify that unique identifiers are different for a credential with different password and
-     * other values other than username
-     */
-    @Test
-    public void testUniqueIdSameForUserCredentialsWithDifferentPassword() throws Exception {
-        Credential userCred1 = createCredentialWithUserCredential();
-        Credential userCred2 = createCredentialWithUserCredential();
-        userCred2.getUserCredential().setPassword("someotherpassword!");
-        userCred2.getUserCredential().setMachineManaged(false);
-        userCred2.getUserCredential().setAbleToShare(false);
-        userCred2.getUserCredential().setSoftTokenApp("TestApp2");
-        userCred2.getUserCredential().setNonEapInnerMethod("PAP");
-
-        assertEquals(userCred1.getUniqueId(), userCred2.getUniqueId());
-    }
-
-    /**
-     * Verify that unique identifiers are different for a cert credential with different values
-     */
-    @Test
-    public void testUniqueIdDifferentForCertCredentialsWithDifferentValues() throws Exception {
-        Credential certCred1 = createCredentialWithCertificateCredential();
-        Credential certCred2 = createCredentialWithCertificateCredential();
-        certCred2.getCertCredential().setCertSha256Fingerprint(
-                MessageDigest.getInstance("SHA-256").digest(FakeKeys.CA_CERT0.getEncoded()));
-
-        assertNotEquals(certCred1.getUniqueId(), certCred2.getUniqueId());
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/HomeSpTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/HomeSpTest.java
deleted file mode 100644
index 93d471a..0000000
--- a/wifi/tests/src/android/net/wifi/hotspot2/pps/HomeSpTest.java
+++ /dev/null
@@ -1,221 +0,0 @@
-/*
- * Copyright (C) 2016 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi.hotspot2.pps;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Unit tests for {@link android.net.wifi.hotspot2.pps.HomeSp}.
- */
-@SmallTest
-public class HomeSpTest {
-
-    /**
-     * Helper function for creating a map of home network IDs for testing.
-     *
-     * @return Map of home network IDs
-     */
-    private static Map<String, Long> createHomeNetworkIds() {
-        Map<String, Long> homeNetworkIds = new HashMap<>();
-        homeNetworkIds.put("ssid", 0x1234L);
-        homeNetworkIds.put("nullhessid", null);
-        return homeNetworkIds;
-    }
-
-    /**
-     * Helper function for creating a HomeSp for testing.
-     *
-     * @param homeNetworkIds The map of home network IDs associated with HomeSp
-     * @return {@link HomeSp}
-     */
-    private static HomeSp createHomeSp(Map<String, Long> homeNetworkIds) {
-        HomeSp homeSp = new HomeSp();
-        homeSp.setFqdn("fqdn");
-        homeSp.setFriendlyName("friendly name");
-        homeSp.setIconUrl("icon.url");
-        homeSp.setHomeNetworkIds(homeNetworkIds);
-        homeSp.setMatchAllOis(new long[] {0x11L, 0x22L});
-        homeSp.setMatchAnyOis(new long[] {0x33L, 0x44L});
-        homeSp.setOtherHomePartners(new String[] {"partner1", "partner2"});
-        homeSp.setRoamingConsortiumOis(new long[] {0x55, 0x66});
-        return homeSp;
-    }
-
-    /**
-     * Helper function for creating a HomeSp with home network IDs for testing.
-     *
-     * @return {@link HomeSp}
-     */
-    private static HomeSp createHomeSpWithHomeNetworkIds() {
-        return createHomeSp(createHomeNetworkIds());
-    }
-
-    /**
-     * Helper function for creating a HomeSp without home network IDs for testing.
-     *
-     * @return {@link HomeSp}
-     */
-    private static HomeSp createHomeSpWithoutHomeNetworkIds() {
-        return createHomeSp(null);
-    }
-
-    /**
-     * Helper function for verifying HomeSp after parcel write then read.
-     * @param writeHomeSp
-     * @throws Exception
-     */
-    private static void verifyParcel(HomeSp writeHomeSp) throws Exception {
-        Parcel parcel = Parcel.obtain();
-        writeHomeSp.writeToParcel(parcel, 0);
-
-        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        HomeSp readHomeSp = HomeSp.CREATOR.createFromParcel(parcel);
-        assertTrue(readHomeSp.equals(writeHomeSp));
-    }
-
-    /**
-     * Verify parcel read/write for an empty HomeSp.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithEmptyHomeSp() throws Exception {
-        verifyParcel(new HomeSp());
-    }
-
-    /**
-     * Verify parcel read/write for a HomeSp containing Home Network IDs.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithHomeNetworkIds() throws Exception {
-        verifyParcel(createHomeSpWithHomeNetworkIds());
-    }
-
-    /**
-     * Verify parcel read/write for a HomeSp without Home Network IDs.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutHomeNetworkIds() throws Exception {
-        verifyParcel(createHomeSpWithoutHomeNetworkIds());
-    }
-
-    /**
-     * Verify that a HomeSp is valid when both FQDN and Friendly Name
-     * are provided.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateValidHomeSp() throws Exception {
-        HomeSp homeSp = createHomeSpWithHomeNetworkIds();
-        assertTrue(homeSp.validate());
-    }
-
-    /**
-     * Verify that a HomeSp is not valid when FQDN is not provided
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateHomeSpWithoutFqdn() throws Exception {
-        HomeSp homeSp = createHomeSpWithHomeNetworkIds();
-        homeSp.setFqdn(null);
-        assertFalse(homeSp.validate());
-    }
-
-    /**
-     * Verify that a HomeSp is not valid when Friendly Name is not provided
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateHomeSpWithoutFriendlyName() throws Exception {
-        HomeSp homeSp = createHomeSpWithHomeNetworkIds();
-        homeSp.setFriendlyName(null);
-        assertFalse(homeSp.validate());
-    }
-
-    /**
-     * Verify that a HomeSp is valid when the optional Home Network IDs are
-     * not provided.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateHomeSpWithoutHomeNetworkIds() throws Exception {
-        HomeSp homeSp = createHomeSpWithoutHomeNetworkIds();
-        assertTrue(homeSp.validate());
-    }
-
-    /**
-     * Verify that a HomeSp is invalid when the optional Home Network IDs
-     * contained an invalid SSID (exceeding maximum number of bytes).
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateHomeSpWithInvalidHomeNetworkIds() throws Exception {
-        HomeSp homeSp = createHomeSpWithoutHomeNetworkIds();
-        // HomeNetworkID with SSID exceeding the maximum length.
-        Map<String, Long> homeNetworkIds = new HashMap<>();
-        byte[] rawSsidBytes = new byte[33];
-        Arrays.fill(rawSsidBytes, (byte) 'a');
-        homeNetworkIds.put(new String(rawSsidBytes, StandardCharsets.UTF_8), 0x1234L);
-        homeSp.setHomeNetworkIds(homeNetworkIds);
-        assertFalse(homeSp.validate());
-    }
-
-    /**
-     * Verify that copy constructor works when pass in a null source.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCopyConstructorFromNullSource() throws Exception {
-        HomeSp copySp = new HomeSp(null);
-        HomeSp defaultSp = new HomeSp();
-        assertTrue(copySp.equals(defaultSp));
-    }
-
-    /**
-     * Verify that copy constructor works when pass in a valid source.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateCopyConstructorFromValidSource() throws Exception {
-        HomeSp sourceSp = createHomeSpWithHomeNetworkIds();
-        HomeSp copySp = new HomeSp(sourceSp);
-        assertTrue(copySp.equals(sourceSp));
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/PolicyTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/PolicyTest.java
deleted file mode 100644
index 980b199..0000000
--- a/wifi/tests/src/android/net/wifi/hotspot2/pps/PolicyTest.java
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi.hotspot2.pps;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.os.Parcel;
-import android.util.Base64;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Unit tests for {@link android.net.wifi.hotspot2.pps.Policy}.
- */
-@SmallTest
-public class PolicyTest {
-    private static final int MAX_NUMBER_OF_EXCLUDED_SSIDS = 128;
-    private static final int MAX_SSID_BYTES = 32;
-    private static final int MAX_PORT_STRING_BYTES = 64;
-
-    /**
-     * Helper function for creating a {@link Policy} for testing.
-     *
-     * @return {@link Policy}
-     */
-    private static Policy createPolicy() {
-        Policy policy = new Policy();
-        policy.setMinHomeDownlinkBandwidth(123);
-        policy.setMinHomeUplinkBandwidth(345);
-        policy.setMinRoamingDownlinkBandwidth(567);
-        policy.setMinRoamingUplinkBandwidth(789);
-        policy.setExcludedSsidList(new String[] {"ssid1", "ssid2"});
-        Map<Integer, String> requiredProtoPortMap = new HashMap<>();
-        requiredProtoPortMap.put(12, "23,342,123");
-        requiredProtoPortMap.put(23, "789,372,1235");
-        policy.setRequiredProtoPortMap(requiredProtoPortMap);
-        policy.setMaximumBssLoadValue(12);
-
-        List<Policy.RoamingPartner> preferredRoamingPartnerList = new ArrayList<>();
-        Policy.RoamingPartner partner1 = new Policy.RoamingPartner();
-        partner1.setFqdn("partner1.com");
-        partner1.setFqdnExactMatch(true);
-        partner1.setPriority(12);
-        partner1.setCountries("us,jp");
-        Policy.RoamingPartner partner2 = new Policy.RoamingPartner();
-        partner2.setFqdn("partner2.com");
-        partner2.setFqdnExactMatch(false);
-        partner2.setPriority(42);
-        partner2.setCountries("ca,fr");
-        preferredRoamingPartnerList.add(partner1);
-        preferredRoamingPartnerList.add(partner2);
-        policy.setPreferredRoamingPartnerList(preferredRoamingPartnerList);
-
-        UpdateParameter policyUpdate = new UpdateParameter();
-        policyUpdate.setUpdateIntervalInMinutes(1712);
-        policyUpdate.setUpdateMethod(UpdateParameter.UPDATE_METHOD_OMADM);
-        policyUpdate.setRestriction(UpdateParameter.UPDATE_RESTRICTION_HOMESP);
-        policyUpdate.setServerUri("policy.update.com");
-        policyUpdate.setUsername("username");
-        policyUpdate.setBase64EncodedPassword(
-                Base64.encodeToString("password".getBytes(), Base64.DEFAULT));
-        policyUpdate.setTrustRootCertUrl("trust.cert.com");
-        policyUpdate.setTrustRootCertSha256Fingerprint(new byte[32]);
-        policy.setPolicyUpdate(policyUpdate);
-
-        return policy;
-    }
-
-    /**
-     * Helper function for verifying Policy after parcel write then read.
-     * @param policyToWrite
-     * @throws Exception
-     */
-    private static void verifyParcel(Policy policyToWrite) throws Exception {
-        Parcel parcel = Parcel.obtain();
-        policyToWrite.writeToParcel(parcel, 0);
-
-        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        Policy policyFromRead = Policy.CREATOR.createFromParcel(parcel);
-        assertTrue(policyFromRead.equals(policyToWrite));
-    }
-
-    /**
-     * Verify parcel read/write for an empty Policy.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithEmptyPolicy() throws Exception {
-        verifyParcel(new Policy());
-    }
-
-    /**
-     * Verify parcel read/write for a Policy with all fields set.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithFullPolicy() throws Exception {
-        verifyParcel(createPolicy());
-    }
-
-    /**
-     * Verify parcel read/write for a Policy without protocol port map.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutProtoPortMap() throws Exception {
-        Policy policy = createPolicy();
-        policy.setRequiredProtoPortMap(null);
-        verifyParcel(policy);
-    }
-
-    /**
-     * Verify parcel read/write for a Policy without preferred roaming partner list.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutPreferredRoamingPartnerList() throws Exception {
-        Policy policy = createPolicy();
-        policy.setPreferredRoamingPartnerList(null);
-        verifyParcel(policy);
-    }
-
-    /**
-     * Verify parcel read/write for a Policy without policy update parameters.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithoutPolicyUpdate() throws Exception {
-        Policy policy = createPolicy();
-        policy.setPolicyUpdate(null);
-        verifyParcel(policy);
-    }
-
-    /**
-     * Verify that policy created using copy constructor with null source should be the same
-     * as the policy created using default constructor.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyCopyConstructionWithNullSource() throws Exception {
-        Policy copyPolicy = new Policy(null);
-        Policy defaultPolicy = new Policy();
-        assertTrue(defaultPolicy.equals(copyPolicy));
-    }
-
-    /**
-     * Verify that policy created using copy constructor with a valid source should be the
-     * same as the source.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyCopyConstructionWithFullPolicy() throws Exception {
-        Policy policy = createPolicy();
-        Policy copyPolicy = new Policy(policy);
-        assertTrue(policy.equals(copyPolicy));
-    }
-
-    /**
-     * Verify that a default policy (with no informatio) is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validatePolicyWithDefault() throws Exception {
-        Policy policy = new Policy();
-        assertFalse(policy.validate());
-    }
-
-    /**
-     * Verify that a policy created using {@link #createPolicy} is valid, since all fields are
-     * filled in with valid values.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validatePolicyWithFullPolicy() throws Exception {
-        assertTrue(createPolicy().validate());
-    }
-
-    /**
-     * Verify that a policy without policy update parameters is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validatePolicyWithoutPolicyUpdate() throws Exception {
-        Policy policy = createPolicy();
-        policy.setPolicyUpdate(null);
-        assertFalse(policy.validate());
-    }
-
-    /**
-     * Verify that a policy with invalid policy update parameters is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validatePolicyWithInvalidPolicyUpdate() throws Exception {
-        Policy policy = createPolicy();
-        policy.setPolicyUpdate(new UpdateParameter());
-        assertFalse(policy.validate());
-    }
-
-    /**
-     * Verify that a policy with a preferred roaming partner with FQDN not specified is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validatePolicyWithRoamingPartnerWithoutFQDN() throws Exception {
-        Policy policy = createPolicy();
-        Policy.RoamingPartner partner = new Policy.RoamingPartner();
-        partner.setFqdnExactMatch(true);
-        partner.setPriority(12);
-        partner.setCountries("us,jp");
-        policy.getPreferredRoamingPartnerList().add(partner);
-        assertFalse(policy.validate());
-    }
-
-    /**
-     * Verify that a policy with a preferred roaming partner with countries not specified is
-     * invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validatePolicyWithRoamingPartnerWithoutCountries() throws Exception {
-        Policy policy = createPolicy();
-        Policy.RoamingPartner partner = new Policy.RoamingPartner();
-        partner.setFqdn("test.com");
-        partner.setFqdnExactMatch(true);
-        partner.setPriority(12);
-        policy.getPreferredRoamingPartnerList().add(partner);
-        assertFalse(policy.validate());
-    }
-
-    /**
-     * Verify that a policy with a proto-port tuple that contains an invalid port string is
-     * invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validatePolicyWithInvalidPortStringInProtoPortMap() throws Exception {
-        Policy policy = createPolicy();
-        byte[] rawPortBytes = new byte[MAX_PORT_STRING_BYTES + 1];
-        policy.getRequiredProtoPortMap().put(
-                324, new String(rawPortBytes, StandardCharsets.UTF_8));
-        assertFalse(policy.validate());
-    }
-
-    /**
-     * Verify that a policy with number of excluded SSIDs exceeded the max is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validatePolicyWithSsidExclusionListSizeExceededMax() throws Exception {
-        Policy policy = createPolicy();
-        String[] excludedSsidList = new String[MAX_NUMBER_OF_EXCLUDED_SSIDS + 1];
-        Arrays.fill(excludedSsidList, "ssid");
-        policy.setExcludedSsidList(excludedSsidList);
-        assertFalse(policy.validate());
-    }
-
-    /**
-     * Verify that a policy with an invalid SSID in the excluded SSID list is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validatePolicyWithInvalidSsid() throws Exception {
-        Policy policy = createPolicy();
-        byte[] rawSsidBytes = new byte[MAX_SSID_BYTES + 1];
-        Arrays.fill(rawSsidBytes, (byte) 'a');
-        String[] excludedSsidList = new String[] {
-                new String(rawSsidBytes, StandardCharsets.UTF_8)};
-        policy.setExcludedSsidList(excludedSsidList);
-        assertFalse(policy.validate());
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/hotspot2/pps/UpdateParameterTest.java b/wifi/tests/src/android/net/wifi/hotspot2/pps/UpdateParameterTest.java
deleted file mode 100644
index 07cb151..0000000
--- a/wifi/tests/src/android/net/wifi/hotspot2/pps/UpdateParameterTest.java
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package android.net.wifi.hotspot2.pps;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.net.wifi.FakeKeys;
-import android.os.Parcel;
-import android.util.Base64;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-
-/**
- * Unit tests for {@link android.net.wifi.hotspot2.pps.UpdateParameter}.
- */
-@SmallTest
-public class UpdateParameterTest {
-    private static final int MAX_URI_BYTES = 1023;
-    private static final int MAX_URL_BYTES = 1023;
-    private static final int MAX_USERNAME_BYTES = 63;
-    private static final int MAX_PASSWORD_BYTES = 255;
-    private static final int CERTIFICATE_SHA256_BYTES = 32;
-
-    /**
-     * Helper function for creating a {@link UpdateParameter} for testing.
-     *
-     * @return {@link UpdateParameter}
-     */
-    private static UpdateParameter createUpdateParameter() {
-        UpdateParameter updateParam = new UpdateParameter();
-        updateParam.setUpdateIntervalInMinutes(1712);
-        updateParam.setUpdateMethod(UpdateParameter.UPDATE_METHOD_OMADM);
-        updateParam.setRestriction(UpdateParameter.UPDATE_RESTRICTION_HOMESP);
-        updateParam.setServerUri("server.pdate.com");
-        updateParam.setUsername("username");
-        updateParam.setBase64EncodedPassword(
-                Base64.encodeToString("password".getBytes(), Base64.DEFAULT));
-        updateParam.setTrustRootCertUrl("trust.cert.com");
-        updateParam.setTrustRootCertSha256Fingerprint(new byte[32]);
-        updateParam.setCaCertificate(FakeKeys.CA_CERT0);
-        return updateParam;
-    }
-
-    /**
-     * Helper function for verifying UpdateParameter after parcel write then read.
-     * @param paramToWrite The UpdateParamter to verify
-     * @throws Exception
-     */
-    private static void verifyParcel(UpdateParameter paramToWrite) throws Exception {
-        Parcel parcel = Parcel.obtain();
-        paramToWrite.writeToParcel(parcel, 0);
-
-        parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
-        UpdateParameter paramFromRead = UpdateParameter.CREATOR.createFromParcel(parcel);
-        assertTrue(paramFromRead.equals(paramToWrite));
-        assertEquals(paramToWrite.hashCode(), paramFromRead.hashCode());
-    }
-
-    /**
-     * Verify parcel read/write for an empty UpdateParameter.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithEmptyUpdateParameter() throws Exception {
-        verifyParcel(new UpdateParameter());
-    }
-
-    /**
-     * Verify parcel read/write for a UpdateParameter with all fields set.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyParcelWithFullUpdateParameter() throws Exception {
-        verifyParcel(createUpdateParameter());
-    }
-
-    /**
-     * Verify that UpdateParameter created using copy constructor with null source should be the
-     * same as the UpdateParameter created using default constructor.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyCopyConstructionWithNullSource() throws Exception {
-        UpdateParameter copyParam = new UpdateParameter(null);
-        UpdateParameter defaultParam = new UpdateParameter();
-        assertTrue(defaultParam.equals(copyParam));
-    }
-
-    /**
-     * Verify that UpdateParameter created using copy constructor with a valid source should be the
-     * same as the source.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void verifyCopyConstructionWithFullUpdateParameter() throws Exception {
-        UpdateParameter origParam = createUpdateParameter();
-        UpdateParameter copyParam = new UpdateParameter(origParam);
-        assertTrue(origParam.equals(copyParam));
-    }
-
-    /**
-     * Verify that a default UpdateParameter is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithDefault() throws Exception {
-        UpdateParameter updateParam = new UpdateParameter();
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter created using {@link #createUpdateParameter} is valid,
-     * since all fields are filled in with valid values.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithFullPolicy() throws Exception {
-        assertTrue(createUpdateParameter().validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with an unknown update method is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithUnknowMethod() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        updateParam.setUpdateMethod("adsfasd");
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with an unknown restriction is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithUnknowRestriction() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        updateParam.setRestriction("adsfasd");
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with an username exceeding maximum size is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithUsernameExceedingMaxSize() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        byte[] rawUsernameBytes = new byte[MAX_USERNAME_BYTES + 1];
-        Arrays.fill(rawUsernameBytes, (byte) 'a');
-        updateParam.setUsername(new String(rawUsernameBytes, StandardCharsets.UTF_8));
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with an empty username is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithEmptyUsername() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        updateParam.setUsername(null);
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with a password exceeding maximum size is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithPasswordExceedingMaxSize() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        byte[] rawPasswordBytes = new byte[MAX_PASSWORD_BYTES + 1];
-        Arrays.fill(rawPasswordBytes, (byte) 'a');
-        updateParam.setBase64EncodedPassword(new String(rawPasswordBytes, StandardCharsets.UTF_8));
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with an empty password is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithEmptyPassword() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        updateParam.setBase64EncodedPassword(null);
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with a Base64 encoded password that contained invalid padding
-     * is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithPasswordContainedInvalidPadding() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        updateParam.setBase64EncodedPassword(updateParam.getBase64EncodedPassword() + "=");
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter without trust root certificate URL is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithoutTrustRootCertUrl() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        updateParam.setTrustRootCertUrl(null);
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with invalid trust root certificate URL is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithInvalidTrustRootCertUrl() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        byte[] rawUrlBytes = new byte[MAX_URL_BYTES + 1];
-        Arrays.fill(rawUrlBytes, (byte) 'a');
-        updateParam.setTrustRootCertUrl(new String(rawUrlBytes, StandardCharsets.UTF_8));
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter without trust root certificate SHA-256 fingerprint is
-     * invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithouttrustRootCertSha256Fingerprint() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        updateParam.setTrustRootCertSha256Fingerprint(null);
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with an incorrect size trust root certificate SHA-256
-     * fingerprint is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithInvalidtrustRootCertSha256Fingerprint() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        updateParam.setTrustRootCertSha256Fingerprint(new byte[CERTIFICATE_SHA256_BYTES + 1]);
-        assertFalse(updateParam.validate());
-
-        updateParam.setTrustRootCertSha256Fingerprint(new byte[CERTIFICATE_SHA256_BYTES - 1]);
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter without server URI is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithoutServerUri() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        updateParam.setServerUri(null);
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with an invalid server URI is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validatePolicyWithInvalidServerUri() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        byte[] rawUriBytes = new byte[MAX_URI_BYTES + 1];
-        Arrays.fill(rawUriBytes, (byte) 'a');
-        updateParam.setServerUri(new String(rawUriBytes, StandardCharsets.UTF_8));
-        assertFalse(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with update interval set to "never" will not perform
-     * validation on other parameters, since update is not applicable in this case.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithNoServerCheck() throws Exception {
-        UpdateParameter updateParam = new UpdateParameter();
-        updateParam.setUpdateIntervalInMinutes(UpdateParameter.UPDATE_CHECK_INTERVAL_NEVER);
-        updateParam.setUsername(null);
-        updateParam.setBase64EncodedPassword(null);
-        updateParam.setUpdateMethod(null);
-        updateParam.setRestriction(null);
-        updateParam.setServerUri(null);
-        updateParam.setTrustRootCertUrl(null);
-        updateParam.setTrustRootCertSha256Fingerprint(null);
-        assertTrue(updateParam.validate());
-    }
-
-    /**
-     * Verify that an UpdateParameter with unset update interval is invalid.
-     *
-     * @throws Exception
-     */
-    @Test
-    public void validateUpdateParameterWithoutUpdateInterval() throws Exception {
-        UpdateParameter updateParam = createUpdateParameter();
-        updateParam.setUpdateIntervalInMinutes(Long.MIN_VALUE);
-        assertFalse(updateParam.validate());
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pConfigTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pConfigTest.java
deleted file mode 100644
index 6199325..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/WifiP2pConfigTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.WifiP2pConfig}
- */
-@SmallTest
-public class WifiP2pConfigTest {
-
-    private static final String DEVICE_ADDRESS = "aa:bb:cc:dd:ee:ff";
-    /**
-     * Check network name setter
-     */
-    @Test
-    public void testBuilderInvalidNetworkName() throws Exception {
-        WifiP2pConfig.Builder b = new WifiP2pConfig.Builder();
-
-        // sunny case
-        try {
-            b.setNetworkName("DIRECT-ab-Hello");
-        } catch (IllegalArgumentException e) {
-            fail("Unexpected IllegalArgumentException");
-        }
-
-        // sunny case, no trailing string
-        try {
-            b.setNetworkName("DIRECT-WR");
-        } catch (IllegalArgumentException e) {
-            fail("Unexpected IllegalArgumentException");
-        }
-
-        // sunny case with maximum bytes for the network name
-        try {
-            b.setNetworkName("DIRECT-abcdefghijklmnopqrstuvwxy");
-        } catch (IllegalArgumentException e) {
-            fail("Unexpected IllegalArgumentException");
-        }
-
-        // less than 9 characters.
-        try {
-            b.setNetworkName("DIRECT-z");
-            fail("expected IllegalArgumentException");
-        } catch (IllegalArgumentException e) { }
-
-        // not starts with DIRECT-xy.
-        try {
-            b.setNetworkName("ABCDEFGHIJK");
-            fail("expected IllegalArgumentException");
-        } catch (IllegalArgumentException e) { }
-
-        // not starts with uppercase DIRECT-xy
-        try {
-            b.setNetworkName("direct-ab");
-            fail("expected IllegalArgumentException");
-        } catch (IllegalArgumentException e) { }
-
-        // x and y are not selected from upper case letters, lower case letters or
-        // numbers.
-        try {
-            b.setNetworkName("direct-a?");
-            fail("expected IllegalArgumentException");
-        } catch (IllegalArgumentException e) { }
-
-        // over maximum bytes
-        try {
-            b.setNetworkName("DIRECT-abcdefghijklmnopqrstuvwxyz");
-            fail("expected IllegalArgumentException");
-        } catch (IllegalArgumentException e) { }
-    }
-
-    /**
-     * Check passphrase setter
-     */
-    @Test
-    public void testBuilderInvalidPassphrase() throws Exception {
-        WifiP2pConfig.Builder b = new WifiP2pConfig.Builder();
-
-        // sunny case
-        try {
-            b.setPassphrase("abcd1234");
-        } catch (IllegalArgumentException e) {
-            fail("Unexpected IllegalArgumentException");
-        }
-
-        // null string.
-        try {
-            b.setPassphrase(null);
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // expected exception.
-        }
-
-        // less than 8 characters.
-        try {
-            b.setPassphrase("12abcde");
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // expected exception.
-        }
-
-        // more than 63 characters.
-        try {
-            b.setPassphrase(
-                    "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890+/");
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // expected exception.
-        }
-    }
-
-    @Test
-    /*
-     * Verify WifiP2pConfig basic operations
-     */
-    public void testWifiP2pConfig() throws Exception {
-        WifiP2pConfig config = new WifiP2pConfig();
-        config.deviceAddress = DEVICE_ADDRESS;
-
-        WifiP2pConfig copiedConfig = new WifiP2pConfig(config);
-        // no equals operator, use toString for comparison.
-        assertEquals(config.toString(), copiedConfig.toString());
-
-        Parcel parcelW = Parcel.obtain();
-        config.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiP2pConfig configFromParcel = WifiP2pConfig.CREATOR.createFromParcel(parcelR);
-
-        // no equals operator, use toString for comparison.
-        assertEquals(config.toString(), configFromParcel.toString());
-
-    }
-
-    @Test
-    /*
-     * Verify WifiP2pConfig invalidate API
-     */
-    public void testInvalidate() throws Exception {
-        WifiP2pConfig config = new WifiP2pConfig();
-        config.deviceAddress = DEVICE_ADDRESS;
-        config.invalidate();
-        assertEquals("", config.deviceAddress);
-    }
-
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceListTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceListTest.java
deleted file mode 100644
index 22936bd..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceListTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import static org.junit.Assert.assertEquals;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.WifiP2pDeviceList}
- */
-@SmallTest
-public class WifiP2pDeviceListTest {
-
-    private static final WifiP2pDevice TEST_DEVICE_1 = new WifiP2pDevice("aa:bb:cc:dd:ee:ff");
-    private static final WifiP2pDevice TEST_DEVICE_2 = new WifiP2pDevice("aa:bb:cc:dd:ee:f1");
-    private static final WifiP2pDevice TEST_DEVICE_3 = new WifiP2pDevice("11:22:33:44:55:66");
-    private static final WifiP2pDevice TEST_DEVICE_4 = new WifiP2pDevice("a0:b0:c0:d0:e0:f0");
-
-    /**
-     * Verify basic operations.
-     */
-    @Test
-    public void testListOperations() throws Exception {
-        WifiP2pDeviceList list = new WifiP2pDeviceList();
-        list.update(TEST_DEVICE_1);
-        list.update(TEST_DEVICE_2);
-        list.update(TEST_DEVICE_3);
-        assertEquals(3, list.getDeviceList().size());
-
-        assertEquals(TEST_DEVICE_1, list.get(TEST_DEVICE_1.deviceAddress));
-        assertEquals(null, list.get(TEST_DEVICE_4.deviceAddress));
-
-        list.remove(TEST_DEVICE_2.deviceAddress);
-        assertEquals(null, list.get(TEST_DEVICE_2.deviceAddress));
-
-        list.remove(TEST_DEVICE_3);
-        assertEquals(null, list.get(TEST_DEVICE_3.deviceAddress));
-
-        assertEquals(1, list.getDeviceList().size());
-
-        list.clear();
-        assertEquals(0, list.getDeviceList().size());
-
-        Parcel parcelW = Parcel.obtain();
-        list.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiP2pDeviceList fromParcel = WifiP2pDeviceList.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(list.toString(), fromParcel.toString());
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceTest.java
deleted file mode 100644
index 6edc287..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.WifiP2pDevice}
- */
-@SmallTest
-public class WifiP2pDeviceTest {
-
-    /**
-     * Compare two p2p devices.
-     *
-     * @param devA is the first device to be compared
-     * @param devB is the second device to be compared
-     */
-    private void compareWifiP2pDevices(WifiP2pDevice devA, WifiP2pDevice devB) {
-        assertEquals(devA.deviceName, devB.deviceName);
-        assertEquals(devA.deviceAddress, devB.deviceAddress);
-        assertEquals(devA.primaryDeviceType, devB.primaryDeviceType);
-        assertEquals(devA.secondaryDeviceType, devB.secondaryDeviceType);
-        assertEquals(devA.wpsConfigMethodsSupported, devB.wpsConfigMethodsSupported);
-        assertEquals(devA.deviceCapability, devB.deviceCapability);
-        assertEquals(devA.groupCapability, devB.groupCapability);
-        assertEquals(devA.status, devB.status);
-        if (devA.wfdInfo != null) {
-            assertEquals(devA.wfdInfo.isEnabled(), devB.wfdInfo.isEnabled());
-            assertEquals(devA.wfdInfo.getDeviceInfoHex(), devB.wfdInfo.getDeviceInfoHex());
-            assertEquals(devA.wfdInfo.getControlPort(), devB.wfdInfo.getControlPort());
-            assertEquals(devA.wfdInfo.getMaxThroughput(), devB.wfdInfo.getMaxThroughput());
-        } else {
-            assertEquals(devA.wfdInfo, devB.wfdInfo);
-        }
-    }
-
-    /**
-     * Check equals and hashCode consistency
-     */
-    @Test
-    public void testEqualsWithHashCode() throws Exception {
-        WifiP2pDevice dev_a = new WifiP2pDevice();
-        dev_a.deviceAddress = new String("02:90:4c:a0:92:54");
-        WifiP2pDevice dev_b = new WifiP2pDevice();
-        dev_b.deviceAddress = new String("02:90:4c:a0:92:54");
-
-        assertTrue(dev_a.equals(dev_b));
-        assertEquals(dev_a.hashCode(), dev_b.hashCode());
-    }
-
-    /**
-     * Check the copy constructor with default values.
-     */
-    @Test
-    public void testCopyConstructorWithDefaultValues() throws Exception {
-        WifiP2pDevice device = new WifiP2pDevice();
-        WifiP2pDevice copy = new WifiP2pDevice(device);
-        compareWifiP2pDevices(device, copy);
-    }
-
-    /**
-     * Check the copy constructor with updated values.
-     */
-    @Test
-    public void testCopyConstructorWithUpdatedValues() throws Exception {
-        WifiP2pDevice device = new WifiP2pDevice();
-        device.deviceName = "deviceName";
-        device.deviceAddress = "11:22:33:44:55:66";
-        device.primaryDeviceType = "primaryDeviceType";
-        device.secondaryDeviceType = "secondaryDeviceType";
-        device.wpsConfigMethodsSupported = 0x0008;
-        device.deviceCapability = 1;
-        device.groupCapability = 1;
-        device.status = WifiP2pDevice.CONNECTED;
-        device.wfdInfo = new WifiP2pWfdInfo();
-        WifiP2pDevice copy = new WifiP2pDevice(device);
-        compareWifiP2pDevices(device, copy);
-    }
-
-    /**
-     * Check the copy constructor when the wfdInfo of the source object is null.
-     */
-    @Test
-    public void testCopyConstructorWithNullWfdInfo() throws Exception {
-        WifiP2pDevice device = new WifiP2pDevice();
-        device.deviceName = "deviceName";
-        device.deviceAddress = "11:22:33:44:55:66";
-        device.primaryDeviceType = "primaryDeviceType";
-        device.secondaryDeviceType = "secondaryDeviceType";
-        device.wpsConfigMethodsSupported = 0x0008;
-        device.deviceCapability = 1;
-        device.groupCapability = 1;
-        device.status = WifiP2pDevice.CONNECTED;
-        device.wfdInfo = null;
-        WifiP2pDevice copy = new WifiP2pDevice(device);
-        compareWifiP2pDevices(device, copy);
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pGroupListTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pGroupListTest.java
deleted file mode 100644
index 2402f5b..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/WifiP2pGroupListTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.WifiP2pGroupList}
- */
-@SmallTest
-public class WifiP2pGroupListTest {
-
-    private static final WifiP2pDevice TEST_GROUP_OWNER_1 = new WifiP2pDevice("aa:bb:cc:dd:ee:f0");
-    private static final WifiP2pDevice TEST_GROUP_OWNER_2 = new WifiP2pDevice("aa:bb:cc:dd:ee:f1");
-    private static final WifiP2pDevice TEST_GROUP_OWNER_3 = new WifiP2pDevice("aa:bb:cc:dd:ee:f2");
-    private static final WifiP2pDevice TEST_GROUP_OWNER_OTHER =
-            new WifiP2pDevice("aa:bb:cc:dd:ee:f3");
-
-    private WifiP2pGroup mTestGroup1;
-    private WifiP2pGroup mTestGroup2;
-    private WifiP2pGroup mTestGroup3;
-    private WifiP2pGroup mTestGroup4;
-
-    private WifiP2pGroup createGroup(
-            int networkId, String networkName,
-            String passphrase, boolean isGo,
-            WifiP2pDevice goDev) {
-        WifiP2pGroup group = new WifiP2pGroup();
-        group.setNetworkId(networkId);
-        group.setNetworkName(networkName);
-        group.setPassphrase(passphrase);
-        group.setIsGroupOwner(isGo);
-        group.setOwner(goDev);
-        return group;
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        mTestGroup1 = createGroup(0, "testGroup1", "12345678", false, TEST_GROUP_OWNER_1);
-        mTestGroup2 = createGroup(1, "testGroup2", "12345678", true, TEST_GROUP_OWNER_2);
-        mTestGroup3 = createGroup(2, "testGroup3", "12345678", false, TEST_GROUP_OWNER_3);
-        mTestGroup4 = createGroup(3, "testGroup4", "12345678", false, TEST_GROUP_OWNER_1);
-    }
-
-    /**
-     * Verify basic operations.
-     */
-    @Test
-    public void testListOperations() throws Exception {
-        WifiP2pGroupList list = new WifiP2pGroupList();
-        list.add(mTestGroup1);
-        list.add(mTestGroup2);
-        list.add(mTestGroup3);
-        list.add(mTestGroup4);
-        assertEquals(4, list.getGroupList().size());
-
-        // in list
-        assertEquals(mTestGroup2.getNetworkId(),
-                list.getNetworkId(TEST_GROUP_OWNER_2.deviceAddress));
-        assertEquals(TEST_GROUP_OWNER_2.deviceAddress,
-                list.getOwnerAddr(mTestGroup2.getNetworkId()));
-        // not in list
-        assertEquals(-1, list.getNetworkId(TEST_GROUP_OWNER_OTHER.deviceAddress));
-        // if there are groups with the same GO, return the first one found.
-        assertEquals(mTestGroup1.getNetworkId(),
-                list.getNetworkId(TEST_GROUP_OWNER_1.deviceAddress));
-        // identify groups with the same GO, but different network names.
-        assertEquals(mTestGroup4.getNetworkId(),
-                list.getNetworkId(TEST_GROUP_OWNER_1.deviceAddress, "testGroup4"));
-
-        list.remove(mTestGroup3.getNetworkId());
-        assertEquals(-1, list.getNetworkId(TEST_GROUP_OWNER_3.deviceAddress));
-        assertFalse(list.contains(mTestGroup3.getNetworkId()));
-
-        assertEquals(3, list.getGroupList().size());
-
-        Parcel parcelW = Parcel.obtain();
-        list.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiP2pGroupList fromParcel = WifiP2pGroupList.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(list.toString(), fromParcel.toString());
-
-        list.clear();
-        assertEquals(0, list.getGroupList().size());
-
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pGroupTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pGroupTest.java
deleted file mode 100644
index 9473e42..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/WifiP2pGroupTest.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.WifiP2pGroup}
- */
-@SmallTest
-public class WifiP2pGroupTest {
-
-    private static final String INTERFACE = "p2p-p2p0-3";
-    private static final int NETWORK_ID = 9;
-    private static final String NETWORK_NAME = "DIRECT-xy-Hello";
-    private static final String PASSPHRASE = "HelloWorld";
-    private static final WifiP2pDevice GROUP_OWNER = new WifiP2pDevice("de:ad:be:ef:00:01");
-    private static final int FREQUENCY = 5300;
-    private static final WifiP2pDevice CLIENT_1 = new WifiP2pDevice("aa:bb:cc:dd:ee:01");
-    private static final WifiP2pDevice CLIENT_2 = new WifiP2pDevice("aa:bb:cc:dd:ee:02");
-
-    /**
-     * Verify setter/getter functions.
-     */
-    @Test
-    public void testSetterGetter() throws Exception {
-        WifiP2pGroup group = new WifiP2pGroup();
-
-        group.setInterface(INTERFACE);
-        group.setNetworkId(NETWORK_ID);
-        group.setNetworkName(NETWORK_NAME);
-        group.setPassphrase(PASSPHRASE);
-        group.setIsGroupOwner(false);
-        group.setOwner(GROUP_OWNER);
-        group.setFrequency(FREQUENCY);
-        group.addClient(CLIENT_1.deviceAddress);
-        group.addClient(CLIENT_2);
-
-        assertEquals(INTERFACE, group.getInterface());
-        assertEquals(NETWORK_ID, group.getNetworkId());
-        assertEquals(NETWORK_NAME, group.getNetworkName());
-        assertEquals(PASSPHRASE, group.getPassphrase());
-        assertFalse(group.isGroupOwner());
-        assertEquals(GROUP_OWNER, group.getOwner());
-        assertEquals(FREQUENCY, group.getFrequency());
-
-        assertFalse(group.isClientListEmpty());
-        assertTrue(group.contains(CLIENT_1));
-
-        assertEquals(2, group.getClientList().size());
-
-        group.removeClient(CLIENT_1);
-        group.removeClient(CLIENT_2.deviceAddress);
-        assertFalse(group.contains(CLIENT_1));
-        assertTrue(group.isClientListEmpty());
-
-        Parcel parcelW = Parcel.obtain();
-        group.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiP2pGroup fromParcel = WifiP2pGroup.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(group.toString(), fromParcel.toString());
-
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pInfoTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pInfoTest.java
deleted file mode 100644
index e207ca1..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/WifiP2pInfoTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import static org.junit.Assert.assertEquals;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import java.net.InetAddress;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.WifiP2pInfo}
- */
-@SmallTest
-public class WifiP2pInfoTest {
-
-    private InetAddress mGroupOnwerIpv4Address;
-
-    @Before
-    public void setUp() throws Exception {
-        byte[] ipv4 = {(byte) 192, (byte) 168, (byte) 49, (byte) 1};
-        mGroupOnwerIpv4Address = InetAddress.getByAddress(ipv4);
-    }
-
-    /**
-     * Verifies copy constructor.
-     */
-    @Test
-    public void testCopyOperator() throws Exception {
-        WifiP2pInfo info = new WifiP2pInfo();
-        info.groupFormed = true;
-        info.isGroupOwner = true;
-        info.groupOwnerAddress = mGroupOnwerIpv4Address;
-
-        WifiP2pInfo copiedInfo = new WifiP2pInfo(info);
-
-        // no equals operator, use toString for data comparison.
-        assertEquals(info.toString(), copiedInfo.toString());
-    }
-
-    /**
-     * Verifies parcel serialization/deserialization.
-     */
-    @Test
-    public void testParcelOperation() throws Exception {
-        WifiP2pInfo info = new WifiP2pInfo();
-        info.groupFormed = true;
-        info.isGroupOwner = true;
-        info.groupOwnerAddress = mGroupOnwerIpv4Address;
-
-        Parcel parcelW = Parcel.obtain();
-        info.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiP2pInfo fromParcel = WifiP2pInfo.CREATOR.createFromParcel(parcelR);
-
-        // no equals operator, use toString for data comparison.
-        assertEquals(info.toString(), fromParcel.toString());
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pManagerTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pManagerTest.java
deleted file mode 100644
index 9e8dca4..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/WifiP2pManagerTest.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.verify;
-
-import android.content.Context;
-import android.os.test.TestLooper;
-
-import androidx.test.filters.SmallTest;
-
-import libcore.junit.util.ResourceLeakageDetector;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-/**
- * Unit test harness for WifiP2pManager.
- */
-@SmallTest
-public class WifiP2pManagerTest {
-    private WifiP2pManager mDut;
-    private TestLooper mTestLooper;
-
-    @Mock
-    public Context mContextMock;
-    @Mock
-    IWifiP2pManager mP2pServiceMock;
-
-    @Rule
-    public ResourceLeakageDetector.LeakageDetectorRule leakageDetectorRule =
-            ResourceLeakageDetector.getRule();
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        mDut = new WifiP2pManager(mP2pServiceMock);
-        mTestLooper = new TestLooper();
-    }
-
-    /**
-     * Validate that on finalize we close the channel and flag a resource leakage.
-     */
-    @Test
-    public void testChannelFinalize() throws Exception {
-        try (WifiP2pManager.Channel channel = new WifiP2pManager.Channel(mContextMock,
-                mTestLooper.getLooper(), null, null, mDut)) {
-            leakageDetectorRule.assertUnreleasedResourceCount(channel, 1);
-        }
-    }
-
-    /**
-     * Validate that when close is called on a channel it frees up resources (i.e. don't
-     * get flagged again on finalize).
-     */
-    @Test
-    public void testChannelClose() throws Exception {
-        WifiP2pManager.Channel channel = new WifiP2pManager.Channel(mContextMock,
-                mTestLooper.getLooper(), null, null, mDut);
-
-        channel.close();
-        verify(mP2pServiceMock).close(any());
-
-        leakageDetectorRule.assertUnreleasedResourceCount(channel, 0);
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pProvDiscEventTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pProvDiscEventTest.java
deleted file mode 100644
index e3b10a7..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/WifiP2pProvDiscEventTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.WifiP2pProvDiscEvent}
- */
-@SmallTest
-public class WifiP2pProvDiscEventTest {
-
-    private static final String DEVICE_ADDRESS = "aa:bb:cc:dd:ee:ff";
-    private static final String EVENT_PBC_REQ_STRING = "P2P-PROV-DISC-PBC-REQ";
-    private static final String EVENT_PBC_RSP_STRING = "P2P-PROV-DISC-PBC-RESP";
-    private static final String EVENT_ENTER_PIN_STRING = "P2P-PROV-DISC-ENTER-PIN";
-    private static final String EVENT_SHOW_PIN_STRING = "P2P-PROV-DISC-SHOW-PIN";
-    private static final String TEST_PIN = "44490607";
-
-    /**
-     * Test parsing PBC request event.
-     */
-    @Test
-    public void testPbcReqEvent() throws Exception {
-        WifiP2pProvDiscEvent event =
-                new WifiP2pProvDiscEvent(EVENT_PBC_REQ_STRING + " " + DEVICE_ADDRESS);
-        assertEquals(WifiP2pProvDiscEvent.PBC_REQ, event.event);
-        assertEquals(DEVICE_ADDRESS, event.device.deviceAddress);
-    }
-
-
-    /**
-     * Test parsing PBC response event.
-     */
-    @Test
-    public void testPbcRespEvent() throws Exception {
-        WifiP2pProvDiscEvent event =
-                new WifiP2pProvDiscEvent(EVENT_PBC_RSP_STRING + " " + DEVICE_ADDRESS);
-        assertEquals(WifiP2pProvDiscEvent.PBC_RSP, event.event);
-        assertEquals(DEVICE_ADDRESS, event.device.deviceAddress);
-    }
-
-    /**
-     * Test parsing ENTER-PIN event.
-     */
-    @Test
-    public void testEnterPinEvent() throws Exception {
-        WifiP2pProvDiscEvent event =
-                new WifiP2pProvDiscEvent(EVENT_ENTER_PIN_STRING + " " + DEVICE_ADDRESS);
-        assertEquals(WifiP2pProvDiscEvent.ENTER_PIN, event.event);
-        assertEquals(DEVICE_ADDRESS, event.device.deviceAddress);
-    }
-
-    /**
-     * Test parsing SHOW-PIN event.
-     */
-    @Test
-    public void testShowPinEvent() throws Exception {
-        WifiP2pProvDiscEvent event =
-                new WifiP2pProvDiscEvent(
-                        EVENT_SHOW_PIN_STRING + " " + DEVICE_ADDRESS + " " + TEST_PIN);
-        assertEquals(WifiP2pProvDiscEvent.SHOW_PIN, event.event);
-        assertEquals(DEVICE_ADDRESS, event.device.deviceAddress);
-        assertEquals(TEST_PIN, event.pin);
-    }
-
-    /**
-     * Test parsing malformed input.
-     */
-    @Test
-    public void testMalformedInput() throws Exception {
-        try {
-            WifiP2pProvDiscEvent event = new WifiP2pProvDiscEvent("OneToken");
-            fail("Should throw IllegalArgumentException exception.");
-        } catch (IllegalArgumentException ex) {
-            // expected exception.
-        }
-    }
-
-    /**
-     * Test parsing malformed event.
-     */
-    @Test
-    public void testMalformedEvent() throws Exception {
-        try {
-            WifiP2pProvDiscEvent event = new WifiP2pProvDiscEvent("XXX " + DEVICE_ADDRESS);
-            fail("Should throw IllegalArgumentException exception.");
-        } catch (IllegalArgumentException ex) {
-            // expected exception.
-        }
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/WifiP2pWfdInfoTest.java b/wifi/tests/src/android/net/wifi/p2p/WifiP2pWfdInfoTest.java
deleted file mode 100644
index 2a9b36b..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/WifiP2pWfdInfoTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import android.os.Parcel;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.WifiP2pWfdInfo}
- */
-@SmallTest
-public class WifiP2pWfdInfoTest {
-
-    private static final int TEST_CTRL_PORT = 9999;
-    private static final int TEST_MAX_TPUT = 1024;
-
-    private WifiP2pWfdInfo mSourceInfo = new WifiP2pWfdInfo(
-            0,
-            TEST_CTRL_PORT,
-            TEST_MAX_TPUT);
-
-    @Before
-    public void setUp() {
-        // initialize device info flags.
-        mSourceInfo.setDeviceType(WifiP2pWfdInfo.DEVICE_TYPE_WFD_SOURCE);
-        mSourceInfo.setSessionAvailable(true);
-        mSourceInfo.setContentProtectionSupported(true);
-    }
-
-    /**
-     * Verifies setters/getters.
-     */
-    @Test
-    public void testSettersGetters() throws Exception {
-        WifiP2pWfdInfo info = new WifiP2pWfdInfo();
-
-        info.setEnabled(true);
-        assertTrue(info.isEnabled());
-
-        info.setDeviceType(WifiP2pWfdInfo.DEVICE_TYPE_WFD_SOURCE);
-        assertEquals(WifiP2pWfdInfo.DEVICE_TYPE_WFD_SOURCE, info.getDeviceType());
-
-        info.setSessionAvailable(true);
-        assertTrue(info.isSessionAvailable());
-
-        info.setContentProtectionSupported(true);
-        assertTrue(info.isContentProtectionSupported());
-
-        info.setControlPort(TEST_CTRL_PORT);
-        assertEquals(TEST_CTRL_PORT, info.getControlPort());
-
-        info.setMaxThroughput(TEST_MAX_TPUT);
-        assertEquals(TEST_MAX_TPUT, info.getMaxThroughput());
-
-        assertEquals("0110270f0400", info.getDeviceInfoHex());
-    }
-
-    /**
-     * Verifies copy constructor.
-     */
-    @Test
-    public void testCopyOperator() throws Exception {
-        WifiP2pWfdInfo copiedInfo = new WifiP2pWfdInfo(mSourceInfo);
-
-        // no equals operator, use toString for data comparison.
-        assertEquals(mSourceInfo.toString(), copiedInfo.toString());
-    }
-
-    /**
-     * Verifies parcel serialization/deserialization.
-     */
-    @Test
-    public void testParcelOperation() throws Exception {
-        Parcel parcelW = Parcel.obtain();
-        mSourceInfo.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        WifiP2pWfdInfo fromParcel = WifiP2pWfdInfo.CREATOR.createFromParcel(parcelR);
-
-        // no equals operator, use toString for data comparison.
-        assertEquals(mSourceInfo.toString(), fromParcel.toString());
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfoTest.java b/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfoTest.java
deleted file mode 100644
index e1cffee..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfoTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import static org.junit.Assert.fail;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceInfo}
- */
-@SmallTest
-public class WifiP2pDnsSdServiceInfoTest {
-
-    private static final String INSTANCE_NAME = "MyPrinter";
-    private static final String SERVICE_TYPE = "_ipp._tcp";
-    private static final String TXTRECORD_PROP_AVAILABLE = "available";
-    private static final String TXTRECORD_PROP_AVAILABLE_VISABLE = "visable";
-
-    private Map<String, String> mTxtMap = new HashMap<>();
-
-    @Before
-    public void setUp() throws Exception {
-        mTxtMap.put(TXTRECORD_PROP_AVAILABLE, TXTRECORD_PROP_AVAILABLE_VISABLE);
-    }
-
-    /**
-     * Verify newInstance API
-     */
-    @Test
-    public void testNewInstance() throws Exception {
-        WifiP2pDnsSdServiceInfo info = null;
-
-        // the least arguments
-        info = WifiP2pDnsSdServiceInfo.newInstance(
-                INSTANCE_NAME,
-                SERVICE_TYPE,
-                null);
-
-        // all arguments are given.
-        info = WifiP2pDnsSdServiceInfo.newInstance(
-                INSTANCE_NAME,
-                SERVICE_TYPE,
-                mTxtMap);
-
-        // failure case due to no instance name.
-        try {
-            info = WifiP2pDnsSdServiceInfo.newInstance(
-                    null,
-                    SERVICE_TYPE,
-                    null);
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException ex) {
-            // expected exception.
-        }
-
-        // failure case due to no service type.
-        try {
-            info = WifiP2pDnsSdServiceInfo.newInstance(
-                    INSTANCE_NAME,
-                    null,
-                    null);
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException ex) {
-            // expected exception.
-        }
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequestTest.java b/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequestTest.java
deleted file mode 100644
index 7d46a5f..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequestTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import static org.junit.Assert.fail;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.nsd.WifiP2pDnsSdServiceRequest}
- */
-@SmallTest
-public class WifiP2pDnsSdServiceRequestTest {
-
-    private static final String SERVICE_NAME = "MyPrinter";
-    private static final String SERVICE_TYPE = "_ipp._tcp";
-
-    @Test
-    public void testNewInstance() throws Exception {
-        WifiP2pDnsSdServiceRequest request = null;
-
-        // default new instance
-        request = WifiP2pDnsSdServiceRequest.newInstance();
-
-        // set service type
-        request = WifiP2pDnsSdServiceRequest.newInstance(SERVICE_TYPE);
-
-        // set service type
-        request = WifiP2pDnsSdServiceRequest.newInstance(SERVICE_NAME, SERVICE_TYPE);
-
-        // failure case due to null service type
-        try {
-            request = WifiP2pDnsSdServiceRequest.newInstance(null);
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException ex) {
-            // expected exception.
-        }
-
-        // failure case due to null service name
-        try {
-            request = WifiP2pDnsSdServiceRequest.newInstance(SERVICE_NAME, null);
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException ex) {
-            // expected exception.
-        }
-
-        // failure case due to null service type
-        try {
-            request = WifiP2pDnsSdServiceRequest.newInstance(null, SERVICE_TYPE);
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException ex) {
-            // expected exception.
-        }
-
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfoTest.java b/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfoTest.java
deleted file mode 100644
index 49ead11..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfoTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import static org.junit.Assert.fail;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.nsd.WifiP2pUpnpServiceInfo}
- */
-@SmallTest
-public class WifiP2pUpnpServiceInfoTest {
-
-    private static final String UUID = "6859dede-8574-59ab-9332-123456789012";
-    private static final String DEVICE = "aa:bb:cc:dd:ee:ff";
-
-    private List<String> mServiceList = new ArrayList<>();
-
-    @Before
-    public void setUp() throws Exception {
-        mServiceList.add("urn:schemas-upnp-org:service:ContentDirectory:1");
-    }
-
-    /**
-     * Verify newInstance API
-     */
-    @Test
-    public void testNewInstance() throws Exception {
-        WifiP2pUpnpServiceInfo info = null;
-
-        // the least arguments
-        info = WifiP2pUpnpServiceInfo.newInstance(
-                UUID, DEVICE, null);
-
-        // all arguments are given.
-        info = WifiP2pUpnpServiceInfo.newInstance(
-                UUID, DEVICE, mServiceList);
-
-        // failure case due to no UUID.
-        try {
-            info = WifiP2pUpnpServiceInfo.newInstance(
-                    null, DEVICE, null);
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException ex) {
-            // expected exception.
-        }
-
-        // failure case due to no device.
-        try {
-            info = WifiP2pUpnpServiceInfo.newInstance(
-                    UUID,
-                    null,
-                    null);
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException ex) {
-            // expected exception.
-        }
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequestTest.java b/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequestTest.java
deleted file mode 100644
index 79930dc..0000000
--- a/wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequestTest.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.p2p.nsd;
-
-import static org.junit.Assert.fail;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Test;
-
-/**
- * Unit test harness for {@link android.net.wifi.p2p.nsd.WifiP2pUpnpServiceRequest}
- */
-@SmallTest
-public class WifiP2pUpnpServiceRequestTest {
-
-    @Test
-    public void testNewInstance() throws Exception {
-        WifiP2pUpnpServiceRequest request = null;
-
-        // Create a service discovery request to search all UPnP services.
-        request = WifiP2pUpnpServiceRequest.newInstance();
-
-        // Create a service discovery request to search specified UPnP services.
-        request = WifiP2pUpnpServiceRequest.newInstance("ssdp:all");
-
-        // failure case due to null target string
-        try {
-            request = WifiP2pUpnpServiceRequest.newInstance(null);
-            fail("should throw IllegalArgumentException");
-        } catch (IllegalArgumentException ex) {
-            // expected exception.
-        }
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/rtt/CivicLocationTest.java b/wifi/tests/src/android/net/wifi/rtt/CivicLocationTest.java
deleted file mode 100644
index f746fb7..0000000
--- a/wifi/tests/src/android/net/wifi/rtt/CivicLocationTest.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertNull;
-import static junit.framework.Assert.assertTrue;
-
-import android.location.Address;
-import android.os.Parcel;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for {@link CivicLocation}.
- */
-@RunWith(JUnit4.class)
-public class CivicLocationTest {
-    private static final String sUsCountryCode = "US";
-
-    private static final byte[] sEmptyBuffer = {};
-
-    private static final byte[] sTestCivicLocationBuffer = {
-            (byte) 17,
-            (byte) 3,
-            (byte) 'a',
-            (byte) 'b',
-            (byte) 'c',
-            (byte) 4,
-            (byte) 4,
-            (byte) 'd',
-            (byte) 'e',
-            (byte) 'f',
-            (byte) 'g',
-            (byte) 12,
-            (byte) 1,
-            (byte) 'h'
-    };
-
-    private static final byte[] sTestCivicLocationBufferWithAddress = {
-            (byte) CivicLocationKeys.HNO,
-            (byte) 2,
-            (byte) '1',
-            (byte) '5',
-            (byte) CivicLocationKeys.PRIMARY_ROAD_NAME,
-            (byte) 4,
-            (byte) 'A',
-            (byte) 'l',
-            (byte) 't',
-            (byte) 'o',
-            (byte) CivicLocationKeys.STREET_NAME_POST_MODIFIER,
-            (byte) 4,
-            (byte) 'R',
-            (byte) 'o',
-            (byte) 'a',
-            (byte) 'd',
-            (byte) CivicLocationKeys.CITY,
-            (byte) 8,
-            (byte) 'M',
-            (byte) 't',
-            (byte) 'n',
-            (byte) ' ',
-            (byte) 'V',
-            (byte) 'i',
-            (byte) 'e',
-            (byte) 'w',
-            (byte) CivicLocationKeys.STATE,
-            (byte) 2,
-            (byte) 'C',
-            (byte) 'A',
-            (byte) CivicLocationKeys.POSTAL_CODE,
-            (byte) 5,
-            (byte) '9',
-            (byte) '4',
-            (byte) '0',
-            (byte) '4',
-            (byte) '3'
-    };
-
-    /**
-     * Test inValid for null CountryCode.
-     */
-    @Test
-    public void testCivicLocationNullCountryCode() {
-        CivicLocation civicLocation = new CivicLocation(sTestCivicLocationBuffer, null);
-
-        boolean valid = civicLocation.isValid();
-
-        assertFalse(valid);
-    }
-
-    /**
-     * Test inValid for CountryCode too short.
-     */
-    @Test
-    public void testCivicLocationCountryCodeTooShort() {
-        CivicLocation civicLocation = new CivicLocation(sTestCivicLocationBuffer, "X");
-
-        boolean valid = civicLocation.isValid();
-
-        assertFalse(valid);
-    }
-
-    /**
-     * Test inValid for CountryCode too long.
-     */
-    @Test
-    public void testCivicLocationCountryCodeTooLong() {
-        CivicLocation civicLocation = new CivicLocation(sTestCivicLocationBuffer, "XYZ");
-
-        boolean valid = civicLocation.isValid();
-
-        assertFalse(valid);
-    }
-
-    /**
-     * Test inValid for null CivicLocation Buffer
-     */
-    @Test
-    public void testCivicLocationNullBuffer() {
-        CivicLocation civicLocation = new CivicLocation(null, sUsCountryCode);
-
-        boolean valid = civicLocation.isValid();
-
-        assertFalse(valid);
-    }
-
-    /**
-     * Test inValid for Empty CivicLocation Buffer.
-     */
-    @Test
-    public void testCivicLocationEmptyBuffer() {
-        CivicLocation civicLocation = new CivicLocation(sEmptyBuffer, sUsCountryCode);
-
-        boolean valid = civicLocation.isValid();
-
-        assertFalse(valid);
-    }
-
-    /**
-     * Test for valid CivicLocationBuffer and Country Code.
-     */
-    @Test
-    public void testCivicLocationValid() {
-        CivicLocation civicLocation = new CivicLocation(sTestCivicLocationBuffer, sUsCountryCode);
-
-        boolean valid = civicLocation.isValid();
-
-        assertTrue(valid);
-    }
-
-    /**
-     * Test toString Representation
-     */
-    @Test
-    public void testCivicLocationToString() {
-        CivicLocation civicLocation = new CivicLocation(sTestCivicLocationBuffer, sUsCountryCode);
-
-        String str = civicLocation.toString();
-
-        assertEquals("{4=defg, 12=h, 17=abc}", str);
-    }
-
-    /**
-     * Test the toString
-     */
-    @Test
-    public void testCivicLocationgetElementValue() {
-        CivicLocation civicLocation = new CivicLocation(sTestCivicLocationBuffer, sUsCountryCode);
-
-        String value1 = civicLocation.getCivicElementValue(4);
-        String value2 = civicLocation.getCivicElementValue(17);
-        String value3 = civicLocation.getCivicElementValue(12);
-        String value4 = civicLocation.getCivicElementValue(156); // not in test data
-        String value5 = civicLocation.getCivicElementValue(276); // greater than key index
-
-        assertEquals("defg", value1);
-        assertEquals("abc", value2);
-        assertEquals("h", value3);
-        assertNull(value4);
-        assertNull(value5);
-    }
-
-    /* Test toAddress representation */
-    @Test
-    public void testCivicLocationToAddress() {
-        CivicLocation civicLocation =
-                new CivicLocation(sTestCivicLocationBufferWithAddress, sUsCountryCode);
-
-        Address address = civicLocation.toAddress();
-
-        assertEquals("", address.getAddressLine(0));
-        assertEquals("15 Alto", address.getAddressLine(1));
-        assertEquals("Mtn View", address.getAddressLine(2));
-        assertEquals("CA 94043", address.getAddressLine(3));
-        assertEquals("US", address.getAddressLine(4));
-    }
-
-    /**
-     * Test toString Representation
-     */
-    @Test
-    public void testCivicLocationToString2() {
-        CivicLocation civicLocation =
-                new CivicLocation(sTestCivicLocationBufferWithAddress, sUsCountryCode);
-
-        String str = civicLocation.toString();
-
-        assertEquals("{1=CA, 3=Mtn View, 19=15, 24=94043, 34=Alto, 39=Road}", str);
-    }
-
-    /** Test object is Parcellable */
-    @Test
-    public void testCivicLocationParcelable() {
-        CivicLocation civicLocation =
-                new CivicLocation(sTestCivicLocationBufferWithAddress, sUsCountryCode);
-
-        Parcel parcel = Parcel.obtain();
-        civicLocation.writeToParcel(parcel, 0);
-        parcel.setDataPosition(0);
-        CivicLocation civicLocationFromParcel =
-                CivicLocation.CREATOR.createFromParcel(parcel);
-
-        assertEquals(civicLocationFromParcel, civicLocation);
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/rtt/ResponderLocationTest.java b/wifi/tests/src/android/net/wifi/rtt/ResponderLocationTest.java
deleted file mode 100644
index 271339c..0000000
--- a/wifi/tests/src/android/net/wifi/rtt/ResponderLocationTest.java
+++ /dev/null
@@ -1,589 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import android.location.Address;
-import android.location.Location;
-import android.net.MacAddress;
-import android.os.Parcel;
-import android.util.SparseArray;
-import android.webkit.MimeTypeMap;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.List;
-
-/**
- * Tests for {@link ResponderLocation}.
- */
-@RunWith(JUnit4.class)
-public class ResponderLocationTest {
-    private static final double LATLNG_TOLERANCE_DEGREES = 0.000_000_05D; // 5E-8 = 6mm of meridian
-    private static final double ALT_TOLERANCE_METERS = 0.01;
-    private static final double HEIGHT_TOLERANCE_METERS = 0.01;
-    private static final int INDEX_ELEMENT_TYPE = 2;
-    private static final int INDEX_SUBELEMENT_TYPE = 0;
-    private static final int INDEX_SUBELEMENT_LENGTH = 1;
-
-    /* Test Buffers */
-
-    private static final byte[] sTestLciIeHeader = {
-            (byte) 0x01, (byte) 0x00, (byte) 0x08 // LCI Information Element (IE)
-    };
-
-    private static final byte[] sTestLciShortBuffer = {
-        (byte) 0x00
-    };
-
-    private static final byte[] sTestLciSE = {
-            (byte) 0x00, // Subelement LCI
-            (byte) 16,   // Subelement LCI length always = 16
-            (byte) 0x52,
-            (byte) 0x83,
-            (byte) 0x4d,
-            (byte) 0x12,
-            (byte) 0xef,
-            (byte) 0xd2,
-            (byte) 0xb0,
-            (byte) 0x8b,
-            (byte) 0x9b,
-            (byte) 0x4b,
-            (byte) 0xf1,
-            (byte) 0xcc,
-            (byte) 0x2c,
-            (byte) 0x00,
-            (byte) 0x00,
-            (byte) 0x41
-    };
-
-    private static final byte[] sTestZHeightSE = {
-            (byte) 0x04, // Subelement Z
-            (byte) 6, // Length always 6
-            (byte) 0x00, // LSB STA Floor Info (2 bytes)
-            (byte) 0x01, // MSB
-            (byte) 0xcd, // LSB Height(m) (3 bytes)
-            (byte) 0x2c,
-            (byte) 0x00, // MSB Height(m)
-            (byte) 0x0e, // STA Height Uncertainty
-    };
-
-    private static final byte[] sTestUsageSE1 = {
-            (byte) 0x06, // Subelement Usage Rights
-            (byte) 1, // Length 1 (with no retention limit)
-            (byte) 0x01, // Retransmit ok, No expiration, no extra info available
-    };
-
-    private static final byte[] sTestUsageSE2 = {
-            (byte) 0x06, // Subelement Usage Rights
-            (byte) 3,    // Length 3 (including retention limit)
-            (byte) 0x06, // Retransmit not ok, Expiration, extra info available
-            (byte) 0x00, // LSB expiration time  (0x8000 = 32768 hrs)
-            (byte) 0x80  // MSB expiration time
-    };
-
-    private static final byte[] sTestBssidListSE = {
-            (byte) 0x07, // Subelement BSSID list
-            (byte) 13, // length dependent on number of BSSIDs in list
-            (byte) 0x00, // List is explicit; no expansion of list required
-            (byte) 0x01, // BSSID #1 (MSB)
-            (byte) 0x02,
-            (byte) 0x03,
-            (byte) 0x04,
-            (byte) 0x05,
-            (byte) 0x06, // (LSB)
-            (byte) 0xf1, // BSSID #2 (MSB)
-            (byte) 0xf2,
-            (byte) 0xf3,
-            (byte) 0xf4,
-            (byte) 0xf5,
-            (byte) 0xf6 // (LSB)
-    };
-
-    private static final byte[] sTestLcrBufferHeader = {
-            (byte) 0x01, (byte) 0x00, (byte) 0x0b,
-    };
-
-    private static final byte[] sEmptyBuffer = {};
-
-    private static final byte[] sTestCivicLocationSEWithAddress = {
-            (byte) 0, // Civic Location Subelement
-            (byte) 39, // Length of subelement value
-            (byte) 'U', // CountryCodeChar1
-            (byte) 'S', // CountryCodeChar2
-            (byte) CivicLocationKeys.HNO,
-            (byte) 2,
-            (byte) '1',
-            (byte) '5',
-            (byte) CivicLocationKeys.PRIMARY_ROAD_NAME,
-            (byte) 4,
-            (byte) 'A',
-            (byte) 'l',
-            (byte) 't',
-            (byte) 'o',
-            (byte) CivicLocationKeys.STREET_NAME_POST_MODIFIER,
-            (byte) 4,
-            (byte) 'R',
-            (byte) 'o',
-            (byte) 'a',
-            (byte) 'd',
-            (byte) CivicLocationKeys.CITY,
-            (byte) 8,
-            (byte) 'M',
-            (byte) 't',
-            (byte) 'n',
-            (byte) ' ',
-            (byte) 'V',
-            (byte) 'i',
-            (byte) 'e',
-            (byte) 'w',
-            (byte) CivicLocationKeys.STATE,
-            (byte) 2,
-            (byte) 'C',
-            (byte) 'A',
-            (byte) CivicLocationKeys.POSTAL_CODE,
-            (byte) 5,
-            (byte) '9',
-            (byte) '4',
-            (byte) '0',
-            (byte) '4',
-            (byte) '3'
-    };
-
-    // Buffer representing: "https://map.com/mall.jpg"
-    private static final byte[] sTestMapUrlSE = {
-            (byte) 5, // Map URL Subelement
-            (byte) 25,
-            (byte) 0, // MAP_TYPE_URL_DEFINED
-            (byte) 'h',
-            (byte) 't',
-            (byte) 't',
-            (byte) 'p',
-            (byte) 's',
-            (byte) ':',
-            (byte) '/',
-            (byte) '/',
-            (byte) 'm',
-            (byte) 'a',
-            (byte) 'p',
-            (byte) '.',
-            (byte) 'c',
-            (byte) 'o',
-            (byte) 'm',
-            (byte) '/',
-            (byte) 'm',
-            (byte) 'a',
-            (byte) 'l',
-            (byte) 'l',
-            (byte) '.',
-            (byte) 'j',
-            (byte) 'p',
-            (byte) 'g'
-    };
-
-    /**
-     * Test if the lci and lcr buffers are null.
-     */
-    @Test
-    public void testIfLciOrLcrIsNull() {
-        ResponderLocation responderLocation = new ResponderLocation(null, null);
-
-        boolean valid = responderLocation.isValid();
-        boolean lciValid = responderLocation.isLciSubelementValid();
-        boolean zValid = responderLocation.isZaxisSubelementValid();
-
-        assertFalse(valid);
-        assertFalse(lciValid);
-        assertFalse(zValid);
-    }
-
-    /**
-     * Test if the lci and lcr buffers are empty.
-     */
-    @Test
-    public void testIfLciOrLcrIsEmpty() {
-        ResponderLocation responderLocation = new ResponderLocation(sEmptyBuffer, sEmptyBuffer);
-
-        boolean valid = responderLocation.isValid();
-        boolean lciValid = responderLocation.isLciSubelementValid();
-        boolean zValid = responderLocation.isZaxisSubelementValid();
-
-        assertFalse(valid);
-        assertFalse(lciValid);
-        assertFalse(zValid);
-    }
-
-    /**
-     * Test if the lci subelement only has one byte
-     */
-    @Test
-    public void testIfLciShortBuffer() {
-        byte[] testLciBuffer = concatenateArrays(sTestLciIeHeader, sTestLciShortBuffer);
-        ResponderLocation responderLocation =
-                new ResponderLocation(testLciBuffer, sTestLcrBufferHeader);
-
-        boolean valid = responderLocation.isValid();
-        boolean lciValid = responderLocation.isLciSubelementValid();
-        boolean zValid = responderLocation.isZaxisSubelementValid();
-
-        assertFalse(valid);
-        assertFalse(lciValid);
-        assertFalse(zValid);
-    }
-
-    /**
-     * Test that the example buffer contains a valid LCI Subelement.
-     */
-    @Test
-    public void testLciValidSubelement() {
-        byte[] testLciBuffer = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        ResponderLocation responderLocation =
-                new ResponderLocation(testLciBuffer, sTestLcrBufferHeader);
-
-        boolean valid = responderLocation.isValid();
-        boolean lciValid = responderLocation.isLciSubelementValid();
-        boolean zValid = responderLocation.isZaxisSubelementValid();
-        Location location = responderLocation.toLocation();
-
-        assertTrue(valid);
-        assertTrue(lciValid);
-        assertFalse(zValid);
-        assertEquals(0.0009765625D, responderLocation.getLatitudeUncertainty());
-        assertEquals(-33.8570095D, responderLocation.getLatitude(),
-                LATLNG_TOLERANCE_DEGREES);
-        assertEquals(0.0009765625D, responderLocation.getLongitudeUncertainty());
-        assertEquals(151.2152005D, responderLocation.getLongitude(),
-                LATLNG_TOLERANCE_DEGREES);
-        assertEquals(1, responderLocation.getAltitudeType());
-        assertEquals(64.0, responderLocation.getAltitudeUncertainty());
-        assertEquals(11.2, responderLocation.getAltitude(), ALT_TOLERANCE_METERS);
-        assertEquals(1, responderLocation.getDatum()); // WGS84
-        assertEquals(false, responderLocation.getRegisteredLocationAgreementIndication());
-        assertEquals(false, responderLocation.getRegisteredLocationDseIndication());
-        assertEquals(false, responderLocation.getDependentStationIndication());
-        assertEquals(1, responderLocation.getLciVersion());
-
-        // Testing Location Object
-        assertEquals(-33.8570095D, location.getLatitude(),
-                LATLNG_TOLERANCE_DEGREES);
-        assertEquals(151.2152005D, location.getLongitude(),
-                LATLNG_TOLERANCE_DEGREES);
-        assertEquals((0.0009765625D + 0.0009765625D) / 2, location.getAccuracy(),
-                LATLNG_TOLERANCE_DEGREES);
-        assertEquals(11.2, location.getAltitude(), ALT_TOLERANCE_METERS);
-        assertEquals(64.0, location.getVerticalAccuracyMeters(), ALT_TOLERANCE_METERS);
-    }
-
-    /**
-     * Test for an invalid LCI element.
-     */
-    @Test
-    public void testLciInvalidElement() {
-        byte[] testBuffer = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        testBuffer[INDEX_ELEMENT_TYPE] = (byte) 0xFF;
-        ResponderLocation responderLocation =
-                new ResponderLocation(testBuffer, sTestLcrBufferHeader);
-
-        boolean valid = responderLocation.isValid();
-        boolean lciValid = responderLocation.isLciSubelementValid();
-        boolean zValid = responderLocation.isZaxisSubelementValid();
-
-        assertFalse(valid);
-        assertFalse(lciValid);
-        assertFalse(zValid);
-    }
-
-    /**
-     * Test for an invalid subelement type.
-     */
-    @Test
-    public void testSkipLciSubElementUnusedOrUnknown() {
-        byte[] testLciBuffer = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        // Corrupt the subelement type to an unknown type.
-        testLciBuffer[sTestLciIeHeader.length + INDEX_SUBELEMENT_TYPE] = (byte) 0x77;
-        ResponderLocation responderLocation =
-                new ResponderLocation(testLciBuffer, sTestLcrBufferHeader);
-
-        boolean valid = responderLocation.isValid();
-        boolean lciValid = responderLocation.isLciSubelementValid();
-        boolean zValid = responderLocation.isZaxisSubelementValid();
-
-        assertFalse(valid);
-        assertFalse(lciValid);
-        assertFalse(zValid);
-    }
-
-    /**
-     * Test for a subelement LCI length too small.
-     */
-    @Test
-    public void testInvalidLciSubElementLengthTooSmall() {
-        byte[] testLciBuffer = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        // Corrupt the length making it too small.
-        testLciBuffer[sTestLciIeHeader.length + INDEX_SUBELEMENT_LENGTH] = (byte) 0x01;
-        ResponderLocation responderLocation =
-                new ResponderLocation(testLciBuffer, sTestLcrBufferHeader);
-
-        boolean valid = responderLocation.isValid();
-        boolean lciValid = responderLocation.isLciSubelementValid();
-        boolean zValid = responderLocation.isZaxisSubelementValid();
-
-        assertFalse(valid);
-        assertFalse(lciValid);
-        assertFalse(zValid);
-    }
-
-    /**
-     * Test for a subelement LCI length too big.
-     */
-    @Test
-    public void testInvalidLciSubElementLengthTooBig() {
-        byte[] testLciBuffer = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        // Corrupt the length making it too big.
-        testLciBuffer[sTestLciIeHeader.length + INDEX_SUBELEMENT_TYPE] = (byte) 0x11;
-        ResponderLocation responderLocation =
-                new ResponderLocation(testLciBuffer, sTestLcrBufferHeader);
-
-        boolean valid = responderLocation.isValid();
-        boolean lciValid = responderLocation.isLciSubelementValid();
-        boolean zValid = responderLocation.isZaxisSubelementValid();
-
-        assertFalse(valid);
-        assertFalse(lciValid);
-        assertFalse(zValid);
-    }
-
-    /**
-     * Test for a valid Z (Height) subelement following an LCI subelement.
-     */
-    @Test
-    public void testLciValidZBufferSEAfterLci() {
-        byte[] testBufferTmp = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        byte[] testBuffer = concatenateArrays(testBufferTmp, sTestZHeightSE);
-        ResponderLocation responderLocation =
-                new ResponderLocation(testBuffer, sTestLcrBufferHeader);
-
-        boolean isValid = responderLocation.isValid();
-        boolean isZValid = responderLocation.isZaxisSubelementValid();
-        boolean isLciValid = responderLocation.isLciSubelementValid();
-        double staFloorNumber = responderLocation.getFloorNumber();
-        double staHeightAboveFloorMeters = responderLocation.getHeightAboveFloorMeters();
-        double staHeightAboveFloorUncertaintyMeters =
-                responderLocation.getHeightAboveFloorUncertaintyMeters();
-
-        assertTrue(isValid);
-        assertTrue(isZValid);
-        assertTrue(isLciValid);
-        assertEquals(4.0, staFloorNumber);
-        assertEquals(2.8, staHeightAboveFloorMeters, HEIGHT_TOLERANCE_METERS);
-        assertEquals(0.125, staHeightAboveFloorUncertaintyMeters);
-    }
-
-    /**
-     * Test for a valid Usage Policy that is unrestrictive
-     */
-    @Test
-    public void testLciOpenUsagePolicy() {
-        byte[] testBufferTmp = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        byte[] testBuffer = concatenateArrays(testBufferTmp, sTestUsageSE1);
-        ResponderLocation responderLocation =
-                new ResponderLocation(testBuffer, sTestLcrBufferHeader);
-
-        boolean valid = responderLocation.isValid();
-        boolean retransmit = responderLocation.getRetransmitPolicyIndication();
-        boolean expiration = responderLocation.getRetentionExpiresIndication();
-        boolean extraInfo = responderLocation.getExtraInfoOnAssociationIndication();
-
-        assertTrue(valid);
-        assertTrue(retransmit);
-        assertFalse(expiration);
-        assertFalse(extraInfo);
-    }
-
-    /**
-     * Test for a valid Usage Policy that is restrictive
-     */
-    @Test
-    public void testLciRestrictiveUsagePolicy() {
-        byte[] testBufferTmp = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        byte[] testBuffer = concatenateArrays(testBufferTmp, sTestUsageSE2);
-        ResponderLocation responderLocation =
-                new ResponderLocation(testBuffer, sTestLcrBufferHeader);
-
-        boolean valid = responderLocation.isValid();
-        boolean retransmit = responderLocation.getRetransmitPolicyIndication();
-        boolean expiration = responderLocation.getRetentionExpiresIndication();
-        boolean extraInfo = responderLocation.getExtraInfoOnAssociationIndication();
-
-        assertFalse(valid);
-        assertFalse(retransmit);
-        assertTrue(expiration);
-        assertTrue(extraInfo);
-    }
-
-    /**
-     * Test for a valid BSSID element following an LCI subelement.
-     */
-    @Test
-    public void testLciBssidListSEAfterLci() {
-        byte[] testBufferTmp = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        byte[] testBuffer = concatenateArrays(testBufferTmp, sTestBssidListSE);
-        ResponderLocation responderLocation =
-                new ResponderLocation(testBuffer, sTestLcrBufferHeader);
-
-        boolean valid = responderLocation.isValid();
-        List<MacAddress> bssidList = responderLocation.getColocatedBssids();
-
-        assertTrue(valid);
-        assertEquals(2, bssidList.size());
-        MacAddress macAddress1 = bssidList.get(0);
-        assertEquals("01:02:03:04:05:06", macAddress1.toString());
-        MacAddress macAddress2 = bssidList.get(1);
-        assertEquals("f1:f2:f3:f4:f5:f6", macAddress2.toString());
-    }
-
-    /**
-     * Test for a valid BSSID element before and LCI element
-     */
-    @Test
-    public void testLciBssidListSEBeforeLci() {
-        byte[] testBufferTmp = concatenateArrays(sTestLciIeHeader, sTestBssidListSE);
-        byte[] testBuffer = concatenateArrays(testBufferTmp, sTestLciSE);
-        ResponderLocation responderLocation =
-                new ResponderLocation(testBuffer, sTestLcrBufferHeader);
-
-        boolean valid = responderLocation.isValid();
-        List<MacAddress> bssidList = responderLocation.getColocatedBssids();
-
-        assertTrue(valid);
-        assertEquals(2, bssidList.size());
-        MacAddress macAddress1 = bssidList.get(0);
-        assertEquals("01:02:03:04:05:06", macAddress1.toString());
-        MacAddress macAddress2 = bssidList.get(1);
-        assertEquals("f1:f2:f3:f4:f5:f6", macAddress2.toString());
-    }
-
-    /**
-     * Test that a valid address can be extracted from a valid lcr buffer with Civic Location.
-     */
-    @Test
-    public void testLcrTestCivicLocationAddress() {
-        byte[] testLciBuffer = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        byte[] testLcrBuffer =
-                concatenateArrays(sTestLcrBufferHeader, sTestCivicLocationSEWithAddress);
-        ResponderLocation responderLocation = new ResponderLocation(testLciBuffer, testLcrBuffer);
-
-        boolean valid = responderLocation.isValid();
-        String countryCode = responderLocation.getCivicLocationCountryCode();
-        Address address = responderLocation.toCivicLocationAddress();
-
-        assertTrue(valid);
-        assertEquals("US", countryCode);
-        assertEquals("", address.getAddressLine(0));
-        assertEquals("15 Alto", address.getAddressLine(1));
-        assertEquals("Mtn View", address.getAddressLine(2));
-        assertEquals("CA 94043", address.getAddressLine(3));
-        assertEquals("US", address.getAddressLine(4));
-    }
-
-    /**
-     * Test that a Civic Location sparseArray can be extracted from a valid lcr buffer.
-     */
-    @Test
-    public void testLcrTestCivicLocationSparseArray() {
-        byte[] testLciBuffer = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        byte[] testLcrBuffer =
-                concatenateArrays(sTestLcrBufferHeader, sTestCivicLocationSEWithAddress);
-        ResponderLocation responderLocation = new ResponderLocation(testLciBuffer, testLcrBuffer);
-
-        boolean valid = responderLocation.isValid();
-        SparseArray<String> civicLocationSparseArray = responderLocation
-                .toCivicLocationSparseArray();
-
-        assertTrue(valid);
-        assertEquals("15", civicLocationSparseArray.get(CivicLocationKeys.HNO));
-        assertEquals("Alto",
-                civicLocationSparseArray.get(CivicLocationKeys.PRIMARY_ROAD_NAME));
-        assertEquals("Road",
-                civicLocationSparseArray.get(CivicLocationKeys.STREET_NAME_POST_MODIFIER));
-        assertEquals("Mtn View", civicLocationSparseArray.get(CivicLocationKeys.CITY));
-        assertEquals("94043", civicLocationSparseArray.get(CivicLocationKeys.POSTAL_CODE));
-    }
-
-    /**
-     * Test that a URL can be extracted from a valid lcr buffer with a map image subelement.
-     */
-    @Test
-    public void testLcrCheckMapUriIsValid() {
-        byte[] testLciBuffer = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        byte[] testLcrBuffer = concatenateArrays(sTestLcrBufferHeader, sTestMapUrlSE);
-        ResponderLocation responderLocation = new ResponderLocation(testLciBuffer, testLcrBuffer);
-
-        boolean valid = responderLocation.isValid();
-        String mapImageMimeType = responderLocation.getMapImageMimeType();
-        String urlString = "";
-        if (responderLocation.getMapImageUri() != null) {
-            urlString = responderLocation.getMapImageUri().toString();
-        }
-
-        assertTrue(valid);
-        MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
-        assertEquals(mimeTypeMap.getMimeTypeFromExtension("jpg"), mapImageMimeType);
-        assertEquals("https://map.com/mall.jpg", urlString);
-    }
-
-    /**
-     * Test the object is parcelable
-     */
-    @Test
-    public void testResponderLocationParcelable() {
-        byte[] testLciBuffer = concatenateArrays(sTestLciIeHeader, sTestLciSE);
-        ResponderLocation responderLocation =
-                new ResponderLocation(testLciBuffer, sTestLcrBufferHeader);
-
-        Parcel parcel = Parcel.obtain();
-        responderLocation.writeToParcel(parcel, 0);
-        parcel.setDataPosition(0);
-        ResponderLocation responderLocationFromParcel =
-                ResponderLocation.CREATOR.createFromParcel(parcel);
-
-        assertEquals(responderLocationFromParcel, responderLocation);
-    }
-
-    /* Helper Method */
-
-    /**
-     * Concatenate two arrays.
-     *
-     * @param a first array
-     * @param b second array
-     * @return a third array which is the concatenation of the two array params
-     */
-    private byte[] concatenateArrays(byte[] a, byte[] b) {
-        int aLen = a.length;
-        int bLen = b.length;
-        byte[] c = new byte[aLen + bLen];
-        System.arraycopy(a, 0, c, 0, aLen);
-        System.arraycopy(b, 0, c, aLen, bLen);
-        return c;
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java b/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java
deleted file mode 100644
index e6eae416..0000000
--- a/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.rtt;
-
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyNoMoreInteractions;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.net.MacAddress;
-import android.net.wifi.ScanResult;
-import android.net.wifi.aware.PeerHandle;
-import android.os.IBinder;
-import android.os.Parcel;
-import android.os.test.TestLooper;
-
-import androidx.test.filters.SmallTest;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-/**
- * Unit test harness for WifiRttManager class.
- */
-@SmallTest
-public class WifiRttManagerTest {
-    private WifiRttManager mDut;
-    private TestLooper mMockLooper;
-    private Executor mMockLooperExecutor;
-
-    private final String packageName = "some.package.name.for.rtt.app";
-    private final String featureId = "some.feature.id.in.rtt.app";
-
-    @Mock
-    public Context mockContext;
-
-    @Mock
-    public IWifiRttManager mockRttService;
-
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        mDut = new WifiRttManager(mockContext, mockRttService);
-        mMockLooper = new TestLooper();
-        mMockLooperExecutor = mMockLooper.getNewExecutor();
-
-        when(mockContext.getOpPackageName()).thenReturn(packageName);
-        when(mockContext.getAttributionTag()).thenReturn(featureId);
-    }
-
-    /**
-     * Validate ranging call flow with successful results.
-     */
-    @Test
-    public void testRangeSuccess() throws Exception {
-        RangingRequest request = new RangingRequest.Builder().build();
-        List<RangingResult> results = new ArrayList<>();
-        results.add(
-                new RangingResult(RangingResult.STATUS_SUCCESS, MacAddress.BROADCAST_ADDRESS, 15, 5,
-                        10, 8, 5, null, null, null, 666));
-        RangingResultCallback callbackMock = mock(RangingResultCallback.class);
-        ArgumentCaptor<IRttCallback> callbackCaptor = ArgumentCaptor.forClass(IRttCallback.class);
-
-        // verify ranging request passed to service
-        mDut.startRanging(request, mMockLooperExecutor, callbackMock);
-        verify(mockRttService).startRanging(any(IBinder.class), eq(packageName), eq(featureId),
-                eq(null),  eq(request), callbackCaptor.capture());
-
-        // service calls back with success
-        callbackCaptor.getValue().onRangingResults(results);
-        mMockLooper.dispatchAll();
-        verify(callbackMock).onRangingResults(results);
-
-        verifyNoMoreInteractions(mockRttService, callbackMock);
-    }
-
-    /**
-     * Validate ranging call flow which failed.
-     */
-    @Test
-    public void testRangeFail() throws Exception {
-        int failureCode = RangingResultCallback.STATUS_CODE_FAIL;
-
-        RangingRequest request = new RangingRequest.Builder().build();
-        RangingResultCallback callbackMock = mock(RangingResultCallback.class);
-        ArgumentCaptor<IRttCallback> callbackCaptor = ArgumentCaptor.forClass(IRttCallback.class);
-
-        // verify ranging request passed to service
-        mDut.startRanging(request, mMockLooperExecutor, callbackMock);
-        verify(mockRttService).startRanging(any(IBinder.class), eq(packageName), eq(featureId),
-                eq(null), eq(request), callbackCaptor.capture());
-
-        // service calls back with failure code
-        callbackCaptor.getValue().onRangingFailure(failureCode);
-        mMockLooper.dispatchAll();
-        verify(callbackMock).onRangingFailure(failureCode);
-
-        verifyNoMoreInteractions(mockRttService, callbackMock);
-    }
-
-    /**
-     * Validate that RangingRequest parcel works (produces same object on write/read).
-     */
-    @Test
-    public void testRangingRequestParcel() {
-        // Note: not validating parcel code of ScanResult (assumed to work)
-        ScanResult scanResult1 = new ScanResult();
-        scanResult1.BSSID = "00:01:02:03:04:05";
-        ScanResult scanResult2 = new ScanResult();
-        scanResult2.BSSID = "06:07:08:09:0A:0B";
-        ScanResult scanResult3 = new ScanResult();
-        scanResult3.BSSID = "AA:BB:CC:DD:EE:FF";
-        List<ScanResult> scanResults2and3 = new ArrayList<>(2);
-        scanResults2and3.add(scanResult2);
-        scanResults2and3.add(scanResult3);
-        MacAddress mac1 = MacAddress.fromString("00:01:02:03:04:05");
-        PeerHandle peerHandle1 = new PeerHandle(12);
-
-        RangingRequest.Builder builder = new RangingRequest.Builder();
-        builder.addAccessPoint(scanResult1);
-        builder.addAccessPoints(scanResults2and3);
-        builder.addWifiAwarePeer(mac1);
-        builder.addWifiAwarePeer(peerHandle1);
-        RangingRequest request = builder.build();
-
-        Parcel parcelW = Parcel.obtain();
-        request.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        RangingRequest rereadRequest = RangingRequest.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(request, rereadRequest);
-    }
-
-    /**
-     * Validate that can request as many range operation as the upper limit on number of requests.
-     */
-    @Test
-    public void testRangingRequestAtLimit() {
-        ScanResult scanResult = new ScanResult();
-        scanResult.BSSID = "AA:BB:CC:DD:EE:FF";
-        List<ScanResult> scanResultList = new ArrayList<>();
-        for (int i = 0; i < RangingRequest.getMaxPeers() - 3; ++i) {
-            scanResultList.add(scanResult);
-        }
-        MacAddress mac1 = MacAddress.fromString("00:01:02:03:04:05");
-
-        // create request
-        RangingRequest.Builder builder = new RangingRequest.Builder();
-        builder.addAccessPoint(scanResult);
-        builder.addAccessPoints(scanResultList);
-        builder.addAccessPoint(scanResult);
-        builder.addWifiAwarePeer(mac1);
-        RangingRequest request = builder.build();
-
-        // verify request
-        request.enforceValidity(true);
-    }
-
-    /**
-     * Validate that limit on number of requests is applied.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testRangingRequestPastLimit() {
-        ScanResult scanResult = new ScanResult();
-        scanResult.BSSID = "00:01:02:03:04:05";
-        List<ScanResult> scanResultList = new ArrayList<>();
-        for (int i = 0; i < RangingRequest.getMaxPeers() - 2; ++i) {
-            scanResultList.add(scanResult);
-        }
-        MacAddress mac1 = MacAddress.fromString("00:01:02:03:04:05");
-
-        // create request
-        RangingRequest.Builder builder = new RangingRequest.Builder();
-        builder.addAccessPoint(scanResult);
-        builder.addAccessPoints(scanResultList);
-        builder.addAccessPoint(scanResult);
-        builder.addWifiAwarePeer(mac1);
-        RangingRequest request = builder.build();
-
-        // verify request
-        request.enforceValidity(true);
-    }
-
-    /**
-     * Validate that Aware requests are invalid on devices which do not support Aware
-     */
-    @Test(expected = IllegalArgumentException.class)
-    public void testRangingRequestWithAwareWithNoAwareSupport() {
-        // create request
-        RangingRequest.Builder builder = new RangingRequest.Builder();
-        builder.addWifiAwarePeer(new PeerHandle(10));
-        RangingRequest request = builder.build();
-
-        // verify request
-        request.enforceValidity(false);
-    }
-
-    /**
-     * Validate that RangingResults parcel works (produces same object on write/read).
-     */
-    @Test
-    public void testRangingResultsParcel() {
-        int status = RangingResult.STATUS_SUCCESS;
-        final MacAddress mac = MacAddress.fromString("00:01:02:03:04:05");
-        PeerHandle peerHandle = new PeerHandle(10);
-        int distanceCm = 105;
-        int distanceStdDevCm = 10;
-        int rssi = 5;
-        int numAttemptedMeasurements = 8;
-        int numSuccessfulMeasurements = 3;
-        long timestamp = System.currentTimeMillis();
-        byte[] lci = { 0x5, 0x6, 0x7 };
-        byte[] lcr = { 0x1, 0x2, 0x3, 0xA, 0xB, 0xC };
-
-        // RangingResults constructed with a MAC address
-        RangingResult result = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi,
-                numAttemptedMeasurements, numSuccessfulMeasurements, lci, lcr, null, timestamp);
-
-        Parcel parcelW = Parcel.obtain();
-        result.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        RangingResult rereadResult = RangingResult.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(result, rereadResult);
-
-        // RangingResults constructed with a PeerHandle
-        result = new RangingResult(status, peerHandle, distanceCm, distanceStdDevCm, rssi,
-                numAttemptedMeasurements, numSuccessfulMeasurements, null, null, null, timestamp);
-
-        parcelW = Parcel.obtain();
-        result.writeToParcel(parcelW, 0);
-        bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        rereadResult = RangingResult.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(result, rereadResult);
-    }
-
-    /**
-     * Validate that RangingResults tests equal even if LCI/LCR is empty (length == 0) and null.
-     */
-    @Test
-    public void testRangingResultsEqualityLciLcr() {
-        int status = RangingResult.STATUS_SUCCESS;
-        final MacAddress mac = MacAddress.fromString("00:01:02:03:04:05");
-        PeerHandle peerHandle = new PeerHandle(10);
-        int distanceCm = 105;
-        int distanceStdDevCm = 10;
-        int rssi = 5;
-        int numAttemptedMeasurements = 10;
-        int numSuccessfulMeasurements = 3;
-        long timestamp = System.currentTimeMillis();
-        byte[] lci = { };
-        byte[] lcr = { };
-
-        RangingResult rr1 = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi,
-                numAttemptedMeasurements, numSuccessfulMeasurements, lci, lcr, null, timestamp);
-        RangingResult rr2 = new RangingResult(status, mac, distanceCm, distanceStdDevCm, rssi,
-                numAttemptedMeasurements, numSuccessfulMeasurements, null, null, null, timestamp);
-
-        assertEquals(rr1, rr2);
-    }
-
-    /**
-     * Validate that ResponderConfig parcel works (produces same object on write/read).
-     */
-    @Test
-    public void testResponderConfigParcel() {
-        // ResponderConfig constructed with a MAC address
-        ResponderConfig config = new ResponderConfig(MacAddress.fromString("00:01:02:03:04:05"),
-                ResponderConfig.RESPONDER_AP, true, ResponderConfig.CHANNEL_WIDTH_80MHZ, 2134, 2345,
-                2555, ResponderConfig.PREAMBLE_LEGACY);
-
-        Parcel parcelW = Parcel.obtain();
-        config.writeToParcel(parcelW, 0);
-        byte[] bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        Parcel parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        ResponderConfig rereadConfig = ResponderConfig.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(config, rereadConfig);
-
-        // ResponderConfig constructed with a PeerHandle
-        config = new ResponderConfig(new PeerHandle(10), ResponderConfig.RESPONDER_AWARE, false,
-                ResponderConfig.CHANNEL_WIDTH_80MHZ_PLUS_MHZ, 5555, 6666, 7777,
-                ResponderConfig.PREAMBLE_VHT);
-
-        parcelW = Parcel.obtain();
-        config.writeToParcel(parcelW, 0);
-        bytes = parcelW.marshall();
-        parcelW.recycle();
-
-        parcelR = Parcel.obtain();
-        parcelR.unmarshall(bytes, 0, bytes.length);
-        parcelR.setDataPosition(0);
-        rereadConfig = ResponderConfig.CREATOR.createFromParcel(parcelR);
-
-        assertEquals(config, rereadConfig);
-    }
-
-    /**
-     * Validate preamble selection from ScanResults.
-     */
-    @Test
-    public void testResponderPreambleSelection() {
-        ScanResult.InformationElement htCap = new ScanResult.InformationElement();
-        htCap.id = ScanResult.InformationElement.EID_HT_CAPABILITIES;
-
-        ScanResult.InformationElement vhtCap = new ScanResult.InformationElement();
-        vhtCap.id = ScanResult.InformationElement.EID_VHT_CAPABILITIES;
-
-        ScanResult.InformationElement vsa = new ScanResult.InformationElement();
-        vsa.id = ScanResult.InformationElement.EID_VSA;
-
-        // no IE
-        ScanResult scan = new ScanResult();
-        scan.BSSID = "00:01:02:03:04:05";
-        scan.informationElements = null;
-        scan.channelWidth = ResponderConfig.CHANNEL_WIDTH_80MHZ;
-
-        ResponderConfig config = ResponderConfig.fromScanResult(scan);
-
-        assertEquals(ResponderConfig.PREAMBLE_VHT, config.preamble);
-
-        // IE with HT & VHT
-        scan.channelWidth = ResponderConfig.CHANNEL_WIDTH_40MHZ;
-
-        scan.informationElements = new ScanResult.InformationElement[2];
-        scan.informationElements[0] = htCap;
-        scan.informationElements[1] = vhtCap;
-
-        config = ResponderConfig.fromScanResult(scan);
-
-        assertEquals(ResponderConfig.PREAMBLE_VHT, config.preamble);
-
-        // IE with some entries but no HT or VHT
-        scan.informationElements[0] = vsa;
-        scan.informationElements[1] = vsa;
-
-        config = ResponderConfig.fromScanResult(scan);
-
-        assertEquals(ResponderConfig.PREAMBLE_LEGACY, config.preamble);
-
-        // IE with HT
-        scan.informationElements[0] = vsa;
-        scan.informationElements[1] = htCap;
-
-        config = ResponderConfig.fromScanResult(scan);
-
-        assertEquals(ResponderConfig.PREAMBLE_HT, config.preamble);
-    }
-}
diff --git a/wifi/tests/src/android/net/wifi/util/HexEncodingTest.java b/wifi/tests/src/android/net/wifi/util/HexEncodingTest.java
deleted file mode 100644
index 0d75138..0000000
--- a/wifi/tests/src/android/net/wifi/util/HexEncodingTest.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.util;
-
-import static android.net.wifi.util.HexEncoding.decode;
-import static android.net.wifi.util.HexEncoding.encode;
-import static android.net.wifi.util.HexEncoding.encodeToString;
-
-import junit.framework.TestCase;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-import java.util.Locale;
-
-/** Copied from {@link libcore.libcore.util.HexEncodingTest}. */
-public class HexEncodingTest extends TestCase {
-
-    public void testEncodeByte() {
-        Object[][] testCases = new Object[][]{
-                {0x01, "01"},
-                {0x09, "09"},
-                {0x0A, "0A"},
-                {0x0F, "0F"},
-                {0x10, "10"},
-                {0x1F, "1F"},
-                {0x20, "20"},
-                {0x7F, "7F"},
-                {0x80, "80"},
-                {0xFF, "FF"},
-        };
-        for (Object[] testCase : testCases) {
-            Number toEncode = (Number) testCase[0];
-            String expected = (String) testCase[1];
-
-            String actualUpper = encodeToString(toEncode.byteValue(), true /* upperCase */);
-            assertEquals(upper(expected), actualUpper);
-
-            String actualLower = encodeToString(toEncode.byteValue(), false /* upperCase */);
-            assertEquals(lower(expected), actualLower);
-        }
-    }
-
-    public void testEncodeBytes() {
-        Object[][] testCases = new Object[][]{
-                {"avocados".getBytes(StandardCharsets.UTF_8), "61766F6361646F73"},
-        };
-
-        for (Object[] testCase : testCases) {
-            byte[] bytes = (byte[]) testCase[0];
-            String encodedLower = lower((String) testCase[1]);
-            String encodedUpper = upper((String) testCase[1]);
-
-            assertArraysEqual(encodedUpper.toCharArray(), encode(bytes));
-            assertArraysEqual(encodedUpper.toCharArray(), encode(bytes, true /* upperCase */));
-            assertArraysEqual(encodedLower.toCharArray(), encode(bytes, false /* upperCase */));
-
-            assertArraysEqual(bytes, decode(encode(bytes), false /* allowSingleChar */));
-
-            // Make sure we can handle lower case hex encodings as well.
-            assertArraysEqual(bytes,
-                    decode(encodedLower.toCharArray(), false /* allowSingleChar */));
-        }
-    }
-
-    public void testDecode_allow4Bit() {
-        assertArraysEqual(new byte[]{6}, decode("6".toCharArray(), true));
-        assertArraysEqual(new byte[]{6, 0x76}, decode("676".toCharArray(), true));
-    }
-
-    public void testDecode_disallow4Bit() {
-        try {
-            decode("676".toCharArray(), false /* allowSingleChar */);
-            fail();
-        } catch (IllegalArgumentException expected) {
-        }
-    }
-
-    public void testDecode_invalid() {
-        try {
-            decode("DEADBARD".toCharArray(), false /* allowSingleChar */);
-            fail();
-        } catch (IllegalArgumentException expected) {
-        }
-
-        // This demonstrates a difference in behaviour from apache commons : apache
-        // commons uses Character.isDigit and would successfully decode a string with
-        // arabic and devanagari characters.
-        try {
-            decode("६१٧٥٥F6361646F73".toCharArray(), false /* allowSingleChar */);
-            fail();
-        } catch (IllegalArgumentException expected) {
-        }
-
-        try {
-            decode("#%6361646F73".toCharArray(), false /* allowSingleChar */);
-            fail();
-        } catch (IllegalArgumentException expected) {
-        }
-    }
-
-    private static void assertArraysEqual(char[] lhs, char[] rhs) {
-        assertEquals(new String(lhs), new String(rhs));
-    }
-
-    private static void assertArraysEqual(byte[] lhs, byte[] rhs) {
-        assertEquals(Arrays.toString(lhs), Arrays.toString(rhs));
-    }
-
-    private static String lower(String string) {
-        return string.toLowerCase(Locale.ROOT);
-    }
-
-    private static String upper(String string) {
-        return string.toUpperCase(Locale.ROOT);
-    }
-}
diff --git a/wifi/tests/test-jarjar-rules.txt b/wifi/tests/test-jarjar-rules.txt
deleted file mode 100644
index 41b97ab..0000000
--- a/wifi/tests/test-jarjar-rules.txt
+++ /dev/null
@@ -1 +0,0 @@
-rule com.android.modules.utils.** com.android.wifi.test.x.@0