summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Android.bp3
-rw-r--r--ApiDocs.bp9
-rw-r--r--StubLibraries.bp19
-rw-r--r--apex/blobstore/OWNERS2
-rw-r--r--apex/jobscheduler/OWNERS7
-rw-r--r--apex/permission/service/Android.bp2
-rw-r--r--cmds/idmap2/idmap2/Lookup.cpp4
-rw-r--r--cmds/idmap2/libidmap2/XmlParser.cpp2
-rw-r--r--config/preloaded-classes7
-rw-r--r--core/api/current.txt26
-rw-r--r--core/api/system-current.txt94
-rw-r--r--core/api/test-current.txt4
-rw-r--r--core/java/android/app/admin/DevicePolicyManager.java4
-rw-r--r--core/java/android/bluetooth/BluetoothAdapter.java40
-rw-r--r--core/java/android/bluetooth/BluetoothUuid.java7
-rw-r--r--core/java/android/content/pm/ApplicationInfo.java6
-rw-r--r--core/java/android/content/pm/LimitedLengthInputStream.java2
-rw-r--r--core/java/android/content/pm/PackageManager.java17
-rw-r--r--core/java/android/content/res/ResourcesImpl.java19
-rw-r--r--core/java/android/net/ConnectivityManager.java4
-rw-r--r--core/java/android/net/IConnectivityManager.aidl7
-rw-r--r--core/java/android/net/INetworkManagementEventObserver.aidl7
-rw-r--r--core/java/android/net/INetworkPolicyManager.aidl3
-rw-r--r--core/java/android/net/LinkProperties.java3
-rw-r--r--core/java/android/net/MacAddress.java2
-rw-r--r--core/java/android/net/NetworkPolicyManager.java11
-rw-r--r--core/java/android/net/NetworkStatsHistory.java2
-rw-r--r--core/java/android/net/NetworkUtils.java69
-rw-r--r--core/java/android/net/Proxy.java4
-rw-r--r--core/java/android/net/RouteInfo.java3
-rw-r--r--core/java/android/net/TcpKeepalivePacketData.java163
-rw-r--r--core/java/android/net/vcn/VcnConfig.java109
-rw-r--r--core/java/android/net/vcn/VcnGatewayConnectionConfig.java401
-rw-r--r--core/java/android/net/vcn/VcnManager.java40
-rw-r--r--core/java/android/os/BatteryStatsManager.java47
-rw-r--r--core/java/android/os/FileBridge.java3
-rw-r--r--core/java/android/os/GraphicsEnvironment.java1
-rw-r--r--core/java/android/os/INetworkManagementService.aidl4
-rw-r--r--core/java/android/os/IRecoverySystem.aidl8
-rw-r--r--core/java/android/os/Parcel.java3
-rw-r--r--core/java/android/os/RecoverySystem.java137
-rw-r--r--core/java/android/os/incremental/OWNERS5
-rw-r--r--core/java/android/provider/ContactsContract.java10
-rw-r--r--core/java/android/provider/OWNERS27
-rw-r--r--core/java/android/provider/Telephony.java16
-rw-r--r--core/java/android/security/OWNERS2
-rw-r--r--core/java/android/service/attestation/OWNERS2
-rw-r--r--core/java/android/service/storage/OWNERS1
-rw-r--r--core/java/android/uwb/AngleMeasurement.java7
-rw-r--r--core/java/android/uwb/AngleOfArrivalMeasurement.java13
-rw-r--r--core/java/android/uwb/DistanceMeasurement.java7
-rw-r--r--core/java/android/uwb/OWNERS5
-rw-r--r--core/java/android/uwb/RangingManager.java178
-rw-r--r--core/java/android/uwb/RangingMeasurement.java19
-rw-r--r--core/java/android/uwb/RangingReport.java5
-rw-r--r--core/java/android/uwb/RangingSession.java123
-rw-r--r--core/java/android/uwb/UwbAddress.java4
-rw-r--r--core/java/android/uwb/UwbManager.java14
-rw-r--r--core/java/android/view/OWNERS2
-rw-r--r--core/java/com/android/internal/app/OWNERS3
-rw-r--r--core/java/com/android/internal/app/chooser/OWNERS1
-rw-r--r--core/java/com/android/internal/net/NetworkUtilsInternal.java92
-rw-r--r--core/java/com/android/internal/net/VpnProfile.java13
-rw-r--r--core/java/com/android/internal/os/KernelWakelockReader.java32
-rw-r--r--core/java/com/android/internal/os/Zygote.java5
-rw-r--r--core/java/com/android/internal/util/AnnotationValidations.java4
-rw-r--r--core/java/com/android/internal/util/ArrayUtils.java19
-rw-r--r--core/java/com/android/internal/util/OWNERS1
-rw-r--r--core/java/com/android/server/net/BaseNetworkObserver.java3
-rw-r--r--core/jni/Android.bp1
-rw-r--r--core/jni/AndroidRuntime.cpp2
-rw-r--r--core/jni/android_media_AudioDeviceAttributes.cpp2
-rw-r--r--core/jni/android_media_AudioSystem.cpp190
-rw-r--r--core/jni/android_net_NetUtils.cpp9
-rw-r--r--core/jni/com_android_internal_net_NetworkUtilsInternal.cpp37
-rw-r--r--core/res/AndroidManifest.xml10
-rw-r--r--core/res/OWNERS1
-rw-r--r--core/res/res/values-am/strings.xml10
-rw-r--r--core/res/res/values-es/strings.xml2
-rw-r--r--core/res/res/values-fa/strings.xml2
-rw-r--r--core/res/res/values-fr-rCA/strings.xml34
-rw-r--r--core/res/res/values-fr/strings.xml34
-rw-r--r--core/res/res/values-it/strings.xml2
-rw-r--r--core/res/res/values-ne/strings.xml2
-rw-r--r--core/res/res/values-nl/strings.xml2
-rw-r--r--core/res/res/values-sk/strings.xml8
-rw-r--r--core/res/res/values-uz/strings.xml2
-rw-r--r--core/tests/coretests/BstatsTestApp/OWNERS1
-rw-r--r--core/tests/coretests/src/android/os/storage/OWNERS1
-rw-r--r--core/tests/coretests/src/com/android/internal/os/OWNERS1
-rw-r--r--core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java85
-rw-r--r--core/tests/uwbtests/OWNERS1
-rw-r--r--core/tests/uwbtests/src/android/uwb/AngleOfArrivalMeasurementTest.java4
-rw-r--r--core/tests/uwbtests/src/android/uwb/RangingManagerTest.java260
-rw-r--r--core/tests/uwbtests/src/android/uwb/RangingMeasurementTest.java4
-rw-r--r--core/tests/uwbtests/src/android/uwb/RangingSessionTest.java194
-rw-r--r--core/tests/uwbtests/src/android/uwb/UwbTestUtils.java10
-rw-r--r--data/etc/car/Android.bp7
-rw-r--r--data/etc/car/com.google.android.car.networking.preferenceupdater.xml27
-rw-r--r--data/etc/privapp-permissions-platform.xml2
-rw-r--r--data/keyboards/keyboards.mk12
-rw-r--r--drm/java/android/drm/DrmOutputStream.java3
-rw-r--r--graphics/java/android/graphics/OWNERS5
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java25
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java7
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreBCWorkaroundProvider.java4
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java111
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java25
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreLoadStoreParameter.java4
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java35
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java26
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java48
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreSecretKeyFactorySpi.java31
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java81
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java13
-rw-r--r--keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java29
-rw-r--r--keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java67
-rw-r--r--keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java2
-rw-r--r--libs/androidfw/AssetManager2.cpp2
-rw-r--r--libs/androidfw/ResourceTypes.cpp4
-rw-r--r--libs/androidfw/ResourceUtils.cpp12
-rw-r--r--media/java/android/media/AudioDeviceAttributes.java39
-rw-r--r--media/java/android/media/AudioDeviceInfo.java45
-rwxr-xr-xmedia/java/android/media/AudioManager.java830
-rw-r--r--media/java/android/media/AudioSystem.java184
-rwxr-xr-xmedia/java/android/media/IAudioService.aidl37
-rw-r--r--media/java/android/media/ICapturePresetDevicesRoleDispatcher.aidl (renamed from wifi/java/android/net/wifi/IWifiConnectedNetworkScorer.aidl)16
-rw-r--r--media/java/android/media/ICommunicationDeviceDispatcher.aidl (renamed from wifi/java/android/net/wifi/IScoreUpdateObserver.aidl)13
-rw-r--r--media/java/android/media/IStrategyPreferredDevicesDispatcher.aidl (renamed from media/java/android/media/IStrategyPreferredDeviceDispatcher.aidl)6
-rw-r--r--media/java/android/media/MediaCodecInfo.java33
-rw-r--r--media/java/android/media/MediaRecorder.java26
-rw-r--r--media/java/android/media/OWNERS1
-rw-r--r--media/jni/audioeffect/android_media_AudioEffect.cpp2
-rw-r--r--mime/OWNERS1
-rw-r--r--native/android/OWNERS3
-rw-r--r--packages/Connectivity/service/Android.bp79
-rw-r--r--packages/Connectivity/service/jarjar-rules.txt1
-rw-r--r--packages/Connectivity/service/jni/com_android_server_TestNetworkService.cpp (renamed from services/core/jni/com_android_server_TestNetworkService.cpp)0
-rw-r--r--packages/Connectivity/service/jni/com_android_server_connectivity_Vpn.cpp (renamed from services/core/jni/com_android_server_connectivity_Vpn.cpp)1
-rw-r--r--packages/Connectivity/service/jni/onload.cpp40
-rw-r--r--packages/OsuLogin/Android.bp18
-rw-r--r--packages/OsuLogin/AndroidManifest.xml41
-rw-r--r--packages/OsuLogin/OWNERS2
-rw-r--r--packages/OsuLogin/certs/com.android.hotspot2.osulogin.pk8bin2374 -> 0 bytes
-rw-r--r--packages/OsuLogin/certs/com.android.hotspot2.osulogin.x509.pem35
-rw-r--r--packages/OsuLogin/certs/key.pem52
-rw-r--r--packages/OsuLogin/res/layout/osu_web_view.xml38
-rw-r--r--packages/OsuLogin/res/values-af/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-am/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ar/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-as/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-az/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-b+sr+Latn/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-be/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-bg/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-bn/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-bs/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ca/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-cs/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-da/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-de/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-el/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-en-rAU/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-en-rCA/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-en-rGB/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-en-rIN/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-en-rXC/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-es-rUS/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-es/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-et/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-eu/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-fa/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-fi/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-fr-rCA/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-fr/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-gl/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-gu/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-hi/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-hr/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-hu/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-hy/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-in/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-is/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-it/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-iw/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ja/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ka/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-kk/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-km/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-kn/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ko/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ky/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-lo/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-lt/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-lv/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-mk/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ml/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-mn/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-mr/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ms/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-my/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-nb/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ne/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-nl/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-or/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-pa/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-pl/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-pt-rBR/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-pt-rPT/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-pt/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ro/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ru/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-si/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-sk/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-sl/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-sq/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-sr/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-sv/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-sw/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ta/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-te/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-th/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-tl/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-tr/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-uk/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-ur/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-uz/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-vi/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-zh-rCN/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-zh-rHK/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-zh-rTW/strings.xml7
-rw-r--r--packages/OsuLogin/res/values-zu/strings.xml7
-rw-r--r--packages/OsuLogin/res/values/dimens.xml5
-rw-r--r--packages/OsuLogin/res/values/strings.xml8
-rw-r--r--packages/OsuLogin/res/values/styles.xml19
-rw-r--r--packages/OsuLogin/res/xml/network_security_config.xml9
-rw-r--r--packages/OsuLogin/src/com/android/hotspot2/osulogin/OsuLoginActivity.java281
-rw-r--r--packages/PrintSpooler/res/values-fr-rCA/strings.xml2
-rw-r--r--packages/PrintSpooler/res/values-fr/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-bs/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-fa/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-fr-rCA/strings.xml1
-rw-r--r--packages/SettingsLib/res/values-fr/strings.xml5
-rw-r--r--packages/SettingsLib/res/values-hi/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-in/strings.xml8
-rw-r--r--packages/SettingsLib/res/values-my/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-nb/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-or/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-sk/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-tl/strings.xml2
-rw-r--r--packages/SettingsLib/res/values-uz/strings.xml2
-rw-r--r--packages/SettingsProvider/OWNERS1
-rw-r--r--packages/Shell/AndroidManifest.xml3
-rw-r--r--packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-fr/strings.xml8
-rw-r--r--packages/SystemUI/res-keyguard/values-uz/strings.xml6
-rw-r--r--packages/SystemUI/res/values-fr-rCA/strings.xml6
-rw-r--r--packages/SystemUI/res/values-fr/strings.xml6
-rw-r--r--packages/SystemUI/res/values-mn/strings.xml6
-rw-r--r--packages/SystemUI/res/values-pt-rPT/strings.xml4
-rw-r--r--services/core/Android.bp15
-rw-r--r--services/core/java/com/android/server/AlarmManagerService.java4
-rw-r--r--services/core/java/com/android/server/ConnectivityService.java290
-rw-r--r--services/core/java/com/android/server/NetworkManagementService.java68
-rw-r--r--services/core/java/com/android/server/NsdService.java2
-rw-r--r--services/core/java/com/android/server/TestNetworkService.java41
-rw-r--r--services/core/java/com/android/server/VcnManagementService.java210
-rw-r--r--services/core/java/com/android/server/audio/AudioDeviceBroker.java720
-rw-r--r--services/core/java/com/android/server/audio/AudioDeviceInventory.java138
-rwxr-xr-xservices/core/java/com/android/server/audio/AudioService.java315
-rw-r--r--services/core/java/com/android/server/audio/AudioSystemAdapter.java53
-rw-r--r--services/core/java/com/android/server/audio/BtHelper.java473
-rw-r--r--services/core/java/com/android/server/compat/CompatChange.java12
-rw-r--r--services/core/java/com/android/server/compat/CompatConfig.java8
-rw-r--r--services/core/java/com/android/server/compat/PlatformCompat.java31
-rw-r--r--services/core/java/com/android/server/connectivity/NetworkNotificationManager.java8
-rw-r--r--services/core/java/com/android/server/connectivity/PacManager.java2
-rw-r--r--services/core/java/com/android/server/connectivity/ProxyTracker.java15
-rw-r--r--services/core/java/com/android/server/connectivity/TcpKeepaliveController.java5
-rw-r--r--services/core/java/com/android/server/connectivity/Vpn.java28
-rw-r--r--services/core/java/com/android/server/connectivity/VpnIkev2Utils.java2
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecController.java25
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java58
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlService.java12
-rw-r--r--services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java160
-rw-r--r--services/core/java/com/android/server/net/IpConfigStore.java11
-rw-r--r--services/core/java/com/android/server/net/NetworkPolicyManagerService.java119
-rw-r--r--services/core/java/com/android/server/net/NetworkStatsCollection.java2
-rw-r--r--services/core/java/com/android/server/pm/ApexManager.java15
-rw-r--r--services/core/java/com/android/server/pm/AppsFilter.java3
-rw-r--r--services/core/java/com/android/server/policy/OWNERS1
-rw-r--r--services/core/java/com/android/server/recoverysystem/RecoverySystemService.java237
-rw-r--r--services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java21
-rw-r--r--services/core/java/com/android/server/rollback/AppDataRollbackHelper.java7
-rw-r--r--services/core/java/com/android/server/vcn/Android.bp4
-rw-r--r--services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java314
-rw-r--r--services/core/jni/Android.bp4
-rw-r--r--services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java8
-rw-r--r--services/net/Android.bp1
-rw-r--r--services/net/java/android/net/TcpKeepalivePacketData.java268
-rw-r--r--services/net/java/android/net/ip/IpClientManager.java14
-rw-r--r--services/net/java/android/net/util/KeepalivePacketDataUtil.java189
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/devicepolicy/OWNERS1
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/location/OWNERS1
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/OWNERS1
-rw-r--r--services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowed-restrict-background-off.xml (renamed from services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowlisted-restrict-background-off.xml)0
-rw-r--r--services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowed-restrict-background-on.xml (renamed from services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-allowlisted-restrict-background-on.xml)0
-rw-r--r--services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denied-restrict-background-off.xml (renamed from services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denylisted-restrict-background-off.xml)0
-rw-r--r--services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denied-restrict-background-on.xml (renamed from services/tests/servicestests/assets/NetworkPolicyManagerServiceTest/netpolicy/uidA-denylisted-restrict-background-on.xml)0
-rw-r--r--services/tests/servicestests/src/com/android/server/audio/NoOpAudioSystemAdapter.java25
-rw-r--r--services/tests/servicestests/src/com/android/server/audio/OWNERS1
-rw-r--r--services/tests/servicestests/src/com/android/server/compat/CompatConfigTest.java16
-rw-r--r--services/tests/servicestests/src/com/android/server/compat/PlatformCompatTest.java14
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java17
-rw-r--r--services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java110
-rw-r--r--services/tests/servicestests/src/com/android/server/net/IpConfigStoreTest.java4
-rw-r--r--services/tests/servicestests/src/com/android/server/net/NetworkPolicyManagerServiceTest.java73
-rw-r--r--services/tests/servicestests/src/com/android/server/recoverysystem/OWNERS1
-rw-r--r--services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java164
-rw-r--r--startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java29
-rw-r--r--telephony/common/com/android/internal/telephony/TelephonyPermissions.java19
-rw-r--r--telephony/java/android/telephony/AccessNetworkUtils.java129
-rw-r--r--telephony/java/android/telephony/CarrierConfigManager.java58
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthLte.java7
-rw-r--r--telephony/java/android/telephony/CellSignalStrengthNr.java9
-rw-r--r--telephony/java/android/telephony/SubscriptionManager.java7
-rw-r--r--telephony/java/android/telephony/TelephonyManager.java59
-rw-r--r--telephony/java/android/telephony/ims/ImsRcsManager.java9
-rw-r--r--telephony/java/android/telephony/ims/ProvisioningManager.java279
-rw-r--r--telephony/java/android/telephony/ims/RcsClientConfiguration.aidl (renamed from wifi/aidl-export/android/net/wifi/aware/PublishConfig.aidl)6
-rw-r--r--telephony/java/android/telephony/ims/RcsClientConfiguration.java162
-rw-r--r--telephony/java/android/telephony/ims/RcsConfig.aidl (renamed from wifi/aidl-export/android/net/wifi/rtt/RangingResult.aidl)6
-rw-r--r--telephony/java/android/telephony/ims/RcsConfig.java306
-rw-r--r--telephony/java/android/telephony/ims/SipDelegateManager.java35
-rw-r--r--telephony/java/android/telephony/ims/aidl/IImsConfig.aidl8
-rw-r--r--telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl2
-rw-r--r--telephony/java/android/telephony/ims/aidl/IImsRegistration.aidl5
-rw-r--r--telephony/java/android/telephony/ims/aidl/IRcsConfigCallback.aidl (renamed from wifi/java/android/net/wifi/IWifiScanner.aidl)19
-rw-r--r--telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java123
-rw-r--r--telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java23
-rw-r--r--telephony/java/com/android/internal/telephony/ITelephony.aidl49
-rw-r--r--telephony/java/com/android/internal/telephony/RILConstants.java2
-rw-r--r--test-mock/src/android/test/mock/OWNERS2
-rw-r--r--tests/BatteryStatsPerfTest/OWNERS1
-rw-r--r--tests/BatteryWaster/OWNERS1
-rw-r--r--tests/net/common/java/android/net/NetworkProviderTest.kt9
-rw-r--r--tests/net/common/java/android/net/TcpKeepalivePacketDataTest.kt106
-rw-r--r--tests/net/java/android/net/Ikev2VpnProfileTest.java4
-rw-r--r--tests/net/java/android/net/KeepalivePacketDataUtilTest.java (renamed from tests/net/java/android/net/TcpKeepalivePacketDataTest.java)66
-rw-r--r--tests/net/java/android/net/MacAddressTest.java4
-rw-r--r--tests/net/java/android/net/NetworkUtilsTest.java60
-rw-r--r--tests/net/java/com/android/internal/net/NetworkUtilsInternalTest.java89
-rw-r--r--tests/net/java/com/android/server/ConnectivityServiceTest.java352
-rw-r--r--tests/net/java/com/android/server/NetworkManagementServiceTest.java25
-rw-r--r--tests/net/java/com/android/server/connectivity/VpnTest.java6
-rw-r--r--tests/net/java/com/android/server/net/NetworkStatsCollectionTest.java2
-rw-r--r--tests/vcn/java/android/net/vcn/VcnConfigTest.java83
-rw-r--r--tests/vcn/java/android/net/vcn/VcnGatewayConnectionConfigTest.java143
-rw-r--r--tests/vcn/java/com/android/server/VcnManagementServiceTest.java206
-rw-r--r--tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java333
-rw-r--r--tools/aapt2/util/Util.cpp4
-rw-r--r--tools/stats_log_api_gen/.clang-format17
-rw-r--r--tools/stats_log_api_gen/Android.bp134
-rw-r--r--tools/stats_log_api_gen/Collation.cpp576
-rw-r--r--tools/stats_log_api_gen/Collation.h201
-rw-r--r--tools/stats_log_api_gen/OWNERS1
-rw-r--r--tools/stats_log_api_gen/java_writer.cpp336
-rw-r--r--tools/stats_log_api_gen/java_writer.h38
-rw-r--r--tools/stats_log_api_gen/java_writer_q.cpp601
-rw-r--r--tools/stats_log_api_gen/java_writer_q.h46
-rw-r--r--tools/stats_log_api_gen/main.cpp264
-rw-r--r--tools/stats_log_api_gen/native_writer.cpp355
-rw-r--r--tools/stats_log_api_gen/native_writer.h37
-rw-r--r--tools/stats_log_api_gen/test.proto215
-rw-r--r--tools/stats_log_api_gen/test_collation.cpp369
-rw-r--r--tools/stats_log_api_gen/utils.cpp434
-rw-r--r--tools/stats_log_api_gen/utils.h83
-rw-r--r--wifi/Android.bp167
-rw-r--r--wifi/aidl-export/android/net/wifi/ScanResult.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/SoftApCapability.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/SoftApConfiguration.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/SoftApInfo.aidl20
-rw-r--r--wifi/aidl-export/android/net/wifi/WifiClient.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/WifiConfiguration.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/WifiEnterpriseConfig.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/WifiInfo.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/WifiNetworkConnectionStatistics.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/WifiNetworkSuggestion.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/WifiUsabilityStatsEntry.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/WpsInfo.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/aware/Characteristics.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/aware/SubscribeConfig.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/hotspot2/OsuProvider.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/hotspot2/PasspointConfiguration.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/hotspot2/pps/Credential.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/hotspot2/pps/HomeSp.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/p2p/WifiP2pConfig.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/p2p/WifiP2pDevice.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/p2p/WifiP2pDeviceList.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/p2p/WifiP2pGroup.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/p2p/WifiP2pInfo.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/p2p/nsd/WifiP2pServiceInfo.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/p2p/nsd/WifiP2pServiceRequest.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/rtt/RangingRequest.aidl19
-rw-r--r--wifi/aidl-export/android/net/wifi/rtt/ResponderConfig.aidl19
-rw-r--r--wifi/api/current.txt1199
-rw-r--r--wifi/api/lint-baseline.txt13
-rw-r--r--wifi/api/module-lib-current.txt1
-rw-r--r--wifi/api/module-lib-removed.txt1
-rw-r--r--wifi/api/removed.txt1
-rw-r--r--wifi/api/system-current.txt939
-rw-r--r--wifi/api/system-lint-baseline.txt6
-rw-r--r--wifi/api/system-removed.txt16
-rw-r--r--wifi/jarjar-rules.txt125
-rw-r--r--wifi/java/android/net/wifi/AnqpInformationElement.java80
-rw-r--r--wifi/java/android/net/wifi/BatchedScanResult.java97
-rw-r--r--wifi/java/android/net/wifi/EAPConstants.java57
-rw-r--r--wifi/java/android/net/wifi/EasyConnectStatusCallback.java267
-rw-r--r--wifi/java/android/net/wifi/IActionListener.aidl27
-rw-r--r--wifi/java/android/net/wifi/IDppCallback.aidl48
-rw-r--r--wifi/java/android/net/wifi/ILocalOnlyHotspotCallback.aidl30
-rw-r--r--wifi/java/android/net/wifi/INetworkRequestMatchCallback.aidl39
-rw-r--r--wifi/java/android/net/wifi/INetworkRequestUserSelectionCallback.aidl31
-rw-r--r--wifi/java/android/net/wifi/IOnWifiActivityEnergyInfoListener.aidl33
-rw-r--r--wifi/java/android/net/wifi/IOnWifiUsabilityStatsListener.aidl41
-rw-r--r--wifi/java/android/net/wifi/IScanResultsCallback.aidl27
-rw-r--r--wifi/java/android/net/wifi/IScanResultsListener.aidl24
-rw-r--r--wifi/java/android/net/wifi/ISoftApCallback.aidl71
-rw-r--r--wifi/java/android/net/wifi/ISuggestionConnectionStatusListener.aidl29
-rw-r--r--wifi/java/android/net/wifi/ITrafficStateCallback.aidl34
-rw-r--r--wifi/java/android/net/wifi/ITxPacketCountListener.aidl28
-rw-r--r--wifi/java/android/net/wifi/IWifiManager.aidl278
-rw-r--r--wifi/java/android/net/wifi/ParcelUtil.java165
-rw-r--r--wifi/java/android/net/wifi/RttManager.aidl21
-rw-r--r--wifi/java/android/net/wifi/RttManager.java1233
-rw-r--r--wifi/java/android/net/wifi/ScanResult.java1160
-rw-r--r--wifi/java/android/net/wifi/SoftApCapability.java186
-rw-r--r--wifi/java/android/net/wifi/SoftApConfiguration.java973
-rw-r--r--wifi/java/android/net/wifi/SoftApInfo.java194
-rw-r--r--wifi/java/android/net/wifi/SupplicantState.java265
-rw-r--r--wifi/java/android/net/wifi/SynchronousExecutor.java29
-rw-r--r--wifi/java/android/net/wifi/WifiAnnotations.java124
-rw-r--r--wifi/java/android/net/wifi/WifiClient.java95
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java2987
-rw-r--r--wifi/java/android/net/wifi/WifiEnterpriseConfig.java1494
-rw-r--r--wifi/java/android/net/wifi/WifiFrameworkInitializer.java121
-rw-r--r--wifi/java/android/net/wifi/WifiInfo.java1051
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java6239
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkAgentSpecifier.java163
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkConnectionStatistics.java85
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkSpecifier.java584
-rw-r--r--wifi/java/android/net/wifi/WifiNetworkSuggestion.java986
-rw-r--r--wifi/java/android/net/wifi/WifiScanner.java1676
-rw-r--r--wifi/java/android/net/wifi/WifiSsid.java288
-rw-r--r--wifi/java/android/net/wifi/WifiUsabilityStatsEntry.java351
-rw-r--r--wifi/java/android/net/wifi/WpsInfo.java102
-rw-r--r--wifi/java/android/net/wifi/aware/AttachCallback.java45
-rw-r--r--wifi/java/android/net/wifi/aware/Characteristics.java138
-rw-r--r--wifi/java/android/net/wifi/aware/ConfigRequest.aidl19
-rw-r--r--wifi/java/android/net/wifi/aware/ConfigRequest.java385
-rw-r--r--wifi/java/android/net/wifi/aware/DiscoverySession.java431
-rw-r--r--wifi/java/android/net/wifi/aware/DiscoverySessionCallback.java192
-rw-r--r--wifi/java/android/net/wifi/aware/IWifiAwareDiscoverySessionCallback.aidl38
-rw-r--r--wifi/java/android/net/wifi/aware/IWifiAwareEventCallback.aidl31
-rw-r--r--wifi/java/android/net/wifi/aware/IWifiAwareMacAddressProvider.aidl27
-rw-r--r--wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl60
-rw-r--r--wifi/java/android/net/wifi/aware/IdentityChangedListener.java39
-rw-r--r--wifi/java/android/net/wifi/aware/ParcelablePeerHandle.java60
-rw-r--r--wifi/java/android/net/wifi/aware/PeerHandle.java63
-rw-r--r--wifi/java/android/net/wifi/aware/PublishConfig.java393
-rw-r--r--wifi/java/android/net/wifi/aware/PublishDiscoverySession.java68
-rw-r--r--wifi/java/android/net/wifi/aware/SubscribeConfig.java497
-rw-r--r--wifi/java/android/net/wifi/aware/SubscribeDiscoverySession.java73
-rw-r--r--wifi/java/android/net/wifi/aware/TlvBufferUtils.java714
-rw-r--r--wifi/java/android/net/wifi/aware/WifiAwareAgentNetworkSpecifier.java224
-rw-r--r--wifi/java/android/net/wifi/aware/WifiAwareManager.java824
-rw-r--r--wifi/java/android/net/wifi/aware/WifiAwareNetworkInfo.java182
-rw-r--r--wifi/java/android/net/wifi/aware/WifiAwareNetworkSpecifier.java446
-rw-r--r--wifi/java/android/net/wifi/aware/WifiAwareSession.java343
-rw-r--r--wifi/java/android/net/wifi/aware/WifiAwareUtils.java106
-rw-r--r--wifi/java/android/net/wifi/aware/package.html43
-rw-r--r--wifi/java/android/net/wifi/hotspot2/ConfigParser.java486
-rw-r--r--wifi/java/android/net/wifi/hotspot2/IProvisioningCallback.aidl41
-rw-r--r--wifi/java/android/net/wifi/hotspot2/OsuProvider.java270
-rw-r--r--wifi/java/android/net/wifi/hotspot2/PasspointConfiguration.java921
-rw-r--r--wifi/java/android/net/wifi/hotspot2/ProvisioningCallback.java235
-rw-r--r--wifi/java/android/net/wifi/hotspot2/omadm/PpsMoParser.java1787
-rw-r--r--wifi/java/android/net/wifi/hotspot2/omadm/XMLNode.java109
-rw-r--r--wifi/java/android/net/wifi/hotspot2/omadm/XMLParser.java108
-rw-r--r--wifi/java/android/net/wifi/hotspot2/pps/Credential.java1313
-rw-r--r--wifi/java/android/net/wifi/hotspot2/pps/HomeSp.java429
-rw-r--r--wifi/java/android/net/wifi/hotspot2/pps/Policy.java576
-rw-r--r--wifi/java/android/net/wifi/hotspot2/pps/UpdateParameter.java403
-rw-r--r--wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl34
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pConfig.java506
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pDevice.java435
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pDeviceList.java219
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pGroup.java371
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pGroupList.java257
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pInfo.java98
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pManager.java2034
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pProvDiscEvent.java92
-rw-r--r--wifi/java/android/net/wifi/p2p/WifiP2pWfdInfo.java255
-rw-r--r--wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfo.java236
-rw-r--r--wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequest.java107
-rw-r--r--wifi/java/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceResponse.java309
-rw-r--r--wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceInfo.java187
-rw-r--r--wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceRequest.java283
-rw-r--r--wifi/java/android/net/wifi/p2p/nsd/WifiP2pServiceResponse.java381
-rw-r--r--wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfo.java111
-rw-r--r--wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequest.java82
-rw-r--r--wifi/java/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceResponse.java159
-rw-r--r--wifi/java/android/net/wifi/p2p/package.html68
-rw-r--r--wifi/java/android/net/wifi/package.html29
-rw-r--r--wifi/java/android/net/wifi/rtt/CivicLocation.java333
-rw-r--r--wifi/java/android/net/wifi/rtt/CivicLocationKeys.java115
-rw-r--r--wifi/java/android/net/wifi/rtt/IRttCallback.aidl37
-rw-r--r--wifi/java/android/net/wifi/rtt/IWifiRttManager.aidl33
-rw-r--r--wifi/java/android/net/wifi/rtt/RangingRequest.java267
-rw-r--r--wifi/java/android/net/wifi/rtt/RangingResult.java438
-rw-r--r--wifi/java/android/net/wifi/rtt/RangingResultCallback.java70
-rw-r--r--wifi/java/android/net/wifi/rtt/ResponderConfig.java514
-rw-r--r--wifi/java/android/net/wifi/rtt/ResponderLocation.java1427
-rw-r--r--wifi/java/android/net/wifi/rtt/WifiRttManager.java190
-rw-r--r--wifi/java/android/net/wifi/rtt/package.html45
-rw-r--r--wifi/java/android/net/wifi/util/HexEncoding.java183
-rw-r--r--wifi/non-updatable/java/Android.bp35
-rwxr-xr-xwifi/non-updatable/java/src/android/net/wifi/SoftApConfToXmlMigrationUtil.java (renamed from wifi/java/android/net/wifi/SoftApConfToXmlMigrationUtil.java)0
-rwxr-xr-xwifi/non-updatable/java/src/android/net/wifi/WifiMigration.java (renamed from wifi/java/android/net/wifi/WifiMigration.java)8
-rwxr-xr-xwifi/non-updatable/java/src/android/net/wifi/WifiNetworkScoreCache.java (renamed from wifi/java/android/net/wifi/WifiNetworkScoreCache.java)6
-rw-r--r--wifi/non-updatable/java/src/android/net/wifi/nl80211/ChannelSettings.java (renamed from wifi/java/android/net/wifi/nl80211/ChannelSettings.java)0
-rw-r--r--wifi/non-updatable/java/src/android/net/wifi/nl80211/DeviceWiphyCapabilities.java (renamed from wifi/java/android/net/wifi/nl80211/DeviceWiphyCapabilities.java)0
-rw-r--r--wifi/non-updatable/java/src/android/net/wifi/nl80211/HiddenNetwork.java (renamed from wifi/java/android/net/wifi/nl80211/HiddenNetwork.java)0
-rw-r--r--wifi/non-updatable/java/src/android/net/wifi/nl80211/NativeScanResult.java (renamed from wifi/java/android/net/wifi/nl80211/NativeScanResult.java)0
-rw-r--r--wifi/non-updatable/java/src/android/net/wifi/nl80211/NativeWifiClient.java (renamed from wifi/java/android/net/wifi/nl80211/NativeWifiClient.java)0
-rw-r--r--wifi/non-updatable/java/src/android/net/wifi/nl80211/PnoNetwork.java (renamed from wifi/java/android/net/wifi/nl80211/PnoNetwork.java)0
-rw-r--r--wifi/non-updatable/java/src/android/net/wifi/nl80211/PnoSettings.java (renamed from wifi/java/android/net/wifi/nl80211/PnoSettings.java)0
-rw-r--r--wifi/non-updatable/java/src/android/net/wifi/nl80211/RadioChainInfo.java (renamed from wifi/java/android/net/wifi/nl80211/RadioChainInfo.java)0
-rw-r--r--wifi/non-updatable/java/src/android/net/wifi/nl80211/SingleScanSettings.java (renamed from wifi/java/android/net/wifi/nl80211/SingleScanSettings.java)0
-rw-r--r--wifi/non-updatable/java/src/android/net/wifi/nl80211/WifiNl80211Manager.java (renamed from wifi/java/android/net/wifi/nl80211/WifiNl80211Manager.java)0
-rw-r--r--wifi/non-updatable/migration_samples/README.txt (renamed from wifi/java/android/net/wifi/migration_samples/README.txt)0
-rw-r--r--wifi/non-updatable/migration_samples/Shared_WifiConfigStore.xml (renamed from wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStore.xml)0
-rw-r--r--wifi/non-updatable/migration_samples/Shared_WifiConfigStoreSoftAp.xml (renamed from wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStoreSoftAp.xml)0
-rw-r--r--wifi/non-updatable/migration_samples/User_WifiConfigStore.xml (renamed from wifi/java/android/net/wifi/migration_samples/User_WifiConfigStore.xml)0
-rw-r--r--wifi/non-updatable/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml (renamed from wifi/java/android/net/wifi/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml)0
-rw-r--r--wifi/non-updatable/tests/Android.bp (renamed from wifi/tests/Android.bp)17
-rw-r--r--wifi/non-updatable/tests/AndroidManifest.xml (renamed from wifi/tests/AndroidManifest.xml)16
-rw-r--r--wifi/non-updatable/tests/AndroidTest.xml (renamed from wifi/tests/AndroidTest.xml)14
-rw-r--r--wifi/non-updatable/tests/README.md (renamed from wifi/tests/README.md)5
-rw-r--r--wifi/non-updatable/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java (renamed from wifi/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java)0
-rw-r--r--wifi/non-updatable/tests/src/android/net/wifi/WifiNetworkScoreCacheTest.java (renamed from wifi/tests/src/android/net/wifi/WifiNetworkScoreCacheTest.java)2
-rw-r--r--wifi/non-updatable/tests/src/android/net/wifi/nl80211/DeviceWiphyCapabilitiesTest.java (renamed from wifi/tests/src/android/net/wifi/nl80211/DeviceWiphyCapabilitiesTest.java)0
-rw-r--r--wifi/non-updatable/tests/src/android/net/wifi/nl80211/NativeScanResultTest.java (renamed from wifi/tests/src/android/net/wifi/nl80211/NativeScanResultTest.java)0
-rw-r--r--wifi/non-updatable/tests/src/android/net/wifi/nl80211/PnoSettingsTest.java (renamed from wifi/tests/src/android/net/wifi/nl80211/PnoSettingsTest.java)0
-rw-r--r--wifi/non-updatable/tests/src/android/net/wifi/nl80211/SingleScanSettingsTest.java (renamed from wifi/tests/src/android/net/wifi/nl80211/SingleScanSettingsTest.java)0
-rw-r--r--wifi/non-updatable/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java (renamed from wifi/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java)0
-rw-r--r--wifi/tests/assets/hsr1/HSR1ProfileWithCACert.base6486
-rw-r--r--wifi/tests/assets/hsr1/HSR1ProfileWithCACert.conf74
-rw-r--r--wifi/tests/assets/hsr1/HSR1ProfileWithInvalidContentType.base6486
-rw-r--r--wifi/tests/assets/hsr1/HSR1ProfileWithMissingBoundary.base6486
-rw-r--r--wifi/tests/assets/hsr1/HSR1ProfileWithNonBase64Part.base6486
-rw-r--r--wifi/tests/assets/hsr1/HSR1ProfileWithUpdateIdentifier.base6488
-rw-r--r--wifi/tests/assets/hsr1/HSR1ProfileWithoutProfile.base6431
-rw-r--r--wifi/tests/assets/hsr1/README.txt6
-rw-r--r--wifi/tests/assets/pps/PerProviderSubscription.xml430
-rw-r--r--wifi/tests/assets/pps/PerProviderSubscription_DuplicateHomeSP.xml95
-rw-r--r--wifi/tests/assets/pps/PerProviderSubscription_DuplicateValue.xml81
-rw-r--r--wifi/tests/assets/pps/PerProviderSubscription_InvalidName.xml80
-rw-r--r--wifi/tests/assets/pps/PerProviderSubscription_InvalidNode.xml84
-rw-r--r--wifi/tests/assets/pps/PerProviderSubscription_MissingName.xml79
-rw-r--r--wifi/tests/assets/pps/PerProviderSubscription_MissingValue.xml79
-rw-r--r--wifi/tests/assets/pps/README.txt7
-rw-r--r--wifi/tests/src/android/net/wifi/EasyConnectStatusCallbackTest.java84
-rw-r--r--wifi/tests/src/android/net/wifi/FakeKeys.java673
-rw-r--r--wifi/tests/src/android/net/wifi/ParcelUtilTest.java112
-rw-r--r--wifi/tests/src/android/net/wifi/ScanResultTest.java301
-rw-r--r--wifi/tests/src/android/net/wifi/SoftApCapabilityTest.java73
-rw-r--r--wifi/tests/src/android/net/wifi/SoftApConfigurationTest.java339
-rw-r--r--wifi/tests/src/android/net/wifi/SoftApInfoTest.java71
-rw-r--r--wifi/tests/src/android/net/wifi/WifiClientTest.java75
-rw-r--r--wifi/tests/src/android/net/wifi/WifiConfigurationTest.java540
-rw-r--r--wifi/tests/src/android/net/wifi/WifiEnterpriseConfigTest.java577
-rw-r--r--wifi/tests/src/android/net/wifi/WifiInfoTest.java151
-rw-r--r--wifi/tests/src/android/net/wifi/WifiManagerTest.java2389
-rw-r--r--wifi/tests/src/android/net/wifi/WifiNetworkAgentSpecifierTest.java395
-rw-r--r--wifi/tests/src/android/net/wifi/WifiNetworkSpecifierTest.java617
-rw-r--r--wifi/tests/src/android/net/wifi/WifiNetworkSuggestionTest.java965
-rw-r--r--wifi/tests/src/android/net/wifi/WifiScannerTest.java634
-rw-r--r--wifi/tests/src/android/net/wifi/WifiSsidTest.java60
-rw-r--r--wifi/tests/src/android/net/wifi/WifiUsabilityStatsEntryTest.java121
-rw-r--r--wifi/tests/src/android/net/wifi/aware/TlvBufferUtilsTest.java324
-rw-r--r--wifi/tests/src/android/net/wifi/aware/WifiAwareAgentNetworkSpecifierTest.java176
-rw-r--r--wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java1639
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/ConfigParserTest.java223
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/OsuProviderTest.java137
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/PasspointConfigurationTest.java626
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/PasspointTestUtils.java172
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/omadm/PpsMoParserTest.java263
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/omadm/XMLParserTest.java84
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/pps/CredentialTest.java636
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/pps/HomeSpTest.java221
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/pps/PolicyTest.java312
-rw-r--r--wifi/tests/src/android/net/wifi/hotspot2/pps/UpdateParameterTest.java349
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pConfigTest.java173
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceListTest.java75
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pDeviceTest.java118
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pGroupListTest.java115
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pGroupTest.java92
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pInfoTest.java83
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pManagerTest.java85
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pProvDiscEventTest.java111
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/WifiP2pWfdInfoTest.java108
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceInfoTest.java88
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pDnsSdServiceRequestTest.java72
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceInfoTest.java80
-rw-r--r--wifi/tests/src/android/net/wifi/p2p/nsd/WifiP2pUpnpServiceRequestTest.java49
-rw-r--r--wifi/tests/src/android/net/wifi/rtt/CivicLocationTest.java243
-rw-r--r--wifi/tests/src/android/net/wifi/rtt/ResponderLocationTest.java589
-rw-r--r--wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java395
-rw-r--r--wifi/tests/src/android/net/wifi/util/HexEncodingTest.java130
-rw-r--r--wifi/tests/test-jarjar-rules.txt1
621 files changed, 9877 insertions, 71319 deletions
diff --git a/Android.bp b/Android.bp
index 26e716530426..1493f15dc209 100644
--- a/Android.bp
+++ b/Android.bp
@@ -314,6 +314,7 @@ filegroup {
":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 @@ java_library {
visibility: [
"//frameworks/base/wifi",
"//frameworks/base/services/net",
+ "//packages/modules/Wifi/framework",
],
}
@@ -1267,7 +1269,6 @@ filegroup {
// 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 ba93a489fd5a..ada80bbc9874 100644
--- a/ApiDocs.bp
+++ b/ApiDocs.bp
@@ -91,7 +91,9 @@ droidstubs {
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 @@ droidstubs {
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 6cabc573659e..4b28352c85ff 100644
--- a/StubLibraries.bp
+++ b/StubLibraries.bp
@@ -50,7 +50,9 @@ stubs_defaults {
":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 @@ stubs_defaults {
"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 {
},
}
-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/blobstore/OWNERS b/apex/blobstore/OWNERS
index 8e04399196e2..a53bbeaa8601 100644
--- a/apex/blobstore/OWNERS
+++ b/apex/blobstore/OWNERS
@@ -1,4 +1,2 @@
-set noparent
-
sudheersai@google.com
yamasani@google.com
diff --git a/apex/jobscheduler/OWNERS b/apex/jobscheduler/OWNERS
index d004eed2a0db..c77ea336990d 100644
--- a/apex/jobscheduler/OWNERS
+++ b/apex/jobscheduler/OWNERS
@@ -1,6 +1,7 @@
-yamasani@google.com
-omakoto@google.com
ctate@android.com
ctate@google.com
+dplotnikov@google.com
kwekua@google.com
-suprabh@google.com \ No newline at end of file
+omakoto@google.com
+suprabh@google.com
+yamasani@google.com
diff --git a/apex/permission/service/Android.bp b/apex/permission/service/Android.bp
index b7d843352d8e..6e04edfe02f1 100644
--- a/apex/permission/service/Android.bp
+++ b/apex/permission/service/Android.bp
@@ -39,4 +39,6 @@ java_sdk_library {
"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 8323d0ba2415..437180d3d1be 100644
--- a/cmds/idmap2/idmap2/Lookup.cpp
+++ b/cmds/idmap2/idmap2/Lookup.cpp
@@ -71,7 +71,7 @@ Result<ResourceId> WARN_UNUSED ParseResReference(const AssetManager2& am, const
}
// 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 @@ void PrintValue(AssetManager2* const am, const AssetManager2::SelectedValue& val
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 7c55b64566f2..4030b83b3a41 100644
--- a/cmds/idmap2/libidmap2/XmlParser.cpp
+++ b/cmds/idmap2/libidmap2/XmlParser.cpp
@@ -98,7 +98,7 @@ Result<std::string> XmlParser::Node::GetAttributeStringValue(const std::string&
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 d56fc7720c89..5e88d97db91f 100644
--- a/config/preloaded-classes
+++ b/config/preloaded-classes
@@ -3716,9 +3716,9 @@ android.media.IRemoteVolumeObserver
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
@@ -11759,7 +11759,6 @@ libcore.util.XmlObjectFactory
libcore.util.ZoneInfo$CheckedArithmeticException
libcore.util.ZoneInfo$WallTime
libcore.util.ZoneInfo
-org.apache.harmony.dalvik.NativeTestTarget
org.apache.harmony.dalvik.ddmc.Chunk
org.apache.harmony.dalvik.ddmc.ChunkHandler
org.apache.harmony.dalvik.ddmc.DdmServer
diff --git a/core/api/current.txt b/core/api/current.txt
index 1ef98be04ecf..65d3e4a36b9d 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -12142,6 +12142,7 @@ package android.content.pm {
field public static final String FEATURE_NFC_HOST_CARD_EMULATION_NFCF = "android.hardware.nfc.hcef";
field public static final String FEATURE_NFC_OFF_HOST_CARD_EMULATION_ESE = "android.hardware.nfc.ese";
field public static final String FEATURE_NFC_OFF_HOST_CARD_EMULATION_UICC = "android.hardware.nfc.uicc";
+ field public static final String FEATURE_OPENGLES_DEQP_LEVEL = "android.software.opengles.deqp.level";
field public static final String FEATURE_OPENGLES_EXTENSION_PACK = "android.hardware.opengles.aep";
field public static final String FEATURE_PC = "android.hardware.type.pc";
field public static final String FEATURE_PICTURE_IN_PICTURE = "android.software.picture_in_picture";
@@ -19372,14 +19373,17 @@ package android.media {
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();
@@ -19414,11 +19418,13 @@ package android.media {
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);
@@ -19553,6 +19559,10 @@ package android.media {
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();
}
@@ -33224,8 +33234,8 @@ package android.provider {
}
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";
@@ -40253,9 +40263,10 @@ package android.telephony {
field public static final String KEY_TREAT_DOWNGRADED_VIDEO_CALLS_AS_VIDEO_CALLS_BOOL = "treat_downgraded_video_calls_as_video_calls_bool";
field public static final String KEY_TTY_SUPPORTED_BOOL = "tty_supported_bool";
field public static final String KEY_UNLOGGABLE_NUMBERS_STRING_ARRAY = "unloggable_numbers_string_array";
+ 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";
@@ -40296,9 +40307,12 @@ package android.telephony {
}
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";
}
@@ -40506,7 +40520,8 @@ package android.telephony {
public final class CellSignalStrengthLte extends android.telephony.CellSignalStrength implements android.os.Parcelable {
method public int describeContents();
method public int getAsuLevel();
- method public int getCqi();
+ method @IntRange(from=0, to=15) public int getCqi();
+ method @IntRange(from=1, to=6) public int getCqiTableIndex();
method public int getDbm();
method @IntRange(from=android.telephony.CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, to=android.telephony.CellSignalStrength.SIGNAL_STRENGTH_GREAT) public int getLevel();
method public int getRsrp();
@@ -40521,6 +40536,8 @@ package android.telephony {
public final class CellSignalStrengthNr extends android.telephony.CellSignalStrength implements android.os.Parcelable {
method public int describeContents();
method public int getAsuLevel();
+ method @IntRange(from=0, to=15) @NonNull public java.util.List<java.lang.Integer> getCsiCqiReport();
+ method @IntRange(from=1, to=3) public int getCsiCqiTableIndex();
method public int getCsiRsrp();
method public int getCsiRsrq();
method public int getCsiSinr();
@@ -57317,6 +57334,7 @@ package java.lang {
method public int getModifiers();
method @NonNull public String getName();
method @Nullable public Package getPackage();
+ method @NonNull public String getPackageName();
method @Nullable public java.security.ProtectionDomain getProtectionDomain();
method @Nullable public java.net.URL getResource(@NonNull String);
method @Nullable public java.io.InputStream getResourceAsStream(@NonNull String);
diff --git a/core/api/system-current.txt b/core/api/system-current.txt
index de8e18046a39..b4f139553271 100644
--- a/core/api/system-current.txt
+++ b/core/api/system-current.txt
@@ -237,7 +237,9 @@ package android {
field public static final String USE_RESERVED_DISK = "android.permission.USE_RESERVED_DISK";
field public static final String WHITELIST_AUTO_REVOKE_PERMISSIONS = "android.permission.WHITELIST_AUTO_REVOKE_PERMISSIONS";
field public static final String WHITELIST_RESTRICTED_PERMISSIONS = "android.permission.WHITELIST_RESTRICTED_PERMISSIONS";
+ field public static final String WIFI_ACCESS_COEX_UNSAFE_CHANNELS = "android.permission.WIFI_ACCESS_COEX_UNSAFE_CHANNELS";
field public static final String WIFI_SET_DEVICE_MOBILITY_STATE = "android.permission.WIFI_SET_DEVICE_MOBILITY_STATE";
+ field public static final String WIFI_UPDATE_COEX_UNSAFE_CHANNELS = "android.permission.WIFI_UPDATE_COEX_UNSAFE_CHANNELS";
field public static final String WIFI_UPDATE_USABILITY_STATS_SCORE = "android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE";
field public static final String WRITE_DEVICE_CONFIG = "android.permission.WRITE_DEVICE_CONFIG";
field public static final String WRITE_DREAM_STATE = "android.permission.WRITE_DREAM_STATE";
@@ -1577,6 +1579,7 @@ package android.bluetooth {
field @NonNull public static final android.os.ParcelUuid HOGP;
field @NonNull public static final android.os.ParcelUuid HSP;
field @NonNull public static final android.os.ParcelUuid HSP_AG;
+ field @NonNull public static final android.os.ParcelUuid LE_AUDIO;
field @NonNull public static final android.os.ParcelUuid MAP;
field @NonNull public static final android.os.ParcelUuid MAS;
field @NonNull public static final android.os.ParcelUuid MNS;
@@ -1873,6 +1876,9 @@ package android.content.pm {
public class ApplicationInfo extends android.content.pm.PackageItemInfo implements android.os.Parcelable {
method public boolean isEncryptionAware();
method public boolean isInstantApp();
+ method public boolean isOem();
+ method public boolean isProduct();
+ method public boolean isVendor();
field public String credentialProtectedDataDir;
field public int targetSandboxVersion;
}
@@ -4139,8 +4145,11 @@ package android.media {
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();
@@ -4150,13 +4159,17 @@ package android.media {
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;
@@ -4164,7 +4177,9 @@ package android.media {
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);
@@ -4183,8 +4198,16 @@ package android.media {
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 {
@@ -6401,6 +6424,19 @@ package android.net {
method @NonNull public android.net.StaticIpConfiguration.Builder setIpAddress(@Nullable android.net.LinkAddress);
}
+ public final class TcpKeepalivePacketData extends android.net.KeepalivePacketData implements android.os.Parcelable {
+ ctor public TcpKeepalivePacketData(@NonNull java.net.InetAddress, int, @NonNull java.net.InetAddress, int, @NonNull byte[], int, int, int, int, int, int) throws android.net.InvalidPacketException;
+ method public int describeContents();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.net.TcpKeepalivePacketData> CREATOR;
+ field public final int ipTos;
+ field public final int ipTtl;
+ field public final int tcpAck;
+ field public final int tcpSeq;
+ field public final int tcpWindow;
+ field public final int tcpWindowScale;
+ }
+
public class TrafficStats {
method public static void setThreadStatsTagApp();
method public static void setThreadStatsTagBackup();
@@ -6949,12 +6985,14 @@ package android.os {
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);
@@ -7329,12 +7367,14 @@ package android.os {
public class RecoverySystem {
method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void cancelScheduledUpdate(android.content.Context) throws java.io.IOException;
- method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void clearPrepareForUnattendedUpdate(@NonNull android.content.Context) throws java.io.IOException;
+ method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static void clearPrepareForUnattendedUpdate(@NonNull android.content.Context) throws java.io.IOException;
method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void installPackage(android.content.Context, java.io.File, boolean) throws java.io.IOException;
- method @RequiresPermission(android.Manifest.permission.RECOVERY) public static void prepareForUnattendedUpdate(@NonNull android.content.Context, @NonNull String, @Nullable android.content.IntentSender) throws java.io.IOException;
+ method @RequiresPermission(anyOf={android.Manifest.permission.RECOVERY, android.Manifest.permission.REBOOT}) public static boolean isPreparedForUnattendedUpdate(@NonNull android.content.Context) throws java.io.IOException;
+ 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(android.Manifest.permission.RECOVERY) 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;
method public static boolean verifyPackageCompatibility(java.io.File) throws java.io.IOException;
@@ -11427,18 +11467,29 @@ package android.telephony.ims {
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getProvisioningStatusForCapability(int, int);
method @Nullable @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public String getProvisioningStringValue(int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) @WorkerThread public boolean getRcsProvisioningStatusForCapability(int);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isRcsVolteSingleRegistrationCapable() throws android.telephony.ims.ImsException;
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.Callback) throws android.telephony.ims.ImsException;
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void registerRcsProvisioningChangedCallback(@NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.ProvisioningManager.RcsProvisioningCallback) throws android.telephony.ims.ImsException;
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningIntValue(int, int);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setProvisioningStatusForCapability(int, int, boolean);
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public int setProvisioningStringValue(int, @NonNull String);
+ method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setRcsClientConfiguration(@NonNull android.telephony.ims.RcsClientConfiguration) throws android.telephony.ims.ImsException;
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @WorkerThread public void setRcsProvisioningStatusForCapability(int, boolean);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void triggerRcsReconfiguration();
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.Callback);
+ method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public void unregisterRcsProvisioningChangedCallback(@NonNull android.telephony.ims.ProvisioningManager.RcsProvisioningCallback);
+ field @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE = "android.telephony.ims.action.RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE";
+ field public static final String EXTRA_STATUS = "android.telephony.ims.extra.STATUS";
+ field public static final String EXTRA_SUBSCRIPTION_ID = "android.telephony.ims.extra.SUBSCRIPTION_ID";
field public static final int KEY_VOICE_OVER_WIFI_ENTITLEMENT_ID = 67; // 0x43
field public static final int KEY_VOICE_OVER_WIFI_MODE_OVERRIDE = 27; // 0x1b
field public static final int KEY_VOICE_OVER_WIFI_ROAMING_ENABLED_OVERRIDE = 26; // 0x1a
field public static final int PROVISIONING_VALUE_DISABLED = 0; // 0x0
field public static final int PROVISIONING_VALUE_ENABLED = 1; // 0x1
+ field public static final int STATUS_CAPABLE = 0; // 0x0
+ field public static final int STATUS_CARRIER_NOT_CAPABLE = 2; // 0x2
+ field public static final int STATUS_DEVICE_NOT_CAPABLE = 1; // 0x1
field public static final String STRING_QUERY_RESULT_ERROR_GENERIC = "STRING_QUERY_RESULT_ERROR_GENERIC";
field public static final String STRING_QUERY_RESULT_ERROR_NOT_READY = "STRING_QUERY_RESULT_ERROR_NOT_READY";
}
@@ -11449,6 +11500,27 @@ package android.telephony.ims {
method public void onProvisioningStringChanged(int, @NonNull String);
}
+ public static class ProvisioningManager.RcsProvisioningCallback {
+ ctor public ProvisioningManager.RcsProvisioningCallback();
+ method public void onAutoConfigurationErrorReceived(int, @NonNull String);
+ method public void onConfigurationChanged(@NonNull byte[]);
+ method public void onConfigurationReset();
+ method public void onRemoved();
+ }
+
+ public final class RcsClientConfiguration implements android.os.Parcelable {
+ ctor public RcsClientConfiguration(@NonNull String, @NonNull String, @NonNull String, @NonNull String);
+ method public int describeContents();
+ method @NonNull public String getClientVendor();
+ method @NonNull public String getClientVersion();
+ method @NonNull public String getRcsProfile();
+ method @NonNull public String getRcsVersion();
+ method public void writeToParcel(@NonNull android.os.Parcel, int);
+ field @NonNull public static final android.os.Parcelable.Creator<android.telephony.ims.RcsClientConfiguration> CREATOR;
+ field public static final String RCS_PROFILE_1_0 = "UP_1.0";
+ field public static final String RCS_PROFILE_2_3 = "UP_2.3";
+ }
+
public class RcsUceAdapter {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void setUceSettingEnabled(boolean) throws android.telephony.ims.ImsException;
}
@@ -11541,6 +11613,7 @@ package android.telephony.ims {
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void createSipDelegate(@NonNull android.telephony.ims.DelegateRequest, @NonNull java.util.concurrent.Executor, @NonNull android.telephony.ims.stub.DelegateConnectionStateCallback, @NonNull android.telephony.ims.stub.DelegateConnectionMessageCallback) throws android.telephony.ims.ImsException;
method @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) public void destroySipDelegate(@NonNull android.telephony.ims.SipDelegateConnection, int);
method @RequiresPermission(android.Manifest.permission.READ_PRIVILEGED_PHONE_STATE) public boolean isSupported() throws android.telephony.ims.ImsException;
+ method public void triggerFullNetworkRegistration(@NonNull android.telephony.ims.SipDelegateConnection, @IntRange(from=100, to=699) int, @Nullable String);
field public static final int DENIED_REASON_INVALID = 4; // 0x4
field public static final int DENIED_REASON_IN_USE_BY_ANOTHER_DELEGATE = 1; // 0x1
field public static final int DENIED_REASON_NOT_ALLOWED = 2; // 0x2
@@ -11736,11 +11809,15 @@ package android.telephony.ims.stub {
ctor public ImsConfigImplBase();
method public int getConfigInt(int);
method public String getConfigString(int);
+ method public final void notifyAutoConfigurationErrorReceived(int, @NonNull String);
method public final void notifyProvisionedValueChanged(int, int);
method public final void notifyProvisionedValueChanged(int, String);
method public void notifyRcsAutoConfigurationReceived(@NonNull byte[], boolean);
+ method public void notifyRcsAutoConfigurationRemoved();
method public int setConfig(int, int);
method public int setConfig(int, String);
+ method public void setRcsClientConfiguration(@NonNull android.telephony.ims.RcsClientConfiguration);
+ method public void triggerAutoConfiguration();
field public static final int CONFIG_RESULT_FAILED = 1; // 0x1
field public static final int CONFIG_RESULT_SUCCESS = 0; // 0x0
field public static final int CONFIG_RESULT_UNKNOWN = -1; // 0xffffffff
@@ -11785,6 +11862,9 @@ package android.telephony.ims.stub {
method public final void onRegistering(int);
method public final void onSubscriberAssociatedUriChanged(android.net.Uri[]);
method public final void onTechnologyChangeFailed(int, android.telephony.ims.ImsReasonInfo);
+ method public void triggerFullNetworkRegistration(@IntRange(from=100, to=699) int, @Nullable String);
+ method public void triggerSipDelegateDeregistration();
+ method public void updateSipDelegateRegistration();
field public static final int REGISTRATION_TECH_IWLAN = 1; // 0x1
field public static final int REGISTRATION_TECH_LTE = 0; // 0x0
field public static final int REGISTRATION_TECH_NONE = -1; // 0xffffffff
diff --git a/core/api/test-current.txt b/core/api/test-current.txt
index feadd06761f9..9cf9ce45602b 100644
--- a/core/api/test-current.txt
+++ b/core/api/test-current.txt
@@ -850,6 +850,7 @@ package android.media {
}
public class AudioManager {
+ method @Nullable public static android.media.AudioDeviceInfo getDeviceInfoFromType(int);
method public boolean hasRegisteredDynamicPolicy();
}
@@ -871,6 +872,9 @@ package android.media {
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 6edc8ea6a3a6..9acf675615a6 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.PackageManager.NameNotFoundException;
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.ArraySet;
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 @@ public class DevicePolicyManager {
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 2dfbb3ae81e4..e4b2d7075d47 100644
--- a/core/java/android/bluetooth/BluetoothAdapter.java
+++ b/core/java/android/bluetooth/BluetoothAdapter.java
@@ -2933,6 +2933,16 @@ public final class BluetoothAdapter {
}
});
}
+ 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 @@ public final class BluetoothAdapter {
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;
+ 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();
}
- } 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) {
+ // 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/bluetooth/BluetoothUuid.java b/core/java/android/bluetooth/BluetoothUuid.java
index e274af1b5c5d..56c482471003 100644
--- a/core/java/android/bluetooth/BluetoothUuid.java
+++ b/core/java/android/bluetooth/BluetoothUuid.java
@@ -153,7 +153,12 @@ public final class BluetoothUuid {
@SystemApi
public static final ParcelUuid HEARING_AID =
ParcelUuid.fromString("0000FDF0-0000-1000-8000-00805f9b34fb");
-
+ /** Placeholder until specification is released
+ * @hide */
+ @NonNull
+ @SystemApi
+ public static final ParcelUuid LE_AUDIO =
+ ParcelUuid.fromString("EEEEEEEE-EEEE-EEEE-EEEE-EEEEEEEEEEEE");
/** @hide */
@NonNull
@SystemApi
diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java
index 81d9b11bc644..e32068fe4b39 100644
--- a/core/java/android/content/pm/ApplicationInfo.java
+++ b/core/java/android/content/pm/ApplicationInfo.java
@@ -2101,7 +2101,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
}
/** @hide */
- @SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+ @SystemApi
public boolean isOem() {
return (privateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
}
@@ -2149,13 +2149,13 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable {
}
/** @hide */
- @SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+ @SystemApi
public boolean isVendor() {
return (privateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0;
}
/** @hide */
- @SystemApi(client = SystemApi.Client.SYSTEM_SERVER)
+ @SystemApi
public boolean isProduct() {
return (privateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0;
}
diff --git a/core/java/android/content/pm/LimitedLengthInputStream.java b/core/java/android/content/pm/LimitedLengthInputStream.java
index 19b681e4373a..05089f6e0165 100644
--- a/core/java/android/content/pm/LimitedLengthInputStream.java
+++ b/core/java/android/content/pm/LimitedLengthInputStream.java
@@ -1,6 +1,6 @@
package android.content.pm;
-import libcore.util.ArrayUtils;
+import com.android.internal.util.ArrayUtils;
import java.io.FilterInputStream;
import java.io.IOException;
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index ae1067d8d82d..00f5fb95768f 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -2367,6 +2367,23 @@ public abstract class PackageManager {
/**
* Feature for {@link #getSystemAvailableFeatures} and
+ * {@link #hasSystemFeature(String, int)}: If this feature is supported, the feature version
+ * specifies a date such that the device is known to pass the OpenGLES dEQP test suite
+ * associated with that date. The date is encoded as follows:
+ * <ul>
+ * <li>Year in bits 31-16</li>
+ * <li>Month in bits 15-8</li>
+ * <li>Day in bits 7-0</li>
+ * </ul>
+ * <p>
+ * Example: 2021-03-01 is encoded as 0x07E50301, and would indicate that the device passes the
+ * OpenGL ES dEQP test suite version that was current on 2021-03-01.
+ */
+ @SdkConstant(SdkConstantType.FEATURE)
+ public static final String FEATURE_OPENGLES_DEQP_LEVEL = "android.software.opengles.deqp.level";
+
+ /**
+ * Feature for {@link #getSystemAvailableFeatures} and
* {@link #hasSystemFeature}: The device includes broadcast radio tuner.
* @hide
*/
diff --git a/core/java/android/content/res/ResourcesImpl.java b/core/java/android/content/res/ResourcesImpl.java
index c16006a6a619..477ffeff7e75 100644
--- a/core/java/android/content/res/ResourcesImpl.java
+++ b/core/java/android/content/res/ResourcesImpl.java
@@ -548,7 +548,24 @@ public class ResourcesImpl {
remainder = languageTag.substring(separator);
}
- return Locale.adjustLanguageCode(language) + remainder;
+ // No need to convert to lower cases because the language in the return value of
+ // Locale.toLanguageTag has been lower-cased.
+ final String adjustedLanguage;
+ switch(language) {
+ case "id":
+ adjustedLanguage = "in";
+ break;
+ case "yi":
+ adjustedLanguage = "ji";
+ break;
+ case "he":
+ adjustedLanguage = "iw";
+ break;
+ default:
+ adjustedLanguage = language;
+ break;
+ }
+ return adjustedLanguage + remainder;
}
/**
diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java
index 1e968721e637..540ea5c159cc 100644
--- a/core/java/android/net/ConnectivityManager.java
+++ b/core/java/android/net/ConnectivityManager.java
@@ -3152,9 +3152,9 @@ public class ConnectivityManager {
}
/**
- * Set sign in error notification to visible or in visible
+ * Set sign in error notification to visible or invisible
*
- * {@hide}
+ * @hide
* @deprecated Doesn't properly deal with multiple connected networks of the same type.
*/
@Deprecated
diff --git a/core/java/android/net/IConnectivityManager.aidl b/core/java/android/net/IConnectivityManager.aidl
index fb0128363310..95a2f2efeb7d 100644
--- a/core/java/android/net/IConnectivityManager.aidl
+++ b/core/java/android/net/IConnectivityManager.aidl
@@ -31,6 +31,7 @@ import android.net.ISocketKeepaliveCallback;
import android.net.ProxyInfo;
import android.os.Bundle;
import android.os.IBinder;
+import android.os.INetworkActivityListener;
import android.os.Messenger;
import android.os.ParcelFileDescriptor;
import android.os.PersistableBundle;
@@ -233,4 +234,10 @@ interface IConnectivityManager
in PersistableBundle extras);
void systemReady();
+
+ void registerNetworkActivityListener(in INetworkActivityListener l);
+
+ void unregisterNetworkActivityListener(in INetworkActivityListener l);
+
+ boolean isDefaultNetworkActive();
}
diff --git a/core/java/android/net/INetworkManagementEventObserver.aidl b/core/java/android/net/INetworkManagementEventObserver.aidl
index f0fe92eb8641..37813ce11a5f 100644
--- a/core/java/android/net/INetworkManagementEventObserver.aidl
+++ b/core/java/android/net/INetworkManagementEventObserver.aidl
@@ -85,11 +85,14 @@ oneway interface INetworkManagementEventObserver {
/**
* 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 e486052e0e53..792e5b410afc 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 @@ interface INetworkPolicyManager {
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 0941e7dbed17..486e2d74dd05 100644
--- a/core/java/android/net/LinkProperties.java
+++ b/core/java/android/net/LinkProperties.java
@@ -20,12 +20,13 @@ import android.annotation.NonNull;
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 178183dbe043..c7116b41e80a 100644
--- a/core/java/android/net/MacAddress.java
+++ b/core/java/android/net/MacAddress.java
@@ -20,13 +20,13 @@ import android.annotation.IntDef;
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 f05f033b2fa5..ce16a7835179 100644
--- a/core/java/android/net/NetworkPolicyManager.java
+++ b/core/java/android/net/NetworkPolicyManager.java
@@ -432,6 +432,17 @@ public class NetworkPolicyManager {
}
}
+ /**
+ * 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 fba75614342d..bf25602041cf 100644
--- a/core/java/android/net/NetworkStatsHistory.java
+++ b/core/java/android/net/NetworkStatsHistory.java
@@ -26,9 +26,9 @@ import static android.net.NetworkStatsHistory.DataStreamUtils.writeVarLongArray;
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 d84ee2a87b43..b5962c5bae14 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 class NetworkUtils {
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 @@ public class NetworkUtils {
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 20ccc07b18dd..03b07e080add 100644
--- a/core/java/android/net/Proxy.java
+++ b/core/java/android/net/Proxy.java
@@ -24,6 +24,8 @@ import android.os.Build;
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 @@ public final class Proxy {
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 6166a753d83e..94f849f006f3 100644
--- a/core/java/android/net/RouteInfo.java
+++ b/core/java/android/net/RouteInfo.java
@@ -21,11 +21,12 @@ import android.annotation.NonNull;
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/TcpKeepalivePacketData.java b/core/java/android/net/TcpKeepalivePacketData.java
new file mode 100644
index 000000000000..ddb3a6a72fb4
--- /dev/null
+++ b/core/java/android/net/TcpKeepalivePacketData.java
@@ -0,0 +1,163 @@
+/*
+ * 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;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.net.InetAddress;
+import java.util.Objects;
+
+/**
+ * Represents the actual tcp keep alive packets which will be used for hardware offload.
+ * @hide
+ */
+@SystemApi
+public final class TcpKeepalivePacketData extends KeepalivePacketData implements Parcelable {
+ private static final String TAG = "TcpKeepalivePacketData";
+
+ /** TCP sequence number. */
+ public final int tcpSeq;
+
+ /** TCP ACK number. */
+ public final int tcpAck;
+
+ /** TCP RCV window. */
+ public final int tcpWindow;
+
+ /** TCP RCV window scale. */
+ public final int tcpWindowScale;
+
+ /** IP TOS. */
+ public final int ipTos;
+
+ /** IP TTL. */
+ public final int ipTtl;
+
+ public TcpKeepalivePacketData(@NonNull final InetAddress srcAddress, int srcPort,
+ @NonNull final InetAddress dstAddress, int dstPort, @NonNull final byte[] data,
+ int tcpSeq, int tcpAck, int tcpWindow, int tcpWindowScale, int ipTos, int ipTtl)
+ throws InvalidPacketException {
+ super(srcAddress, srcPort, dstAddress, dstPort, data);
+ this.tcpSeq = tcpSeq;
+ this.tcpAck = tcpAck;
+ this.tcpWindow = tcpWindow;
+ this.tcpWindowScale = tcpWindowScale;
+ this.ipTos = ipTos;
+ this.ipTtl = ipTtl;
+ }
+
+ @Override
+ public boolean equals(@Nullable final Object o) {
+ if (!(o instanceof TcpKeepalivePacketData)) return false;
+ final TcpKeepalivePacketData other = (TcpKeepalivePacketData) o;
+ final InetAddress srcAddress = getSrcAddress();
+ final InetAddress dstAddress = getDstAddress();
+ return srcAddress.equals(other.getSrcAddress())
+ && dstAddress.equals(other.getDstAddress())
+ && getSrcPort() == other.getSrcPort()
+ && getDstPort() == other.getDstPort()
+ && this.tcpAck == other.tcpAck
+ && this.tcpSeq == other.tcpSeq
+ && this.tcpWindow == other.tcpWindow
+ && this.tcpWindowScale == other.tcpWindowScale
+ && this.ipTos == other.ipTos
+ && this.ipTtl == other.ipTtl;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(getSrcAddress(), getDstAddress(), getSrcPort(), getDstPort(),
+ tcpAck, tcpSeq, tcpWindow, tcpWindowScale, ipTos, ipTtl);
+ }
+
+ /**
+ * Parcelable Implementation.
+ * Note that this object implements parcelable (and needs to keep doing this as it inherits
+ * from a class that does), but should usually be parceled as a stable parcelable using
+ * the toStableParcelable() and fromStableParcelable() methods.
+ */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Write to parcel. */
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ out.writeString(getSrcAddress().getHostAddress());
+ out.writeString(getDstAddress().getHostAddress());
+ out.writeInt(getSrcPort());
+ out.writeInt(getDstPort());
+ out.writeByteArray(getPacket());
+ out.writeInt(tcpSeq);
+ out.writeInt(tcpAck);
+ out.writeInt(tcpWindow);
+ out.writeInt(tcpWindowScale);
+ out.writeInt(ipTos);
+ out.writeInt(ipTtl);
+ }
+
+ private static TcpKeepalivePacketData readFromParcel(Parcel in) throws InvalidPacketException {
+ InetAddress srcAddress = InetAddresses.parseNumericAddress(in.readString());
+ InetAddress dstAddress = InetAddresses.parseNumericAddress(in.readString());
+ int srcPort = in.readInt();
+ int dstPort = in.readInt();
+ byte[] packet = in.createByteArray();
+ int tcpSeq = in.readInt();
+ int tcpAck = in.readInt();
+ int tcpWnd = in.readInt();
+ int tcpWndScale = in.readInt();
+ int ipTos = in.readInt();
+ int ipTtl = in.readInt();
+ return new TcpKeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, packet, tcpSeq,
+ tcpAck, tcpWnd, tcpWndScale, ipTos, ipTtl);
+ }
+
+ /** Parcelable Creator. */
+ public static final @NonNull Parcelable.Creator<TcpKeepalivePacketData> CREATOR =
+ new Parcelable.Creator<TcpKeepalivePacketData>() {
+ public TcpKeepalivePacketData createFromParcel(Parcel in) {
+ try {
+ return readFromParcel(in);
+ } catch (InvalidPacketException e) {
+ throw new IllegalArgumentException(
+ "Invalid TCP keepalive data: " + e.getError());
+ }
+ }
+
+ public TcpKeepalivePacketData[] newArray(int size) {
+ return new TcpKeepalivePacketData[size];
+ }
+ };
+
+ @Override
+ public String toString() {
+ return "saddr: " + getSrcAddress()
+ + " daddr: " + getDstAddress()
+ + " sport: " + getSrcPort()
+ + " dport: " + getDstPort()
+ + " seq: " + tcpSeq
+ + " ack: " + tcpAck
+ + " window: " + tcpWindow
+ + " windowScale: " + tcpWindowScale
+ + " tos: " + ipTos
+ + " ttl: " + ipTtl;
+ }
+}
diff --git a/core/java/android/net/vcn/VcnConfig.java b/core/java/android/net/vcn/VcnConfig.java
index 148acf130857..d4a3fa7411b1 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 @@ public final class VcnConfig implements Parcelable {
}
@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 @@ public final class VcnConfig implements Parcelable {
/** 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 @@ public final class VcnConfig implements Parcelable {
*/
@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 8160edc87440..039360a69a3a 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 @@ import android.annotation.NonNull;
* <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();
+ }
+
+ /** @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();
}
- // TODO: Implement getters, validators, etc
+ 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);
+ }
+
+ /**
+ * 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);
+
+ return mExposedCapabilities.contains(capability);
+ }
+
+ /**
+ * Returns all capabilities required of underlying networks.
+ *
+ * @hide
+ */
+ @NonNull
+ public Set<Integer> getAllUnderlyingCapabilities() {
+ return Collections.unmodifiableSet(mUnderlyingCapabilities);
}
- // Parcelable methods
+ /**
+ * 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);
+ }
- /** This class is used to incrementally build {@link VcnGatewayConnectionConfig} objects */
+ /** 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.
+
+ /**
+ * 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
+ * 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 6769b9e46e4c..19c183f9fe9c 100644
--- a/core/java/android/net/vcn/VcnManager.java
+++ b/core/java/android/net/vcn/VcnManager.java
@@ -23,10 +23,37 @@ import android.annotation.SystemService;
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 @@ public final class VcnManager {
* @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 @@ public final class VcnManager {
* @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 a9585c62866b..258e58d7d019 100644
--- a/core/java/android/os/BatteryStatsManager.java
+++ b/core/java/android/os/BatteryStatsManager.java
@@ -26,6 +26,7 @@ import android.annotation.SystemService;
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 @@ public final class BatteryStatsManager {
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/FileBridge.java b/core/java/android/os/FileBridge.java
index ab5637cbb878..7b84575a8955 100644
--- a/core/java/android/os/FileBridge.java
+++ b/core/java/android/os/FileBridge.java
@@ -22,11 +22,12 @@ import android.system.ErrnoException;
import android.system.Os;
import android.util.Log;
+import com.android.internal.util.ArrayUtils;
+
import libcore.io.IoBridge;
import libcore.io.IoUtils;
import libcore.io.Memory;
import libcore.io.Streams;
-import libcore.util.ArrayUtils;
import java.io.FileDescriptor;
import java.io.IOException;
diff --git a/core/java/android/os/GraphicsEnvironment.java b/core/java/android/os/GraphicsEnvironment.java
index df1f1b21eba3..e77b163743fe 100644
--- a/core/java/android/os/GraphicsEnvironment.java
+++ b/core/java/android/os/GraphicsEnvironment.java
@@ -249,6 +249,7 @@ public class GraphicsEnvironment {
}
if (appInfo == null) {
Log.w(TAG, "Debug layer app '" + packageName + "' not installed");
+ return "";
}
final String abi = chooseAbi(appInfo);
diff --git a/core/java/android/os/INetworkManagementService.aidl b/core/java/android/os/INetworkManagementService.aidl
index 25d84bab89e2..33deddae01b6 100644
--- a/core/java/android/os/INetworkManagementService.aidl
+++ b/core/java/android/os/INetworkManagementService.aidl
@@ -282,8 +282,8 @@ interface INetworkManagementService
/**
* 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 2561e1ea69c6..205288303b1e 100644
--- a/core/java/android/os/IRecoverySystem.aidl
+++ b/core/java/android/os/IRecoverySystem.aidl
@@ -27,7 +27,9 @@ interface IRecoverySystem {
boolean setupBcb(in String command);
boolean clearBcb();
void rebootRecoveryWithCommand(in String command);
- boolean requestLskf(in String updateToken, in IntentSender sender);
- boolean clearLskf();
- boolean rebootWithLskf(in String updateToken, in String reason);
+ 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/Parcel.java b/core/java/android/os/Parcel.java
index cf90174924f1..6acdcc4722d2 100644
--- a/core/java/android/os/Parcel.java
+++ b/core/java/android/os/Parcel.java
@@ -33,11 +33,12 @@ import android.util.SparseArray;
import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
+import com.android.internal.util.ArrayUtils;
+
import dalvik.annotation.optimization.CriticalNative;
import dalvik.annotation.optimization.FastNative;
import dalvik.system.VMRuntime;
-import libcore.util.ArrayUtils;
import libcore.util.SneakyThrow;
import java.io.ByteArrayInputStream;
diff --git a/core/java/android/os/RecoverySystem.java b/core/java/android/os/RecoverySystem.java
index 38e170402ae9..6713de83d394 100644
--- a/core/java/android/os/RecoverySystem.java
+++ b/core/java/android/os/RecoverySystem.java
@@ -631,31 +631,35 @@ public class RecoverySystem {
/**
* Prepare to apply an unattended update by asking the user for their Lock Screen Knowledge
* Factor (LSKF). If supplied, the {@code intentSender} will be called when the system is setup
- * and ready to apply the OTA.
- * <p>
- * When the system is already prepared for update and this API is called again with the same
- * {@code updateToken}, it will not call the intent sender nor request the user enter their Lock
- * Screen Knowledge Factor.
- * <p>
- * When this API is called again with a different {@code updateToken}, the prepared-for-update
- * status is reset and process repeats as though it's the initial call to this method as
- * described in the first paragraph.
+ * and ready to apply the OTA. This API is expected to handle requests from multiple clients
+ * simultaneously, e.g. from ota and mainline.
+ *
+ * <p> The behavior of multi-client Resume on Reboot works as follows
+ * <li> Each client should call this function to prepare for Resume on Reboot before calling
+ * {@link #rebootAndApply(Context, String, boolean)} </li>
+ * <li> One client cannot clear the Resume on Reboot preparation of another client. </li>
+ * <li> If multiple clients have prepared for Resume on Reboot, the subsequent reboot will be
+ * first come, first served. </li>
*
* @param context the Context to use.
- * @param updateToken token used to indicate which update was prepared
+ * @param updateToken this parameter is deprecated and won't be used. Callers can supply with
+ * an empty string. See details in
+ * <a href="http://go/multi-client-ror">http://go/multi-client-ror</a>
+ * TODO(xunchang) update the link of document with the public doc.
* @param intentSender the intent to call when the update is prepared; may be {@code null}
* @throws IOException if there were any errors setting up unattended update
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.RECOVERY)
+ @RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
+ android.Manifest.permission.REBOOT})
public static void prepareForUnattendedUpdate(@NonNull Context context,
@NonNull String updateToken, @Nullable IntentSender intentSender) throws IOException {
if (updateToken == null) {
throw new NullPointerException("updateToken == null");
}
RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);
- if (!rs.requestLskf(updateToken, intentSender)) {
+ if (!rs.requestLskf(context.getPackageName(), intentSender)) {
throw new IOException("preparation for update failed");
}
}
@@ -664,32 +668,38 @@ public class RecoverySystem {
* Request that any previously requested Lock Screen Knowledge Factor (LSKF) is cleared and
* the preparation for unattended update is reset.
*
+ * <p> Note that the API won't clear the underlying Resume on Reboot preparation state if
+ * another client has requested. So the reboot call from the other client can still succeed.
+ *
* @param context the Context to use.
* @throws IOException if there were any errors clearing the unattended update state
* @hide
*/
@SystemApi
- @RequiresPermission(android.Manifest.permission.RECOVERY)
+ @RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
+ android.Manifest.permission.REBOOT})
public static void clearPrepareForUnattendedUpdate(@NonNull Context context)
throws IOException {
RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);
- if (!rs.clearLskf()) {
+ if (!rs.clearLskf(context.getPackageName())) {
throw new IOException("could not reset unattended update state");
}
}
/**
- * Request that the device reboot and apply the update that has been prepared. The
- * {@code updateToken} must match what was given for {@link #prepareForUnattendedUpdate} or
- * this will return {@code false}.
+ * 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 the token used to call {@link #prepareForUnattendedUpdate} before
+ * @param updateToken this parameter is deprecated and won't be used. See details in
+ * <a href="http://go/multi-client-ror">http://go/multi-client-ror</a>
+ * TODO(xunchang) update the link of document with the public doc.
* @param reason the reboot reason to give to the {@link PowerManager}
* @throws IOException if the reboot couldn't proceed because the device wasn't ready for an
* 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(android.Manifest.permission.RECOVERY)
@@ -699,7 +709,47 @@ public class RecoverySystem {
throw new NullPointerException("updateToken == null");
}
RecoverySystem rs = (RecoverySystem) context.getSystemService(Context.RECOVERY_SERVICE);
- if (!rs.rebootWithLskf(updateToken, reason)) {
+ // 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");
+ }
+ }
+
+ /**
+ * Query if Resume on Reboot has been prepared for a given caller.
+ *
+ * @param context the Context to use.
+ * @throws IOException if there were any errors connecting to the service or querying the state.
+ * @hide
+ */
+ @SystemApi
+ @RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
+ android.Manifest.permission.REBOOT})
+ public static boolean isPreparedForUnattendedUpdate(@NonNull Context context)
+ throws IOException {
+ RecoverySystem rs = context.getSystemService(RecoverySystem.class);
+ return rs.isLskfCaptured(context.getPackageName());
+ }
+
+ /**
+ * Request that the device reboot and apply the update that has been prepared.
+ * {@link #prepareForUnattendedUpdate} must be called before for the given client,
+ * otherwise the function call will fail.
+ *
+ * @param context the Context to use.
+ * @param reason the reboot reason to give to the {@link PowerManager}
+ * @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
+ */
+ @SystemApi
+ @RequiresPermission(anyOf = {android.Manifest.permission.RECOVERY,
+ android.Manifest.permission.REBOOT})
+ public static void rebootAndApply(@NonNull Context context,
+ @NonNull String reason, boolean slotSwitch) throws IOException {
+ RecoverySystem rs = context.getSystemService(RecoverySystem.class);
+ if (!rs.rebootWithLskf(context.getPackageName(), reason, slotSwitch)) {
throw new IOException("system not prepared to apply update");
}
}
@@ -1283,16 +1333,15 @@ public class RecoverySystem {
/**
* Begins the process of asking the user for the Lock Screen Knowledge Factor.
*
- * @param updateToken token that will be used in calls to {@link #rebootAndApply} to ensure
- * that the preparation was for the correct update
+ * @param packageName the package name of the caller who requests Resume on Reboot
* @return true if the request was correct
* @throws IOException if the recovery system service could not be contacted
*/
- private boolean requestLskf(String updateToken, IntentSender sender) throws IOException {
+ private boolean requestLskf(String packageName, IntentSender sender) throws IOException {
try {
- return mService.requestLskf(updateToken, sender);
+ return mService.requestLskf(packageName, sender);
} catch (RemoteException e) {
- throw new IOException("could request update");
+ throw new IOException("could request LSKF capture");
}
}
@@ -1302,22 +1351,52 @@ public class RecoverySystem {
* @return true if the setup for OTA was cleared
* @throws IOException if the recovery system service could not be contacted
*/
- private boolean clearLskf() throws IOException {
+ private boolean clearLskf(String packageName) throws IOException {
try {
- return mService.clearLskf();
+ return mService.clearLskf(packageName);
} catch (RemoteException e) {
throw new IOException("could not clear LSKF");
}
}
/**
+ * Queries if the Resume on Reboot has been prepared for a given caller.
+ *
+ * @param packageName the identifier of the caller who requests Resume on Reboot
+ * @return true if Resume on Reboot is prepared.
+ * @throws IOException if the recovery system service could not be contacted
+ */
+ private boolean isLskfCaptured(String packageName) throws IOException {
+ try {
+ return mService.isLskfCaptured(packageName);
+ } catch (RemoteException e) {
+ throw new IOException("could not get LSKF capture state");
+ }
+ }
+
+ /**
* Calls the recovery system service to reboot and apply update.
*
- * @param updateToken the update token for which the update was prepared
*/
- private boolean rebootWithLskf(String updateToken, String reason) throws IOException {
+ private boolean rebootWithLskf(String packageName, String reason, boolean slotSwitch)
+ throws IOException {
+ try {
+ return mService.rebootWithLskf(packageName, reason, slotSwitch);
+ } catch (RemoteException e) {
+ throw new IOException("could not reboot for update");
+ }
+ }
+
+
+ /**
+ * 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.rebootWithLskf(updateToken, reason);
+ return mService.rebootWithLskfAssumeSlotSwitch(packageName, reason);
} catch (RemoteException e) {
throw new IOException("could not reboot for update");
}
diff --git a/core/java/android/os/incremental/OWNERS b/core/java/android/os/incremental/OWNERS
new file mode 100644
index 000000000000..3795493b861f
--- /dev/null
+++ b/core/java/android/os/incremental/OWNERS
@@ -0,0 +1,5 @@
+# Bug component: 554432
+alexbuy@google.com
+schfan@google.com
+toddke@google.com
+zyy@google.com
diff --git a/core/java/android/provider/ContactsContract.java b/core/java/android/provider/ContactsContract.java
index fa1b7d501181..38a59f0b4241 100644
--- a/core/java/android/provider/ContactsContract.java
+++ b/core/java/android/provider/ContactsContract.java
@@ -4305,13 +4305,23 @@ public final class ContactsContract {
* <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 792ff20f6d28..cb1509af66ac 100644
--- a/core/java/android/provider/OWNERS
+++ b/core/java/android/provider/OWNERS
@@ -1,9 +1,18 @@
-per-file DeviceConfig.java = svetoslavganov@google.com
-per-file DeviceConfig.java = hackbod@google.com
-per-file DeviceConfig.java = schfan@google.com
-
-per-file CallLog.java = file:/telephony/OWNERS
-per-file DocumentsContract.java = file:/core/java/android/os/storage/OWNERS
-per-file DocumentsProvider.java = file:/core/java/android/os/storage/OWNERS
-per-file MediaStore.java = file:/core/java/android/os/storage/OWNERS
-per-file Telephony.java = file:/telephony/OWNERS
+per-file *BlockedNumber* = file:/telephony/OWNERS
+per-file *Telephony* = file:/telephony/OWNERS
+
+per-file *CallLog* = file:platform/packages/providers/ContactsProvider:/OWNERS
+per-file *Contacts* = file:platform/packages/providers/ContactsProvider:/OWNERS
+per-file *Voicemail* = file:platform/packages/providers/ContactsProvider:/OWNERS
+
+per-file *Calendar* = file:platform/packages/providers/CalendarProvider:/OWNERS
+
+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
+
+per-file *Slices* = file:/core/java/android/app/slice/OWNERS
diff --git a/core/java/android/provider/Telephony.java b/core/java/android/provider/Telephony.java
index 6054de8daf42..727769cb5ab8 100644
--- a/core/java/android/provider/Telephony.java
+++ b/core/java/android/provider/Telephony.java
@@ -5167,6 +5167,14 @@ public final class Telephony {
public static final String COLUMN_IMS_RCS_UCE_ENABLED = "ims_rcs_uce_enabled";
/**
+ * TelephonyProvider column name for determining if the user has enabled cross SIM calling
+ * for this subscription.
+ *
+ * @hide
+ */
+ public static final String COLUMN_CROSS_SIM_CALLING_ENABLED = "cross_sim_calling_enabled";
+
+ /**
* TelephonyProvider column name for whether a subscription is opportunistic, that is,
* whether the network it connects to is limited in functionality or coverage.
* For example, CBRS.
@@ -5270,5 +5278,13 @@ public final class Telephony {
* @hide
*/
public static final String COLUMN_ALLOWED_NETWORK_TYPES = "allowed_network_types";
+
+ /**
+ * TelephonyProvider column name for RCS configuration.
+ * <p>TYPE: BLOB
+ *
+ * @hide
+ */
+ public static final String COLUMN_RCS_CONFIG = "rcs_config";
}
}
diff --git a/core/java/android/security/OWNERS b/core/java/android/security/OWNERS
index 3f8d75e6118d..7140ff12be64 100644
--- a/core/java/android/security/OWNERS
+++ b/core/java/android/security/OWNERS
@@ -7,3 +7,5 @@ per-file NetworkSecurityPolicy.java = cbrubaker@google.com
per-file NetworkSecurityPolicy.java = klyubin@google.com
per-file FrameworkNetworkSecurityPolicy.java = cbrubaker@google.com
per-file FrameworkNetworkSecurityPolicy.java = klyubin@google.com
+per-file Confirmation*.java = jdanis@google.com
+per-file Confirmation*.java = swillden@google.com
diff --git a/core/java/android/service/attestation/OWNERS b/core/java/android/service/attestation/OWNERS
new file mode 100644
index 000000000000..b9e7b996e5d8
--- /dev/null
+++ b/core/java/android/service/attestation/OWNERS
@@ -0,0 +1,2 @@
+chaviw@google.com
+ogunwale@google.com
diff --git a/core/java/android/service/storage/OWNERS b/core/java/android/service/storage/OWNERS
new file mode 100644
index 000000000000..6f9dbea36b06
--- /dev/null
+++ b/core/java/android/service/storage/OWNERS
@@ -0,0 +1 @@
+include /core/java/android/os/storage/OWNERS
diff --git a/core/java/android/uwb/AngleMeasurement.java b/core/java/android/uwb/AngleMeasurement.java
index 33bc121d8555..93b5fd4cd4b6 100644
--- a/core/java/android/uwb/AngleMeasurement.java
+++ b/core/java/android/uwb/AngleMeasurement.java
@@ -17,6 +17,7 @@
package android.uwb;
import android.annotation.FloatRange;
+import android.annotation.NonNull;
import android.os.Parcel;
import android.os.Parcelable;
@@ -109,7 +110,7 @@ public final class AngleMeasurement implements Parcelable {
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeDouble(mRadians);
dest.writeDouble(mErrorRadians);
dest.writeDouble(mConfidenceLevel);
@@ -146,6 +147,7 @@ public final class AngleMeasurement implements Parcelable {
* @param radians angle in radians
* @throws IllegalArgumentException if angle exceeds allowed limits of [-Math.PI, +Math.PI]
*/
+ @NonNull
public Builder setRadians(double radians) {
if (radians < -Math.PI || radians > Math.PI) {
throw new IllegalArgumentException("Invalid radians: " + radians);
@@ -160,6 +162,7 @@ public final class AngleMeasurement implements Parcelable {
* @param errorRadians error of the angle in radians
* @throws IllegalArgumentException if the error exceeds the allowed limits of [0, +Math.PI]
*/
+ @NonNull
public Builder setErrorRadians(double errorRadians) {
if (errorRadians < 0.0 || errorRadians > Math.PI) {
throw new IllegalArgumentException(
@@ -175,6 +178,7 @@ public final class AngleMeasurement implements Parcelable {
* @param confidenceLevel level of confidence of the angle measurement
* @throws IllegalArgumentException if the error exceeds the allowed limits of [0.0, 1.0]
*/
+ @NonNull
public Builder setConfidenceLevel(double confidenceLevel) {
if (confidenceLevel < 0.0 || confidenceLevel > 1.0) {
throw new IllegalArgumentException(
@@ -189,6 +193,7 @@ public final class AngleMeasurement implements Parcelable {
*
* @throws IllegalStateException if angle, error, or confidence values are missing
*/
+ @NonNull
public AngleMeasurement build() {
if (Double.isNaN(mRadians)) {
throw new IllegalStateException("Angle is not set");
diff --git a/core/java/android/uwb/AngleOfArrivalMeasurement.java b/core/java/android/uwb/AngleOfArrivalMeasurement.java
index cd5af691ed51..20a1c7aa72d0 100644
--- a/core/java/android/uwb/AngleOfArrivalMeasurement.java
+++ b/core/java/android/uwb/AngleOfArrivalMeasurement.java
@@ -53,7 +53,7 @@ public final class AngleOfArrivalMeasurement implements Parcelable {
* @return the azimuth {@link AngleMeasurement}
*/
@NonNull
- public AngleMeasurement getAzimuth() {
+ public AngleMeasurement getAzimuthAngleMeasurement() {
return mAzimuthAngleMeasurement;
}
@@ -70,7 +70,7 @@ public final class AngleOfArrivalMeasurement implements Parcelable {
* @return altitude {@link AngleMeasurement} or null when this is not available
*/
@Nullable
- public AngleMeasurement getAltitude() {
+ public AngleMeasurement getAltitudeAngleMeasurement() {
return mAltitudeAngleMeasurement;
}
@@ -85,8 +85,8 @@ public final class AngleOfArrivalMeasurement implements Parcelable {
if (obj instanceof AngleOfArrivalMeasurement) {
AngleOfArrivalMeasurement other = (AngleOfArrivalMeasurement) obj;
- return mAzimuthAngleMeasurement.equals(other.getAzimuth())
- && mAltitudeAngleMeasurement.equals(other.getAltitude());
+ return mAzimuthAngleMeasurement.equals(other.getAzimuthAngleMeasurement())
+ && mAltitudeAngleMeasurement.equals(other.getAltitudeAngleMeasurement());
}
return false;
}
@@ -105,7 +105,7 @@ public final class AngleOfArrivalMeasurement implements Parcelable {
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeParcelable(mAzimuthAngleMeasurement, flags);
dest.writeParcelable(mAltitudeAngleMeasurement, flags);
}
@@ -143,6 +143,7 @@ public final class AngleOfArrivalMeasurement implements Parcelable {
*
* @param azimuthAngle azimuth angle
*/
+ @NonNull
public Builder setAzimuthAngleMeasurement(@NonNull AngleMeasurement azimuthAngle) {
mAzimuthAngleMeasurement = azimuthAngle;
return this;
@@ -153,6 +154,7 @@ public final class AngleOfArrivalMeasurement implements Parcelable {
*
* @param altitudeAngle altitude angle
*/
+ @NonNull
public Builder setAltitudeAngleMeasurement(@NonNull AngleMeasurement altitudeAngle) {
mAltitudeAngleMeasurement = altitudeAngle;
return this;
@@ -163,6 +165,7 @@ public final class AngleOfArrivalMeasurement implements Parcelable {
*
* @throws IllegalStateException if the required azimuth angle is not provided
*/
+ @NonNull
public AngleOfArrivalMeasurement build() {
if (mAzimuthAngleMeasurement == null) {
throw new IllegalStateException("Azimuth angle measurement is not set");
diff --git a/core/java/android/uwb/DistanceMeasurement.java b/core/java/android/uwb/DistanceMeasurement.java
index c959840c51ba..10c2172d5a6b 100644
--- a/core/java/android/uwb/DistanceMeasurement.java
+++ b/core/java/android/uwb/DistanceMeasurement.java
@@ -17,6 +17,7 @@
package android.uwb;
import android.annotation.FloatRange;
+import android.annotation.NonNull;
import android.annotation.Nullable;
import android.os.Parcel;
import android.os.Parcelable;
@@ -106,7 +107,7 @@ public final class DistanceMeasurement implements Parcelable {
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeDouble(mMeters);
dest.writeDouble(mErrorMeters);
dest.writeDouble(mConfidenceLevel);
@@ -143,6 +144,7 @@ public final class DistanceMeasurement implements Parcelable {
* @param meters distance in meters
* @throws IllegalArgumentException if meters is NaN
*/
+ @NonNull
public Builder setMeters(double meters) {
if (Double.isNaN(meters)) {
throw new IllegalArgumentException("meters cannot be NaN");
@@ -157,6 +159,7 @@ public final class DistanceMeasurement implements Parcelable {
* @param errorMeters distance error in meters
* @throws IllegalArgumentException if error is negative or NaN
*/
+ @NonNull
public Builder setErrorMeters(double errorMeters) {
if (Double.isNaN(errorMeters) || errorMeters < 0.0) {
throw new IllegalArgumentException(
@@ -172,6 +175,7 @@ public final class DistanceMeasurement implements Parcelable {
* @param confidenceLevel the confidence level in the distance measurement
* @throws IllegalArgumentException if confidence level is not in the range of [0.0, 1.0]
*/
+ @NonNull
public Builder setConfidenceLevel(double confidenceLevel) {
if (confidenceLevel < 0.0 || confidenceLevel > 1.0) {
throw new IllegalArgumentException(
@@ -186,6 +190,7 @@ public final class DistanceMeasurement implements Parcelable {
*
* @throws IllegalStateException if meters, error, or confidence are not set
*/
+ @NonNull
public DistanceMeasurement build() {
if (Double.isNaN(mMeters)) {
throw new IllegalStateException("Meters cannot be NaN");
diff --git a/core/java/android/uwb/OWNERS b/core/java/android/uwb/OWNERS
new file mode 100644
index 000000000000..ea41c3984dfd
--- /dev/null
+++ b/core/java/android/uwb/OWNERS
@@ -0,0 +1,5 @@
+bstack@google.com
+eliptus@google.com
+jsolnit@google.com
+siyuanh@google.com
+zachoverflow@google.com
diff --git a/core/java/android/uwb/RangingManager.java b/core/java/android/uwb/RangingManager.java
new file mode 100644
index 000000000000..a9bf4abe566a
--- /dev/null
+++ b/core/java/android/uwb/RangingManager.java
@@ -0,0 +1,178 @@
+/*
+ * 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.
+ */
+
+package android.uwb;
+
+import android.annotation.NonNull;
+import android.os.PersistableBundle;
+import android.os.RemoteException;
+import android.util.Log;
+
+import java.util.Hashtable;
+import java.util.concurrent.Executor;
+
+/**
+ * @hide
+ */
+public class RangingManager extends android.uwb.IUwbRangingCallbacks.Stub {
+ private static final String TAG = "Uwb.RangingManager";
+
+ private final IUwbAdapter mAdapter;
+ private final Hashtable<SessionHandle, RangingSession> mRangingSessionTable = new Hashtable<>();
+
+ public RangingManager(IUwbAdapter adapter) {
+ mAdapter = adapter;
+ }
+
+ /**
+ * Open a new ranging session
+ *
+ * @param params the parameters that define the ranging session
+ * @param executor {@link Executor} to run callbacks
+ * @param callbacks {@link RangingSession.Callback} to associate with the {@link RangingSession}
+ * that is being opened.
+ * @return a new {@link RangingSession}
+ */
+ public RangingSession openSession(@NonNull PersistableBundle params, @NonNull Executor executor,
+ @NonNull RangingSession.Callback callbacks) {
+ SessionHandle sessionHandle;
+ try {
+ sessionHandle = mAdapter.startRanging(this, params);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+
+ synchronized (this) {
+ if (hasSession(sessionHandle)) {
+ Log.w(TAG, "Newly created session unexpectedly reuses an active SessionHandle");
+ executor.execute(() -> callbacks.onClosed(
+ RangingSession.Callback.CLOSE_REASON_LOCAL_GENERIC_ERROR,
+ new PersistableBundle()));
+ }
+
+ RangingSession session =
+ new RangingSession(executor, callbacks, mAdapter, sessionHandle);
+ mRangingSessionTable.put(sessionHandle, session);
+ return session;
+ }
+ }
+
+ private boolean hasSession(SessionHandle sessionHandle) {
+ return mRangingSessionTable.containsKey(sessionHandle);
+ }
+
+ @Override
+ public void onRangingStarted(SessionHandle sessionHandle, PersistableBundle parameters) {
+ synchronized (this) {
+ if (!hasSession(sessionHandle)) {
+ Log.w(TAG,
+ "onRangingStarted - received unexpected SessionHandle: " + sessionHandle);
+ return;
+ }
+
+ RangingSession session = mRangingSessionTable.get(sessionHandle);
+ session.onRangingStarted(parameters);
+ }
+ }
+
+ @Override
+ public void onRangingStartFailed(SessionHandle sessionHandle, int reason,
+ PersistableBundle params) {
+ synchronized (this) {
+ if (!hasSession(sessionHandle)) {
+ Log.w(TAG, "onRangingStartFailed - received unexpected SessionHandle: "
+ + sessionHandle);
+ return;
+ }
+
+ RangingSession session = mRangingSessionTable.get(sessionHandle);
+ session.onRangingClosed(convertStartFailureToCloseReason(reason), params);
+ mRangingSessionTable.remove(sessionHandle);
+ }
+ }
+
+ @Override
+ public void onRangingClosed(SessionHandle sessionHandle, int reason, PersistableBundle params) {
+ synchronized (this) {
+ if (!hasSession(sessionHandle)) {
+ Log.w(TAG, "onRangingClosed - received unexpected SessionHandle: " + sessionHandle);
+ return;
+ }
+
+ RangingSession session = mRangingSessionTable.get(sessionHandle);
+ session.onRangingClosed(convertToCloseReason(reason), params);
+ mRangingSessionTable.remove(sessionHandle);
+ }
+ }
+
+ @Override
+ public void onRangingResult(SessionHandle sessionHandle, RangingReport result) {
+ synchronized (this) {
+ if (!hasSession(sessionHandle)) {
+ Log.w(TAG, "onRangingResult - received unexpected SessionHandle: " + sessionHandle);
+ return;
+ }
+
+ RangingSession session = mRangingSessionTable.get(sessionHandle);
+ session.onRangingResult(result);
+ }
+ }
+
+ @RangingSession.Callback.CloseReason
+ private static int convertToCloseReason(@CloseReason int reason) {
+ switch (reason) {
+ case CloseReason.LOCAL_API:
+ return RangingSession.Callback.CLOSE_REASON_LOCAL_CLOSE_API;
+
+ case CloseReason.MAX_SESSIONS_REACHED:
+ return RangingSession.Callback.CLOSE_REASON_LOCAL_MAX_SESSIONS_REACHED;
+
+ case CloseReason.SYSTEM_POLICY:
+ return RangingSession.Callback.CLOSE_REASON_LOCAL_SYSTEM_POLICY;
+
+ case CloseReason.REMOTE_REQUEST:
+ return RangingSession.Callback.CLOSE_REASON_REMOTE_REQUEST;
+
+ case CloseReason.PROTOCOL_SPECIFIC:
+ return RangingSession.Callback.CLOSE_REASON_PROTOCOL_SPECIFIC;
+
+ case CloseReason.UNKNOWN:
+ default:
+ return RangingSession.Callback.CLOSE_REASON_UNKNOWN;
+ }
+ }
+
+ @RangingSession.Callback.CloseReason
+ private static int convertStartFailureToCloseReason(@StartFailureReason int reason) {
+ switch (reason) {
+ case StartFailureReason.BAD_PARAMETERS:
+ return RangingSession.Callback.CLOSE_REASON_LOCAL_BAD_PARAMETERS;
+
+ case StartFailureReason.MAX_SESSIONS_REACHED:
+ return RangingSession.Callback.CLOSE_REASON_LOCAL_MAX_SESSIONS_REACHED;
+
+ case StartFailureReason.SYSTEM_POLICY:
+ return RangingSession.Callback.CLOSE_REASON_LOCAL_SYSTEM_POLICY;
+
+ case StartFailureReason.PROTOCOL_SPECIFIC:
+ return RangingSession.Callback.CLOSE_REASON_PROTOCOL_SPECIFIC;
+
+ case StartFailureReason.UNKNOWN:
+ default:
+ return RangingSession.Callback.CLOSE_REASON_UNKNOWN;
+ }
+ }
+}
diff --git a/core/java/android/uwb/RangingMeasurement.java b/core/java/android/uwb/RangingMeasurement.java
index f1c316289653..50e5f0d8d554 100644
--- a/core/java/android/uwb/RangingMeasurement.java
+++ b/core/java/android/uwb/RangingMeasurement.java
@@ -60,6 +60,9 @@ public final class RangingMeasurement implements Parcelable {
return mRemoteDeviceAddress;
}
+ /**
+ * @hide
+ */
@Retention(RetentionPolicy.SOURCE)
@IntDef(value = {
RANGING_STATUS_SUCCESS,
@@ -115,7 +118,7 @@ public final class RangingMeasurement implements Parcelable {
* {@link #RANGING_STATUS_SUCCESS}
*/
@Nullable
- public DistanceMeasurement getDistance() {
+ public DistanceMeasurement getDistanceMeasurement() {
return mDistanceMeasurement;
}
@@ -126,7 +129,7 @@ public final class RangingMeasurement implements Parcelable {
* {@link #RANGING_STATUS_SUCCESS}
*/
@Nullable
- public AngleOfArrivalMeasurement getAngleOfArrival() {
+ public AngleOfArrivalMeasurement getAngleOfArrivalMeasurement() {
return mAngleOfArrivalMeasurement;
}
@@ -144,8 +147,8 @@ public final class RangingMeasurement implements Parcelable {
return mRemoteDeviceAddress.equals(other.getRemoteDeviceAddress())
&& mStatus == other.getStatus()
&& mElapsedRealtimeNanos == other.getElapsedRealtimeNanos()
- && mDistanceMeasurement.equals(other.getDistance())
- && mAngleOfArrivalMeasurement.equals(other.getAngleOfArrival());
+ && mDistanceMeasurement.equals(other.getDistanceMeasurement())
+ && mAngleOfArrivalMeasurement.equals(other.getAngleOfArrivalMeasurement());
}
return false;
}
@@ -165,7 +168,7 @@ public final class RangingMeasurement implements Parcelable {
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeParcelable(mRemoteDeviceAddress, flags);
dest.writeInt(mStatus);
dest.writeLong(mElapsedRealtimeNanos);
@@ -210,6 +213,7 @@ public final class RangingMeasurement implements Parcelable {
*
* @param remoteDeviceAddress remote device's address
*/
+ @NonNull
public Builder setRemoteDeviceAddress(@NonNull UwbAddress remoteDeviceAddress) {
mRemoteDeviceAddress = remoteDeviceAddress;
return this;
@@ -220,6 +224,7 @@ public final class RangingMeasurement implements Parcelable {
*
* @param status the status of the ranging measurement
*/
+ @NonNull
public Builder setStatus(@Status int status) {
mStatus = status;
return this;
@@ -230,6 +235,7 @@ public final class RangingMeasurement implements Parcelable {
*
* @param elapsedRealtimeNanos time the ranging measurement occurred
*/
+ @NonNull
public Builder setElapsedRealtimeNanos(long elapsedRealtimeNanos) {
if (elapsedRealtimeNanos < 0) {
throw new IllegalArgumentException("elapsedRealtimeNanos must be >= 0");
@@ -243,6 +249,7 @@ public final class RangingMeasurement implements Parcelable {
*
* @param distanceMeasurement the distance measurement for this ranging measurement
*/
+ @NonNull
public Builder setDistanceMeasurement(@NonNull DistanceMeasurement distanceMeasurement) {
mDistanceMeasurement = distanceMeasurement;
return this;
@@ -254,6 +261,7 @@ public final class RangingMeasurement implements Parcelable {
* @param angleOfArrivalMeasurement the angle of arrival measurement for this ranging
* measurement
*/
+ @NonNull
public Builder setAngleOfArrivalMeasurement(
@NonNull AngleOfArrivalMeasurement angleOfArrivalMeasurement) {
mAngleOfArrivalMeasurement = angleOfArrivalMeasurement;
@@ -268,6 +276,7 @@ public final class RangingMeasurement implements Parcelable {
* elapsedRealtimeNanos of the measurement is invalid, or
* if no remote device address is set
*/
+ @NonNull
public RangingMeasurement build() {
if (mStatus != RANGING_STATUS_SUCCESS) {
if (mDistanceMeasurement != null) {
diff --git a/core/java/android/uwb/RangingReport.java b/core/java/android/uwb/RangingReport.java
index 45180bfa6981..5b5f084914ab 100644
--- a/core/java/android/uwb/RangingReport.java
+++ b/core/java/android/uwb/RangingReport.java
@@ -83,7 +83,7 @@ public final class RangingReport implements Parcelable {
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeTypedList(mRangingMeasurements);
}
@@ -113,6 +113,7 @@ public final class RangingReport implements Parcelable {
*
* @param rangingMeasurement a ranging measurement
*/
+ @NonNull
public Builder addMeasurement(@NonNull RangingMeasurement rangingMeasurement) {
mMeasurements.add(rangingMeasurement);
return this;
@@ -123,6 +124,7 @@ public final class RangingReport implements Parcelable {
*
* @param rangingMeasurements {@link List} of {@link RangingMeasurement}s to add
*/
+ @NonNull
public Builder addMeasurements(@NonNull List<RangingMeasurement> rangingMeasurements) {
mMeasurements.addAll(rangingMeasurements);
return this;
@@ -133,6 +135,7 @@ public final class RangingReport implements Parcelable {
*
* @throws IllegalStateException if measurements are not in monotonically increasing order
*/
+ @NonNull
public RangingReport build() {
// Verify that all measurement timestamps are monotonically increasing
RangingMeasurement prevMeasurement = null;
diff --git a/core/java/android/uwb/RangingSession.java b/core/java/android/uwb/RangingSession.java
index 863926924aad..b0dbd85c0812 100644
--- a/core/java/android/uwb/RangingSession.java
+++ b/core/java/android/uwb/RangingSession.java
@@ -17,7 +17,11 @@
package android.uwb;
import android.annotation.IntDef;
+import android.annotation.NonNull;
+import android.os.Binder;
import android.os.PersistableBundle;
+import android.os.RemoteException;
+import android.util.Log;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -33,12 +37,26 @@ import java.util.concurrent.Executor;
* {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)} to request to open a
* session. Once the session is opened, a {@link RangingSession} object is provided through
* {@link RangingSession.Callback#onOpenSuccess(RangingSession, PersistableBundle)}. If opening a
- * session fails, the failure is reported through {@link RangingSession.Callback#onClosed(int)} with
- * the failure reason.
+ * session fails, the failure is reported through
+ * {@link RangingSession.Callback#onClosed(int, PersistableBundle)} with the failure reason.
*
* @hide
*/
public final class RangingSession implements AutoCloseable {
+ private static final String TAG = "Uwb.RangingSession";
+ private final SessionHandle mSessionHandle;
+ private final IUwbAdapter mAdapter;
+ private final Executor mExecutor;
+ private final Callback mCallback;
+
+ private enum State {
+ INIT,
+ OPEN,
+ CLOSED,
+ }
+
+ private State mState;
+
/**
* Interface for receiving {@link RangingSession} events
*/
@@ -50,8 +68,11 @@ public final class RangingSession implements AutoCloseable {
* @param session the newly opened {@link RangingSession}
* @param sessionInfo session specific parameters from lower layers
*/
- void onOpenSuccess(RangingSession session, PersistableBundle sessionInfo);
+ void onOpenSuccess(@NonNull RangingSession session, @NonNull PersistableBundle sessionInfo);
+ /**
+ * @hide
+ */
@Retention(RetentionPolicy.SOURCE)
@IntDef(value = {
CLOSE_REASON_UNKNOWN,
@@ -112,20 +133,46 @@ public final class RangingSession implements AutoCloseable {
int CLOSE_REASON_REMOTE_REQUEST = 7;
/**
+ * Indicates that the session was closed for a protocol specific reason. The associated
+ * {@link PersistableBundle} should be consulted for additional information.
+ */
+ int CLOSE_REASON_PROTOCOL_SPECIFIC = 8;
+
+ /**
* Invoked when session is either closed spontaneously, or per user request via
* {@link RangingSession#close()} or {@link AutoCloseable#close()}, or when session failed
* to open.
*
* @param reason reason for the session closure
+ * @param parameters protocol specific parameters related to the close reason
*/
- void onClosed(@CloseReason int reason);
+ void onClosed(@CloseReason int reason, @NonNull PersistableBundle parameters);
/**
* Called once per ranging interval even when a ranging measurement fails
*
* @param rangingReport ranging report for this interval's measurements
*/
- void onReportReceived(RangingReport rangingReport);
+ void onReportReceived(@NonNull RangingReport rangingReport);
+ }
+
+ /**
+ * @hide
+ */
+ public RangingSession(Executor executor, Callback callback, IUwbAdapter adapter,
+ SessionHandle sessionHandle) {
+ mState = State.INIT;
+ mExecutor = executor;
+ mCallback = callback;
+ mAdapter = adapter;
+ mSessionHandle = sessionHandle;
+ }
+
+ /**
+ * @hide
+ */
+ public boolean isOpen() {
+ return mState == State.OPEN;
}
/**
@@ -133,16 +180,74 @@ public final class RangingSession implements AutoCloseable {
* <p>If this session is currently open, it will close and stop the session.
* <p>If the session is in the process of being opened, it will attempt to stop the session from
* being opened.
- * <p>If the session is already closed, the registered {@link Callback#onClosed(int)} callback
- * will still be invoked.
+ * <p>If the session is already closed, the registered
+ * {@link Callback#onClosed(int, PersistableBundle)} callback will still be invoked.
*
- * <p>{@link Callback#onClosed(int)} will be invoked using the same callback
+ * <p>{@link Callback#onClosed(int, PersistableBundle)} will be invoked using the same callback
* object given to {@link UwbManager#openRangingSession(PersistableBundle, Executor, Callback)}
* when the {@link RangingSession} was opened. The callback will be invoked after each call to
* {@link #close()}, even if the {@link RangingSession} is already closed.
*/
@Override
public void close() {
- throw new UnsupportedOperationException();
+ if (mState == State.CLOSED) {
+ mExecutor.execute(() -> mCallback.onClosed(
+ Callback.CLOSE_REASON_LOCAL_CLOSE_API, new PersistableBundle()));
+ return;
+ }
+
+ try {
+ mAdapter.closeRanging(mSessionHandle);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ }
+ }
+
+ /**
+ * @hide
+ */
+ public void onRangingStarted(@NonNull PersistableBundle parameters) {
+ if (mState == State.CLOSED) {
+ Log.w(TAG, "onRangingStarted invoked for a closed session");
+ return;
+ }
+
+ mState = State.OPEN;
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onOpenSuccess(this, parameters));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * @hide
+ */
+ public void onRangingClosed(@Callback.CloseReason int reason, PersistableBundle parameters) {
+ mState = State.CLOSED;
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onClosed(reason, parameters));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ /**
+ * @hide
+ */
+ public void onRangingResult(@NonNull RangingReport report) {
+ if (!isOpen()) {
+ Log.w(TAG, "onRangingResult invoked for non-open session");
+ return;
+ }
+
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mCallback.onReportReceived(report));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
}
}
diff --git a/core/java/android/uwb/UwbAddress.java b/core/java/android/uwb/UwbAddress.java
index 828324c54c5a..b9523a307c42 100644
--- a/core/java/android/uwb/UwbAddress.java
+++ b/core/java/android/uwb/UwbAddress.java
@@ -51,7 +51,7 @@ public final class UwbAddress implements Parcelable {
* {@link #SHORT_ADDRESS_BYTE_LENGTH} or {@link #EXTENDED_ADDRESS_BYTE_LENGTH} bytes
*/
@NonNull
- public static UwbAddress fromBytes(@NonNull byte[] address) throws IllegalArgumentException {
+ public static UwbAddress fromBytes(@NonNull byte[] address) {
if (address.length != SHORT_ADDRESS_BYTE_LENGTH
&& address.length != EXTENDED_ADDRESS_BYTE_LENGTH) {
throw new IllegalArgumentException("Invalid UwbAddress length " + address.length);
@@ -107,7 +107,7 @@ public final class UwbAddress implements Parcelable {
}
@Override
- public void writeToParcel(Parcel dest, int flags) {
+ public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mAddressBytes.length);
dest.writeByteArray(mAddressBytes);
}
diff --git a/core/java/android/uwb/UwbManager.java b/core/java/android/uwb/UwbManager.java
index ed5cf3625525..f4d801868e18 100644
--- a/core/java/android/uwb/UwbManager.java
+++ b/core/java/android/uwb/UwbManager.java
@@ -49,12 +49,16 @@ public final class UwbManager {
private IUwbAdapter mUwbAdapter;
private static final String SERVICE_NAME = "uwb";
- private AdapterStateListener mAdapterStateListener;
+ private final AdapterStateListener mAdapterStateListener;
+ private final RangingManager mRangingManager;
/**
* Interface for receiving UWB adapter state changes
*/
public interface AdapterStateCallback {
+ /**
+ * @hide
+ */
@Retention(RetentionPolicy.SOURCE)
@IntDef(value = {
STATE_CHANGED_REASON_SESSION_STARTED,
@@ -116,6 +120,7 @@ public final class UwbManager {
private UwbManager(IUwbAdapter adapter) {
mUwbAdapter = adapter;
mAdapterStateListener = new AdapterStateListener(adapter);
+ mRangingManager = new RangingManager(adapter);
}
/**
@@ -195,6 +200,9 @@ public final class UwbManager {
}
}
+ /**
+ * @hide
+ */
@Retention(RetentionPolicy.SOURCE)
@IntDef(value = {
ANGLE_OF_ARRIVAL_SUPPORT_TYPE_NONE,
@@ -387,8 +395,8 @@ public final class UwbManager {
*/
@NonNull
public AutoCloseable openRangingSession(@NonNull PersistableBundle parameters,
- @NonNull Executor executor,
+ @NonNull @CallbackExecutor Executor executor,
@NonNull RangingSession.Callback callbacks) {
- throw new UnsupportedOperationException();
+ return mRangingManager.openSession(parameters, executor, callbacks);
}
}
diff --git a/core/java/android/view/OWNERS b/core/java/android/view/OWNERS
index 72fa4c39f1bc..bae6ee85c064 100644
--- a/core/java/android/view/OWNERS
+++ b/core/java/android/view/OWNERS
@@ -47,11 +47,13 @@ per-file View.java = file:/core/java/android/service/autofill/OWNERS
per-file View.java = file:/graphics/java/android/graphics/OWNERS
per-file View.java = file:/services/core/java/com/android/server/input/OWNERS
per-file View.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file View.java = file:/core/java/android/view/inputmethod/OWNERS
per-file ViewRootImpl.java = file:/services/accessibility/OWNERS
per-file ViewRootImpl.java = file:/core/java/android/service/autofill/OWNERS
per-file ViewRootImpl.java = file:/graphics/java/android/graphics/OWNERS
per-file ViewRootImpl.java = file:/services/core/java/com/android/server/input/OWNERS
per-file ViewRootImpl.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file ViewRootImpl.java = file:/core/java/android/view/inputmethod/OWNERS
# WindowManager
per-file DisplayCutout.aidl = file:/services/core/java/com/android/server/wm/OWNERS
diff --git a/core/java/com/android/internal/app/OWNERS b/core/java/com/android/internal/app/OWNERS
index 108ab92f0e9b..382b49e68e6f 100644
--- a/core/java/com/android/internal/app/OWNERS
+++ b/core/java/com/android/internal/app/OWNERS
@@ -1 +1,4 @@
per-file *AppOp* = file:/core/java/android/permission/OWNERS
+per-file *Resolver* = file:/packages/SystemUI/OWNERS
+per-file *Chooser* = file:/packages/SystemUI/OWNERS
+per-file SimpleIconFactory.java = file:/packages/SystemUI/OWNERS
diff --git a/core/java/com/android/internal/app/chooser/OWNERS b/core/java/com/android/internal/app/chooser/OWNERS
new file mode 100644
index 000000000000..a6f1632e7b8c
--- /dev/null
+++ b/core/java/com/android/internal/app/chooser/OWNERS
@@ -0,0 +1 @@
+file:/packages/SystemUI/OWNERS \ No newline at end of file
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 000000000000..571d7e721094
--- /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 a17f5f5f8910..b7170d857da9 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.os.Parcelable;
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 @@ public final class VpnProfile implements Cloneable, Parcelable {
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 @@ public final class VpnProfile implements Cloneable, Parcelable {
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 e595db384cb9..c4168141f184 100644
--- a/core/java/com/android/internal/os/KernelWakelockReader.java
+++ b/core/java/com/android/internal/os/KernelWakelockReader.java
@@ -78,13 +78,16 @@ public class KernelWakelockReader {
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 @@ public class KernelWakelockReader {
}
}
- 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 15d4525ac884..0381a75d722b 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.content.pm.ApplicationInfo;
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.ErrnoException;
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 @@ public final class Zygote {
// 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/AnnotationValidations.java b/core/java/com/android/internal/util/AnnotationValidations.java
index 2d3b45023c9d..cf5e48f9657f 100644
--- a/core/java/com/android/internal/util/AnnotationValidations.java
+++ b/core/java/com/android/internal/util/AnnotationValidations.java
@@ -182,7 +182,7 @@ public class AnnotationValidations {
Annotation ignored, int value, Object... params) {}
public static void validate(Class<? extends Annotation> annotation,
Annotation ignored, int value) {
- if (("android.annotation".equals(annotation.getPackageName$())
+ if (("android.annotation".equals(annotation.getPackageName())
&& annotation.getSimpleName().endsWith("Res"))
|| ColorInt.class.equals(annotation)) {
if (value < 0) {
@@ -192,7 +192,7 @@ public class AnnotationValidations {
}
public static void validate(Class<? extends Annotation> annotation,
Annotation ignored, long value) {
- if ("android.annotation".equals(annotation.getPackageName$())
+ if ("android.annotation".equals(annotation.getPackageName())
&& annotation.getSimpleName().endsWith("Long")) {
if (value < 0L) {
invalid(annotation, value);
diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java
index 9ad15021f651..931ec64df755 100644
--- a/core/java/com/android/internal/util/ArrayUtils.java
+++ b/core/java/com/android/internal/util/ArrayUtils.java
@@ -734,6 +734,25 @@ public class ArrayUtils {
}
/**
+ * Throws {@link ArrayIndexOutOfBoundsException} if the range is out of bounds.
+ * @param len length of the array. Must be non-negative
+ * @param offset start index of the range. Must be non-negative
+ * @param count length of the range. Must be non-negative
+ * @throws ArrayIndexOutOfBoundsException if the range from {@code offset} with length
+ * {@code count} is out of bounds of the array
+ */
+ public static void throwsIfOutOfBounds(int len, int offset, int count) {
+ if (len < 0) {
+ throw new ArrayIndexOutOfBoundsException("Negative length: " + len);
+ }
+
+ if ((offset | count) < 0 || offset > len - count) {
+ throw new ArrayIndexOutOfBoundsException(
+ "length=" + len + "; regionStart=" + offset + "; regionLength=" + count);
+ }
+ }
+
+ /**
* Returns an array with values from {@code val} minus {@code null} values
*
* @param arrayConstructor typically {@code T[]::new} e.g. {@code String[]::new}
diff --git a/core/java/com/android/internal/util/OWNERS b/core/java/com/android/internal/util/OWNERS
index 8b9acd3b57de..a0454510b30b 100644
--- a/core/java/com/android/internal/util/OWNERS
+++ b/core/java/com/android/internal/util/OWNERS
@@ -2,3 +2,4 @@ per-file AsyncChannel* = lorenzo@google.com, satk@google.com, etancohen@google.c
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 2a9c0b44b45e..93f89b5db820 100644
--- a/core/java/com/android/server/net/BaseNetworkObserver.java
+++ b/core/java/com/android/server/net/BaseNetworkObserver.java
@@ -64,7 +64,8 @@ public class BaseNetworkObserver extends INetworkManagementEventObserver.Stub {
}
@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 1968146099ae..b4572fda6cca 100644
--- a/core/jni/Android.bp
+++ b/core/jni/Android.bp
@@ -182,6 +182,7 @@ cc_library_shared {
"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 7b708efdb278..3198cb1b8140 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -187,6 +187,7 @@ extern int register_android_animation_PropertyValuesHolder(JNIEnv *env);
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 @@ static const RegJNIRec gRegJNI[] = {
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 e79c95edbeb5..2a16dce99125 100644
--- a/core/jni/android_media_AudioDeviceAttributes.cpp
+++ b/core/jni/android_media_AudioDeviceAttributes.cpp
@@ -31,7 +31,7 @@ jint createAudioDeviceAttributesFromNative(JNIEnv *env, jobject *jAudioDeviceAtt
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 7493e39538dc..20e64ffe9471 100644
--- a/core/jni/android_media_AudioSystem.cpp
+++ b/core/jni/android_media_AudioSystem.cpp
@@ -172,6 +172,8 @@ static struct {
jmethodID postRecordConfigEventFromNative;
} gAudioPolicyEventHandlerMethods;
+static struct { jmethodID add; } gListMethods;
+
//
// JNI Initialization for OpenSLES routing
//
@@ -292,25 +294,30 @@ static sp<JNIAudioPortCallback> setJniCallback(JNIEnv* env,
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 @@ static jint getVectorOfAudioDeviceTypeAddr(JNIEnv *env, jintArray deviceTypes,
}
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 @@ exit:
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_removeUidDeviceAffinities(JNIEnv *env, job
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 @@ android_media_AudioSystem_isCallScreeningModeSupported(JNIEnv *env, jobject thiz
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;
+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::getDevicesForRoleAndStrategy((product_strategy_t)strategy,
+ (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;
+}
- AudioDeviceTypeAddr elDevice;
+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::getPreferredDeviceForStrategy((product_strategy_t) strategy, elDevice));
+ AudioSystem::getDevicesForRoleAndCapturePreset((audio_source_t)capturePreset,
+ (device_role_t)role, nDevices));
if (status != NO_ERROR) {
- return (jint) status;
+ 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
@@ -2551,12 +2634,22 @@ static const JNINativeMethod gMethods[] =
{"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 @@ int register_android_media_AudioSystem(JNIEnv *env)
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 8d4c4e5311f8..2155246cd544 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 @@ static jobject android_net_utils_getDnsNetwork(JNIEnv *env, jobject thiz) {
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 @@ static const JNINativeMethod gNetworkUtilMethods[] = {
{ "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 000000000000..10fc18dcd386
--- /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/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 96a57c116b73..a9fe5d58af05 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -1769,6 +1769,16 @@
<permission android:name="android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE"
android:protectionLevel="signature|privileged" />
+ <!-- @SystemApi @hide Allows system APK to update Wifi coex channels to avoid.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.WIFI_UPDATE_COEX_UNSAFE_CHANNELS"
+ android:protectionLevel="signature" />
+
+ <!-- @SystemApi @hide Allows applications to access Wifi coex channels being avoided.
+ <p>Not for use by third-party applications. -->
+ <permission android:name="android.permission.WIFI_ACCESS_COEX_UNSAFE_CHANNELS"
+ android:protectionLevel="signature|privileged" />
+
<!-- ======================================= -->
<!-- Permissions for short range, peripheral networks -->
<!-- ======================================= -->
diff --git a/core/res/OWNERS b/core/res/OWNERS
index 263d638353d6..02cf0b71ff69 100644
--- a/core/res/OWNERS
+++ b/core/res/OWNERS
@@ -6,6 +6,7 @@ hackbod@android.com
hackbod@google.com
jsharkey@android.com
jsharkey@google.com
+juliacr@google.com
michaelwr@google.com
nandana@google.com
narayan@google.com
diff --git a/core/res/res/values-am/strings.xml b/core/res/res/values-am/strings.xml
index 57f2d6aea741..d41868e8c478 100644
--- a/core/res/res/values-am/strings.xml
+++ b/core/res/res/values-am/strings.xml
@@ -20,12 +20,12 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="byteShort" msgid="202579285008794431">"B"</string>
+ <string name="byteShort" msgid="202579285008794431">"ባ"</string>
<string name="kilobyteShort" msgid="2214285521564195803">"ኪባ"</string>
- <string name="megabyteShort" msgid="6649361267635823443">"MB"</string>
- <string name="gigabyteShort" msgid="7515809460261287991">"GB"</string>
- <string name="terabyteShort" msgid="1822367128583886496">"TB"</string>
- <string name="petabyteShort" msgid="5651571254228534832">"PB"</string>
+ <string name="megabyteShort" msgid="6649361267635823443">"ሜባ"</string>
+ <string name="gigabyteShort" msgid="7515809460261287991">"ጊባ"</string>
+ <string name="terabyteShort" msgid="1822367128583886496">"ቴባ"</string>
+ <string name="petabyteShort" msgid="5651571254228534832">"ፔባ"</string>
<string name="fileSizeSuffix" msgid="4233671691980131257">"<xliff:g id="NUMBER">%1$s</xliff:g> <xliff:g id="UNIT">%2$s</xliff:g>"</string>
<string name="untitled" msgid="3381766946944136678">"&lt;ርዕስ አልባ&gt;"</string>
<string name="emptyPhoneNumber" msgid="5812172618020360048">"(ምንም ስልክ ቁጥር የለም)"</string>
diff --git a/core/res/res/values-es/strings.xml b/core/res/res/values-es/strings.xml
index 7b6dea33ef60..13f1b5613169 100644
--- a/core/res/res/values-es/strings.xml
+++ b/core/res/res/values-es/strings.xml
@@ -823,7 +823,7 @@
<string name="keyguard_password_enter_pin_password_code" msgid="7792964196473964340">"Introduce el código PIN para desbloquear."</string>
<string name="keyguard_password_wrong_pin_code" msgid="8583732939138432793">"Código PIN incorrecto"</string>
<string name="keyguard_label_text" msgid="3841953694564168384">"Para desbloquear el teléfono, pulsa la tecla de menú y, a continuación, pulsa 0."</string>
- <string name="emergency_call_dialog_number_for_display" msgid="2978165477085612673">"Llamada de emergencia"</string>
+ <string name="emergency_call_dialog_number_for_display" msgid="2978165477085612673">"Número de emergencia"</string>
<string name="lockscreen_carrier_default" msgid="6192313772955399160">"Sin servicio"</string>
<string name="lockscreen_screen_locked" msgid="7364905540516041817">"Pantalla bloqueada"</string>
<string name="lockscreen_instructions_when_pattern_enabled" msgid="7982445492532123308">"Pulsa la tecla de menú para desbloquear el teléfono o realizar una llamada de emergencia."</string>
diff --git a/core/res/res/values-fa/strings.xml b/core/res/res/values-fa/strings.xml
index fe283abb7699..03a1456d00c5 100644
--- a/core/res/res/values-fa/strings.xml
+++ b/core/res/res/values-fa/strings.xml
@@ -1878,7 +1878,7 @@
<string name="language_selection_title" msgid="52674936078683285">"افزودن زبان"</string>
<string name="country_selection_title" msgid="5221495687299014379">"اولویت‌های منطقه"</string>
<string name="search_language_hint" msgid="7004225294308793583">"نام زبان را تایپ کنید"</string>
- <string name="language_picker_section_suggested" msgid="6556199184638990447">"پیشنهادشده"</string>
+ <string name="language_picker_section_suggested" msgid="6556199184638990447">"پیشنهادی"</string>
<string name="language_picker_section_all" msgid="1985809075777564284">"همه زبان‌ها"</string>
<string name="region_picker_section_all" msgid="756441309928774155">"همه منطقه‌ها"</string>
<string name="locale_search_menu" msgid="6258090710176422934">"جستجو"</string>
diff --git a/core/res/res/values-fr-rCA/strings.xml b/core/res/res/values-fr-rCA/strings.xml
index e8d64088667d..29fe1364f1f4 100644
--- a/core/res/res/values-fr-rCA/strings.xml
+++ b/core/res/res/values-fr-rCA/strings.xml
@@ -52,7 +52,6 @@
<string name="enablePin" msgid="2543771964137091212">"Opération infructueuse. Activez le verrouillage SIM/RUIM."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584">
<item quantity="one">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM soit verrouillée.</item>
- <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item>
<item quantity="other">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM soit verrouillée.</item>
</plurals>
<string name="imei" msgid="2157082351232630390">"Code IIEM"</string>
@@ -180,7 +179,6 @@
<string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string>
<plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
<item quantity="one">Autorité de certification installée</item>
- <item quantity="many">Certificate authorities installed</item>
<item quantity="other">Autorités de certification installées</item>
</plurals>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string>
@@ -253,7 +251,6 @@
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bogue. Aucune capture d\'écran supplémentaire ne peut être capturée, et vous ne pouvez entrer aucune autre information."</string>
<plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
<item quantity="one">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde.</item>
- <item quantity="many">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
<item quantity="other">Saisie d\'écran pour le rapport de bogue dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes.</item>
</plurals>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran prise avec le rapport de bogue"</string>
@@ -997,7 +994,6 @@
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string>
<plurals name="last_num_days" formatted="false" msgid="687443109145393632">
<item quantity="one">Le dernier <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
- <item quantity="many">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
<item quantity="other">Le dernier <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
</plurals>
<string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string>
@@ -1020,82 +1016,66 @@
<string name="now_string_shortest" msgid="3684914126941650330">"maintenant"</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
<item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item>
<item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
</plurals>
<plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
<item quantity="one">il y a<xliff:g id="COUNT_1">%d</xliff:g> heure</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item>
<item quantity="other">il y a<xliff:g id="COUNT_1">%d</xliff:g> heures</item>
</plurals>
<plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
<item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item>
<item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
</plurals>
<plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
<item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> an</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
<item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
</plurals>
<plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
</plurals>
<plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> heure</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> heures</item>
</plurals>
<plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
</plurals>
<plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
</plurals>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string>
@@ -1466,7 +1446,6 @@
<string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string>
<plurals name="matches_found" formatted="false" msgid="1101758718194295554">
<item quantity="one"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
<item quantity="other"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
</plurals>
<string name="action_mode_done" msgid="2536182504764803222">"Terminé"</string>
@@ -1603,7 +1582,6 @@
<string name="kg_wrong_pin" msgid="3680925703673166482">"NIP incorrect."</string>
<plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
<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="8366024510502517748">"Dessinez votre schéma."</string>
@@ -1790,7 +1768,6 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le NIP est trop court. Il doit comporter au moins 4 chiffres."</string>
<plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
<item quantity="one">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> seconde</item>
- <item quantity="many">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
<item quantity="other">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> secondes</item>
</plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Réessayez plus tard"</string>
@@ -1822,42 +1799,34 @@
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
<item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
<item quantity="one">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
<item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
<item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
<item quantity="one">Pendant %d minute</item>
- <item quantity="many">For %d minutes</item>
<item quantity="other">Pendant %d minutes</item>
</plurals>
<plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
<item quantity="one">Pendant %d min</item>
- <item quantity="many">For %d min</item>
<item quantity="other">Pendant %d min</item>
</plurals>
<plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
<item quantity="one">Pendant %d heure</item>
- <item quantity="many">For %d hours</item>
<item quantity="other">Pendant %d heures</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
<item quantity="one">Pendant %d h</item>
- <item quantity="many">For %d hr</item>
<item quantity="other">Pendant %d h</item>
</plurals>
<string name="zen_mode_until" msgid="2250286190237669079">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
@@ -1898,7 +1867,6 @@
<string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g> : <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="3946212171128200491">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item>
</plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sans catégorie"</string>
@@ -1966,7 +1934,6 @@
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de remplissage automatique"</string>
<plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
<item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suggestion de remplissage automatique</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item>
<item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggestions de remplissage automatique</item>
</plurals>
<string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer sous "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>"?"</string>
@@ -2060,7 +2027,6 @@
<string name="car_loading_profile" msgid="8219978381196748070">"Chargement en cours…"</string>
<plurals name="file_count" formatted="false" msgid="7063513834724389247">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
- <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item>
</plurals>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string>
diff --git a/core/res/res/values-fr/strings.xml b/core/res/res/values-fr/strings.xml
index fc91c47b700b..a5b1626aa404 100644
--- a/core/res/res/values-fr/strings.xml
+++ b/core/res/res/values-fr/strings.xml
@@ -52,7 +52,6 @@
<string name="enablePin" msgid="2543771964137091212">"Échec de l\'opération. Veuillez activer le verrouillage de la carte SIM/RUIM."</string>
<plurals name="pinpuk_attempts" formatted="false" msgid="1619867269012213584">
<item quantity="one">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentative avant que votre carte SIM ne soit verrouillée.</item>
- <item quantity="many">You have <xliff:g id="NUMBER_1">%d</xliff:g> remaining attempts before SIM is locked.</item>
<item quantity="other">Il vous reste <xliff:g id="NUMBER_1">%d</xliff:g> tentatives avant que votre carte SIM ne soit verrouillée.</item>
</plurals>
<string name="imei" msgid="2157082351232630390">"Code IMEI"</string>
@@ -180,7 +179,6 @@
<string name="low_memory" product="default" msgid="2539532364144025569">"La mémoire du téléphone est pleine. Veuillez supprimer des fichiers pour libérer de l\'espace."</string>
<plurals name="ssl_ca_cert_warning" formatted="false" msgid="2288194355006173029">
<item quantity="one">Autorité de certification installée</item>
- <item quantity="many">Certificate authorities installed</item>
<item quantity="other">Autorités de certification installées</item>
</plurals>
<string name="ssl_ca_cert_noti_by_unknown" msgid="4961102218216815242">"Par un tiers inconnu"</string>
@@ -253,7 +251,6 @@
<string name="bugreport_option_full_summary" msgid="1975130009258435885">"Utilisez cette option pour qu\'il y ait le moins d\'interférences système possible lorsque votre appareil ne répond pas ou qu\'il est trop lent, ou lorsque vous avez besoin de toutes les sections du rapport de bug. Aucune capture d\'écran supplémentaire ne peut être prise, et vous ne pouvez saisir aucune autre information."</string>
<plurals name="bugreport_countdown" formatted="false" msgid="3906120379260059206">
<item quantity="one">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> seconde</item>
- <item quantity="many">Taking screenshot for bug report in <xliff:g id="NUMBER_1">%d</xliff:g> seconds.</item>
<item quantity="other">Capture d\'écran pour le rapport de bug dans <xliff:g id="NUMBER_1">%d</xliff:g> secondes</item>
</plurals>
<string name="bugreport_screenshot_success_toast" msgid="7986095104151473745">"Capture d\'écran avec rapport de bug effectuée"</string>
@@ -997,7 +994,6 @@
<string name="beforeOneMonthDurationPast" msgid="8315149541372065392">"Il y a plus d\'un mois"</string>
<plurals name="last_num_days" formatted="false" msgid="687443109145393632">
<item quantity="one">Le dernier jour (<xliff:g id="COUNT_1">%d</xliff:g>)</item>
- <item quantity="many">Last <xliff:g id="COUNT_1">%d</xliff:g> days</item>
<item quantity="other">Les <xliff:g id="COUNT_1">%d</xliff:g> derniers jours</item>
</plurals>
<string name="last_month" msgid="1528906781083518683">"Le mois dernier"</string>
@@ -1020,82 +1016,66 @@
<string name="now_string_shortest" msgid="3684914126941650330">"mainten."</string>
<plurals name="duration_minutes_shortest" formatted="false" msgid="7519574894537185135">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>m</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest" formatted="false" msgid="2838655994500499651">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>h</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest" formatted="false" msgid="3686058472983158496">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>d</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> j</item>
</plurals>
<plurals name="duration_years_shortest" formatted="false" msgid="8299112348723640338">
<item quantity="one"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g>y</item>
<item quantity="other"><xliff:g id="COUNT_1">%d</xliff:g> a</item>
</plurals>
<plurals name="duration_minutes_shortest_future" formatted="false" msgid="849196137176399440">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>m</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> m</item>
</plurals>
<plurals name="duration_hours_shortest_future" formatted="false" msgid="5386373597343170388">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>h</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> h</item>
</plurals>
<plurals name="duration_days_shortest_future" formatted="false" msgid="814754627092787227">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>d</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> j</item>
</plurals>
<plurals name="duration_years_shortest_future" formatted="false" msgid="7683731800140202145">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g>y</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> a</item>
</plurals>
<plurals name="duration_minutes_relative" formatted="false" msgid="6569851308583028344">
<item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> minutes ago</item>
<item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
</plurals>
<plurals name="duration_hours_relative" formatted="false" msgid="420434788589102019">
<item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> heure</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> hours ago</item>
<item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> heures</item>
</plurals>
<plurals name="duration_days_relative" formatted="false" msgid="6056425878237482431">
<item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> days ago</item>
<item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
</plurals>
<plurals name="duration_years_relative" formatted="false" msgid="2179998228861172159">
<item quantity="one">il y a <xliff:g id="COUNT_1">%d</xliff:g> an</item>
- <item quantity="many"><xliff:g id="COUNT_1">%d</xliff:g> years ago</item>
<item quantity="other">il y a <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
</plurals>
<plurals name="duration_minutes_relative_future" formatted="false" msgid="5759885720917567723">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> minute</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> minutes</item>
</plurals>
<plurals name="duration_hours_relative_future" formatted="false" msgid="8963511608507707959">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> heure</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> hours</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> heures</item>
</plurals>
<plurals name="duration_days_relative_future" formatted="false" msgid="1964709470979250702">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> jour</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> days</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> jours</item>
</plurals>
<plurals name="duration_years_relative_future" formatted="false" msgid="3985129025134896371">
<item quantity="one">dans <xliff:g id="COUNT_1">%d</xliff:g> an</item>
- <item quantity="many">in <xliff:g id="COUNT_1">%d</xliff:g> years</item>
<item quantity="other">dans <xliff:g id="COUNT_1">%d</xliff:g> ans</item>
</plurals>
<string name="VideoView_error_title" msgid="5750686717225068016">"Problème vidéo"</string>
@@ -1466,7 +1446,6 @@
<string name="find_on_page" msgid="5400537367077438198">"Rechercher sur la page"</string>
<plurals name="matches_found" formatted="false" msgid="1101758718194295554">
<item quantity="one"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
- <item quantity="many"><xliff:g id="INDEX">%d</xliff:g> of <xliff:g id="TOTAL">%d</xliff:g></item>
<item quantity="other"><xliff:g id="INDEX">%d</xliff:g> sur <xliff:g id="TOTAL">%d</xliff:g></item>
</plurals>
<string name="action_mode_done" msgid="2536182504764803222">"OK"</string>
@@ -1603,7 +1582,6 @@
<string name="kg_wrong_pin" msgid="3680925703673166482">"Code PIN incorrect."</string>
<plurals name="kg_too_many_failed_attempts_countdown" formatted="false" msgid="236717428673283568">
<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="8366024510502517748">"Dessinez votre schéma."</string>
@@ -1790,7 +1768,6 @@
<string name="restr_pin_error_too_short" msgid="1547007808237941065">"Le code PIN est trop court. Il doit comporter au moins 4 chiffres."</string>
<plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
<item quantity="one">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> seconde</item>
- <item quantity="many">Try again in <xliff:g id="COUNT">%d</xliff:g> seconds</item>
<item quantity="other">Réessayer dans <xliff:g id="COUNT">%d</xliff:g> secondes</item>
</plurals>
<string name="restr_pin_try_later" msgid="5897719962541636727">"Veuillez réessayer ultérieurement."</string>
@@ -1822,42 +1799,34 @@
<string name="data_saver_enable_button" msgid="4399405762586419726">"Activer"</string>
<plurals name="zen_mode_duration_minutes_summary" formatted="false" msgid="2877101784123058273">
<item quantity="one">Pendant %1$d minute (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">For %1$d minutes (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d minutes (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes_summary_short" formatted="false" msgid="4230730310318858312">
<item quantity="one">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">For %1$d min (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d min (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary" formatted="false" msgid="7725354244196466758">
<item quantity="one">Pendant %1$d heure (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">For %1$d hours (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d heures (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_hours_summary_short" formatted="false" msgid="588719069121765642">
<item quantity="one">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
- <item quantity="many">For %1$d hr (until <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
<item quantity="other">Pendant %1$d h (jusqu\'à <xliff:g id="FORMATTEDTIME_1">%2$s</xliff:g>)</item>
</plurals>
<plurals name="zen_mode_duration_minutes" formatted="false" msgid="1148568456958944998">
<item quantity="one">Pendant %d minute</item>
- <item quantity="many">For %d minutes</item>
<item quantity="other">Pendant %d minutes</item>
</plurals>
<plurals name="zen_mode_duration_minutes_short" formatted="false" msgid="2742377799995454859">
<item quantity="one">Pendant %d min</item>
- <item quantity="many">For %d min</item>
<item quantity="other">Pendant %d min</item>
</plurals>
<plurals name="zen_mode_duration_hours" formatted="false" msgid="525401855645490022">
<item quantity="one">Pendant %d heure</item>
- <item quantity="many">For %d hours</item>
<item quantity="other">Pendant %d heures</item>
</plurals>
<plurals name="zen_mode_duration_hours_short" formatted="false" msgid="7644653189680911640">
<item quantity="one">Pendant %d h</item>
- <item quantity="many">For %d hr</item>
<item quantity="other">Pendant %d h</item>
</plurals>
<string name="zen_mode_until" msgid="2250286190237669079">"Jusqu\'à <xliff:g id="FORMATTEDTIME">%1$s</xliff:g>"</string>
@@ -1898,7 +1867,6 @@
<string name="notification_messaging_title_template" msgid="772857526770251989">"<xliff:g id="CONVERSATION_TITLE">%1$s</xliff:g> : <xliff:g id="SENDER_NAME">%2$s</xliff:g>"</string>
<plurals name="selected_count" formatted="false" msgid="3946212171128200491">
<item quantity="one"><xliff:g id="COUNT_1">%1$d</xliff:g> élément sélectionné</item>
- <item quantity="many"><xliff:g id="COUNT_1">%1$d</xliff:g> selected</item>
<item quantity="other"><xliff:g id="COUNT_1">%1$d</xliff:g> éléments sélectionnés</item>
</plurals>
<string name="default_notification_channel_label" msgid="3697928973567217330">"Sans catégorie"</string>
@@ -1966,7 +1934,6 @@
<string name="autofill_picker_no_suggestions" msgid="1076022650427481509">"Aucune suggestion de saisie automatique"</string>
<plurals name="autofill_picker_some_suggestions" formatted="false" msgid="6651883186966959978">
<item quantity="one"><xliff:g id="COUNT">%1$s</xliff:g> suggestion de saisie automatique</item>
- <item quantity="many"><xliff:g id="COUNT">%1$s</xliff:g> autofill suggestions</item>
<item quantity="other"><xliff:g id="COUNT">%1$s</xliff:g> suggestions de saisie automatique</item>
</plurals>
<string name="autofill_save_title" msgid="7719802414283739775">"Enregistrer dans "<b>"<xliff:g id="LABEL">%1$s</xliff:g>"</b>" ?"</string>
@@ -2060,7 +2027,6 @@
<string name="car_loading_profile" msgid="8219978381196748070">"Chargement…"</string>
<plurals name="file_count" formatted="false" msgid="7063513834724389247">
<item quantity="one"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichier</item>
- <item quantity="many"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> files</item>
<item quantity="other"><xliff:g id="FILE_NAME_2">%s</xliff:g> + <xliff:g id="COUNT_3">%d</xliff:g> fichiers</item>
</plurals>
<string name="chooser_no_direct_share_targets" msgid="1511722103987329028">"Aucune recommandation de personnes avec lesquelles effectuer un partage"</string>
diff --git a/core/res/res/values-it/strings.xml b/core/res/res/values-it/strings.xml
index 95e1a48e1c68..054344ebabe5 100644
--- a/core/res/res/values-it/strings.xml
+++ b/core/res/res/values-it/strings.xml
@@ -1441,7 +1441,7 @@
<string name="car_mode_disable_notification_message" msgid="8954550232288567515">"Tocca per uscire dall\'app di guida."</string>
<string name="back_button_label" msgid="4078224038025043387">"Indietro"</string>
<string name="next_button_label" msgid="6040209156399907780">"Avanti"</string>
- <string name="skip_button_label" msgid="3566599811326688389">"Ignora"</string>
+ <string name="skip_button_label" msgid="3566599811326688389">"Salta"</string>
<string name="no_matches" msgid="6472699895759164599">"Nessuna corrispondenza"</string>
<string name="find_on_page" msgid="5400537367077438198">"Trova nella pagina"</string>
<plurals name="matches_found" formatted="false" msgid="1101758718194295554">
diff --git a/core/res/res/values-ne/strings.xml b/core/res/res/values-ne/strings.xml
index 6723e6694049..e2cf7f96035d 100644
--- a/core/res/res/values-ne/strings.xml
+++ b/core/res/res/values-ne/strings.xml
@@ -1956,7 +1956,7 @@
<string name="autofill_save_type_debit_card" msgid="3169397504133097468">"डेबिट कार्ड"</string>
<string name="autofill_save_type_payment_card" msgid="6555012156728690856">"भुक्तानी कार्ड"</string>
<string name="autofill_save_type_generic_card" msgid="1019367283921448608">"कार्ड"</string>
- <string name="autofill_save_type_username" msgid="1018816929884640882">"प्रयोगकर्ताको नाम"</string>
+ <string name="autofill_save_type_username" msgid="1018816929884640882">"युजरनेम"</string>
<string name="autofill_save_type_email_address" msgid="1303262336895591924">"इमेल ठेगाना"</string>
<string name="etws_primary_default_message_earthquake" msgid="8401079517718280669">"शान्त रहनुहोस् र नजिकै आश्रयस्थल खोज्नुहोस्।"</string>
<string name="etws_primary_default_message_tsunami" msgid="5828171463387976279">"तटीय क्षेत्र र नदीछेउका ठाउँहरू छाडी उच्च सतहमा अवस्थित कुनै अझ सुरक्षित ठाउँमा जानुहोस्।"</string>
diff --git a/core/res/res/values-nl/strings.xml b/core/res/res/values-nl/strings.xml
index bae44fd801ba..594ea618e2a7 100644
--- a/core/res/res/values-nl/strings.xml
+++ b/core/res/res/values-nl/strings.xml
@@ -954,7 +954,7 @@
<string name="permdesc_readHistoryBookmarks" msgid="2323799501008967852">"Hiermee kan de app de geschiedenis lezen van alle URL\'s die in de systeemeigen browser zijn bezocht, en alle bookmarks in de systeemeigen browser. Let op: deze rechten kunnen niet worden geforceerd door andere browsers of andere apps met internetmogelijkheden."</string>
<string name="permlab_writeHistoryBookmarks" msgid="6090259925187986937">"webbookmarks en -geschiedenis schrijven"</string>
<string name="permdesc_writeHistoryBookmarks" product="tablet" msgid="573341025292489065">"Hiermee kan de app de webgeschiedenis wijzigen in de systeemeigen browser en de bookmarks die zijn opgeslagen op je tablet. Deze rechten kunnen niet worden geforceerd door andere browsers of andere apps met internetmogelijkheden."</string>
- <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="88642768580408561">"Hiermee kan de app de browsergeschiedenis of opgeslagen bookmarks bewerken op je Android TV-apparaat. Hierdoor kan de app mogelijk browsergegevens wissen of aanpassen. Opmerking: Dit recht kan niet worden afgedwongen door andere browsers of andere apps met internetmogelijkheden."</string>
+ <string name="permdesc_writeHistoryBookmarks" product="tv" msgid="88642768580408561">"Hiermee kan de app de browsergeschiedenis of opgeslagen bookmarks bewerken op je Android TV-apparaat. Hierdoor kan de app mogelijk browsegegevens wissen of aanpassen. Opmerking: Dit recht kan niet worden afgedwongen door andere browsers of andere apps met internetmogelijkheden."</string>
<string name="permdesc_writeHistoryBookmarks" product="default" msgid="2245203087160913652">"Hiermee kan de app de webgeschiedenis wijzigen in de systeemeigen browser en de bookmarks die zijn opgeslagen op je telefoon. Deze rechten kunnen niet worden geforceerd door andere browsers of andere apps met internetmogelijkheden."</string>
<string name="permlab_setAlarm" msgid="1158001610254173567">"een wekker instellen"</string>
<string name="permdesc_setAlarm" msgid="2185033720060109640">"Hiermee kan de app een wekker instellen in een geïnstalleerde wekker-app. Deze functie wordt door sommige wekker-apps niet geïmplementeerd."</string>
diff --git a/core/res/res/values-sk/strings.xml b/core/res/res/values-sk/strings.xml
index df5cdacfca2a..624d55492603 100644
--- a/core/res/res/values-sk/strings.xml
+++ b/core/res/res/values-sk/strings.xml
@@ -162,7 +162,7 @@
<string name="httpErrorAuth" msgid="469553140922938968">"Nepodarilo sa overiť totožnosť."</string>
<string name="httpErrorProxyAuth" msgid="7229662162030113406">"Overenie pomocou servera proxy bolo neúspešné."</string>
<string name="httpErrorConnect" msgid="3295081579893205617">"K serveru sa nepodarilo pripojiť."</string>
- <string name="httpErrorIO" msgid="3860318696166314490">"Nepodarilo sa nadviazať komunikáciu so serverom. Skúste to znova neskôr."</string>
+ <string name="httpErrorIO" msgid="3860318696166314490">"Nepodarilo sa nadviazať komunikáciu so serverom. Skúste to neskôr."</string>
<string name="httpErrorTimeout" msgid="7446272815190334204">"Časový limit pripojenia na server vypršal."</string>
<string name="httpErrorRedirectLoop" msgid="8455757777509512098">"Stránka obsahuje príliš veľa presmerovaní servera."</string>
<string name="httpErrorUnsupportedScheme" msgid="2664108769858966374">"Protokol nie je podporovaný."</string>
@@ -563,7 +563,7 @@
<string name="fingerprint_error_timeout" msgid="2946635815726054226">"Časový limit rozpoznania odtlačku prsta vypršal. Skúste to znova."</string>
<string name="fingerprint_error_canceled" msgid="540026881380070750">"Operácia týkajúca sa odtlačku prsta bola zrušená"</string>
<string name="fingerprint_error_user_canceled" msgid="7685676229281231614">"Overenie odtlačku prsta zrušil používateľ."</string>
- <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Príliš veľa pokusov. Skúste to znova neskôr."</string>
+ <string name="fingerprint_error_lockout" msgid="7853461265604738671">"Príliš veľa pokusov. Skúste to neskôr."</string>
<string name="fingerprint_error_lockout_permanent" msgid="3895478283943513746">"Príliš veľa pokusov. Senzor odtlačkov prstov bol deaktivovaný."</string>
<string name="fingerprint_error_unable_to_process" msgid="1148553603490048742">"Skúste to znova"</string>
<string name="fingerprint_error_no_fingerprints" msgid="8671811719699072411">"Neregistrovali ste žiadne odtlačky prstov."</string>
@@ -607,7 +607,7 @@
<string name="face_error_no_space" msgid="5649264057026021723">"Nové údaje o tvári sa nedajú uložiť. Najprv odstráňte jeden zo starých záznamov."</string>
<string name="face_error_canceled" msgid="2164434737103802131">"Operácia týkajúca sa tváre bola zrušená"</string>
<string name="face_error_user_canceled" msgid="8553045452825849843">"Odomknutie tvárou zrušil používateľ."</string>
- <string name="face_error_lockout" msgid="7864408714994529437">"Príliš veľa pokusov. Skúste to znova neskôr."</string>
+ <string name="face_error_lockout" msgid="7864408714994529437">"Príliš veľa pokusov. Skúste to neskôr."</string>
<string name="face_error_lockout_permanent" msgid="8277853602168960343">"Príliš veľa pokusov. Odomknutie tvárou bolo zakázané."</string>
<string name="face_error_unable_to_process" msgid="5723292697366130070">"Nedá sa overiť tvár. Skúste to znova."</string>
<string name="face_error_not_enrolled" msgid="7369928733504691611">"Nenastavili ste odomknutie tvárou."</string>
@@ -1816,7 +1816,7 @@
<item quantity="other">Skúste to znova o <xliff:g id="COUNT">%d</xliff:g> sekúnd</item>
<item quantity="one">Skúste to znova o 1 sekundu</item>
</plurals>
- <string name="restr_pin_try_later" msgid="5897719962541636727">"Skúste to znova neskôr"</string>
+ <string name="restr_pin_try_later" msgid="5897719962541636727">"Skúste to neskôr"</string>
<string name="immersive_cling_title" msgid="2307034298721541791">"Zobrazenie na celú obrazovku"</string>
<string name="immersive_cling_description" msgid="7092737175345204832">"Ukončíte potiahnutím zhora nadol."</string>
<string name="immersive_cling_positive" msgid="7047498036346489883">"Dobre"</string>
diff --git a/core/res/res/values-uz/strings.xml b/core/res/res/values-uz/strings.xml
index e8449c31639e..2b83c8214bc7 100644
--- a/core/res/res/values-uz/strings.xml
+++ b/core/res/res/values-uz/strings.xml
@@ -1765,7 +1765,7 @@
<string name="restr_pin_confirm_pin" msgid="7143161971614944989">"Yangi PIN kodni tasdiqlash"</string>
<string name="restr_pin_create_pin" msgid="917067613896366033">"Cheklovlarni o‘zgartirish uchun PIN-kod yaratish"</string>
<string name="restr_pin_error_doesnt_match" msgid="7063392698489280556">"PIN-kod mos kelmadi. Qayta urinib ko‘ring."</string>
- <string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN kod kamida 4 ta raqamdan iborat bo‘lishi shart."</string>
+ <string name="restr_pin_error_too_short" msgid="1547007808237941065">"PIN kod juda qisqa, kamida 4 ta raqam kiriting."</string>
<plurals name="restr_pin_countdown" formatted="false" msgid="4427486903285216153">
<item quantity="other"><xliff:g id="COUNT">%d</xliff:g> soniyadan so‘ng qayta urinib ko‘ring</item>
<item quantity="one">1 soniyadan so‘ng qayta urinib ko‘ring</item>
diff --git a/core/tests/coretests/BstatsTestApp/OWNERS b/core/tests/coretests/BstatsTestApp/OWNERS
new file mode 100644
index 000000000000..4068e2bc03b7
--- /dev/null
+++ b/core/tests/coretests/BstatsTestApp/OWNERS
@@ -0,0 +1 @@
+include /BATTERY_STATS_OWNERS
diff --git a/core/tests/coretests/src/android/os/storage/OWNERS b/core/tests/coretests/src/android/os/storage/OWNERS
new file mode 100644
index 000000000000..6f9dbea36b06
--- /dev/null
+++ b/core/tests/coretests/src/android/os/storage/OWNERS
@@ -0,0 +1 @@
+include /core/java/android/os/storage/OWNERS
diff --git a/core/tests/coretests/src/com/android/internal/os/OWNERS b/core/tests/coretests/src/com/android/internal/os/OWNERS
new file mode 100644
index 000000000000..4068e2bc03b7
--- /dev/null
+++ b/core/tests/coretests/src/com/android/internal/os/OWNERS
@@ -0,0 +1 @@
+include /BATTERY_STATS_OWNERS
diff --git a/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java b/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java
index d0267355c92e..e8793a9f6097 100644
--- a/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java
+++ b/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java
@@ -118,4 +118,89 @@ public class ArrayUtilsTest extends TestCase {
assertEquals(3, ArrayUtils.unstableRemoveIf(collection, isNull));
assertEquals(0, collection.size());
}
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_passesWhenRangeInsideArray() {
+ ArrayUtils.throwsIfOutOfBounds(10, 2, 6);
+ }
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_passesWhenRangeIsWholeArray() {
+ ArrayUtils.throwsIfOutOfBounds(10, 0, 10);
+ }
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_passesWhenEmptyRangeAtStart() {
+ ArrayUtils.throwsIfOutOfBounds(10, 0, 0);
+ }
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_passesWhenEmptyRangeAtEnd() {
+ ArrayUtils.throwsIfOutOfBounds(10, 10, 0);
+ }
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_passesWhenEmptyArray() {
+ ArrayUtils.throwsIfOutOfBounds(0, 0, 0);
+ }
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_failsWhenRangeStartNegative() {
+ try {
+ ArrayUtils.throwsIfOutOfBounds(10, -1, 5);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException expected) {
+ // expected
+ }
+ }
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_failsWhenCountNegative() {
+ try {
+ ArrayUtils.throwsIfOutOfBounds(10, 5, -1);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException expected) {
+ // expected
+ }
+ }
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_failsWhenRangeStartTooHigh() {
+ try {
+ ArrayUtils.throwsIfOutOfBounds(10, 11, 0);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException expected) {
+ // expected
+ }
+ }
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_failsWhenRangeEndTooHigh() {
+ try {
+ ArrayUtils.throwsIfOutOfBounds(10, 5, 6);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException expected) {
+ // expected
+ }
+ }
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_failsWhenLengthNegative() {
+ try {
+ ArrayUtils.throwsIfOutOfBounds(-1, 0, 0);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException expected) {
+ // expected
+ }
+ }
+
+ @SmallTest
+ public void testThrowsIfOutOfBounds_failsWhenOverflowRangeEndTooHigh() {
+ try {
+ ArrayUtils.throwsIfOutOfBounds(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE);
+ fail();
+ } catch (ArrayIndexOutOfBoundsException expected) {
+ // expected
+ }
+ }
}
diff --git a/core/tests/uwbtests/OWNERS b/core/tests/uwbtests/OWNERS
new file mode 100644
index 000000000000..c7b09a21e1d0
--- /dev/null
+++ b/core/tests/uwbtests/OWNERS
@@ -0,0 +1 @@
+include /core/java/android/uwb/OWNERS
diff --git a/core/tests/uwbtests/src/android/uwb/AngleOfArrivalMeasurementTest.java b/core/tests/uwbtests/src/android/uwb/AngleOfArrivalMeasurementTest.java
index 077b08f41b59..e0884e3e1c28 100644
--- a/core/tests/uwbtests/src/android/uwb/AngleOfArrivalMeasurementTest.java
+++ b/core/tests/uwbtests/src/android/uwb/AngleOfArrivalMeasurementTest.java
@@ -48,8 +48,8 @@ public class AngleOfArrivalMeasurementTest {
builder.setAzimuthAngleMeasurement(azimuth);
AngleOfArrivalMeasurement measurement = tryBuild(builder, true);
- assertEquals(azimuth, measurement.getAzimuth());
- assertEquals(altitude, measurement.getAltitude());
+ assertEquals(azimuth, measurement.getAzimuthAngleMeasurement());
+ assertEquals(altitude, measurement.getAltitudeAngleMeasurement());
}
private AngleMeasurement getAngleMeasurement(double radian, double error, double confidence) {
diff --git a/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java b/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
new file mode 100644
index 000000000000..6df1c3ed220f
--- /dev/null
+++ b/core/tests/uwbtests/src/android/uwb/RangingManagerTest.java
@@ -0,0 +1,260 @@
+/*
+ * 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.
+ */
+
+package android.uwb;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import android.os.PersistableBundle;
+import android.os.RemoteException;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Test of {@link AdapterStateListener}.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class RangingManagerTest {
+
+ private static final IUwbAdapter ADAPTER = mock(IUwbAdapter.class);
+ private static final Executor EXECUTOR = UwbTestUtils.getExecutor();
+ private static final PersistableBundle PARAMS = new PersistableBundle();
+ private static final @CloseReason int CLOSE_REASON = CloseReason.UNKNOWN;
+
+ @Test
+ public void testOpenSession_StartRangingInvoked() throws RemoteException {
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback);
+ verify(ADAPTER, times(1)).startRanging(eq(rangingManager), eq(PARAMS));
+ }
+
+ @Test
+ public void testOpenSession_ErrorIfSameSessionHandleReturned() throws RemoteException {
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ SessionHandle handle = new SessionHandle(1);
+ when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+
+ rangingManager.openSession(PARAMS, EXECUTOR, callback);
+
+ // Calling openSession will cause the same session handle to be returned. The onClosed
+ // callback should be invoked
+ RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+ verify(callback, times(0)).onClosed(anyInt(), any());
+ verify(callback2, times(1)).onClosed(anyInt(), any());
+ }
+
+ @Test
+ public void testOnRangingStarted_ValidSessionHandle() throws RemoteException {
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ SessionHandle handle = new SessionHandle(1);
+ when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+
+ rangingManager.openSession(PARAMS, EXECUTOR, callback);
+ rangingManager.onRangingStarted(handle, PARAMS);
+ verify(callback, times(1)).onOpenSuccess(any(), any());
+ }
+
+ @Test
+ public void testOnRangingStarted_InvalidSessionHandle() throws RemoteException {
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+
+ rangingManager.onRangingStarted(new SessionHandle(2), PARAMS);
+ verify(callback, times(0)).onOpenSuccess(any(), any());
+ }
+
+ @Test
+ public void testOnRangingStarted_MultipleSessionsRegistered() throws RemoteException {
+ SessionHandle sessionHandle1 = new SessionHandle(1);
+ SessionHandle sessionHandle2 = new SessionHandle(2);
+ RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
+ RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
+
+ when(ADAPTER.startRanging(any(), any()))
+ .thenReturn(sessionHandle1)
+ .thenReturn(sessionHandle2);
+
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback1);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+
+ rangingManager.onRangingStarted(sessionHandle1, PARAMS);
+ verify(callback1, times(1)).onOpenSuccess(any(), any());
+ verify(callback2, times(0)).onOpenSuccess(any(), any());
+
+ rangingManager.onRangingStarted(sessionHandle2, PARAMS);
+ verify(callback1, times(1)).onOpenSuccess(any(), any());
+ verify(callback2, times(1)).onOpenSuccess(any(), any());
+ }
+
+ @Test
+ public void testOnRangingClosed_OnRangingClosedCalled() throws RemoteException {
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ SessionHandle handle = new SessionHandle(1);
+ when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback);
+
+ rangingManager.onRangingClosed(handle, CLOSE_REASON, PARAMS);
+ verify(callback, times(1)).onClosed(anyInt(), any());
+ }
+
+ @Test
+ public void testOnRangingClosed_MultipleSessionsRegistered() throws RemoteException {
+ // Verify that if multiple sessions are registered, only the session that is
+ // requested to close receives the associated callbacks
+ SessionHandle sessionHandle1 = new SessionHandle(1);
+ SessionHandle sessionHandle2 = new SessionHandle(2);
+ RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
+ RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
+
+ when(ADAPTER.startRanging(any(), any()))
+ .thenReturn(sessionHandle1)
+ .thenReturn(sessionHandle2);
+
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback1);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+
+ rangingManager.onRangingClosed(sessionHandle1, CLOSE_REASON, PARAMS);
+ verify(callback1, times(1)).onClosed(anyInt(), any());
+ verify(callback2, times(0)).onClosed(anyInt(), any());
+
+ rangingManager.onRangingClosed(sessionHandle2, CLOSE_REASON, PARAMS);
+ verify(callback1, times(1)).onClosed(anyInt(), any());
+ verify(callback2, times(1)).onClosed(anyInt(), any());
+ }
+
+ @Test
+ public void testOnRangingReport_OnReportReceived() throws RemoteException {
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ SessionHandle handle = new SessionHandle(1);
+ when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback);
+ rangingManager.onRangingStarted(handle, PARAMS);
+
+ RangingReport report = UwbTestUtils.getRangingReports(1);
+ rangingManager.onRangingResult(handle, report);
+ verify(callback, times(1)).onReportReceived(eq(report));
+ }
+
+ @Test
+ public void testOnRangingReport_MultipleSessionsRegistered() throws RemoteException {
+ SessionHandle sessionHandle1 = new SessionHandle(1);
+ SessionHandle sessionHandle2 = new SessionHandle(2);
+ RangingSession.Callback callback1 = mock(RangingSession.Callback.class);
+ RangingSession.Callback callback2 = mock(RangingSession.Callback.class);
+
+ when(ADAPTER.startRanging(any(), any()))
+ .thenReturn(sessionHandle1)
+ .thenReturn(sessionHandle2);
+
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback1);
+ rangingManager.onRangingStarted(sessionHandle1, PARAMS);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback2);
+ rangingManager.onRangingStarted(sessionHandle2, PARAMS);
+
+ rangingManager.onRangingResult(sessionHandle1, UwbTestUtils.getRangingReports(1));
+ verify(callback1, times(1)).onReportReceived(any());
+ verify(callback2, times(0)).onReportReceived(any());
+
+ rangingManager.onRangingResult(sessionHandle2, UwbTestUtils.getRangingReports(1));
+ verify(callback1, times(1)).onReportReceived(any());
+ verify(callback2, times(1)).onReportReceived(any());
+ }
+
+ @Test
+ public void testOnClose_Reasons() throws RemoteException {
+ runOnClose_Reason(CloseReason.LOCAL_API,
+ RangingSession.Callback.CLOSE_REASON_LOCAL_CLOSE_API);
+
+ runOnClose_Reason(CloseReason.MAX_SESSIONS_REACHED,
+ RangingSession.Callback.CLOSE_REASON_LOCAL_MAX_SESSIONS_REACHED);
+
+ runOnClose_Reason(CloseReason.PROTOCOL_SPECIFIC,
+ RangingSession.Callback.CLOSE_REASON_PROTOCOL_SPECIFIC);
+
+ runOnClose_Reason(CloseReason.REMOTE_REQUEST,
+ RangingSession.Callback.CLOSE_REASON_REMOTE_REQUEST);
+
+ runOnClose_Reason(CloseReason.SYSTEM_POLICY,
+ RangingSession.Callback.CLOSE_REASON_LOCAL_SYSTEM_POLICY);
+
+ runOnClose_Reason(CloseReason.UNKNOWN,
+ RangingSession.Callback.CLOSE_REASON_UNKNOWN);
+ }
+
+ private void runOnClose_Reason(@CloseReason int reasonIn,
+ @RangingSession.Callback.CloseReason int reasonOut) throws RemoteException {
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ SessionHandle handle = new SessionHandle(1);
+ when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback);
+
+ rangingManager.onRangingClosed(handle, reasonIn, PARAMS);
+ verify(callback, times(1)).onClosed(eq(reasonOut), eq(PARAMS));
+ }
+
+ @Test
+ public void testStartFailureReasons() throws RemoteException {
+ runOnRangingStartFailed_Reason(StartFailureReason.BAD_PARAMETERS,
+ RangingSession.Callback.CLOSE_REASON_LOCAL_BAD_PARAMETERS);
+
+ runOnRangingStartFailed_Reason(StartFailureReason.MAX_SESSIONS_REACHED,
+ RangingSession.Callback.CLOSE_REASON_LOCAL_MAX_SESSIONS_REACHED);
+
+ runOnRangingStartFailed_Reason(StartFailureReason.PROTOCOL_SPECIFIC,
+ RangingSession.Callback.CLOSE_REASON_PROTOCOL_SPECIFIC);
+
+ runOnRangingStartFailed_Reason(StartFailureReason.SYSTEM_POLICY,
+ RangingSession.Callback.CLOSE_REASON_LOCAL_SYSTEM_POLICY);
+
+ runOnRangingStartFailed_Reason(StartFailureReason.UNKNOWN,
+ RangingSession.Callback.CLOSE_REASON_UNKNOWN);
+ }
+
+ private void runOnRangingStartFailed_Reason(@StartFailureReason int reasonIn,
+ @RangingSession.Callback.CloseReason int reasonOut) throws RemoteException {
+ RangingManager rangingManager = new RangingManager(ADAPTER);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ SessionHandle handle = new SessionHandle(1);
+ when(ADAPTER.startRanging(any(), any())).thenReturn(handle);
+ rangingManager.openSession(PARAMS, EXECUTOR, callback);
+
+ rangingManager.onRangingStartFailed(handle, reasonIn, PARAMS);
+ verify(callback, times(1)).onClosed(eq(reasonOut), eq(PARAMS));
+ }
+}
diff --git a/core/tests/uwbtests/src/android/uwb/RangingMeasurementTest.java b/core/tests/uwbtests/src/android/uwb/RangingMeasurementTest.java
index a7559d86221e..edd4d08992ba 100644
--- a/core/tests/uwbtests/src/android/uwb/RangingMeasurementTest.java
+++ b/core/tests/uwbtests/src/android/uwb/RangingMeasurementTest.java
@@ -63,8 +63,8 @@ public class RangingMeasurementTest {
assertEquals(status, measurement.getStatus());
assertEquals(address, measurement.getRemoteDeviceAddress());
assertEquals(time, measurement.getElapsedRealtimeNanos());
- assertEquals(angleMeasurement, measurement.getAngleOfArrival());
- assertEquals(distanceMeasurement, measurement.getDistance());
+ assertEquals(angleMeasurement, measurement.getAngleOfArrivalMeasurement());
+ assertEquals(distanceMeasurement, measurement.getDistanceMeasurement());
}
private RangingMeasurement tryBuild(RangingMeasurement.Builder builder,
diff --git a/core/tests/uwbtests/src/android/uwb/RangingSessionTest.java b/core/tests/uwbtests/src/android/uwb/RangingSessionTest.java
new file mode 100644
index 000000000000..702c68ebc9de
--- /dev/null
+++ b/core/tests/uwbtests/src/android/uwb/RangingSessionTest.java
@@ -0,0 +1,194 @@
+/*
+ * 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.uwb;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.os.PersistableBundle;
+import android.os.RemoteException;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SmallTest;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Test of {@link RangingSession}.
+ */
+@SmallTest
+@RunWith(AndroidJUnit4.class)
+public class RangingSessionTest {
+ private static final IUwbAdapter ADAPTER = mock(IUwbAdapter.class);
+ private static final Executor EXECUTOR = UwbTestUtils.getExecutor();
+ private static final PersistableBundle PARAMS = new PersistableBundle();
+ private static final @RangingSession.Callback.CloseReason int CLOSE_REASON =
+ RangingSession.Callback.CLOSE_REASON_LOCAL_GENERIC_ERROR;
+
+ @Test
+ public void testOnRangingStarted_OnOpenSuccessCalled() {
+ SessionHandle handle = new SessionHandle(123);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+ verifyOpenState(session, false);
+
+ session.onRangingStarted(PARAMS);
+ verifyOpenState(session, true);
+
+ // Verify that the onOpenSuccess callback was invoked
+ verify(callback, times(1)).onOpenSuccess(eq(session), any());
+ verify(callback, times(0)).onClosed(anyInt(), any());
+ }
+
+ @Test
+ public void testOnRangingStarted_CannotOpenClosedSession() {
+ SessionHandle handle = new SessionHandle(123);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+
+ session.onRangingStarted(PARAMS);
+ verifyOpenState(session, true);
+ verify(callback, times(1)).onOpenSuccess(eq(session), any());
+ verify(callback, times(0)).onClosed(anyInt(), any());
+
+ session.onRangingClosed(CLOSE_REASON, PARAMS);
+ verifyOpenState(session, false);
+ verify(callback, times(1)).onOpenSuccess(eq(session), any());
+ verify(callback, times(1)).onClosed(anyInt(), any());
+
+ // Now invoke the ranging started callback and ensure the session remains closed
+ session.onRangingStarted(PARAMS);
+ verifyOpenState(session, false);
+ verify(callback, times(1)).onOpenSuccess(eq(session), any());
+ verify(callback, times(1)).onClosed(anyInt(), any());
+ }
+
+ @Test
+ public void testOnRangingClosed_OnClosedCalledWhenSessionNotOpen() {
+ SessionHandle handle = new SessionHandle(123);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+ verifyOpenState(session, false);
+
+ session.onRangingClosed(CLOSE_REASON, PARAMS);
+ verifyOpenState(session, false);
+
+ // Verify that the onOpenSuccess callback was invoked
+ verify(callback, times(0)).onOpenSuccess(eq(session), any());
+ verify(callback, times(1)).onClosed(anyInt(), any());
+ }
+
+ @Test public void testOnRangingClosed_OnClosedCalled() {
+ SessionHandle handle = new SessionHandle(123);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+ session.onRangingStarted(PARAMS);
+ session.onRangingClosed(CLOSE_REASON, PARAMS);
+ verify(callback, times(1)).onClosed(anyInt(), any());
+
+ verifyOpenState(session, false);
+ session.onRangingClosed(CLOSE_REASON, PARAMS);
+ verify(callback, times(2)).onClosed(anyInt(), any());
+ }
+
+ @Test
+ public void testOnRangingResult_OnReportReceivedCalled() {
+ SessionHandle handle = new SessionHandle(123);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+ verifyOpenState(session, false);
+
+ session.onRangingStarted(PARAMS);
+ verifyOpenState(session, true);
+
+ RangingReport report = UwbTestUtils.getRangingReports(1);
+ session.onRangingResult(report);
+ verify(callback, times(1)).onReportReceived(eq(report));
+ }
+
+ @Test
+ public void testClose() throws RemoteException {
+ SessionHandle handle = new SessionHandle(123);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+ session.onRangingStarted(PARAMS);
+
+ // Calling close multiple times should invoke closeRanging until the session receives
+ // the onClosed callback.
+ int totalCallsBeforeOnRangingClosed = 3;
+ for (int i = 1; i <= totalCallsBeforeOnRangingClosed; i++) {
+ session.close();
+ verifyOpenState(session, true);
+ verify(ADAPTER, times(i)).closeRanging(handle);
+ verify(callback, times(0)).onClosed(anyInt(), any());
+ }
+
+ // After onClosed is invoked, then the adapter should no longer be called for each call to
+ // the session's close.
+ final int totalCallsAfterOnRangingClosed = 2;
+ for (int i = 1; i <= totalCallsAfterOnRangingClosed; i++) {
+ session.onRangingClosed(CLOSE_REASON, PARAMS);
+ verifyOpenState(session, false);
+ verify(ADAPTER, times(totalCallsBeforeOnRangingClosed)).closeRanging(handle);
+ verify(callback, times(i)).onClosed(anyInt(), any());
+ }
+ }
+
+ @Test
+ public void testOnRangingResult_OnReportReceivedCalledWhenOpen() {
+ SessionHandle handle = new SessionHandle(123);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+
+ assertFalse(session.isOpen());
+ session.onRangingStarted(PARAMS);
+ assertTrue(session.isOpen());
+
+ // Verify that the onReportReceived callback was invoked
+ RangingReport report = UwbTestUtils.getRangingReports(1);
+ session.onRangingResult(report);
+ verify(callback, times(1)).onReportReceived(report);
+ }
+
+ @Test
+ public void testOnRangingResult_OnReportReceivedNotCalledWhenNotOpen() {
+ SessionHandle handle = new SessionHandle(123);
+ RangingSession.Callback callback = mock(RangingSession.Callback.class);
+ RangingSession session = new RangingSession(EXECUTOR, callback, ADAPTER, handle);
+
+ assertFalse(session.isOpen());
+
+ // Verify that the onReportReceived callback was invoked
+ RangingReport report = UwbTestUtils.getRangingReports(1);
+ session.onRangingResult(report);
+ verify(callback, times(0)).onReportReceived(report);
+ }
+
+ private void verifyOpenState(RangingSession session, boolean expected) {
+ assertEquals(expected, session.isOpen());
+ }
+}
diff --git a/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java b/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java
index fb7509248b38..b4b2e303443e 100644
--- a/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java
+++ b/core/tests/uwbtests/src/android/uwb/UwbTestUtils.java
@@ -22,6 +22,7 @@ import android.os.SystemClock;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.Executor;
public class UwbTestUtils {
private UwbTestUtils() {}
@@ -96,4 +97,13 @@ public class UwbTestUtils {
}
return UwbAddress.fromBytes(addressBytes);
}
+
+ public static Executor getExecutor() {
+ return new Executor() {
+ @Override
+ public void execute(Runnable command) {
+ command.run();
+ }
+ };
+ }
}
diff --git a/data/etc/car/Android.bp b/data/etc/car/Android.bp
index e5492714b29f..12bd0f51fa5f 100644
--- a/data/etc/car/Android.bp
+++ b/data/etc/car/Android.bp
@@ -158,6 +158,13 @@ prebuilt_etc {
}
prebuilt_etc {
+ name: "privapp_allowlist_com.google.android.car.networking.preferenceupdater",
+ sub_dir: "permissions",
+ src: "com.google.android.car.networking.preferenceupdater.xml",
+ filename_from_src: true,
+}
+
+prebuilt_etc {
name: "privapp_whitelist_com.android.car.ui.paintbooth",
sub_dir: "permissions",
src: "com.android.car.ui.paintbooth.xml",
diff --git a/data/etc/car/com.google.android.car.networking.preferenceupdater.xml b/data/etc/car/com.google.android.car.networking.preferenceupdater.xml
new file mode 100644
index 000000000000..489ce1b47ffa
--- /dev/null
+++ b/data/etc/car/com.google.android.car.networking.preferenceupdater.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ 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
+ -->
+<permissions>
+ <privapp-permissions package="com.google.android.car.networking.preferenceupdater">
+ <permission name="android.permission.ACCESS_NETWORK_STATE"/>
+ <permission name="android.permission.ACCESS_WIFI_STATE"/>
+ <permission name="android.permission.ACTIVITY_EMBEDDING"/>
+ <permission name="android.permission.INTERACT_ACROSS_USERS"/>
+ <permission name="android.permission.INTERACT_ACROSS_USERS_FULL"/>
+ <permission name="android.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS"/>
+ <permission name="android.permission.LOCATION_HARDWARE"/>
+ </privapp-permissions>
+</permissions>
diff --git a/data/etc/privapp-permissions-platform.xml b/data/etc/privapp-permissions-platform.xml
index 6555fe93c81f..057c0120b685 100644
--- a/data/etc/privapp-permissions-platform.xml
+++ b/data/etc/privapp-permissions-platform.xml
@@ -436,6 +436,8 @@ applications that come with the platform
<permission name="android.permission.MANAGE_DEBUGGING" />
<!-- Permissions required for CTS test - TimeManagerTest -->
<permission name="android.permission.MANAGE_TIME_AND_ZONE_DETECTION" />
+ <!-- Permissions required for CTS test - CtsHdmiCecHostTestCases -->
+ <permission name="android.permission.HDMI_CEC"/>
</privapp-permissions>
<privapp-permissions package="com.android.statementservice">
diff --git a/data/keyboards/keyboards.mk b/data/keyboards/keyboards.mk
index 68cbd29859bb..c7ce8cd6693a 100644
--- a/data/keyboards/keyboards.mk
+++ b/data/keyboards/keyboards.mk
@@ -14,13 +14,9 @@
# Warning: this is actually a product definition, to be inherited from
-include $(LOCAL_PATH)/common.mk
+PRODUCT_COPY_FILES := \
+ $(call find-copy-subdir-files,*.kl,$(LOCAL_PATH),system/usr/keylayout) \
+ $(call find-copy-subdir-files,*.kcm,$(LOCAL_PATH),system/usr/keychars) \
+ $(call find-copy-subdir-files,*.idc,$(LOCAL_PATH),system/usr/idc)
-PRODUCT_COPY_FILES := $(foreach file,$(framework_keylayouts),\
- $(file):system/usr/keylayout/$(notdir $(file)))
-PRODUCT_COPY_FILES += $(foreach file,$(framework_keycharmaps),\
- $(file):system/usr/keychars/$(notdir $(file)))
-
-PRODUCT_COPY_FILES += $(foreach file,$(framework_keyconfigs),\
- $(file):system/usr/idc/$(notdir $(file)))
diff --git a/drm/java/android/drm/DrmOutputStream.java b/drm/java/android/drm/DrmOutputStream.java
index 73e7f23b19c6..2a3f530e04c4 100644
--- a/drm/java/android/drm/DrmOutputStream.java
+++ b/drm/java/android/drm/DrmOutputStream.java
@@ -25,9 +25,10 @@ import android.system.ErrnoException;
import android.system.Os;
import android.util.Log;
+import com.android.internal.util.ArrayUtils;
+
import libcore.io.IoBridge;
import libcore.io.Streams;
-import libcore.util.ArrayUtils;
import java.io.FileDescriptor;
import java.io.FilterOutputStream;
diff --git a/graphics/java/android/graphics/OWNERS b/graphics/java/android/graphics/OWNERS
index c3fb6f8eba7c..9fa8f1b284bb 100644
--- a/graphics/java/android/graphics/OWNERS
+++ b/graphics/java/android/graphics/OWNERS
@@ -4,5 +4,10 @@ romainguy@google.com
jreck@google.com
njawad@google.com
sumir@google.com
+djsollen@google.com
+scroggo@google.com
per-file BLASTBufferQueue.java = file:/services/core/java/com/android/server/wm/OWNERS
+per-file FontFamily.java = file:fonts/OWNERS
+per-file FontListParser.java = file:fonts/OWNERS
+per-file Typeface.java = file:fonts/OWNERS
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java
index 0775a1a99886..56f7ea8725ee 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStore3DESCipherSpi.java
@@ -41,7 +41,7 @@ import javax.crypto.spec.IvParameterSpec;
*
* @hide
*/
-public class AndroidKeyStore3DESCipherSpi extends AndroidKeyStoreCipherSpiBase {
+public abstract class AndroidKeyStore3DESCipherSpi extends AndroidKeyStoreCipherSpiBase {
private static final int BLOCK_SIZE_BYTES = 8;
@@ -73,12 +73,22 @@ public class AndroidKeyStore3DESCipherSpi extends AndroidKeyStoreCipherSpiBase {
public NoPadding() {
super(KeymasterDefs.KM_PAD_NONE);
}
+
+ @Override
+ protected final String getTransform() {
+ return "DESede/ECB/NoPadding";
+ }
}
public static class PKCS7Padding extends ECB {
public PKCS7Padding() {
super(KeymasterDefs.KM_PAD_PKCS7);
}
+
+ @Override
+ protected final String getTransform() {
+ return "DESede/ECB/PKCS7Padding";
+ }
}
}
@@ -91,12 +101,23 @@ public class AndroidKeyStore3DESCipherSpi extends AndroidKeyStoreCipherSpiBase {
public NoPadding() {
super(KeymasterDefs.KM_PAD_NONE);
}
+
+ @Override
+ protected final String getTransform() {
+ return "DESede/CBC/NoPadding";
+ }
+
}
public static class PKCS7Padding extends CBC {
public PKCS7Padding() {
super(KeymasterDefs.KM_PAD_PKCS7);
}
+
+ @Override
+ protected final String getTransform() {
+ return "DESede/CBC/PKCS7Padding";
+ }
}
}
@@ -288,7 +309,7 @@ public class AndroidKeyStore3DESCipherSpi extends AndroidKeyStoreCipherSpiBase {
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 bc56f015f3bd..64da83778a45 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreAuthenticatedAESCipherSpi.java
@@ -64,6 +64,11 @@ abstract class AndroidKeyStoreAuthenticatedAESCipherSpi extends AndroidKeyStoreC
}
@Override
+ protected final String getTransform() {
+ return "AES/GCM/NoPadding";
+ }
+
+ @Override
protected final void resetAll() {
mTagLengthBits = DEFAULT_TAG_LENGTH_BITS;
super.resetAll();
@@ -325,7 +330,7 @@ abstract class AndroidKeyStoreAuthenticatedAESCipherSpi extends AndroidKeyStoreC
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/AndroidKeyStoreBCWorkaroundProvider.java b/keystore/java/android/security/keystore2/AndroidKeyStoreBCWorkaroundProvider.java
index dd943d422e62..9ad6f3adbd33 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreBCWorkaroundProvider.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreBCWorkaroundProvider.java
@@ -254,13 +254,13 @@ class AndroidKeyStoreBCWorkaroundProvider extends Provider {
private void putAsymmetricCipherImpl(String transformation, String implClass) {
put("Cipher." + transformation, implClass);
put("Cipher." + transformation + " SupportedKeyClasses",
- KEYSTORE_PRIVATE_KEY_CLASS_NAME + "|" + KEYSTORE_PUBLIC_KEY_CLASS_NAME);
+ KEYSTORE_PRIVATE_KEY_CLASS_NAME);
}
private void putSignatureImpl(String algorithm, String implClass) {
put("Signature." + algorithm, implClass);
put("Signature." + algorithm + " SupportedKeyClasses",
- KEYSTORE_PRIVATE_KEY_CLASS_NAME + "|" + KEYSTORE_PUBLIC_KEY_CLASS_NAME);
+ KEYSTORE_PRIVATE_KEY_CLASS_NAME);
}
public static String[] getSupportedEcdsaSignatureDigests() {
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java
index a3b04abfba3f..2ee952cbc5fb 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreCipherSpiBase.java
@@ -43,6 +43,7 @@ import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.spec.AlgorithmParameterSpec;
import java.security.spec.InvalidKeySpecException;
+import java.security.spec.MGF1ParameterSpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
@@ -57,6 +58,8 @@ import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.ShortBufferException;
+import javax.crypto.spec.OAEPParameterSpec;
+import javax.crypto.spec.PSource;
import javax.crypto.spec.SecretKeySpec;
/**
@@ -99,6 +102,8 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
*/
private Exception mCachedException;
+ private Cipher mCipher;
+
AndroidKeyStoreCipherSpiBase() {
mOperation = null;
mEncrypting = false;
@@ -110,6 +115,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
mAdditionalAuthenticationDataStreamer = null;
mAdditionalAuthenticationDataStreamerClosed = false;
mCachedException = null;
+ mCipher = null;
}
@Override
@@ -117,6 +123,45 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
throws InvalidKeyException {
resetAll();
+ if (!(key instanceof AndroidKeyStorePrivateKey
+ || key instanceof AndroidKeyStoreSecretKey)) {
+ try {
+ mCipher = Cipher.getInstance(getTransform());
+ String transform = getTransform();
+
+ if ("RSA/ECB/OAEPWithSHA-224AndMGF1Padding".equals(transform)) {
+ OAEPParameterSpec spec =
+ new OAEPParameterSpec("SHA-224", "MGF1",
+ new MGF1ParameterSpec("SHA1"), PSource.PSpecified.DEFAULT);
+ mCipher.init(opmode, key, spec, random);
+ } else if ("RSA/ECB/OAEPWithSHA-256AndMGF1Padding".equals(transform)) {
+ OAEPParameterSpec spec =
+ new OAEPParameterSpec("SHA-256", "MGF1",
+ new MGF1ParameterSpec("SHA1"), PSource.PSpecified.DEFAULT);
+ mCipher.init(opmode, key, spec, random);
+
+ } else if ("RSA/ECB/OAEPWithSHA-384AndMGF1Padding".equals(transform)) {
+ OAEPParameterSpec spec =
+ new OAEPParameterSpec("SHA-384", "MGF1",
+ new MGF1ParameterSpec("SHA1"), PSource.PSpecified.DEFAULT);
+ mCipher.init(opmode, key, spec, random);
+
+ } else if ("RSA/ECB/OAEPWithSHA-512AndMGF1Padding".equals(transform)) {
+ OAEPParameterSpec spec =
+ new OAEPParameterSpec("SHA-512", "MGF1",
+ new MGF1ParameterSpec("SHA1"), PSource.PSpecified.DEFAULT);
+ mCipher.init(opmode, key, spec, random);
+ } else {
+ mCipher.init(opmode, key, random);
+ }
+ return;
+ } catch (NoSuchAlgorithmException
+ | NoSuchPaddingException
+ | InvalidAlgorithmParameterException e) {
+ throw new InvalidKeyException(e);
+ }
+ }
+
boolean success = false;
try {
init(opmode, key, random);
@@ -139,6 +184,17 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException {
resetAll();
+ if (!(key instanceof AndroidKeyStorePrivateKey
+ || key instanceof AndroidKeyStoreSecretKey)) {
+ try {
+ mCipher = Cipher.getInstance(getTransform());
+ mCipher.init(opmode, key, params, random);
+ return;
+ } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
+ throw new InvalidKeyException(e);
+ }
+ }
+
boolean success = false;
try {
init(opmode, key, random);
@@ -157,6 +213,17 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException {
resetAll();
+ if (!(key instanceof AndroidKeyStorePrivateKey
+ || key instanceof AndroidKeyStoreSecretKey)) {
+ try {
+ mCipher = Cipher.getInstance(getTransform());
+ mCipher.init(opmode, key, params, random);
+ return;
+ } catch (NoSuchAlgorithmException | NoSuchPaddingException e) {
+ throw new InvalidKeyException(e);
+ }
+ }
+
boolean success = false;
try {
init(opmode, key, random);
@@ -214,6 +281,7 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
mAdditionalAuthenticationDataStreamer = null;
mAdditionalAuthenticationDataStreamerClosed = false;
mCachedException = null;
+ mCipher = null;
}
/**
@@ -320,6 +388,10 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
@Override
protected final byte[] engineUpdate(byte[] input, int inputOffset, int inputLen) {
+ if (mCipher != null) {
+ return mCipher.update(input, inputOffset, inputLen);
+ }
+
if (mCachedException != null) {
return null;
}
@@ -371,6 +443,9 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
@Override
protected final int engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output,
int outputOffset) throws ShortBufferException {
+ if (mCipher != null) {
+ return mCipher.update(input, inputOffset, inputLen, output);
+ }
byte[] outputCopy = engineUpdate(input, inputOffset, inputLen);
if (outputCopy == null) {
return 0;
@@ -387,6 +462,10 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
@Override
protected final int engineUpdate(ByteBuffer input, ByteBuffer output)
throws ShortBufferException {
+ if (mCipher != null) {
+ return mCipher.update(input, output);
+ }
+
if (input == null) {
throw new NullPointerException("input == null");
}
@@ -423,6 +502,11 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
@Override
protected final void engineUpdateAAD(byte[] input, int inputOffset, int inputLen) {
+ if (mCipher != null) {
+ mCipher.updateAAD(input, inputOffset, inputLen);
+ return;
+ }
+
if (mCachedException != null) {
return;
}
@@ -459,6 +543,11 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
@Override
protected final void engineUpdateAAD(ByteBuffer src) {
+ if (mCipher != null) {
+ mCipher.updateAAD(src);
+ return;
+ }
+
if (src == null) {
throw new IllegalArgumentException("src == null");
}
@@ -486,6 +575,10 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
@Override
protected final byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen)
throws IllegalBlockSizeException, BadPaddingException {
+ if (mCipher != null) {
+ return mCipher.doFinal(input, inputOffset, inputLen);
+ }
+
if (mCachedException != null) {
throw (IllegalBlockSizeException)
new IllegalBlockSizeException().initCause(mCachedException);
@@ -522,6 +615,10 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
protected final int engineDoFinal(byte[] input, int inputOffset, int inputLen, byte[] output,
int outputOffset) throws ShortBufferException, IllegalBlockSizeException,
BadPaddingException {
+ if (mCipher != null) {
+ return mCipher.doFinal(input, inputOffset, inputLen, output);
+ }
+
byte[] outputCopy = engineDoFinal(input, inputOffset, inputLen);
if (outputCopy == null) {
return 0;
@@ -538,6 +635,10 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
@Override
protected final int engineDoFinal(ByteBuffer input, ByteBuffer output)
throws ShortBufferException, IllegalBlockSizeException, BadPaddingException {
+ if (mCipher != null) {
+ return mCipher.doFinal(input, output);
+ }
+
if (input == null) {
throw new NullPointerException("input == null");
}
@@ -575,6 +676,10 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
@Override
protected final byte[] engineWrap(Key key)
throws IllegalBlockSizeException, InvalidKeyException {
+ if (mCipher != null) {
+ return mCipher.wrap(key);
+ }
+
if (mKey == null) {
throw new IllegalStateException("Not initilized");
}
@@ -656,6 +761,10 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
@Override
protected final Key engineUnwrap(byte[] wrappedKey, String wrappedKeyAlgorithm,
int wrappedKeyType) throws InvalidKeyException, NoSuchAlgorithmException {
+ if (mCipher != null) {
+ return mCipher.unwrap(wrappedKey, wrappedKeyAlgorithm, wrappedKeyType);
+ }
+
if (mKey == null) {
throw new IllegalStateException("Not initilized");
}
@@ -902,4 +1011,6 @@ abstract class AndroidKeyStoreCipherSpiBase extends CipherSpi implements KeyStor
*/
protected abstract void loadAlgorithmSpecificParametersFromBeginResult(
KeyParameter[] parameters);
+
+ protected abstract String getTransform();
}
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java
index d1ef1df817e6..8289671de212 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreECDSASignatureSpi.java
@@ -44,6 +44,11 @@ abstract class AndroidKeyStoreECDSASignatureSpi extends AndroidKeyStoreSignature
}
@Override
+ protected String getAlgorithm() {
+ return "NONEwithECDSA";
+ }
+
+ @Override
protected KeyStoreCryptoOperationStreamer createMainDataStreamer(
KeyStoreOperation operation) {
return new TruncateToFieldSizeMessageStreamer(
@@ -113,30 +118,50 @@ abstract class AndroidKeyStoreECDSASignatureSpi extends AndroidKeyStoreSignature
public SHA1() {
super(KeymasterDefs.KM_DIGEST_SHA1);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA1withECDSA";
+ }
}
public final static class SHA224 extends AndroidKeyStoreECDSASignatureSpi {
public SHA224() {
super(KeymasterDefs.KM_DIGEST_SHA_2_224);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA224withECDSA";
+ }
}
public final static class SHA256 extends AndroidKeyStoreECDSASignatureSpi {
public SHA256() {
super(KeymasterDefs.KM_DIGEST_SHA_2_256);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA256withECDSA";
+ }
}
public final static class SHA384 extends AndroidKeyStoreECDSASignatureSpi {
public SHA384() {
super(KeymasterDefs.KM_DIGEST_SHA_2_384);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA384withECDSA";
+ }
}
public final static class SHA512 extends AndroidKeyStoreECDSASignatureSpi {
public SHA512() {
super(KeymasterDefs.KM_DIGEST_SHA_2_512);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA512withECDSA";
+ }
}
private final int mKeymasterDigest;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreLoadStoreParameter.java b/keystore/java/android/security/keystore2/AndroidKeyStoreLoadStoreParameter.java
index afb10547411b..0c6744f9822c 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreLoadStoreParameter.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreLoadStoreParameter.java
@@ -22,11 +22,11 @@ import java.security.KeyStore.ProtectionParameter;
/**
* @hide
*/
-class AndroidKeyStoreLoadStoreParameter implements KeyStore.LoadStoreParameter {
+public class AndroidKeyStoreLoadStoreParameter implements KeyStore.LoadStoreParameter {
private final int mNamespace;
- AndroidKeyStoreLoadStoreParameter(int namespace) {
+ public AndroidKeyStoreLoadStoreParameter(int namespace) {
mNamespace = namespace;
}
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java b/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
index b2e32a3175e3..403da189262d 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreProvider.java
@@ -31,9 +31,7 @@ import android.system.keystore2.KeyEntryResponse;
import android.system.keystore2.KeyMetadata;
import android.system.keystore2.ResponseCode;
-import java.security.KeyFactory;
import java.security.KeyPair;
-import java.security.NoSuchAlgorithmException;
import java.security.Provider;
import java.security.ProviderException;
import java.security.PublicKey;
@@ -42,8 +40,6 @@ import java.security.Signature;
import java.security.UnrecoverableKeyException;
import java.security.interfaces.ECPublicKey;
import java.security.interfaces.RSAPublicKey;
-import java.security.spec.InvalidKeySpecException;
-import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
import javax.crypto.Mac;
@@ -237,28 +233,11 @@ public class AndroidKeyStoreProvider extends Provider {
throw new UnrecoverableKeyException("Failed to obtain X.509 form of public key."
+ " Keystore has no public certificate stored.");
}
- final byte[] x509EncodedPublicKey = metadata.certificate;
+ final byte[] x509PublicCert = metadata.certificate;
- String jcaKeyAlgorithm;
- try {
- jcaKeyAlgorithm = KeyProperties.KeyAlgorithm.fromKeymasterAsymmetricKeyAlgorithm(
- algorithm);
- } catch (IllegalArgumentException e) {
- throw (UnrecoverableKeyException)
- new UnrecoverableKeyException("Failed to load private key")
- .initCause(e);
- }
+ PublicKey publicKey = AndroidKeyStoreSpi.toCertificate(x509PublicCert).getPublicKey();
- PublicKey publicKey;
- try {
- KeyFactory keyFactory = KeyFactory.getInstance(jcaKeyAlgorithm);
- publicKey = keyFactory.generatePublic(new X509EncodedKeySpec(x509EncodedPublicKey));
- } catch (NoSuchAlgorithmException e) {
- throw new ProviderException(
- "Failed to obtain " + jcaKeyAlgorithm + " KeyFactory", e);
- } catch (InvalidKeySpecException e) {
- throw new ProviderException("Invalid X.509 encoding of public key", e);
- }
+ String jcaKeyAlgorithm = publicKey.getAlgorithm();
KeyStoreSecurityLevel securityLevel = iSecurityLevel;
if (KeyProperties.KEY_ALGORITHM_EC.equalsIgnoreCase(jcaKeyAlgorithm)) {
@@ -358,7 +337,7 @@ public class AndroidKeyStoreProvider extends Provider {
KeyDescriptor descriptor = new KeyDescriptor();
if (namespace == KeyProperties.NAMESPACE_APPLICATION) {
- descriptor.nspace = 0; // ignored;
+ descriptor.nspace = KeyProperties.NAMESPACE_APPLICATION; // ignored;
descriptor.domain = Domain.APP;
} else {
descriptor.nspace = namespace;
@@ -387,10 +366,10 @@ public class AndroidKeyStoreProvider extends Provider {
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;
}
}
@@ -407,7 +386,7 @@ public class AndroidKeyStoreProvider extends Provider {
keymasterAlgorithm == KeymasterDefs.KM_ALGORITHM_EC) {
return makeAndroidKeyStorePublicKeyFromKeyEntryResponse(descriptor, response.metadata,
new KeyStoreSecurityLevel(response.iSecurityLevel),
- keymasterAlgorithm);
+ keymasterAlgorithm).getPrivateKey();
} else {
throw new UnrecoverableKeyException("Key algorithm unknown");
}
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java
index 951f91887894..6ff9432905ed 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreRSACipherSpi.java
@@ -158,7 +158,7 @@ abstract class AndroidKeyStoreRSACipherSpi extends AndroidKeyStoreCipherSpiBase
}
/**
- * RSA cipher with OAEP encryption padding. Only SHA-1 based MGF1 is supported as MGF.
+ * RSA cipher with OAEP encryption padding.
*/
abstract static class OAEPWithMGF1Padding extends AndroidKeyStoreRSACipherSpi {
@@ -316,6 +316,25 @@ abstract class AndroidKeyStoreRSACipherSpi extends AndroidKeyStoreCipherSpiBase
protected final int getAdditionalEntropyAmountForFinish() {
return (isEncrypting()) ? mDigestOutputSizeBytes : 0;
}
+
+ @Override
+ protected final String getTransform() {
+ switch (mKeymasterDigest) {
+ case KeymasterDefs.KM_DIGEST_SHA1:
+ return "RSA/ECB/OAEPWithSHA-1AndMGF1Padding";
+ case KeymasterDefs.KM_DIGEST_SHA_2_224:
+ return "RSA/ECB/OAEPWithSHA-224AndMGF1Padding";
+ case KeymasterDefs.KM_DIGEST_SHA_2_256:
+ return "RSA/ECB/OAEPWithSHA-256AndMGF1Padding";
+ case KeymasterDefs.KM_DIGEST_SHA_2_384:
+ return "RSA/ECB/OAEPWithSHA-384AndMGF1Padding";
+ case KeymasterDefs.KM_DIGEST_SHA_2_512:
+ return "RSA/ECB/OAEPWithSHA-512AndMGF1Padding";
+ default:
+ return "RSA/ECB/OAEPPadding";
+ }
+ }
+
}
public static class OAEPWithSHA1AndMGF1Padding extends OAEPWithMGF1Padding {
@@ -358,6 +377,11 @@ abstract class AndroidKeyStoreRSACipherSpi extends AndroidKeyStoreCipherSpiBase
}
@Override
+ protected String getTransform() {
+ return "RSA/ECB/" + KeyProperties.EncryptionPadding.fromKeymaster(mKeymasterPadding);
+ }
+
+ @Override
protected final void initKey(int opmode, Key key) throws InvalidKeyException {
if (key == null) {
throw new InvalidKeyException("Unsupported key: null");
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java
index ab7559116a41..931c2f864eba 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreRSASignatureSpi.java
@@ -48,42 +48,70 @@ abstract class AndroidKeyStoreRSASignatureSpi extends AndroidKeyStoreSignatureSp
public NONEWithPKCS1Padding() {
super(KeymasterDefs.KM_DIGEST_NONE);
}
+ @Override
+ protected String getAlgorithm() {
+ return "NONEwithRSA";
+ }
}
public static final class MD5WithPKCS1Padding extends PKCS1Padding {
public MD5WithPKCS1Padding() {
super(KeymasterDefs.KM_DIGEST_MD5);
}
+ @Override
+ protected String getAlgorithm() {
+ return "MD5withRSA";
+ }
}
public static final class SHA1WithPKCS1Padding extends PKCS1Padding {
public SHA1WithPKCS1Padding() {
super(KeymasterDefs.KM_DIGEST_SHA1);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA1withRSA";
+ }
}
public static final class SHA224WithPKCS1Padding extends PKCS1Padding {
public SHA224WithPKCS1Padding() {
super(KeymasterDefs.KM_DIGEST_SHA_2_224);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA224withRSA";
+ }
}
public static final class SHA256WithPKCS1Padding extends PKCS1Padding {
public SHA256WithPKCS1Padding() {
super(KeymasterDefs.KM_DIGEST_SHA_2_256);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA256withRSA";
+ }
}
public static final class SHA384WithPKCS1Padding extends PKCS1Padding {
public SHA384WithPKCS1Padding() {
super(KeymasterDefs.KM_DIGEST_SHA_2_384);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA384withRSA";
+ }
}
public static final class SHA512WithPKCS1Padding extends PKCS1Padding {
public SHA512WithPKCS1Padding() {
super(KeymasterDefs.KM_DIGEST_SHA_2_512);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA512withRSA";
+ }
}
abstract static class PSSPadding extends AndroidKeyStoreRSASignatureSpi {
@@ -103,30 +131,50 @@ abstract class AndroidKeyStoreRSASignatureSpi extends AndroidKeyStoreSignatureSp
public SHA1WithPSSPadding() {
super(KeymasterDefs.KM_DIGEST_SHA1);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA1withRSA/PSS";
+ }
}
public static final class SHA224WithPSSPadding extends PSSPadding {
public SHA224WithPSSPadding() {
super(KeymasterDefs.KM_DIGEST_SHA_2_224);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA224withRSA/PSS";
+ }
}
public static final class SHA256WithPSSPadding extends PSSPadding {
public SHA256WithPSSPadding() {
super(KeymasterDefs.KM_DIGEST_SHA_2_256);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA256withRSA/PSS";
+ }
}
public static final class SHA384WithPSSPadding extends PSSPadding {
public SHA384WithPSSPadding() {
super(KeymasterDefs.KM_DIGEST_SHA_2_384);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA384withRSA/PSS";
+ }
}
public static final class SHA512WithPSSPadding extends PSSPadding {
public SHA512WithPSSPadding() {
super(KeymasterDefs.KM_DIGEST_SHA_2_512);
}
+ @Override
+ protected String getAlgorithm() {
+ return "SHA512withRSA/PSS";
+ }
}
private final int mKeymasterDigest;
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSecretKeyFactorySpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSecretKeyFactorySpi.java
index 9d3b9704d711..74503e1eecfa 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSecretKeyFactorySpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSecretKeyFactorySpi.java
@@ -102,7 +102,8 @@ public class AndroidKeyStoreSecretKeyFactorySpi extends SecretKeyFactorySpi {
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 @@ public class AndroidKeyStoreSecretKeyFactorySpi extends SecretKeyFactorySpi {
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/AndroidKeyStoreSignatureSpiBase.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java
index 9b4f01e744f7..96da1e00ade8 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSignatureSpiBase.java
@@ -30,10 +30,12 @@ import libcore.util.EmptyArray;
import java.nio.ByteBuffer;
import java.security.InvalidKeyException;
import java.security.InvalidParameterException;
+import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.ProviderException;
import java.security.PublicKey;
import java.security.SecureRandom;
+import java.security.Signature;
import java.security.SignatureException;
import java.security.SignatureSpi;
import java.util.ArrayList;
@@ -76,6 +78,13 @@ abstract class AndroidKeyStoreSignatureSpiBase extends SignatureSpi
*/
private Exception mCachedException;
+ /**
+ * This signature object is used for public key operations, i.e, signatrue verification.
+ * The Android Keystore backend does not perform public key operations and defers to the
+ * Highest priority provider.
+ */
+ private Signature mSignature;
+
AndroidKeyStoreSignatureSpiBase() {
mOperation = null;
mOperationChallenge = 0;
@@ -84,6 +93,7 @@ abstract class AndroidKeyStoreSignatureSpiBase extends SignatureSpi
appRandom = null;
mMessageStreamer = null;
mCachedException = null;
+ mSignature = null;
}
@Override
@@ -123,27 +133,13 @@ abstract class AndroidKeyStoreSignatureSpiBase extends SignatureSpi
protected final void engineInitVerify(PublicKey publicKey) throws InvalidKeyException {
resetAll();
- boolean success = false;
try {
- if (publicKey == null) {
- throw new InvalidKeyException("Unsupported key: null");
- }
- AndroidKeyStoreKey keystoreKey;
- if (publicKey instanceof AndroidKeyStorePublicKey) {
- keystoreKey = (AndroidKeyStorePublicKey) publicKey;
- } else {
- throw new InvalidKeyException("Unsupported public key type: " + publicKey);
- }
- mSigning = false;
- initKey(keystoreKey);
- appRandom = null;
- ensureKeystoreOperationInitialized();
- success = true;
- } finally {
- if (!success) {
- resetAll();
- }
+ mSignature = Signature.getInstance(getAlgorithm());
+ } catch (NoSuchAlgorithmException e) {
+ throw new InvalidKeyException(e);
}
+
+ mSignature.initVerify(publicKey);
}
/**
@@ -251,6 +247,11 @@ abstract class AndroidKeyStoreSignatureSpiBase extends SignatureSpi
@Override
protected final void engineUpdate(byte[] b, int off, int len) throws SignatureException {
+ if (mSignature != null) {
+ mSignature.update(b, off, len);
+ return;
+ }
+
if (mCachedException != null) {
throw new SignatureException(mCachedException);
}
@@ -337,39 +338,10 @@ abstract class AndroidKeyStoreSignatureSpiBase extends SignatureSpi
@Override
protected final boolean engineVerify(byte[] signature) throws SignatureException {
- if (mCachedException != null) {
- throw new SignatureException(mCachedException);
- }
-
- try {
- ensureKeystoreOperationInitialized();
- } catch (InvalidKeyException e) {
- throw new SignatureException(e);
- }
-
- boolean verified;
- try {
- byte[] output = mMessageStreamer.doFinal(
- EmptyArray.BYTE, 0, 0,
- signature);
- if (output.length != 0) {
- throw new ProviderException(
- "Signature verification unexpected produced output: " + output.length
- + " bytes");
- }
- verified = true;
- } catch (KeyStoreException e) {
- switch (e.getErrorCode()) {
- case KeymasterDefs.KM_ERROR_VERIFICATION_FAILED:
- verified = false;
- break;
- default:
- throw new SignatureException(e);
- }
+ if (mSignature != null) {
+ return mSignature.verify(signature);
}
-
- resetWhilePreservingInitState();
- return verified;
+ throw new IllegalStateException("Not initialised.");
}
@Override
@@ -392,6 +364,13 @@ abstract class AndroidKeyStoreSignatureSpiBase extends SignatureSpi
}
/**
+ * Implementations need to report the algorithm they implement so that we can delegate to the
+ * highest priority provider.
+ * @return Algorithm string.
+ */
+ protected abstract String getAlgorithm();
+
+ /**
* Returns {@code true} if this signature is initialized for signing, {@code false} if this
* signature is initialized for verification.
*/
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
index aca531458382..5e7f6482ebed 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreSpi.java
@@ -219,7 +219,7 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi {
return null;
}
- private static X509Certificate toCertificate(byte[] bytes) {
+ static X509Certificate toCertificate(byte[] bytes) {
try {
final CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
return (X509Certificate) certFactory.generateCertificate(
@@ -250,13 +250,10 @@ public class AndroidKeyStoreSpi extends KeyStoreSpi {
return null;
}
-
- // TODO add modification time to key metadata.
- return null;
- // if (response.metadata.modificationTime == -1) {
- // return null;
- // }
- // return new Date(response.metadata.modificationTime);
+ if (response.metadata.modificationTimeMs == -1) {
+ return null;
+ }
+ return new Date(response.metadata.modificationTimeMs);
}
@Override
diff --git a/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java b/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
index 4d4b0d8f183b..5c048a127cb3 100644
--- a/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
+++ b/keystore/java/android/security/keystore2/AndroidKeyStoreUnauthenticatedAESCipherSpi.java
@@ -42,7 +42,7 @@ import javax.crypto.spec.IvParameterSpec;
*
* @hide
*/
-class AndroidKeyStoreUnauthenticatedAESCipherSpi extends AndroidKeyStoreCipherSpiBase {
+abstract class AndroidKeyStoreUnauthenticatedAESCipherSpi extends AndroidKeyStoreCipherSpiBase {
abstract static class ECB extends AndroidKeyStoreUnauthenticatedAESCipherSpi {
protected ECB(int keymasterPadding) {
@@ -53,12 +53,22 @@ class AndroidKeyStoreUnauthenticatedAESCipherSpi extends AndroidKeyStoreCipherSp
public NoPadding() {
super(KeymasterDefs.KM_PAD_NONE);
}
+
+ @Override
+ protected final String getTransform() {
+ return "AES/ECB/NoPadding";
+ }
}
public static class PKCS7Padding extends ECB {
public PKCS7Padding() {
super(KeymasterDefs.KM_PAD_PKCS7);
}
+
+ @Override
+ protected final String getTransform() {
+ return "AES/ECB/PKCS7Padding";
+ }
}
}
@@ -71,12 +81,22 @@ class AndroidKeyStoreUnauthenticatedAESCipherSpi extends AndroidKeyStoreCipherSp
public NoPadding() {
super(KeymasterDefs.KM_PAD_NONE);
}
+
+ @Override
+ protected final String getTransform() {
+ return "AES/CBC/NoPadding";
+ }
}
public static class PKCS7Padding extends CBC {
public PKCS7Padding() {
super(KeymasterDefs.KM_PAD_PKCS7);
}
+
+ @Override
+ protected final String getTransform() {
+ return "AES/CBC/PKCS7Padding";
+ }
}
}
@@ -89,6 +109,11 @@ class AndroidKeyStoreUnauthenticatedAESCipherSpi extends AndroidKeyStoreCipherSp
public NoPadding() {
super(KeymasterDefs.KM_PAD_NONE);
}
+
+ @Override
+ protected final String getTransform() {
+ return "AES/CTR/NoPadding";
+ }
}
}
@@ -275,7 +300,7 @@ class AndroidKeyStoreUnauthenticatedAESCipherSpi extends AndroidKeyStoreCipherSp
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 18c786aa3093..4c8ab8d6c713 100644
--- a/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
+++ b/keystore/java/android/security/keystore2/KeyStore2ParameterUtils.java
@@ -19,7 +19,9 @@ package android.security.keystore2;
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 @@ public abstract class KeyStore2ParameterUtils {
}
KeyParameter p = new KeyParameter();
p.tag = tag;
- p.boolValue = true;
+ p.value = KeyParameterValue.boolValue(true);
return p;
}
@@ -62,14 +64,40 @@ public abstract class KeyStore2ParameterUtils {
* @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 @@ public abstract class KeyStore2ParameterUtils {
}
KeyParameter p = new KeyParameter();
p.tag = tag;
- p.integer = v;
+ p.value = KeyParameterValue.integer(v);
return p;
}
@@ -104,7 +132,7 @@ public abstract class KeyStore2ParameterUtils {
}
KeyParameter p = new KeyParameter();
p.tag = tag;
- p.longInteger = v;
+ p.value = KeyParameterValue.longInteger(v);
return p;
}
@@ -121,7 +149,7 @@ public abstract class KeyStore2ParameterUtils {
}
KeyParameter p = new KeyParameter();
p.tag = tag;
- p.blob = b;
+ p.value = KeyParameterValue.blob(b);
return p;
}
@@ -138,9 +166,10 @@ public abstract class KeyStore2ParameterUtils {
}
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,24 +189,24 @@ public abstract class KeyStore2ParameterUtils {
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) {
int offset = 0;
while (flags != 0) {
- if ((flags & 1) == 0) {
+ if ((flags & 1) == 1) {
consumer.accept(1 << offset);
}
offset += 1;
diff --git a/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java b/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java
index 3b11854bf7cb..f87a3d25f90c 100644
--- a/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java
+++ b/keystore/java/android/security/keystore2/KeyStoreCryptoOperationUtils.java
@@ -57,7 +57,7 @@ abstract class KeyStoreCryptoOperationUtils {
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 a545b3d5e134..bec80a7d605e 100644
--- a/libs/androidfw/AssetManager2.cpp
+++ b/libs/androidfw/AssetManager2.cpp
@@ -670,7 +670,7 @@ base::expected<FindEntryResult, NullOrIOError> AssetManager2::FindEntryInternal(
}
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 4010e4e10317..bce70e2aae9e 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -897,12 +897,12 @@ base::expected<StringPiece, NullOrIOError> ResStringPool::string8At(size_t idx)
// 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 a34aa7239250..87fb2c038c9f 100644
--- a/libs/androidfw/ResourceUtils.cpp
+++ b/libs/androidfw/ResourceUtils.cpp
@@ -56,7 +56,8 @@ base::expected<AssetManager2::ResourceName, NullOrIOError> ToResourceName(
.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 @@ base::expected<AssetManager2::ResourceName, NullOrIOError> ToResourceName(
}
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 @@ base::expected<AssetManager2::ResourceName, NullOrIOError> ToResourceName(
}
}
- 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 @@ base::expected<AssetManager2::ResourceName, NullOrIOError> ToResourceName(
}
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 0ab62c14ab9f..7caac899a603 100644
--- a/media/java/android/media/AudioDeviceAttributes.java
+++ b/media/java/android/media/AudioDeviceAttributes.java
@@ -72,6 +72,11 @@ public final class AudioDeviceAttributes implements Parcelable {
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 @@ public final class AudioDeviceAttributes implements Parcelable {
mRole = deviceInfo.isSink() ? ROLE_OUTPUT : ROLE_INPUT;
mType = deviceInfo.getType();
mAddress = deviceInfo.getAddress();
+ mNativeType = deviceInfo.getInternalType();
}
/**
@@ -101,9 +107,12 @@ public final class AudioDeviceAttributes implements Parcelable {
}
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 @@ public final class AudioDeviceAttributes implements Parcelable {
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 @@ public final class AudioDeviceAttributes implements Parcelable {
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 final class AudioDeviceAttributes implements Parcelable {
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 @@ public final class AudioDeviceAttributes implements Parcelable {
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 ff4a25622bca..f79fc92477f7 100644
--- a/media/java/android/media/AudioDeviceInfo.java
+++ b/media/java/android/media/AudioDeviceInfo.java
@@ -350,6 +350,14 @@ public final class AudioDeviceInfo {
}
/**
+ * @hide
+ * @return the internal device tyoe
+ */
+ public int getInternalType() {
+ return mPort.type();
+ }
+
+ /**
* @return The internal device ID.
*/
public int getId() {
@@ -512,10 +520,21 @@ public final class AudioDeviceInfo {
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 @@ public final class AudioDeviceInfo {
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 107d6565a29e..7dff0c2b9380 100755
--- a/media/java/android/media/AudioManager.java
+++ b/media/java/android/media/AudioManager.java
@@ -75,6 +75,7 @@ import java.io.IOException;
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,11 +1599,25 @@ public class AudioManager {
@RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
public boolean setPreferredDeviceForStrategy(@NonNull AudioProductStrategy strategy,
@NonNull AudioDeviceAttributes device) {
+ return setPreferredDevicesForStrategy(strategy, Arrays.asList(device));
+ }
+
+ /**
+ * @hide
+ * 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)
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public boolean removePreferredDeviceForStrategy(@NonNull AudioProductStrategy strategy) {
Objects.requireNonNull(strategy);
- Objects.requireNonNull(device);
try {
final int status =
- getService().setPreferredDeviceForStrategy(strategy.getId(), device);
+ getService().removePreferredDevicesForStrategy(strategy.getId());
return status == AudioSystem.SUCCESS;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1611,19 +1626,52 @@ public class AudioManager {
/**
* @hide
- * Removes the preferred audio device previously set with
- * {@link #setPreferredDeviceForStrategy(AudioProductStrategy, AudioDeviceAttributes)}.
+ * 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
- * @return true if the operation was successful, false otherwise (invalid strategy, or no
- * device set for example)
+ * @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 removePreferredDeviceForStrategy(@NonNull AudioProductStrategy strategy) {
+ 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().removePreferredDeviceForStrategy(strategy.getId());
+ getService().setPreferredDevicesForStrategy(strategy.getId(), devices);
return status == AudioSystem.SUCCESS;
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1632,19 +1680,21 @@ public class AudioManager {
/**
* @hide
- * Return the preferred device for an audio strategy, previously set with
+ * 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 @@ public class AudioManager {
* 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 @@ public class AudioManager {
* @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,23 +1732,87 @@ public class AudioManager {
/**
* @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
+ * @throws SecurityException if the caller doesn't hold the required permission
+ */
+ @SystemApi
+ @RequiresPermission(android.Manifest.permission.MODIFY_AUDIO_ROUTING)
+ public void addOnPreferredDevicesForStrategyChangedListener(
+ @NonNull @CallbackExecutor Executor executor,
+ @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 @@ public class AudioManager {
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 @@ public class AudioManager {
*/
@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 @@ public class AudioManager {
if (mPrefDevListeners.size() == 0) {
// unregister binder for callbacks
try {
- getService().unregisterStrategyPreferredDeviceDispatcher(
+ getService().unregisterStrategyPreferredDevicesDispatcher(
mPrefDevDispatcherStub);
} catch (RemoteException e) {
throw e.rethrowFromSystemServer();
@@ -1759,23 +1876,23 @@ public class AudioManager {
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 @@ public class AudioManager {
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 @@ public class AudioManager {
@GuardedBy("mPrefDevListenerLock")
private @Nullable PrefDevListenerInfo getPrefDevListenerInfo(
- OnPreferredDeviceForStrategyChangedListener listener) {
+ OnPreferredDevicesForStrategyChangedListener listener) {
if (mPrefDevListeners == null) {
return null;
}
@@ -1813,7 +1930,7 @@ public class AudioManager {
}
@GuardedBy("mPrefDevListenerLock")
- private boolean hasPrefDevListener(OnPreferredDeviceForStrategyChangedListener listener) {
+ private boolean hasPrefDevListener(OnPreferredDevicesForStrategyChangedListener listener) {
return getPrefDevListenerInfo(listener) != null;
}
@@ -1821,7 +1938,7 @@ public class AudioManager {
/**
* @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 @@ public class AudioManager {
}
//====================================================================
+ // 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 @@ public class AudioManager {
}
/**
+ * 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 @@ public class AudioManager {
}
}
+ /**
+ * 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 f1eb53dda5b9..18c8a72b165b 100644
--- a/media/java/android/media/AudioSystem.java
+++ b/media/java/android/media/AudioSystem.java
@@ -28,11 +28,13 @@ import android.media.audiopolicy.AudioMix;
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 @@ public class AudioSystem
/** @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 @@ public class AudioSystem
/**
* @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.
+ * Set device as role for 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
+ * @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 setPreferredDeviceForStrategy(
- int strategy, int deviceType, String deviceAddress);
+ private static native int setDevicesRoleForStrategy(
+ int strategy, int role, @NonNull int[] types, @NonNull String[] addresses);
/**
* @hide
- * Remove preferred routing for the strategy
+ * 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 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 getPreferredDeviceForStrategy(int strategy,
- AudioDeviceAttributes[] device);
+ 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 78806eb9e547..ebaa3162d0e4 100755
--- a/media/java/android/media/IAudioService.aidl
+++ b/media/java/android/media/IAudioService.aidl
@@ -26,10 +26,12 @@ import android.media.AudioRoutesInfo;
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 @@ interface IAudioService {
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 @@ interface IAudioService {
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 @@ interface IAudioService {
// 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/wifi/java/android/net/wifi/IWifiConnectedNetworkScorer.aidl b/media/java/android/media/ICapturePresetDevicesRoleDispatcher.aidl
index f96d037cbfea..5e03e632c4ff 100644
--- a/wifi/java/android/net/wifi/IWifiConnectedNetworkScorer.aidl
+++ b/media/java/android/media/ICapturePresetDevicesRoleDispatcher.aidl
@@ -14,20 +14,18 @@
* limitations under the License.
*/
-package android.net.wifi;
+package android.media;
-import android.net.wifi.IScoreUpdateObserver;
+import android.media.AudioDeviceAttributes;
/**
- * Interface for Wi-Fi connected network scorer.
+ * AIDL for AudioService to signal devices role for capture preset updates.
*
- * @hide
+ * {@hide}
*/
-oneway interface IWifiConnectedNetworkScorer
-{
- void onStart(int sessionId);
+oneway interface ICapturePresetDevicesRoleDispatcher {
- void onStop(int sessionId);
+ void dispatchDevicesRoleChanged(
+ int capturePreset, int role, in List<AudioDeviceAttributes> devices);
- void onSetScoreUpdateObserver(IScoreUpdateObserver observerImpl);
}
diff --git a/wifi/java/android/net/wifi/IScoreUpdateObserver.aidl b/media/java/android/media/ICommunicationDeviceDispatcher.aidl
index 775fed7d47ef..429f934a77dc 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 dispatchCommunicationDeviceChanged(int portId);
- void triggerUpdateOfWifiUsabilityStats(int sessionId);
}
diff --git a/media/java/android/media/IStrategyPreferredDeviceDispatcher.aidl b/media/java/android/media/IStrategyPreferredDevicesDispatcher.aidl
index b1f99e6b729e..db674c36a5c9 100644
--- a/media/java/android/media/IStrategyPreferredDeviceDispatcher.aidl
+++ b/media/java/android/media/IStrategyPreferredDevicesDispatcher.aidl
@@ -19,12 +19,12 @@ package android.media;
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/MediaCodecInfo.java b/media/java/android/media/MediaCodecInfo.java
index e7e83ebb001f..9657b25e7c18 100644
--- a/media/java/android/media/MediaCodecInfo.java
+++ b/media/java/android/media/MediaCodecInfo.java
@@ -1865,10 +1865,6 @@ public final class MediaCodecInfo {
&& aligned.mMaxMacroBlockRate >= otherAligned.mMaxMacroBlockRate);
}
- /* package private */ boolean isEqualDimension(@NonNull PerformancePoint other) {
- return mWidth == other.mWidth && mHeight == other.mHeight;
- }
-
private @NonNull Size getCommonBlockSize(@NonNull PerformancePoint other) {
return new Size(
Math.max(mBlockSize.getWidth(), other.mBlockSize.getWidth()) * 16,
@@ -2010,8 +2006,11 @@ public final class MediaCodecInfo {
* codecs are active, should use that highest pixel count, and add the frame rates of
* each individual codec.
* <p class=note>
- * Supported resolution could be further restricted for 32-bit processes due to
- * the limited virtual memory space.
+ * 32-bit processes will not support resolutions larger than 4096x4096 due to
+ * the limited address space, but performance points will be presented as is.
+ * In other words, even though a component publishes a performance point for
+ * a resolution higher than 4096x4096, it does not mean that the resolution is supported
+ * for 32-bit processes.
*/
@Nullable
public List<PerformancePoint> getSupportedPerformancePoints() {
@@ -2215,28 +2214,6 @@ public final class MediaCodecInfo {
(a.getMaxFrameRate() != b.getMaxFrameRate()) ?
(a.getMaxFrameRate() < b.getMaxFrameRate() ? -1 : 1) : 0));
- // remove redundant points
- for (int i = 1; i < ret.size(); ++i) {
- PerformancePoint a = ret.get(i);
- for (int j = 0; j < i; ++j) {
- PerformancePoint b = ret.get(j);
- if (b.isEqualDimension(a) && b.covers(a)) {
- ret.set(i, null);
- break;
- }
- }
- }
- int newSize = 0;
- for (int i = 0; i < ret.size(); ++i) {
- PerformancePoint a = ret.get(i);
- if (a == null) {
- continue;
- }
- ret.set(newSize, a);
- ++newSize;
- }
- ret.setSize(newSize);
-
return Collections.unmodifiableList(ret);
}
diff --git a/media/java/android/media/MediaRecorder.java b/media/java/android/media/MediaRecorder.java
index 73ef31504b74..c61a2eb02921 100644
--- a/media/java/android/media/MediaRecorder.java
+++ b/media/java/android/media/MediaRecorder.java
@@ -404,6 +404,32 @@ public class MediaRecorder implements AudioRouting,
}
}
+ /**
+ * @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 cbc9ab7e4adf..cf06fad3e203 100644
--- a/media/java/android/media/OWNERS
+++ b/media/java/android/media/OWNERS
@@ -6,3 +6,4 @@ lajos@google.com
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 d55e9d0efffd..0d53ab152129 100644
--- a/media/jni/audioeffect/android_media_AudioEffect.cpp
+++ b/media/jni/audioeffect/android_media_AudioEffect.cpp
@@ -333,7 +333,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t
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/mime/OWNERS b/mime/OWNERS
index 6f9dbea36b06..235797998f24 100644
--- a/mime/OWNERS
+++ b/mime/OWNERS
@@ -1 +1,2 @@
+include platform/libcore:/OWNERS
include /core/java/android/os/storage/OWNERS
diff --git a/native/android/OWNERS b/native/android/OWNERS
index 266764a6f607..ac5a89527ef0 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 000000000000..a26f715280a1
--- /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 000000000000..ef53ebb43c40
--- /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
index 36a6fde36191..36a6fde36191 100644
--- a/services/core/jni/com_android_server_TestNetworkService.cpp
+++ b/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
index 836d6d8abdb2..ea5e7183c905 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 000000000000..3afcb0e8f688
--- /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 445c81b89273..000000000000
--- 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 a428cb36e97e..000000000000
--- 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 aa7c3e65d964..000000000000
--- 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 87fd622cde2c..000000000000
--- 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 1dfe701dc88e..000000000000
--- 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 f560a8d0fa62..000000000000
--- 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 4436aab39e13..000000000000
--- 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 bfeee10622ae..000000000000
--- 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 e27c578343ef..000000000000
--- 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 b72d7c1b45f8..000000000000
--- 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 422de3222871..000000000000
--- 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 977f93982619..000000000000
--- 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 6eb2cc119ef9..000000000000
--- 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 158c3f22ce21..000000000000
--- 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 ea3145dcb87f..000000000000
--- 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 c9f615e2d017..000000000000
--- 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 e9b9751c95cf..000000000000
--- 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 7d9309616592..000000000000
--- 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 b9cb7942bc79..000000000000
--- 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 68c93b78a46d..000000000000
--- 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 7e5a3106db4a..000000000000
--- 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 a58e4817a3cb..000000000000
--- 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 fbbcab17c412..000000000000
--- 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 fbbcab17c412..000000000000
--- 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 fbbcab17c412..000000000000
--- 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 fbbcab17c412..000000000000
--- 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 af7ff67c86b2..000000000000
--- 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 144804cd891c..000000000000
--- 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 3ad95cd8cdc9..000000000000
--- 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 94c5cea646a5..000000000000
--- 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 30caa8740a1d..000000000000
--- 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 300520336037..000000000000
--- 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 24eac8acc8d3..000000000000
--- 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 bcaa6621e803..000000000000
--- 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 bcaa6621e803..000000000000
--- 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 5fc44440d01d..000000000000
--- 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 8449963b1705..000000000000
--- 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 9e07438047f0..000000000000
--- 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 e9b9751c95cf..000000000000
--- 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 cb0e036fbbd3..000000000000
--- 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 ae1c36a0b341..000000000000
--- 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 6aaf6942c25a..000000000000
--- 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 f1ae520a63ee..000000000000
--- 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 fbff7b0f4c75..000000000000
--- 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 866ef880759c..000000000000
--- 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 8a220d605afb..000000000000
--- 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 bf08006c47b3..000000000000
--- 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 8b87356ad547..000000000000
--- 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 f58ccc330c5f..000000000000
--- 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 49a65627487e..000000000000
--- 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 e647ca05f97a..000000000000
--- 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 42da248ac9e5..000000000000
--- 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 9ff224170908..000000000000
--- 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 1a4c06e87955..000000000000
--- 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 11cdb974440f..000000000000
--- 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 de608e12cab7..000000000000
--- 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 8e797c8e6e98..000000000000
--- 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 59d79d0c0a5d..000000000000
--- 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 15479a6e2735..000000000000
--- 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 7e1cf9535319..000000000000
--- 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 1bd992e8485b..000000000000
--- 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 2e0c47a18fca..000000000000
--- 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 16bd92f57e23..000000000000
--- 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 7cf8bd2da1ac..000000000000
--- 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 e0584d716d66..000000000000
--- 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 7e47d0e0960e..000000000000
--- 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 c0722ab6aaf6..000000000000
--- 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 c9fe3772504d..000000000000
--- 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 0059281416c8..000000000000
--- 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 c9fe3772504d..000000000000
--- 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 eead127dd877..000000000000
--- 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 a271ef7c00fc..000000000000
--- 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 52e5979e7078..000000000000
--- 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 f6b9f702d3b7..000000000000
--- 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 6e6b95ce07f1..000000000000
--- 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 f67a2382bdac..000000000000
--- 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 14e0828d5b83..000000000000
--- 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 ea5fdfda7004..000000000000
--- 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 c20a4023dda5..000000000000
--- 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 e2eb567ef92e..000000000000
--- 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 56b0b44d4802..000000000000
--- 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 552dca2c15e3..000000000000
--- 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 ba89e9654213..000000000000
--- 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 1d927fef4d16..000000000000
--- 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 6e60ff008c0f..000000000000
--- 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 eed7686c4fe9..000000000000
--- 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 152d129fe05a..000000000000
--- 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 845580760965..000000000000
--- 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 7f13647bfccd..000000000000
--- 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 873179189b24..000000000000
--- 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 79208c8d7387..000000000000
--- 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 27ac6bb755f9..000000000000
--- 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 47c82246738c..000000000000
--- 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 14de0f503769..000000000000
--- 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 f6c233954b52..000000000000
--- 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 3ef4b8432232..000000000000
--- 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 9797846bd7b1..000000000000
--- 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 082c148746a3..3b7775a97dde 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 560c5dcfe924..f6e901de8393 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/SettingsLib/res/values-bs/strings.xml b/packages/SettingsLib/res/values-bs/strings.xml
index 671461bd0b50..e4ba93aa0a2a 100644
--- a/packages/SettingsLib/res/values-bs/strings.xml
+++ b/packages/SettingsLib/res/values-bs/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_network_failure" msgid="2660396183242399585">"Greška u konfiguraciji IP-a"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Niste povezani zbog slabog kvaliteta mreže"</string>
<string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"Greška pri povezivanju na WiFi"</string>
- <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Problem pri autentifikaciji."</string>
+ <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Problem pri autentifikaciji"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"Nije se moguće povezati"</string>
<string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"Nije se moguće povezati na aplikaciju \'<xliff:g id="AP_NAME">%1$s</xliff:g>\'"</string>
<string name="wifi_check_password_try_again" msgid="8817789642851605628">"Provjerite lozinku i pokušajte ponovo"</string>
diff --git a/packages/SettingsLib/res/values-fa/strings.xml b/packages/SettingsLib/res/values-fa/strings.xml
index 121da7b175f7..19ba5d07e948 100644
--- a/packages/SettingsLib/res/values-fa/strings.xml
+++ b/packages/SettingsLib/res/values-fa/strings.xml
@@ -34,7 +34,7 @@
<string name="wifi_check_password_try_again" msgid="8817789642851605628">"گذرواژه را بررسی و دوباره امتحان کنید"</string>
<string name="wifi_not_in_range" msgid="1541760821805777772">"در محدوده نیست"</string>
<string name="wifi_no_internet_no_reconnect" msgid="821591791066497347">"اتصال به‌صورت خودکار انجام نمی‌شود"</string>
- <string name="wifi_no_internet" msgid="1774198889176926299">"بدون دسترسی به اینترنت"</string>
+ <string name="wifi_no_internet" msgid="1774198889176926299">"دسترسی به اینترنت ندارد"</string>
<string name="saved_network" msgid="7143698034077223645">"ذخیره‌شده توسط <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="connected_via_network_scorer" msgid="7665725527352893558">"‏اتصال خودکار ازطریق %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7973529709744526285">"اتصال خودکار ازطریق ارائه‌دهنده رتبه‌بندی شبکه"</string>
diff --git a/packages/SettingsLib/res/values-fr-rCA/strings.xml b/packages/SettingsLib/res/values-fr-rCA/strings.xml
index 6bb1a3a3279c..bdbfbc641067 100644
--- a/packages/SettingsLib/res/values-fr-rCA/strings.xml
+++ b/packages/SettingsLib/res/values-fr-rCA/strings.xml
@@ -488,7 +488,6 @@
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"Les adresses MAC sont randomisées"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139">
<item quantity="one">%1$d appareil connecté</item>
- <item quantity="many">%1$d devices connected</item>
<item quantity="other">%1$d appareils connectés</item>
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Plus longtemps."</string>
diff --git a/packages/SettingsLib/res/values-fr/strings.xml b/packages/SettingsLib/res/values-fr/strings.xml
index 8690dd8be5ff..4509b09d4a5e 100644
--- a/packages/SettingsLib/res/values-fr/strings.xml
+++ b/packages/SettingsLib/res/values-fr/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_network_failure" msgid="2660396183242399585">"Échec de configuration de l\'adresse IP"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Non connecté en raison de la faible qualité du réseau"</string>
<string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"Échec de la connexion Wi-Fi"</string>
- <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Problème d\'authentification."</string>
+ <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Problème d\'authentification"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"Connexion impossible"</string>
<string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"Impossible de se connecter au réseau \"<xliff:g id="AP_NAME">%1$s</xliff:g>\""</string>
<string name="wifi_check_password_try_again" msgid="8817789642851605628">"Vérifiez le mot de passe et réessayez"</string>
@@ -251,7 +251,7 @@
<string name="wifi_display_certification" msgid="1805579519992520381">"Certification affichage sans fil"</string>
<string name="wifi_verbose_logging" msgid="1785910450009679371">"Autoriser l\'enregistrement d\'infos Wi-Fi détaillées"</string>
<string name="wifi_scan_throttling" msgid="2985624788509913617">"Limiter la recherche Wi‑Fi"</string>
- <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Chgt aléatoire d\'adresse MAC en Wi-Fi"</string>
+ <string name="wifi_enhanced_mac_randomization" msgid="5437378364995776979">"Changement aléatoire d\'adresse MAC en Wi-Fi"</string>
<string name="mobile_data_always_on" msgid="8275958101875563572">"Données mobiles toujours actives"</string>
<string name="tethering_hardware_offload" msgid="4116053719006939161">"Accélération matérielle pour le partage de connexion"</string>
<string name="bluetooth_show_devices_without_names" msgid="923584526471885819">"Afficher les appareils Bluetooth sans nom"</string>
@@ -488,7 +488,6 @@
<string name="wifi_status_mac_randomized" msgid="466382542497832189">"La sélection des adresses MAC est aléatoire"</string>
<plurals name="wifi_tether_connected_summary" formatted="false" msgid="6317236306047306139">
<item quantity="one">%1$d appareil connecté</item>
- <item quantity="many">%1$d devices connected</item>
<item quantity="other">%1$d appareils connectés</item>
</plurals>
<string name="accessibility_manual_zen_more_time" msgid="5141801092071134235">"Plus longtemps."</string>
diff --git a/packages/SettingsLib/res/values-hi/strings.xml b/packages/SettingsLib/res/values-hi/strings.xml
index 6e734bc873b8..4ba2961f0b3c 100644
--- a/packages/SettingsLib/res/values-hi/strings.xml
+++ b/packages/SettingsLib/res/values-hi/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP कॉन्‍फ़िगरेशन की विफलता"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"खराब नेटवर्क होने के कारण कनेक्ट नहीं हुआ"</string>
<string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"वाईफ़ाई कनेक्‍शन विफलता"</string>
- <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"प्रमाणीकरण समस्या"</string>
+ <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"पुष्टि नहीं हो सकी"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"कनेक्ट नहीं हो पा रहा है"</string>
<string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\' से कनेक्ट नहीं हो पा रहा है"</string>
<string name="wifi_check_password_try_again" msgid="8817789642851605628">"पासवर्ड जाँचें और दोबारा कोशिश करें"</string>
diff --git a/packages/SettingsLib/res/values-in/strings.xml b/packages/SettingsLib/res/values-in/strings.xml
index ec2429be34e2..3e06a3ae4460 100644
--- a/packages/SettingsLib/res/values-in/strings.xml
+++ b/packages/SettingsLib/res/values-in/strings.xml
@@ -207,7 +207,7 @@
<string name="enable_adb_summary" msgid="3711526030096574316">"Mode debug ketika USB tersambung"</string>
<string name="clear_adb_keys" msgid="3010148733140369917">"Cabut otorisasi debug USB"</string>
<string name="enable_adb_wireless" msgid="6973226350963971018">"Proses debug nirkabel"</string>
- <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Mode debug saat Wi-Fi tersambung"</string>
+ <string name="enable_adb_wireless_summary" msgid="7344391423657093011">"Mode debug saat Wi-Fi terhubung"</string>
<string name="adb_wireless_error" msgid="721958772149779856">"Error"</string>
<string name="adb_wireless_settings" msgid="2295017847215680229">"Proses debug nirkabel"</string>
<string name="adb_wireless_list_empty_off" msgid="1713707973837255490">"Untuk melihat dan menggunakan perangkat yang tersedia, aktifkan proses debug nirkabel"</string>
@@ -225,13 +225,13 @@
<string name="adb_pairing_device_dialog_title" msgid="7141739231018530210">"Sambungkan dengan perangkat"</string>
<string name="adb_pairing_device_dialog_pairing_code_label" msgid="3639239786669722731">"Kode penyambungan Wi-Fi"</string>
<string name="adb_pairing_device_dialog_failed_title" msgid="3426758947882091735">"Penyambungan perangkat gagal"</string>
- <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Pastikan perangkat tersambung ke jaringan yang sama."</string>
- <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Menyambungkan perangkat melalui Wi‑Fi dengan memindai Kode QR"</string>
+ <string name="adb_pairing_device_dialog_failed_msg" msgid="6611097519661997148">"Pastikan perangkat terhubung ke jaringan yang sama."</string>
+ <string name="adb_wireless_qrcode_summary" msgid="8051414549011801917">"Sambungkan perangkat melalui Wi‑Fi dengan memindai Kode QR"</string>
<string name="adb_wireless_verifying_qrcode_text" msgid="6123192424916029207">"Menyambungkan perangkat…"</string>
<string name="adb_qrcode_pairing_device_failed_msg" msgid="6936292092592914132">"Gagal menyambungkan perangkat. Kode QR salah, atau perangkat tidak tersambung ke jaringan yang sama."</string>
<string name="adb_wireless_ip_addr_preference_title" msgid="8335132107715311730">"Alamat IP &amp; Port"</string>
<string name="adb_wireless_qrcode_pairing_title" msgid="1906409667944674707">"Memindai kode QR"</string>
- <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Menyambungkan perangkat melalui Wi‑Fi dengan memindai Kode QR"</string>
+ <string name="adb_wireless_qrcode_pairing_description" msgid="6014121407143607851">"Sambungkan perangkat melalui Wi‑Fi dengan memindai Kode QR"</string>
<string name="adb_wireless_no_network_msg" msgid="2365795244718494658">"Harap sambungkan ke jaringan Wi-Fi"</string>
<string name="keywords_adb_wireless" msgid="6507505581882171240">"adb, debug, dev"</string>
<string name="bugreport_in_power" msgid="8664089072534638709">"Pintasan laporan bug"</string>
diff --git a/packages/SettingsLib/res/values-my/strings.xml b/packages/SettingsLib/res/values-my/strings.xml
index 3729a8352abd..d62d944caf30 100644
--- a/packages/SettingsLib/res/values-my/strings.xml
+++ b/packages/SettingsLib/res/values-my/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP ပြုပြင်ခြင်း မအောင်မြင်ပါ"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"ကွန်ရက်ချိတ်ဆက်မှု အားနည်းသည့်အတွက် ချိတ်ဆက်ထားခြင်း မရှိပါ"</string>
<string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"WiFi ချိတ်ဆက်မှု မအောင်မြင်ပါ"</string>
- <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"စစ်မှန်ကြောင်းအတည်ပြုရန်၌ ပြသနာရှိခြင်း"</string>
+ <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"အထောက်အထားစိစစ်မှု ပြဿနာ"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"ချိတ်ဆက်၍ မရပါ"</string>
<string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\' နှင့် ချိတ်ဆက်၍ မရပါ"</string>
<string name="wifi_check_password_try_again" msgid="8817789642851605628">"စကားဝှက်ကို စစ်ဆေးပြီး ထပ်လုပ်ကြည့်ပါ"</string>
diff --git a/packages/SettingsLib/res/values-nb/strings.xml b/packages/SettingsLib/res/values-nb/strings.xml
index 0e0e7617b06d..d567ee240771 100644
--- a/packages/SettingsLib/res/values-nb/strings.xml
+++ b/packages/SettingsLib/res/values-nb/strings.xml
@@ -34,7 +34,7 @@
<string name="wifi_check_password_try_again" msgid="8817789642851605628">"Sjekk passordet og prøv igjen"</string>
<string name="wifi_not_in_range" msgid="1541760821805777772">"Utenfor område"</string>
<string name="wifi_no_internet_no_reconnect" msgid="821591791066497347">"Kobler ikke til automatisk"</string>
- <string name="wifi_no_internet" msgid="1774198889176926299">"Ingen Internett-tilgang"</string>
+ <string name="wifi_no_internet" msgid="1774198889176926299">"Ingen internettilgang"</string>
<string name="saved_network" msgid="7143698034077223645">"Lagret av <xliff:g id="NAME">%1$s</xliff:g>"</string>
<string name="connected_via_network_scorer" msgid="7665725527352893558">"Automatisk tilkoblet via %1$s"</string>
<string name="connected_via_network_scorer_default" msgid="7973529709744526285">"Automatisk tilkoblet via leverandør av nettverksvurdering"</string>
diff --git a/packages/SettingsLib/res/values-or/strings.xml b/packages/SettingsLib/res/values-or/strings.xml
index d200f502879e..c9bbe71340d8 100644
--- a/packages/SettingsLib/res/values-or/strings.xml
+++ b/packages/SettingsLib/res/values-or/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP କନଫିଗରେଶନ ବିଫଳ ହୋଇଛି"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"ନିମ୍ନ ମାନର ନେଟ୍‌ୱର୍କ କାରଣରୁ ସଂଯୁକ୍ତ ହୋଇନାହିଁ"</string>
<string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"ୱାଇଫାଇ ସଂଯୋଗ ବିଫଳ ହୋଇଛି"</string>
- <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"ସତ୍ୟାପନରେ ସମସ୍ୟା"</string>
+ <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"ପ୍ରମାଣୀକରଣରେ ସମସ୍ୟା"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"ସଂଯୋଗ କରିପାରିବ ନାହିଁ"</string>
<string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"\'<xliff:g id="AP_NAME">%1$s</xliff:g>\' ସହିତ ସଂଯୁକ୍ତ ହୋଇପାରୁନାହିଁ"</string>
<string name="wifi_check_password_try_again" msgid="8817789642851605628">"ପାସ୍‌ୱର୍ଡ ଯାଞ୍ଚ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ"</string>
diff --git a/packages/SettingsLib/res/values-sk/strings.xml b/packages/SettingsLib/res/values-sk/strings.xml
index cc1626c841b6..737c000f8e9d 100644
--- a/packages/SettingsLib/res/values-sk/strings.xml
+++ b/packages/SettingsLib/res/values-sk/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_network_failure" msgid="2660396183242399585">"Zlyhanie konfigurácie adresy IP"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Nepripojené z dôvodu siete nízkej kvality"</string>
<string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"Zlyhanie pripojenia Wi‑Fi"</string>
- <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Problém s overením totožnosti"</string>
+ <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Problém s overením"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"Nedá sa pripojiť"</string>
<string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"K sieti <xliff:g id="AP_NAME">%1$s</xliff:g> sa nedá pripojiť"</string>
<string name="wifi_check_password_try_again" msgid="8817789642851605628">"Skontrolujte heslo a skúste to znova"</string>
diff --git a/packages/SettingsLib/res/values-tl/strings.xml b/packages/SettingsLib/res/values-tl/strings.xml
index 5d4e9752fd93..1a2d5e2d1fa9 100644
--- a/packages/SettingsLib/res/values-tl/strings.xml
+++ b/packages/SettingsLib/res/values-tl/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_network_failure" msgid="2660396183242399585">"Pagkabigo ng Configuration ng IP"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Hindi nakakonekta dahil mababa ang kalidad ng network"</string>
<string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"Pagkabigo ng Koneksyon sa WiFi"</string>
- <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Problema sa pagpapatotoo"</string>
+ <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Problema sa pag-authenticate"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"Hindi makakonekta"</string>
<string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"Hindi makakonekta sa \'<xliff:g id="AP_NAME">%1$s</xliff:g>\'"</string>
<string name="wifi_check_password_try_again" msgid="8817789642851605628">"Suriin ang password at subukang muli"</string>
diff --git a/packages/SettingsLib/res/values-uz/strings.xml b/packages/SettingsLib/res/values-uz/strings.xml
index 2ae55fe9f263..2325efd619a7 100644
--- a/packages/SettingsLib/res/values-uz/strings.xml
+++ b/packages/SettingsLib/res/values-uz/strings.xml
@@ -28,7 +28,7 @@
<string name="wifi_disabled_network_failure" msgid="2660396183242399585">"IP manzilini sozlab bo‘lmadi"</string>
<string name="wifi_disabled_by_recommendation_provider" msgid="1302938248432705534">"Sifatsiz tarmoq sababli ulanib bo‘lmadi"</string>
<string name="wifi_disabled_wifi_failure" msgid="8819554899148331100">"Wi-Fi ulanishini o‘rnatib bo‘lmadi"</string>
- <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Tasdiqdan o‘tishda muammo"</string>
+ <string name="wifi_disabled_password_failure" msgid="6892387079613226738">"Tekshiruvda muammo"</string>
<string name="wifi_cant_connect" msgid="5718417542623056783">"Tarmoqqa ulanilmadi"</string>
<string name="wifi_cant_connect_to_ap" msgid="3099667989279700135">"“<xliff:g id="AP_NAME">%1$s</xliff:g>” nomli tarmoqqa ulanilmadi"</string>
<string name="wifi_check_password_try_again" msgid="8817789642851605628">"Parolni tekshirib, qaytadan urining"</string>
diff --git a/packages/SettingsProvider/OWNERS b/packages/SettingsProvider/OWNERS
index b2ac4f43e845..cf9799c6a026 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/Shell/AndroidManifest.xml b/packages/Shell/AndroidManifest.xml
index 5d6c4c35560c..0fdb282edc23 100644
--- a/packages/Shell/AndroidManifest.xml
+++ b/packages/Shell/AndroidManifest.xml
@@ -334,6 +334,9 @@
<!-- Permission needed for CTS test - TimeManagerTest -->
<uses-permission android:name="android.permission.MANAGE_TIME_AND_ZONE_DETECTION" />
+ <!-- Permission needed for CTS test - CtsHdmiCecHostTestCases -->
+ <uses-permission android:name="android.permission.HDMI_CEC" />
+
<application android:label="@string/app_label"
android:theme="@android:style/Theme.DeviceDefault.DayNight"
android:defaultToDeviceProtectedStorage="true"
diff --git a/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml b/packages/SystemUI/res-keyguard/values-fr-rCA/strings.xml
index 2eafc2faa21a..3e858c2ecf12 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 824ea41811f7..8551fab7281f 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 323fea5a608e..d19f30e49670 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 9e9eb859d0f8..6baa848f02e3 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 5d1b3a180e1b..ad258b21e773 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 cc8b5fe03cda..f6b71e47c7c6 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 9c69703c2934..555b1c0524f1 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 4b9d0f1266f5..6adf66c01b5e 100644
--- a/services/core/Android.bp
+++ b/services/core/Android.bp
@@ -196,7 +196,6 @@ filegroup {
"java/com/android/server/connectivity/KeepaliveTracker.java",
"java/com/android/server/connectivity/LingerMonitor.java",
"java/com/android/server/connectivity/MockableSystemProperties.java",
- "java/com/android/server/connectivity/MultipathPolicyTracker.java",
"java/com/android/server/connectivity/Nat464Xlat.java",
"java/com/android/server/connectivity/NetdEventListenerService.java",
"java/com/android/server/connectivity/NetworkAgentInfo.java",
@@ -211,17 +210,3 @@ filegroup {
"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 651f941be0b1..d09f44fdeb4d 100644
--- a/services/core/java/com/android/server/AlarmManagerService.java
+++ b/services/core/java/com/android/server/AlarmManagerService.java
@@ -3369,7 +3369,9 @@ class AlarmManagerService extends SystemService {
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 2c765bd896fa..fe116d9a507b 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.IpConnectivityLog;
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;
@@ -146,6 +144,7 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
+import android.os.INetworkActivityListener;
import android.os.INetworkManagementService;
import android.os.Looper;
import android.os.Message;
@@ -191,6 +190,8 @@ import com.android.internal.util.LocationPermissionChecker;
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;
@@ -200,7 +201,6 @@ import com.android.server.connectivity.IpConnectivityMetrics;
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;
@@ -441,11 +441,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
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
*/
@@ -660,9 +655,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
final MultinetworkPolicyTracker mMultinetworkPolicyTracker;
@VisibleForTesting
- final MultipathPolicyTracker mMultipathPolicyTracker;
-
- @VisibleForTesting
final Map<IBinder, ConnectivityDiagnosticsCallbackInfo> mConnectivityDiagnosticsCallbacks =
new HashMap<>();
@@ -876,6 +868,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
@VisibleForTesting
public static class Dependencies {
+ public int getCallingUid() {
+ return Binder.getCallingUid();
+ }
+
/**
* Get system properties to use in ConnectivityService.
*/
@@ -1162,8 +1158,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
mContext, mHandler, () -> rematchForAvoidBadWifiUpdate());
mMultinetworkPolicyTracker.start();
- mMultipathPolicyTracker = new MultipathPolicyTracker(mContext, mHandler);
-
mDnsManager = new DnsManager(mContext, mDnsResolver);
registerPrivateDnsSettingsCallbacks();
}
@@ -1376,8 +1370,11 @@ public class ConnectivityService extends IConnectivityManager.Stub
return;
}
final String action = blocked ? "BLOCKED" : "UNBLOCKED";
+ final NetworkRequest satisfiedRequest = nri.getSatisfiedRequest();
+ final int requestId = satisfiedRequest != null
+ ? satisfiedRequest.requestId : nri.mRequests.get(0).requestId;
mNetworkInfoBlockingLogs.log(String.format(
- "%s %d(%d) on netId %d", action, nri.mUid, nri.request.requestId, net.getNetId()));
+ "%s %d(%d) on netId %d", action, nri.mUid, requestId, net.getNetId()));
}
/**
@@ -1408,7 +1405,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public NetworkInfo getActiveNetworkInfo() {
enforceAccessPermission();
- final int uid = Binder.getCallingUid();
+ final int uid = mDeps.getCallingUid();
final NetworkState state = getUnfilteredActiveNetworkState(uid);
filterNetworkStateForUid(state, uid, false);
maybeLogBlockedNetworkInfo(state.networkInfo, uid);
@@ -1418,7 +1415,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public Network getActiveNetwork() {
enforceAccessPermission();
- return getActiveNetworkForUidInternal(Binder.getCallingUid(), false);
+ return getActiveNetworkForUidInternal(mDeps.getCallingUid(), false);
}
@Override
@@ -1458,7 +1455,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Public because it's used by mLockdownTracker.
public NetworkInfo getActiveNetworkInfoUnfiltered() {
enforceAccessPermission();
- final int uid = Binder.getCallingUid();
+ final int uid = mDeps.getCallingUid();
NetworkState state = getUnfilteredActiveNetworkState(uid);
return state.networkInfo;
}
@@ -1474,7 +1471,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public NetworkInfo getNetworkInfo(int networkType) {
enforceAccessPermission();
- final int uid = Binder.getCallingUid();
+ final int uid = mDeps.getCallingUid();
if (getVpnUnderlyingNetworks(uid) != null) {
// A VPN is active, so we may need to return one of its underlying networks. This
// information is not available in LegacyTypeTracker, so we have to get it from
@@ -1519,7 +1516,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public Network getNetworkForType(int networkType) {
enforceAccessPermission();
- final int uid = Binder.getCallingUid();
+ final int uid = mDeps.getCallingUid();
NetworkState state = getFilteredNetworkState(networkType, uid);
if (!isNetworkWithLinkPropertiesBlocked(state.linkProperties, uid, false)) {
return state.network;
@@ -1566,7 +1563,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
result.put(
nai.network,
maybeSanitizeLocationInfoForCaller(
- nc, Binder.getCallingUid(), callingPackageName));
+ nc, mDeps.getCallingUid(), callingPackageName));
}
synchronized (mVpns) {
@@ -1581,7 +1578,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
result.put(
network,
maybeSanitizeLocationInfoForCaller(
- nc, Binder.getCallingUid(), callingPackageName));
+ nc, mDeps.getCallingUid(), callingPackageName));
}
}
}
@@ -1611,7 +1608,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public LinkProperties getActiveLinkProperties() {
enforceAccessPermission();
- final int uid = Binder.getCallingUid();
+ final int uid = mDeps.getCallingUid();
NetworkState state = getUnfilteredActiveNetworkState(uid);
if (state.linkProperties == null) return null;
return linkPropertiesRestrictedForCallerPermissions(state.linkProperties,
@@ -1625,7 +1622,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
final LinkProperties lp = getLinkProperties(nai);
if (lp == null) return null;
return linkPropertiesRestrictedForCallerPermissions(
- lp, Binder.getCallingPid(), Binder.getCallingUid());
+ lp, Binder.getCallingPid(), mDeps.getCallingUid());
}
// TODO - this should be ALL networks
@@ -1635,7 +1632,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
final LinkProperties lp = getLinkProperties(getNetworkAgentInfoForNetwork(network));
if (lp == null) return null;
return linkPropertiesRestrictedForCallerPermissions(
- lp, Binder.getCallingPid(), Binder.getCallingUid());
+ lp, Binder.getCallingPid(), mDeps.getCallingUid());
}
@Nullable
@@ -1657,17 +1654,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
synchronized (nai) {
if (nai.networkCapabilities == null) return null;
return networkCapabilitiesRestrictedForCallerPermissions(
- nai.networkCapabilities, Binder.getCallingPid(), Binder.getCallingUid());
+ nai.networkCapabilities, Binder.getCallingPid(), mDeps.getCallingUid());
}
}
@Override
public NetworkCapabilities getNetworkCapabilities(Network network, String callingPackageName) {
- mAppOpsManager.checkPackage(Binder.getCallingUid(), callingPackageName);
+ mAppOpsManager.checkPackage(mDeps.getCallingUid(), callingPackageName);
enforceAccessPermission();
return maybeSanitizeLocationInfoForCaller(
getNetworkCapabilitiesInternal(network),
- Binder.getCallingUid(), callingPackageName);
+ mDeps.getCallingUid(), callingPackageName);
}
@VisibleForTesting
@@ -1705,16 +1702,17 @@ public class ConnectivityService extends IConnectivityManager.Stub
return newNc;
}
- Binder.withCleanCallingIdentity(
- () -> {
- if (!mLocationPermissionChecker.checkLocationPermission(
- callerPkgName, null /* featureId */, callerUid, null /* message */)) {
- // Caller does not have the requisite location permissions. Reset the
- // owner's UID in the NetworkCapabilities.
- newNc.setOwnerUid(INVALID_UID);
- }
- }
- );
+ final long token = Binder.clearCallingIdentity();
+ try {
+ if (!mLocationPermissionChecker.checkLocationPermission(
+ callerPkgName, null /* featureId */, callerUid, null /* message */)) {
+ // Caller does not have the requisite location permissions. Reset the
+ // owner's UID in the NetworkCapabilities.
+ newNc.setOwnerUid(INVALID_UID);
+ }
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
return newNc;
}
@@ -1755,7 +1753,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
private void restrictBackgroundRequestForCaller(NetworkCapabilities nc) {
- if (!mPermissionMonitor.hasUseBackgroundNetworksPermission(Binder.getCallingUid())) {
+ if (!mPermissionMonitor.hasUseBackgroundNetworksPermission(mDeps.getCallingUid())) {
nc.addCapability(NET_CAPABILITY_FOREGROUND);
}
}
@@ -1794,9 +1792,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
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);
}
};
@@ -1808,7 +1806,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// requestRouteToHost. In Q, GnssLocationProvider is changed to not call requestRouteToHost
// for devices launched with Q and above. However, existing devices upgrading to Q and
// above must continued to be supported for few more releases.
- if (isSystem(Binder.getCallingUid()) && SystemProperties.getInt(
+ if (isSystem(mDeps.getCallingUid()) && SystemProperties.getInt(
"ro.product.first_api_level", 0) > Build.VERSION_CODES.P) {
log("This method exists only for app backwards compatibility"
+ " and must not be called by system services.");
@@ -1874,7 +1872,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
return false;
}
- final int uid = Binder.getCallingUid();
+ final int uid = mDeps.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
LinkProperties lp;
@@ -2294,7 +2292,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
@Override
public void systemReady() {
- if (Binder.getCallingUid() != Process.SYSTEM_UID) {
+ if (mDeps.getCallingUid() != Process.SYSTEM_UID) {
throw new SecurityException("Calling Uid is not system uid.");
}
systemReadyInternal();
@@ -2305,10 +2303,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
@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();
@@ -2327,8 +2328,31 @@ public class ConnectivityService extends IConnectivityManager.Stub
// Create network requests for always-on networks.
mHandler.sendMessage(mHandler.obtainMessage(EVENT_CONFIGURE_ALWAYS_ON_NETWORKS));
+ }
- mHandler.sendMessage(mHandler.obtainMessage(EVENT_SYSTEM_READY));
+ /**
+ * Start listening for default data network activity state changes.
+ */
+ @Override
+ public void registerNetworkActivityListener(@NonNull INetworkActivityListener l) {
+ // TODO: Replace network activity listener registry in ConnectivityManager from NMS to here
+ }
+
+ /**
+ * Stop listening for default data network activity state changes.
+ */
+ @Override
+ public void unregisterNetworkActivityListener(@NonNull INetworkActivityListener l) {
+ // TODO: Replace network activity listener registry in ConnectivityManager from NMS to here
+ }
+
+ /**
+ * Check whether the default network radio is currently active.
+ */
+ @Override
+ public boolean isDefaultNetworkActive() {
+ // TODO: Replace isNetworkActive() in NMS.
+ return false;
}
/**
@@ -2520,7 +2544,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (context.checkCallingOrSelfPermission(android.Manifest.permission.DUMP)
!= PackageManager.PERMISSION_GRANTED) {
pw.println("Permission Denial: can't dump " + tag + " from from pid="
- + Binder.getCallingPid() + ", uid=" + Binder.getCallingUid()
+ + Binder.getCallingPid() + ", uid=" + mDeps.getCallingUid()
+ " due to missing android.permission.DUMP permission");
return false;
} else {
@@ -2603,7 +2627,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
dumpAvoidBadWifiSettings(pw);
pw.println();
- mMultipathPolicyTracker.dump(pw);
if (ArrayUtils.contains(args, SHORT_ARG) == false) {
pw.println();
@@ -2701,7 +2724,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
* Return an array of all current NetworkRequest sorted by request id.
*/
@VisibleForTesting
- protected NetworkRequestInfo[] requestsSortedById() {
+ NetworkRequestInfo[] requestsSortedById() {
NetworkRequestInfo[] requests = new NetworkRequestInfo[0];
requests = mNetworkRequests.values().toArray(requests);
// Sort the array based off the NRI containing the min requestId in its requests.
@@ -3551,30 +3574,58 @@ public class ConnectivityService extends IConnectivityManager.Stub
return false;
}
for (NetworkRequestInfo nri : mNetworkRequests.values()) {
- if (reason == UnneededFor.LINGER && nri.request.isBackgroundRequest()) {
+ if (reason == UnneededFor.LINGER
+ && !nri.isMultilayerRequest()
+ && nri.mRequests.get(0).isBackgroundRequest()) {
// Background requests don't affect lingering.
continue;
}
- // If this Network is already the highest scoring Network for a request, or if
- // there is hope for it to become one if it validated, then it is needed.
- if (nri.request.isRequest() && nai.satisfies(nri.request) &&
- (nai.isSatisfyingRequest(nri.request.requestId) ||
- // Note that this catches two important cases:
- // 1. Unvalidated cellular will not be reaped when unvalidated WiFi
- // is currently satisfying the request. This is desirable when
- // cellular ends up validating but WiFi does not.
- // 2. Unvalidated WiFi will not be reaped when validated cellular
- // is currently satisfying the request. This is desirable when
- // WiFi ends up validating and out scoring cellular.
- nri.mSatisfier.getCurrentScore()
- < nai.getCurrentScoreAsValidated())) {
+ if (isNetworkPotentialSatisfier(nai, nri)) {
return false;
}
}
return true;
}
+ private boolean isNetworkPotentialSatisfier(
+ @NonNull final NetworkAgentInfo candidate, @NonNull final NetworkRequestInfo nri) {
+ // listen requests won't keep up a network satisfying it. If this is not a multilayer
+ // request, we can return immediately. For multilayer requests, we have to check to see if
+ // any of the multilayer requests may have a potential satisfier.
+ if (!nri.isMultilayerRequest() && nri.mRequests.get(0).isListen()) {
+ return false;
+ }
+ for (final NetworkRequest req : nri.mRequests) {
+ // As non-multilayer listen requests have already returned, the below would only happen
+ // for a multilayer request therefore continue to the next request if available.
+ if (req.isListen()) {
+ continue;
+ }
+ // If this Network is already the highest scoring Network for a request, or if
+ // there is hope for it to become one if it validated, then it is needed.
+ if (candidate.satisfies(req)) {
+ // As soon as a network is found that satisfies a request, return. Specifically for
+ // multilayer requests, returning as soon as a NetworkAgentInfo satisfies a request
+ // is important so as to not evaluate lower priority requests further in
+ // nri.mRequests.
+ final boolean isNetworkNeeded = candidate.isSatisfyingRequest(req.requestId)
+ // Note that this catches two important cases:
+ // 1. Unvalidated cellular will not be reaped when unvalidated WiFi
+ // is currently satisfying the request. This is desirable when
+ // cellular ends up validating but WiFi does not.
+ // 2. Unvalidated WiFi will not be reaped when validated cellular
+ // is currently satisfying the request. This is desirable when
+ // WiFi ends up validating and out scoring cellular.
+ || nri.mSatisfier.getCurrentScore()
+ < candidate.getCurrentScoreAsValidated();
+ return isNetworkNeeded;
+ }
+ }
+
+ return false;
+ }
+
private NetworkRequestInfo getNriForAppRequest(
NetworkRequest request, int callingUid, String requestedOperation) {
final NetworkRequestInfo nri = mNetworkRequests.get(request);
@@ -3871,8 +3922,12 @@ public class ConnectivityService extends IConnectivityManager.Stub
new CaptivePortal(new CaptivePortalImpl(network).asBinder()));
appIntent.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT | Intent.FLAG_ACTIVITY_NEW_TASK);
- Binder.withCleanCallingIdentity(() ->
- mContext.startActivityAsUser(appIntent, UserHandle.CURRENT));
+ final long token = Binder.clearCallingIdentity();
+ try {
+ mContext.startActivityAsUser(appIntent, UserHandle.CURRENT);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
private class CaptivePortalImpl extends ICaptivePortal.Stub {
@@ -3900,7 +3955,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (request == CaptivePortal.APP_REQUEST_REEVALUATION_REQUIRED) {
checkNetworkStackPermission();
- nm.forceReevaluation(Binder.getCallingUid());
+ nm.forceReevaluation(mDeps.getCallingUid());
}
}
@@ -4119,11 +4174,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
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();
}
@@ -4227,10 +4284,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
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;
@@ -4367,7 +4420,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
public void reportNetworkConnectivity(Network network, boolean hasConnectivity) {
enforceAccessPermission();
enforceInternetPermission();
- final int uid = Binder.getCallingUid();
+ final int uid = mDeps.getCallingUid();
final int connectivityInfo = encodeBool(hasConnectivity);
// Handle ConnectivityDiagnostics event before attempting to revalidate the network. This
@@ -4437,13 +4490,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (globalProxy != null) return globalProxy;
if (network == null) {
// Get the network associated with the calling UID.
- final Network activeNetwork = getActiveNetworkForUidInternal(Binder.getCallingUid(),
+ final Network activeNetwork = getActiveNetworkForUidInternal(mDeps.getCallingUid(),
true);
if (activeNetwork == null) {
return null;
}
return getLinkPropertiesProxyInfo(activeNetwork);
- } else if (mDeps.queryUserAccess(Binder.getCallingUid(), network.getNetId())) {
+ } else if (mDeps.queryUserAccess(mDeps.getCallingUid(), network.getNetId())) {
// Don't call getLinkProperties() as it requires ACCESS_NETWORK_STATE permission, which
// caller may not have.
return getLinkPropertiesProxyInfo(network);
@@ -4612,7 +4665,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
@Override
public ParcelFileDescriptor establishVpn(VpnConfig config) {
- int user = UserHandle.getUserId(Binder.getCallingUid());
+ int user = UserHandle.getUserId(mDeps.getCallingUid());
synchronized (mVpns) {
throwIfLockdownEnabled();
return mVpns.get(user).establish(config);
@@ -4633,7 +4686,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
@Override
public boolean provisionVpnProfile(@NonNull VpnProfile profile, @NonNull String packageName) {
- final int user = UserHandle.getUserId(Binder.getCallingUid());
+ final int user = UserHandle.getUserId(mDeps.getCallingUid());
synchronized (mVpns) {
return mVpns.get(user).provisionVpnProfile(packageName, profile, mKeyStore);
}
@@ -4651,7 +4704,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
@Override
public void deleteVpnProfile(@NonNull String packageName) {
- final int user = UserHandle.getUserId(Binder.getCallingUid());
+ final int user = UserHandle.getUserId(mDeps.getCallingUid());
synchronized (mVpns) {
mVpns.get(user).deleteVpnProfile(packageName, mKeyStore);
}
@@ -4668,7 +4721,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
@Override
public void startVpnProfile(@NonNull String packageName) {
- final int user = UserHandle.getUserId(Binder.getCallingUid());
+ final int user = UserHandle.getUserId(mDeps.getCallingUid());
synchronized (mVpns) {
throwIfLockdownEnabled();
mVpns.get(user).startVpnProfile(packageName, mKeyStore);
@@ -4685,7 +4738,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
@Override
public void stopVpnProfile(@NonNull String packageName) {
- final int user = UserHandle.getUserId(Binder.getCallingUid());
+ final int user = UserHandle.getUserId(mDeps.getCallingUid());
synchronized (mVpns) {
mVpns.get(user).stopVpnProfile(packageName);
}
@@ -4697,7 +4750,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
*/
@Override
public void startLegacyVpn(VpnProfile profile) {
- int user = UserHandle.getUserId(Binder.getCallingUid());
+ int user = UserHandle.getUserId(mDeps.getCallingUid());
final LinkProperties egress = getActiveLinkProperties();
if (egress == null) {
throw new IllegalStateException("Missing active network connection");
@@ -4846,7 +4899,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public boolean updateLockdownVpn() {
- if (Binder.getCallingUid() != Process.SYSTEM_UID) {
+ if (mDeps.getCallingUid() != Process.SYSTEM_UID) {
logw("Lockdown VPN only available to AID_SYSTEM");
return false;
}
@@ -4868,7 +4921,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
setLockdownTracker(null);
return true;
}
- int user = UserHandle.getUserId(Binder.getCallingUid());
+ int user = UserHandle.getUserId(mDeps.getCallingUid());
Vpn vpn = mVpns.get(user);
if (vpn == null) {
logw("VPN for user " + user + " not ready yet. Skipping lockdown");
@@ -5433,7 +5486,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
messenger = null;
mBinder = null;
mPid = getCallingPid();
- mUid = getCallingUid();
+ mUid = mDeps.getCallingUid();
enforceRequestCountLimit();
}
@@ -5445,7 +5498,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
ensureAllNetworkRequestsHaveType(mRequests);
mBinder = binder;
mPid = getCallingPid();
- mUid = getCallingUid();
+ mUid = mDeps.getCallingUid();
mPendingIntent = null;
enforceRequestCountLimit();
@@ -5460,6 +5513,10 @@ public class ConnectivityService extends IConnectivityManager.Stub
this(r, null);
}
+ boolean isMultilayerRequest() {
+ return mRequests.size() > 1;
+ }
+
private List<NetworkRequest> initializeRequests(NetworkRequest r) {
final ArrayList<NetworkRequest> tempRequests = new ArrayList<>();
tempRequests.add(new NetworkRequest(r));
@@ -5501,7 +5558,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
public void binderDied() {
log("ConnectivityService NetworkRequestInfo binderDied(" +
mRequests + ", " + mBinder + ")");
- releaseNetworkRequest(mRequests);
+ releaseNetworkRequests(mRequests);
}
@Override
@@ -5534,13 +5591,15 @@ public class ConnectivityService extends IConnectivityManager.Stub
mAppOpsManager.checkPackage(callerUid, callerPackageName);
}
- private ArrayList<Integer> getSignalStrengthThresholds(NetworkAgentInfo nai) {
+ private ArrayList<Integer> getSignalStrengthThresholds(@NonNull final NetworkAgentInfo nai) {
final SortedSet<Integer> thresholds = new TreeSet<>();
synchronized (nai) {
- for (NetworkRequestInfo nri : mNetworkRequests.values()) {
- if (nri.request.networkCapabilities.hasSignalStrength() &&
- nai.satisfiesImmutableCapabilitiesOf(nri.request)) {
- thresholds.add(nri.request.networkCapabilities.getSignalStrength());
+ for (final NetworkRequestInfo nri : mNetworkRequests.values()) {
+ for (final NetworkRequest req : nri.mRequests) {
+ if (req.networkCapabilities.hasSignalStrength()
+ && nai.satisfiesImmutableCapabilitiesOf(req)) {
+ thresholds.add(req.networkCapabilities.getSignalStrength());
+ }
}
}
}
@@ -5588,7 +5647,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
private boolean checkUnsupportedStartingFrom(int version, String callingPackageName) {
- final UserHandle user = UserHandle.getUserHandleForUid(Binder.getCallingUid());
+ final UserHandle user = UserHandle.getUserHandleForUid(mDeps.getCallingUid());
final PackageManager pm =
mContext.createContextAsUser(user, 0 /* flags */).getPackageManager();
try {
@@ -5608,7 +5667,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
throw new SecurityException("Insufficient permissions to specify legacy type");
}
}
- final int callingUid = Binder.getCallingUid();
+ final int callingUid = mDeps.getCallingUid();
final NetworkRequest.Type type = (networkCapabilities == null)
? NetworkRequest.Type.TRACK_DEFAULT
: NetworkRequest.Type.REQUEST;
@@ -5678,7 +5737,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (nai != null) {
nai.asyncChannel.sendMessage(android.net.NetworkAgent.CMD_REQUEST_BANDWIDTH_UPDATE);
synchronized (mBandwidthRequests) {
- final int uid = Binder.getCallingUid();
+ final int uid = mDeps.getCallingUid();
Integer uidReqs = mBandwidthRequests.get(uid);
if (uidReqs == null) {
uidReqs = 0;
@@ -5695,7 +5754,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
private void enforceMeteredApnPolicy(NetworkCapabilities networkCapabilities) {
- final int uid = Binder.getCallingUid();
+ final int uid = mDeps.getCallingUid();
if (isSystem(uid)) {
// Exemption for system uid.
return;
@@ -5715,7 +5774,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
PendingIntent operation, @NonNull String callingPackageName,
@Nullable String callingAttributionTag) {
Objects.requireNonNull(operation, "PendingIntent cannot be null.");
- final int callingUid = Binder.getCallingUid();
+ final int callingUid = mDeps.getCallingUid();
networkCapabilities = new NetworkCapabilities(networkCapabilities);
enforceNetworkRequestPermissions(networkCapabilities, callingPackageName,
callingAttributionTag);
@@ -5774,7 +5833,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public NetworkRequest listenForNetwork(NetworkCapabilities networkCapabilities,
Messenger messenger, IBinder binder, @NonNull String callingPackageName) {
- final int callingUid = Binder.getCallingUid();
+ final int callingUid = mDeps.getCallingUid();
if (!hasWifiNetworkListenPermission(networkCapabilities)) {
enforceAccessPermission();
}
@@ -5804,7 +5863,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
public void pendingListenForNetwork(NetworkCapabilities networkCapabilities,
PendingIntent operation, @NonNull String callingPackageName) {
Objects.requireNonNull(operation, "PendingIntent cannot be null.");
- final int callingUid = Binder.getCallingUid();
+ final int callingUid = mDeps.getCallingUid();
if (!hasWifiNetworkListenPermission(networkCapabilities)) {
enforceAccessPermission();
}
@@ -5827,7 +5886,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
return mNextNetworkProviderId.getAndIncrement();
}
- private void releaseNetworkRequest(List<NetworkRequest> networkRequests) {
+ private void releaseNetworkRequests(List<NetworkRequest> networkRequests) {
for (int i = 0; i < networkRequests.size(); i++) {
releaseNetworkRequest(networkRequests.get(i));
}
@@ -5905,7 +5964,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
} else {
enforceNetworkFactoryPermission();
}
- mHandler.post(() -> handleReleaseNetworkRequest(request, Binder.getCallingUid(), true));
+ mHandler.post(() -> handleReleaseNetworkRequest(request, mDeps.getCallingUid(), true));
}
// NOTE: Accessed on multiple threads, must be synchronized on itself.
@@ -5999,7 +6058,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
enforceNetworkFactoryPermission();
}
- final int uid = Binder.getCallingUid();
+ final int uid = mDeps.getCallingUid();
final long token = Binder.clearCallingIdentity();
try {
return registerNetworkAgentInternal(messenger, networkInfo, linkProperties,
@@ -7653,7 +7712,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public boolean addVpnAddress(String address, int prefixLength) {
- int user = UserHandle.getUserId(Binder.getCallingUid());
+ int user = UserHandle.getUserId(mDeps.getCallingUid());
synchronized (mVpns) {
throwIfLockdownEnabled();
return mVpns.get(user).addAddress(address, prefixLength);
@@ -7662,7 +7721,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public boolean removeVpnAddress(String address, int prefixLength) {
- int user = UserHandle.getUserId(Binder.getCallingUid());
+ int user = UserHandle.getUserId(mDeps.getCallingUid());
synchronized (mVpns) {
throwIfLockdownEnabled();
return mVpns.get(user).removeAddress(address, prefixLength);
@@ -7671,7 +7730,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@Override
public boolean setUnderlyingNetworksForVpn(Network[] networks) {
- int user = UserHandle.getUserId(Binder.getCallingUid());
+ int user = UserHandle.getUserId(mDeps.getCallingUid());
final boolean success;
synchronized (mVpns) {
throwIfLockdownEnabled();
@@ -7759,10 +7818,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
final int userId = UserHandle.getCallingUserId();
- Binder.withCleanCallingIdentity(() -> {
+ final long token = Binder.clearCallingIdentity();
+ try {
final IpMemoryStore ipMemoryStore = IpMemoryStore.getMemoryStore(mContext);
ipMemoryStore.factoryReset();
- });
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
// Turn airplane mode off
setAirplaneMode(false);
@@ -7898,7 +7960,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
@GuardedBy("mVpns")
private Vpn getVpnIfOwner() {
- return getVpnIfOwner(Binder.getCallingUid());
+ return getVpnIfOwner(mDeps.getCallingUid());
}
@GuardedBy("mVpns")
@@ -8376,7 +8438,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
throw new IllegalArgumentException("ConnectivityManager.TYPE_* are deprecated."
+ " Please use NetworkCapabilities instead.");
}
- final int callingUid = Binder.getCallingUid();
+ final int callingUid = mDeps.getCallingUid();
mAppOpsManager.checkPackage(callingUid, callingPackageName);
// This NetworkCapabilities is only used for matching to Networks. Clear out its owner uid
@@ -8411,7 +8473,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
mConnectivityDiagnosticsHandler.obtainMessage(
ConnectivityDiagnosticsHandler
.EVENT_UNREGISTER_CONNECTIVITY_DIAGNOSTICS_CALLBACK,
- Binder.getCallingUid(),
+ mDeps.getCallingUid(),
0,
callback));
}
@@ -8427,7 +8489,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
}
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
- if (nai == null || nai.creatorUid != Binder.getCallingUid()) {
+ if (nai == null || nai.creatorUid != mDeps.getCallingUid()) {
throw new SecurityException("Data Stall simulation is only possible for network "
+ "creators");
}
diff --git a/services/core/java/com/android/server/NetworkManagementService.java b/services/core/java/com/android/server/NetworkManagementService.java
index 636da6f34abc..1ea4a89a761f 100644
--- a/services/core/java/com/android/server/NetworkManagementService.java
+++ b/services/core/java/com/android/server/NetworkManagementService.java
@@ -187,10 +187,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
/** 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 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
* 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 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
}
}
- 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 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
}
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 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
timestampNanos = timestamp;
}
mDaemonHandler.post(() ->
- notifyInterfaceClassActivity(label, isActive, timestampNanos, uid, false));
+ notifyInterfaceClassActivity(label, isActive, timestampNanos, uid));
}
@Override
@@ -1157,7 +1141,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
mNetworkActive = false;
}
mDaemonHandler.post(() -> notifyInterfaceClassActivity(type, true,
- SystemClock.elapsedRealtimeNanos(), -1, false));
+ SystemClock.elapsedRealtimeNanos(), -1));
}
}
@@ -1181,7 +1165,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
}
mActiveIdleTimers.remove(iface);
mDaemonHandler.post(() -> notifyInterfaceClassActivity(params.type, false,
- SystemClock.elapsedRealtimeNanos(), -1, false));
+ SystemClock.elapsedRealtimeNanos(), -1));
}
}
@@ -1304,14 +1288,14 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
}
}
- 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,17 +1305,17 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
Trace.traceBegin(Trace.TRACE_TAG_NETWORK, "inetd bandwidth");
try {
- if (denylist) {
+ if (allowlist) {
if (enable) {
- mNetdService.bandwidthAddNaughtyApp(uid);
+ mNetdService.bandwidthAddNiceApp(uid);
} else {
- mNetdService.bandwidthRemoveNaughtyApp(uid);
+ mNetdService.bandwidthRemoveNiceApp(uid);
}
} else {
if (enable) {
- mNetdService.bandwidthAddNiceApp(uid);
+ mNetdService.bandwidthAddNaughtyApp(uid);
} else {
- mNetdService.bandwidthRemoveNiceApp(uid);
+ mNetdService.bandwidthRemoveNaughtyApp(uid);
}
}
synchronized (mRulesLock) {
@@ -1350,13 +1334,13 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
}
@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 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
} else {
ruleName = "deny";
}
- } else { // Denylist mode
+ } else { // Deny mode
if (rule == FIREWALL_RULE_DENY) {
ruleName = "deny";
} else {
@@ -1866,8 +1850,8 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
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 @@ public class NetworkManagementService extends INetworkManagementService.Stub {
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 4a1820a8e538..d90750548114 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.Uri;
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.AsyncChannel;
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/TestNetworkService.java b/services/core/java/com/android/server/TestNetworkService.java
index 655d8abf3e84..e8687e57a07b 100644
--- a/services/core/java/com/android/server/TestNetworkService.java
+++ b/services/core/java/com/android/server/TestNetworkService.java
@@ -107,23 +107,23 @@ class TestNetworkService extends ITestNetworkManager.Stub {
String ifacePrefix = isTun ? TEST_TUN_PREFIX : TEST_TAP_PREFIX;
String iface = ifacePrefix + sTestTunIndex.getAndIncrement();
- return Binder.withCleanCallingIdentity(
- () -> {
- try {
- ParcelFileDescriptor tunIntf =
- ParcelFileDescriptor.adoptFd(jniCreateTunTap(isTun, iface));
- for (LinkAddress addr : linkAddrs) {
- mNetd.interfaceAddAddress(
- iface,
- addr.getAddress().getHostAddress(),
- addr.getPrefixLength());
- }
-
- return new TestNetworkInterface(tunIntf, iface);
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- });
+ final long token = Binder.clearCallingIdentity();
+ try {
+ ParcelFileDescriptor tunIntf =
+ ParcelFileDescriptor.adoptFd(jniCreateTunTap(isTun, iface));
+ for (LinkAddress addr : linkAddrs) {
+ mNetd.interfaceAddAddress(
+ iface,
+ addr.getAddress().getHostAddress(),
+ addr.getPrefixLength());
+ }
+
+ return new TestNetworkInterface(tunIntf, iface);
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
}
/**
@@ -317,7 +317,12 @@ class TestNetworkService extends ITestNetworkManager.Stub {
try {
// This requires NETWORK_STACK privileges.
- Binder.withCleanCallingIdentity(() -> mNMS.setInterfaceUp(iface));
+ final long token = Binder.clearCallingIdentity();
+ try {
+ mNMS.setInterfaceUp(iface);
+ } finally {
+ Binder.restoreCallingIdentity(token);
+ }
// Synchronize all accesses to mTestNetworkTracker to prevent the case where:
// 1. TestNetworkAgent successfully binds to death of binder
diff --git a/services/core/java/com/android/server/VcnManagementService.java b/services/core/java/com/android/server/VcnManagementService.java
index 165b6a1b08f1..74e38510770b 100644
--- a/services/core/java/com/android/server/VcnManagementService.java
+++ b/services/core/java/com/android/server/VcnManagementService.java
@@ -25,24 +25,44 @@ import android.net.NetworkProvider;
import android.net.NetworkRequest;
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 ^
* | |
* | +-------------------------------+
@@ -54,19 +74,19 @@ import com.android.internal.annotations.VisibleForTesting.Visibility;
* | 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 |
@@ -92,20 +112,72 @@ public class VcnManagementService extends IVcnManagementService.Stub {
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.
@@ -130,16 +202,81 @@ public class VcnManagementService extends IVcnManagementService.Stub {
}
return mHandlerThread.getLooper();
}
+
+ /**
+ * Retrieves the caller's UID
+ *
+ * <p>This call MUST be made before calling {@link Binder#clearCallingIdentity}, otherwise
+ * this will not work properly.
+ *
+ * @return
+ */
+ 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);
}
+ private void enforcePrimaryUser() {
+ final int uid = mDeps.getBinderCallingUid();
+ if (uid == Process.SYSTEM_UID) {
+ throw new IllegalStateException(
+ "Calling identity was System Server. Was Binder calling identity cleared?");
+ }
+
+ if (!UserHandle.getUserHandleForUid(uid).isSystem()) {
+ throw new SecurityException(
+ "VcnManagementService can only be used by callers running as the primary user");
+ }
+ }
+
+ private void enforceCallingUserAndCarrierPrivilege(ParcelUuid subscriptionGroup) {
+ // Only apps running in the primary (system) user are allowed to configure the VCN. This is
+ // in line with Telephony's behavior with regards to binding to a Carrier App provided
+ // CarrierConfigService.
+ enforcePrimaryUser();
+
+ // TODO (b/172619301): Check based on events propagated from CarrierPrivilegesTracker
+ final SubscriptionManager subMgr = mContext.getSystemService(SubscriptionManager.class);
+ final List<SubscriptionInfo> subscriptionInfos = new ArrayList<>();
+ Binder.withCleanCallingIdentity(
+ () -> {
+ subscriptionInfos.addAll(subMgr.getSubscriptionsInGroup(subscriptionGroup));
+ });
+
+ final TelephonyManager telMgr = mContext.getSystemService(TelephonyManager.class);
+ for (SubscriptionInfo info : subscriptionInfos) {
+ // Check subscription is active first; much cheaper/faster check, and an app (currently)
+ // cannot be carrier privileged for inactive subscriptions.
+ if (subMgr.isValidSlotIndex(info.getSimSlotIndex())
+ && telMgr.hasCarrierPrivileges(info.getSubscriptionId())) {
+ // TODO (b/173717728): Allow configuration for inactive, but manageable
+ // subscriptions.
+ // TODO (b/173718661): Check for whole subscription groups at a time.
+ return;
+ }
+ }
+
+ throw new SecurityException(
+ "Carrier privilege required for subscription group to set VCN Config");
+ }
+
/**
* Sets a VCN config for a given subscription group.
*
@@ -150,7 +287,17 @@ public class VcnManagementService extends IVcnManagementService.Stub {
requireNonNull(subscriptionGroup, "subscriptionGroup was null");
requireNonNull(config, "config was null");
- // TODO: Store VCN configuration, trigger startup as necessary
+ enforceCallingUserAndCarrierPrivilege(subscriptionGroup);
+
+ synchronized (mLock) {
+ mConfigs.put(subscriptionGroup, config);
+
+ // 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
}
/**
@@ -162,7 +309,40 @@ public class VcnManagementService extends IVcnManagementService.Stub {
public void clearVcnConfig(@NonNull ParcelUuid subscriptionGroup) {
requireNonNull(subscriptionGroup, "subscriptionGroup was null");
- // TODO: Clear VCN configuration, trigger teardown as necessary
+ enforceCallingUserAndCarrierPrivilege(subscriptionGroup);
+
+ synchronized (mLock) {
+ mConfigs.remove(subscriptionGroup);
+
+ // 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 074d3fe10816..26f5c4ca1e80 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.ContentResolver;
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 android.util.PrintWriterPrinter;
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 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 @@ import java.util.concurrent.atomic.AtomicBoolean;
}
/*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 @@ import java.util.concurrent.atomic.AtomicBoolean;
* 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;
- }
- 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);
+ /*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);
}
- 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;
}
+ /**
+ * Returns the device currently requested for communication use case.
+ * @return AudioDeviceInfo the requested device for communication.
+ */
+ AudioDeviceInfo getDeviceForCommunication() {
+ synchronized (mDeviceStateLock) {
+ 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) {
- return (mForcedUseForCommExt == AudioSystem.FORCE_SPEAKER);
+ AudioDeviceAttributes device = requestedCommunicationDevice();
+ return device != null
+ && device.getType()
+ == AudioDeviceInfo.TYPE_BLUETOOTH_SCO;
}
}
@@ -346,7 +481,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
}
}
-
/*package*/ void postBluetoothA2dpDeviceConnectionStateSuppressNoisyIntent(
@NonNull BluetoothDevice device, @AudioService.BtProfileConnectionState int state,
int profile, boolean suppressNoisyIntent, int a2dpVolume) {
@@ -429,42 +563,32 @@ import java.util.concurrent.atomic.AtomicBoolean;
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() {
+ /**
+ * Current Bluetooth SCO audio active state indicated by BtHelper via setBluetoothScoOn().
+ */
+ private boolean mBluetoothScoOn;
+
+ /*package*/ void setBluetoothScoOn(boolean on, String eventSource) {
+ if (AudioService.DEBUG_COMM_RTE) {
+ Log.v(TAG, "setBluetoothScoOn: " + on + " " + eventSource);
+ }
synchronized (mDeviceStateLock) {
- return mForcedUseForCommExt == AudioSystem.FORCE_BT_SCO;
+ mBluetoothScoOn = on;
+ sendLMsgNoDelay(MSG_L_UPDATE_COMMUNICATION_ROUTE, SENDMSG_QUEUE, eventSource);
}
}
- /*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);
- }
- // Un-mute ringtone stream volume
- mAudioService.postUpdateRingerModeServiceInt();
+ /**
+ * 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 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 setPreferredDevicesForStrategySync(int strategy,
+ @NonNull List<AudioDeviceAttributes> devices) {
+ return mDeviceInventory.setPreferredDevicesForStrategySync(strategy, devices);
+ }
+
+ /*package*/ void postSetPreferredDevicesForStrategy(int strategy,
+ @NonNull List<AudioDeviceAttributes> devices) {
+ sendILMsgNoDelay(MSG_IL_SET_PREF_DEVICES_FOR_STRATEGY, SENDMSG_REPLACE, strategy, devices);
+ }
+
+ /*package*/ int removePreferredDevicesForStrategySync(int strategy) {
+ return mDeviceInventory.removePreferredDevicesForStrategySync(strategy);
+ }
+
+ /*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*/ int setPreferredDeviceForStrategySync(int strategy,
- @NonNull AudioDeviceAttributes device) {
- return mDeviceInventory.setPreferredDeviceForStrategySync(strategy, device);
+ /*package*/ void registerCapturePresetDevicesRoleDispatcher(
+ @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) {
+ mDeviceInventory.registerCapturePresetDevicesRoleDispatcher(dispatcher);
}
- /*package*/ int removePreferredDeviceForStrategySync(int strategy) {
- return mDeviceInventory.removePreferredDeviceForStrategySync(strategy);
+ /*package*/ void unregisterCapturePresetDevicesRoleDispatcher(
+ @NonNull ICapturePresetDevicesRoleDispatcher dispatcher) {
+ mDeviceInventory.unregisterCapturePresetDevicesRoleDispatcher(dispatcher);
}
- /*package*/ void registerStrategyPreferredDeviceDispatcher(
- @NonNull IStrategyPreferredDeviceDispatcher dispatcher) {
- mDeviceInventory.registerStrategyPreferredDeviceDispatcher(dispatcher);
+ /*package*/ void registerCommunicationDeviceDispatcher(
+ @NonNull ICommunicationDeviceDispatcher dispatcher) {
+ mCommDevDispatchers.register(dispatcher);
}
- /*package*/ void unregisterStrategyPreferredDeviceDispatcher(
- @NonNull IStrategyPreferredDeviceDispatcher dispatcher) {
- mDeviceInventory.unregisterStrategyPreferredDeviceDispatcher(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 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 postSaveSetPreferredDevicesForStrategy(int strategy,
+ List<AudioDeviceAttributes> devices)
+ {
+ sendILMsgNoDelay(MSG_IL_SAVE_PREF_DEVICES_FOR_STRATEGY, SENDMSG_QUEUE, strategy, devices);
}
- /*package*/ void postSaveSetPreferredDeviceForStrategy(int strategy,
- AudioDeviceAttributes device)
- {
- sendILMsgNoDelay(MSG_IL_SAVE_PREF_DEVICE_FOR_STRATEGY, SENDMSG_QUEUE, strategy, device);
+ /*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 postSaveRemovePreferredDeviceForStrategy(int strategy) {
- sendIMsgNoDelay(MSG_I_SAVE_REMOVE_PREF_DEVICE_FOR_STRATEGY, SENDMSG_QUEUE, strategy);
+ /*package*/ void postSaveClearPreferredDevicesForCapturePreset(int capturePreset) {
+ sendIMsgNoDelay(
+ MSG_I_SAVE_CLEAR_PREF_DEVICES_FOR_CAPTURE_PRESET, SENDMSG_QUEUE, capturePreset);
}
//---------------------------------------------------------------------
@@ -789,15 +1003,17 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 @@ import java.util.concurrent.atomic.AtomicBoolean;
.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 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 List<AudioDeviceAttributes> devices =
+ (List<AudioDeviceAttributes>) msg.obj;
+ mDeviceInventory.onSaveSetPreferredDevices(strategy, devices);
+ } break;
+ case MSG_I_SAVE_REMOVE_PREF_DEVICES_FOR_STRATEGY: {
final int strategy = msg.arg1;
- final AudioDeviceAttributes device = (AudioDeviceAttributes) msg.obj;
- mDeviceInventory.onSaveSetPreferredDevice(strategy, device);
+ 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_SAVE_REMOVE_PREF_DEVICE_FOR_STRATEGY: {
+ case MSG_I_REMOVE_PREF_DEVICES_FOR_STRATEGY: {
final int strategy = msg.arg1;
- mDeviceInventory.onSaveRemovePreferredDevice(strategy);
+ 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 @@ import java.util.concurrent.atomic.AtomicBoolean;
// 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_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_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_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 @@ import java.util.concurrent.atomic.AtomicBoolean;
}
}
- 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 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 @@ import java.util.concurrent.atomic.AtomicBoolean;
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 @@ import java.util.concurrent.atomic.AtomicBoolean;
}
@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 02a846e3dc82..82586b8f9b23 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.AudioPort;
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.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashMap;
+import java.util.List;
import java.util.Set;
/**
@@ -137,7 +138,12 @@ public class AudioDeviceInventory {
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 @@ public class AudioDeviceInventory {
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 @@ public class AudioDeviceInventory {
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 @@ public class AudioDeviceInventory {
}
}
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 @@ public class AudioDeviceInventory {
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 @@ public class AudioDeviceInventory {
}
}
- 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 a06f9ddcfc37..024dca7e23c6 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.IAudioFocusDispatcher;
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.Objects;
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 @@ public class AudioService extends IAudioService.Stub
/** 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 @@ public class AudioService extends IAudioService.Stub
///////////////////////////////////////////////////////////////////////////
// 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 @@ public class AudioService extends IAudioService.Stub
}
/** @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.registerStrategyPreferredDevicesDispatcher(dispatcher);
+ }
+
+ /** @see AudioManager#removeOnPreferredDevicesForStrategyChangedListener(
+ * AudioManager.OnPreferredDevicesForStrategyChangedListener)
+ */
+ public void unregisterStrategyPreferredDevicesDispatcher(
+ @Nullable IStrategyPreferredDevicesDispatcher dispatcher) {
if (dispatcher == null) {
return;
}
enforceModifyAudioRoutingPermission();
- mDeviceBroker.registerStrategyPreferredDeviceDispatcher(dispatcher);
+ mDeviceBroker.unregisterStrategyPreferredDevicesDispatcher(dispatcher);
}
- /** @see AudioManager#removeOnPreferredDeviceForStrategyChangedListener(AudioManager.OnPreferredDeviceForStrategyChangedListener) */
- public void unregisterStrategyPreferredDeviceDispatcher(
- @Nullable IStrategyPreferredDeviceDispatcher 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.unregisterStrategyPreferredDeviceDispatcher(dispatcher);
+ mDeviceBroker.unregisterCapturePresetDevicesRoleDispatcher(dispatcher);
}
/** @see AudioManager#getDevicesForAttributes(AudioAttributes) */
@@ -3585,7 +3693,7 @@ public class AudioService extends IAudioService.Stub
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 @@ public class AudioService extends IAudioService.Stub
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 @@ public class AudioService extends IAudioService.Stub
// 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 @@ public class AudioService extends IAudioService.Stub
.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 @@ public class AudioService extends IAudioService.Stub
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 @@ public class AudioService extends IAudioService.Stub
// Only enable calls from system components
if (UserHandle.getCallingAppId() >= FIRST_APPLICATION_UID) {
- mDeviceBroker.setBluetoothScoOnByApp(on);
+ mBtScoOnByApp = on;
return;
}
@@ -4233,7 +4447,7 @@ public class AudioService extends IAudioService.Stub
* 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 @@ public class AudioService extends IAudioService.Stub
.set(MediaMetrics.Property.SCO_AUDIO_MODE,
BtHelper.scoAudioModeToString(scoAudioMode))
.record();
- startBluetoothScoInt(cb, scoAudioMode, eventSource);
+ startBluetoothScoInt(cb, pid, scoAudioMode, eventSource);
}
@@ -4299,10 +4513,10 @@ public class AudioService extends IAudioService.Stub
.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 @@ public class AudioService extends IAudioService.Stub
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 @@ public class AudioService extends IAudioService.Stub
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 @@ public class AudioService extends IAudioService.Stub
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 @@ public class AudioService extends IAudioService.Stub
}
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 @@ public class AudioService extends IAudioService.Stub
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 e60243fc481c..ae64990fd8d0 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.annotation.NonNull;
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 @@ public class AudioSystemAdapter {
}
/**
- * 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 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 removePreferredDeviceForStrategy(int strategy) {
- return AudioSystem.removePreferredDeviceForStrategy(strategy);
+ 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 7616557ac80f..c9a1fcf76f5b 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.BluetoothHeadset;
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 android.util.Log;
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 @@ public class BtHelper {
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 @@ public class BtHelper {
@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 @@ public class BtHelper {
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 @@ public class BtHelper {
// 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 @@ public class BtHelper {
&& 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 @@ public class BtHelper {
== 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);
+ AudioService.sDeviceLogger.log(new AudioEventLogger.StringEvent(eventSource));
+ return requestScoState(BluetoothHeadset.STATE_AUDIO_CONNECTED, scoAudioMode);
}
// @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) {
+ /*package*/ synchronized boolean stopBluetoothSco(@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_DISCONNECTED, SCO_MODE_VIRTUAL_CALL);
}
/*package*/ synchronized void setHearingAidVolume(int index, int streamType) {
@@ -507,7 +433,6 @@ public class BtHelper {
// @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 @@ public class BtHelper {
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 @@ public class BtHelper {
};
//----------------------------------------------------------------------
- // @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);
- 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;
+ // @GuardedBy("AudioDeviceBroker.mSetModeLock")
+ //@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;
}
- 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;
+ }
+ if (mBluetoothHeadset == null) {
+ if (getBluetoothHeadset()) {
+ mScoAudioState = SCO_STATE_ACTIVATE_REQ;
} else {
- Log.w(TAG, "requestScoState: connect to " + mBluetoothHeadsetDevice
- + " failed, mScoAudioMode=" + mScoAudioMode);
+ Log.w(TAG, "requestScoState: getBluetoothHeadset failed during"
+ + " connection, 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:
+ }
+ 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;
- 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);
+ } else {
+ Log.w(TAG, "requestScoState: connect to "
+ + mBluetoothHeadsetDevice
+ + " failed, mScoAudioMode=" + mScoAudioMode);
+ 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;
+ }
+ 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;
- 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;
- }
- }
- 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);
+ }
+ 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;
}
- mScoClients.remove(this);
}
+ return true;
}
//-----------------------------------------------------
@@ -974,49 +844,6 @@ public class BtHelper {
}
}
-
- @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 @@ public class BtHelper {
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 ff3193182501..a8aa9aada607 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 @@ public final class CompatChange extends CompatibilityChangeInfo {
* @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 @@ public final class CompatChange extends CompatibilityChangeInfo {
}
/**
+ * 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 d80c58b39768..8511118cc840 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 @@ final class CompatConfig {
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 2c19a2d2855c..aa85f7f0f55f 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 @@ public class PlatformCompat extends IPlatformCompat.Stub {
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 @@ public class PlatformCompat extends IPlatformCompat.Stub {
}
/**
- * 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 @@ public class PlatformCompat extends IPlatformCompat.Stub {
@UserIdInt int userId) {
checkCompatChangeReadAndLogPermission();
ApplicationInfo appInfo = getApplicationInfo(packageName, userId);
- if (appInfo == null) {
- return true;
- }
return isChangeEnabled(changeId, appInfo);
}
@@ -136,7 +140,7 @@ public class PlatformCompat extends IPlatformCompat.Stub {
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 @@ public class PlatformCompat extends IPlatformCompat.Stub {
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/NetworkNotificationManager.java b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java
index 7795ed38a74f..3d71b0a269c9 100644
--- a/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java
+++ b/services/core/java/com/android/server/connectivity/NetworkNotificationManager.java
@@ -334,7 +334,13 @@ public class NetworkNotificationManager {
*/
public void setProvNotificationVisible(boolean visible, int id, String action) {
if (visible) {
- Intent intent = new Intent(action);
+ // For legacy purposes, action is sent as the action + the phone ID from DcTracker.
+ // Split the string here and send the phone ID as an extra instead.
+ String[] splitAction = action.split(":");
+ Intent intent = new Intent(splitAction[0]);
+ try {
+ intent.putExtra("provision.phone.id", Integer.parseInt(splitAction[1]));
+ } catch (NumberFormatException ignored) { }
PendingIntent pendingIntent = PendingIntent.getBroadcast(
mContext, 0 /* requestCode */, intent, PendingIntent.FLAG_IMMUTABLE);
showNotification(id, NotificationType.SIGN_IN, null, null, pendingIntent, false);
diff --git a/services/core/java/com/android/server/connectivity/PacManager.java b/services/core/java/com/android/server/connectivity/PacManager.java
index 198de78ecfa6..06721aea5540 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 @@ public class PacManager {
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 5cb3d94a929f..f6ca1523fe2d 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.text.TextUtils;
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 @@ public class ProxyTracker {
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 @@ public class ProxyTracker {
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 class ProxyTracker {
*/
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 @@ public class ProxyTracker {
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/TcpKeepaliveController.java b/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java
index 1129899ee3ff..b5f20d70db7f 100644
--- a/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java
+++ b/services/core/java/com/android/server/connectivity/TcpKeepaliveController.java
@@ -36,6 +36,7 @@ import android.net.SocketKeepalive.InvalidSocketException;
import android.net.TcpKeepalivePacketData;
import android.net.TcpKeepalivePacketDataParcelable;
import android.net.TcpRepairWindow;
+import android.net.util.KeepalivePacketDataUtil;
import android.os.Handler;
import android.os.MessageQueue;
import android.os.Messenger;
@@ -112,7 +113,7 @@ public class TcpKeepaliveController {
throws InvalidPacketException, InvalidSocketException {
try {
final TcpKeepalivePacketDataParcelable tcpDetails = switchToRepairMode(fd);
- return TcpKeepalivePacketData.tcpKeepalivePacket(tcpDetails);
+ return KeepalivePacketDataUtil.fromStableParcelable(tcpDetails);
} catch (InvalidPacketException | InvalidSocketException e) {
switchOutOfRepairMode(fd);
throw e;
@@ -122,7 +123,7 @@ public class TcpKeepaliveController {
* Switch the tcp socket to repair mode and query detail tcp information.
*
* @param fd the fd of socket on which to use keepalive offload.
- * @return a {@link TcpKeepalivePacketData#TcpKeepalivePacketDataParcelable} object for current
+ * @return a {@link TcpKeepalivePacketDataParcelable} object for current
* tcp/ip information.
*/
private static TcpKeepalivePacketDataParcelable switchToRepairMode(FileDescriptor fd)
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java
index cabfbc02491c..228ad588525f 100644
--- a/services/core/java/com/android/server/connectivity/Vpn.java
+++ b/services/core/java/com/android/server/connectivity/Vpn.java
@@ -246,7 +246,12 @@ public class Vpn {
void checkInterruptAndDelay(boolean sleepLonger) throws InterruptedException;
}
- static class Dependencies {
+ @VisibleForTesting
+ public static class Dependencies {
+ public boolean isCallerSystem() {
+ return Binder.getCallingUid() == Process.SYSTEM_UID;
+ }
+
public void startService(final String serviceName) {
SystemService.start(serviceName);
}
@@ -267,6 +272,10 @@ public class Vpn {
return new File("/data/misc/vpn/state");
}
+ public DeviceIdleInternal getDeviceIdleInternal() {
+ return LocalServices.getService(DeviceIdleInternal.class);
+ }
+
public void sendArgumentsToDaemon(
final String daemon, final LocalSocket socket, final String[] arguments,
final RetryScheduler retryScheduler) throws IOException, InterruptedException {
@@ -373,6 +382,14 @@ public class Vpn {
}
@VisibleForTesting
+ public Vpn(Looper looper, Context context, Dependencies deps,
+ INetworkManagementService netService, INetd netd, @UserIdInt int userId,
+ @NonNull KeyStore keyStore) {
+ this(looper, context, deps, netService, netd, userId, keyStore,
+ new SystemServices(context), new Ikev2SessionCreator());
+ }
+
+ @VisibleForTesting
protected Vpn(Looper looper, Context context, Dependencies deps,
INetworkManagementService netService, INetd netd,
int userId, @NonNull KeyStore keyStore, SystemServices systemServices,
@@ -772,8 +789,7 @@ public class Vpn {
// Tell the OS that background services in this app need to be allowed for
// a short time, so we can bootstrap the VPN service.
- DeviceIdleInternal idleController =
- LocalServices.getService(DeviceIdleInternal.class);
+ DeviceIdleInternal idleController = mDeps.getDeviceIdleInternal();
idleController.addPowerSaveTempWhitelistApp(Process.myUid(), alwaysOnPackage,
VPN_LAUNCH_IDLE_ALLOWLIST_DURATION_MS, mUserId, false, "vpn");
@@ -1959,10 +1975,6 @@ public class Vpn {
return mContext.createContextAsUser(
UserHandle.of(userId), 0 /* flags */).getContentResolver();
}
-
- public boolean isCallerSystem() {
- return Binder.getCallingUid() == Process.SYSTEM_UID;
- }
}
private native int jniCreate(int mtu);
@@ -3112,7 +3124,7 @@ public class Vpn {
@VisibleForTesting
@Nullable
VpnProfile getVpnProfilePrivileged(@NonNull String packageName, @NonNull KeyStore keyStore) {
- if (!mSystemServices.isCallerSystem()) {
+ if (!mDeps.isCallerSystem()) {
Log.wtf(TAG, "getVpnProfilePrivileged called as non-System UID ");
return null;
}
diff --git a/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java b/services/core/java/com/android/server/connectivity/VpnIkev2Utils.java
index 626303001ba0..fa03e59f2f2e 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.IkeTrafficSelector;
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/hdmi/HdmiCecController.java b/services/core/java/com/android/server/hdmi/HdmiCecController.java
index 535284083d11..0fdb8798af6f 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecController.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecController.java
@@ -26,6 +26,8 @@ import android.hardware.tv.cec.V1_0.IHdmiCec.getPhysicalAddressCallback;
import android.hardware.tv.cec.V1_0.IHdmiCecCallback;
import android.hardware.tv.cec.V1_0.Result;
import android.hardware.tv.cec.V1_0.SendMessageResult;
+import android.icu.util.IllformedLocaleException;
+import android.icu.util.ULocale;
import android.os.Handler;
import android.os.IHwBinder;
import android.os.Looper;
@@ -33,6 +35,7 @@ import android.os.RemoteException;
import android.util.Slog;
import android.util.SparseArray;
+import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.IndentingPrintWriter;
import com.android.server.hdmi.HdmiAnnotations.IoThreadOnly;
import com.android.server.hdmi.HdmiAnnotations.ServiceThreadOnly;
@@ -48,8 +51,6 @@ import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.function.Predicate;
-import sun.util.locale.LanguageTag;
-
/**
* Manages HDMI-CEC command and behaviors. It converts user's command into CEC command
* and pass it to CEC HAL so that it sends message to other device. For incoming
@@ -369,13 +370,31 @@ final class HdmiCecController {
@ServiceThreadOnly
void setLanguage(String language) {
assertRunOnServiceThread();
- if (!LanguageTag.isLanguage(language)) {
+ if (!isLanguage(language)) {
return;
}
mNativeWrapperImpl.nativeSetLanguage(language);
}
/**
+ * Returns true if the language code is well-formed.
+ */
+ @VisibleForTesting static boolean isLanguage(String language) {
+ // Handle null and empty string because because ULocale.Builder#setLanguage accepts them.
+ if (language == null || language.isEmpty()) {
+ return false;
+ }
+
+ ULocale.Builder builder = new ULocale.Builder();
+ try {
+ builder.setLanguage(language);
+ return true;
+ } catch (IllformedLocaleException e) {
+ return false;
+ }
+ }
+
+ /**
* Configure ARC circuit in the hardware logic to start or stop the feature.
*
* @param port ID of HDMI port to which AVR is connected
diff --git a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
index ea2453216a59..c24973d4f2d4 100644
--- a/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
+++ b/services/core/java/com/android/server/hdmi/HdmiCecMessageValidator.java
@@ -156,7 +156,6 @@ public class HdmiCecMessageValidator {
addValidationInfo(Constants.MESSAGE_GIVE_DECK_STATUS, statusRequestValidator, DEST_DIRECT);
addValidationInfo(Constants.MESSAGE_PLAY, new PlayModeValidator(), DEST_DIRECT);
- // TODO: Handle messages for the Tuner Control.
addValidationInfo(
Constants.MESSAGE_GIVE_TUNER_DEVICE_STATUS, statusRequestValidator, DEST_DIRECT);
addValidationInfo(
@@ -167,6 +166,10 @@ public class HdmiCecMessageValidator {
Constants.MESSAGE_SELECT_DIGITAL_SERVICE,
new SelectDigitalServiceValidator(),
DEST_DIRECT);
+ addValidationInfo(
+ Constants.MESSAGE_TUNER_DEVICE_STATUS,
+ new TunerDeviceStatusValidator(),
+ DEST_DIRECT);
// Messages for the Vendor Specific Commands.
VariableLengthValidator maxLengthValidator = new VariableLengthValidator(0, 14);
@@ -306,7 +309,14 @@ public class HdmiCecMessageValidator {
}
private boolean isValidPhysicalAddress(byte[] params, int offset) {
- // TODO: Add more logic like validating 1.0.1.0.
+ int physicalAddress = HdmiUtils.twoBytesToInt(params, offset);
+ while (physicalAddress != 0) {
+ int maskedAddress = physicalAddress & 0xF000;
+ physicalAddress = (physicalAddress << 4) & 0xFFFF;
+ if (maskedAddress == 0 && physicalAddress != 0) {
+ return false;
+ }
+ }
if (!mService.isTvDevice()) {
// If the device is not TV, we can't convert path to port-id, so stop here.
@@ -722,6 +732,35 @@ public class HdmiCecMessageValidator {
|| (isWithinRange(value, 0xC1, 0xC3)));
}
+ /*
+ * Check if the given value is a valid Tuner Device info. A valid value is one which falls
+ * within the range description defined in CEC 1.4 Specification : Operand Descriptions
+ * (Section 17)
+ *
+ * @param params Tuner device info
+ * @return true if the Tuner device info is valid
+ */
+ private boolean isValidTunerDeviceInfo(byte[] params) {
+ int tunerDisplayInfo = params[0] & 0x7F;
+ if (tunerDisplayInfo == 0x00) {
+ // Displaying digital tuner
+ if (params.length >= 5) {
+ return isValidDigitalServiceIdentification(params, 1);
+ }
+ } else if (tunerDisplayInfo == 0x01) {
+ // Not displaying Tuner
+ return true;
+ } else if (tunerDisplayInfo == 0x02) {
+ // Displaying Analogue tuner
+ if (params.length >= 5) {
+ return (isValidAnalogueBroadcastType(params[1])
+ && isValidAnalogueFrequency(HdmiUtils.twoBytesToInt(params, 2))
+ && isValidBroadcastSystem(params[4]));
+ }
+ }
+ return false;
+ }
+
private class PhysicalAddressValidator implements ParameterValidator {
@Override
public int isValid(byte[] params) {
@@ -1000,6 +1039,21 @@ public class HdmiCecMessageValidator {
}
}
+ /**
+ * Check if the given tuner device status parameter is valid. A valid parameter should lie
+ * within the range description defined in CEC 1.4 Specification : Operand Descriptions (Section
+ * 17)
+ */
+ private class TunerDeviceStatusValidator implements ParameterValidator {
+ @Override
+ public int isValid(byte[] params) {
+ if (params.length < 1) {
+ return ERROR_PARAMETER_SHORT;
+ }
+ return toErrorCode(isValidTunerDeviceInfo(params));
+ }
+ }
+
/** Check if the given user control press parameter is valid. */
private class UserControlPressedValidator implements ParameterValidator {
@Override
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlService.java b/services/core/java/com/android/server/hdmi/HdmiControlService.java
index e2145f077a90..8e50bb4885d8 100644
--- a/services/core/java/com/android/server/hdmi/HdmiControlService.java
+++ b/services/core/java/com/android/server/hdmi/HdmiControlService.java
@@ -66,6 +66,8 @@ import android.os.Looper;
import android.os.PowerManager;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
+import android.os.ResultReceiver;
+import android.os.ShellCallback;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -2291,6 +2293,16 @@ public class HdmiControlService extends SystemService {
}
@Override
+ public void onShellCommand(@Nullable FileDescriptor in, @Nullable FileDescriptor out,
+ @Nullable FileDescriptor err, String[] args,
+ @Nullable ShellCallback callback, ResultReceiver resultReceiver)
+ throws RemoteException {
+ enforceAccessPermission();
+ new HdmiControlShellCommand(this)
+ .exec(this, in, out, err, args, callback, resultReceiver);
+ }
+
+ @Override
protected void dump(FileDescriptor fd, final PrintWriter writer, String[] args) {
if (!DumpUtils.checkDumpPermission(getContext(), TAG, writer)) return;
final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " ");
diff --git a/services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java b/services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java
new file mode 100644
index 000000000000..ee3427f0a383
--- /dev/null
+++ b/services/core/java/com/android/server/hdmi/HdmiControlShellCommand.java
@@ -0,0 +1,160 @@
+/*
+ * 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.server.hdmi;
+
+
+import android.hardware.hdmi.HdmiControlManager;
+import android.hardware.hdmi.IHdmiControlCallback;
+import android.hardware.hdmi.IHdmiControlService;
+import android.os.RemoteException;
+import android.os.ShellCommand;
+import android.util.Slog;
+
+import java.io.PrintWriter;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+final class HdmiControlShellCommand extends ShellCommand {
+
+ private static final String TAG = "HdmiShellCommand";
+
+ private final IHdmiControlService.Stub mBinderService;
+
+
+ HdmiControlShellCommand(IHdmiControlService.Stub binderService) {
+ mBinderService = binderService;
+ }
+
+ @Override
+ public int onCommand(String cmd) {
+ if (cmd == null) {
+ return handleDefaultCommands(cmd);
+ }
+
+ try {
+ return handleShellCommand(cmd);
+ } catch (Exception e) {
+ getErrPrintWriter().println(
+ "Caught error for command '" + cmd + "': " + e.getMessage());
+ Slog.e(TAG, "Error handling hdmi_control shell command: " + cmd, e);
+ return 1;
+ }
+ }
+
+ @Override
+ public void onHelp() {
+ PrintWriter pw = getOutPrintWriter();
+
+ pw.println("HdmiControlManager (hdmi_control) commands:");
+ pw.println(" help");
+ pw.println(" Print this help text.");
+ pw.println(" onetouchplay, otp");
+ pw.println(" Send the \"One Touch Play\" feature from a source to the TV");
+ pw.println(" vendorcommand --device_type <originating device type>");
+ pw.println(" --destination <destination device>");
+ pw.println(" --args <vendor specific arguments>");
+ pw.println(" [--id <true if vendor command should be sent with vendor id>]");
+ pw.println(" Send a Vendor Command to the given target device");
+ }
+
+ private int handleShellCommand(String cmd) throws RemoteException {
+ PrintWriter pw = getOutPrintWriter();
+
+ switch (cmd) {
+ case "otp":
+ case "onetouchplay":
+ return oneTouchPlay(pw);
+ case "vendorcommand":
+ return vendorCommand(pw);
+ }
+
+ getErrPrintWriter().println("Unhandled command: " + cmd);
+ return 1;
+ }
+
+ private int oneTouchPlay(PrintWriter pw) throws RemoteException {
+ final CountDownLatch latch = new CountDownLatch(1);
+ AtomicInteger cecResult = new AtomicInteger();
+ pw.print("Sending One Touch Play...");
+ mBinderService.oneTouchPlay(new IHdmiControlCallback.Stub() {
+ @Override
+ public void onComplete(int result) {
+ pw.println(" done (" + result + ")");
+ latch.countDown();
+ cecResult.set(result);
+ }
+ });
+
+ try {
+ if (!latch.await(HdmiConfig.TIMEOUT_MS, TimeUnit.MILLISECONDS)) {
+ getErrPrintWriter().println("One Touch Play timed out.");
+ return 1;
+ }
+ } catch (InterruptedException e) {
+ getErrPrintWriter().println("Caught InterruptedException");
+ Thread.currentThread().interrupt();
+ }
+ return cecResult.get() == HdmiControlManager.RESULT_SUCCESS ? 0 : 1;
+ }
+
+ private int vendorCommand(PrintWriter pw) throws RemoteException {
+ if (6 > getRemainingArgsCount()) {
+ throw new IllegalArgumentException("Expected 3 arguments.");
+ }
+
+ int deviceType = -1;
+ int destination = -1;
+ String parameters = "";
+ boolean hasVendorId = false;
+
+ String arg = getNextOption();
+ while (arg != null) {
+ switch (arg) {
+ case "-t":
+ case "--device_type":
+ deviceType = Integer.parseInt(getNextArgRequired());
+ break;
+ case "-d":
+ case "--destination":
+ destination = Integer.parseInt(getNextArgRequired());
+ break;
+ case "-a":
+ case "--args":
+ parameters = getNextArgRequired();
+ break;
+ case "-i":
+ case "--id":
+ hasVendorId = Boolean.parseBoolean(getNextArgRequired());
+ break;
+ default:
+ throw new IllegalArgumentException("Unknown argument: " + arg);
+ }
+ arg = getNextArg();
+ }
+
+ String[] parts = parameters.split(":");
+ byte[] params = new byte[parts.length];
+ for (int i = 0; i < params.length; i++) {
+ params[i] = (byte) Integer.parseInt(parts[i], 16);
+ }
+
+ pw.println("Sending <Vendor Command>");
+ mBinderService.sendVendorCommand(deviceType, destination, params, hasVendorId);
+ return 0;
+ }
+}
diff --git a/services/core/java/com/android/server/net/IpConfigStore.java b/services/core/java/com/android/server/net/IpConfigStore.java
index 9c5abd4706a3..cc3a002adc84 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.Log;
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 @@ public class IpConfigStore {
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 @@ public class IpConfigStore {
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 9dd70b787a53..bd80befe84be 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.EventLogTags;
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
* 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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
// 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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
}
}
- 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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
}
}
+ /**
+ * 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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
mLogger.dumpLogs(fout);
}
}
+ fout.println();
+ mMultipathPolicyTracker.dump(fout);
}
@Override
@@ -4294,9 +4310,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
* <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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
* <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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
// 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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
* 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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
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 342a11b87aa5..c4beddd42eaf 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.SET_DEFAULT;
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 f116a24a76e1..c6a55b43d3fd 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 @@ public abstract class ApexManager {
* 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 @@ public abstract class ApexManager {
}
@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 @@ public abstract class ApexManager {
}
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 @@ public abstract class ApexManager {
}
@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 069a00f03a1d..f221802768da 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 @@ public class AppsFilter {
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/policy/OWNERS b/services/core/java/com/android/server/policy/OWNERS
index d25ec4a560a3..8887e401211a 100644
--- a/services/core/java/com/android/server/policy/OWNERS
+++ b/services/core/java/com/android/server/policy/OWNERS
@@ -1,2 +1,3 @@
include /services/core/java/com/android/server/wm/OWNERS
include /services/core/java/com/android/server/input/OWNERS
+include /services/core/java/com/android/server/pm/permission/OWNERS
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
index e0701e867cad..5c01e43af5a9 100644
--- a/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
+++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemService.java
@@ -16,8 +16,10 @@
package com.android.server.recoverysystem;
+import android.annotation.IntDef;
import android.content.Context;
import android.content.IntentSender;
+import android.content.pm.PackageManager;
import android.net.LocalSocket;
import android.net.LocalSocketAddress;
import android.os.Binder;
@@ -30,8 +32,11 @@ import android.os.RemoteException;
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;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.widget.LockSettingsInternal;
import com.android.internal.widget.RebootEscrowListener;
@@ -76,9 +81,53 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo
private final Injector mInjector;
private final Context mContext;
- private boolean mPreparedForReboot;
- private String mUnattendedRebootToken;
- private IntentSender mPreparedForRebootIntentSender;
+ @GuardedBy("this")
+ private final ArrayMap<String, IntentSender> mCallerPendingRequest = new ArrayMap<>();
+ @GuardedBy("this")
+ private final ArraySet<String> mCallerPreparedForReboot = new ArraySet<>();
+
+ /**
+ * Need to prepare for resume on reboot.
+ */
+ private static final int ROR_NEED_PREPARATION = 0;
+ /**
+ * Resume on reboot has been prepared, notify the caller.
+ */
+ private static final int ROR_SKIP_PREPARATION_AND_NOTIFY = 1;
+ /**
+ * Resume on reboot has been requested. Caller won't be notified until the preparation is done.
+ */
+ private static final int ROR_SKIP_PREPARATION_NOT_NOTIFY = 2;
+
+ /**
+ * The caller never requests for resume on reboot, no need for clear.
+ */
+ private static final int ROR_NOT_REQUESTED = 0;
+ /**
+ * Clear the resume on reboot preparation state.
+ */
+ private static final int ROR_REQUESTED_NEED_CLEAR = 1;
+ /**
+ * The caller has requested for resume on reboot. No need for clear since other callers may
+ * exist.
+ */
+ private static final int ROR_REQUESTED_SKIP_CLEAR = 2;
+
+ /**
+ * The action to perform upon new resume on reboot prepare request for a given client.
+ */
+ @IntDef({ ROR_NEED_PREPARATION,
+ ROR_SKIP_PREPARATION_AND_NOTIFY,
+ ROR_SKIP_PREPARATION_NOT_NOTIFY })
+ private @interface ResumeOnRebootActionsOnRequest {}
+
+ /**
+ * The action to perform upon resume on reboot clear request for a given client.
+ */
+ @IntDef({ROR_NOT_REQUESTED,
+ ROR_REQUESTED_NEED_CLEAR,
+ ROR_REQUESTED_SKIP_CLEAR})
+ private @interface ResumeOnRebootActionsOnClear{}
static class Injector {
protected final Context mContext;
@@ -286,47 +335,95 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo
}
}
+ private void enforcePermissionForResumeOnReboot() {
+ if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.RECOVERY)
+ != PackageManager.PERMISSION_GRANTED
+ && mContext.checkCallingOrSelfPermission(android.Manifest.permission.REBOOT)
+ != PackageManager.PERMISSION_GRANTED) {
+ throw new SecurityException("Caller must have " + android.Manifest.permission.RECOVERY
+ + " or " + android.Manifest.permission.REBOOT + " for resume on reboot.");
+ }
+ }
+
@Override // Binder call
- public boolean requestLskf(String updateToken, IntentSender intentSender) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);
+ public boolean requestLskf(String packageName, IntentSender intentSender) {
+ enforcePermissionForResumeOnReboot();
- if (updateToken == null) {
+ if (packageName == null) {
+ Slog.w(TAG, "Missing packageName when requesting lskf.");
return false;
}
- // No need to prepare again for the same token.
- if (mPreparedForReboot && updateToken.equals(mUnattendedRebootToken)) {
- return true;
+ @ResumeOnRebootActionsOnRequest int action = updateRoRPreparationStateOnNewRequest(
+ packageName, intentSender);
+ switch (action) {
+ case ROR_SKIP_PREPARATION_AND_NOTIFY:
+ // We consider the preparation done if someone else has prepared.
+ sendPreparedForRebootIntentIfNeeded(intentSender);
+ return true;
+ case ROR_SKIP_PREPARATION_NOT_NOTIFY:
+ return true;
+ case ROR_NEED_PREPARATION:
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ mInjector.getLockSettingsService().prepareRebootEscrow();
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ return true;
+ default:
+ throw new IllegalStateException("Unsupported action type on new request " + action);
}
+ }
- mPreparedForReboot = false;
- mUnattendedRebootToken = updateToken;
- mPreparedForRebootIntentSender = intentSender;
+ // Checks and updates the resume on reboot preparation state.
+ private synchronized @ResumeOnRebootActionsOnRequest int updateRoRPreparationStateOnNewRequest(
+ String packageName, IntentSender intentSender) {
+ if (!mCallerPreparedForReboot.isEmpty()) {
+ if (mCallerPreparedForReboot.contains(packageName)) {
+ Slog.i(TAG, "RoR already has prepared for " + packageName);
+ }
- final long origId = Binder.clearCallingIdentity();
- try {
- mInjector.getLockSettingsService().prepareRebootEscrow();
- } finally {
- Binder.restoreCallingIdentity(origId);
+ // Someone else has prepared. Consider the preparation done, and send back the intent.
+ mCallerPreparedForReboot.add(packageName);
+ return ROR_SKIP_PREPARATION_AND_NOTIFY;
}
- return true;
+ boolean needPreparation = mCallerPendingRequest.isEmpty();
+ if (mCallerPendingRequest.containsKey(packageName)) {
+ Slog.i(TAG, "Duplicate RoR preparation request for " + packageName);
+ }
+ // Update the request with the new intentSender.
+ mCallerPendingRequest.put(packageName, intentSender);
+ return needPreparation ? ROR_NEED_PREPARATION : ROR_SKIP_PREPARATION_NOT_NOTIFY;
}
@Override
public void onPreparedForReboot(boolean ready) {
- if (mUnattendedRebootToken == null) {
- Slog.w(TAG, "onPreparedForReboot called when mUnattendedRebootToken is null");
+ if (!ready) {
+ return;
+ }
+ updateRoRPreparationStateOnPreparedForReboot();
+ }
+
+ private synchronized void updateRoRPreparationStateOnPreparedForReboot() {
+ if (!mCallerPreparedForReboot.isEmpty()) {
+ Slog.w(TAG, "onPreparedForReboot called when some clients have prepared.");
+ }
+
+ if (mCallerPendingRequest.isEmpty()) {
+ Slog.w(TAG, "onPreparedForReboot called but no client has requested.");
}
- mPreparedForReboot = ready;
- if (ready) {
- sendPreparedForRebootIntentIfNeeded();
+ // Send intents to notify callers
+ for (int i = 0; i < mCallerPendingRequest.size(); i++) {
+ sendPreparedForRebootIntentIfNeeded(mCallerPendingRequest.valueAt(i));
+ mCallerPreparedForReboot.add(mCallerPendingRequest.keyAt(i));
}
+ mCallerPendingRequest.clear();
}
- private void sendPreparedForRebootIntentIfNeeded() {
- final IntentSender intentSender = mPreparedForRebootIntentSender;
+ private void sendPreparedForRebootIntentIfNeeded(IntentSender intentSender) {
if (intentSender != null) {
try {
intentSender.sendIntent(null, 0, null, null, null);
@@ -337,37 +434,59 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo
}
@Override // Binder call
- public boolean clearLskf() {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);
+ public boolean clearLskf(String packageName) {
+ enforcePermissionForResumeOnReboot();
+ if (packageName == null) {
+ Slog.w(TAG, "Missing packageName when clearing lskf.");
+ return false;
+ }
- mPreparedForReboot = false;
- mUnattendedRebootToken = null;
- mPreparedForRebootIntentSender = null;
+ @ResumeOnRebootActionsOnClear int action = updateRoRPreparationStateOnClear(packageName);
+ switch (action) {
+ case ROR_NOT_REQUESTED:
+ Slog.w(TAG, "RoR clear called before preparation for caller " + packageName);
+ return true;
+ case ROR_REQUESTED_SKIP_CLEAR:
+ return true;
+ case ROR_REQUESTED_NEED_CLEAR:
+ final long origId = Binder.clearCallingIdentity();
+ try {
+ mInjector.getLockSettingsService().clearRebootEscrow();
+ } finally {
+ Binder.restoreCallingIdentity(origId);
+ }
+ return true;
+ default:
+ throw new IllegalStateException("Unsupported action type on clear " + action);
+ }
+ }
- final long origId = Binder.clearCallingIdentity();
- try {
- mInjector.getLockSettingsService().clearRebootEscrow();
- } finally {
- Binder.restoreCallingIdentity(origId);
+ private synchronized @ResumeOnRebootActionsOnClear int updateRoRPreparationStateOnClear(
+ String packageName) {
+ if (!mCallerPreparedForReboot.contains(packageName) && !mCallerPendingRequest.containsKey(
+ packageName)) {
+ Slog.w(TAG, packageName + " hasn't prepared for resume on reboot");
+ return ROR_NOT_REQUESTED;
}
+ mCallerPendingRequest.remove(packageName);
+ mCallerPreparedForReboot.remove(packageName);
- return true;
+ // Check if others have prepared ROR.
+ boolean needClear = mCallerPendingRequest.isEmpty() && mCallerPreparedForReboot.isEmpty();
+ return needClear ? ROR_REQUESTED_NEED_CLEAR : ROR_REQUESTED_SKIP_CLEAR;
}
- @Override // Binder call
- public boolean rebootWithLskf(String updateToken, String reason) {
- mContext.enforceCallingOrSelfPermission(android.Manifest.permission.RECOVERY, null);
-
- if (!mPreparedForReboot) {
- Slog.i(TAG, "Reboot requested before prepare completed");
+ private boolean rebootWithLskfImpl(String packageName, String reason, boolean slotSwitch) {
+ if (packageName == null) {
+ Slog.w(TAG, "Missing packageName when rebooting with lskf.");
return false;
}
-
- if (updateToken != null && !updateToken.equals(mUnattendedRebootToken)) {
- Slog.i(TAG, "Reboot requested after preparation, but with mismatching token");
+ if (!isLskfCaptured(packageName)) {
return false;
}
+ // TODO(xunchang) check the slot to boot into, and fail the reboot upon slot mismatch.
+ // TODO(xunchang) write the vbmeta digest along with the escrowKey before reboot.
if (!mInjector.getLockSettingsService().armRebootEscrow()) {
Slog.w(TAG, "Failure to escrow key for reboot");
return false;
@@ -378,6 +497,34 @@ public class RecoverySystemService extends IRecoverySystem.Stub implements Reboo
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 boolean rebootWithLskf(String packageName, String reason, boolean slotSwitch) {
+ enforcePermissionForResumeOnReboot();
+ 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;
+ }
+
/**
* Check if any of the init services is still running. If so, we cannot
* start a new uncrypt/setup-bcb/clear-bcb service right away; otherwise
diff --git a/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java b/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java
index c6905b5c7dd2..f20d80d57476 100644
--- a/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java
+++ b/services/core/java/com/android/server/recoverysystem/RecoverySystemShellCommand.java
@@ -56,26 +56,31 @@ public class RecoverySystemShellCommand extends ShellCommand {
}
private int requestLskf() throws RemoteException {
- String updateToken = getNextArgRequired();
- boolean success = mService.requestLskf(updateToken, null);
+ String packageName = getNextArgRequired();
+ boolean success = mService.requestLskf(packageName, null);
PrintWriter pw = getOutPrintWriter();
- pw.println("Request LSKF status: " + (success ? "success" : "failure"));
+ pw.printf("Request LSKF for packageName: %s, status: %s\n", packageName,
+ success ? "success" : "failure");
return 0;
}
private int clearLskf() throws RemoteException {
- boolean success = mService.clearLskf();
+ String packageName = getNextArgRequired();
+ boolean success = mService.clearLskf(packageName);
PrintWriter pw = getOutPrintWriter();
- pw.println("Clear LSKF: " + (success ? "success" : "failure"));
+ pw.printf("Clear LSKF for packageName: %s, status: %s\n", packageName,
+ success ? "success" : "failure");
return 0;
}
private int rebootAndApply() throws RemoteException {
- String updateToken = getNextArgRequired();
+ String packageName = getNextArgRequired();
String rebootReason = getNextArgRequired();
- boolean success = mService.rebootWithLskf(updateToken, rebootReason);
+ boolean success = mService.rebootWithLskf(packageName, rebootReason, true);
PrintWriter pw = getOutPrintWriter();
- pw.println("Reboot and apply status: " + (success ? "success" : "failure"));
+ // Keep the old message for cts test.
+ pw.printf("%s Reboot and apply status: %s\n", packageName,
+ success ? "success" : "failure");
return 0;
}
diff --git a/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java b/services/core/java/com/android/server/rollback/AppDataRollbackHelper.java
index 524ae54972e5..0213cc6788c5 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 @@ public class AppDataRollbackHelper {
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 000000000000..5ed204fd7640
--- /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/java/com/android/server/vcn/TelephonySubscriptionTracker.java b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
new file mode 100644
index 000000000000..c0608072df9d
--- /dev/null
+++ b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java
@@ -0,0 +1,314 @@
+/*
+ * 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.server.vcn;
+
+import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
+import static android.telephony.CarrierConfigManager.EXTRA_SLOT_INDEX;
+import static android.telephony.CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX;
+import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.ParcelUuid;
+import android.os.PersistableBundle;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
+import android.util.ArraySet;
+import android.util.Slog;
+
+import com.android.internal.annotations.VisibleForTesting;
+import com.android.internal.annotations.VisibleForTesting.Visibility;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * TelephonySubscriptionTracker provides a caching layer for tracking active subscription groups.
+ *
+ * <p>This class performs two roles:
+ *
+ * <ol>
+ * <li>De-noises subscription changes by ensuring that only changes in active and ready
+ * subscription groups are acted upon
+ * <li>Caches mapping between subIds and subscription groups
+ * </ol>
+ *
+ * <p>An subscription group is active and ready if any of its contained subIds has had BOTH the
+ * {@link CarrierConfigManager#isConfigForIdentifiedCarrier()} return true, AND the subscription is
+ * listed as active per SubscriptionManager#getAllSubscriptionInfoList().
+ *
+ * <p>Note that due to the asynchronous nature of callbacks and broadcasts, the output of this class
+ * is (only) eventually consistent.
+ *
+ * @hide
+ */
+public class TelephonySubscriptionTracker extends BroadcastReceiver {
+ @NonNull private static final String TAG = TelephonySubscriptionTracker.class.getSimpleName();
+ private static final boolean LOG_DBG = false; // STOPSHIP if true
+
+ @NonNull private final Context mContext;
+ @NonNull private final Handler mHandler;
+ @NonNull private final TelephonySubscriptionTrackerCallback mCallback;
+ @NonNull private final Dependencies mDeps;
+
+ @NonNull private final SubscriptionManager mSubscriptionManager;
+ @NonNull private final CarrierConfigManager mCarrierConfigManager;
+
+ // TODO (Android T+): Add ability to handle multiple subIds per slot.
+ @NonNull private final Map<Integer, Integer> mReadySubIdsBySlotId = new HashMap<>();
+ @NonNull private final OnSubscriptionsChangedListener mSubscriptionChangedListener;
+
+ @NonNull private TelephonySubscriptionSnapshot mCurrentSnapshot;
+
+ public TelephonySubscriptionTracker(
+ @NonNull Context context,
+ @NonNull Handler handler,
+ @NonNull TelephonySubscriptionTrackerCallback callback) {
+ this(context, handler, callback, new Dependencies());
+ }
+
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ TelephonySubscriptionTracker(
+ @NonNull Context context,
+ @NonNull Handler handler,
+ @NonNull TelephonySubscriptionTrackerCallback callback,
+ @NonNull Dependencies deps) {
+ mContext = Objects.requireNonNull(context, "Missing context");
+ mHandler = Objects.requireNonNull(handler, "Missing handler");
+ mCallback = Objects.requireNonNull(callback, "Missing callback");
+ mDeps = Objects.requireNonNull(deps, "Missing deps");
+
+ mSubscriptionManager = mContext.getSystemService(SubscriptionManager.class);
+ mCarrierConfigManager = mContext.getSystemService(CarrierConfigManager.class);
+
+ mSubscriptionChangedListener =
+ new OnSubscriptionsChangedListener() {
+ @Override
+ public void onSubscriptionsChanged() {
+ handleSubscriptionsChanged();
+ }
+ };
+ }
+
+ /** Registers the receivers, and starts tracking subscriptions. */
+ public void register() {
+ mContext.registerReceiver(
+ this, new IntentFilter(ACTION_CARRIER_CONFIG_CHANGED), null, mHandler);
+ mSubscriptionManager.addOnSubscriptionsChangedListener(
+ new HandlerExecutor(mHandler), mSubscriptionChangedListener);
+ }
+
+ /** Unregisters the receivers, and stops tracking subscriptions. */
+ public void unregister() {
+ mContext.unregisterReceiver(this);
+ mSubscriptionManager.removeOnSubscriptionsChangedListener(mSubscriptionChangedListener);
+ }
+
+ /**
+ * Handles subscription changes, correlating available subscriptions and loaded carrier configs
+ *
+ * <p>The subscription change listener is registered with a HandlerExecutor backed by mHandler,
+ * so callbacks & broadcasts are all serialized on mHandler, avoiding the need for locking.
+ */
+ public void handleSubscriptionsChanged() {
+ final Set<ParcelUuid> activeSubGroups = new ArraySet<>();
+ final Map<Integer, ParcelUuid> newSubIdToGroupMap = new HashMap<>();
+
+ final List<SubscriptionInfo> allSubs = mSubscriptionManager.getAllSubscriptionInfoList();
+ if (allSubs == null) {
+ return; // Telephony crashed; no way to verify subscriptions.
+ }
+
+ // If allSubs is empty, no subscriptions exist. Cache will be cleared by virtue of no active
+ // subscriptions
+ for (SubscriptionInfo subInfo : allSubs) {
+ if (subInfo.getGroupUuid() == null) {
+ continue;
+ }
+
+ // Build subId -> subGrp cache
+ newSubIdToGroupMap.put(subInfo.getSubscriptionId(), subInfo.getGroupUuid());
+
+ // Update subscription groups that are both ready, and active. For a group to be
+ // considered active, both of the following must be true:
+ //
+ // 1. A final CARRIER_CONFIG_CHANGED (where config is for an identified carrier)
+ // broadcast must have been received for the subId
+ // 2. A active subscription (is loaded into a SIM slot) must be part of the subscription
+ // group.
+ if (subInfo.getSimSlotIndex() != INVALID_SIM_SLOT_INDEX
+ && mReadySubIdsBySlotId.values().contains(subInfo.getSubscriptionId())) {
+ activeSubGroups.add(subInfo.getGroupUuid());
+ }
+ }
+
+ final TelephonySubscriptionSnapshot newSnapshot =
+ new TelephonySubscriptionSnapshot(newSubIdToGroupMap, activeSubGroups);
+
+ // If snapshot was meaningfully updated, fire the callback
+ if (!newSnapshot.equals(mCurrentSnapshot)) {
+ mCurrentSnapshot = newSnapshot;
+ mHandler.post(
+ () -> {
+ mCallback.onNewSnapshot(newSnapshot);
+ });
+ }
+ }
+
+ /**
+ * Broadcast receiver for ACTION_CARRIER_CONFIG_CHANGED
+ *
+ * <p>The broadcast receiver is registered with mHandler, so callbacks & broadcasts are all
+ * serialized on mHandler, avoiding the need for locking.
+ */
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ // Accept sticky broadcasts; if CARRIER_CONFIG_CHANGED was previously broadcast and it
+ // already was for an identified carrier, we can stop waiting for initial load to complete
+ if (!ACTION_CARRIER_CONFIG_CHANGED.equals(intent.getAction())) {
+ return;
+ }
+
+ final int subId = intent.getIntExtra(EXTRA_SUBSCRIPTION_INDEX, INVALID_SUBSCRIPTION_ID);
+ final int slotId = intent.getIntExtra(EXTRA_SLOT_INDEX, INVALID_SIM_SLOT_INDEX);
+
+ if (slotId == INVALID_SIM_SLOT_INDEX) {
+ return;
+ }
+
+ if (SubscriptionManager.isValidSubscriptionId(subId)) {
+ final PersistableBundle carrierConfigs = mCarrierConfigManager.getConfigForSubId(subId);
+ if (mDeps.isConfigForIdentifiedCarrier(carrierConfigs)) {
+ Slog.v(TAG, String.format("SubId %s ready for SlotId %s", subId, slotId));
+ mReadySubIdsBySlotId.put(slotId, subId);
+ handleSubscriptionsChanged();
+ }
+ } else {
+ Slog.v(TAG, "Slot unloaded: " + slotId);
+ mReadySubIdsBySlotId.remove(slotId);
+ handleSubscriptionsChanged();
+ }
+ }
+
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ void setReadySubIdsBySlotId(Map<Integer, Integer> readySubIdsBySlotId) {
+ mReadySubIdsBySlotId.putAll(readySubIdsBySlotId);
+ }
+
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ Map<Integer, Integer> getReadySubIdsBySlotId() {
+ return Collections.unmodifiableMap(mReadySubIdsBySlotId);
+ }
+
+ /** TelephonySubscriptionSnapshot is a class containing info about active subscriptions */
+ public static class TelephonySubscriptionSnapshot {
+ private final Map<Integer, ParcelUuid> mSubIdToGroupMap;
+ private final Set<ParcelUuid> mActiveGroups;
+
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ TelephonySubscriptionSnapshot(
+ @NonNull Map<Integer, ParcelUuid> subIdToGroupMap,
+ @NonNull Set<ParcelUuid> activeGroups) {
+ mSubIdToGroupMap = Collections.unmodifiableMap(
+ Objects.requireNonNull(subIdToGroupMap, "subIdToGroupMap was null"));
+ mActiveGroups = Collections.unmodifiableSet(
+ Objects.requireNonNull(activeGroups, "activeGroups was null"));
+ }
+
+ /** Returns the active subscription groups */
+ @NonNull
+ public Set<ParcelUuid> getActiveSubscriptionGroups() {
+ return mActiveGroups;
+ }
+
+ /** Returns the Subscription Group for a given subId. */
+ @Nullable
+ public ParcelUuid getGroupForSubId(int subId) {
+ return mSubIdToGroupMap.get(subId);
+ }
+
+ /**
+ * Returns all the subIds in a given group, including available, but inactive subscriptions.
+ */
+ @NonNull
+ public Set<Integer> getAllSubIdsInGroup(ParcelUuid subGrp) {
+ final Set<Integer> subIds = new ArraySet<>();
+
+ for (Entry<Integer, ParcelUuid> entry : mSubIdToGroupMap.entrySet()) {
+ if (subGrp.equals(entry.getValue())) {
+ subIds.add(entry.getKey());
+ }
+ }
+
+ return subIds;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mSubIdToGroupMap, mActiveGroups);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof TelephonySubscriptionSnapshot)) {
+ return false;
+ }
+
+ final TelephonySubscriptionSnapshot other = (TelephonySubscriptionSnapshot) obj;
+
+ return mSubIdToGroupMap.equals(other.mSubIdToGroupMap)
+ && mActiveGroups.equals(other.mActiveGroups);
+ }
+ }
+
+ /**
+ * Interface for listening to changes in subscriptions
+ *
+ * @see TelephonySubscriptionTracker
+ */
+ public interface TelephonySubscriptionTrackerCallback {
+ /**
+ * Called when subscription information changes, and a new subscription snapshot was taken
+ *
+ * @param snapshot the snapshot of subscription information.
+ */
+ void onNewSnapshot(@NonNull TelephonySubscriptionSnapshot snapshot);
+ }
+
+ /** External static dependencies for test injection */
+ @VisibleForTesting(visibility = Visibility.PRIVATE)
+ public static class Dependencies {
+ /** Checks if the given bundle is for an identified carrier */
+ public boolean isConfigForIdentifiedCarrier(PersistableBundle bundle) {
+ return CarrierConfigManager.isConfigForIdentifiedCarrier(bundle);
+ }
+ }
+}
diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp
index da9d321eb9e9..4f95696dce88 100644
--- a/services/core/jni/Android.bp
+++ b/services/core/jni/Android.bp
@@ -43,7 +43,6 @@ cc_library_static {
"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 @@ cc_library_static {
"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 @@ cc_defaults {
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 faf3f06a3035..43537d067bce 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.AudioManager;
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.annotations.VisibleForTesting;
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.LockPatternUtils;
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 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
}
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 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager {
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 29bf37460568..ae9bd41b9db0 100644
--- a/services/net/Android.bp
+++ b/services/net/Android.bp
@@ -37,7 +37,6 @@ java_library {
"java/android/net/util/NetworkConstants.java",
"java/android/net/IpMemoryStore.java",
"java/android/net/NetworkMonitorManager.java",
- "java/android/net/TcpKeepalivePacketData.java",
],
sdk_version: "module_current",
min_sdk_version: "30",
diff --git a/services/net/java/android/net/TcpKeepalivePacketData.java b/services/net/java/android/net/TcpKeepalivePacketData.java
deleted file mode 100644
index 4875c7cc4263..000000000000
--- a/services/net/java/android/net/TcpKeepalivePacketData.java
+++ /dev/null
@@ -1,268 +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;
-
-import static android.net.SocketKeepalive.ERROR_INVALID_IP_ADDRESS;
-
-import android.annotation.NonNull;
-import android.annotation.Nullable;
-import android.os.Parcel;
-import android.os.Parcelable;
-import android.system.OsConstants;
-
-import com.android.net.module.util.IpUtils;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Objects;
-
-/**
- * Represents the actual tcp keep alive packets which will be used for hardware offload.
- * @hide
- */
-public class TcpKeepalivePacketData extends KeepalivePacketData implements Parcelable {
- private static final String TAG = "TcpKeepalivePacketData";
-
- /** TCP sequence number. */
- public final int tcpSeq;
-
- /** TCP ACK number. */
- public final int tcpAck;
-
- /** TCP RCV window. */
- public final int tcpWnd;
-
- /** TCP RCV window scale. */
- public final int tcpWndScale;
-
- /** IP TOS. */
- public final int ipTos;
-
- /** IP TTL. */
- public final int ipTtl;
-
- private static final int IPV4_HEADER_LENGTH = 20;
- private static final int IPV6_HEADER_LENGTH = 40;
- private static final int TCP_HEADER_LENGTH = 20;
-
- // This should only be constructed via static factory methods, such as
- // tcpKeepalivePacket.
- private TcpKeepalivePacketData(final TcpKeepalivePacketDataParcelable tcpDetails,
- final byte[] data) throws InvalidPacketException, UnknownHostException {
- super(InetAddress.getByAddress(tcpDetails.srcAddress), tcpDetails.srcPort,
- InetAddress.getByAddress(tcpDetails.dstAddress), tcpDetails.dstPort, data);
- tcpSeq = tcpDetails.seq;
- tcpAck = tcpDetails.ack;
- // In the packet, the window is shifted right by the window scale.
- tcpWnd = tcpDetails.rcvWnd;
- tcpWndScale = tcpDetails.rcvWndScale;
- ipTos = tcpDetails.tos;
- ipTtl = tcpDetails.ttl;
- }
-
- private TcpKeepalivePacketData(final InetAddress srcAddress, int srcPort,
- final InetAddress dstAddress, int dstPort, final byte[] data, int tcpSeq,
- int tcpAck, int tcpWnd, int tcpWndScale, int ipTos, int ipTtl)
- throws InvalidPacketException {
- super(srcAddress, srcPort, dstAddress, dstPort, data);
- this.tcpSeq = tcpSeq;
- this.tcpAck = tcpAck;
- this.tcpWnd = tcpWnd;
- this.tcpWndScale = tcpWndScale;
- this.ipTos = ipTos;
- this.ipTtl = ipTtl;
- }
-
- /**
- * Factory method to create tcp keepalive packet structure.
- */
- public static TcpKeepalivePacketData tcpKeepalivePacket(
- TcpKeepalivePacketDataParcelable tcpDetails) throws InvalidPacketException {
- final byte[] packet;
- try {
- if ((tcpDetails.srcAddress != null) && (tcpDetails.dstAddress != null)
- && (tcpDetails.srcAddress.length == 4 /* V4 IP length */)
- && (tcpDetails.dstAddress.length == 4 /* V4 IP length */)) {
- packet = buildV4Packet(tcpDetails);
- } else {
- // TODO: support ipv6
- throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS);
- }
- return new TcpKeepalivePacketData(tcpDetails, packet);
- } catch (UnknownHostException e) {
- throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS);
- }
-
- }
-
- /**
- * Build ipv4 tcp keepalive packet, not including the link-layer header.
- */
- // TODO : if this code is ever moved to the network stack, factorize constants with the ones
- // over there.
- private static byte[] buildV4Packet(TcpKeepalivePacketDataParcelable tcpDetails) {
- final int length = IPV4_HEADER_LENGTH + TCP_HEADER_LENGTH;
- ByteBuffer buf = ByteBuffer.allocate(length);
- buf.order(ByteOrder.BIG_ENDIAN);
- buf.put((byte) 0x45); // IP version and IHL
- buf.put((byte) tcpDetails.tos); // TOS
- buf.putShort((short) length);
- buf.putInt(0x00004000); // ID, flags=DF, offset
- buf.put((byte) tcpDetails.ttl); // TTL
- buf.put((byte) OsConstants.IPPROTO_TCP);
- final int ipChecksumOffset = buf.position();
- buf.putShort((short) 0); // IP checksum
- buf.put(tcpDetails.srcAddress);
- buf.put(tcpDetails.dstAddress);
- buf.putShort((short) tcpDetails.srcPort);
- buf.putShort((short) tcpDetails.dstPort);
- buf.putInt(tcpDetails.seq); // Sequence Number
- buf.putInt(tcpDetails.ack); // ACK
- buf.putShort((short) 0x5010); // TCP length=5, flags=ACK
- buf.putShort((short) (tcpDetails.rcvWnd >> tcpDetails.rcvWndScale)); // Window size
- final int tcpChecksumOffset = buf.position();
- buf.putShort((short) 0); // TCP checksum
- // URG is not set therefore the urgent pointer is zero.
- buf.putShort((short) 0); // Urgent pointer
-
- buf.putShort(ipChecksumOffset, IpUtils.ipChecksum(buf, 0));
- buf.putShort(tcpChecksumOffset, IpUtils.tcpChecksum(
- buf, 0, IPV4_HEADER_LENGTH, TCP_HEADER_LENGTH));
-
- return buf.array();
- }
-
- // TODO: add buildV6Packet.
-
- @Override
- public boolean equals(@Nullable final Object o) {
- if (!(o instanceof TcpKeepalivePacketData)) return false;
- final TcpKeepalivePacketData other = (TcpKeepalivePacketData) o;
- final InetAddress srcAddress = getSrcAddress();
- final InetAddress dstAddress = getDstAddress();
- return srcAddress.equals(other.getSrcAddress())
- && dstAddress.equals(other.getDstAddress())
- && getSrcPort() == other.getSrcPort()
- && getDstPort() == other.getDstPort()
- && this.tcpAck == other.tcpAck
- && this.tcpSeq == other.tcpSeq
- && this.tcpWnd == other.tcpWnd
- && this.tcpWndScale == other.tcpWndScale
- && this.ipTos == other.ipTos
- && this.ipTtl == other.ipTtl;
- }
-
- @Override
- public int hashCode() {
- return Objects.hash(getSrcAddress(), getDstAddress(), getSrcPort(), getDstPort(),
- tcpAck, tcpSeq, tcpWnd, tcpWndScale, ipTos, ipTtl);
- }
-
- /**
- * Parcelable Implementation.
- * Note that this object implements parcelable (and needs to keep doing this as it inherits
- * from a class that does), but should usually be parceled as a stable parcelable using
- * the toStableParcelable() and fromStableParcelable() methods.
- */
- public int describeContents() {
- return 0;
- }
-
- /** Write to parcel. */
- public void writeToParcel(Parcel out, int flags) {
- out.writeString(getSrcAddress().getHostAddress());
- out.writeString(getDstAddress().getHostAddress());
- out.writeInt(getSrcPort());
- out.writeInt(getDstPort());
- out.writeByteArray(getPacket());
- out.writeInt(tcpSeq);
- out.writeInt(tcpAck);
- out.writeInt(tcpWnd);
- out.writeInt(tcpWndScale);
- out.writeInt(ipTos);
- out.writeInt(ipTtl);
- }
-
- private static TcpKeepalivePacketData readFromParcel(Parcel in) throws InvalidPacketException {
- InetAddress srcAddress = InetAddresses.parseNumericAddress(in.readString());
- InetAddress dstAddress = InetAddresses.parseNumericAddress(in.readString());
- int srcPort = in.readInt();
- int dstPort = in.readInt();
- byte[] packet = in.createByteArray();
- int tcpSeq = in.readInt();
- int tcpAck = in.readInt();
- int tcpWnd = in.readInt();
- int tcpWndScale = in.readInt();
- int ipTos = in.readInt();
- int ipTtl = in.readInt();
- return new TcpKeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, packet, tcpSeq,
- tcpAck, tcpWnd, tcpWndScale, ipTos, ipTtl);
- }
-
- /** Parcelable Creator. */
- public static final @NonNull Parcelable.Creator<TcpKeepalivePacketData> CREATOR =
- new Parcelable.Creator<TcpKeepalivePacketData>() {
- public TcpKeepalivePacketData createFromParcel(Parcel in) {
- try {
- return readFromParcel(in);
- } catch (InvalidPacketException e) {
- throw new IllegalArgumentException(
- "Invalid NAT-T keepalive data: " + e.getError());
- }
- }
-
- public TcpKeepalivePacketData[] newArray(int size) {
- return new TcpKeepalivePacketData[size];
- }
- };
-
- /**
- * Convert this TcpKeepalivePacketData to a TcpKeepalivePacketDataParcelable.
- */
- @NonNull
- public TcpKeepalivePacketDataParcelable toStableParcelable() {
- final TcpKeepalivePacketDataParcelable parcel = new TcpKeepalivePacketDataParcelable();
- final InetAddress srcAddress = getSrcAddress();
- final InetAddress dstAddress = getDstAddress();
- parcel.srcAddress = srcAddress.getAddress();
- parcel.srcPort = getSrcPort();
- parcel.dstAddress = dstAddress.getAddress();
- parcel.dstPort = getDstPort();
- parcel.seq = tcpSeq;
- parcel.ack = tcpAck;
- parcel.rcvWnd = tcpWnd;
- parcel.rcvWndScale = tcpWndScale;
- parcel.tos = ipTos;
- parcel.ttl = ipTtl;
- return parcel;
- }
-
- @Override
- public String toString() {
- return "saddr: " + getSrcAddress()
- + " daddr: " + getDstAddress()
- + " sport: " + getSrcPort()
- + " dport: " + getDstPort()
- + " seq: " + tcpSeq
- + " ack: " + tcpAck
- + " wnd: " + tcpWnd
- + " wndScale: " + tcpWndScale
- + " tos: " + ipTos
- + " ttl: " + ipTtl;
- }
-}
diff --git a/services/net/java/android/net/ip/IpClientManager.java b/services/net/java/android/net/ip/IpClientManager.java
index db464e732e91..274b6dc1769b 100644
--- a/services/net/java/android/net/ip/IpClientManager.java
+++ b/services/net/java/android/net/ip/IpClientManager.java
@@ -21,6 +21,7 @@ import android.annotation.NonNull;
import android.net.NattKeepalivePacketData;
import android.net.ProxyInfo;
import android.net.TcpKeepalivePacketData;
+import android.net.TcpKeepalivePacketDataParcelable;
import android.net.shared.Layer2Information;
import android.net.shared.ProvisioningConfiguration;
import android.net.util.KeepalivePacketDataUtil;
@@ -215,9 +216,20 @@ public class IpClientManager {
* Add a TCP keepalive packet filter before setting up keepalive offload.
*/
public boolean addKeepalivePacketFilter(int slot, TcpKeepalivePacketData pkt) {
+ return addKeepalivePacketFilter(slot, KeepalivePacketDataUtil.toStableParcelable(pkt));
+ }
+
+ /**
+ * Add a TCP keepalive packet filter before setting up keepalive offload.
+ * @deprecated This method is for use on pre-S platforms where TcpKeepalivePacketData is not
+ * system API. On newer platforms use
+ * addKeepalivePacketFilter(int, TcpKeepalivePacketData) instead.
+ */
+ @Deprecated
+ public boolean addKeepalivePacketFilter(int slot, TcpKeepalivePacketDataParcelable pkt) {
final long token = Binder.clearCallingIdentity();
try {
- mIpClient.addKeepalivePacketFilter(slot, pkt.toStableParcelable());
+ mIpClient.addKeepalivePacketFilter(slot, pkt);
return true;
} catch (RemoteException e) {
log("Error adding Keepalive Packet Filter ", e);
diff --git a/services/net/java/android/net/util/KeepalivePacketDataUtil.java b/services/net/java/android/net/util/KeepalivePacketDataUtil.java
index 4466ea0abe0e..6e539bbaf9fe 100644
--- a/services/net/java/android/net/util/KeepalivePacketDataUtil.java
+++ b/services/net/java/android/net/util/KeepalivePacketDataUtil.java
@@ -16,20 +16,47 @@
package android.net.util;
+import static android.net.SocketKeepalive.ERROR_INVALID_IP_ADDRESS;
+
import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.net.InvalidPacketException;
+import android.net.KeepalivePacketData;
import android.net.NattKeepalivePacketData;
import android.net.NattKeepalivePacketDataParcelable;
+import android.net.TcpKeepalivePacketData;
+import android.net.TcpKeepalivePacketDataParcelable;
+import android.os.Build;
+import android.system.OsConstants;
+import android.util.Log;
+
+import com.android.net.module.util.IpUtils;
import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
-/** @hide */
+/**
+ * Utility class to convert to/from keepalive data parcelables.
+ *
+ * TODO: move to networkstack-client library when it is moved to frameworks/libs/net.
+ * This class cannot go into other shared libraries as it depends on NetworkStack AIDLs.
+ * @hide
+ */
public final class KeepalivePacketDataUtil {
- /**
- * Convert this NattKeepalivePacketData to a NattKeepalivePacketDataParcelable.
+ private static final int IPV4_HEADER_LENGTH = 20;
+ private static final int IPV6_HEADER_LENGTH = 40;
+ private static final int TCP_HEADER_LENGTH = 20;
+
+ private static final String TAG = KeepalivePacketDataUtil.class.getSimpleName();
+
+ /**
+ * Convert a NattKeepalivePacketData to a NattKeepalivePacketDataParcelable.
*/
@NonNull
public static NattKeepalivePacketDataParcelable toStableParcelable(
- NattKeepalivePacketData pkt) {
+ @NonNull NattKeepalivePacketData pkt) {
final NattKeepalivePacketDataParcelable parcel = new NattKeepalivePacketDataParcelable();
final InetAddress srcAddress = pkt.getSrcAddress();
final InetAddress dstAddress = pkt.getDstAddress();
@@ -39,4 +66,158 @@ public final class KeepalivePacketDataUtil {
parcel.dstPort = pkt.getDstPort();
return parcel;
}
+
+ /**
+ * Convert a TcpKeepalivePacketData to a TcpKeepalivePacketDataParcelable.
+ */
+ @NonNull
+ public static TcpKeepalivePacketDataParcelable toStableParcelable(
+ @NonNull TcpKeepalivePacketData pkt) {
+ final TcpKeepalivePacketDataParcelable parcel = new TcpKeepalivePacketDataParcelable();
+ final InetAddress srcAddress = pkt.getSrcAddress();
+ final InetAddress dstAddress = pkt.getDstAddress();
+ parcel.srcAddress = srcAddress.getAddress();
+ parcel.srcPort = pkt.getSrcPort();
+ parcel.dstAddress = dstAddress.getAddress();
+ parcel.dstPort = pkt.getDstPort();
+ parcel.seq = pkt.tcpSeq;
+ parcel.ack = pkt.tcpAck;
+ parcel.rcvWnd = pkt.tcpWindow;
+ parcel.rcvWndScale = pkt.tcpWindowScale;
+ parcel.tos = pkt.ipTos;
+ parcel.ttl = pkt.ipTtl;
+ return parcel;
+ }
+
+ /**
+ * Factory method to create tcp keepalive packet structure.
+ * @hide
+ */
+ public static TcpKeepalivePacketData fromStableParcelable(
+ TcpKeepalivePacketDataParcelable tcpDetails) throws InvalidPacketException {
+ final byte[] packet;
+ try {
+ if ((tcpDetails.srcAddress != null) && (tcpDetails.dstAddress != null)
+ && (tcpDetails.srcAddress.length == 4 /* V4 IP length */)
+ && (tcpDetails.dstAddress.length == 4 /* V4 IP length */)) {
+ packet = buildV4Packet(tcpDetails);
+ } else {
+ // TODO: support ipv6
+ throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS);
+ }
+ return new TcpKeepalivePacketData(
+ InetAddress.getByAddress(tcpDetails.srcAddress),
+ tcpDetails.srcPort,
+ InetAddress.getByAddress(tcpDetails.dstAddress),
+ tcpDetails.dstPort,
+ packet,
+ tcpDetails.seq, tcpDetails.ack, tcpDetails.rcvWnd, tcpDetails.rcvWndScale,
+ tcpDetails.tos, tcpDetails.ttl);
+ } catch (UnknownHostException e) {
+ throw new InvalidPacketException(ERROR_INVALID_IP_ADDRESS);
+ }
+
+ }
+
+ /**
+ * Build ipv4 tcp keepalive packet, not including the link-layer header.
+ */
+ // TODO : if this code is ever moved to the network stack, factorize constants with the ones
+ // over there.
+ private static byte[] buildV4Packet(TcpKeepalivePacketDataParcelable tcpDetails) {
+ final int length = IPV4_HEADER_LENGTH + TCP_HEADER_LENGTH;
+ ByteBuffer buf = ByteBuffer.allocate(length);
+ buf.order(ByteOrder.BIG_ENDIAN);
+ buf.put((byte) 0x45); // IP version and IHL
+ buf.put((byte) tcpDetails.tos); // TOS
+ buf.putShort((short) length);
+ buf.putInt(0x00004000); // ID, flags=DF, offset
+ buf.put((byte) tcpDetails.ttl); // TTL
+ buf.put((byte) OsConstants.IPPROTO_TCP);
+ final int ipChecksumOffset = buf.position();
+ buf.putShort((short) 0); // IP checksum
+ buf.put(tcpDetails.srcAddress);
+ buf.put(tcpDetails.dstAddress);
+ buf.putShort((short) tcpDetails.srcPort);
+ buf.putShort((short) tcpDetails.dstPort);
+ buf.putInt(tcpDetails.seq); // Sequence Number
+ buf.putInt(tcpDetails.ack); // ACK
+ buf.putShort((short) 0x5010); // TCP length=5, flags=ACK
+ buf.putShort((short) (tcpDetails.rcvWnd >> tcpDetails.rcvWndScale)); // Window size
+ final int tcpChecksumOffset = buf.position();
+ buf.putShort((short) 0); // TCP checksum
+ // URG is not set therefore the urgent pointer is zero.
+ buf.putShort((short) 0); // Urgent pointer
+
+ buf.putShort(ipChecksumOffset, com.android.net.module.util.IpUtils.ipChecksum(buf, 0));
+ buf.putShort(tcpChecksumOffset, IpUtils.tcpChecksum(
+ buf, 0, IPV4_HEADER_LENGTH, TCP_HEADER_LENGTH));
+
+ return buf.array();
+ }
+
+ // TODO: add buildV6Packet.
+
+ /**
+ * Get a {@link TcpKeepalivePacketDataParcelable} from {@link KeepalivePacketData}, if the
+ * generic class actually contains TCP keepalive data.
+ *
+ * @deprecated This method is used on R platforms where android.net.TcpKeepalivePacketData was
+ * not yet system API. Newer platforms should use android.net.TcpKeepalivePacketData directly.
+ *
+ * @param data A {@link KeepalivePacketData} that may contain TCP keepalive data.
+ * @return A parcelable containing TCP keepalive data, or null if the input data does not
+ * contain TCP keepalive data.
+ */
+ @Deprecated
+ @SuppressWarnings("AndroidFrameworkCompatChange") // API version check used to Log.wtf
+ @Nullable
+ public static TcpKeepalivePacketDataParcelable parseTcpKeepalivePacketData(
+ @Nullable KeepalivePacketData data) {
+ if (data == null) return null;
+
+ if (Build.VERSION.SDK_INT > Build.VERSION_CODES.R) {
+ Log.wtf(TAG, "parseTcpKeepalivePacketData should not be used after R, use "
+ + "TcpKeepalivePacketData instead.");
+ }
+
+ // Reconstruct TcpKeepalivePacketData from the packet contained in KeepalivePacketData
+ final ByteBuffer buffer = ByteBuffer.wrap(data.getPacket());
+ buffer.order(ByteOrder.BIG_ENDIAN);
+
+ // Most of the fields are accessible from the KeepalivePacketData superclass: instead of
+ // using Struct to parse everything, just extract the extra fields necessary for
+ // TcpKeepalivePacketData.
+ final int tcpSeq;
+ final int tcpAck;
+ final int wndSize;
+ final int ipTos;
+ final int ttl;
+ try {
+ // This only support IPv4, because TcpKeepalivePacketData only supports IPv4 for R and
+ // below, and this method should not be used on newer platforms.
+ tcpSeq = buffer.getInt(IPV4_HEADER_LENGTH + 4);
+ tcpAck = buffer.getInt(IPV4_HEADER_LENGTH + 8);
+ wndSize = buffer.getShort(IPV4_HEADER_LENGTH + 14);
+ ipTos = buffer.get(1);
+ ttl = buffer.get(8);
+ } catch (IndexOutOfBoundsException e) {
+ return null;
+ }
+
+ final TcpKeepalivePacketDataParcelable p = new TcpKeepalivePacketDataParcelable();
+ p.srcAddress = data.getSrcAddress().getAddress();
+ p.srcPort = data.getSrcPort();
+ p.dstAddress = data.getDstAddress().getAddress();
+ p.dstPort = data.getDstPort();
+ p.seq = tcpSeq;
+ p.ack = tcpAck;
+ // TcpKeepalivePacketData could actually use non-zero wndScale, but this does not affect
+ // actual functionality as generated packets will be the same (no wndScale option added)
+ p.rcvWnd = wndSize;
+ p.rcvWndScale = 0;
+ p.tos = ipTos;
+ p.ttl = ttl;
+ return p;
+ }
}
diff --git a/services/tests/mockingservicestests/src/com/android/server/devicepolicy/OWNERS b/services/tests/mockingservicestests/src/com/android/server/devicepolicy/OWNERS
new file mode 100644
index 000000000000..e95633abe79a
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/devicepolicy/OWNERS
@@ -0,0 +1 @@
+include /core/java/android/app/admin/OWNERS
diff --git a/services/tests/mockingservicestests/src/com/android/server/location/OWNERS b/services/tests/mockingservicestests/src/com/android/server/location/OWNERS
new file mode 100644
index 000000000000..696a0c22c605
--- /dev/null
+++ b/services/tests/mockingservicestests/src/com/android/server/location/OWNERS
@@ -0,0 +1 @@
+file:/location/java/android/location/OWNERS
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 000000000000..d825dfd7cf00
--- /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
index 196ca28192e4..196ca28192e4 100644
--- 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
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
index 4b7724c05d8d..4b7724c05d8d 100644
--- 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
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
index 5b1c03ce170e..5b1c03ce170e 100644
--- 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
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
index bec2371cff6f..bec2371cff6f 100644
--- 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
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 a9cef20268f4..8d706cb960e9 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.AudioDeviceAttributes;
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 @@ public class NoOpAudioSystemAdapter extends AudioSystemAdapter {
}
@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 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 removePreferredDeviceForStrategy(int strategy) {
+ 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 000000000000..894a1f5c25d0
--- /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 e5883708e921..8c63bfcf1407 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 @@ public class CompatConfigTest {
}
@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 64014ba182d2..1d3b643ba83f 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 @@ public class PlatformCompatTest {
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/hdmi/HdmiCecControllerTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
index 5d8131f35eb7..d905b69ce37f 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecControllerTest.java
@@ -28,6 +28,8 @@ import static com.android.server.hdmi.Constants.ADDR_TV;
import static com.android.server.hdmi.Constants.ADDR_UNREGISTERED;
import static junit.framework.Assert.assertEquals;
+import static junit.framework.Assert.assertFalse;
+import static junit.framework.Assert.assertTrue;
import android.content.Context;
import android.hardware.tv.cec.V1_0.SendMessageResult;
@@ -189,4 +191,19 @@ public class HdmiCecControllerTest {
mTestLooper.dispatchAll();
assertEquals(ADDR_UNREGISTERED, mLogicalAddress);
}
+
+ @Test
+ public void testIsLanguage() {
+ assertTrue(HdmiCecController.isLanguage("en"));
+ assertTrue(HdmiCecController.isLanguage("eng"));
+ assertTrue(HdmiCecController.isLanguage("ger"));
+ assertTrue(HdmiCecController.isLanguage("zh"));
+ assertTrue(HdmiCecController.isLanguage("zhi"));
+ assertTrue(HdmiCecController.isLanguage("zho"));
+
+ assertFalse(HdmiCecController.isLanguage(null));
+ assertFalse(HdmiCecController.isLanguage(""));
+ assertFalse(HdmiCecController.isLanguage("e"));
+ assertFalse(HdmiCecController.isLanguage("一")); // language code must be ASCII
+ }
}
diff --git a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
index 24a010039666..ae7f422817e5 100644
--- a/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
+++ b/services/tests/servicestests/src/com/android/server/hdmi/HdmiCecMessageValidatorTest.java
@@ -121,6 +121,16 @@ public class HdmiCecMessageValidatorTest {
}
@Test
+ public void isValid_systemAudioModeRequest() {
+ assertMessageValidity("40:70:00:00").isEqualTo(OK);
+ assertMessageValidity("40:70").isEqualTo(OK);
+
+ assertMessageValidity("F0:70").isEqualTo(ERROR_SOURCE);
+ // Invalid physical address
+ assertMessageValidity("40:70:10:10").isEqualTo(ERROR_PARAMETER);
+ }
+
+ @Test
public void isValid_setSystemAudioMode() {
assertMessageValidity("40:72:00").isEqualTo(OK);
assertMessageValidity("4F:72:01:03").isEqualTo(OK);
@@ -340,6 +350,8 @@ public class HdmiCecMessageValidatorTest {
assertMessageValidity("40:A2:14:09:12:28:4B:19:10:08:10:00").isEqualTo(ERROR_PARAMETER);
// Invalid External PLug
assertMessageValidity("04:A1:0C:08:15:05:04:1E:02:04:00").isEqualTo(ERROR_PARAMETER);
+ // Invalid Physical Address
+ assertMessageValidity("40:A2:14:09:12:28:4B:19:10:05:10:10").isEqualTo(ERROR_PARAMETER);
}
@Test
@@ -476,6 +488,51 @@ public class HdmiCecMessageValidatorTest {
}
@Test
+ public void isValid_tunerDeviceStatus() {
+ // Displaying digital tuner
+ assertMessageValidity("40:07:00:00:11:CE:90:0F:00:78").isEqualTo(OK);
+ assertMessageValidity("40:07:80:10:13:0B:34:38").isEqualTo(OK);
+ assertMessageValidity("40:07:00:9A:06:F9:D3:E6").isEqualTo(OK);
+ assertMessageValidity("40:07:00:91:09:F4:40:C8").isEqualTo(OK);
+ // Not displaying tuner
+ assertMessageValidity("40:07:01").isEqualTo(OK);
+ assertMessageValidity("40:07:81:07:64:B9:02").isEqualTo(OK);
+ // Displaying analogue tuner
+ assertMessageValidity("40:07:02:00:13:0F:00:96").isEqualTo(OK);
+ assertMessageValidity("40:07:82:02:EA:60:1F").isEqualTo(OK);
+
+ assertMessageValidity("4F:07:00:00:11:CE:90:0F:00:78").isEqualTo(ERROR_DESTINATION);
+ assertMessageValidity("F0:07:82:02:EA:60:1F").isEqualTo(ERROR_SOURCE);
+ assertMessageValidity("40:07").isEqualTo(ERROR_PARAMETER_SHORT);
+
+ // Invalid display info
+ assertMessageValidity("40:07:09:A1:8C:17:51").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("40:07:A7:0C:29").isEqualTo(ERROR_PARAMETER);
+ // Invalid Digital Broadcast System
+ assertMessageValidity("40:07:00:14:11:CE:90:0F:00:78").isEqualTo(ERROR_PARAMETER);
+ // Invalid Digital Broadcast System
+ assertMessageValidity("40:07:80:A0:07:95:F1").isEqualTo(ERROR_PARAMETER);
+ // Insufficient data for ARIB Broadcast system
+ assertMessageValidity("40:07:00:00:11:CE:90:0F:00").isEqualTo(ERROR_PARAMETER);
+ // Insufficient data for ATSC Broadcast system
+ assertMessageValidity("40:07:80:10:13:0B:34").isEqualTo(ERROR_PARAMETER);
+ // Insufficient data for DVB Broadcast system
+ assertMessageValidity("40:07:00:18:BE:77:00:7D:01").isEqualTo(ERROR_PARAMETER);
+ // Invalid channel number format
+ assertMessageValidity("40:07:80:9A:10:F9:D3").isEqualTo(ERROR_PARAMETER);
+ // Insufficient data for 1 part channel number
+ assertMessageValidity("40:07:00:90:04:F7").isEqualTo(ERROR_PARAMETER);
+ // Insufficient data for 2 part channel number
+ assertMessageValidity("40:07:80:91:09:F4:40").isEqualTo(ERROR_PARAMETER);
+ // Invalid Analogue Broadcast type
+ assertMessageValidity("40:07:02:03:EA:60:1F").isEqualTo(ERROR_PARAMETER);
+ // Invalid Analogue Frequency
+ assertMessageValidity("40:07:82:00:FF:FF:00").isEqualTo(ERROR_PARAMETER);
+ // Invalid Broadcast system
+ assertMessageValidity("40:07:02:02:EA:60:20").isEqualTo(ERROR_PARAMETER);
+ }
+
+ @Test
public void isValid_UserControlPressed() {
assertMessageValidity("40:44:07").isEqualTo(OK);
assertMessageValidity("40:44:52:A7").isEqualTo(OK);
@@ -518,6 +575,59 @@ public class HdmiCecMessageValidatorTest {
assertMessageValidity("40:44:57:40").isEqualTo(ERROR_PARAMETER);
}
+ @Test
+ public void isValid_physicalAddress() {
+ assertMessageValidity("4F:82:10:00").isEqualTo(OK);
+ assertMessageValidity("4F:82:12:34").isEqualTo(OK);
+ assertMessageValidity("0F:82:00:00").isEqualTo(OK);
+ assertMessageValidity("40:9D:14:00").isEqualTo(OK);
+ assertMessageValidity("40:9D:10:00").isEqualTo(OK);
+ assertMessageValidity("0F:81:44:20").isEqualTo(OK);
+ assertMessageValidity("4F:81:13:10").isEqualTo(OK);
+ assertMessageValidity("4F:86:14:14").isEqualTo(OK);
+ assertMessageValidity("0F:86:15:24").isEqualTo(OK);
+
+ assertMessageValidity("4F:82:10").isEqualTo(ERROR_PARAMETER_SHORT);
+ assertMessageValidity("40:9D:14").isEqualTo(ERROR_PARAMETER_SHORT);
+ assertMessageValidity("0F:81:44").isEqualTo(ERROR_PARAMETER_SHORT);
+ assertMessageValidity("0F:86:15").isEqualTo(ERROR_PARAMETER_SHORT);
+
+ assertMessageValidity("4F:82:10:10").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("4F:82:10:06").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("40:9D:14:04").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("40:9D:10:01").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("0F:81:44:02").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("4F:81:13:05").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("4F:86:10:14").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("0F:86:10:24").isEqualTo(ERROR_PARAMETER);
+ }
+
+ @Test
+ public void isValid_reportPhysicalAddress() {
+ assertMessageValidity("4F:84:10:00:04").isEqualTo(OK);
+ assertMessageValidity("0F:84:00:00:00").isEqualTo(OK);
+
+ assertMessageValidity("4F:84:10:00").isEqualTo(ERROR_PARAMETER_SHORT);
+ assertMessageValidity("0F:84:00").isEqualTo(ERROR_PARAMETER_SHORT);
+ assertMessageValidity("40:84:10:00:04").isEqualTo(ERROR_DESTINATION);
+ // Invalid Physical Address
+ assertMessageValidity("4F:84:10:10:04").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("0F:84:00:30:00").isEqualTo(ERROR_PARAMETER);
+ // Invalid Device Type
+ assertMessageValidity("4F:84:12:34:08").isEqualTo(ERROR_PARAMETER);
+ }
+
+ @Test
+ public void isValid_routingChange() {
+ assertMessageValidity("0F:80:10:00:40:00").isEqualTo(OK);
+ assertMessageValidity("4F:80:12:00:50:00").isEqualTo(OK);
+
+ assertMessageValidity("0F:80:10:00:40").isEqualTo(ERROR_PARAMETER_SHORT);
+ assertMessageValidity("40:80:12:00:50:00").isEqualTo(ERROR_DESTINATION);
+ assertMessageValidity("0F:80:10:01:40:00").isEqualTo(ERROR_PARAMETER);
+ assertMessageValidity("4F:80:12:00:50:50").isEqualTo(ERROR_PARAMETER);
+ }
+
private IntegerSubject assertMessageValidity(String message) {
return assertThat(mHdmiCecMessageValidator.isValid(buildMessage(message)));
}
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 9d300a611374..401d6e30df13 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.ByteArrayOutputStream;
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 @@ public class IpConfigStoreTest {
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 f8043fa56f03..fec0273383e7 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 @@ public class NetworkPolicyManagerServiceTest {
}
/**
- * 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 @@ public class NetworkPolicyManagerServiceTest {
}
/**
- * 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 @@ public class NetworkPolicyManagerServiceTest {
}
private void addRestrictBackgroundAllowlist(boolean expectIntent) throws Exception {
- assertAllowlistUids();
+ assertRestrictBackgroundAllowedUids();
assertUidPolicy(UID_A, POLICY_NONE);
final FutureIntent futureIntent = newRestrictBackgroundChangedFuture();
@@ -507,7 +507,7 @@ public class NetworkPolicyManagerServiceTest {
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 @@ public class NetworkPolicyManagerServiceTest {
}
/**
- * 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 @@ public class NetworkPolicyManagerServiceTest {
}
/**
- * 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 @@ public class NetworkPolicyManagerServiceTest {
}
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 @@ public class NetworkPolicyManagerServiceTest {
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 @@ public class NetworkPolicyManagerServiceTest {
}
/**
- * 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 @@ public class NetworkPolicyManagerServiceTest {
}
/**
- * 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 @@ public class NetworkPolicyManagerServiceTest {
}
/**
- * 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 @@ public class NetworkPolicyManagerServiceTest {
}
/**
- * 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 @@ public class NetworkPolicyManagerServiceTest {
}
@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 @@ public class NetworkPolicyManagerServiceTest {
}
@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 @@ public class NetworkPolicyManagerServiceTest {
}
@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 @@ public class NetworkPolicyManagerServiceTest {
}
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 @@ public class NetworkPolicyManagerServiceTest {
@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 @@ public class NetworkPolicyManagerServiceTest {
}
}
- private void assertAllowlistUids(int... uids) {
+ private void assertRestrictBackgroundAllowedUids(int... uids) {
assertContainsInAnyOrder(mService.getUidsWithPolicy(POLICY_ALLOW_METERED_BACKGROUND), uids);
}
diff --git a/services/tests/servicestests/src/com/android/server/recoverysystem/OWNERS b/services/tests/servicestests/src/com/android/server/recoverysystem/OWNERS
new file mode 100644
index 000000000000..388003863c1d
--- /dev/null
+++ b/services/tests/servicestests/src/com/android/server/recoverysystem/OWNERS
@@ -0,0 +1 @@
+include /services/core/java/com/android/server/recoverysystem/OWNERS
diff --git a/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java b/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
index 035a2f11112c..b07b8fa059d1 100644
--- a/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/recoverysystem/RecoverySystemServiceTest.java
@@ -21,6 +21,7 @@ import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doThrow;
@@ -33,6 +34,7 @@ import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.IntentSender;
+import android.content.pm.PackageManager;
import android.os.Handler;
import android.os.IPowerManager;
import android.os.IRecoverySystemProgressListener;
@@ -67,6 +69,9 @@ public class RecoverySystemServiceTest {
private FileWriter mUncryptUpdateFileWriter;
private LockSettingsInternal mLockSettingsInternal;
+ private static final String FAKE_OTA_PACKAGE_NAME = "fake.ota.package";
+ private static final String FAKE_OTHER_PACKAGE_NAME = "fake.other.package";
+
@Before
public void setup() {
mContext = mock(Context.class);
@@ -209,65 +214,99 @@ public class RecoverySystemServiceTest {
@Test(expected = SecurityException.class)
public void requestLskf_protected() {
- doThrow(SecurityException.class).when(mContext).enforceCallingOrSelfPermission(
- eq(android.Manifest.permission.RECOVERY), any());
- mRecoverySystemService.requestLskf("test", null);
- }
-
-
- @Test
- public void requestLskf_nullToken_failure() {
- assertThat(mRecoverySystemService.requestLskf(null, null), is(false));
+ when(mContext.checkCallingOrSelfPermission(anyString())).thenReturn(
+ PackageManager.PERMISSION_DENIED);
+ mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null);
}
@Test
public void requestLskf_success() throws Exception {
IntentSender intentSender = mock(IntentSender.class);
- assertThat(mRecoverySystemService.requestLskf("test", intentSender), is(true));
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+ is(true));
mRecoverySystemService.onPreparedForReboot(true);
verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
}
@Test
- public void requestLskf_subsequentRequestClearsPrepared() throws Exception {
+ public void requestLskf_subsequentRequestNotClearPrepared() throws Exception {
IntentSender intentSender = mock(IntentSender.class);
- assertThat(mRecoverySystemService.requestLskf("test", intentSender), is(true));
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+ is(true));
mRecoverySystemService.onPreparedForReboot(true);
verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
- assertThat(mRecoverySystemService.requestLskf("test2", null), is(true));
- assertThat(mRecoverySystemService.rebootWithLskf("test", null), is(false));
- assertThat(mRecoverySystemService.rebootWithLskf("test2", "foobar"), is(false));
-
- mRecoverySystemService.onPreparedForReboot(true);
- assertThat(mRecoverySystemService.rebootWithLskf("test2", "foobar"), is(true));
- verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
+ assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "foobar", true),
+ is(true));
verify(mIPowerManager).reboot(anyBoolean(), eq("foobar"), anyBoolean());
}
-
@Test
public void requestLskf_requestedButNotPrepared() throws Exception {
IntentSender intentSender = mock(IntentSender.class);
- assertThat(mRecoverySystemService.requestLskf("test", intentSender), is(true));
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+ is(true));
verify(intentSender, never()).sendIntent(any(), anyInt(), any(), any(), any());
}
+ @Test
+ public void isLskfCaptured_requestedButNotPrepared() throws Exception {
+ IntentSender intentSender = mock(IntentSender.class);
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+ is(true));
+ assertThat(mRecoverySystemService.isLskfCaptured(FAKE_OTA_PACKAGE_NAME), is(false));
+ }
+
+ @Test
+ public void isLskfCaptured_Prepared() throws Exception {
+ IntentSender intentSender = mock(IntentSender.class);
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+ is(true));
+ mRecoverySystemService.onPreparedForReboot(true);
+ verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
+ assertThat(mRecoverySystemService.isLskfCaptured(FAKE_OTA_PACKAGE_NAME), is(true));
+ }
+
@Test(expected = SecurityException.class)
public void clearLskf_protected() {
- doThrow(SecurityException.class).when(mContext).enforceCallingOrSelfPermission(
- eq(android.Manifest.permission.RECOVERY), any());
- mRecoverySystemService.clearLskf();
+ when(mContext.checkCallingOrSelfPermission(anyString())).thenReturn(
+ PackageManager.PERMISSION_DENIED);
+ mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME);
}
@Test
public void clearLskf_requestedThenCleared() throws Exception {
IntentSender intentSender = mock(IntentSender.class);
- assertThat(mRecoverySystemService.requestLskf("test", intentSender), is(true));
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+ is(true));
mRecoverySystemService.onPreparedForReboot(true);
verify(intentSender).sendIntent(any(), anyInt(), any(), any(), any());
- assertThat(mRecoverySystemService.clearLskf(), is(true));
+ assertThat(mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME), is(true));
+ verify(mLockSettingsInternal).clearRebootEscrow();
+ }
+
+ @Test
+ public void clearLskf_callerNotRequested_Success() throws Exception {
+ IntentSender intentSender = mock(IntentSender.class);
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+ is(true));
+ assertThat(mRecoverySystemService.clearLskf(FAKE_OTHER_PACKAGE_NAME), is(true));
+ verify(mLockSettingsInternal, never()).clearRebootEscrow();
+ }
+
+ @Test
+ public void clearLskf_multiClient_BothClientsClear() throws Exception {
+ IntentSender intentSender = mock(IntentSender.class);
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, intentSender),
+ is(true));
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, intentSender),
+ is(true));
+
+ assertThat(mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME), is(true));
+ verify(mLockSettingsInternal, never()).clearRebootEscrow();
+ assertThat(mRecoverySystemService.clearLskf(FAKE_OTHER_PACKAGE_NAME), is(true));
verify(mLockSettingsInternal).clearRebootEscrow();
}
@@ -279,27 +318,84 @@ public class RecoverySystemServiceTest {
@Test(expected = SecurityException.class)
public void rebootWithLskf_protected() {
- doThrow(SecurityException.class).when(mContext).enforceCallingOrSelfPermission(
- eq(android.Manifest.permission.RECOVERY), any());
- mRecoverySystemService.rebootWithLskf("test1", null);
+ when(mContext.checkCallingOrSelfPermission(anyString())).thenReturn(
+ PackageManager.PERMISSION_DENIED);
+ mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true);
}
@Test
public void rebootWithLskf_Success() throws Exception {
- assertThat(mRecoverySystemService.requestLskf("test", null), is(true));
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
mRecoverySystemService.onPreparedForReboot(true);
- assertThat(mRecoverySystemService.rebootWithLskf("test", "ab-update"), is(true));
+ assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", true),
+ is(true));
verify(mIPowerManager).reboot(anyBoolean(), eq("ab-update"), anyBoolean());
}
@Test
public void rebootWithLskf_withoutPrepare_Failure() throws Exception {
- assertThat(mRecoverySystemService.rebootWithLskf("test1", null), is(false));
+ assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true),
+ is(false));
}
@Test
- public void rebootWithLskf_withNullUpdateToken_Failure() throws Exception {
- assertThat(mRecoverySystemService.rebootWithLskf(null, null), is(false));
+ public void rebootWithLskf_withNullCallerId_Failure() throws Exception {
+ assertThat(mRecoverySystemService.rebootWithLskf(null, null, true), is(false));
verifyNoMoreInteractions(mIPowerManager);
}
+
+ @Test
+ public void rebootWithLskf_multiClient_ClientASuccess() throws Exception {
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, null), is(true));
+ mRecoverySystemService.onPreparedForReboot(true);
+
+ // Client B's clear won't affect client A's preparation.
+ assertThat(mRecoverySystemService.clearLskf(FAKE_OTHER_PACKAGE_NAME), is(true));
+ assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, "ab-update", true),
+ is(true));
+ verify(mIPowerManager).reboot(anyBoolean(), eq("ab-update"), anyBoolean());
+ }
+
+
+ @Test
+ public void rebootWithLskf_multiClient_ClientBSuccess() throws Exception {
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
+ mRecoverySystemService.onPreparedForReboot(true);
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, null), is(true));
+
+ assertThat(mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME), is(true));
+ assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true),
+ is(false));
+ verifyNoMoreInteractions(mIPowerManager);
+
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, null), is(true));
+ assertThat(
+ mRecoverySystemService.rebootWithLskf(FAKE_OTHER_PACKAGE_NAME, "ab-update", true),
+ is(true));
+ verify(mIPowerManager).reboot(anyBoolean(), eq("ab-update"), anyBoolean());
+ }
+
+ @Test
+ public void rebootWithLskf_multiClient_BothClientsClear_Failure() throws Exception {
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTA_PACKAGE_NAME, null), is(true));
+ mRecoverySystemService.onPreparedForReboot(true);
+ assertThat(mRecoverySystemService.requestLskf(FAKE_OTHER_PACKAGE_NAME, null), is(true));
+
+ // Client A clears
+ assertThat(mRecoverySystemService.clearLskf(FAKE_OTA_PACKAGE_NAME), is(true));
+ assertThat(mRecoverySystemService.rebootWithLskf(FAKE_OTA_PACKAGE_NAME, null, true),
+ is(false));
+ verifyNoMoreInteractions(mIPowerManager);
+
+ // Client B clears
+ assertThat(mRecoverySystemService.clearLskf(FAKE_OTHER_PACKAGE_NAME), is(true));
+ verify(mLockSettingsInternal).clearRebootEscrow();
+ assertThat(
+ mRecoverySystemService.rebootWithLskf(FAKE_OTHER_PACKAGE_NAME, "ab-update", true),
+ is(false));
+ verifyNoMoreInteractions(mIPowerManager);
+ }
+
+ // TODO(xunchang) add more multi client tests
}
diff --git a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
index 3104c7e7e0a1..f923721b19ea 100644
--- a/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
+++ b/startop/iorap/src/com/google/android/startop/iorap/IorapForwardingService.java
@@ -34,6 +34,7 @@ import android.os.Parcel;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.SystemProperties;
+import android.provider.DeviceConfig;
import android.util.ArraySet;
import android.util.Log;
@@ -154,9 +155,27 @@ public class IorapForwardingService extends SystemService {
@VisibleForTesting
protected boolean isIorapEnabled() {
+ // These two mendel flags should match those in iorapd native process
+ // system/iorapd/src/common/property.h
+ boolean isTracingEnabled =
+ getMendelFlag("iorap_perfetto_enable", "iorapd.perfetto.enable", false);
+ boolean isReadAheadEnabled =
+ getMendelFlag("iorap_readahead_enable", "iorapd.readahead.enable", false);
// Same as the property in iorapd.rc -- disabling this will mean the 'iorapd' binder process
// never comes up, so all binder connections will fail indefinitely.
- return IS_ENABLED;
+ return IS_ENABLED && (isTracingEnabled || isReadAheadEnabled);
+ }
+
+ private boolean getMendelFlag(String mendelFlag, String sysProperty, boolean defaultValue) {
+ // TODO(yawanng) use DeviceConfig to get mendel property.
+ // DeviceConfig doesn't work and the reason is not clear.
+ // Provider service is already up before IORapForwardService.
+ String mendelProperty = "persist.device_config."
+ + DeviceConfig.NAMESPACE_RUNTIME_NATIVE_BOOT
+ + "."
+ + mendelFlag;
+ return SystemProperties.getBoolean(mendelProperty,
+ SystemProperties.getBoolean(sysProperty, defaultValue));
}
//</editor-fold>
@@ -239,7 +258,9 @@ public class IorapForwardingService extends SystemService {
//
// TODO: it would be good to get nodified of 'adb shell stop iorapd' to avoid
// printing this warning.
- Log.w(TAG, "Failed to connect to iorapd, is it down? Delay for " + sleepTime);
+ if (DEBUG) {
+ Log.v(TAG, "Failed to connect to iorapd, is it down? Delay for " + sleepTime);
+ }
// Use a handler instead of Thread#sleep to avoid backing up the binder thread
// when this is called from the death recipient callback.
@@ -275,7 +296,9 @@ public class IorapForwardingService extends SystemService {
// Connect to the native binder service.
mIorapRemote = provideIorapRemote();
if (mIorapRemote == null) {
- Log.e(TAG, "connectToRemoteAndConfigure - null iorap remote. check for Log.wtf?");
+ if (DEBUG) {
+ Log.e(TAG, "connectToRemoteAndConfigure - null iorap remote. check for Log.wtf?");
+ }
return false;
}
invokeRemote(mIorapRemote,
diff --git a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
index 0c463949b14a..225e3f760d20 100644
--- a/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
+++ b/telephony/common/com/android/internal/telephony/TelephonyPermissions.java
@@ -651,4 +651,23 @@ public final class TelephonyPermissions {
throw new SecurityException(message + ": Only shell user can call it");
}
+
+ /**
+ * Returns the target SDK version number for a given package name.
+ *
+ * This call MUST be invoked before clearing the calling UID.
+ *
+ * @return target SDK if the package is found or INT_MAX.
+ */
+ public static int getTargetSdk(Context c, String packageName) {
+ try {
+ final ApplicationInfo ai = c.getPackageManager().getApplicationInfoAsUser(
+ packageName, 0, UserHandle.getUserHandleForUid(Binder.getCallingUid()));
+ if (ai != null) return ai.targetSdkVersion;
+ } catch (PackageManager.NameNotFoundException unexpected) {
+ Log.e(LOG_TAG, "Failed to get package info for pkg="
+ + packageName + ", uid=" + Binder.getCallingUid());
+ }
+ return Integer.MAX_VALUE;
+ }
}
diff --git a/telephony/java/android/telephony/AccessNetworkUtils.java b/telephony/java/android/telephony/AccessNetworkUtils.java
index 981ed450004a..7661a32f6d5b 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_TDD;
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 class AccessNetworkUtils {
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 @@ public class AccessNetworkUtils {
/**
* 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 @@ public class AccessNetworkUtils {
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 27ea6902146f..4e9e6a8440a9 100644
--- a/telephony/java/android/telephony/CarrierConfigManager.java
+++ b/telephony/java/android/telephony/CarrierConfigManager.java
@@ -2046,7 +2046,13 @@ public class CarrierConfigManager {
* 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 @@ public class CarrierConfigManager {
* <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 @@ public class CarrierConfigManager {
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;
}
}
@@ -4018,6 +4065,12 @@ public class CarrierConfigManager {
public static final String KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED =
"use_lower_mtu_value_if_both_received";
+ /**
+ * Indicates if auto-configuration server is used for the RCS config
+ * Reference: GSMA RCC.14
+ */
+ public static final String KEY_USE_ACS_FOR_RCS_BOOL = "use_acs_for_rcs_bool";
+
/** The default value for every variable. */
private final static PersistableBundle sDefaults;
@@ -4561,6 +4614,7 @@ public class CarrierConfigManager {
sDefaults.putBoolean(KEY_DISABLE_DUN_APN_WHILE_ROAMING_WITH_PRESET_APN_BOOL, false);
sDefaults.putString(KEY_DEFAULT_PREFERRED_APN_NAME_STRING, "");
sDefaults.putBoolean(KEY_USE_LOWER_MTU_VALUE_IF_BOTH_RECEIVED, false);
+ sDefaults.putBoolean(KEY_USE_ACS_FOR_RCS_BOOL, false);
}
/**
diff --git a/telephony/java/android/telephony/CellSignalStrengthLte.java b/telephony/java/android/telephony/CellSignalStrengthLte.java
index db7d10ae8ce4..7addf334e967 100644
--- a/telephony/java/android/telephony/CellSignalStrengthLte.java
+++ b/telephony/java/android/telephony/CellSignalStrengthLte.java
@@ -443,10 +443,12 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
/**
* Get table index for channel quality indicator
*
+ * Reference: 3GPP TS 136.213 section 7.2.3.
+ *
* @return the CQI table index if available or
* {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
- /** @hide */
+ @IntRange(from = 1, to = 6)
public int getCqiTableIndex() {
return mCqiTableIndex;
}
@@ -454,9 +456,12 @@ public final class CellSignalStrengthLte extends CellSignalStrength implements P
/**
* Get channel quality indicator
*
+ * Reference: 3GPP TS 136.213 section 7.2.3.
+ *
* @return the CQI if available or
* {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
+ @IntRange(from = 0, to = 15)
public int getCqi() {
return mCqi;
}
diff --git a/telephony/java/android/telephony/CellSignalStrengthNr.java b/telephony/java/android/telephony/CellSignalStrengthNr.java
index 1518190bb7f7..bde62fb2977c 100644
--- a/telephony/java/android/telephony/CellSignalStrengthNr.java
+++ b/telephony/java/android/telephony/CellSignalStrengthNr.java
@@ -294,9 +294,10 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa
*
* Reference: 3GPP TS 138.214 section 5.2.2.1.
*
- * Range [1, 3].
+ * @return the CQI table index if available or
+ * {@link android.telephony.CellInfo#UNAVAILABLE UNAVAILABLE} if unavailable.
*/
- /** @hide */
+ @IntRange(from = 1, to = 3)
public int getCsiCqiTableIndex() {
return mCsiCqiTableIndex;
}
@@ -310,10 +311,10 @@ public final class CellSignalStrengthNr extends CellSignalStrength implements Pa
*
* Reference: 3GPP TS 138.214 section 5.2.2.1.
*
- * Range [0, 15] for each CQI.
+ * @return the CQIs for all subbands if available or empty list if unavailable.
*/
- /** @hide */
@NonNull
+ @IntRange(from = 0, to = 15)
public List<Integer> getCsiCqiReport() {
return mCsiCqiReport;
}
diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java
index 83e63ef29e2c..904232b54b8f 100644
--- a/telephony/java/android/telephony/SubscriptionManager.java
+++ b/telephony/java/android/telephony/SubscriptionManager.java
@@ -791,6 +791,13 @@ public class SubscriptionManager {
public static final String IMS_RCS_UCE_ENABLED = SimInfo.COLUMN_IMS_RCS_UCE_ENABLED;
/**
+ * Determines if the user has enabled cross SIM calling for this subscription.
+ *
+ * @hide
+ */
+ public static final String CROSS_SIM_CALLING_ENABLED = SimInfo.COLUMN_CROSS_SIM_CALLING_ENABLED;
+
+ /**
* TelephonyProvider column name for whether a subscription is opportunistic, that is,
* whether the network it connects to is limited in functionality or coverage.
* For example, CBRS.
diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java
index 8368e3a72734..0e0644488f77 100644
--- a/telephony/java/android/telephony/TelephonyManager.java
+++ b/telephony/java/android/telephony/TelephonyManager.java
@@ -1494,6 +1494,16 @@ public class TelephonyManager {
public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_ALL = 4;
/**
+ * Used as an int value for {@link #EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE}
+ * to indicate that default subscription for data/sms/voice is now determined, that
+ * it should dismiss any dialog or pop-ups that is asking user to select default sub.
+ * This is used when, for example, opportunistic subscription is configured. At that
+ * time the primary becomes default sub there's no need to ask user to select anymore.
+ * @hide
+ */
+ public static final int EXTRA_DEFAULT_SUBSCRIPTION_SELECT_TYPE_DISMISS = 5;
+
+ /**
* Integer intent extra to be used with {@link #ACTION_PRIMARY_SUBSCRIPTION_LIST_CHANGED}
* to indicate if the SIM combination in DSDS has limitation or compatible issue.
* e.g. two CDMA SIMs may disrupt each other's voice call in certain scenarios.
@@ -12290,23 +12300,15 @@ public class TelephonyManager {
@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.");
}
@@ -12314,7 +12316,34 @@ public class TelephonyManager {
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 0d8e5bceaf2b..bd623e055743 100644
--- a/telephony/java/android/telephony/ims/ImsRcsManager.java
+++ b/telephony/java/android/telephony/ims/ImsRcsManager.java
@@ -30,7 +30,6 @@ import android.os.ServiceSpecificException;
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 @@ public class ImsRcsManager {
* 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 @@ public class ImsRcsManager {
* 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/telephony/java/android/telephony/ims/ProvisioningManager.java b/telephony/java/android/telephony/ims/ProvisioningManager.java
index 0fe76a04bf9d..f3c38bcba98a 100644
--- a/telephony/java/android/telephony/ims/ProvisioningManager.java
+++ b/telephony/java/android/telephony/ims/ProvisioningManager.java
@@ -21,6 +21,7 @@ import android.annotation.CallbackExecutor;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
+import android.annotation.SdkConstant;
import android.annotation.StringDef;
import android.annotation.SystemApi;
import android.annotation.WorkerThread;
@@ -31,6 +32,7 @@ import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyFrameworkInitializer;
import android.telephony.ims.aidl.IImsConfigCallback;
+import android.telephony.ims.aidl.IRcsConfigCallback;
import android.telephony.ims.feature.MmTelFeature;
import android.telephony.ims.feature.RcsFeature;
import android.telephony.ims.stub.ImsConfigImplBase;
@@ -936,6 +938,115 @@ public class ProvisioningManager {
private int mSubId;
/**
+ * The callback for RCS provisioning changes.
+ */
+ public static class RcsProvisioningCallback {
+ private static class CallbackBinder extends IRcsConfigCallback.Stub {
+
+ private final RcsProvisioningCallback mLocalCallback;
+ private Executor mExecutor;
+
+ private CallbackBinder(RcsProvisioningCallback localCallback) {
+ mLocalCallback = localCallback;
+ }
+
+ @Override
+ public void onConfigurationChanged(byte[] configXml) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mLocalCallback.onConfigurationChanged(configXml));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void onAutoConfigurationErrorReceived(int errorCode, String errorString) {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mLocalCallback.onAutoConfigurationErrorReceived(
+ errorCode, errorString));
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void onConfigurationReset() {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mLocalCallback.onConfigurationReset());
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ @Override
+ public void onRemoved() {
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ mExecutor.execute(() -> mLocalCallback.onRemoved());
+ } finally {
+ Binder.restoreCallingIdentity(identity);
+ }
+ }
+
+ private void setExecutor(Executor executor) {
+ mExecutor = executor;
+ }
+ }
+
+ private final CallbackBinder mBinder = new CallbackBinder(this);
+
+ /**
+ * RCS configuration received via OTA provisioning. Configuration may change
+ * due to various triggers defined in GSMA RCC.14 for ACS(auto configuration
+ * server) or other operator defined triggers. If RCS provisioning is already
+ * completed at the time of callback registration, then this method shall be
+ * invoked with the current configuration
+ * @param configXml The RCS configurationXML received OTA.
+ */
+ public void onConfigurationChanged(@NonNull byte[] configXml) {}
+
+ /**
+ * Errors during autoconfiguration connection setup are notified by the
+ * ACS(auto configuration server) client using this interface.
+ * @param errorCode HTTP error received during connection setup defined in
+ * GSMA RCC.14 2.4.3, like {@link java.net.HttpURLConnection#HTTP_UNAUTHORIZED},
+ * {@link java.net.HttpURLConnection#HTTP_FORBIDDEN}, etc.
+ * @param errorString reason phrase received with the error
+ */
+ public void onAutoConfigurationErrorReceived(int errorCode,
+ @NonNull String errorString) {}
+
+ /**
+ * When the previously valid RCS configuration is cleaned up by telephony for
+ * any case like SIM removed, default messaging application changed, etc.,
+ * this method will be invoked to notify the application regarding this change.
+ */
+ public void onConfigurationReset() {}
+
+ /**
+ * When the RCS application is no longer the Default messaging application,
+ * or when the subscription associated with this callback is removed (SIM
+ * removed, ESIM swap,etc...), callback will automatically be removed and
+ * the below method is invoked. There is a possibility that the method is
+ * invoked after the subscription has become inactive
+ */
+ public void onRemoved() {}
+
+ /**@hide*/
+ public final IRcsConfigCallback getBinder() {
+ return mBinder;
+ }
+
+ /**@hide*/
+ public void setExecutor(Executor executor) {
+ mBinder.setExecutor(executor);
+ }
+ }
+
+ /**
* Create a new {@link ProvisioningManager} for the subscription specified.
*
* @param subId The ID of the subscription that this ProvisioningManager will use.
@@ -1207,6 +1318,174 @@ public class ProvisioningManager {
}
+ /**
+ * Provides the single registration capability of the device and the carrier.
+ *
+ * <p>This intent only provides the capability and not the current provisioning status of
+ * the RCS VoLTE single registration feature. Only default messaging application may receive
+ * the intent.
+ *
+ * <p>Contains {@link #EXTRA_SUBSCRIPTION_INDEX} to specify the subscription index for which
+ * the intent is valid. and {@link #EXTRA_STATUS} to specify RCS VoLTE single registration
+ * status.
+ */
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ @SdkConstant(SdkConstant.SdkConstantType.BROADCAST_INTENT_ACTION)
+ public static final String ACTION_RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE =
+ "android.telephony.ims.action.RCS_SINGLE_REGISTRATION_CAPABILITY_UPDATE";
+
+ /**
+ * Integer extra to specify subscription index.
+ */
+ public static final String EXTRA_SUBSCRIPTION_ID =
+ "android.telephony.ims.extra.SUBSCRIPTION_ID";
+
+ /**
+ * Integer extra to specify RCS single registration status
+ *
+ * <p>The value can be {@link #STATUS_CAPABLE}, {@link #STATUS_DEVICE_NOT_CAPABLE},
+ * {@link #STATUS_CARRIER_NOT_CAPABLE}, or bitwise OR of
+ * {@link #STATUS_DEVICE_NOT_CAPABLE} and {@link #STATUS_CARRIER_NOT_CAPABLE}.
+ */
+ public static final String EXTRA_STATUS = "android.telephony.ims.extra.STATUS";
+
+ /**
+ * RCS VoLTE single registration is supported by the device and carrier.
+ */
+ public static final int STATUS_CAPABLE = 0;
+
+ /**
+ * RCS VoLTE single registration is not supported by the device.
+ */
+ public static final int STATUS_DEVICE_NOT_CAPABLE = 0x01;
+
+ /**
+ * RCS VoLTE single registration is not supported by the carrier
+ */
+ public static final int STATUS_CARRIER_NOT_CAPABLE = 0x01 << 1;
+
+ /**
+ * Provide the client configuration parameters of the RCS application.
+ *
+ * <p>When this application is also the default messaging application, and RCS
+ * provisioning is done using autoconfiguration, then these parameters shall be
+ * sent in the HTTP get request to fetch the RCS provisioning. RCS client
+ * configuration must be provided by the application before registering for the
+ * provisioning status events {@link #registerRcsProvisioningChangedCallback()}
+ * @param rcc RCS client configuration {@link RcsClientConfiguration}
+ */
+ @RequiresPermission(Manifest.permission.MODIFY_PHONE_STATE)
+ public void setRcsClientConfiguration(
+ @NonNull RcsClientConfiguration rcc) throws ImsException {
+ try {
+ getITelephony().setRcsClientConfiguration(mSubId, rcc);
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.getMessage(), e.errorCode);
+ } catch (RemoteException | IllegalStateException e) {
+ throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
+ }
+
+ /**
+ * Returns a flag to indicate if the device software and the carrier
+ * have the capability to support RCS Volte single IMS registration.
+ * @return true if this single registration is capable, false otherwise
+ * @throws ImsException If the remote ImsService is not available for
+ * any reason or the subscription associated with this instance is no
+ * longer active. See {@link ImsException#getCode()} for more
+ * information.
+ */
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public boolean isRcsVolteSingleRegistrationCapable() throws ImsException {
+ try {
+ return getITelephony().isRcsVolteSingleRegistrationCapable(mSubId);
+ } catch (RemoteException | IllegalStateException e) {
+ throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
+ }
+
+ /**
+ * Registers a new {@link RcsProvisioningCallback} to listen to changes to
+ * RCS provisioning xml.
+ *
+ * <p>RCS application must be the default messaging application and must
+ * have already registered its {@link RcsClientConfiguration} by using
+ * {@link #setRcsClientConfiguration} before it registers the provisioning
+ * callback. If ProvisioningManager has a valid RCS configuration at the
+ * time of callback registration and a reconfiguration is not required
+ * due to RCS client parameters change, then the callback shall be invoked
+ * immediately with the xml.
+ * When the subscription associated with this callback is removed (SIM removed,
+ * ESIM swap,etc...), this callback will automatically be removed.
+ *
+ * @param executor The {@link Executor} to call the callback methods on
+ * @param callback The rcs provisioning callback to be registered.
+ * @see #unregisterRcsProvisioningChangedCallback(RcsProvisioningCallback)
+ * @see SubscriptionManager.OnSubscriptionsChangedListener
+ * @throws IllegalArgumentException if the subscription associated with this
+ * callback is not active (SIM is not inserted, ESIM inactive) or the
+ * subscription is invalid.
+ * @throws ImsException if the subscription associated with this callback is
+ * valid, but the {@link ImsService} associated with the subscription is not
+ * available. This can happen if the service crashed, for example.
+ * It shall also throw this exception when the RCS client parameters for the
+ * application are not valid. In that case application must set the client
+ * params (See {@link #setRcsClientConfiguration()}) and re register the
+ * callback.
+ * See {@link ImsException#getCode()} for a more detailed reason.
+ */
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public void registerRcsProvisioningChangedCallback(
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull RcsProvisioningCallback callback) throws ImsException {
+ callback.setExecutor(executor);
+ try {
+ getITelephony().registerRcsProvisioningChangedCallback(mSubId, callback.getBinder());
+ } catch (ServiceSpecificException e) {
+ throw new ImsException(e.getMessage(), e.errorCode);
+ } catch (RemoteException | IllegalStateException e) {
+ throw new ImsException(e.getMessage(), ImsException.CODE_ERROR_SERVICE_UNAVAILABLE);
+ }
+ }
+
+ /**
+ * Unregister an existing {@link RcsProvisioningCallback}. Application can
+ * unregister when its no longer interested in the provisioning updates
+ * like when a user disables RCS from the UI/settings.
+ * When the subscription associated with this callback is removed (SIM
+ * removed, ESIM swap, etc...), this callback will automatically be
+ * removed. If this method is called for an inactive subscription, it
+ * will result in a no-op.
+ * @param callback The existing {@link RcsProvisioningCallback} to be
+ * removed.
+ * @see #registerRcsProvisioningChangedCallback(RcsClientConfiguration,
+ * Executor, RcsProvisioningCallback) @throws IllegalArgumentException
+ * if the subscription associated with this callback is invalid.
+ */
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public void unregisterRcsProvisioningChangedCallback(
+ @NonNull RcsProvisioningCallback callback) {
+ try {
+ getITelephony().unregisterRcsProvisioningChangedCallback(
+ mSubId, callback.getBinder());
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
+
+ /**
+ * Reconfiguration triggered by the RCS application. Most likely cause
+ * is the 403 forbidden to a HTTP request.
+ */
+ @RequiresPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE)
+ public void triggerRcsReconfiguration() {
+ try {
+ getITelephony().triggerRcsReconfiguration(mSubId);
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
+
private static ITelephony getITelephony() {
ITelephony binder = ITelephony.Stub.asInterface(
TelephonyFrameworkInitializer
diff --git a/wifi/aidl-export/android/net/wifi/aware/PublishConfig.aidl b/telephony/java/android/telephony/ims/RcsClientConfiguration.aidl
index 2e6dd00b245a..a702f0f42c54 100644
--- a/wifi/aidl-export/android/net/wifi/aware/PublishConfig.aidl
+++ b/telephony/java/android/telephony/ims/RcsClientConfiguration.aidl
@@ -1,5 +1,5 @@
/*
- * 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.
@@ -14,6 +14,6 @@
* limitations under the License.
*/
-package android.net.wifi.aware;
+package android.telephony.ims;
-parcelable PublishConfig;
+parcelable RcsClientConfiguration;
diff --git a/telephony/java/android/telephony/ims/RcsClientConfiguration.java b/telephony/java/android/telephony/ims/RcsClientConfiguration.java
new file mode 100644
index 000000000000..793c37745de6
--- /dev/null
+++ b/telephony/java/android/telephony/ims/RcsClientConfiguration.java
@@ -0,0 +1,162 @@
+/*
+ * 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.telephony.ims;
+
+import android.annotation.NonNull;
+import android.annotation.StringDef;
+import android.annotation.SystemApi;
+import android.os.Parcel;
+import android.os.Parcelable;
+
+import java.util.Objects;
+
+/**
+ * The container of RCS application related configs.
+ *
+ * @hide
+ */
+@SystemApi
+public final class RcsClientConfiguration implements Parcelable {
+
+ /**@hide*/
+ @StringDef(prefix = "RCS_PROFILE_",
+ value = {RCS_PROFILE_1_0, RCS_PROFILE_2_3})
+ public @interface StringRcsProfile {}
+
+ /**
+ * RCS profile UP 1.0
+ */
+ public static final String RCS_PROFILE_1_0 = "UP_1.0";
+ /**
+ * RCS profile UP 2.3
+ */
+ public static final String RCS_PROFILE_2_3 = "UP_2.3";
+
+ private String mRcsVersion;
+ private String mRcsProfile;
+ private String mClientVendor;
+ private String mClientVersion;
+
+ /**
+ * Create a RcsClientConfiguration object.
+ * Default messaging application must pass a valid configuration object
+ * @param rcsVersion The parameter identifies the RCS version supported
+ * by the client. Refer to GSMA RCC.07 "rcs_version" parameter.
+ * @param rcsProfile Identifies a fixed set of RCS services that are
+ * supported by the client. See {@link #RCS_PROFILE_1_0 } or
+ * {@link #RCS_PROFILE_2_3 }
+ * @param clientVendor Identifies the vendor providing the RCS client.
+ * @param clientVersion Identifies the RCS client version. Refer to GSMA
+ * RCC.07 "client_version" parameter.
+ * Example:client_version=RCSAndrd-1.0
+ */
+ public RcsClientConfiguration(@NonNull String rcsVersion,
+ @NonNull @StringRcsProfile String rcsProfile,
+ @NonNull String clientVendor, @NonNull String clientVersion) {
+ mRcsVersion = rcsVersion;
+ mRcsProfile = rcsProfile;
+ mClientVendor = clientVendor;
+ mClientVersion = clientVersion;
+ }
+
+ /**
+ * Returns RCS version supported.
+ */
+ public @NonNull String getRcsVersion() {
+ return mRcsVersion;
+ }
+
+ /**
+ * Returns RCS profile supported.
+ */
+ public @NonNull @StringRcsProfile String getRcsProfile() {
+ return mRcsProfile;
+ }
+
+ /**
+ * Returns the name of the vendor providing the RCS client.
+ */
+ public @NonNull String getClientVendor() {
+ return mClientVendor;
+ }
+
+ /**
+ * Returns the RCS client version.
+ */
+ public @NonNull String getClientVersion() {
+ return mClientVersion;
+ }
+
+ /**
+ * {@link Parcelable#writeToParcel}
+ */
+ @Override
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ out.writeString(mRcsVersion);
+ out.writeString(mRcsProfile);
+ out.writeString(mClientVendor);
+ out.writeString(mClientVersion);
+ }
+
+ /**
+ * {@link Parcelable.Creator}
+ *
+ */
+ public static final @android.annotation.NonNull Parcelable.Creator<
+ RcsClientConfiguration> CREATOR = new Creator<RcsClientConfiguration>() {
+ @Override
+ public RcsClientConfiguration createFromParcel(Parcel in) {
+ String rcsVersion = in.readString();
+ String rcsProfile = in.readString();
+ String clientVendor = in.readString();
+ String clientVersion = in.readString();
+ return new RcsClientConfiguration(rcsVersion, rcsProfile,
+ clientVendor, clientVersion);
+ }
+
+ @Override
+ public RcsClientConfiguration[] newArray(int size) {
+ return new RcsClientConfiguration[size];
+ }
+ };
+
+ /**
+ * {@link Parcelable#describeContents}
+ */
+ @Override
+ public int describeContents() {
+ return 0;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof RcsClientConfiguration)) {
+ return false;
+ }
+
+ RcsClientConfiguration other = (RcsClientConfiguration) obj;
+
+ return mRcsVersion.equals(other.mRcsVersion) && mRcsProfile.equals(other.mRcsProfile)
+ && mClientVendor.equals(other.mClientVendor)
+ && mClientVersion.equals(other.mClientVersion);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(mRcsVersion, mRcsProfile, mClientVendor, mClientVersion);
+ }
+}
diff --git a/wifi/aidl-export/android/net/wifi/rtt/RangingResult.aidl b/telephony/java/android/telephony/ims/RcsConfig.aidl
index ae295a610afa..cfd93fbe2edb 100644
--- a/wifi/aidl-export/android/net/wifi/rtt/RangingResult.aidl
+++ b/telephony/java/android/telephony/ims/RcsConfig.aidl
@@ -1,5 +1,5 @@
/*
- * 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.
@@ -14,6 +14,6 @@
* limitations under the License.
*/
-package android.net.wifi.rtt;
+package android.telephony.ims;
-parcelable RangingResult;
+parcelable RcsConfig;
diff --git a/telephony/java/android/telephony/ims/RcsConfig.java b/telephony/java/android/telephony/ims/RcsConfig.java
new file mode 100644
index 000000000000..07e95cc99290
--- /dev/null
+++ b/telephony/java/android/telephony/ims/RcsConfig.java
@@ -0,0 +1,306 @@
+/*
+ * 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.telephony.ims;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.content.ContentValues;
+import android.content.Context;
+import android.database.Cursor;
+import android.os.Build;
+import android.os.Parcel;
+import android.os.Parcelable;
+import android.provider.Telephony.SimInfo;
+import android.text.TextUtils;
+
+import com.android.telephony.Rlog;
+
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+import org.xmlpull.v1.XmlPullParserFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.zip.GZIPInputStream;
+import java.util.zip.GZIPOutputStream;
+
+/**
+ * RCS config data and methods to process the config
+ * @hide
+ */
+public final class RcsConfig implements Parcelable {
+ private static final String LOG_TAG = "RcsConfig";
+ private static final boolean DBG = Build.IS_ENG;
+
+ private final HashMap<String, String> mValues = new HashMap<>();
+
+ private RcsConfig(HashMap<String, String> values) {
+ mValues.putAll(values);
+ }
+
+ public RcsConfig(byte[] data) throws IllegalArgumentException {
+ if (data == null || data.length == 0) {
+ throw new IllegalArgumentException("Empty data");
+ }
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
+ try {
+ XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
+ factory.setNamespaceAware(true);
+ XmlPullParser xpp = factory.newPullParser();
+ xpp.setInput(inputStream, null);
+ int eventType = xpp.getEventType();
+ String tag = null;
+ while (eventType != XmlPullParser.END_DOCUMENT) {
+ if (eventType == XmlPullParser.START_TAG) {
+ tag = xpp.getName().trim();
+ } else if (eventType == XmlPullParser.END_TAG) {
+ tag = null;
+ } else if (eventType == XmlPullParser.TEXT) {
+ String value = xpp.getText().trim();
+ if (!TextUtils.isEmpty(tag) && !TextUtils.isEmpty(value)) {
+ mValues.put(tag, value);
+ }
+ }
+ eventType = xpp.next();
+ }
+ } catch (IOException | XmlPullParserException e) {
+ throw new IllegalArgumentException(e);
+ } finally {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ loge("error to close input stream, skip.");
+ }
+ }
+ }
+
+ /**
+ * Retrieve a String value of the config item with the tag
+ *
+ * @param tag The name of the config to retrieve.
+ * @param defaultVal Value to return if the config does not exist.
+ *
+ * @return Returns the config value if it exists, or defaultVal.
+ */
+ public @Nullable String getString(@NonNull String tag, @Nullable String defaultVal) {
+ return mValues.containsKey(tag) ? mValues.get(tag) : defaultVal;
+ }
+
+ /**
+ * Retrieve a int value of the config item with the tag
+ *
+ * @param tag The name of the config to retrieve.
+ * @param defaultVal Value to return if the config does not exist or not valid.
+ *
+ * @return Returns the config value if it exists and is a valid int, or defaultVal.
+ */
+ public int getInteger(@NonNull String tag, int defaultVal) {
+ try {
+ return Integer.parseInt(mValues.get(tag));
+ } catch (NumberFormatException e) {
+ logd("error to getInteger for " + tag + " due to " + e);
+ }
+ return defaultVal;
+ }
+
+ /**
+ * Retrieve a boolean value of the config item with the tag
+ *
+ * @param tag The name of the config to retrieve.
+ * @param defaultVal Value to return if the config does not exist.
+ *
+ * @return Returns the config value if it exists, or defaultVal.
+ */
+ public boolean getBoolean(@NonNull String tag, boolean defaultVal) {
+ if (!mValues.containsKey(tag)) {
+ return defaultVal;
+ }
+ return Boolean.parseBoolean(mValues.get(tag));
+ }
+
+ /**
+ * Check whether the config item exists
+ *
+ * @param tag The name of the config to retrieve.
+ *
+ * @return Returns true if it exists, or false.
+ */
+ public boolean hasConfig(@NonNull String tag) {
+ return mValues.containsKey(tag);
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("[RCS Config]");
+ if (DBG) {
+ mValues.forEach((t, v) -> {
+ sb.append("\n");
+ sb.append(t);
+ sb.append(" : ");
+ sb.append(v);
+ });
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (!(obj instanceof RcsConfig)) {
+ return false;
+ }
+
+ RcsConfig other = (RcsConfig) obj;
+
+ return mValues.equals(other.mValues);
+ }
+
+ @Override
+ public int hashCode() {
+ return mValues.hashCode();
+ }
+
+ /**
+ * compress the gzip format data
+ */
+ public static @Nullable byte[] compressGzip(@NonNull byte[] data) {
+ if (data == null || data.length == 0) {
+ return data;
+ }
+ byte[] out = null;
+ try {
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream(data.length);
+ GZIPOutputStream gzipCompressingStream =
+ new GZIPOutputStream(outputStream);
+ gzipCompressingStream.write(data);
+ gzipCompressingStream.close();
+ out = outputStream.toByteArray();
+ outputStream.close();
+ } catch (IOException e) {
+ loge("Error to compressGzip due to " + e);
+ }
+ return out;
+ }
+
+ /**
+ * decompress the gzip format data
+ */
+ public static @Nullable byte[] decompressGzip(@NonNull byte[] data) {
+ if (data == null || data.length == 0) {
+ return data;
+ }
+ byte[] out = null;
+ try {
+ ByteArrayInputStream inputStream = new ByteArrayInputStream(data);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ GZIPInputStream gzipDecompressingStream =
+ new GZIPInputStream(inputStream);
+ byte[] buf = new byte[1024];
+ int size = gzipDecompressingStream.read(buf);
+ while (size >= 0) {
+ outputStream.write(buf, 0, size);
+ size = gzipDecompressingStream.read(buf);
+ }
+ gzipDecompressingStream.close();
+ inputStream.close();
+ out = outputStream.toByteArray();
+ outputStream.close();
+ } catch (IOException e) {
+ loge("Error to decompressGzip due to " + e);
+ }
+ return out;
+ }
+
+ /**
+ * save the config to siminfo db. It is only used internally.
+ */
+ public static void updateConfigForSub(@NonNull Context cxt, int subId,
+ @NonNull byte[] config, boolean isCompressed) {
+ //always store gzip compressed data
+ byte[] data = isCompressed ? config : compressGzip(config);
+ ContentValues values = new ContentValues();
+ values.put(SimInfo.COLUMN_RCS_CONFIG, data);
+ cxt.getContentResolver().update(SimInfo.CONTENT_URI, values,
+ SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID + "=" + subId, null);
+ }
+
+ /**
+ * load the config from siminfo db. It is only used internally.
+ */
+ public static @Nullable byte[] loadRcsConfigForSub(@NonNull Context cxt,
+ int subId, boolean isCompressed) {
+
+ byte[] data = null;
+
+ Cursor cursor = cxt.getContentResolver().query(SimInfo.CONTENT_URI, null,
+ SimInfo.COLUMN_UNIQUE_KEY_SUBSCRIPTION_ID + "=" + subId, null, null);
+ try {
+ if (cursor != null && cursor.moveToFirst()) {
+ data = cursor.getBlob(cursor.getColumnIndexOrThrow(SimInfo.COLUMN_RCS_CONFIG));
+ }
+ } catch (Exception e) {
+ loge("error to load rcs config for sub:" + subId + " due to " + e);
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+ return isCompressed ? data : decompressGzip(data);
+ }
+
+ /**
+ * {@link Parcelable#writeToParcel}
+ */
+ public void writeToParcel(@NonNull Parcel out, int flags) {
+ out.writeMap(mValues);
+ }
+
+ /**
+ * {@link Parcelable.Creator}
+ *
+ */
+ public static final @NonNull Parcelable.Creator<RcsConfig>
+ CREATOR = new Creator<RcsConfig>() {
+ @Override
+ public RcsConfig createFromParcel(Parcel in) {
+ HashMap<String, String> values = in.readHashMap(null);
+ return values == null ? null : new RcsConfig(values);
+ }
+
+ @Override
+ public RcsConfig[] newArray(int size) {
+ return new RcsConfig[size];
+ }
+ };
+
+ /**
+ * {@link Parcelable#describeContents}
+ */
+ public int describeContents() {
+ return 0;
+ }
+
+ private static void logd(String msg) {
+ Rlog.d(LOG_TAG, msg);
+ }
+
+ private static void loge(String msg) {
+ Rlog.e(LOG_TAG, msg);
+ }
+}
diff --git a/telephony/java/android/telephony/ims/SipDelegateManager.java b/telephony/java/android/telephony/ims/SipDelegateManager.java
index 2ec88ff27f93..2e9eb94605a5 100644
--- a/telephony/java/android/telephony/ims/SipDelegateManager.java
+++ b/telephony/java/android/telephony/ims/SipDelegateManager.java
@@ -18,7 +18,9 @@ package android.telephony.ims;
import android.Manifest;
import android.annotation.IntDef;
+import android.annotation.IntRange;
import android.annotation.NonNull;
+import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.content.Context;
@@ -372,4 +374,37 @@ public class SipDelegateManager {
+ " into this method");
}
}
+
+ /**
+ * Trigger a full network registration as required by receiving a SIP message containing a
+ * permanent error from the network or never receiving a response to a SIP transaction request.
+ *
+ * @param connection The {@link SipDelegateConnection} that was being used when this error was
+ * received.
+ * @param sipCode The SIP code response associated with the SIP message request that
+ * triggered this condition.
+ * @param sipReason The SIP reason code associated with the SIP message request that triggered
+ * this condition. May be {@code null} if there was no reason String provided from the
+ * network.
+ */
+ public void triggerFullNetworkRegistration(@NonNull SipDelegateConnection connection,
+ @IntRange(from = 100, to = 699) int sipCode, @Nullable String sipReason) {
+ if (connection == null) {
+ throw new IllegalArgumentException("invalid connection.");
+ }
+ if (connection instanceof SipDelegateConnectionAidlWrapper) {
+ SipDelegateConnectionAidlWrapper w = (SipDelegateConnectionAidlWrapper) connection;
+ try {
+ IImsRcsController controller = mBinderCache.getBinder();
+ controller.triggerNetworkRegistration(mSubId, w.getSipDelegateBinder(), sipCode,
+ sipReason);
+ } catch (RemoteException e) {
+ // Connection to telephony died, but this will signal destruction of SipDelegate
+ // eventually anyway, so return.
+ }
+ } else {
+ throw new IllegalArgumentException("Unknown SipDelegateConnection implementation passed"
+ + " into this method");
+ }
+ }
}
diff --git a/telephony/java/android/telephony/ims/aidl/IImsConfig.aidl b/telephony/java/android/telephony/ims/aidl/IImsConfig.aidl
index 57206c9f059a..5eee3890f1dc 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsConfig.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsConfig.aidl
@@ -18,8 +18,9 @@
package android.telephony.ims.aidl;
import android.os.PersistableBundle;
-
import android.telephony.ims.aidl.IImsConfigCallback;
+import android.telephony.ims.aidl.IRcsConfigCallback;
+import android.telephony.ims.RcsClientConfiguration;
import com.android.ims.ImsConfigListener;
@@ -41,4 +42,9 @@ interface IImsConfig {
int setConfigString(int item, String value);
void updateImsCarrierConfigs(in PersistableBundle bundle);
void notifyRcsAutoConfigurationReceived(in byte[] config, boolean isCompressed);
+ void notifyRcsAutoConfigurationRemoved();
+ void addRcsConfigCallback(IRcsConfigCallback c);
+ void removeRcsConfigCallback(IRcsConfigCallback c);
+ void triggerRcsReconfiguration();
+ void setRcsClientConfiguration(in RcsClientConfiguration rcc);
}
diff --git a/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl b/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
index c6d9a8629556..36349895c35b 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsRcsController.aidl
@@ -67,6 +67,8 @@ interface IImsRcsController {
ISipDelegateConnectionStateCallback delegateState,
ISipDelegateMessageCallback delegateMessage);
void destroySipDelegate(int subId, ISipDelegate connection, int reason);
+ void triggerNetworkRegistration(int subId, ISipDelegate connection, int sipCode,
+ String sipReason);
// Internal commands that should not be made public
void registerRcsFeatureCallback(int slotId, in IImsServiceFeatureCallback callback);
diff --git a/telephony/java/android/telephony/ims/aidl/IImsRegistration.aidl b/telephony/java/android/telephony/ims/aidl/IImsRegistration.aidl
index 4ae0a75ad027..4fd904041365 100644
--- a/telephony/java/android/telephony/ims/aidl/IImsRegistration.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IImsRegistration.aidl
@@ -28,4 +28,7 @@ interface IImsRegistration {
int getRegistrationTechnology();
oneway void addRegistrationCallback(IImsRegistrationCallback c);
oneway void removeRegistrationCallback(IImsRegistrationCallback c);
-} \ No newline at end of file
+ oneway void triggerFullNetworkRegistration(int sipCode, String sipReason);
+ oneway void triggerUpdateSipDelegateRegistration();
+ oneway void triggerSipDelegateDeregistration();
+}
diff --git a/wifi/java/android/net/wifi/IWifiScanner.aidl b/telephony/java/android/telephony/ims/aidl/IRcsConfigCallback.aidl
index 485f5ce5415e..5a8973e37bce 100644
--- a/wifi/java/android/net/wifi/IWifiScanner.aidl
+++ b/telephony/java/android/telephony/ims/aidl/IRcsConfigCallback.aidl
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2008 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.
@@ -14,17 +14,16 @@
* limitations under the License.
*/
-package android.net.wifi;
-
-import android.os.Messenger;
-import android.os.Bundle;
+package android.telephony.ims.aidl;
/**
+ * The callback for RCS provisioning changes.
* {@hide}
*/
-interface IWifiScanner
-{
- Messenger getMessenger();
-
- Bundle getAvailableChannels(int band, String packageName, String featureId);
+oneway interface IRcsConfigCallback {
+ void onConfigurationChanged(in byte[] config);
+ void onAutoConfigurationErrorReceived(int errorCode, String errorString);
+ void onConfigurationReset();
+ void onRemoved();
}
+
diff --git a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java
index e757d9f70ccc..cc050becfb25 100644
--- a/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/ImsConfigImplBase.java
@@ -23,8 +23,11 @@ import android.content.Context;
import android.os.PersistableBundle;
import android.os.RemoteException;
import android.telephony.ims.ProvisioningManager;
+import android.telephony.ims.RcsClientConfiguration;
+import android.telephony.ims.RcsConfig;
import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsConfigCallback;
+import android.telephony.ims.aidl.IRcsConfigCallback;
import android.util.Log;
import com.android.ims.ImsConfig;
@@ -202,7 +205,13 @@ public class ImsConfigImplBase {
@Override
public void notifyRcsAutoConfigurationReceived(byte[] config, boolean isCompressed)
throws RemoteException {
- getImsConfigImpl().notifyRcsAutoConfigurationReceived(config, isCompressed);
+ getImsConfigImpl().onNotifyRcsAutoConfigurationReceived(config, isCompressed);
+ }
+
+ @Override
+ public void notifyRcsAutoConfigurationRemoved()
+ throws RemoteException {
+ getImsConfigImpl().onNotifyRcsAutoConfigurationRemoved();
}
private void notifyImsConfigChanged(int item, int value) throws RemoteException {
@@ -228,6 +237,26 @@ public class ImsConfigImplBase {
notifyImsConfigChanged(item, value);
}
}
+
+ @Override
+ public void addRcsConfigCallback(IRcsConfigCallback c) throws RemoteException {
+ getImsConfigImpl().addRcsConfigCallback(c);
+ }
+
+ @Override
+ public void removeRcsConfigCallback(IRcsConfigCallback c) throws RemoteException {
+ getImsConfigImpl().removeRcsConfigCallback(c);
+ }
+
+ @Override
+ public void triggerRcsReconfiguration() throws RemoteException {
+ getImsConfigImpl().triggerAutoConfiguration();
+ }
+
+ @Override
+ public void setRcsClientConfiguration(RcsClientConfiguration rcc) throws RemoteException {
+ getImsConfigImpl().setRcsClientConfiguration(rcc);
+ }
}
/**
@@ -257,6 +286,9 @@ public class ImsConfigImplBase {
private final RemoteCallbackListExt<IImsConfigCallback> mCallbacks =
new RemoteCallbackListExt<>();
+ private final RemoteCallbackListExt<IRcsConfigCallback> mRcsCallbacks =
+ new RemoteCallbackListExt<>();
+ private byte[] mRcsConfigData;
ImsConfigStub mImsConfigStub;
/**
@@ -320,6 +352,50 @@ public class ImsConfigImplBase {
});
}
+ private void addRcsConfigCallback(IRcsConfigCallback c) {
+ mRcsCallbacks.register(c);
+ if (mRcsConfigData != null) {
+ try {
+ c.onConfigurationChanged(mRcsConfigData);
+ } catch (RemoteException e) {
+ Log.w(TAG, "dead binder to call onConfigurationChanged, skipping.");
+ }
+ }
+ }
+
+ private void removeRcsConfigCallback(IRcsConfigCallback c) {
+ mRcsCallbacks.unregister(c);
+ }
+
+ private void onNotifyRcsAutoConfigurationReceived(byte[] config, boolean isCompressed) {
+ mRcsConfigData = isCompressed ? RcsConfig.decompressGzip(config) : config;
+ // can be null in testing
+ if (mRcsCallbacks != null) {
+ mRcsCallbacks.broadcastAction(c -> {
+ try {
+ c.onConfigurationChanged(mRcsConfigData);
+ } catch (RemoteException e) {
+ Log.w(TAG, "dead binder in notifyRcsAutoConfigurationReceived, skipping.");
+ }
+ });
+ }
+ notifyRcsAutoConfigurationReceived(config, isCompressed);
+ }
+
+ private void onNotifyRcsAutoConfigurationRemoved() {
+ mRcsConfigData = null;
+ if (mRcsCallbacks != null) {
+ mRcsCallbacks.broadcastAction(c -> {
+ try {
+ c.onConfigurationReset();
+ } catch (RemoteException e) {
+ Log.w(TAG, "dead binder in notifyRcsAutoConfigurationRemoved, skipping.");
+ }
+ });
+ }
+ notifyRcsAutoConfigurationRemoved();
+ }
+
/**
* @hide
*/
@@ -369,6 +445,12 @@ public class ImsConfigImplBase {
}
/**
+ * The RCS autoconfiguration XML file is removed or invalid.
+ */
+ public void notifyRcsAutoConfigurationRemoved() {
+ }
+
+ /**
* Sets the configuration value for this ImsService.
*
* @param item an integer key.
@@ -421,4 +503,43 @@ public class ImsConfigImplBase {
public void updateImsCarrierConfigs(PersistableBundle bundle) {
// Base Implementation - Should be overridden
}
+
+ /**
+ * Default messaging application parameters are sent to the ACS client
+ * using this interface.
+ * @param rcc RCS client configuration {@link RcsClientConfiguration}
+ */
+ public void setRcsClientConfiguration(@NonNull RcsClientConfiguration rcc) {
+ // Base Implementation - Should be overridden
+ }
+
+ /**
+ * Reconfiguration triggered by the RCS application. Most likely cause
+ * is the 403 forbidden to a SIP/HTTP request
+ */
+ public void triggerAutoConfiguration() {
+ // Base Implementation - Should be overridden
+ }
+
+ /**
+ * Errors during autoconfiguration connection setup are notified by the
+ * ACS client using this interface.
+ * @param errorCode HTTP error received during connection setup.
+ * @param errorString reason phrase received with the error
+ */
+ public final void notifyAutoConfigurationErrorReceived(int errorCode,
+ @NonNull String errorString) {
+ // can be null in testing
+ if (mRcsCallbacks == null) {
+ return;
+ }
+ mRcsCallbacks.broadcastAction(c -> {
+ try {
+ //TODO compressed by default?
+ c.onAutoConfigurationErrorReceived(errorCode, errorString);
+ } catch (RemoteException e) {
+ Log.w(TAG, "dead binder in notifyAutoConfigurationErrorReceived, skipping.");
+ }
+ });
+ }
}
diff --git a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
index 153d687dd84f..088a7e26a9d0 100644
--- a/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
+++ b/telephony/java/android/telephony/ims/stub/ImsRegistrationImplBase.java
@@ -38,6 +38,9 @@ import java.lang.annotation.RetentionPolicy;
/**
* Controls IMS registration for this ImsService and notifies the framework when the IMS
* registration for this ImsService has changed status.
+ * <p>
+ * Note: There is no guarantee on the thread that the calls from the framework will be called on. It
+ * is the implementors responsibility to handle moving the calls to a working thread if required.
* @hide
*/
@SystemApi
@@ -92,6 +95,21 @@ public class ImsRegistrationImplBase {
public void removeRegistrationCallback(IImsRegistrationCallback c) throws RemoteException {
ImsRegistrationImplBase.this.removeRegistrationCallback(c);
}
+
+ @Override
+ public void triggerFullNetworkRegistration(int sipCode, String sipReason) {
+ ImsRegistrationImplBase.this.triggerFullNetworkRegistration(sipCode, sipReason);
+ }
+
+ @Override
+ public void triggerUpdateSipDelegateRegistration() {
+ ImsRegistrationImplBase.this.updateSipDelegateRegistration();
+ }
+
+ @Override
+ public void triggerSipDelegateDeregistration() {
+ ImsRegistrationImplBase.this.triggerSipDelegateDeregistration();
+ }
};
private final RemoteCallbackListExt<IImsRegistrationCallback> mCallbacks =
@@ -133,7 +151,6 @@ public class ImsRegistrationImplBase {
* If the SIP delegate feature tag configuration has changed, then this method will be
* called in order to let the ImsService know that it can pick up these changes in the IMS
* registration.
- * @hide
*/
public void updateSipDelegateRegistration() {
// Stub implementation, ImsService should implement this
@@ -150,7 +167,6 @@ public class ImsRegistrationImplBase {
* <p>
* This should not affect the registration of features managed by the ImsService itself, such as
* feature tags related to MMTEL registration.
- * @hide
*/
public void triggerSipDelegateDeregistration() {
// Stub implementation, ImsService should implement this
@@ -169,9 +185,8 @@ public class ImsRegistrationImplBase {
* be carrier specific.
* @param sipReason The reason associated with the SIP error code. {@code null} if there was no
* reason associated with the error.
- * @hide
*/
- public void triggerNetworkReregistration(@IntRange(from = 100, to = 699) int sipCode,
+ public void triggerFullNetworkRegistration(@IntRange(from = 100, to = 699) int sipCode,
@Nullable String sipReason) {
// Stub implementation, ImsService should implement this
}
diff --git a/telephony/java/com/android/internal/telephony/ITelephony.aidl b/telephony/java/com/android/internal/telephony/ITelephony.aidl
index 205a425a5161..7c5047c2deaf 100644
--- a/telephony/java/com/android/internal/telephony/ITelephony.aidl
+++ b/telephony/java/com/android/internal/telephony/ITelephony.aidl
@@ -52,6 +52,7 @@ import android.telephony.SignalStrength;
import android.telephony.TelephonyHistogram;
import android.telephony.VisualVoicemailSmsFilterSettings;
import android.telephony.emergency.EmergencyNumber;
+import android.telephony.ims.RcsClientConfiguration;
import android.telephony.ims.aidl.IImsCapabilityCallback;
import android.telephony.ims.aidl.IImsConfig;
import android.telephony.ims.aidl.IImsConfigCallback;
@@ -59,6 +60,7 @@ import android.telephony.ims.aidl.IImsMmTelFeature;
import android.telephony.ims.aidl.IImsRcsFeature;
import android.telephony.ims.aidl.IImsRegistration;
import android.telephony.ims.aidl.IImsRegistrationCallback;
+import android.telephony.ims.aidl.IRcsConfigCallback;
import com.android.ims.internal.IImsServiceFeatureCallback;
import com.android.internal.telephony.CellNetworkScanResult;
import com.android.internal.telephony.IBooleanConsumer;
@@ -2303,4 +2305,51 @@ interface ITelephony {
* Return the release time for telephony to unbind GbaService.
*/
int getGbaReleaseTime(int subId);
+
+ /**
+ * Provide the client configuration parameters of the RCS application.
+ */
+ void setRcsClientConfiguration(int subId, in RcsClientConfiguration rcc);
+
+ /**
+ * return value to indicate whether the device and the carrier can support RCS VoLTE
+ * single registration.
+ */
+ boolean isRcsVolteSingleRegistrationCapable(int subId);
+
+ /**
+ * Register RCS provisioning callback.
+ */
+ void registerRcsProvisioningChangedCallback(int subId,
+ IRcsConfigCallback callback);
+
+ /**
+ * Unregister RCS provisioning callback.
+ */
+ void unregisterRcsProvisioningChangedCallback(int subId, IRcsConfigCallback callback);
+
+ /**
+ * trigger RCS reconfiguration.
+ */
+ void triggerRcsReconfiguration(int subId);
+
+ /**
+ * Overrides the config of RCS VoLTE single registration enabled for the device.
+ */
+ void setDeviceSingleRegistrationEnabledOverride(String enabled);
+
+ /**
+ * Gets the config of RCS VoLTE single registration enabled for the device.
+ */
+ boolean getDeviceSingleRegistrationEnabled();
+
+ /**
+ * Overrides the config of RCS VoLTE single registration enabled for the carrier/subscription.
+ */
+ boolean setCarrierSingleRegistrationEnabledOverride(int subId, String enabled);
+
+ /**
+ * Gets the config of RCS VoLTE single registration enabled for the carrier/subscription.
+ */
+ boolean getCarrierSingleRegistrationEnabled(int subId);
}
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 21cca4ca8204..52f263fad695 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -521,6 +521,8 @@ public interface RILConstants {
int RIL_REQUEST_CANCEL_HANDOVER = 218;
int RIL_REQUEST_GET_SYSTEM_SELECTION_CHANNELS = 219;
int RIL_REQUEST_SET_DATA_THROTTLING = 221;
+ int RIL_REQUEST_SET_ALLOWED_NETWORK_TYPE_BITMAP = 222;
+ int RIL_REQUEST_GET_ALLOWED_NETWORK_TYPE_BITMAP = 223;
/* Responses begin */
int RIL_RESPONSE_ACKNOWLEDGEMENT = 800;
diff --git a/test-mock/src/android/test/mock/OWNERS b/test-mock/src/android/test/mock/OWNERS
index 36d9cb2654bb..72e8ffc0db8a 100644
--- a/test-mock/src/android/test/mock/OWNERS
+++ b/test-mock/src/android/test/mock/OWNERS
@@ -1 +1 @@
-set noparent
+*
diff --git a/tests/BatteryStatsPerfTest/OWNERS b/tests/BatteryStatsPerfTest/OWNERS
new file mode 100644
index 000000000000..4068e2bc03b7
--- /dev/null
+++ b/tests/BatteryStatsPerfTest/OWNERS
@@ -0,0 +1 @@
+include /BATTERY_STATS_OWNERS
diff --git a/tests/BatteryWaster/OWNERS b/tests/BatteryWaster/OWNERS
new file mode 100644
index 000000000000..4068e2bc03b7
--- /dev/null
+++ b/tests/BatteryWaster/OWNERS
@@ -0,0 +1 @@
+include /BATTERY_STATS_OWNERS
diff --git a/tests/net/common/java/android/net/NetworkProviderTest.kt b/tests/net/common/java/android/net/NetworkProviderTest.kt
index 77e9f12c7152..bcc907285e35 100644
--- a/tests/net/common/java/android/net/NetworkProviderTest.kt
+++ b/tests/net/common/java/android/net/NetworkProviderTest.kt
@@ -29,6 +29,7 @@ import androidx.test.InstrumentationRegistry
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 @@ class NetworkProviderTest {
@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/common/java/android/net/TcpKeepalivePacketDataTest.kt b/tests/net/common/java/android/net/TcpKeepalivePacketDataTest.kt
new file mode 100644
index 000000000000..677006692f84
--- /dev/null
+++ b/tests/net/common/java/android/net/TcpKeepalivePacketDataTest.kt
@@ -0,0 +1,106 @@
+/*
+ * 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
+
+import android.net.InetAddresses.parseNumericAddress
+import android.os.Build
+import com.android.testutils.DevSdkIgnoreRule
+import com.android.testutils.DevSdkIgnoreRunner
+import com.android.testutils.assertFieldCountEquals
+import com.android.testutils.assertParcelSane
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.net.InetAddress
+import kotlin.test.assertEquals
+import kotlin.test.assertNotEquals
+import kotlin.test.assertTrue
+
+@RunWith(DevSdkIgnoreRunner::class)
+@DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R) // TcpKeepalivePacketData added to SDK in S
+class TcpKeepalivePacketDataTest {
+ private fun makeData(
+ srcAddress: InetAddress = parseNumericAddress("192.0.2.123"),
+ srcPort: Int = 1234,
+ dstAddress: InetAddress = parseNumericAddress("192.0.2.231"),
+ dstPort: Int = 4321,
+ data: ByteArray = byteArrayOf(1, 2, 3),
+ tcpSeq: Int = 135,
+ tcpAck: Int = 246,
+ tcpWnd: Int = 1234,
+ tcpWndScale: Int = 2,
+ ipTos: Int = 0x12,
+ ipTtl: Int = 10
+ ) = TcpKeepalivePacketData(srcAddress, srcPort, dstAddress, dstPort, data, tcpSeq, tcpAck,
+ tcpWnd, tcpWndScale, ipTos, ipTtl)
+
+ @Test
+ fun testEquals() {
+ val data1 = makeData()
+ val data2 = makeData()
+ assertEquals(data1, data2)
+ assertEquals(data1.hashCode(), data2.hashCode())
+ }
+
+ @Test
+ fun testNotEquals() {
+ assertNotEquals(makeData(srcAddress = parseNumericAddress("192.0.2.124")), makeData())
+ assertNotEquals(makeData(srcPort = 1235), makeData())
+ assertNotEquals(makeData(dstAddress = parseNumericAddress("192.0.2.232")), makeData())
+ assertNotEquals(makeData(dstPort = 4322), makeData())
+ // .equals does not test .packet, as it should be generated from the other fields
+ assertNotEquals(makeData(tcpSeq = 136), makeData())
+ assertNotEquals(makeData(tcpAck = 247), makeData())
+ assertNotEquals(makeData(tcpWnd = 1235), makeData())
+ assertNotEquals(makeData(tcpWndScale = 3), makeData())
+ assertNotEquals(makeData(ipTos = 0x14), makeData())
+ assertNotEquals(makeData(ipTtl = 11), makeData())
+
+ // Update above assertions if field is added
+ assertFieldCountEquals(5, KeepalivePacketData::class.java)
+ assertFieldCountEquals(6, TcpKeepalivePacketData::class.java)
+ }
+
+ @Test
+ fun testParcelUnparcel() {
+ assertParcelSane(makeData(), fieldCount = 6) { a, b ->
+ // .equals() does not verify .packet
+ a == b && a.packet contentEquals b.packet
+ }
+ }
+
+ @Test
+ fun testToString() {
+ val data = makeData()
+ val str = data.toString()
+
+ assertTrue(str.contains(data.srcAddress.hostAddress))
+ assertTrue(str.contains(data.srcPort.toString()))
+ assertTrue(str.contains(data.dstAddress.hostAddress))
+ assertTrue(str.contains(data.dstPort.toString()))
+ // .packet not included in toString()
+ assertTrue(str.contains(data.tcpSeq.toString()))
+ assertTrue(str.contains(data.tcpAck.toString()))
+ assertTrue(str.contains(data.tcpWindow.toString()))
+ assertTrue(str.contains(data.tcpWindowScale.toString()))
+ assertTrue(str.contains(data.ipTos.toString()))
+ assertTrue(str.contains(data.ipTtl.toString()))
+
+ // Update above assertions if field is added
+ assertFieldCountEquals(5, KeepalivePacketData::class.java)
+ assertFieldCountEquals(6, TcpKeepalivePacketData::class.java)
+ }
+} \ No newline at end of file
diff --git a/tests/net/java/android/net/Ikev2VpnProfileTest.java b/tests/net/java/android/net/Ikev2VpnProfileTest.java
index ada5494efd60..076e41d33a8d 100644
--- a/tests/net/java/android/net/Ikev2VpnProfileTest.java
+++ b/tests/net/java/android/net/Ikev2VpnProfileTest.java
@@ -29,6 +29,7 @@ import androidx.test.filters.SmallTest;
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 @@ public class Ikev2VpnProfileTest {
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/TcpKeepalivePacketDataTest.java b/tests/net/java/android/net/KeepalivePacketDataUtilTest.java
index c5b25bdcac48..fc739fbfac61 100644
--- a/tests/net/java/android/net/TcpKeepalivePacketDataTest.java
+++ b/tests/net/java/android/net/KeepalivePacketDataUtilTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2019 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.
@@ -20,8 +20,11 @@ import static com.android.testutils.ParcelUtils.assertParcelingIsLossless;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
+import android.net.util.KeepalivePacketDataUtil;
+
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -31,7 +34,7 @@ import java.net.InetAddress;
import java.nio.ByteBuffer;
@RunWith(JUnit4.class)
-public final class TcpKeepalivePacketDataTest {
+public final class KeepalivePacketDataUtilTest {
private static final byte[] IPV4_KEEPALIVE_SRC_ADDR = {10, 0, 0, 1};
private static final byte[] IPV4_KEEPALIVE_DST_ADDR = {10, 0, 0, 5};
@@ -39,7 +42,7 @@ public final class TcpKeepalivePacketDataTest {
public void setUp() {}
@Test
- public void testV4TcpKeepalivePacket() throws Exception {
+ public void testFromTcpKeepaliveStableParcelable() throws Exception {
final int srcPort = 1234;
final int dstPort = 4321;
final int seq = 0x11111111;
@@ -61,7 +64,7 @@ public final class TcpKeepalivePacketDataTest {
testInfo.tos = tos;
testInfo.ttl = ttl;
try {
- resultData = TcpKeepalivePacketData.tcpKeepalivePacket(testInfo);
+ resultData = KeepalivePacketDataUtil.fromStableParcelable(testInfo);
} catch (InvalidPacketException e) {
fail("InvalidPacketException: " + e);
}
@@ -72,8 +75,8 @@ public final class TcpKeepalivePacketDataTest {
assertEquals(testInfo.dstPort, resultData.getDstPort());
assertEquals(testInfo.seq, resultData.tcpSeq);
assertEquals(testInfo.ack, resultData.tcpAck);
- assertEquals(testInfo.rcvWnd, resultData.tcpWnd);
- assertEquals(testInfo.rcvWndScale, resultData.tcpWndScale);
+ assertEquals(testInfo.rcvWnd, resultData.tcpWindow);
+ assertEquals(testInfo.rcvWndScale, resultData.tcpWindowScale);
assertEquals(testInfo.tos, resultData.ipTos);
assertEquals(testInfo.ttl, resultData.ipTtl);
@@ -113,7 +116,7 @@ public final class TcpKeepalivePacketDataTest {
//TODO: add ipv6 test when ipv6 supported
@Test
- public void testParcel() throws Exception {
+ public void testToTcpKeepaliveStableParcelable() throws Exception {
final int srcPort = 1234;
final int dstPort = 4321;
final int sequence = 0x11111111;
@@ -135,8 +138,8 @@ public final class TcpKeepalivePacketDataTest {
testInfo.ttl = ttl;
TcpKeepalivePacketData testData = null;
TcpKeepalivePacketDataParcelable resultData = null;
- testData = TcpKeepalivePacketData.tcpKeepalivePacket(testInfo);
- resultData = testData.toStableParcelable();
+ testData = KeepalivePacketDataUtil.fromStableParcelable(testInfo);
+ resultData = KeepalivePacketDataUtil.toStableParcelable(testData);
assertArrayEquals(resultData.srcAddress, IPV4_KEEPALIVE_SRC_ADDR);
assertArrayEquals(resultData.dstAddress, IPV4_KEEPALIVE_DST_ADDR);
assertEquals(resultData.srcPort, srcPort);
@@ -154,4 +157,49 @@ public final class TcpKeepalivePacketDataTest {
+ " ack: 572662306, rcvWnd: 48000, rcvWndScale: 2, tos: 4, ttl: 64}";
assertEquals(expected, resultData.toString());
}
+
+ @Test
+ public void testParseTcpKeepalivePacketData() throws Exception {
+ final int srcPort = 1234;
+ final int dstPort = 4321;
+ final int sequence = 0x11111111;
+ final int ack = 0x22222222;
+ final int wnd = 4800;
+ final int wndScale = 2;
+ final int tos = 4;
+ final int ttl = 64;
+ final TcpKeepalivePacketDataParcelable testParcel = new TcpKeepalivePacketDataParcelable();
+ testParcel.srcAddress = IPV4_KEEPALIVE_SRC_ADDR;
+ testParcel.srcPort = srcPort;
+ testParcel.dstAddress = IPV4_KEEPALIVE_DST_ADDR;
+ testParcel.dstPort = dstPort;
+ testParcel.seq = sequence;
+ testParcel.ack = ack;
+ testParcel.rcvWnd = wnd;
+ testParcel.rcvWndScale = wndScale;
+ testParcel.tos = tos;
+ testParcel.ttl = ttl;
+
+ final KeepalivePacketData testData =
+ KeepalivePacketDataUtil.fromStableParcelable(testParcel);
+ final TcpKeepalivePacketDataParcelable parsedParcelable =
+ KeepalivePacketDataUtil.parseTcpKeepalivePacketData(testData);
+ final TcpKeepalivePacketData roundTripData =
+ KeepalivePacketDataUtil.fromStableParcelable(parsedParcelable);
+
+ // Generated packet is the same, but rcvWnd / wndScale will differ if scale is non-zero
+ assertTrue(testData.getPacket().length > 0);
+ assertArrayEquals(testData.getPacket(), roundTripData.getPacket());
+
+ testParcel.rcvWndScale = 0;
+ final KeepalivePacketData noScaleTestData =
+ KeepalivePacketDataUtil.fromStableParcelable(testParcel);
+ final TcpKeepalivePacketDataParcelable noScaleParsedParcelable =
+ KeepalivePacketDataUtil.parseTcpKeepalivePacketData(noScaleTestData);
+ final TcpKeepalivePacketData noScaleRoundTripData =
+ KeepalivePacketDataUtil.fromStableParcelable(noScaleParsedParcelable);
+ assertEquals(noScaleTestData, noScaleRoundTripData);
+ assertTrue(noScaleTestData.getPacket().length > 0);
+ assertArrayEquals(noScaleTestData.getPacket(), noScaleRoundTripData.getPacket());
+ }
}
diff --git a/tests/net/java/android/net/MacAddressTest.java b/tests/net/java/android/net/MacAddressTest.java
index 91c9a2a38036..6de31f6b4be1 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.assertFalse;
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 3158cc8637e4..7748288aeb05 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 @@ public class NetworkUtilsTest {
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 000000000000..3cfecd552967
--- /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 8c403f1b6898..a613e5e332fc 100644
--- a/tests/net/java/com/android/server/ConnectivityServiceTest.java
+++ b/tests/net/java/com/android/server/ConnectivityServiceTest.java
@@ -39,6 +39,7 @@ import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_MOBILE_FOTA;
import static android.net.ConnectivityManager.TYPE_MOBILE_MMS;
import static android.net.ConnectivityManager.TYPE_MOBILE_SUPL;
+import static android.net.ConnectivityManager.TYPE_VPN;
import static android.net.ConnectivityManager.TYPE_WIFI;
import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_DNS;
import static android.net.INetworkMonitor.NETWORK_VALIDATION_PROBE_FALLBACK;
@@ -101,6 +102,8 @@ 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.AdditionalMatchers.aryEq;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.argThat;
@@ -132,6 +135,7 @@ import android.app.AppOpsManager;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
+import android.content.ComponentName;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.Context;
@@ -140,6 +144,8 @@ import android.content.IntentFilter;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
+import android.content.pm.ResolveInfo;
+import android.content.pm.ServiceInfo;
import android.content.pm.UserInfo;
import android.content.res.Resources;
import android.location.LocationManager;
@@ -176,6 +182,7 @@ import android.net.NetworkAgentConfig;
import android.net.NetworkCapabilities;
import android.net.NetworkFactory;
import android.net.NetworkInfo;
+import android.net.NetworkInfo.DetailedState;
import android.net.NetworkRequest;
import android.net.NetworkSpecifier;
import android.net.NetworkStack;
@@ -332,12 +339,13 @@ public class ConnectivityServiceTest {
private static final String WIFI_WOL_IFNAME = "test_wlan_wol";
private static final String VPN_IFNAME = "tun10042";
private static final String TEST_PACKAGE_NAME = "com.android.test.package";
- private static final String[] EMPTY_STRING_ARRAY = new String[0];
+ private static final String ALWAYS_ON_PACKAGE = "com.android.test.alwaysonvpn";
private static final String INTERFACE_NAME = "interface";
private MockContext mServiceContext;
private HandlerThread mCsHandlerThread;
+ private ConnectivityService.Dependencies mDeps;
private ConnectivityService mService;
private WrappedConnectivityManager mCm;
private TestNetworkAgentWrapper mWiFiNetworkAgent;
@@ -353,6 +361,7 @@ public class ConnectivityServiceTest {
@Mock IIpConnectivityMetrics mIpConnectivityMetrics;
@Mock IpConnectivityMetrics.Logger mMetricsService;
@Mock DefaultNetworkMetrics mDefaultNetworkMetrics;
+ @Mock DeviceIdleInternal mDeviceIdleInternal;
@Mock INetworkManagementService mNetworkManagementService;
@Mock INetworkStatsService mStatsService;
@Mock IBatteryStats mBatteryStatsService;
@@ -450,6 +459,15 @@ public class ConnectivityServiceTest {
}
@Override
+ public ComponentName startService(Intent service) {
+ final String action = service.getAction();
+ if (!VpnConfig.SERVICE_INTERFACE.equals(action)) {
+ fail("Attempt to start unknown service, action=" + action);
+ }
+ return new ComponentName(service.getPackage(), "com.android.test.Service");
+ }
+
+ @Override
public Object getSystemService(String name) {
if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm;
if (Context.NOTIFICATION_SERVICE.equals(name)) return mNotificationManager;
@@ -1055,9 +1073,19 @@ public class ConnectivityServiceTest {
private VpnInfo mVpnInfo;
public MockVpn(int userId) {
- super(startHandlerThreadAndReturnLooper(), mServiceContext, mNetworkManagementService,
- mMockNetd, userId, mock(KeyStore.class));
- mConfig = new VpnConfig();
+ super(startHandlerThreadAndReturnLooper(), mServiceContext,
+ new Dependencies() {
+ @Override
+ public boolean isCallerSystem() {
+ return true;
+ }
+
+ @Override
+ public DeviceIdleInternal getDeviceIdleInternal() {
+ return mDeviceIdleInternal;
+ }
+ },
+ mNetworkManagementService, mMockNetd, userId, mock(KeyStore.class));
}
public void setUids(Set<UidRange> uids) {
@@ -1086,9 +1114,16 @@ public class ConnectivityServiceTest {
return mVpnType;
}
+ private LinkProperties makeLinkProperties() {
+ final LinkProperties lp = new LinkProperties();
+ lp.setInterfaceName(VPN_IFNAME);
+ return lp;
+ }
+
private void registerAgent(boolean isAlwaysMetered, Set<UidRange> uids, LinkProperties lp)
throws Exception {
if (mAgentRegistered) throw new IllegalStateException("already registered");
+ mConfig = new VpnConfig();
setUids(uids);
if (!isAlwaysMetered) mNetworkCapabilities.addCapability(NET_CAPABILITY_NOT_METERED);
mInterface = VPN_IFNAME;
@@ -1101,12 +1136,13 @@ public class ConnectivityServiceTest {
verify(mMockNetd, never())
.networkRemoveUidRanges(eq(mMockVpn.getNetId()), any());
mAgentRegistered = true;
+ updateState(NetworkInfo.DetailedState.CONNECTED, "registerAgent");
mNetworkCapabilities.set(mMockNetworkAgent.getNetworkCapabilities());
mNetworkAgent = mMockNetworkAgent.getNetworkAgent();
}
private void registerAgent(Set<UidRange> uids) throws Exception {
- registerAgent(false /* isAlwaysMetered */, uids, new LinkProperties());
+ registerAgent(false /* isAlwaysMetered */, uids, makeLinkProperties());
}
private void connect(boolean validated, boolean hasInternet, boolean isStrictMode) {
@@ -1142,12 +1178,12 @@ public class ConnectivityServiceTest {
public void establishForMyUid(boolean validated, boolean hasInternet, boolean isStrictMode)
throws Exception {
final int uid = Process.myUid();
- establish(new LinkProperties(), uid, uidRangesForUid(uid), validated, hasInternet,
+ establish(makeLinkProperties(), uid, uidRangesForUid(uid), validated, hasInternet,
isStrictMode);
}
public void establishForMyUid() throws Exception {
- establishForMyUid(new LinkProperties());
+ establishForMyUid(makeLinkProperties());
}
public void sendLinkProperties(LinkProperties lp) {
@@ -1155,7 +1191,10 @@ public class ConnectivityServiceTest {
}
public void disconnect() {
- if (mMockNetworkAgent != null) mMockNetworkAgent.disconnect();
+ if (mMockNetworkAgent != null) {
+ mMockNetworkAgent.disconnect();
+ updateState(NetworkInfo.DetailedState.DISCONNECTED, "disconnect");
+ }
mAgentRegistered = false;
}
@@ -1229,6 +1268,17 @@ public class ConnectivityServiceTest {
fail("ConditionVariable was blocked for more than " + TIMEOUT_MS + "ms");
}
+ private void registerNetworkCallbackAsUid(NetworkRequest request, NetworkCallback callback,
+ int uid) {
+ when(mDeps.getCallingUid()).thenReturn(uid);
+ try {
+ mCm.registerNetworkCallback(request, callback);
+ waitForIdle();
+ } finally {
+ returnRealCallingUid();
+ }
+ }
+
private static final int VPN_USER = 0;
private static final int APP1_UID = UserHandle.getUid(VPN_USER, 10100);
private static final int APP2_UID = UserHandle.getUid(VPN_USER, 10101);
@@ -1271,7 +1321,8 @@ public class ConnectivityServiceTest {
initAlarmManager(mAlarmManager, mAlarmManagerThread.getThreadHandler());
mCsHandlerThread = new HandlerThread("TestConnectivityService");
- final ConnectivityService.Dependencies deps = makeDependencies();
+ mDeps = makeDependencies();
+ returnRealCallingUid();
mService = new ConnectivityService(mServiceContext,
mNetworkManagementService,
mStatsService,
@@ -1279,9 +1330,9 @@ public class ConnectivityServiceTest {
mMockDnsResolver,
mock(IpConnectivityLog.class),
mMockNetd,
- deps);
+ mDeps);
mService.mLingerDelayMs = TEST_LINGER_DELAY_MS;
- verify(deps).makeMultinetworkPolicyTracker(any(), any(), any());
+ verify(mDeps).makeMultinetworkPolicyTracker(any(), any(), any());
final ArgumentCaptor<INetworkPolicyListener> policyListenerCaptor =
ArgumentCaptor.forClass(INetworkPolicyListener.class);
@@ -1301,6 +1352,10 @@ public class ConnectivityServiceTest {
setPrivateDnsSettings(PRIVATE_DNS_MODE_OFF, "ignored.example.com");
}
+ private void returnRealCallingUid() {
+ doAnswer((invocationOnMock) -> Binder.getCallingUid()).when(mDeps).getCallingUid();
+ }
+
private ConnectivityService.Dependencies makeDependencies() {
doReturn(TEST_TCP_INIT_RWND).when(mSystemProperties)
.getInt("net.tcp.default_init_rwnd", 0);
@@ -1376,13 +1431,13 @@ public class ConnectivityServiceTest {
}
private void mockDefaultPackages() throws Exception {
- final String testPackageName = mContext.getPackageName();
- final PackageInfo testPackageInfo = mContext.getPackageManager().getPackageInfo(
- testPackageName, PackageManager.GET_PERMISSIONS);
+ final String myPackageName = mContext.getPackageName();
+ final PackageInfo myPackageInfo = mContext.getPackageManager().getPackageInfo(
+ myPackageName, PackageManager.GET_PERMISSIONS);
when(mPackageManager.getPackagesForUid(Binder.getCallingUid())).thenReturn(
- new String[] {testPackageName});
- when(mPackageManager.getPackageInfoAsUser(eq(testPackageName), anyInt(),
- eq(UserHandle.getCallingUserId()))).thenReturn(testPackageInfo);
+ new String[] {myPackageName});
+ when(mPackageManager.getPackageInfoAsUser(eq(myPackageName), anyInt(),
+ eq(UserHandle.getCallingUserId()))).thenReturn(myPackageInfo);
when(mPackageManager.getInstalledPackages(eq(GET_PERMISSIONS | MATCH_ANY_USER))).thenReturn(
Arrays.asList(new PackageInfo[] {
@@ -1390,6 +1445,25 @@ public class ConnectivityServiceTest {
buildPackageInfo(/* SYSTEM */ false, APP2_UID),
buildPackageInfo(/* SYSTEM */ false, VPN_UID)
}));
+
+ // Create a fake always-on VPN package.
+ final int userId = UserHandle.getCallingUserId();
+ final ApplicationInfo applicationInfo = new ApplicationInfo();
+ applicationInfo.targetSdkVersion = Build.VERSION_CODES.R; // Always-on supported in N+.
+ when(mPackageManager.getApplicationInfoAsUser(eq(ALWAYS_ON_PACKAGE), anyInt(),
+ eq(userId))).thenReturn(applicationInfo);
+
+ // Minimal mocking to keep Vpn#isAlwaysOnPackageSupported happy.
+ ResolveInfo rInfo = new ResolveInfo();
+ rInfo.serviceInfo = new ServiceInfo();
+ rInfo.serviceInfo.metaData = new Bundle();
+ final List<ResolveInfo> services = Arrays.asList(new ResolveInfo[]{rInfo});
+ when(mPackageManager.queryIntentServicesAsUser(any(), eq(PackageManager.GET_META_DATA),
+ eq(userId))).thenReturn(services);
+ when(mPackageManager.getPackageUidAsUser(TEST_PACKAGE_NAME, userId))
+ .thenReturn(Process.myUid());
+ when(mPackageManager.getPackageUidAsUser(ALWAYS_ON_PACKAGE, userId))
+ .thenReturn(VPN_UID);
}
private void verifyActiveNetwork(int transport) {
@@ -2252,10 +2326,10 @@ public class ConnectivityServiceTest {
}
private void grantUsingBackgroundNetworksPermissionForUid(final int uid) throws Exception {
- final String testPackageName = mContext.getPackageName();
- when(mPackageManager.getPackageInfo(eq(testPackageName), eq(GET_PERMISSIONS)))
+ final String myPackageName = mContext.getPackageName();
+ when(mPackageManager.getPackageInfo(eq(myPackageName), eq(GET_PERMISSIONS)))
.thenReturn(buildPackageInfo(true, uid));
- mService.mPermissionMonitor.onPackageAdded(testPackageName, uid);
+ mService.mPermissionMonitor.onPackageAdded(myPackageName, uid);
}
@Test
@@ -4668,11 +4742,9 @@ public class ConnectivityServiceTest {
@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();
@@ -5831,10 +5903,21 @@ public class ConnectivityServiceTest {
assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
}
+ private void assertDefaultNetworkCapabilities(int userId, NetworkAgentWrapper... networks) {
+ final NetworkCapabilities[] defaultCaps = mService.getDefaultNetworkCapabilitiesForUser(
+ userId, "com.android.calling.package");
+ final String defaultCapsString = Arrays.toString(defaultCaps);
+ assertEquals(defaultCapsString, defaultCaps.length, networks.length);
+ final Set<NetworkCapabilities> defaultCapsSet = new ArraySet<>(defaultCaps);
+ for (NetworkAgentWrapper network : networks) {
+ final NetworkCapabilities nc = mCm.getNetworkCapabilities(network.getNetwork());
+ final String msg = "Did not find " + nc + " in " + Arrays.toString(defaultCaps);
+ assertTrue(msg, defaultCapsSet.contains(nc));
+ }
+ }
+
@Test
public void testVpnSetUnderlyingNetworks() throws Exception {
- final int uid = Process.myUid();
-
final TestNetworkCallback vpnNetworkCallback = new TestNetworkCallback();
final NetworkRequest vpnNetworkRequest = new NetworkRequest.Builder()
.removeCapability(NET_CAPABILITY_NOT_VPN)
@@ -5857,6 +5940,9 @@ public class ConnectivityServiceTest {
// A VPN without underlying networks is not suspended.
assertTrue(nc.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+ final int userId = UserHandle.getUserId(Process.myUid());
+ assertDefaultNetworkCapabilities(userId /* no networks */);
+
// Connect cell and use it as an underlying network.
mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
mCellNetworkAgent.addCapability(NET_CAPABILITY_NOT_SUSPENDED);
@@ -5870,6 +5956,7 @@ public class ConnectivityServiceTest {
&& caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI)
&& !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
&& caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+ assertDefaultNetworkCapabilities(userId, mCellNetworkAgent);
mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
mWiFiNetworkAgent.addCapability(NET_CAPABILITY_NOT_METERED);
@@ -5884,6 +5971,7 @@ public class ConnectivityServiceTest {
&& caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI)
&& !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
&& caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+ assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
// Don't disconnect, but note the VPN is not using wifi any more.
mService.setUnderlyingNetworksForVpn(
@@ -5894,6 +5982,9 @@ public class ConnectivityServiceTest {
&& caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI)
&& !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
&& caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+ // The return value of getDefaultNetworkCapabilitiesForUser always includes the default
+ // network (wifi) as well as the underlying networks (cell).
+ assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
// Remove NOT_SUSPENDED from the only network and observe VPN is now suspended.
mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_SUSPENDED);
@@ -5922,6 +6013,7 @@ public class ConnectivityServiceTest {
&& !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI)
&& caps.hasCapability(NET_CAPABILITY_NOT_METERED)
&& caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+ assertDefaultNetworkCapabilities(userId, mWiFiNetworkAgent);
// Use both again.
mService.setUnderlyingNetworksForVpn(
@@ -5932,6 +6024,7 @@ public class ConnectivityServiceTest {
&& caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI)
&& !caps.hasCapability(NET_CAPABILITY_NOT_METERED)
&& caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
+ assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
// Cell is suspended again. As WiFi is not, this should not cause a callback.
mCellNetworkAgent.removeCapability(NET_CAPABILITY_NOT_SUSPENDED);
@@ -5949,6 +6042,7 @@ public class ConnectivityServiceTest {
// a bug in ConnectivityService, but as the SUSPENDED and RESUMED callbacks have never
// been public and are deprecated and slated for removal, there is no sense in spending
// resources fixing this bug now.
+ assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
// Use both again.
mService.setUnderlyingNetworksForVpn(
@@ -5961,6 +6055,7 @@ public class ConnectivityServiceTest {
&& caps.hasCapability(NET_CAPABILITY_NOT_SUSPENDED));
// As above, the RESUMED callback not being sent here is a bug, but not a bug that's
// worth anybody's time to fix.
+ assertDefaultNetworkCapabilities(userId, mCellNetworkAgent, mWiFiNetworkAgent);
// Disconnect cell. Receive update without even removing the dead network from the
// underlying networks – it's dead anyway. Not metered any more.
@@ -5969,6 +6064,7 @@ public class ConnectivityServiceTest {
(caps) -> caps.hasTransport(TRANSPORT_VPN)
&& !caps.hasTransport(TRANSPORT_CELLULAR) && caps.hasTransport(TRANSPORT_WIFI)
&& caps.hasCapability(NET_CAPABILITY_NOT_METERED));
+ assertDefaultNetworkCapabilities(userId, mWiFiNetworkAgent);
// Disconnect wifi too. No underlying networks means this is now metered.
mWiFiNetworkAgent.disconnect();
@@ -5976,6 +6072,11 @@ public class ConnectivityServiceTest {
(caps) -> caps.hasTransport(TRANSPORT_VPN)
&& !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI)
&& !caps.hasCapability(NET_CAPABILITY_NOT_METERED));
+ // When a network disconnects, the callbacks are fired before all state is updated, so for a
+ // short time, synchronous calls will behave as if the network is still connected. Wait for
+ // things to settle.
+ waitForIdle();
+ assertDefaultNetworkCapabilities(userId /* no networks */);
mMockVpn.disconnect();
}
@@ -6276,6 +6377,7 @@ public class ConnectivityServiceTest {
// Despite VPN using WiFi (which is unmetered), VPN itself is marked as always metered.
assertTrue(mCm.isActiveNetworkMetered());
+
// VPN explicitly declares WiFi as its underlying network.
mService.setUnderlyingNetworksForVpn(
new Network[] { mWiFiNetworkAgent.getNetwork() });
@@ -6389,6 +6491,189 @@ public class ConnectivityServiceTest {
mCm.unregisterNetworkCallback(defaultCallback);
}
+ private void expectNetworkRejectNonSecureVpn(InOrder inOrder, boolean add,
+ UidRangeParcel... expected) throws Exception {
+ inOrder.verify(mMockNetd).networkRejectNonSecureVpn(eq(add), aryEq(expected));
+ }
+
+ private void checkNetworkInfo(NetworkInfo ni, int type, DetailedState state) {
+ assertNotNull(ni);
+ assertEquals(type, ni.getType());
+ assertEquals(ConnectivityManager.getNetworkTypeName(type), state, ni.getDetailedState());
+ }
+
+ private void assertActiveNetworkInfo(int type, DetailedState state) {
+ checkNetworkInfo(mCm.getActiveNetworkInfo(), type, state);
+ }
+ private void assertNetworkInfo(int type, DetailedState state) {
+ checkNetworkInfo(mCm.getNetworkInfo(type), type, state);
+ }
+
+ @Test
+ public void testNetworkBlockedStatusAlwaysOnVpn() throws Exception {
+ mServiceContext.setPermission(
+ Manifest.permission.CONTROL_ALWAYS_ON_VPN, PERMISSION_GRANTED);
+ mServiceContext.setPermission(
+ Manifest.permission.CONTROL_VPN, PERMISSION_GRANTED);
+ mServiceContext.setPermission(
+ Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
+
+ final TestNetworkCallback callback = new TestNetworkCallback();
+ final NetworkRequest request = new NetworkRequest.Builder()
+ .removeCapability(NET_CAPABILITY_NOT_VPN)
+ .build();
+ mCm.registerNetworkCallback(request, callback);
+
+ final TestNetworkCallback defaultCallback = new TestNetworkCallback();
+ mCm.registerDefaultNetworkCallback(defaultCallback);
+
+ final TestNetworkCallback vpnUidCallback = new TestNetworkCallback();
+ final NetworkRequest vpnUidRequest = new NetworkRequest.Builder().build();
+ registerNetworkCallbackAsUid(vpnUidRequest, vpnUidCallback, VPN_UID);
+
+ final int uid = Process.myUid();
+ final int userId = UserHandle.getUserId(uid);
+ final ArrayList<String> allowList = new ArrayList<>();
+ mService.setAlwaysOnVpnPackage(userId, ALWAYS_ON_PACKAGE, true /* lockdown */, allowList);
+
+ UidRangeParcel firstHalf = new UidRangeParcel(1, VPN_UID - 1);
+ UidRangeParcel secondHalf = new UidRangeParcel(VPN_UID + 1, 99999);
+ InOrder inOrder = inOrder(mMockNetd);
+ expectNetworkRejectNonSecureVpn(inOrder, true, firstHalf, secondHalf);
+
+ // Connect a network when lockdown is active, expect to see it blocked.
+ mWiFiNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_WIFI);
+ mWiFiNetworkAgent.connect(false /* validated */);
+ callback.expectAvailableCallbacksUnvalidatedAndBlocked(mWiFiNetworkAgent);
+ defaultCallback.expectAvailableCallbacksUnvalidatedAndBlocked(mWiFiNetworkAgent);
+ vpnUidCallback.expectAvailableCallbacksUnvalidated(mWiFiNetworkAgent);
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+ assertNull(mCm.getActiveNetwork());
+ assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+ // Mobile is BLOCKED even though it's not actually connected.
+ assertNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
+ assertNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+
+ // Disable lockdown, expect to see the network unblocked.
+ // There are no callbacks because they are not implemented yet.
+ mService.setAlwaysOnVpnPackage(userId, null, false /* lockdown */, allowList);
+ expectNetworkRejectNonSecureVpn(inOrder, false, firstHalf, secondHalf);
+ vpnUidCallback.assertNoCallback();
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+ assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+ assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+ assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+ // Add our UID to the allowlist and re-enable lockdown, expect network is not blocked.
+ allowList.add(TEST_PACKAGE_NAME);
+ mService.setAlwaysOnVpnPackage(userId, ALWAYS_ON_PACKAGE, true /* lockdown */, allowList);
+ callback.assertNoCallback();
+ defaultCallback.assertNoCallback();
+ vpnUidCallback.assertNoCallback();
+
+ // The following requires that the UID of this test package is greater than VPN_UID. This
+ // is always true in practice because a plain AOSP build with no apps installed has almost
+ // 200 packages installed.
+ final UidRangeParcel piece1 = new UidRangeParcel(1, VPN_UID - 1);
+ final UidRangeParcel piece2 = new UidRangeParcel(VPN_UID + 1, uid - 1);
+ final UidRangeParcel piece3 = new UidRangeParcel(uid + 1, 99999);
+ expectNetworkRejectNonSecureVpn(inOrder, true, piece1, piece2, piece3);
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+ assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+ assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+ assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+ // Connect a new network, expect it to be unblocked.
+ mCellNetworkAgent = new TestNetworkAgentWrapper(TRANSPORT_CELLULAR);
+ mCellNetworkAgent.connect(false /* validated */);
+ callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
+ defaultCallback.assertNoCallback();
+ vpnUidCallback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+ assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+ // Cellular is DISCONNECTED because it's not the default and there are no requests for it.
+ assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+ assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+ // Disable lockdown, remove our UID from the allowlist, and re-enable lockdown.
+ // Everything should now be blocked.
+ mService.setAlwaysOnVpnPackage(userId, null, false /* lockdown */, allowList);
+ expectNetworkRejectNonSecureVpn(inOrder, false, piece1, piece2, piece3);
+ allowList.clear();
+ mService.setAlwaysOnVpnPackage(userId, ALWAYS_ON_PACKAGE, true /* lockdown */, allowList);
+ expectNetworkRejectNonSecureVpn(inOrder, true, firstHalf, secondHalf);
+ vpnUidCallback.assertNoCallback();
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+ assertNull(mCm.getActiveNetwork());
+ assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+ assertNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
+ assertNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+
+ // Disable lockdown. Everything is unblocked.
+ mService.setAlwaysOnVpnPackage(userId, null, false /* lockdown */, allowList);
+ vpnUidCallback.assertNoCallback();
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+ assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+ assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+ assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+ // Enable and disable an always-on VPN package without lockdown. Expect no changes.
+ reset(mMockNetd);
+ mService.setAlwaysOnVpnPackage(userId, ALWAYS_ON_PACKAGE, false /* lockdown */, allowList);
+ inOrder.verify(mMockNetd, never()).networkRejectNonSecureVpn(anyBoolean(), any());
+ callback.assertNoCallback();
+ defaultCallback.assertNoCallback();
+ vpnUidCallback.assertNoCallback();
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+ assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+ assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+ assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+ mService.setAlwaysOnVpnPackage(userId, null, false /* lockdown */, allowList);
+ inOrder.verify(mMockNetd, never()).networkRejectNonSecureVpn(anyBoolean(), any());
+ callback.assertNoCallback();
+ defaultCallback.assertNoCallback();
+ vpnUidCallback.assertNoCallback();
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetwork());
+ assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+ assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+ assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+ // Enable lockdown and connect a VPN. The VPN is not blocked.
+ mService.setAlwaysOnVpnPackage(userId, ALWAYS_ON_PACKAGE, true /* lockdown */, allowList);
+ vpnUidCallback.assertNoCallback();
+ assertEquals(mWiFiNetworkAgent.getNetwork(), mCm.getActiveNetworkForUid(VPN_UID));
+ assertNull(mCm.getActiveNetwork());
+ assertActiveNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+ assertNetworkInfo(TYPE_MOBILE, DetailedState.BLOCKED);
+ assertNetworkInfo(TYPE_WIFI, DetailedState.BLOCKED);
+
+ mMockVpn.establishForMyUid();
+ defaultCallback.expectAvailableThenValidatedCallbacks(mMockVpn);
+ vpnUidCallback.assertNoCallback(); // vpnUidCallback has NOT_VPN capability.
+ assertEquals(mMockVpn.getNetwork(), mCm.getActiveNetwork());
+ assertEquals(null, mCm.getActiveNetworkForUid(VPN_UID)); // BUG?
+ assertActiveNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+ assertNetworkInfo(TYPE_MOBILE, DetailedState.DISCONNECTED);
+ assertNetworkInfo(TYPE_VPN, DetailedState.CONNECTED);
+ assertNetworkInfo(TYPE_WIFI, DetailedState.CONNECTED);
+
+ mMockVpn.disconnect();
+ defaultCallback.expectCallback(CallbackEntry.LOST, mMockVpn);
+ defaultCallback.expectAvailableCallbacksUnvalidatedAndBlocked(mWiFiNetworkAgent);
+ assertNull(mCm.getActiveNetwork());
+
+ mCm.unregisterNetworkCallback(callback);
+ mCm.unregisterNetworkCallback(defaultCallback);
+ mCm.unregisterNetworkCallback(vpnUidCallback);
+ }
+
@Test
public final void testLoseTrusted() throws Exception {
final NetworkRequest trustedRequest = new NetworkRequest.Builder()
@@ -7822,7 +8107,16 @@ public class ConnectivityServiceTest {
@Test
public void testDumpDoesNotCrash() {
- StringWriter stringWriter = new StringWriter();
+ // Filing a couple requests prior to testing the dump.
+ final TestNetworkCallback genericNetworkCallback = new TestNetworkCallback();
+ final TestNetworkCallback wifiNetworkCallback = new TestNetworkCallback();
+ final NetworkRequest genericRequest = new NetworkRequest.Builder()
+ .clearCapabilities().build();
+ final NetworkRequest wifiRequest = new NetworkRequest.Builder()
+ .addTransportType(TRANSPORT_WIFI).build();
+ mCm.registerNetworkCallback(genericRequest, genericNetworkCallback);
+ mCm.registerNetworkCallback(wifiRequest, wifiNetworkCallback);
+ final StringWriter stringWriter = new StringWriter();
mService.dump(new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
@@ -7844,11 +8138,11 @@ public class ConnectivityServiceTest {
mCm.registerNetworkCallback(wifiRequest, wifiNetworkCallback);
mCm.registerNetworkCallback(cellRequest, cellNetworkCallback);
- ConnectivityService.NetworkRequestInfo[] nriOutput = mService.requestsSortedById();
+ final ConnectivityService.NetworkRequestInfo[] nriOutput = mService.requestsSortedById();
assertTrue(nriOutput.length > 1);
for (int i = 0; i < nriOutput.length - 1; i++) {
- boolean isRequestIdInOrder =
+ final boolean isRequestIdInOrder =
nriOutput[i].mRequests.get(0).requestId
< nriOutput[i + 1].mRequests.get(0).requestId;
assertTrue(isRequestIdInOrder);
diff --git a/tests/net/java/com/android/server/NetworkManagementServiceTest.java b/tests/net/java/com/android/server/NetworkManagementServiceTest.java
index ea763d2e931e..13516d75a50d 100644
--- a/tests/net/java/com/android/server/NetworkManagementServiceTest.java
+++ b/tests/net/java/com/android/server/NetworkManagementServiceTest.java
@@ -68,11 +68,12 @@ import java.util.function.BiFunction;
@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 @@ public class NetworkManagementServiceTest {
/**
* 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 @@ public class NetworkManagementServiceTest {
assertFalse(mNMService.isFirewallEnabled());
}
- private static final int TEST_UID = 111;
-
@Test
public void testNetworkRestrictedDefault() {
assertFalse(mNMService.isNetworkRestricted(TEST_UID));
@@ -235,23 +234,23 @@ public class NetworkManagementServiceTest {
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/connectivity/VpnTest.java b/tests/net/java/com/android/server/connectivity/VpnTest.java
index 6e380be6c583..cc473175540c 100644
--- a/tests/net/java/com/android/server/connectivity/VpnTest.java
+++ b/tests/net/java/com/android/server/connectivity/VpnTest.java
@@ -228,7 +228,6 @@ public class VpnTest {
R.string.config_customVpnAlwaysOnDisconnectedDialogComponent));
when(mPackageManager.hasSystemFeature(PackageManager.FEATURE_IPSEC_TUNNELS))
.thenReturn(true);
- when(mSystemServices.isCallerSystem()).thenReturn(true);
// Used by {@link Notification.Builder}
ApplicationInfo applicationInfo = new ApplicationInfo();
@@ -1102,6 +1101,11 @@ public class VpnTest {
}
@Override
+ public boolean isCallerSystem() {
+ return true;
+ }
+
+ @Override
public void startService(final String serviceName) {
mRunningServices.put(serviceName, true);
}
diff --git a/tests/net/java/com/android/server/net/NetworkStatsCollectionTest.java b/tests/net/java/com/android/server/net/NetworkStatsCollectionTest.java
index fb0cfc0d50ba..89146f945e1f 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.TAG_NONE;
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/vcn/java/android/net/vcn/VcnConfigTest.java b/tests/vcn/java/android/net/vcn/VcnConfigTest.java
new file mode 100644
index 000000000000..77944deb26f1
--- /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 000000000000..e98b6ef2b3a6
--- /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 c91fdbffd760..1cc953239fed 100644
--- a/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
+++ b/tests/vcn/java/com/android/server/VcnManagementServiceTest.java
@@ -16,42 +16,123 @@
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;
+import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
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;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
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}. */
@RunWith(AndroidJUnit4.class)
@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 */,
+ "" /* iccId */,
+ 0 /* simSlotIndex */,
+ "Carrier" /* displayName */,
+ "Carrier" /* carrierName */,
+ 0 /* nameSource */,
+ 255 /* iconTint */,
+ "12345" /* number */,
+ 0 /* roaming */,
+ null /* icon */,
+ "0" /* mcc */,
+ "0" /* mnc */,
+ "0" /* countryIso */,
+ false /* isEmbedded */,
+ null /* nativeAccessRules */,
+ null /* cardString */,
+ false /* isOpportunistic */,
+ TEST_UUID_1.toString() /* groupUUID */,
+ 0 /* carrierId */,
+ 0 /* profileClass */);
+
private final Context mMockContext = mock(Context.class);
private final VcnManagementService.Dependencies mMockDeps =
mock(VcnManagementService.Dependencies.class);
private final TestLooper mTestLooper = new TestLooper();
private final ConnectivityManager mConnMgr = mock(ConnectivityManager.class);
+ 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() {
- doReturn(Context.CONNECTIVITY_SERVICE)
- .when(mMockContext)
- .getSystemServiceName(ConnectivityManager.class);
- doReturn(mConnMgr).when(mMockContext).getSystemService(Context.CONNECTIVITY_SERVICE);
+ public VcnManagementServiceTest() throws Exception {
+ setupSystemService(mConnMgr, Context.CONNECTIVITY_SERVICE, ConnectivityManager.class);
+ setupSystemService(mTelMgr, Context.TELEPHONY_SERVICE, TelephonyManager.class);
+ setupSystemService(
+ mSubMgr, Context.TELEPHONY_SUBSCRIPTION_SERVICE, SubscriptionManager.class);
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);
}
+ private void setupSystemService(Object service, String name, Class<?> serviceClass) {
+ doReturn(name).when(mMockContext).getSystemServiceName(serviceClass);
+ doReturn(service).when(mMockContext).getSystemService(name);
+ }
+
+ private void setupMockedCarrierPrivilege(boolean isPrivileged) {
+ doReturn(Collections.singletonList(TEST_SUBSCRIPTION_INFO))
+ .when(mSubMgr)
+ .getSubscriptionsInGroup(any());
+ doReturn(isPrivileged)
+ .when(mTelMgr)
+ .hasCarrierPrivileges(eq(TEST_SUBSCRIPTION_INFO.getSubscriptionId()));
+ }
+
@Test
public void testSystemReady() throws Exception {
mVcnMgmtSvc.systemReady();
@@ -59,4 +140,119 @@ public class VcnManagementServiceTest {
verify(mConnMgr)
.registerNetworkProvider(any(VcnManagementService.VcnNetworkProvider.class));
}
+
+ @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, VcnConfigTest.buildTestConfig());
+ fail("Expected IllegalStateException exception for system server");
+ } catch (IllegalStateException expected) {
+ }
+ }
+
+ @Test
+ public void testSetVcnConfigRequiresSystemUser() throws Exception {
+ doReturn(UserHandle.getUid(UserHandle.MIN_SECONDARY_USER_ID, Process.FIRST_APPLICATION_UID))
+ .when(mMockDeps)
+ .getBinderCallingUid();
+
+ try {
+ mVcnMgmtSvc.setVcnConfig(TEST_UUID_1, VcnConfigTest.buildTestConfig());
+ fail("Expected security exception for non system user");
+ } catch (SecurityException expected) {
+ }
+ }
+
+ @Test
+ public void testSetVcnConfigRequiresCarrierPrivileges() throws Exception {
+ setupMockedCarrierPrivilege(false);
+
+ try {
+ 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();
+
+ try {
+ mVcnMgmtSvc.clearVcnConfig(TEST_UUID_1);
+ fail("Expected IllegalStateException exception for system server");
+ } catch (IllegalStateException expected) {
+ }
+ }
+
+ @Test
+ public void testClearVcnConfigRequiresSystemUser() throws Exception {
+ doReturn(UserHandle.getUid(UserHandle.MIN_SECONDARY_USER_ID, Process.FIRST_APPLICATION_UID))
+ .when(mMockDeps)
+ .getBinderCallingUid();
+
+ try {
+ mVcnMgmtSvc.clearVcnConfig(TEST_UUID_1);
+ fail("Expected security exception for non system user");
+ } catch (SecurityException expected) {
+ }
+ }
+
+ @Test
+ public void testClearVcnConfigRequiresCarrierPrivileges() throws Exception {
+ setupMockedCarrierPrivilege(false);
+
+ try {
+ mVcnMgmtSvc.clearVcnConfig(TEST_UUID_1);
+ fail("Expected security exception for missing carrier privileges");
+ } 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/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
new file mode 100644
index 000000000000..17b8f64a13fa
--- /dev/null
+++ b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java
@@ -0,0 +1,333 @@
+/*
+ * 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.server.vcn;
+
+import static android.telephony.CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED;
+import static android.telephony.CarrierConfigManager.EXTRA_SLOT_INDEX;
+import static android.telephony.CarrierConfigManager.EXTRA_SUBSCRIPTION_INDEX;
+import static android.telephony.SubscriptionManager.INVALID_SIM_SLOT_INDEX;
+import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
+
+import static com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionSnapshot;
+import static com.android.server.vcn.TelephonySubscriptionTracker.TelephonySubscriptionTrackerCallback;
+
+import static org.junit.Assert.assertEquals;
+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.ArgumentMatchers.argThat;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+
+import android.annotation.NonNull;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.Handler;
+import android.os.HandlerExecutor;
+import android.os.ParcelUuid;
+import android.os.test.TestLooper;
+import android.telephony.CarrierConfigManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener;
+import android.util.ArraySet;
+
+import androidx.test.filters.SmallTest;
+import androidx.test.runner.AndroidJUnit4;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+
+/** Tests for TelephonySubscriptionTracker */
+@RunWith(AndroidJUnit4.class)
+@SmallTest
+public class TelephonySubscriptionTrackerTest {
+ private static final ParcelUuid TEST_PARCEL_UUID = new ParcelUuid(UUID.randomUUID());
+ private static final int TEST_SIM_SLOT_INDEX = 1;
+ private static final int TEST_SUBSCRIPTION_ID_1 = 2;
+ private static final SubscriptionInfo TEST_SUBINFO_1 = mock(SubscriptionInfo.class);
+ private static final int TEST_SUBSCRIPTION_ID_2 = 3;
+ private static final SubscriptionInfo TEST_SUBINFO_2 = mock(SubscriptionInfo.class);
+ private static final Map<Integer, ParcelUuid> TEST_SUBID_TO_GROUP_MAP;
+
+ static {
+ final Map<Integer, ParcelUuid> subIdToGroupMap = new HashMap<>();
+ subIdToGroupMap.put(TEST_SUBSCRIPTION_ID_1, TEST_PARCEL_UUID);
+ subIdToGroupMap.put(TEST_SUBSCRIPTION_ID_2, TEST_PARCEL_UUID);
+ TEST_SUBID_TO_GROUP_MAP = Collections.unmodifiableMap(subIdToGroupMap);
+ }
+
+ @NonNull private final Context mContext;
+ @NonNull private final TestLooper mTestLooper;
+ @NonNull private final Handler mHandler;
+ @NonNull private final TelephonySubscriptionTracker.Dependencies mDeps;
+
+ @NonNull private final SubscriptionManager mSubscriptionManager;
+ @NonNull private final CarrierConfigManager mCarrierConfigManager;
+
+ @NonNull private TelephonySubscriptionTrackerCallback mCallback;
+ @NonNull private TelephonySubscriptionTracker mTelephonySubscriptionTracker;
+
+ public TelephonySubscriptionTrackerTest() {
+ mContext = mock(Context.class);
+ mTestLooper = new TestLooper();
+ mHandler = new Handler(mTestLooper.getLooper());
+ mDeps = mock(TelephonySubscriptionTracker.Dependencies.class);
+
+ mSubscriptionManager = mock(SubscriptionManager.class);
+ mCarrierConfigManager = mock(CarrierConfigManager.class);
+
+ doReturn(Context.TELEPHONY_SUBSCRIPTION_SERVICE)
+ .when(mContext)
+ .getSystemServiceName(SubscriptionManager.class);
+ doReturn(mSubscriptionManager)
+ .when(mContext)
+ .getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE);
+
+ doReturn(Context.CARRIER_CONFIG_SERVICE)
+ .when(mContext)
+ .getSystemServiceName(CarrierConfigManager.class);
+ doReturn(mCarrierConfigManager)
+ .when(mContext)
+ .getSystemService(Context.CARRIER_CONFIG_SERVICE);
+
+ // subId 1, 2 are in same subGrp, only subId 1 is active
+ doReturn(TEST_PARCEL_UUID).when(TEST_SUBINFO_1).getGroupUuid();
+ doReturn(TEST_PARCEL_UUID).when(TEST_SUBINFO_2).getGroupUuid();
+ doReturn(TEST_SIM_SLOT_INDEX).when(TEST_SUBINFO_1).getSimSlotIndex();
+ doReturn(INVALID_SIM_SLOT_INDEX).when(TEST_SUBINFO_2).getSimSlotIndex();
+ doReturn(TEST_SUBSCRIPTION_ID_1).when(TEST_SUBINFO_1).getSubscriptionId();
+ doReturn(TEST_SUBSCRIPTION_ID_2).when(TEST_SUBINFO_2).getSubscriptionId();
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ mCallback = mock(TelephonySubscriptionTrackerCallback.class);
+ mTelephonySubscriptionTracker =
+ new TelephonySubscriptionTracker(mContext, mHandler, mCallback, mDeps);
+ mTelephonySubscriptionTracker.register();
+
+ doReturn(true).when(mDeps).isConfigForIdentifiedCarrier(any());
+ doReturn(Arrays.asList(TEST_SUBINFO_1, TEST_SUBINFO_2))
+ .when(mSubscriptionManager)
+ .getAllSubscriptionInfoList();
+ }
+
+ private IntentFilter getIntentFilter() {
+ final ArgumentCaptor<IntentFilter> captor = ArgumentCaptor.forClass(IntentFilter.class);
+ verify(mContext).registerReceiver(any(), captor.capture(), any(), any());
+
+ return captor.getValue();
+ }
+
+ private OnSubscriptionsChangedListener getOnSubscriptionsChangedListener() {
+ final ArgumentCaptor<OnSubscriptionsChangedListener> captor =
+ ArgumentCaptor.forClass(OnSubscriptionsChangedListener.class);
+ verify(mSubscriptionManager).addOnSubscriptionsChangedListener(any(), captor.capture());
+
+ return captor.getValue();
+ }
+
+ private Intent buildTestBroadcastIntent(boolean hasValidSubscription) {
+ Intent intent = new Intent(ACTION_CARRIER_CONFIG_CHANGED);
+ intent.putExtra(EXTRA_SLOT_INDEX, TEST_SIM_SLOT_INDEX);
+ intent.putExtra(
+ EXTRA_SUBSCRIPTION_INDEX,
+ hasValidSubscription ? TEST_SUBSCRIPTION_ID_1 : INVALID_SUBSCRIPTION_ID);
+
+ return intent;
+ }
+
+ private TelephonySubscriptionSnapshot buildExpectedSnapshot(Set<ParcelUuid> activeSubGroups) {
+ return buildExpectedSnapshot(TEST_SUBID_TO_GROUP_MAP, activeSubGroups);
+ }
+
+ private TelephonySubscriptionSnapshot buildExpectedSnapshot(
+ Map<Integer, ParcelUuid> subIdToGroupMap, Set<ParcelUuid> activeSubGroups) {
+ return new TelephonySubscriptionSnapshot(subIdToGroupMap, activeSubGroups);
+ }
+
+ private void verifyNoActiveSubscriptions() {
+ verify(mCallback).onNewSnapshot(
+ argThat(snapshot -> snapshot.getActiveSubscriptionGroups().isEmpty()));
+ }
+
+ private void setupReadySubIds() {
+ mTelephonySubscriptionTracker.setReadySubIdsBySlotId(
+ Collections.singletonMap(TEST_SIM_SLOT_INDEX, TEST_SUBSCRIPTION_ID_1));
+ }
+
+ @Test
+ public void testRegister() throws Exception {
+ verify(mContext)
+ .registerReceiver(
+ eq(mTelephonySubscriptionTracker),
+ any(IntentFilter.class),
+ any(),
+ eq(mHandler));
+ final IntentFilter filter = getIntentFilter();
+ assertEquals(1, filter.countActions());
+ assertTrue(filter.hasAction(ACTION_CARRIER_CONFIG_CHANGED));
+
+ verify(mSubscriptionManager)
+ .addOnSubscriptionsChangedListener(any(HandlerExecutor.class), any());
+ assertNotNull(getOnSubscriptionsChangedListener());
+ }
+
+ @Test
+ public void testUnregister() throws Exception {
+ mTelephonySubscriptionTracker.unregister();
+
+ verify(mContext).unregisterReceiver(eq(mTelephonySubscriptionTracker));
+
+ final OnSubscriptionsChangedListener listener = getOnSubscriptionsChangedListener();
+ verify(mSubscriptionManager).removeOnSubscriptionsChangedListener(eq(listener));
+ }
+
+ @Test
+ public void testOnSubscriptionsChangedFired_NoReadySubIds() throws Exception {
+ final OnSubscriptionsChangedListener listener = getOnSubscriptionsChangedListener();
+ listener.onSubscriptionsChanged();
+ mTestLooper.dispatchAll();
+
+ verifyNoActiveSubscriptions();
+ }
+
+ @Test
+ public void testOnSubscriptionsChangedFired_WithReadySubIds() throws Exception {
+ setupReadySubIds();
+
+ final OnSubscriptionsChangedListener listener = getOnSubscriptionsChangedListener();
+ listener.onSubscriptionsChanged();
+ mTestLooper.dispatchAll();
+
+ final Set<ParcelUuid> activeSubGroups = Collections.singleton(TEST_PARCEL_UUID);
+ verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(activeSubGroups)));
+ }
+
+ @Test
+ public void testReceiveBroadcast_ConfigReadyWithSubscriptions() throws Exception {
+ mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ mTestLooper.dispatchAll();
+
+ final Set<ParcelUuid> activeSubGroups = Collections.singleton(TEST_PARCEL_UUID);
+ verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(activeSubGroups)));
+ }
+
+ @Test
+ public void testReceiveBroadcast_ConfigReadyNoSubscriptions() throws Exception {
+ doReturn(new ArrayList<SubscriptionInfo>())
+ .when(mSubscriptionManager)
+ .getAllSubscriptionInfoList();
+
+ mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ mTestLooper.dispatchAll();
+
+ // Expect an empty snapshot
+ verify(mCallback).onNewSnapshot(
+ eq(buildExpectedSnapshot(Collections.emptyMap(), Collections.emptySet())));
+ }
+
+ @Test
+ public void testReceiveBroadcast_SlotCleared() throws Exception {
+ setupReadySubIds();
+
+ mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(false));
+ mTestLooper.dispatchAll();
+
+ verifyNoActiveSubscriptions();
+ assertTrue(mTelephonySubscriptionTracker.getReadySubIdsBySlotId().isEmpty());
+ }
+
+ @Test
+ public void testReceiveBroadcast_ConfigNotReady() throws Exception {
+ doReturn(false).when(mDeps).isConfigForIdentifiedCarrier(any());
+
+ mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ mTestLooper.dispatchAll();
+
+ // No interactions expected; config was not loaded
+ verifyNoMoreInteractions(mCallback);
+ }
+
+ @Test
+ public void testSubscriptionsClearedAfterValidTriggersCallbacks() throws Exception {
+ final Set<ParcelUuid> activeSubGroups = Collections.singleton(TEST_PARCEL_UUID);
+
+ mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ mTestLooper.dispatchAll();
+ verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(activeSubGroups)));
+ assertNotNull(
+ mTelephonySubscriptionTracker.getReadySubIdsBySlotId().get(TEST_SIM_SLOT_INDEX));
+
+ doReturn(Collections.emptyList()).when(mSubscriptionManager).getAllSubscriptionInfoList();
+ mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ mTestLooper.dispatchAll();
+ verify(mCallback).onNewSnapshot(
+ eq(buildExpectedSnapshot(Collections.emptyMap(), Collections.emptySet())));
+ }
+
+ @Test
+ public void testSlotClearedAfterValidTriggersCallbacks() throws Exception {
+ final Set<ParcelUuid> activeSubGroups = Collections.singleton(TEST_PARCEL_UUID);
+
+ mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(true));
+ mTestLooper.dispatchAll();
+ verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(activeSubGroups)));
+ assertNotNull(
+ mTelephonySubscriptionTracker.getReadySubIdsBySlotId().get(TEST_SIM_SLOT_INDEX));
+
+ mTelephonySubscriptionTracker.onReceive(mContext, buildTestBroadcastIntent(false));
+ mTestLooper.dispatchAll();
+ verify(mCallback).onNewSnapshot(eq(buildExpectedSnapshot(Collections.emptySet())));
+ assertNull(mTelephonySubscriptionTracker.getReadySubIdsBySlotId().get(TEST_SIM_SLOT_INDEX));
+ }
+
+ @Test
+ public void testTelephonySubscriptionSnapshotGetGroupForSubId() throws Exception {
+ final TelephonySubscriptionSnapshot snapshot =
+ new TelephonySubscriptionSnapshot(TEST_SUBID_TO_GROUP_MAP, Collections.emptySet());
+
+ assertEquals(TEST_PARCEL_UUID, snapshot.getGroupForSubId(TEST_SUBSCRIPTION_ID_1));
+ assertEquals(TEST_PARCEL_UUID, snapshot.getGroupForSubId(TEST_SUBSCRIPTION_ID_2));
+ }
+
+ @Test
+ public void testTelephonySubscriptionSnapshotGetAllSubIdsInGroup() throws Exception {
+ final TelephonySubscriptionSnapshot snapshot =
+ new TelephonySubscriptionSnapshot(TEST_SUBID_TO_GROUP_MAP, Collections.emptySet());
+
+ assertEquals(
+ new ArraySet<>(Arrays.asList(TEST_SUBSCRIPTION_ID_1, TEST_SUBSCRIPTION_ID_2)),
+ snapshot.getAllSubIdsInGroup(TEST_PARCEL_UUID));
+ }
+}
diff --git a/tools/aapt2/util/Util.cpp b/tools/aapt2/util/Util.cpp
index ef33c3463a81..793a2368526b 100644
--- a/tools/aapt2/util/Util.cpp
+++ b/tools/aapt2/util/Util.cpp
@@ -531,14 +531,14 @@ bool ExtractResFilePathParts(const StringPiece& path, StringPiece* out_prefix,
}
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/tools/stats_log_api_gen/.clang-format b/tools/stats_log_api_gen/.clang-format
deleted file mode 100644
index cead3a079435..000000000000
--- a/tools/stats_log_api_gen/.clang-format
+++ /dev/null
@@ -1,17 +0,0 @@
-BasedOnStyle: Google
-AllowShortIfStatementsOnASingleLine: true
-AllowShortFunctionsOnASingleLine: false
-AllowShortLoopsOnASingleLine: true
-BinPackArguments: true
-BinPackParameters: true
-ColumnLimit: 100
-CommentPragmas: NOLINT:.*
-ContinuationIndentWidth: 8
-DerivePointerAlignment: false
-IndentWidth: 4
-PointerAlignment: Left
-TabWidth: 4
-AccessModifierOffset: -4
-IncludeCategories:
- - Regex: '^"Log\.h"'
- Priority: -1
diff --git a/tools/stats_log_api_gen/Android.bp b/tools/stats_log_api_gen/Android.bp
deleted file mode 100644
index c0893f70f30b..000000000000
--- a/tools/stats_log_api_gen/Android.bp
+++ /dev/null
@@ -1,134 +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.
-//
-
-// ==========================================================
-// Build the host executable: stats-log-api-gen
-// ==========================================================
-cc_binary_host {
- name: "stats-log-api-gen",
- srcs: [
- "Collation.cpp",
- "java_writer.cpp",
- "java_writer_q.cpp",
- "main.cpp",
- "native_writer.cpp",
- "utils.cpp",
- ],
- cflags: [
- "-Wall",
- "-Werror",
- ],
-
- shared_libs: [
- "libstats_proto_host",
- "libprotobuf-cpp-full",
- "libbase",
- ],
-
- proto: {
- type: "full",
- },
-}
-
-// ==========================================================
-// Build the host test executable: stats-log-api-gen
-// ==========================================================
-cc_test_host {
- name: "stats-log-api-gen-test",
- cflags: [
- "-Wall",
- "-Wextra",
- "-Werror",
- "-g",
- "-DUNIT_TEST",
- ],
- srcs: [
- "Collation.cpp",
- "test_collation.cpp",
- "test.proto",
- ],
-
- static_libs: [
- "libgmock_host",
- ],
-
- shared_libs: [
- "libstats_proto_host",
- "libprotobuf-cpp-full",
- ],
-
- proto: {
- type: "full",
- include_dirs: [
- "external/protobuf/src",
- ],
- },
-}
-
-// ==========================================================
-// Native library
-// ==========================================================
-genrule {
- name: "statslog.h",
- tools: ["stats-log-api-gen"],
- cmd: "$(location stats-log-api-gen) --header $(genDir)/statslog.h",
- out: [
- "statslog.h",
- ],
-}
-
-genrule {
- name: "statslog.cpp",
- tools: ["stats-log-api-gen"],
- cmd: "$(location stats-log-api-gen) --cpp $(genDir)/statslog.cpp",
- out: [
- "statslog.cpp",
- ],
-}
-
-cc_library {
- name: "libstatslog",
- host_supported: true,
- generated_sources: [
- "statslog.cpp",
- ],
- generated_headers: [
- "statslog.h"
- ],
- cflags: [
- "-Wall",
- "-Werror",
- ],
- export_generated_headers: [
- "statslog.h"
- ],
- shared_libs: [
- "liblog",
- "libcutils",
- ],
- target: {
- android: {
- shared_libs: ["libstatssocket"],
- },
- host: {
- static_libs: ["libstatssocket"],
- },
- darwin: {
- enabled: false,
- },
- },
-}
-
diff --git a/tools/stats_log_api_gen/Collation.cpp b/tools/stats_log_api_gen/Collation.cpp
deleted file mode 100644
index 2608097a359a..000000000000
--- a/tools/stats_log_api_gen/Collation.cpp
+++ /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.
- */
-
-#include "Collation.h"
-
-#include <stdio.h>
-
-#include <map>
-
-#include "frameworks/proto_logging/stats/atoms.pb.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-using google::protobuf::EnumDescriptor;
-using google::protobuf::FieldDescriptor;
-using google::protobuf::FileDescriptor;
-using google::protobuf::SourceLocation;
-using std::make_shared;
-using std::map;
-
-const bool dbg = false;
-
-//
-// AtomDecl class
-//
-
-AtomDecl::AtomDecl() : code(0), name() {
-}
-
-AtomDecl::AtomDecl(const AtomDecl& that)
- : code(that.code),
- name(that.name),
- message(that.message),
- fields(that.fields),
- fieldNumberToAnnotations(that.fieldNumberToAnnotations),
- primaryFields(that.primaryFields),
- exclusiveField(that.exclusiveField),
- defaultState(that.defaultState),
- triggerStateReset(that.triggerStateReset),
- nested(that.nested),
- uidField(that.uidField) {
-}
-
-AtomDecl::AtomDecl(int c, const string& n, const string& m) : code(c), name(n), message(m) {
-}
-
-AtomDecl::~AtomDecl() {
-}
-
-/**
- * Print an error message for a FieldDescriptor, including the file name and
- * line number.
- */
-static void print_error(const FieldDescriptor* field, const char* format, ...) {
- const Descriptor* message = field->containing_type();
- const FileDescriptor* file = message->file();
-
- SourceLocation loc;
- if (field->GetSourceLocation(&loc)) {
- // TODO: this will work if we can figure out how to pass
- // --include_source_info to protoc
- fprintf(stderr, "%s:%d: ", file->name().c_str(), loc.start_line);
- } else {
- fprintf(stderr, "%s: ", file->name().c_str());
- }
- va_list args;
- va_start(args, format);
- vfprintf(stderr, format, args);
- va_end(args);
-}
-
-/**
- * Convert a protobuf type into a java type.
- */
-static java_type_t java_type(const FieldDescriptor* field) {
- int protoType = field->type();
- switch (protoType) {
- case FieldDescriptor::TYPE_DOUBLE:
- return JAVA_TYPE_DOUBLE;
- case FieldDescriptor::TYPE_FLOAT:
- return JAVA_TYPE_FLOAT;
- case FieldDescriptor::TYPE_INT64:
- return JAVA_TYPE_LONG;
- case FieldDescriptor::TYPE_UINT64:
- return JAVA_TYPE_LONG;
- case FieldDescriptor::TYPE_INT32:
- return JAVA_TYPE_INT;
- case FieldDescriptor::TYPE_FIXED64:
- return JAVA_TYPE_LONG;
- case FieldDescriptor::TYPE_FIXED32:
- return JAVA_TYPE_INT;
- case FieldDescriptor::TYPE_BOOL:
- return JAVA_TYPE_BOOLEAN;
- case FieldDescriptor::TYPE_STRING:
- return JAVA_TYPE_STRING;
- case FieldDescriptor::TYPE_GROUP:
- return JAVA_TYPE_UNKNOWN;
- case FieldDescriptor::TYPE_MESSAGE:
- // TODO: not the final package name
- if (field->message_type()->full_name() == "android.os.statsd.AttributionNode") {
- return JAVA_TYPE_ATTRIBUTION_CHAIN;
- } else if (field->message_type()->full_name() == "android.os.statsd.KeyValuePair") {
- return JAVA_TYPE_KEY_VALUE_PAIR;
- } else if (field->options().GetExtension(os::statsd::log_mode) ==
- os::statsd::LogMode::MODE_BYTES) {
- return JAVA_TYPE_BYTE_ARRAY;
- } else {
- return JAVA_TYPE_OBJECT;
- }
- case FieldDescriptor::TYPE_BYTES:
- return JAVA_TYPE_BYTE_ARRAY;
- case FieldDescriptor::TYPE_UINT32:
- return JAVA_TYPE_INT;
- case FieldDescriptor::TYPE_ENUM:
- return JAVA_TYPE_ENUM;
- case FieldDescriptor::TYPE_SFIXED32:
- return JAVA_TYPE_INT;
- case FieldDescriptor::TYPE_SFIXED64:
- return JAVA_TYPE_LONG;
- case FieldDescriptor::TYPE_SINT32:
- return JAVA_TYPE_INT;
- case FieldDescriptor::TYPE_SINT64:
- return JAVA_TYPE_LONG;
- default:
- return JAVA_TYPE_UNKNOWN;
- }
-}
-
-/**
- * Gather the enums info.
- */
-void collate_enums(const EnumDescriptor& enumDescriptor, AtomField* atomField) {
- for (int i = 0; i < enumDescriptor.value_count(); i++) {
- atomField->enumValues[enumDescriptor.value(i)->number()] =
- enumDescriptor.value(i)->name().c_str();
- }
-}
-
-static void addAnnotationToAtomDecl(AtomDecl* atomDecl, const int fieldNumber,
- const AnnotationId annotationId,
- const AnnotationType annotationType,
- const AnnotationValue annotationValue) {
- if (dbg) {
- printf(" Adding annotation to %s: [%d] = {id: %d, type: %d}\n", atomDecl->name.c_str(),
- fieldNumber, annotationId, annotationType);
- }
- atomDecl->fieldNumberToAnnotations[fieldNumber].insert(
- make_shared<Annotation>(annotationId, atomDecl->code, annotationType, annotationValue));
-}
-
-static int collate_field_annotations(AtomDecl* atomDecl, const FieldDescriptor* field,
- const int fieldNumber, const java_type_t& javaType) {
- int errorCount = 0;
-
- if (field->options().HasExtension(os::statsd::state_field_option)) {
- const os::statsd::StateAtomFieldOption& stateFieldOption =
- field->options().GetExtension(os::statsd::state_field_option);
- const bool primaryField = stateFieldOption.primary_field();
- const bool exclusiveState = stateFieldOption.exclusive_state();
- const bool primaryFieldFirstUid = stateFieldOption.primary_field_first_uid();
-
- // Check the field is only one of primaryField, exclusiveState, or primaryFieldFirstUid.
- if (primaryField + primaryFieldFirstUid + exclusiveState > 1) {
- print_error(field,
- "Field can be max 1 of primary_field, exclusive_state, "
- "or primary_field_first_uid: '%s'\n",
- atomDecl->message.c_str());
- errorCount++;
- }
-
- if (primaryField) {
- if (javaType == JAVA_TYPE_UNKNOWN || javaType == JAVA_TYPE_ATTRIBUTION_CHAIN ||
- javaType == JAVA_TYPE_OBJECT || javaType == JAVA_TYPE_BYTE_ARRAY) {
- print_error(field, "Invalid primary state field: '%s'\n",
- atomDecl->message.c_str());
- errorCount++;
- } else {
- atomDecl->primaryFields.push_back(fieldNumber);
- addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_PRIMARY_FIELD,
- ANNOTATION_TYPE_BOOL, AnnotationValue(true));
- }
- }
-
- if (primaryFieldFirstUid) {
- if (javaType != JAVA_TYPE_ATTRIBUTION_CHAIN) {
- print_error(field,
- "PRIMARY_FIELD_FIRST_UID annotation is only for AttributionChains: "
- "'%s'\n",
- atomDecl->message.c_str());
- errorCount++;
- } else {
- atomDecl->primaryFields.push_back(FIRST_UID_IN_CHAIN_ID);
- addAnnotationToAtomDecl(atomDecl, fieldNumber,
- ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, ANNOTATION_TYPE_BOOL,
- AnnotationValue(true));
- }
- }
-
- if (exclusiveState) {
- if (javaType == JAVA_TYPE_UNKNOWN || javaType == JAVA_TYPE_ATTRIBUTION_CHAIN ||
- javaType == JAVA_TYPE_OBJECT || javaType == JAVA_TYPE_BYTE_ARRAY) {
- print_error(field, "Invalid exclusive state field: '%s'\n",
- atomDecl->message.c_str());
- errorCount++;
- }
-
- if (atomDecl->exclusiveField != 0) {
- print_error(field,
- "Cannot have more than one exclusive state field in an "
- "atom: '%s'\n",
- atomDecl->message.c_str());
- errorCount++;
- } else {
- atomDecl->exclusiveField = fieldNumber;
- addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_EXCLUSIVE_STATE,
- ANNOTATION_TYPE_BOOL, AnnotationValue(true));
- }
-
- if (stateFieldOption.has_default_state_value()) {
- const int defaultState = stateFieldOption.default_state_value();
- atomDecl->defaultState = defaultState;
-
- addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_DEFAULT_STATE,
- ANNOTATION_TYPE_INT, AnnotationValue(defaultState));
- }
-
- if (stateFieldOption.has_trigger_state_reset_value()) {
- const int triggerStateReset = stateFieldOption.trigger_state_reset_value();
-
- atomDecl->triggerStateReset = triggerStateReset;
- addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_TRIGGER_STATE_RESET,
- ANNOTATION_TYPE_INT, AnnotationValue(triggerStateReset));
- }
-
- if (stateFieldOption.has_nested()) {
- const bool nested = stateFieldOption.nested();
- atomDecl->nested = nested;
-
- addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_STATE_NESTED,
- ANNOTATION_TYPE_BOOL, AnnotationValue(nested));
- }
- }
- }
-
- if (field->options().GetExtension(os::statsd::is_uid) == true) {
- if (javaType != JAVA_TYPE_INT) {
- print_error(field, "is_uid annotation can only be applied to int32 fields: '%s'\n",
- atomDecl->message.c_str());
- errorCount++;
- }
-
- if (atomDecl->uidField == 0) {
- atomDecl->uidField = fieldNumber;
-
- addAnnotationToAtomDecl(atomDecl, fieldNumber, ANNOTATION_ID_IS_UID,
- ANNOTATION_TYPE_BOOL, AnnotationValue(true));
- } else {
- print_error(field,
- "Cannot have more than one field in an atom with is_uid "
- "annotation: '%s'\n",
- atomDecl->message.c_str());
- errorCount++;
- }
- }
-
- return errorCount;
-}
-
-/**
- * Gather the info about an atom proto.
- */
-int collate_atom(const Descriptor* atom, AtomDecl* atomDecl, vector<java_type_t>* signature) {
- int errorCount = 0;
-
- // Build a sorted list of the fields. Descriptor has them in source file
- // order.
- map<int, const FieldDescriptor*> fields;
- for (int j = 0; j < atom->field_count(); j++) {
- const FieldDescriptor* field = atom->field(j);
- fields[field->number()] = field;
- }
-
- // Check that the parameters start at 1 and go up sequentially.
- int expectedNumber = 1;
- for (map<int, const FieldDescriptor*>::const_iterator it = fields.begin(); it != fields.end();
- it++) {
- const int number = it->first;
- const FieldDescriptor* field = it->second;
- if (number != expectedNumber) {
- print_error(field,
- "Fields must be numbered consecutively starting at 1:"
- " '%s' is %d but should be %d\n",
- field->name().c_str(), number, expectedNumber);
- errorCount++;
- expectedNumber = number;
- continue;
- }
- expectedNumber++;
- }
-
- // Check that only allowed types are present. Remove any invalid ones.
- for (map<int, const FieldDescriptor*>::const_iterator it = fields.begin(); it != fields.end();
- it++) {
- const FieldDescriptor* field = it->second;
- bool isBinaryField = field->options().GetExtension(os::statsd::log_mode) ==
- os::statsd::LogMode::MODE_BYTES;
-
- java_type_t javaType = java_type(field);
-
- if (javaType == JAVA_TYPE_UNKNOWN) {
- print_error(field, "Unknown type for field: %s\n", field->name().c_str());
- errorCount++;
- continue;
- } else if (javaType == JAVA_TYPE_OBJECT && atomDecl->code < PULL_ATOM_START_ID) {
- // Allow attribution chain, but only at position 1.
- print_error(field, "Message type not allowed for field in pushed atoms: %s\n",
- field->name().c_str());
- errorCount++;
- continue;
- } else if (javaType == JAVA_TYPE_BYTE_ARRAY && !isBinaryField) {
- print_error(field, "Raw bytes type not allowed for field: %s\n", field->name().c_str());
- errorCount++;
- continue;
- }
-
- if (isBinaryField && javaType != JAVA_TYPE_BYTE_ARRAY) {
- print_error(field, "Cannot mark field %s as bytes.\n", field->name().c_str());
- errorCount++;
- continue;
- }
-
- // Doubles are not supported yet.
- if (javaType == JAVA_TYPE_DOUBLE) {
- print_error(field,
- "Doubles are not supported in atoms. Please change field %s "
- "to float\n",
- field->name().c_str());
- errorCount++;
- continue;
- }
-
- if (field->is_repeated() &&
- !(javaType == JAVA_TYPE_ATTRIBUTION_CHAIN || javaType == JAVA_TYPE_KEY_VALUE_PAIR)) {
- print_error(field,
- "Repeated fields are not supported in atoms. Please make "
- "field %s not "
- "repeated.\n",
- field->name().c_str());
- errorCount++;
- continue;
- }
- }
-
- // Check that if there's an attribution chain, it's at position 1.
- for (map<int, const FieldDescriptor*>::const_iterator it = fields.begin(); it != fields.end();
- it++) {
- int number = it->first;
- if (number != 1) {
- const FieldDescriptor* field = it->second;
- java_type_t javaType = java_type(field);
- if (javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- print_error(field,
- "AttributionChain fields must have field id 1, in message: '%s'\n",
- atom->name().c_str());
- errorCount++;
- }
- }
- }
-
- // Build the type signature and the atom data.
- for (map<int, const FieldDescriptor*>::const_iterator it = fields.begin(); it != fields.end();
- it++) {
- const FieldDescriptor* field = it->second;
- java_type_t javaType = java_type(field);
- bool isBinaryField = field->options().GetExtension(os::statsd::log_mode) ==
- os::statsd::LogMode::MODE_BYTES;
-
- AtomField atField(field->name(), javaType);
-
- if (javaType == JAVA_TYPE_ENUM) {
- // All enums are treated as ints when it comes to function signatures.
- collate_enums(*field->enum_type(), &atField);
- }
-
- // Generate signature for pushed atoms
- if (atomDecl->code < PULL_ATOM_START_ID) {
- if (javaType == JAVA_TYPE_ENUM) {
- // All enums are treated as ints when it comes to function signatures.
- signature->push_back(JAVA_TYPE_INT);
- } else if (javaType == JAVA_TYPE_OBJECT && isBinaryField) {
- signature->push_back(JAVA_TYPE_BYTE_ARRAY);
- } else {
- signature->push_back(javaType);
- }
- }
-
- atomDecl->fields.push_back(atField);
-
- errorCount += collate_field_annotations(atomDecl, field, it->first, javaType);
- }
-
- return errorCount;
-}
-
-// This function flattens the fields of the AttributionNode proto in an Atom
-// proto and generates the corresponding atom decl and signature.
-bool get_non_chained_node(const Descriptor* atom, AtomDecl* atomDecl,
- vector<java_type_t>* signature) {
- // Build a sorted list of the fields. Descriptor has them in source file
- // order.
- map<int, const FieldDescriptor*> fields;
- for (int j = 0; j < atom->field_count(); j++) {
- const FieldDescriptor* field = atom->field(j);
- fields[field->number()] = field;
- }
-
- AtomDecl attributionDecl;
- vector<java_type_t> attributionSignature;
- collate_atom(android::os::statsd::AttributionNode::descriptor(), &attributionDecl,
- &attributionSignature);
-
- // Build the type signature and the atom data.
- bool has_attribution_node = false;
- for (map<int, const FieldDescriptor*>::const_iterator it = fields.begin(); it != fields.end();
- it++) {
- const FieldDescriptor* field = it->second;
- java_type_t javaType = java_type(field);
- if (javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- atomDecl->fields.insert(atomDecl->fields.end(), attributionDecl.fields.begin(),
- attributionDecl.fields.end());
- signature->insert(signature->end(), attributionSignature.begin(),
- attributionSignature.end());
- has_attribution_node = true;
-
- } else {
- AtomField atField(field->name(), javaType);
- if (javaType == JAVA_TYPE_ENUM) {
- // All enums are treated as ints when it comes to function signatures.
- signature->push_back(JAVA_TYPE_INT);
- collate_enums(*field->enum_type(), &atField);
- } else {
- signature->push_back(javaType);
- }
- atomDecl->fields.push_back(atField);
- }
- }
- return has_attribution_node;
-}
-
-static void populateFieldNumberToAtomDeclSet(const shared_ptr<AtomDecl>& atomDecl,
- FieldNumberToAtomDeclSet* fieldNumberToAtomDeclSet) {
- for (FieldNumberToAnnotations::const_iterator it = atomDecl->fieldNumberToAnnotations.begin();
- it != atomDecl->fieldNumberToAnnotations.end(); it++) {
- const int fieldNumber = it->first;
- (*fieldNumberToAtomDeclSet)[fieldNumber].insert(atomDecl);
- }
-}
-
-/**
- * Gather the info about the atoms.
- */
-int collate_atoms(const Descriptor* descriptor, const string& moduleName, Atoms* atoms) {
- int errorCount = 0;
-
- for (int i = 0; i < descriptor->field_count(); i++) {
- const FieldDescriptor* atomField = descriptor->field(i);
-
- if (moduleName != DEFAULT_MODULE_NAME) {
- const int moduleCount = atomField->options().ExtensionSize(os::statsd::module);
- int j;
- for (j = 0; j < moduleCount; ++j) {
- const string atomModuleName =
- atomField->options().GetExtension(os::statsd::module, j);
- if (atomModuleName == moduleName) {
- break;
- }
- }
-
- // This atom is not in the module we're interested in; skip it.
- if (moduleCount == j) {
- if (dbg) {
- printf(" Skipping %s (%d)\n", atomField->name().c_str(), atomField->number());
- }
- continue;
- }
- }
-
- if (dbg) {
- printf(" %s (%d)\n", atomField->name().c_str(), atomField->number());
- }
-
- // StatsEvent only has one oneof, which contains only messages. Don't allow
- // other types.
- if (atomField->type() != FieldDescriptor::TYPE_MESSAGE) {
- print_error(atomField,
- "Bad type for atom. StatsEvent can only have message type "
- "fields: %s\n",
- atomField->name().c_str());
- errorCount++;
- continue;
- }
-
- const Descriptor* atom = atomField->message_type();
- shared_ptr<AtomDecl> atomDecl =
- make_shared<AtomDecl>(atomField->number(), atomField->name(), atom->name());
-
- if (atomDecl->code < PULL_ATOM_START_ID &&
- atomField->options().GetExtension(os::statsd::truncate_timestamp)) {
- addAnnotationToAtomDecl(atomDecl.get(), ATOM_ID_FIELD_NUMBER,
- ANNOTATION_ID_TRUNCATE_TIMESTAMP, ANNOTATION_TYPE_BOOL,
- AnnotationValue(true));
- if (dbg) {
- printf("%s can have timestamp truncated\n", atomField->name().c_str());
- }
- }
-
- vector<java_type_t> signature;
- errorCount += collate_atom(atom, atomDecl.get(), &signature);
- if (atomDecl->primaryFields.size() != 0 && atomDecl->exclusiveField == 0) {
- print_error(atomField, "Cannot have a primary field without an exclusive field: %s\n",
- atomField->name().c_str());
- errorCount++;
- continue;
- }
-
- FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet = atoms->signatureInfoMap[signature];
- populateFieldNumberToAtomDeclSet(atomDecl, &fieldNumberToAtomDeclSet);
-
- atoms->decls.insert(atomDecl);
-
- shared_ptr<AtomDecl> nonChainedAtomDecl =
- make_shared<AtomDecl>(atomField->number(), atomField->name(), atom->name());
- vector<java_type_t> nonChainedSignature;
- if (get_non_chained_node(atom, nonChainedAtomDecl.get(), &nonChainedSignature)) {
- FieldNumberToAtomDeclSet& nonChainedFieldNumberToAtomDeclSet =
- atoms->nonChainedSignatureInfoMap[nonChainedSignature];
- populateFieldNumberToAtomDeclSet(nonChainedAtomDecl,
- &nonChainedFieldNumberToAtomDeclSet);
-
- atoms->non_chained_decls.insert(nonChainedAtomDecl);
- }
- }
-
- if (dbg) {
- printf("signatures = [\n");
- for (SignatureInfoMap::const_iterator it = atoms->signatureInfoMap.begin();
- it != atoms->signatureInfoMap.end(); it++) {
- printf(" ");
- for (vector<java_type_t>::const_iterator jt = it->first.begin(); jt != it->first.end();
- jt++) {
- printf(" %d", (int)*jt);
- }
- printf("\n");
- }
- printf("]\n");
- }
-
- return errorCount;
-}
-
-} // namespace stats_log_api_gen
-} // namespace android
diff --git a/tools/stats_log_api_gen/Collation.h b/tools/stats_log_api_gen/Collation.h
deleted file mode 100644
index 3deb3ae189a4..000000000000
--- a/tools/stats_log_api_gen/Collation.h
+++ /dev/null
@@ -1,201 +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.
- */
-
-#ifndef ANDROID_STATS_LOG_API_GEN_COLLATION_H
-#define ANDROID_STATS_LOG_API_GEN_COLLATION_H
-
-#include <google/protobuf/descriptor.h>
-#include <stdint.h>
-
-#include <map>
-#include <set>
-#include <vector>
-
-#include "frameworks/proto_logging/stats/atom_field_options.pb.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-using google::protobuf::Descriptor;
-using google::protobuf::FieldDescriptor;
-using std::map;
-using std::set;
-using std::shared_ptr;
-using std::string;
-using std::vector;
-
-const int PULL_ATOM_START_ID = 10000;
-
-const int FIRST_UID_IN_CHAIN_ID = 0;
-
-enum AnnotationId : uint8_t {
- ANNOTATION_ID_IS_UID = 1,
- ANNOTATION_ID_TRUNCATE_TIMESTAMP = 2,
- ANNOTATION_ID_PRIMARY_FIELD = 3,
- ANNOTATION_ID_EXCLUSIVE_STATE = 4,
- ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID = 5,
- ANNOTATION_ID_DEFAULT_STATE = 6,
- ANNOTATION_ID_TRIGGER_STATE_RESET = 7,
- ANNOTATION_ID_STATE_NESTED = 8,
-};
-
-const int ATOM_ID_FIELD_NUMBER = -1;
-
-const string DEFAULT_MODULE_NAME = "DEFAULT";
-
-/**
- * The types for atom parameters.
- */
-typedef enum {
- JAVA_TYPE_UNKNOWN = 0,
-
- JAVA_TYPE_ATTRIBUTION_CHAIN = 1,
- JAVA_TYPE_BOOLEAN = 2,
- JAVA_TYPE_INT = 3,
- JAVA_TYPE_LONG = 4,
- JAVA_TYPE_FLOAT = 5,
- JAVA_TYPE_DOUBLE = 6,
- JAVA_TYPE_STRING = 7,
- JAVA_TYPE_ENUM = 8,
- JAVA_TYPE_KEY_VALUE_PAIR = 9,
-
- JAVA_TYPE_OBJECT = -1,
- JAVA_TYPE_BYTE_ARRAY = -2,
-} java_type_t;
-
-enum AnnotationType {
- ANNOTATION_TYPE_UNKNOWN = 0,
- ANNOTATION_TYPE_INT = 1,
- ANNOTATION_TYPE_BOOL = 2,
-};
-
-union AnnotationValue {
- int intValue;
- bool boolValue;
-
- AnnotationValue(const int value) : intValue(value) {
- }
- AnnotationValue(const bool value) : boolValue(value) {
- }
-};
-
-struct Annotation {
- const AnnotationId annotationId;
- const int atomId;
- AnnotationType type;
- AnnotationValue value;
-
- inline Annotation(AnnotationId annotationId, int atomId, AnnotationType type,
- AnnotationValue value)
- : annotationId(annotationId), atomId(atomId), type(type), value(value) {
- }
- inline ~Annotation() {
- }
-
- inline bool operator<(const Annotation& that) const {
- return atomId == that.atomId ? annotationId < that.annotationId : atomId < that.atomId;
- }
-};
-
-struct SharedComparator {
- template <typename T>
- inline bool operator()(const shared_ptr<T>& lhs, const shared_ptr<T>& rhs) const {
- return (*lhs) < (*rhs);
- }
-};
-
-using AnnotationSet = set<shared_ptr<Annotation>, SharedComparator>;
-
-using FieldNumberToAnnotations = map<int, AnnotationSet>;
-
-/**
- * The name and type for an atom field.
- */
-struct AtomField {
- string name;
- java_type_t javaType;
-
- // If the field is of type enum, the following map contains the list of enum
- // values.
- map<int /* numeric value */, string /* value name */> enumValues;
-
- inline AtomField() : name(), javaType(JAVA_TYPE_UNKNOWN) {
- }
- inline AtomField(const AtomField& that)
- : name(that.name), javaType(that.javaType), enumValues(that.enumValues) {
- }
-
- inline AtomField(string n, java_type_t jt) : name(n), javaType(jt) {
- }
- inline ~AtomField() {
- }
-};
-
-/**
- * The name and code for an atom.
- */
-struct AtomDecl {
- int code;
- string name;
-
- string message;
- vector<AtomField> fields;
-
- FieldNumberToAnnotations fieldNumberToAnnotations;
-
- vector<int> primaryFields;
- int exclusiveField = 0;
- int defaultState = INT_MAX;
- int triggerStateReset = INT_MAX;
- bool nested = true;
-
- int uidField = 0;
-
- AtomDecl();
- AtomDecl(const AtomDecl& that);
- AtomDecl(int code, const string& name, const string& message);
- ~AtomDecl();
-
- inline bool operator<(const AtomDecl& that) const {
- return (code == that.code) ? (name < that.name) : (code < that.code);
- }
-};
-
-using AtomDeclSet = set<shared_ptr<AtomDecl>, SharedComparator>;
-
-// Maps a field number to a set of atoms that have annotation(s) for their field with that field
-// number.
-using FieldNumberToAtomDeclSet = map<int, AtomDeclSet>;
-
-using SignatureInfoMap = map<vector<java_type_t>, FieldNumberToAtomDeclSet>;
-
-struct Atoms {
- SignatureInfoMap signatureInfoMap;
- AtomDeclSet decls;
- AtomDeclSet non_chained_decls;
- SignatureInfoMap nonChainedSignatureInfoMap;
-};
-
-/**
- * Gather the information about the atoms. Returns the number of errors.
- */
-int collate_atoms(const Descriptor* descriptor, const string& moduleName, Atoms* atoms);
-int collate_atom(const Descriptor* atom, AtomDecl* atomDecl, vector<java_type_t>* signature);
-
-} // namespace stats_log_api_gen
-} // namespace android
-
-#endif // ANDROID_STATS_LOG_API_GEN_COLLATION_H
diff --git a/tools/stats_log_api_gen/OWNERS b/tools/stats_log_api_gen/OWNERS
deleted file mode 100644
index 41a0c95f13c9..000000000000
--- a/tools/stats_log_api_gen/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-yro@google.com
diff --git a/tools/stats_log_api_gen/java_writer.cpp b/tools/stats_log_api_gen/java_writer.cpp
deleted file mode 100644
index f4c937c3f599..000000000000
--- a/tools/stats_log_api_gen/java_writer.cpp
+++ /dev/null
@@ -1,336 +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.
- */
-
-#include "java_writer.h"
-
-#include "java_writer_q.h"
-#include "utils.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-static int write_java_q_logger_class(FILE* out, const SignatureInfoMap& signatureInfoMap,
- const AtomDecl& attributionDecl) {
- fprintf(out, "\n");
- fprintf(out, " // Write logging helper methods for statsd in Q and earlier.\n");
- fprintf(out, " private static class QLogger {\n");
-
- write_java_q_logging_constants(out, " ");
-
- // Print Q write methods.
- fprintf(out, "\n");
- fprintf(out, " // Write methods.\n");
- write_java_methods_q_schema(out, signatureInfoMap, attributionDecl, " ");
-
- fprintf(out, " }\n");
- return 0;
-}
-
-static void write_java_annotation_constants(FILE* out) {
- fprintf(out, " // Annotation constants.\n");
-
- for (const auto& [id, name] : ANNOTATION_ID_CONSTANTS) {
- fprintf(out, " public static final byte %s = %hhu;\n", name.c_str(), id);
- }
- fprintf(out, "\n");
-}
-
-static void write_annotations(FILE* out, int argIndex,
- const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet) {
- FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
- fieldNumberToAtomDeclSet.find(argIndex);
- if (fieldNumberToAtomDeclSet.end() == fieldNumberToAtomDeclSetIt) {
- return;
- }
- const AtomDeclSet& atomDeclSet = fieldNumberToAtomDeclSetIt->second;
- for (const shared_ptr<AtomDecl>& atomDecl : atomDeclSet) {
- const string atomConstant = make_constant_name(atomDecl->name);
- fprintf(out, " if (%s == code) {\n", atomConstant.c_str());
- const AnnotationSet& annotations = atomDecl->fieldNumberToAnnotations.at(argIndex);
- int resetState = -1;
- int defaultState = -1;
- for (const shared_ptr<Annotation>& annotation : annotations) {
- const string& annotationConstant = ANNOTATION_ID_CONSTANTS.at(annotation->annotationId);
- switch (annotation->type) {
- case ANNOTATION_TYPE_INT:
- if (ANNOTATION_ID_TRIGGER_STATE_RESET == annotation->annotationId) {
- resetState = annotation->value.intValue;
- } else if (ANNOTATION_ID_DEFAULT_STATE == annotation->annotationId) {
- defaultState = annotation->value.intValue;
- } else {
- fprintf(out, " builder.addIntAnnotation(%s, %d);\n",
- annotationConstant.c_str(), annotation->value.intValue);
- }
- break;
- case ANNOTATION_TYPE_BOOL:
- fprintf(out, " builder.addBooleanAnnotation(%s, %s);\n",
- annotationConstant.c_str(),
- annotation->value.boolValue ? "true" : "false");
- break;
- default:
- break;
- }
- }
- if (defaultState != -1 && resetState != -1) {
- const string& annotationConstant =
- ANNOTATION_ID_CONSTANTS.at(ANNOTATION_ID_TRIGGER_STATE_RESET);
- fprintf(out, " if (arg%d == %d) {\n", argIndex, resetState);
- fprintf(out, " builder.addIntAnnotation(%s, %d);\n",
- annotationConstant.c_str(), defaultState);
- fprintf(out, " }\n");
- }
- fprintf(out, " }\n");
- }
-}
-
-static int write_java_methods(FILE* out, const SignatureInfoMap& signatureInfoMap,
- const AtomDecl& attributionDecl, const bool supportQ) {
- for (auto signatureInfoMapIt = signatureInfoMap.begin();
- signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) {
- // Print method signature.
- fprintf(out, " public static void write(int code");
- const vector<java_type_t>& signature = signatureInfoMapIt->first;
- const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet = signatureInfoMapIt->second;
- int argIndex = 1;
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- for (auto chainField : attributionDecl.fields) {
- fprintf(out, ", %s[] %s", java_type_name(chainField.javaType),
- chainField.name.c_str());
- }
- } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) {
- fprintf(out, ", android.util.SparseArray<Object> valueMap");
- } else {
- fprintf(out, ", %s arg%d", java_type_name(*arg), argIndex);
- }
- argIndex++;
- }
- fprintf(out, ") {\n");
-
- // Print method body.
- string indent("");
- if (supportQ) {
- fprintf(out, " if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {\n");
- indent = " ";
- }
-
- // Start StatsEvent.Builder.
- fprintf(out,
- "%s final StatsEvent.Builder builder = "
- "StatsEvent.newBuilder();\n",
- indent.c_str());
-
- // Write atom code.
- fprintf(out, "%s builder.setAtomId(code);\n", indent.c_str());
- write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAtomDeclSet);
-
- // Write the args.
- argIndex = 1;
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- switch (*arg) {
- case JAVA_TYPE_BOOLEAN:
- fprintf(out, "%s builder.writeBoolean(arg%d);\n", indent.c_str(),
- argIndex);
- break;
- case JAVA_TYPE_INT:
- case JAVA_TYPE_ENUM:
- fprintf(out, "%s builder.writeInt(arg%d);\n", indent.c_str(), argIndex);
- break;
- case JAVA_TYPE_FLOAT:
- fprintf(out, "%s builder.writeFloat(arg%d);\n", indent.c_str(),
- argIndex);
- break;
- case JAVA_TYPE_LONG:
- fprintf(out, "%s builder.writeLong(arg%d);\n", indent.c_str(), argIndex);
- break;
- case JAVA_TYPE_STRING:
- fprintf(out, "%s builder.writeString(arg%d);\n", indent.c_str(),
- argIndex);
- break;
- case JAVA_TYPE_BYTE_ARRAY:
- fprintf(out,
- "%s builder.writeByteArray(null == arg%d ? new byte[0] : "
- "arg%d);\n",
- indent.c_str(), argIndex, argIndex);
- break;
- case JAVA_TYPE_ATTRIBUTION_CHAIN: {
- const char* uidName = attributionDecl.fields.front().name.c_str();
- const char* tagName = attributionDecl.fields.back().name.c_str();
-
- fprintf(out, "%s builder.writeAttributionChain(\n", indent.c_str());
- fprintf(out, "%s null == %s ? new int[0] : %s,\n",
- indent.c_str(), uidName, uidName);
- fprintf(out, "%s null == %s ? new String[0] : %s);\n",
- indent.c_str(), tagName, tagName);
- break;
- }
- case JAVA_TYPE_KEY_VALUE_PAIR:
- fprintf(out, "\n");
- fprintf(out, "%s // Write KeyValuePairs.\n", indent.c_str());
- fprintf(out, "%s final int count = valueMap.size();\n", indent.c_str());
- fprintf(out, "%s android.util.SparseIntArray intMap = null;\n",
- indent.c_str());
- fprintf(out, "%s android.util.SparseLongArray longMap = null;\n",
- indent.c_str());
- fprintf(out, "%s android.util.SparseArray<String> stringMap = null;\n",
- indent.c_str());
- fprintf(out, "%s android.util.SparseArray<Float> floatMap = null;\n",
- indent.c_str());
- fprintf(out, "%s for (int i = 0; i < count; i++) {\n", indent.c_str());
- fprintf(out, "%s final int key = valueMap.keyAt(i);\n",
- indent.c_str());
- fprintf(out, "%s final Object value = valueMap.valueAt(i);\n",
- indent.c_str());
- fprintf(out, "%s if (value instanceof Integer) {\n", indent.c_str());
- fprintf(out, "%s if (null == intMap) {\n", indent.c_str());
- fprintf(out,
- "%s intMap = new "
- "android.util.SparseIntArray();\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s intMap.put(key, (Integer) value);\n",
- indent.c_str());
- fprintf(out, "%s } else if (value instanceof Long) {\n",
- indent.c_str());
- fprintf(out, "%s if (null == longMap) {\n", indent.c_str());
- fprintf(out,
- "%s longMap = new "
- "android.util.SparseLongArray();\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s longMap.put(key, (Long) value);\n",
- indent.c_str());
- fprintf(out, "%s } else if (value instanceof String) {\n",
- indent.c_str());
- fprintf(out, "%s if (null == stringMap) {\n", indent.c_str());
- fprintf(out,
- "%s stringMap = new "
- "android.util.SparseArray<>();\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s stringMap.put(key, (String) value);\n",
- indent.c_str());
- fprintf(out, "%s } else if (value instanceof Float) {\n",
- indent.c_str());
- fprintf(out, "%s if (null == floatMap) {\n", indent.c_str());
- fprintf(out,
- "%s floatMap = new "
- "android.util.SparseArray<>();\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s floatMap.put(key, (Float) value);\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out,
- "%s builder.writeKeyValuePairs("
- "intMap, longMap, stringMap, floatMap);\n",
- indent.c_str());
- break;
- default:
- // Unsupported types: OBJECT, DOUBLE.
- fprintf(stderr, "Encountered unsupported type.");
- return 1;
- }
- write_annotations(out, argIndex, fieldNumberToAtomDeclSet);
- argIndex++;
- }
-
- fprintf(out, "\n");
- fprintf(out, "%s builder.usePooledBuffer();\n", indent.c_str());
- fprintf(out, "%s StatsLog.write(builder.build());\n", indent.c_str());
-
- // Add support for writing using Q schema if this is not the default module.
- if (supportQ) {
- fprintf(out, " } else {\n");
- fprintf(out, " QLogger.write(code");
- argIndex = 1;
- for (vector<java_type_t>::const_iterator arg = signature.begin();
- arg != signature.end(); arg++) {
- if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- const char* uidName = attributionDecl.fields.front().name.c_str();
- const char* tagName = attributionDecl.fields.back().name.c_str();
- fprintf(out, ", %s, %s", uidName, tagName);
- } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) {
- // Module logging does not yet support key value pair.
- fprintf(stderr, "Module logging does not yet support key value pair.\n");
- return 1;
- } else {
- fprintf(out, ", arg%d", argIndex);
- }
- argIndex++;
- }
- fprintf(out, ");\n");
- fprintf(out, " }\n"); // if
- }
-
- fprintf(out, " }\n"); // method
- fprintf(out, "\n");
- }
- return 0;
-}
-
-int write_stats_log_java(FILE* out, const Atoms& atoms, const AtomDecl& attributionDecl,
- const string& javaClass, const string& javaPackage, const bool supportQ,
- const bool supportWorkSource) {
- // Print prelude
- fprintf(out, "// This file is autogenerated\n");
- fprintf(out, "\n");
- fprintf(out, "package %s;\n", javaPackage.c_str());
- fprintf(out, "\n");
- fprintf(out, "\n");
- if (supportQ) {
- fprintf(out, "import android.os.Build;\n");
- fprintf(out, "import android.os.SystemClock;\n");
- }
-
- fprintf(out, "import android.util.StatsEvent;\n");
- fprintf(out, "import android.util.StatsLog;\n");
-
- fprintf(out, "\n");
- fprintf(out, "\n");
- fprintf(out, "/**\n");
- fprintf(out, " * Utility class for logging statistics events.\n");
- fprintf(out, " */\n");
- fprintf(out, "public class %s {\n", javaClass.c_str());
-
- write_java_atom_codes(out, atoms);
- write_java_enum_values(out, atoms);
- write_java_annotation_constants(out);
-
- int errors = 0;
-
- // Print write methods.
- fprintf(out, " // Write methods\n");
- errors += write_java_methods(out, atoms.signatureInfoMap, attributionDecl, supportQ);
- errors += write_java_non_chained_methods(out, atoms.nonChainedSignatureInfoMap);
- if (supportWorkSource) {
- errors += write_java_work_source_methods(out, atoms.signatureInfoMap);
- }
-
- if (supportQ) {
- errors += write_java_q_logger_class(out, atoms.signatureInfoMap, attributionDecl);
- }
-
- fprintf(out, "}\n");
-
- return errors;
-}
-
-} // namespace stats_log_api_gen
-} // namespace android
diff --git a/tools/stats_log_api_gen/java_writer.h b/tools/stats_log_api_gen/java_writer.h
deleted file mode 100644
index 8b3b50588efc..000000000000
--- a/tools/stats_log_api_gen/java_writer.h
+++ /dev/null
@@ -1,38 +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.
- */
-
-#pragma once
-
-#include <stdio.h>
-#include <string.h>
-
-#include <map>
-#include <set>
-#include <vector>
-
-#include "Collation.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-using namespace std;
-
-int write_stats_log_java(FILE* out, const Atoms& atoms, const AtomDecl& attributionDecl,
- const string& javaClass, const string& javaPackage, const bool supportQ,
- const bool supportWorkSource);
-
-} // namespace stats_log_api_gen
-} // namespace android
diff --git a/tools/stats_log_api_gen/java_writer_q.cpp b/tools/stats_log_api_gen/java_writer_q.cpp
deleted file mode 100644
index d21e2708b724..000000000000
--- a/tools/stats_log_api_gen/java_writer_q.cpp
+++ /dev/null
@@ -1,601 +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.
- */
-
-#include "java_writer_q.h"
-
-#include "utils.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-void write_java_q_logging_constants(FILE* out, const string& indent) {
- fprintf(out, "%s// Payload limits.\n", indent.c_str());
- fprintf(out, "%sprivate static final int LOGGER_ENTRY_MAX_PAYLOAD = 4068;\n", indent.c_str());
- fprintf(out,
- "%sprivate static final int MAX_EVENT_PAYLOAD = "
- "LOGGER_ENTRY_MAX_PAYLOAD - 4;\n",
- indent.c_str());
-
- // Value types. Must match with EventLog.java and log.h.
- fprintf(out, "\n");
- fprintf(out, "%s// Value types.\n", indent.c_str());
- fprintf(out, "%sprivate static final byte INT_TYPE = 0;\n", indent.c_str());
- fprintf(out, "%sprivate static final byte LONG_TYPE = 1;\n", indent.c_str());
- fprintf(out, "%sprivate static final byte STRING_TYPE = 2;\n", indent.c_str());
- fprintf(out, "%sprivate static final byte LIST_TYPE = 3;\n", indent.c_str());
- fprintf(out, "%sprivate static final byte FLOAT_TYPE = 4;\n", indent.c_str());
-
- // Size of each value type.
- // Booleans, ints, floats, and enums take 5 bytes, 1 for the type and 4 for
- // the value.
- fprintf(out, "\n");
- fprintf(out, "%s// Size of each value type.\n", indent.c_str());
- fprintf(out, "%sprivate static final int INT_TYPE_SIZE = 5;\n", indent.c_str());
- fprintf(out, "%sprivate static final int FLOAT_TYPE_SIZE = 5;\n", indent.c_str());
- // Longs take 9 bytes, 1 for the type and 8 for the value.
- fprintf(out, "%sprivate static final int LONG_TYPE_SIZE = 9;\n", indent.c_str());
- // Strings take 5 metadata bytes: 1 byte is for the type, 4 are for the
- // length.
- fprintf(out, "%sprivate static final int STRING_TYPE_OVERHEAD = 5;\n", indent.c_str());
- fprintf(out, "%sprivate static final int LIST_TYPE_OVERHEAD = 2;\n", indent.c_str());
-}
-
-int write_java_methods_q_schema(FILE* out, const SignatureInfoMap& signatureInfoMap,
- const AtomDecl& attributionDecl, const string& indent) {
- int requiredHelpers = 0;
- for (auto signatureInfoMapIt = signatureInfoMap.begin();
- signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) {
- // Print method signature.
- vector<java_type_t> signature = signatureInfoMapIt->first;
- fprintf(out, "%spublic static void write(int code", indent.c_str());
- int argIndex = 1;
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- for (auto chainField : attributionDecl.fields) {
- fprintf(out, ", %s[] %s", java_type_name(chainField.javaType),
- chainField.name.c_str());
- }
- } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) {
- fprintf(out, ", android.util.SparseArray<Object> valueMap");
- } else {
- fprintf(out, ", %s arg%d", java_type_name(*arg), argIndex);
- }
- argIndex++;
- }
- fprintf(out, ") {\n");
-
- // Calculate the size of the buffer.
- fprintf(out, "%s // Initial overhead of the list, timestamp, and atom tag.\n",
- indent.c_str());
- fprintf(out,
- "%s int needed = LIST_TYPE_OVERHEAD + LONG_TYPE_SIZE + "
- "INT_TYPE_SIZE;\n",
- indent.c_str());
- argIndex = 1;
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- switch (*arg) {
- case JAVA_TYPE_BOOLEAN:
- case JAVA_TYPE_INT:
- case JAVA_TYPE_FLOAT:
- case JAVA_TYPE_ENUM:
- fprintf(out, "%s needed += INT_TYPE_SIZE;\n", indent.c_str());
- break;
- case JAVA_TYPE_LONG:
- // Longs take 9 bytes, 1 for the type and 8 for the value.
- fprintf(out, "%s needed += LONG_TYPE_SIZE;\n", indent.c_str());
- break;
- case JAVA_TYPE_STRING:
- // Strings take 5 metadata bytes + length of byte encoded string.
- fprintf(out, "%s if (arg%d == null) {\n", indent.c_str(), argIndex);
- fprintf(out, "%s arg%d = \"\";\n", indent.c_str(), argIndex);
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out,
- "%s byte[] arg%dBytes = "
- "arg%d.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n",
- indent.c_str(), argIndex, argIndex);
- fprintf(out, "%s needed += STRING_TYPE_OVERHEAD + arg%dBytes.length;\n",
- indent.c_str(), argIndex);
- break;
- case JAVA_TYPE_BYTE_ARRAY:
- // Byte arrays take 5 metadata bytes + length of byte array.
- fprintf(out, "%s if (arg%d == null) {\n", indent.c_str(), argIndex);
- fprintf(out, "%s arg%d = new byte[0];\n", indent.c_str(), argIndex);
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s needed += STRING_TYPE_OVERHEAD + arg%d.length;\n",
- indent.c_str(), argIndex);
- break;
- case JAVA_TYPE_ATTRIBUTION_CHAIN: {
- const char* uidName = attributionDecl.fields.front().name.c_str();
- const char* tagName = attributionDecl.fields.back().name.c_str();
- // Null checks on the params.
- fprintf(out, "%s if (%s == null) {\n", indent.c_str(), uidName);
- fprintf(out, "%s %s = new %s[0];\n", indent.c_str(), uidName,
- java_type_name(attributionDecl.fields.front().javaType));
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s if (%s == null) {\n", indent.c_str(), tagName);
- fprintf(out, "%s %s = new %s[0];\n", indent.c_str(), tagName,
- java_type_name(attributionDecl.fields.back().javaType));
- fprintf(out, "%s }\n", indent.c_str());
-
- // First check that the lengths of the uid and tag arrays are the
- // same.
- fprintf(out, "%s if (%s.length != %s.length) {\n", indent.c_str(), uidName,
- tagName);
- fprintf(out, "%s return;\n", indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s int attrSize = LIST_TYPE_OVERHEAD;\n", indent.c_str());
- fprintf(out, "%s for (int i = 0; i < %s.length; i++) {\n", indent.c_str(),
- tagName);
- fprintf(out, "%s String str%d = (%s[i] == null) ? \"\" : %s[i];\n",
- indent.c_str(), argIndex, tagName, tagName);
- fprintf(out,
- "%s int str%dlen = "
- "str%d.getBytes(java.nio.charset.StandardCharsets.UTF_8)."
- "length;\n",
- indent.c_str(), argIndex, argIndex);
- fprintf(out,
- "%s attrSize += "
- "LIST_TYPE_OVERHEAD + INT_TYPE_SIZE + STRING_TYPE_OVERHEAD + "
- "str%dlen;\n",
- indent.c_str(), argIndex);
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s needed += attrSize;\n", indent.c_str());
- break;
- }
- case JAVA_TYPE_KEY_VALUE_PAIR: {
- fprintf(out, "%s // Calculate bytes needed by Key Value Pairs.\n",
- indent.c_str());
- fprintf(out, "%s final int count = valueMap.size();\n", indent.c_str());
- fprintf(out, "%s android.util.SparseIntArray intMap = null;\n",
- indent.c_str());
- fprintf(out, "%s android.util.SparseLongArray longMap = null;\n",
- indent.c_str());
- fprintf(out, "%s android.util.SparseArray<String> stringMap = null;\n",
- indent.c_str());
- fprintf(out, "%s android.util.SparseArray<Float> floatMap = null;\n",
- indent.c_str());
- fprintf(out, "%s int keyValuePairSize = LIST_TYPE_OVERHEAD;\n",
- indent.c_str());
- fprintf(out, "%s for (int i = 0; i < count; i++) {\n", indent.c_str());
- fprintf(out, "%s final int key = valueMap.keyAt(i);\n", indent.c_str());
- fprintf(out, "%s final Object value = valueMap.valueAt(i);\n",
- indent.c_str());
- fprintf(out, "%s if (value instanceof Integer) {\n", indent.c_str());
- fprintf(out, "%s keyValuePairSize += LIST_TYPE_OVERHEAD\n",
- indent.c_str());
- fprintf(out, "%s + INT_TYPE_SIZE + INT_TYPE_SIZE;\n",
- indent.c_str());
- fprintf(out, "%s if (null == intMap) {\n", indent.c_str());
- fprintf(out, "%s intMap = new android.util.SparseIntArray();\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s intMap.put(key, (Integer) value);\n",
- indent.c_str());
- fprintf(out, "%s } else if (value instanceof Long) {\n", indent.c_str());
- fprintf(out, "%s keyValuePairSize += LIST_TYPE_OVERHEAD\n",
- indent.c_str());
- fprintf(out, "%s + INT_TYPE_SIZE + LONG_TYPE_SIZE;\n",
- indent.c_str());
- fprintf(out, "%s if (null == longMap) {\n", indent.c_str());
- fprintf(out,
- "%s longMap = new "
- "android.util.SparseLongArray();\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s longMap.put(key, (Long) value);\n", indent.c_str());
- fprintf(out, "%s } else if (value instanceof String) {\n",
- indent.c_str());
- fprintf(out,
- "%s final String str = (value == null) ? \"\" : "
- "(String) value;\n",
- indent.c_str());
- fprintf(out,
- "%s final int len = "
- "str.getBytes(java.nio.charset.StandardCharsets.UTF_8).length;\n",
- indent.c_str());
- fprintf(out,
- "%s keyValuePairSize += LIST_TYPE_OVERHEAD + "
- "INT_TYPE_SIZE\n",
- indent.c_str());
- fprintf(out, "%s + STRING_TYPE_OVERHEAD + len;\n",
- indent.c_str());
- fprintf(out, "%s if (null == stringMap) {\n", indent.c_str());
- fprintf(out,
- "%s stringMap = new "
- "android.util.SparseArray<>();\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s stringMap.put(key, str);\n", indent.c_str());
- fprintf(out, "%s } else if (value instanceof Float) {\n",
- indent.c_str());
- fprintf(out, "%s keyValuePairSize += LIST_TYPE_OVERHEAD\n",
- indent.c_str());
- fprintf(out, "%s + INT_TYPE_SIZE + FLOAT_TYPE_SIZE;\n",
- indent.c_str());
- fprintf(out, "%s if (null == floatMap) {\n", indent.c_str());
- fprintf(out,
- "%s floatMap = new "
- "android.util.SparseArray<>();\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s floatMap.put(key, (Float) value);\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s needed += keyValuePairSize;\n", indent.c_str());
- break;
- }
- default:
- // Unsupported types: OBJECT, DOUBLE.
- fprintf(stderr, "Module logging does not yet support Object and Double.\n");
- return 1;
- }
- argIndex++;
- }
-
- // Now we have the size that is needed. Check for overflow and return if
- // needed.
- fprintf(out, "%s if (needed > MAX_EVENT_PAYLOAD) {\n", indent.c_str());
- fprintf(out, "%s return;\n", indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
-
- // Create new buffer, and associated data types.
- fprintf(out, "%s byte[] buff = new byte[needed];\n", indent.c_str());
- fprintf(out, "%s int pos = 0;\n", indent.c_str());
-
- // Initialize the buffer with list data type.
- fprintf(out, "%s buff[pos] = LIST_TYPE;\n", indent.c_str());
- fprintf(out, "%s buff[pos + 1] = %zu;\n", indent.c_str(), signature.size() + 2);
- fprintf(out, "%s pos += LIST_TYPE_OVERHEAD;\n", indent.c_str());
-
- // Write timestamp.
- fprintf(out, "%s long elapsedRealtime = SystemClock.elapsedRealtimeNanos();\n",
- indent.c_str());
- fprintf(out, "%s buff[pos] = LONG_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyLong(buff, pos + 1, elapsedRealtime);\n", indent.c_str());
- fprintf(out, "%s pos += LONG_TYPE_SIZE;\n", indent.c_str());
-
- // Write atom code.
- fprintf(out, "%s buff[pos] = INT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, code);\n", indent.c_str());
- fprintf(out, "%s pos += INT_TYPE_SIZE;\n", indent.c_str());
-
- // Write the args.
- argIndex = 1;
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- switch (*arg) {
- case JAVA_TYPE_BOOLEAN:
- fprintf(out, "%s buff[pos] = INT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, arg%d? 1 : 0);\n", indent.c_str(),
- argIndex);
- fprintf(out, "%s pos += INT_TYPE_SIZE;\n", indent.c_str());
- break;
- case JAVA_TYPE_INT:
- case JAVA_TYPE_ENUM:
- fprintf(out, "%s buff[pos] = INT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, arg%d);\n", indent.c_str(),
- argIndex);
- fprintf(out, "%s pos += INT_TYPE_SIZE;\n", indent.c_str());
- break;
- case JAVA_TYPE_FLOAT:
- requiredHelpers |= JAVA_MODULE_REQUIRES_FLOAT;
- fprintf(out, "%s buff[pos] = FLOAT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyFloat(buff, pos + 1, arg%d);\n", indent.c_str(),
- argIndex);
- fprintf(out, "%s pos += FLOAT_TYPE_SIZE;\n", indent.c_str());
- break;
- case JAVA_TYPE_LONG:
- fprintf(out, "%s buff[pos] = LONG_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyLong(buff, pos + 1, arg%d);\n", indent.c_str(),
- argIndex);
- fprintf(out, "%s pos += LONG_TYPE_SIZE;\n", indent.c_str());
- break;
- case JAVA_TYPE_STRING:
- fprintf(out, "%s buff[pos] = STRING_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, arg%dBytes.length);\n",
- indent.c_str(), argIndex);
- fprintf(out,
- "%s System.arraycopy("
- "arg%dBytes, 0, buff, pos + STRING_TYPE_OVERHEAD, "
- "arg%dBytes.length);\n",
- indent.c_str(), argIndex, argIndex);
- fprintf(out, "%s pos += STRING_TYPE_OVERHEAD + arg%dBytes.length;\n",
- indent.c_str(), argIndex);
- break;
- case JAVA_TYPE_BYTE_ARRAY:
- fprintf(out, "%s buff[pos] = STRING_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, arg%d.length);\n", indent.c_str(),
- argIndex);
- fprintf(out,
- "%s System.arraycopy("
- "arg%d, 0, buff, pos + STRING_TYPE_OVERHEAD, arg%d.length);\n",
- indent.c_str(), argIndex, argIndex);
- fprintf(out, "%s pos += STRING_TYPE_OVERHEAD + arg%d.length;\n",
- indent.c_str(), argIndex);
- break;
- case JAVA_TYPE_ATTRIBUTION_CHAIN: {
- requiredHelpers |= JAVA_MODULE_REQUIRES_ATTRIBUTION;
- const char* uidName = attributionDecl.fields.front().name.c_str();
- const char* tagName = attributionDecl.fields.back().name.c_str();
-
- fprintf(out, "%s writeAttributionChain(buff, pos, %s, %s);\n",
- indent.c_str(), uidName, tagName);
- fprintf(out, "%s pos += attrSize;\n", indent.c_str());
- break;
- }
- case JAVA_TYPE_KEY_VALUE_PAIR:
- requiredHelpers |= JAVA_MODULE_REQUIRES_FLOAT;
- requiredHelpers |= JAVA_MODULE_REQUIRES_KEY_VALUE_PAIRS;
- fprintf(out,
- "%s writeKeyValuePairs(buff, pos, (byte) count, intMap, "
- "longMap, "
- "stringMap, floatMap);\n",
- indent.c_str());
- fprintf(out, "%s pos += keyValuePairSize;\n", indent.c_str());
- break;
- default:
- // Unsupported types: OBJECT, DOUBLE.
- fprintf(stderr, "Object and Double are not supported in module logging");
- return 1;
- }
- argIndex++;
- }
-
- fprintf(out, "%s StatsLog.writeRaw(buff, pos);\n", indent.c_str());
- fprintf(out, "%s}\n", indent.c_str());
- fprintf(out, "\n");
- }
-
- write_java_helpers_for_q_schema_methods(out, attributionDecl, requiredHelpers, indent);
-
- return 0;
-}
-
-void write_java_helpers_for_q_schema_methods(FILE* out, const AtomDecl& attributionDecl,
- const int requiredHelpers, const string& indent) {
- fprintf(out, "\n");
- fprintf(out, "%s// Helper methods for copying primitives\n", indent.c_str());
- fprintf(out, "%sprivate static void copyInt(byte[] buff, int pos, int val) {\n",
- indent.c_str());
- fprintf(out, "%s buff[pos] = (byte) (val);\n", indent.c_str());
- fprintf(out, "%s buff[pos + 1] = (byte) (val >> 8);\n", indent.c_str());
- fprintf(out, "%s buff[pos + 2] = (byte) (val >> 16);\n", indent.c_str());
- fprintf(out, "%s buff[pos + 3] = (byte) (val >> 24);\n", indent.c_str());
- fprintf(out, "%s return;\n", indent.c_str());
- fprintf(out, "%s}\n", indent.c_str());
- fprintf(out, "\n");
-
- fprintf(out, "%sprivate static void copyLong(byte[] buff, int pos, long val) {\n",
- indent.c_str());
- fprintf(out, "%s buff[pos] = (byte) (val);\n", indent.c_str());
- fprintf(out, "%s buff[pos + 1] = (byte) (val >> 8);\n", indent.c_str());
- fprintf(out, "%s buff[pos + 2] = (byte) (val >> 16);\n", indent.c_str());
- fprintf(out, "%s buff[pos + 3] = (byte) (val >> 24);\n", indent.c_str());
- fprintf(out, "%s buff[pos + 4] = (byte) (val >> 32);\n", indent.c_str());
- fprintf(out, "%s buff[pos + 5] = (byte) (val >> 40);\n", indent.c_str());
- fprintf(out, "%s buff[pos + 6] = (byte) (val >> 48);\n", indent.c_str());
- fprintf(out, "%s buff[pos + 7] = (byte) (val >> 56);\n", indent.c_str());
- fprintf(out, "%s return;\n", indent.c_str());
- fprintf(out, "%s}\n", indent.c_str());
- fprintf(out, "\n");
-
- if (requiredHelpers & JAVA_MODULE_REQUIRES_FLOAT) {
- fprintf(out, "%sprivate static void copyFloat(byte[] buff, int pos, float val) {\n",
- indent.c_str());
- fprintf(out, "%s copyInt(buff, pos, Float.floatToIntBits(val));\n", indent.c_str());
- fprintf(out, "%s return;\n", indent.c_str());
- fprintf(out, "%s}\n", indent.c_str());
- fprintf(out, "\n");
- }
-
- if (requiredHelpers & JAVA_MODULE_REQUIRES_ATTRIBUTION) {
- fprintf(out, "%sprivate static void writeAttributionChain(byte[] buff, int pos",
- indent.c_str());
- for (auto chainField : attributionDecl.fields) {
- fprintf(out, ", %s[] %s", java_type_name(chainField.javaType), chainField.name.c_str());
- }
- fprintf(out, ") {\n");
-
- const char* uidName = attributionDecl.fields.front().name.c_str();
- const char* tagName = attributionDecl.fields.back().name.c_str();
-
- // Write the first list begin.
- fprintf(out, "%s buff[pos] = LIST_TYPE;\n", indent.c_str());
- fprintf(out, "%s buff[pos + 1] = (byte) (%s.length);\n", indent.c_str(), tagName);
- fprintf(out, "%s pos += LIST_TYPE_OVERHEAD;\n", indent.c_str());
-
- // Iterate through the attribution chain and write the nodes.
- fprintf(out, "%s for (int i = 0; i < %s.length; i++) {\n", indent.c_str(), tagName);
- // Write the list begin.
- fprintf(out, "%s buff[pos] = LIST_TYPE;\n", indent.c_str());
- fprintf(out, "%s buff[pos + 1] = %lu;\n", indent.c_str(),
- attributionDecl.fields.size());
- fprintf(out, "%s pos += LIST_TYPE_OVERHEAD;\n", indent.c_str());
-
- // Write the uid.
- fprintf(out, "%s buff[pos] = INT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, %s[i]);\n", indent.c_str(), uidName);
- fprintf(out, "%s pos += INT_TYPE_SIZE;\n", indent.c_str());
-
- // Write the tag.
- fprintf(out, "%s String %sStr = (%s[i] == null) ? \"\" : %s[i];\n", indent.c_str(),
- tagName, tagName, tagName);
- fprintf(out,
- "%s byte[] %sByte = "
- "%sStr.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n",
- indent.c_str(), tagName, tagName);
- fprintf(out, "%s buff[pos] = STRING_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, %sByte.length);\n", indent.c_str(), tagName);
- fprintf(out,
- "%s System.arraycopy("
- "%sByte, 0, buff, pos + STRING_TYPE_OVERHEAD, %sByte.length);\n",
- indent.c_str(), tagName, tagName);
- fprintf(out, "%s pos += STRING_TYPE_OVERHEAD + %sByte.length;\n", indent.c_str(),
- tagName);
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s}\n", indent.c_str());
- fprintf(out, "\n");
- }
-
- if (requiredHelpers & JAVA_MODULE_REQUIRES_KEY_VALUE_PAIRS) {
- fprintf(out,
- "%sprivate static void writeKeyValuePairs(byte[] buff, int pos, "
- "byte numPairs,\n",
- indent.c_str());
- fprintf(out, "%s final android.util.SparseIntArray intMap,\n", indent.c_str());
- fprintf(out, "%s final android.util.SparseLongArray longMap,\n", indent.c_str());
- fprintf(out, "%s final android.util.SparseArray<String> stringMap,\n",
- indent.c_str());
- fprintf(out, "%s final android.util.SparseArray<Float> floatMap) {\n",
- indent.c_str());
-
- // Start list of lists.
- fprintf(out, "%s buff[pos] = LIST_TYPE;\n", indent.c_str());
- fprintf(out, "%s buff[pos + 1] = (byte) numPairs;\n", indent.c_str());
- fprintf(out, "%s pos += LIST_TYPE_OVERHEAD;\n", indent.c_str());
-
- // Write integers.
- fprintf(out, "%s final int intMapSize = null == intMap ? 0 : intMap.size();\n",
- indent.c_str());
- fprintf(out, "%s for (int i = 0; i < intMapSize; i++) {\n", indent.c_str());
- fprintf(out, "%s buff[pos] = LIST_TYPE;\n", indent.c_str());
- fprintf(out, "%s buff[pos + 1] = (byte) 2;\n", indent.c_str());
- fprintf(out, "%s pos += LIST_TYPE_OVERHEAD;\n", indent.c_str());
- fprintf(out, "%s final int key = intMap.keyAt(i);\n", indent.c_str());
- fprintf(out, "%s final int value = intMap.valueAt(i);\n", indent.c_str());
- fprintf(out, "%s buff[pos] = INT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, key);\n", indent.c_str());
- fprintf(out, "%s pos += INT_TYPE_SIZE;\n", indent.c_str());
- fprintf(out, "%s buff[pos] = INT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, value);\n", indent.c_str());
- fprintf(out, "%s pos += INT_TYPE_SIZE;\n", indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
-
- // Write longs.
- fprintf(out, "%s final int longMapSize = null == longMap ? 0 : longMap.size();\n",
- indent.c_str());
- fprintf(out, "%s for (int i = 0; i < longMapSize; i++) {\n", indent.c_str());
- fprintf(out, "%s buff[pos] = LIST_TYPE;\n", indent.c_str());
- fprintf(out, "%s buff[pos + 1] = (byte) 2;\n", indent.c_str());
- fprintf(out, "%s pos += LIST_TYPE_OVERHEAD;\n", indent.c_str());
- fprintf(out, "%s final int key = longMap.keyAt(i);\n", indent.c_str());
- fprintf(out, "%s final long value = longMap.valueAt(i);\n", indent.c_str());
- fprintf(out, "%s buff[pos] = INT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, key);\n", indent.c_str());
- fprintf(out, "%s pos += INT_TYPE_SIZE;\n", indent.c_str());
- fprintf(out, "%s buff[pos] = LONG_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyLong(buff, pos + 1, value);\n", indent.c_str());
- fprintf(out, "%s pos += LONG_TYPE_SIZE;\n", indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
-
- // Write Strings.
- fprintf(out,
- "%s final int stringMapSize = null == stringMap ? 0 : "
- "stringMap.size();\n",
- indent.c_str());
- fprintf(out, "%s for (int i = 0; i < stringMapSize; i++) {\n", indent.c_str());
- fprintf(out, "%s buff[pos] = LIST_TYPE;\n", indent.c_str());
- fprintf(out, "%s buff[pos + 1] = (byte) 2;\n", indent.c_str());
- fprintf(out, "%s pos += LIST_TYPE_OVERHEAD;\n", indent.c_str());
- fprintf(out, "%s final int key = stringMap.keyAt(i);\n", indent.c_str());
- fprintf(out, "%s final String value = stringMap.valueAt(i);\n", indent.c_str());
- fprintf(out,
- "%s final byte[] valueBytes = "
- "value.getBytes(java.nio.charset.StandardCharsets.UTF_8);\n",
- indent.c_str());
- fprintf(out, "%s buff[pos] = INT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, key);\n", indent.c_str());
- fprintf(out, "%s pos += INT_TYPE_SIZE;\n", indent.c_str());
- fprintf(out, "%s buff[pos] = STRING_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, valueBytes.length);\n", indent.c_str());
- fprintf(out,
- "%s System.arraycopy("
- "valueBytes, 0, buff, pos + STRING_TYPE_OVERHEAD, "
- "valueBytes.length);\n",
- indent.c_str());
- fprintf(out, "%s pos += STRING_TYPE_OVERHEAD + valueBytes.length;\n",
- indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
-
- // Write floats.
- fprintf(out,
- "%s final int floatMapSize = null == floatMap ? 0 : "
- "floatMap.size();\n",
- indent.c_str());
- fprintf(out, "%s for (int i = 0; i < floatMapSize; i++) {\n", indent.c_str());
- fprintf(out, "%s buff[pos] = LIST_TYPE;\n", indent.c_str());
- fprintf(out, "%s buff[pos + 1] = (byte) 2;\n", indent.c_str());
- fprintf(out, "%s pos += LIST_TYPE_OVERHEAD;\n", indent.c_str());
- fprintf(out, "%s final int key = floatMap.keyAt(i);\n", indent.c_str());
- fprintf(out, "%s final float value = floatMap.valueAt(i);\n", indent.c_str());
- fprintf(out, "%s buff[pos] = INT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyInt(buff, pos + 1, key);\n", indent.c_str());
- fprintf(out, "%s pos += INT_TYPE_SIZE;\n", indent.c_str());
- fprintf(out, "%s buff[pos] = FLOAT_TYPE;\n", indent.c_str());
- fprintf(out, "%s copyFloat(buff, pos + 1, value);\n", indent.c_str());
- fprintf(out, "%s pos += FLOAT_TYPE_SIZE;\n", indent.c_str());
- fprintf(out, "%s }\n", indent.c_str());
- fprintf(out, "%s}\n", indent.c_str());
- fprintf(out, "\n");
- }
-}
-
-// This method is called in main.cpp to generate StatsLog for modules that's
-// compatible with Q at compile-time.
-int write_stats_log_java_q_for_module(FILE* out, const Atoms& atoms,
- const AtomDecl& attributionDecl, const string& javaClass,
- const string& javaPackage, const bool supportWorkSource) {
- // Print prelude
- fprintf(out, "// This file is autogenerated\n");
- fprintf(out, "\n");
- fprintf(out, "package %s;\n", javaPackage.c_str());
- fprintf(out, "\n");
- fprintf(out, "import static java.nio.charset.StandardCharsets.UTF_8;\n");
- fprintf(out, "\n");
- fprintf(out, "import android.util.StatsLog;\n");
- fprintf(out, "import android.os.SystemClock;\n");
- fprintf(out, "\n");
- fprintf(out, "\n");
- fprintf(out, "/**\n");
- fprintf(out, " * Utility class for logging statistics events.\n");
- fprintf(out, " */\n");
- fprintf(out, "public class %s {\n", javaClass.c_str());
-
- write_java_q_logging_constants(out, " ");
-
- write_java_atom_codes(out, atoms);
-
- write_java_enum_values(out, atoms);
-
- int errors = 0;
- // Print write methods
- fprintf(out, " // Write methods\n");
- errors += write_java_methods_q_schema(out, atoms.signatureInfoMap, attributionDecl, " ");
- errors += write_java_non_chained_methods(out, atoms.nonChainedSignatureInfoMap);
- if (supportWorkSource) {
- errors += write_java_work_source_methods(out, atoms.signatureInfoMap);
- }
-
- fprintf(out, "}\n");
-
- return errors;
-}
-
-} // namespace stats_log_api_gen
-} // namespace android
diff --git a/tools/stats_log_api_gen/java_writer_q.h b/tools/stats_log_api_gen/java_writer_q.h
deleted file mode 100644
index c511a8436416..000000000000
--- a/tools/stats_log_api_gen/java_writer_q.h
+++ /dev/null
@@ -1,46 +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.
- */
-
-#pragma once
-
-#include <stdio.h>
-#include <string.h>
-
-#include <map>
-#include <set>
-#include <vector>
-
-#include "Collation.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-using namespace std;
-
-void write_java_q_logging_constants(FILE* out, const string& indent);
-
-int write_java_methods_q_schema(FILE* out, const SignatureInfoMap& signatureInfoMap,
- const AtomDecl& attributionDecl, const string& indent);
-
-void write_java_helpers_for_q_schema_methods(FILE* out, const AtomDecl& attributionDecl,
- const int requiredHelpers, const string& indent);
-
-int write_stats_log_java_q_for_module(FILE* out, const Atoms& atoms,
- const AtomDecl& attributionDecl, const string& javaClass,
- const string& javaPackage, const bool supportWorkSource);
-
-} // namespace stats_log_api_gen
-} // namespace android
diff --git a/tools/stats_log_api_gen/main.cpp b/tools/stats_log_api_gen/main.cpp
deleted file mode 100644
index 416dfdd1ae10..000000000000
--- a/tools/stats_log_api_gen/main.cpp
+++ /dev/null
@@ -1,264 +0,0 @@
-
-#include <getopt.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include <map>
-#include <set>
-#include <vector>
-
-#include "Collation.h"
-#include "frameworks/proto_logging/stats/atoms.pb.h"
-#include "java_writer.h"
-#include "java_writer_q.h"
-#include "native_writer.h"
-#include "utils.h"
-
-using namespace google::protobuf;
-using namespace std;
-
-namespace android {
-namespace stats_log_api_gen {
-
-using android::os::statsd::Atom;
-
-static void print_usage() {
- fprintf(stderr, "usage: stats-log-api-gen OPTIONS\n");
- fprintf(stderr, "\n");
- fprintf(stderr, "OPTIONS\n");
- fprintf(stderr, " --cpp FILENAME the header file to output for write helpers\n");
- fprintf(stderr, " --header FILENAME the cpp file to output for write helpers\n");
- fprintf(stderr, " --help this message\n");
- fprintf(stderr, " --java FILENAME the java file to output\n");
- fprintf(stderr, " --module NAME optional, module name to generate outputs for\n");
- fprintf(stderr,
- " --namespace COMMA,SEP,NAMESPACE required for cpp/header with "
- "module\n");
- fprintf(stderr,
- " comma separated namespace of "
- "the files\n");
- fprintf(stderr,
- " --importHeader NAME required for cpp/jni to say which header to "
- "import "
- "for write helpers\n");
- fprintf(stderr, " --javaPackage PACKAGE the package for the java file.\n");
- fprintf(stderr, " required for java with module\n");
- fprintf(stderr, " --javaClass CLASS the class name of the java class.\n");
- fprintf(stderr, " Optional for Java with module.\n");
- fprintf(stderr, " Default is \"StatsLogInternal\"\n");
- fprintf(stderr, " --supportQ Include runtime support for Android Q.\n");
- fprintf(stderr,
- " --worksource Include support for logging WorkSource "
- "objects.\n");
- fprintf(stderr,
- " --compileQ Include compile-time support for Android Q "
- "(Java only).\n");
-}
-
-/**
- * Do the argument parsing and execute the tasks.
- */
-static int run(int argc, char const* const* argv) {
- string cppFilename;
- string headerFilename;
- string javaFilename;
- string javaPackage;
- string javaClass;
-
- string moduleName = DEFAULT_MODULE_NAME;
- string cppNamespace = DEFAULT_CPP_NAMESPACE;
- string cppHeaderImport = DEFAULT_CPP_HEADER_IMPORT;
- bool supportQ = false;
- bool supportWorkSource = false;
- bool compileQ = false;
-
- int index = 1;
- while (index < argc) {
- if (0 == strcmp("--help", argv[index])) {
- print_usage();
- return 0;
- } else if (0 == strcmp("--cpp", argv[index])) {
- index++;
- if (index >= argc) {
- print_usage();
- return 1;
- }
- cppFilename = argv[index];
- } else if (0 == strcmp("--header", argv[index])) {
- index++;
- if (index >= argc) {
- print_usage();
- return 1;
- }
- headerFilename = argv[index];
- } else if (0 == strcmp("--java", argv[index])) {
- index++;
- if (index >= argc) {
- print_usage();
- return 1;
- }
- javaFilename = argv[index];
- } else if (0 == strcmp("--module", argv[index])) {
- index++;
- if (index >= argc) {
- print_usage();
- return 1;
- }
- moduleName = argv[index];
- } else if (0 == strcmp("--namespace", argv[index])) {
- index++;
- if (index >= argc) {
- print_usage();
- return 1;
- }
- cppNamespace = argv[index];
- } else if (0 == strcmp("--importHeader", argv[index])) {
- index++;
- if (index >= argc) {
- print_usage();
- return 1;
- }
- cppHeaderImport = argv[index];
- } else if (0 == strcmp("--javaPackage", argv[index])) {
- index++;
- if (index >= argc) {
- print_usage();
- return 1;
- }
- javaPackage = argv[index];
- } else if (0 == strcmp("--javaClass", argv[index])) {
- index++;
- if (index >= argc) {
- print_usage();
- return 1;
- }
- javaClass = argv[index];
- } else if (0 == strcmp("--supportQ", argv[index])) {
- supportQ = true;
- } else if (0 == strcmp("--worksource", argv[index])) {
- supportWorkSource = true;
- } else if (0 == strcmp("--compileQ", argv[index])) {
- compileQ = true;
- }
-
- index++;
- }
-
- if (cppFilename.size() == 0 && headerFilename.size() == 0 && javaFilename.size() == 0) {
- print_usage();
- return 1;
- }
-
- if (DEFAULT_MODULE_NAME == moduleName && (supportQ || compileQ)) {
- // Support for Q schema is not needed for default module.
- fprintf(stderr, "%s cannot support Q schema\n", moduleName.c_str());
- return 1;
- }
-
- if (supportQ && compileQ) {
- // Runtime Q support is redundant if compile-time Q support is required.
- fprintf(stderr, "Cannot specify compileQ and supportQ simultaneously.\n");
- return 1;
- }
-
- // Collate the parameters
- Atoms atoms;
- int errorCount = collate_atoms(Atom::descriptor(), moduleName, &atoms);
- if (errorCount != 0) {
- return 1;
- }
-
- AtomDecl attributionDecl;
- vector<java_type_t> attributionSignature;
- collate_atom(android::os::statsd::AttributionNode::descriptor(), &attributionDecl,
- &attributionSignature);
-
- // Write the .cpp file
- if (cppFilename.size() != 0) {
- FILE* out = fopen(cppFilename.c_str(), "w");
- if (out == NULL) {
- fprintf(stderr, "Unable to open file for write: %s\n", cppFilename.c_str());
- return 1;
- }
- // If this is for a specific module, the namespace must also be provided.
- if (moduleName != DEFAULT_MODULE_NAME && cppNamespace == DEFAULT_CPP_NAMESPACE) {
- fprintf(stderr, "Must supply --namespace if supplying a specific module\n");
- return 1;
- }
- // If this is for a specific module, the header file to import must also be
- // provided.
- if (moduleName != DEFAULT_MODULE_NAME && cppHeaderImport == DEFAULT_CPP_HEADER_IMPORT) {
- fprintf(stderr, "Must supply --headerImport if supplying a specific module\n");
- return 1;
- }
- errorCount = android::stats_log_api_gen::write_stats_log_cpp(
- out, atoms, attributionDecl, cppNamespace, cppHeaderImport, supportQ);
- fclose(out);
- }
-
- // Write the .h file
- if (headerFilename.size() != 0) {
- FILE* out = fopen(headerFilename.c_str(), "w");
- if (out == NULL) {
- fprintf(stderr, "Unable to open file for write: %s\n", headerFilename.c_str());
- return 1;
- }
- // If this is for a specific module, the namespace must also be provided.
- if (moduleName != DEFAULT_MODULE_NAME && cppNamespace == DEFAULT_CPP_NAMESPACE) {
- fprintf(stderr, "Must supply --namespace if supplying a specific module\n");
- }
- errorCount = android::stats_log_api_gen::write_stats_log_header(out, atoms, attributionDecl,
- cppNamespace);
- fclose(out);
- }
-
- // Write the .java file
- if (javaFilename.size() != 0) {
- if (javaClass.size() == 0) {
- fprintf(stderr, "Must supply --javaClass if supplying a Java filename");
- return 1;
- }
-
- if (javaPackage.size() == 0) {
- fprintf(stderr, "Must supply --javaPackage if supplying a Java filename");
- return 1;
- }
-
- if (moduleName.size() == 0) {
- fprintf(stderr, "Must supply --module if supplying a Java filename");
- return 1;
- }
-
- FILE* out = fopen(javaFilename.c_str(), "w");
- if (out == NULL) {
- fprintf(stderr, "Unable to open file for write: %s\n", javaFilename.c_str());
- return 1;
- }
-
- if (compileQ) {
- errorCount = android::stats_log_api_gen::write_stats_log_java_q_for_module(
- out, atoms, attributionDecl, javaClass, javaPackage, supportWorkSource);
- } else {
- errorCount = android::stats_log_api_gen::write_stats_log_java(
- out, atoms, attributionDecl, javaClass, javaPackage, supportQ,
- supportWorkSource);
- }
-
- fclose(out);
- }
-
- return errorCount;
-}
-
-} // namespace stats_log_api_gen
-} // namespace android
-
-/**
- * Main.
- */
-int main(int argc, char const* const* argv) {
- GOOGLE_PROTOBUF_VERIFY_VERSION;
-
- return android::stats_log_api_gen::run(argc, argv);
-}
diff --git a/tools/stats_log_api_gen/native_writer.cpp b/tools/stats_log_api_gen/native_writer.cpp
deleted file mode 100644
index 0c6c0099e459..000000000000
--- a/tools/stats_log_api_gen/native_writer.cpp
+++ /dev/null
@@ -1,355 +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.
- */
-
-#include "native_writer.h"
-
-#include "utils.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-static void write_native_annotation_constants(FILE* out) {
- fprintf(out, "// Annotation constants.\n");
-
- for (const auto& [id, name] : ANNOTATION_ID_CONSTANTS) {
- fprintf(out, "const uint8_t %s = %hhu;\n", name.c_str(), id);
- }
- fprintf(out, "\n");
-}
-
-static void write_annotations(FILE* out, int argIndex,
- const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet,
- const string& methodPrefix, const string& methodSuffix) {
- FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt =
- fieldNumberToAtomDeclSet.find(argIndex);
- if (fieldNumberToAtomDeclSet.end() == fieldNumberToAtomDeclSetIt) {
- return;
- }
- const AtomDeclSet& atomDeclSet = fieldNumberToAtomDeclSetIt->second;
- for (const shared_ptr<AtomDecl>& atomDecl : atomDeclSet) {
- const string atomConstant = make_constant_name(atomDecl->name);
- fprintf(out, " if (%s == code) {\n", atomConstant.c_str());
- const AnnotationSet& annotations = atomDecl->fieldNumberToAnnotations.at(argIndex);
- int resetState = -1;
- int defaultState = -1;
- for (const shared_ptr<Annotation>& annotation : annotations) {
- const string& annotationConstant = ANNOTATION_ID_CONSTANTS.at(annotation->annotationId);
- switch (annotation->type) {
- case ANNOTATION_TYPE_INT:
- if (ANNOTATION_ID_TRIGGER_STATE_RESET == annotation->annotationId) {
- resetState = annotation->value.intValue;
- } else if (ANNOTATION_ID_DEFAULT_STATE == annotation->annotationId) {
- defaultState = annotation->value.intValue;
- } else {
- fprintf(out, " %saddInt32Annotation(%s%s, %d);\n",
- methodPrefix.c_str(), methodSuffix.c_str(),
- annotationConstant.c_str(), annotation->value.intValue);
- }
- break;
- case ANNOTATION_TYPE_BOOL:
- // TODO(b/151786433): Write annotation constant name instead of
- // annotation id literal.
- fprintf(out, " %saddBoolAnnotation(%s%s, %s);\n", methodPrefix.c_str(),
- methodSuffix.c_str(), annotationConstant.c_str(),
- annotation->value.boolValue ? "true" : "false");
- break;
- default:
- break;
- }
- }
- if (defaultState != -1 && resetState != -1) {
- const string& annotationConstant =
- ANNOTATION_ID_CONSTANTS.at(ANNOTATION_ID_TRIGGER_STATE_RESET);
- fprintf(out, " if (arg%d == %d) {\n", argIndex, resetState);
- fprintf(out, " %saddInt32Annotation(%s%s, %d);\n", methodPrefix.c_str(),
- methodSuffix.c_str(), annotationConstant.c_str(), defaultState);
- fprintf(out, " }\n");
- }
- fprintf(out, " }\n");
- }
-}
-
-static int write_native_stats_write_methods(FILE* out, const Atoms& atoms,
- const AtomDecl& attributionDecl, const bool supportQ) {
- fprintf(out, "\n");
- for (auto signatureInfoMapIt = atoms.signatureInfoMap.begin();
- signatureInfoMapIt != atoms.signatureInfoMap.end(); signatureInfoMapIt++) {
- vector<java_type_t> signature = signatureInfoMapIt->first;
- const FieldNumberToAtomDeclSet& fieldNumberToAtomDeclSet = signatureInfoMapIt->second;
- // Key value pairs not supported in native.
- if (find(signature.begin(), signature.end(), JAVA_TYPE_KEY_VALUE_PAIR) != signature.end()) {
- continue;
- }
- write_native_method_signature(out, "int stats_write", signature, attributionDecl, " {");
-
- int argIndex = 1;
- if (supportQ) {
- fprintf(out, " StatsEventCompat event;\n");
- fprintf(out, " event.setAtomId(code);\n");
- write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAtomDeclSet, "event.", "");
- for (vector<java_type_t>::const_iterator arg = signature.begin();
- arg != signature.end(); arg++) {
- switch (*arg) {
- case JAVA_TYPE_ATTRIBUTION_CHAIN: {
- const char* uidName = attributionDecl.fields.front().name.c_str();
- const char* tagName = attributionDecl.fields.back().name.c_str();
- fprintf(out, " event.writeAttributionChain(%s, %s_length, %s);\n",
- uidName, uidName, tagName);
- break;
- }
- case JAVA_TYPE_BYTE_ARRAY:
- fprintf(out, " event.writeByteArray(arg%d.arg, arg%d.arg_length);\n",
- argIndex, argIndex);
- break;
- case JAVA_TYPE_BOOLEAN:
- fprintf(out, " event.writeBool(arg%d);\n", argIndex);
- break;
- case JAVA_TYPE_INT: // Fall through.
- case JAVA_TYPE_ENUM:
- fprintf(out, " event.writeInt32(arg%d);\n", argIndex);
- break;
- case JAVA_TYPE_FLOAT:
- fprintf(out, " event.writeFloat(arg%d);\n", argIndex);
- break;
- case JAVA_TYPE_LONG:
- fprintf(out, " event.writeInt64(arg%d);\n", argIndex);
- break;
- case JAVA_TYPE_STRING:
- fprintf(out, " event.writeString(arg%d);\n", argIndex);
- break;
- default:
- // Unsupported types: OBJECT, DOUBLE, KEY_VALUE_PAIRS.
- fprintf(stderr, "Encountered unsupported type.");
- return 1;
- }
- write_annotations(out, argIndex, fieldNumberToAtomDeclSet, "event.", "");
- argIndex++;
- }
- fprintf(out, " return event.writeToSocket();\n");
- } else {
- fprintf(out, " AStatsEvent* event = AStatsEvent_obtain();\n");
- fprintf(out, " AStatsEvent_setAtomId(event, code);\n");
- write_annotations(out, ATOM_ID_FIELD_NUMBER, fieldNumberToAtomDeclSet, "AStatsEvent_",
- "event, ");
- for (vector<java_type_t>::const_iterator arg = signature.begin();
- arg != signature.end(); arg++) {
- switch (*arg) {
- case JAVA_TYPE_ATTRIBUTION_CHAIN: {
- const char* uidName = attributionDecl.fields.front().name.c_str();
- const char* tagName = attributionDecl.fields.back().name.c_str();
- fprintf(out,
- " AStatsEvent_writeAttributionChain(event, "
- "reinterpret_cast<const uint32_t*>(%s), %s.data(), "
- "static_cast<uint8_t>(%s_length));\n",
- uidName, tagName, uidName);
- break;
- }
- case JAVA_TYPE_BYTE_ARRAY:
- fprintf(out,
- " AStatsEvent_writeByteArray(event, "
- "reinterpret_cast<const uint8_t*>(arg%d.arg), "
- "arg%d.arg_length);\n",
- argIndex, argIndex);
- break;
- case JAVA_TYPE_BOOLEAN:
- fprintf(out, " AStatsEvent_writeBool(event, arg%d);\n", argIndex);
- break;
- case JAVA_TYPE_INT: // Fall through.
- case JAVA_TYPE_ENUM:
- fprintf(out, " AStatsEvent_writeInt32(event, arg%d);\n", argIndex);
- break;
- case JAVA_TYPE_FLOAT:
- fprintf(out, " AStatsEvent_writeFloat(event, arg%d);\n", argIndex);
- break;
- case JAVA_TYPE_LONG:
- fprintf(out, " AStatsEvent_writeInt64(event, arg%d);\n", argIndex);
- break;
- case JAVA_TYPE_STRING:
- fprintf(out, " AStatsEvent_writeString(event, arg%d);\n", argIndex);
- break;
- default:
- // Unsupported types: OBJECT, DOUBLE, KEY_VALUE_PAIRS
- fprintf(stderr, "Encountered unsupported type.");
- return 1;
- }
- write_annotations(out, argIndex, fieldNumberToAtomDeclSet, "AStatsEvent_",
- "event, ");
- argIndex++;
- }
- fprintf(out, " const int ret = AStatsEvent_write(event);\n");
- fprintf(out, " AStatsEvent_release(event);\n");
- fprintf(out, " return ret;\n");
- }
- fprintf(out, "}\n\n");
- }
- return 0;
-}
-
-static void write_native_stats_write_non_chained_methods(FILE* out, const Atoms& atoms,
- const AtomDecl& attributionDecl) {
- fprintf(out, "\n");
- for (auto signature_it = atoms.nonChainedSignatureInfoMap.begin();
- signature_it != atoms.nonChainedSignatureInfoMap.end(); signature_it++) {
- vector<java_type_t> signature = signature_it->first;
- // Key value pairs not supported in native.
- if (find(signature.begin(), signature.end(), JAVA_TYPE_KEY_VALUE_PAIR) != signature.end()) {
- continue;
- }
-
- write_native_method_signature(out, "int stats_write_non_chained", signature,
- attributionDecl, " {");
-
- vector<java_type_t> newSignature;
-
- // First two args form the attribution node so size goes down by 1.
- newSignature.reserve(signature.size() - 1);
-
- // First arg is Attribution Chain.
- newSignature.push_back(JAVA_TYPE_ATTRIBUTION_CHAIN);
-
- // Followed by the originial signature except the first 2 args.
- newSignature.insert(newSignature.end(), signature.begin() + 2, signature.end());
-
- const char* uidName = attributionDecl.fields.front().name.c_str();
- const char* tagName = attributionDecl.fields.back().name.c_str();
- fprintf(out, " const int32_t* %s = &arg1;\n", uidName);
- fprintf(out, " const size_t %s_length = 1;\n", uidName);
- fprintf(out, " const std::vector<char const*> %s(1, arg2);\n", tagName);
- fprintf(out, " return ");
- write_native_method_call(out, "stats_write", newSignature, attributionDecl, 2);
-
- fprintf(out, "}\n\n");
- }
-}
-
-static void write_native_method_header(FILE* out, const string& methodName,
- const SignatureInfoMap& signatureInfoMap,
- const AtomDecl& attributionDecl) {
- for (auto signatureInfoMapIt = signatureInfoMap.begin();
- signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) {
- vector<java_type_t> signature = signatureInfoMapIt->first;
-
- // Key value pairs not supported in native.
- if (find(signature.begin(), signature.end(), JAVA_TYPE_KEY_VALUE_PAIR) != signature.end()) {
- continue;
- }
- write_native_method_signature(out, methodName, signature, attributionDecl, ";");
- }
-}
-
-int write_stats_log_cpp(FILE* out, const Atoms& atoms, const AtomDecl& attributionDecl,
- const string& cppNamespace, const string& importHeader,
- const bool supportQ) {
- // Print prelude
- fprintf(out, "// This file is autogenerated\n");
- fprintf(out, "\n");
-
- fprintf(out, "#include <%s>\n", importHeader.c_str());
- if (supportQ) {
- fprintf(out, "#include <StatsEventCompat.h>\n");
- } else {
- fprintf(out, "#include <stats_event.h>\n");
- }
-
- fprintf(out, "\n");
- write_namespace(out, cppNamespace);
-
- write_native_stats_write_methods(out, atoms, attributionDecl, supportQ);
- write_native_stats_write_non_chained_methods(out, atoms, attributionDecl);
-
- // Print footer
- fprintf(out, "\n");
- write_closing_namespace(out, cppNamespace);
-
- return 0;
-}
-
-int write_stats_log_header(FILE* out, const Atoms& atoms, const AtomDecl& attributionDecl,
- const string& cppNamespace) {
- // Print prelude
- fprintf(out, "// This file is autogenerated\n");
- fprintf(out, "\n");
- fprintf(out, "#pragma once\n");
- fprintf(out, "\n");
- fprintf(out, "#include <stdint.h>\n");
- fprintf(out, "#include <vector>\n");
- fprintf(out, "#include <map>\n");
- fprintf(out, "#include <set>\n");
- fprintf(out, "\n");
-
- write_namespace(out, cppNamespace);
- fprintf(out, "\n");
- fprintf(out, "/*\n");
- fprintf(out, " * API For logging statistics events.\n");
- fprintf(out, " */\n");
- fprintf(out, "\n");
-
- write_native_atom_constants(out, atoms, attributionDecl);
-
- // Print constants for the enum values.
- fprintf(out, "//\n");
- fprintf(out, "// Constants for enum values\n");
- fprintf(out, "//\n\n");
- for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end();
- atomIt++) {
- for (vector<AtomField>::const_iterator field = (*atomIt)->fields.begin();
- field != (*atomIt)->fields.end(); field++) {
- if (field->javaType == JAVA_TYPE_ENUM) {
- fprintf(out, "// Values for %s.%s\n", (*atomIt)->message.c_str(),
- field->name.c_str());
- for (map<int, string>::const_iterator value = field->enumValues.begin();
- value != field->enumValues.end(); value++) {
- fprintf(out, "const int32_t %s__%s__%s = %d;\n",
- make_constant_name((*atomIt)->message).c_str(),
- make_constant_name(field->name).c_str(),
- make_constant_name(value->second).c_str(), value->first);
- }
- fprintf(out, "\n");
- }
- }
- }
-
- write_native_annotation_constants(out);
-
- fprintf(out, "struct BytesField {\n");
- fprintf(out,
- " BytesField(char const* array, size_t len) : arg(array), "
- "arg_length(len) {}\n");
- fprintf(out, " char const* arg;\n");
- fprintf(out, " size_t arg_length;\n");
- fprintf(out, "};\n");
- fprintf(out, "\n");
-
- // Print write methods
- fprintf(out, "//\n");
- fprintf(out, "// Write methods\n");
- fprintf(out, "//\n");
- write_native_method_header(out, "int stats_write", atoms.signatureInfoMap, attributionDecl);
-
- fprintf(out, "//\n");
- fprintf(out, "// Write flattened methods\n");
- fprintf(out, "//\n");
- write_native_method_header(out, "int stats_write_non_chained", atoms.nonChainedSignatureInfoMap,
- attributionDecl);
-
- fprintf(out, "\n");
- write_closing_namespace(out, cppNamespace);
-
- return 0;
-}
-
-} // namespace stats_log_api_gen
-} // namespace android
diff --git a/tools/stats_log_api_gen/native_writer.h b/tools/stats_log_api_gen/native_writer.h
deleted file mode 100644
index 264d4db29fc9..000000000000
--- a/tools/stats_log_api_gen/native_writer.h
+++ /dev/null
@@ -1,37 +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.
- */
-
-#pragma once
-
-#include <stdio.h>
-#include <string.h>
-
-#include "Collation.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-using namespace std;
-
-int write_stats_log_cpp(FILE* out, const Atoms& atoms, const AtomDecl& attributionDecl,
- const string& cppNamespace, const string& importHeader,
- const bool supportQ);
-
-int write_stats_log_header(FILE* out, const Atoms& atoms, const AtomDecl& attributionDecl,
- const string& cppNamespace);
-
-} // namespace stats_log_api_gen
-} // namespace android
diff --git a/tools/stats_log_api_gen/test.proto b/tools/stats_log_api_gen/test.proto
deleted file mode 100644
index a3ea78533a5e..000000000000
--- a/tools/stats_log_api_gen/test.proto
+++ /dev/null
@@ -1,215 +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.
- */
-
-syntax = "proto2";
-
-import "frameworks/proto_logging/stats/atoms.proto";
-import "frameworks/proto_logging/stats/atom_field_options.proto";
-
-package android.stats_log_api_gen;
-
-message IntAtom {
- optional int32 field1 = 1;
-}
-
-message AnotherIntAtom {
- optional int32 field1 = 1;
-}
-
-message OutOfOrderAtom {
- optional int32 field2 = 2;
- optional int32 field1 = 1;
-}
-
-enum AnEnum {
- VALUE0 = 0;
- VALUE1 = 1;
-}
-
-message AllTypesAtom {
- repeated android.os.statsd.AttributionNode attribution_chain = 1;
- optional float float_field = 2;
- optional int64 int64_field = 3;
- optional uint64 uint64_field = 4;
- optional int32 int32_field = 5;
- optional fixed64 fixed64_field = 6;
- optional fixed32 fixed32_field = 7;
- optional bool bool_field = 8;
- optional string string_field = 9;
- optional uint32 uint32_field = 10;
- optional AnEnum enum_field = 11;
- optional sfixed32 sfixed32_field = 12;
- optional sfixed64 sfixed64_field = 13;
- optional sint32 sint32_field = 14;
- optional sint64 sint64_field = 15;
-}
-
-message Event {
- oneof event {
- OutOfOrderAtom out_of_order_atom = 2;
- IntAtom int_atom = 1;
- AnotherIntAtom another_int_atom = 3;
- AllTypesAtom all_types_atom = 4;
- }
-}
-
-message BadTypesAtom {
- optional IntAtom bad_int_atom = 1;
- optional bytes bad_bytes = 2;
- repeated int32 repeated_field = 3;
- optional double double_field = 4;
-}
-
-message BadTypesEvent {
- oneof event {
- BadTypesAtom bad_types_atom = 1;
- }
-}
-
-message BadSkippedFieldSingleAtom {
- optional int32 field2 = 2;
-}
-
-message BadSkippedFieldSingle {
- oneof event {
- BadSkippedFieldSingleAtom bad = 1;
- }
-}
-
-message BadSkippedFieldMultipleAtom {
- optional int32 field1 = 1;
- optional int32 field3 = 3;
- optional int32 field5 = 5;
-}
-
-message BadSkippedFieldMultiple {
- oneof event {
- BadSkippedFieldMultipleAtom bad = 1;
- }
-}
-
-message BadAttributionNodePositionAtom {
- optional int32 field1 = 1;
- repeated android.os.statsd.AttributionNode attribution = 2;
-}
-
-message BadAttributionNodePosition {
- oneof event { BadAttributionNodePositionAtom bad = 1; }
-}
-
-message GoodEventWithBinaryFieldAtom {
- oneof event { GoodBinaryFieldAtom field1 = 1; }
-}
-
-message ComplexField {
- optional string str = 1;
-}
-
-message GoodBinaryFieldAtom {
- optional int32 field1 = 1;
- optional ComplexField bf = 2 [(android.os.statsd.log_mode) = MODE_BYTES];
-}
-
-message BadEventWithBinaryFieldAtom {
- oneof event { BadBinaryFieldAtom field1 = 1; }
-}
-
-message BadBinaryFieldAtom {
- optional int32 field1 = 1;
- optional ComplexField bf = 2;
-}
-
-message BadStateAtoms {
- oneof event {
- BadStateAtom1 bad1 = 1;
- BadStateAtom2 bad2 = 2;
- BadStateAtom3 bad3 = 3;
- }
-}
-
-message GoodStateAtoms {
- oneof event {
- GoodStateAtom1 good1 = 1;
- GoodStateAtom2 good2 = 2;
- }
-}
-
-// The atom has only primary field but no exclusive state field.
-message BadStateAtom1 {
- optional int32 uid = 1 [(android.os.statsd.state_field_option).primary_field = true];
-}
-
-// Only primative types can be annotated.
-message BadStateAtom2 {
- repeated android.os.statsd.AttributionNode attribution = 1
- [(android.os.statsd.state_field_option).primary_field = true];
- optional int32 state = 2 [(android.os.statsd.state_field_option).exclusive_state = true];
-}
-
-// Having 2 exclusive state field in the atom means the atom is badly designed.
-// E.g., putting bluetooth state and wifi state in the same atom.
-message BadStateAtom3 {
- optional int32 uid = 1 [(android.os.statsd.state_field_option).primary_field = true];
- optional int32 state = 2 [(android.os.statsd.state_field_option).exclusive_state = true];
- optional int32 state2 = 3 [(android.os.statsd.state_field_option).exclusive_state = true];
-}
-
-message GoodStateAtom1 {
- optional int32 uid = 1 [(android.os.statsd.state_field_option).primary_field = true];
- optional int32 state = 2 [(android.os.statsd.state_field_option).exclusive_state = true];
-}
-
-// Atoms can have exclusive state field, but no primary field. That means
-// the state is globally exclusive (e.g., DisplayState).
-message GoodStateAtom2 {
- optional int32 uid = 1;
- optional int32 state = 2 [(android.os.statsd.state_field_option).exclusive_state = true];
-}
-
-// We can have more than one primary fields. That means their combination is a
-// primary key.
-message GoodStateAtom3 {
- optional int32 uid = 1 [(android.os.statsd.state_field_option).primary_field = true];
- optional int32 tid = 2 [(android.os.statsd.state_field_option).primary_field = true];
- optional int32 state = 3 [(android.os.statsd.state_field_option).exclusive_state = true];
-}
-
-message ModuleOneAtom {
- optional int32 field = 1 [(android.os.statsd.is_uid) = true];
-}
-
-message ModuleTwoAtom {
- optional int32 field = 1;
-}
-
-message ModuleOneAndTwoAtom {
- optional int32 field = 1 [(android.os.statsd.state_field_option).exclusive_state = true];
-}
-
-message NoModuleAtom {
- optional string field = 1;
-}
-
-message ModuleAtoms {
- oneof event {
- ModuleOneAtom module_one_atom = 1 [(android.os.statsd.module) = "module1"];
- ModuleTwoAtom module_two_atom = 2 [(android.os.statsd.module) = "module2"];
- ModuleOneAndTwoAtom module_one_and_two_atom = 3 [
- (android.os.statsd.module) = "module1", (android.os.statsd.module) = "module2"
- ];
- NoModuleAtom no_module_atom = 4;
- }
-}
diff --git a/tools/stats_log_api_gen/test_collation.cpp b/tools/stats_log_api_gen/test_collation.cpp
deleted file mode 100644
index dbae58889333..000000000000
--- a/tools/stats_log_api_gen/test_collation.cpp
+++ /dev/null
@@ -1,369 +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.
- */
-
-#include <gtest/gtest.h>
-#include <stdio.h>
-
-#include "Collation.h"
-#include "frameworks/base/tools/stats_log_api_gen/test.pb.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-using std::map;
-using std::set;
-using std::vector;
-
-/**
- * Return whether the map contains a vector of the elements provided.
- */
-static bool map_contains_vector(const SignatureInfoMap& s, int count, ...) {
- va_list args;
- vector<java_type_t> v;
-
- va_start(args, count);
- for (int i = 0; i < count; i++) {
- v.push_back((java_type_t)va_arg(args, int));
- }
- va_end(args);
-
- return s.find(v) != s.end();
-}
-
-/**
- * Expect that the provided map contains the elements provided.
- */
-#define EXPECT_MAP_CONTAINS_SIGNATURE(s, ...) \
- do { \
- int count = sizeof((int[]){__VA_ARGS__}) / sizeof(int); \
- EXPECT_TRUE(map_contains_vector(s, count, __VA_ARGS__)); \
- } while (0)
-
-/** Expects that the provided atom has no enum values for any field. */
-#define EXPECT_NO_ENUM_FIELD(atom) \
- do { \
- for (vector<AtomField>::const_iterator field = atom->fields.begin(); \
- field != atom->fields.end(); field++) { \
- EXPECT_TRUE(field->enumValues.empty()); \
- } \
- } while (0)
-
-/** Expects that exactly one specific field has expected enum values. */
-#define EXPECT_HAS_ENUM_FIELD(atom, field_name, values) \
- do { \
- for (vector<AtomField>::const_iterator field = atom->fields.begin(); \
- field != atom->fields.end(); field++) { \
- if (field->name == field_name) { \
- EXPECT_EQ(field->enumValues, values); \
- } else { \
- EXPECT_TRUE(field->enumValues.empty()); \
- } \
- } \
- } while (0)
-
-/**
- * Test a correct collation, with all the types.
- */
-TEST(CollationTest, CollateStats) {
- Atoms atoms;
- int errorCount = collate_atoms(Event::descriptor(), DEFAULT_MODULE_NAME, &atoms);
-
- EXPECT_EQ(0, errorCount);
- EXPECT_EQ(3ul, atoms.signatureInfoMap.size());
-
- // IntAtom, AnotherIntAtom
- EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_INT);
-
- // OutOfOrderAtom
- EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_INT, JAVA_TYPE_INT);
-
- // AllTypesAtom
- EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap,
- JAVA_TYPE_ATTRIBUTION_CHAIN, // AttributionChain
- JAVA_TYPE_FLOAT, // float
- JAVA_TYPE_LONG, // int64
- JAVA_TYPE_LONG, // uint64
- JAVA_TYPE_INT, // int32
- JAVA_TYPE_LONG, // fixed64
- JAVA_TYPE_INT, // fixed32
- JAVA_TYPE_BOOLEAN, // bool
- JAVA_TYPE_STRING, // string
- JAVA_TYPE_INT, // uint32
- JAVA_TYPE_INT, // AnEnum
- JAVA_TYPE_INT, // sfixed32
- JAVA_TYPE_LONG, // sfixed64
- JAVA_TYPE_INT, // sint32
- JAVA_TYPE_LONG // sint64
- );
-
- EXPECT_EQ(4ul, atoms.decls.size());
-
- AtomDeclSet::const_iterator atomIt = atoms.decls.begin();
- EXPECT_EQ(1, (*atomIt)->code);
- EXPECT_EQ("int_atom", (*atomIt)->name);
- EXPECT_EQ("IntAtom", (*atomIt)->message);
- EXPECT_NO_ENUM_FIELD((*atomIt));
- atomIt++;
-
- EXPECT_EQ(2, (*atomIt)->code);
- EXPECT_EQ("out_of_order_atom", (*atomIt)->name);
- EXPECT_EQ("OutOfOrderAtom", (*atomIt)->message);
- EXPECT_NO_ENUM_FIELD((*atomIt));
- atomIt++;
-
- EXPECT_EQ(3, (*atomIt)->code);
- EXPECT_EQ("another_int_atom", (*atomIt)->name);
- EXPECT_EQ("AnotherIntAtom", (*atomIt)->message);
- EXPECT_NO_ENUM_FIELD((*atomIt));
- atomIt++;
-
- EXPECT_EQ(4, (*atomIt)->code);
- EXPECT_EQ("all_types_atom", (*atomIt)->name);
- EXPECT_EQ("AllTypesAtom", (*atomIt)->message);
- map<int, string> enumValues;
- enumValues[0] = "VALUE0";
- enumValues[1] = "VALUE1";
- EXPECT_HAS_ENUM_FIELD((*atomIt), "enum_field", enumValues);
- atomIt++;
-
- EXPECT_EQ(atoms.decls.end(), atomIt);
-}
-
-/**
- * Test that event class that contains stuff other than the atoms is rejected.
- */
-TEST(CollationTest, NonMessageTypeFails) {
- Atoms atoms;
- int errorCount = collate_atoms(IntAtom::descriptor(), DEFAULT_MODULE_NAME, &atoms);
-
- EXPECT_EQ(1, errorCount);
-}
-
-/**
- * Test that atoms that have non-primitive types or repeated fields are
- * rejected.
- */
-TEST(CollationTest, FailOnBadTypes) {
- Atoms atoms;
- int errorCount = collate_atoms(BadTypesEvent::descriptor(), DEFAULT_MODULE_NAME, &atoms);
-
- EXPECT_EQ(4, errorCount);
-}
-
-/**
- * Test that atoms that skip field numbers (in the first position) are rejected.
- */
-TEST(CollationTest, FailOnSkippedFieldsSingle) {
- Atoms atoms;
- int errorCount =
- collate_atoms(BadSkippedFieldSingle::descriptor(), DEFAULT_MODULE_NAME, &atoms);
-
- EXPECT_EQ(1, errorCount);
-}
-
-/**
- * Test that atoms that skip field numbers (not in the first position, and
- * multiple times) are rejected.
- */
-TEST(CollationTest, FailOnSkippedFieldsMultiple) {
- Atoms atoms;
- int errorCount =
- collate_atoms(BadSkippedFieldMultiple::descriptor(), DEFAULT_MODULE_NAME, &atoms);
-
- EXPECT_EQ(2, errorCount);
-}
-
-/**
- * Test that atoms that have an attribution chain not in the first position are
- * rejected.
- */
-TEST(CollationTest, FailBadAttributionNodePosition) {
- Atoms atoms;
- int errorCount =
- collate_atoms(BadAttributionNodePosition::descriptor(), DEFAULT_MODULE_NAME, &atoms);
-
- EXPECT_EQ(1, errorCount);
-}
-
-TEST(CollationTest, FailOnBadStateAtomOptions) {
- Atoms atoms;
- int errorCount = collate_atoms(BadStateAtoms::descriptor(), DEFAULT_MODULE_NAME, &atoms);
-
- EXPECT_EQ(3, errorCount);
-}
-
-TEST(CollationTest, PassOnGoodStateAtomOptions) {
- Atoms atoms;
- int errorCount = collate_atoms(GoodStateAtoms::descriptor(), DEFAULT_MODULE_NAME, &atoms);
- EXPECT_EQ(0, errorCount);
-}
-
-TEST(CollationTest, PassOnGoodBinaryFieldAtom) {
- Atoms atoms;
- int errorCount =
- collate_atoms(GoodEventWithBinaryFieldAtom::descriptor(), DEFAULT_MODULE_NAME, &atoms);
- EXPECT_EQ(0, errorCount);
-}
-
-TEST(CollationTest, FailOnBadBinaryFieldAtom) {
- Atoms atoms;
- int errorCount =
- collate_atoms(BadEventWithBinaryFieldAtom::descriptor(), DEFAULT_MODULE_NAME, &atoms);
- EXPECT_TRUE(errorCount > 0);
-}
-
-TEST(CollationTest, PassOnLogFromModuleAtom) {
- Atoms atoms;
- int errorCount = collate_atoms(ModuleAtoms::descriptor(), DEFAULT_MODULE_NAME, &atoms);
- EXPECT_EQ(errorCount, 0);
- EXPECT_EQ(atoms.decls.size(), 4ul);
-}
-
-TEST(CollationTest, RecognizeModuleAtom) {
- Atoms atoms;
- int errorCount = collate_atoms(ModuleAtoms::descriptor(), DEFAULT_MODULE_NAME, &atoms);
- EXPECT_EQ(errorCount, 0);
- EXPECT_EQ(atoms.decls.size(), 4ul);
- EXPECT_EQ(atoms.signatureInfoMap.size(), 2u);
- EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_INT);
- EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_STRING);
-
- SignatureInfoMap::const_iterator signatureInfoMapIt;
- const vector<java_type_t>* signature;
- const FieldNumberToAtomDeclSet* fieldNumberToAtomDeclSet;
- FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt;
- const AtomDeclSet* atomDeclSet;
- AtomDeclSet::const_iterator atomDeclSetIt;
- AtomDecl* atomDecl;
- FieldNumberToAnnotations* fieldNumberToAnnotations;
- FieldNumberToAnnotations::const_iterator fieldNumberToAnnotationsIt;
- const AnnotationSet* annotationSet;
- AnnotationSet::const_iterator annotationSetIt;
- Annotation* annotation;
-
- signatureInfoMapIt = atoms.signatureInfoMap.begin();
- signature = &(signatureInfoMapIt->first);
- fieldNumberToAtomDeclSet = &signatureInfoMapIt->second;
- EXPECT_EQ(1ul, signature->size());
- EXPECT_EQ(JAVA_TYPE_INT, signature->at(0));
- EXPECT_EQ(1ul, fieldNumberToAtomDeclSet->size());
- fieldNumberToAtomDeclSetIt = fieldNumberToAtomDeclSet->begin();
- EXPECT_EQ(1, fieldNumberToAtomDeclSetIt->first);
- atomDeclSet = &fieldNumberToAtomDeclSetIt->second;
- EXPECT_EQ(2ul, atomDeclSet->size());
- atomDeclSetIt = atomDeclSet->begin();
- atomDecl = atomDeclSetIt->get();
- EXPECT_EQ(1, atomDecl->code);
- fieldNumberToAnnotations = &atomDecl->fieldNumberToAnnotations;
- fieldNumberToAnnotationsIt = fieldNumberToAnnotations->find(1);
- EXPECT_NE(fieldNumberToAnnotations->end(), fieldNumberToAnnotationsIt);
- annotationSet = &fieldNumberToAnnotationsIt->second;
- EXPECT_EQ(1ul, annotationSet->size());
- annotationSetIt = annotationSet->begin();
- annotation = annotationSetIt->get();
- EXPECT_EQ(ANNOTATION_ID_IS_UID, annotation->annotationId);
- EXPECT_EQ(1, annotation->atomId);
- EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
- EXPECT_TRUE(annotation->value.boolValue);
-
- atomDeclSetIt++;
- atomDecl = atomDeclSetIt->get();
- EXPECT_EQ(3, atomDecl->code);
- fieldNumberToAnnotations = &atomDecl->fieldNumberToAnnotations;
- fieldNumberToAnnotationsIt = fieldNumberToAnnotations->find(1);
- EXPECT_NE(fieldNumberToAnnotations->end(), fieldNumberToAnnotationsIt);
- annotationSet = &fieldNumberToAnnotationsIt->second;
- EXPECT_EQ(1ul, annotationSet->size());
- annotationSetIt = annotationSet->begin();
- annotation = annotationSetIt->get();
- EXPECT_EQ(ANNOTATION_ID_EXCLUSIVE_STATE, annotation->annotationId);
- EXPECT_EQ(3, annotation->atomId);
- EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
- EXPECT_TRUE(annotation->value.boolValue);
-
- signatureInfoMapIt++;
- signature = &signatureInfoMapIt->first;
- fieldNumberToAtomDeclSet = &signatureInfoMapIt->second;
- EXPECT_EQ(1ul, signature->size());
- EXPECT_EQ(JAVA_TYPE_STRING, signature->at(0));
- EXPECT_EQ(0ul, fieldNumberToAtomDeclSet->size());
-}
-
-TEST(CollationTest, RecognizeModule1Atom) {
- Atoms atoms;
- const string moduleName = "module1";
- int errorCount = collate_atoms(ModuleAtoms::descriptor(), moduleName, &atoms);
- EXPECT_EQ(errorCount, 0);
- EXPECT_EQ(atoms.decls.size(), 2ul);
- EXPECT_EQ(atoms.signatureInfoMap.size(), 1u);
- EXPECT_MAP_CONTAINS_SIGNATURE(atoms.signatureInfoMap, JAVA_TYPE_INT);
-
- SignatureInfoMap::const_iterator signatureInfoMapIt;
- const vector<java_type_t>* signature;
- const FieldNumberToAtomDeclSet* fieldNumberToAtomDeclSet;
- FieldNumberToAtomDeclSet::const_iterator fieldNumberToAtomDeclSetIt;
- const AtomDeclSet* atomDeclSet;
- AtomDeclSet::const_iterator atomDeclSetIt;
- AtomDecl* atomDecl;
- FieldNumberToAnnotations* fieldNumberToAnnotations;
- FieldNumberToAnnotations::const_iterator fieldNumberToAnnotationsIt;
- const AnnotationSet* annotationSet;
- AnnotationSet::const_iterator annotationSetIt;
- Annotation* annotation;
-
- signatureInfoMapIt = atoms.signatureInfoMap.begin();
- signature = &(signatureInfoMapIt->first);
- fieldNumberToAtomDeclSet = &signatureInfoMapIt->second;
- EXPECT_EQ(1ul, signature->size());
- EXPECT_EQ(JAVA_TYPE_INT, signature->at(0));
- EXPECT_EQ(1ul, fieldNumberToAtomDeclSet->size());
- fieldNumberToAtomDeclSetIt = fieldNumberToAtomDeclSet->begin();
- EXPECT_EQ(1, fieldNumberToAtomDeclSetIt->first);
- atomDeclSet = &fieldNumberToAtomDeclSetIt->second;
- EXPECT_EQ(2ul, atomDeclSet->size());
- atomDeclSetIt = atomDeclSet->begin();
- atomDecl = atomDeclSetIt->get();
- EXPECT_EQ(1, atomDecl->code);
- fieldNumberToAnnotations = &atomDecl->fieldNumberToAnnotations;
- fieldNumberToAnnotationsIt = fieldNumberToAnnotations->find(1);
- EXPECT_NE(fieldNumberToAnnotations->end(), fieldNumberToAnnotationsIt);
- annotationSet = &fieldNumberToAnnotationsIt->second;
- EXPECT_EQ(1ul, annotationSet->size());
- annotationSetIt = annotationSet->begin();
- annotation = annotationSetIt->get();
- EXPECT_EQ(ANNOTATION_ID_IS_UID, annotation->annotationId);
- EXPECT_EQ(1, annotation->atomId);
- EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
- EXPECT_TRUE(annotation->value.boolValue);
-
- atomDeclSetIt++;
- atomDecl = atomDeclSetIt->get();
- EXPECT_EQ(3, atomDecl->code);
- fieldNumberToAnnotations = &atomDecl->fieldNumberToAnnotations;
- fieldNumberToAnnotationsIt = fieldNumberToAnnotations->find(1);
- EXPECT_NE(fieldNumberToAnnotations->end(), fieldNumberToAnnotationsIt);
- annotationSet = &fieldNumberToAnnotationsIt->second;
- EXPECT_EQ(1ul, annotationSet->size());
- annotationSetIt = annotationSet->begin();
- annotation = annotationSetIt->get();
- EXPECT_EQ(ANNOTATION_ID_EXCLUSIVE_STATE, annotation->annotationId);
- EXPECT_EQ(3, annotation->atomId);
- EXPECT_EQ(ANNOTATION_TYPE_BOOL, annotation->type);
- EXPECT_TRUE(annotation->value.boolValue);
-}
-
-} // namespace stats_log_api_gen
-} // namespace android
diff --git a/tools/stats_log_api_gen/utils.cpp b/tools/stats_log_api_gen/utils.cpp
deleted file mode 100644
index abb89133e58e..000000000000
--- a/tools/stats_log_api_gen/utils.cpp
+++ /dev/null
@@ -1,434 +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.
- */
-
-#include "utils.h"
-
-#include "android-base/strings.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-static void build_non_chained_decl_map(const Atoms& atoms,
- std::map<int, AtomDeclSet::const_iterator>* decl_map) {
- for (AtomDeclSet::const_iterator atomIt = atoms.non_chained_decls.begin();
- atomIt != atoms.non_chained_decls.end(); atomIt++) {
- decl_map->insert(std::make_pair((*atomIt)->code, atomIt));
- }
-}
-
-/**
- * Turn lower and camel case into upper case with underscores.
- */
-string make_constant_name(const string& str) {
- string result;
- const int N = str.size();
- bool underscore_next = false;
- for (int i = 0; i < N; i++) {
- char c = str[i];
- if (c >= 'A' && c <= 'Z') {
- if (underscore_next) {
- result += '_';
- underscore_next = false;
- }
- } else if (c >= 'a' && c <= 'z') {
- c = 'A' + c - 'a';
- underscore_next = true;
- } else if (c == '_') {
- underscore_next = false;
- }
- result += c;
- }
- return result;
-}
-
-const char* cpp_type_name(java_type_t type) {
- switch (type) {
- case JAVA_TYPE_BOOLEAN:
- return "bool";
- case JAVA_TYPE_INT:
- case JAVA_TYPE_ENUM:
- return "int32_t";
- case JAVA_TYPE_LONG:
- return "int64_t";
- case JAVA_TYPE_FLOAT:
- return "float";
- case JAVA_TYPE_DOUBLE:
- return "double";
- case JAVA_TYPE_STRING:
- return "char const*";
- case JAVA_TYPE_BYTE_ARRAY:
- return "const BytesField&";
- default:
- return "UNKNOWN";
- }
-}
-
-const char* java_type_name(java_type_t type) {
- switch (type) {
- case JAVA_TYPE_BOOLEAN:
- return "boolean";
- case JAVA_TYPE_INT:
- case JAVA_TYPE_ENUM:
- return "int";
- case JAVA_TYPE_LONG:
- return "long";
- case JAVA_TYPE_FLOAT:
- return "float";
- case JAVA_TYPE_DOUBLE:
- return "double";
- case JAVA_TYPE_STRING:
- return "java.lang.String";
- case JAVA_TYPE_BYTE_ARRAY:
- return "byte[]";
- default:
- return "UNKNOWN";
- }
-}
-
-// Native
-// Writes namespaces for the cpp and header files, returning the number of
-// namespaces written.
-void write_namespace(FILE* out, const string& cppNamespaces) {
- vector<string> cppNamespaceVec = android::base::Split(cppNamespaces, ",");
- for (string cppNamespace : cppNamespaceVec) {
- fprintf(out, "namespace %s {\n", cppNamespace.c_str());
- }
-}
-
-// Writes namespace closing brackets for cpp and header files.
-void write_closing_namespace(FILE* out, const string& cppNamespaces) {
- vector<string> cppNamespaceVec = android::base::Split(cppNamespaces, ",");
- for (auto it = cppNamespaceVec.rbegin(); it != cppNamespaceVec.rend(); ++it) {
- fprintf(out, "} // namespace %s\n", it->c_str());
- }
-}
-
-static void write_cpp_usage(FILE* out, const string& method_name, const string& atom_code_name,
- const shared_ptr<AtomDecl> atom, const AtomDecl& attributionDecl) {
- fprintf(out, " * Usage: %s(StatsLog.%s", method_name.c_str(), atom_code_name.c_str());
-
- for (vector<AtomField>::const_iterator field = atom->fields.begin();
- field != atom->fields.end(); field++) {
- if (field->javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- for (auto chainField : attributionDecl.fields) {
- if (chainField.javaType == JAVA_TYPE_STRING) {
- fprintf(out, ", const std::vector<%s>& %s", cpp_type_name(chainField.javaType),
- chainField.name.c_str());
- } else {
- fprintf(out, ", const %s* %s, size_t %s_length",
- cpp_type_name(chainField.javaType), chainField.name.c_str(),
- chainField.name.c_str());
- }
- }
- } else if (field->javaType == JAVA_TYPE_KEY_VALUE_PAIR) {
- fprintf(out,
- ", const std::map<int, int32_t>& %s_int"
- ", const std::map<int, int64_t>& %s_long"
- ", const std::map<int, char const*>& %s_str"
- ", const std::map<int, float>& %s_float",
- field->name.c_str(), field->name.c_str(), field->name.c_str(),
- field->name.c_str());
- } else {
- fprintf(out, ", %s %s", cpp_type_name(field->javaType), field->name.c_str());
- }
- }
- fprintf(out, ");\n");
-}
-
-void write_native_atom_constants(FILE* out, const Atoms& atoms, const AtomDecl& attributionDecl) {
- fprintf(out, "/**\n");
- fprintf(out, " * Constants for atom codes.\n");
- fprintf(out, " */\n");
- fprintf(out, "enum {\n");
-
- std::map<int, AtomDeclSet::const_iterator> atom_code_to_non_chained_decl_map;
- build_non_chained_decl_map(atoms, &atom_code_to_non_chained_decl_map);
-
- size_t i = 0;
- // Print atom constants
- for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end();
- atomIt++) {
- string constant = make_constant_name((*atomIt)->name);
- fprintf(out, "\n");
- fprintf(out, " /**\n");
- fprintf(out, " * %s %s\n", (*atomIt)->message.c_str(), (*atomIt)->name.c_str());
- write_cpp_usage(out, "stats_write", constant, *atomIt, attributionDecl);
-
- auto non_chained_decl = atom_code_to_non_chained_decl_map.find((*atomIt)->code);
- if (non_chained_decl != atom_code_to_non_chained_decl_map.end()) {
- write_cpp_usage(out, "stats_write_non_chained", constant, *non_chained_decl->second,
- attributionDecl);
- }
- fprintf(out, " */\n");
- char const* const comma = (i == atoms.decls.size() - 1) ? "" : ",";
- fprintf(out, " %s = %d%s\n", constant.c_str(), (*atomIt)->code, comma);
- i++;
- }
- fprintf(out, "\n");
- fprintf(out, "};\n");
- fprintf(out, "\n");
-}
-
-void write_native_method_signature(FILE* out, const string& methodName,
- const vector<java_type_t>& signature,
- const AtomDecl& attributionDecl, const string& closer) {
- fprintf(out, "%s(int32_t code", methodName.c_str());
- int argIndex = 1;
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- for (auto chainField : attributionDecl.fields) {
- if (chainField.javaType == JAVA_TYPE_STRING) {
- fprintf(out, ", const std::vector<%s>& %s", cpp_type_name(chainField.javaType),
- chainField.name.c_str());
- } else {
- fprintf(out, ", const %s* %s, size_t %s_length",
- cpp_type_name(chainField.javaType), chainField.name.c_str(),
- chainField.name.c_str());
- }
- }
- } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) {
- fprintf(out,
- ", const std::map<int, int32_t>& arg%d_1, "
- "const std::map<int, int64_t>& arg%d_2, "
- "const std::map<int, char const*>& arg%d_3, "
- "const std::map<int, float>& arg%d_4",
- argIndex, argIndex, argIndex, argIndex);
- } else {
- fprintf(out, ", %s arg%d", cpp_type_name(*arg), argIndex);
- }
- argIndex++;
- }
- fprintf(out, ")%s\n", closer.c_str());
-}
-
-void write_native_method_call(FILE* out, const string& methodName,
- const vector<java_type_t>& signature, const AtomDecl& attributionDecl,
- int argIndex) {
- fprintf(out, "%s(code", methodName.c_str());
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- for (auto chainField : attributionDecl.fields) {
- if (chainField.javaType == JAVA_TYPE_STRING) {
- fprintf(out, ", %s", chainField.name.c_str());
- } else {
- fprintf(out, ", %s, %s_length", chainField.name.c_str(),
- chainField.name.c_str());
- }
- }
- } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) {
- fprintf(out, ", arg%d_1, arg%d_2, arg%d_3, arg%d_4", argIndex, argIndex, argIndex,
- argIndex);
- } else {
- fprintf(out, ", arg%d", argIndex);
- }
- argIndex++;
- }
- fprintf(out, ");\n");
-}
-
-// Java
-void write_java_atom_codes(FILE* out, const Atoms& atoms) {
- fprintf(out, " // Constants for atom codes.\n");
-
- std::map<int, AtomDeclSet::const_iterator> atom_code_to_non_chained_decl_map;
- build_non_chained_decl_map(atoms, &atom_code_to_non_chained_decl_map);
-
- // Print constants for the atom codes.
- for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end();
- atomIt++) {
- string constant = make_constant_name((*atomIt)->name);
- fprintf(out, "\n");
- fprintf(out, " /**\n");
- fprintf(out, " * %s %s<br>\n", (*atomIt)->message.c_str(), (*atomIt)->name.c_str());
- write_java_usage(out, "write", constant, **atomIt);
- auto non_chained_decl = atom_code_to_non_chained_decl_map.find((*atomIt)->code);
- if (non_chained_decl != atom_code_to_non_chained_decl_map.end()) {
- write_java_usage(out, "write_non_chained", constant, **(non_chained_decl->second));
- }
- fprintf(out, " */\n");
- fprintf(out, " public static final int %s = %d;\n", constant.c_str(), (*atomIt)->code);
- }
- fprintf(out, "\n");
-}
-
-void write_java_enum_values(FILE* out, const Atoms& atoms) {
- fprintf(out, " // Constants for enum values.\n\n");
- for (AtomDeclSet::const_iterator atomIt = atoms.decls.begin(); atomIt != atoms.decls.end();
- atomIt++) {
- for (vector<AtomField>::const_iterator field = (*atomIt)->fields.begin();
- field != (*atomIt)->fields.end(); field++) {
- if (field->javaType == JAVA_TYPE_ENUM) {
- fprintf(out, " // Values for %s.%s\n", (*atomIt)->message.c_str(),
- field->name.c_str());
- for (map<int, string>::const_iterator value = field->enumValues.begin();
- value != field->enumValues.end(); value++) {
- fprintf(out, " public static final int %s__%s__%s = %d;\n",
- make_constant_name((*atomIt)->message).c_str(),
- make_constant_name(field->name).c_str(),
- make_constant_name(value->second).c_str(), value->first);
- }
- fprintf(out, "\n");
- }
- }
- }
-}
-
-void write_java_usage(FILE* out, const string& method_name, const string& atom_code_name,
- const AtomDecl& atom) {
- fprintf(out, " * Usage: StatsLog.%s(StatsLog.%s", method_name.c_str(),
- atom_code_name.c_str());
- for (vector<AtomField>::const_iterator field = atom.fields.begin(); field != atom.fields.end();
- field++) {
- if (field->javaType == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- fprintf(out, ", android.os.WorkSource workSource");
- } else if (field->javaType == JAVA_TYPE_KEY_VALUE_PAIR) {
- fprintf(out, ", android.util.SparseArray<Object> value_map");
- } else if (field->javaType == JAVA_TYPE_BYTE_ARRAY) {
- fprintf(out, ", byte[] %s", field->name.c_str());
- } else {
- fprintf(out, ", %s %s", java_type_name(field->javaType), field->name.c_str());
- }
- }
- fprintf(out, ");<br>\n");
-}
-
-int write_java_non_chained_methods(FILE* out, const SignatureInfoMap& signatureInfoMap) {
- for (auto signatureInfoMapIt = signatureInfoMap.begin();
- signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) {
- // Print method signature.
- fprintf(out, " public static void write_non_chained(int code");
- vector<java_type_t> signature = signatureInfoMapIt->first;
- int argIndex = 1;
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- fprintf(stderr, "Non chained signatures should not have attribution chains.\n");
- return 1;
- } else if (*arg == JAVA_TYPE_KEY_VALUE_PAIR) {
- fprintf(stderr, "Module logging does not yet support key value pair.\n");
- return 1;
- } else {
- fprintf(out, ", %s arg%d", java_type_name(*arg), argIndex);
- }
- argIndex++;
- }
- fprintf(out, ") {\n");
-
- fprintf(out, " write(code");
- argIndex = 1;
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- // First two args are uid and tag of attribution chain.
- if (argIndex == 1) {
- fprintf(out, ", new int[] {arg%d}", argIndex);
- } else if (argIndex == 2) {
- fprintf(out, ", new java.lang.String[] {arg%d}", argIndex);
- } else {
- fprintf(out, ", arg%d", argIndex);
- }
- argIndex++;
- }
- fprintf(out, ");\n");
- fprintf(out, " }\n");
- fprintf(out, "\n");
- }
- return 0;
-}
-
-int write_java_work_source_methods(FILE* out, const SignatureInfoMap& signatureInfoMap) {
- fprintf(out, " // WorkSource methods.\n");
- for (auto signatureInfoMapIt = signatureInfoMap.begin();
- signatureInfoMapIt != signatureInfoMap.end(); signatureInfoMapIt++) {
- vector<java_type_t> signature = signatureInfoMapIt->first;
- // Determine if there is Attribution in this signature.
- int attributionArg = -1;
- int argIndexMax = 0;
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- argIndexMax++;
- if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- if (attributionArg > -1) {
- fprintf(stderr, "An atom contains multiple AttributionNode fields.\n");
- fprintf(stderr, "This is not supported. Aborting WorkSource method writing.\n");
- fprintf(out,
- "\n// Invalid for WorkSource: more than one attribution "
- "chain.\n");
- return 1;
- }
- attributionArg = argIndexMax;
- }
- }
- if (attributionArg < 0) {
- continue;
- }
-
- fprintf(out, "\n");
- // Method header (signature)
- fprintf(out, " public static void write(int code");
- int argIndex = 1;
- for (vector<java_type_t>::const_iterator arg = signature.begin(); arg != signature.end();
- arg++) {
- if (*arg == JAVA_TYPE_ATTRIBUTION_CHAIN) {
- fprintf(out, ", android.os.WorkSource ws");
- } else {
- fprintf(out, ", %s arg%d", java_type_name(*arg), argIndex);
- }
- argIndex++;
- }
- fprintf(out, ") {\n");
-
- // write_non_chained() component. TODO: Remove when flat uids are no longer
- // needed.
- fprintf(out, " for (int i = 0; i < ws.size(); ++i) {\n");
- fprintf(out, " write_non_chained(code");
- for (int argIndex = 1; argIndex <= argIndexMax; argIndex++) {
- if (argIndex == attributionArg) {
- fprintf(out, ", ws.getUid(i), ws.getPackageName(i)");
- } else {
- fprintf(out, ", arg%d", argIndex);
- }
- }
- fprintf(out, ");\n");
- fprintf(out, " }\n"); // close for-loop
-
- // write() component.
- fprintf(out,
- " java.util.List<android.os.WorkSource.WorkChain> workChains = "
- "ws.getWorkChains();\n");
- fprintf(out, " if (workChains != null) {\n");
- fprintf(out,
- " for (android.os.WorkSource.WorkChain wc : workChains) "
- "{\n");
- fprintf(out, " write(code");
- for (int argIndex = 1; argIndex <= argIndexMax; argIndex++) {
- if (argIndex == attributionArg) {
- fprintf(out, ", wc.getUids(), wc.getTags()");
- } else {
- fprintf(out, ", arg%d", argIndex);
- }
- }
- fprintf(out, ");\n");
- fprintf(out, " }\n"); // close for-loop
- fprintf(out, " }\n"); // close if
- fprintf(out, " }\n"); // close method
- }
- return 0;
-}
-
-} // namespace stats_log_api_gen
-} // namespace android
diff --git a/tools/stats_log_api_gen/utils.h b/tools/stats_log_api_gen/utils.h
deleted file mode 100644
index 73e0cb838227..000000000000
--- a/tools/stats_log_api_gen/utils.h
+++ /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.
- */
-
-#pragma once
-
-#include <stdio.h>
-#include <string.h>
-
-#include <map>
-#include <set>
-#include <vector>
-
-#include "Collation.h"
-
-namespace android {
-namespace stats_log_api_gen {
-
-using namespace std;
-
-const string DEFAULT_CPP_NAMESPACE = "android,util";
-const string DEFAULT_CPP_HEADER_IMPORT = "statslog.h";
-
-const int JAVA_MODULE_REQUIRES_FLOAT = 0x01;
-const int JAVA_MODULE_REQUIRES_ATTRIBUTION = 0x02;
-const int JAVA_MODULE_REQUIRES_KEY_VALUE_PAIRS = 0x04;
-
-const map<AnnotationId, string> ANNOTATION_ID_CONSTANTS = {
- {ANNOTATION_ID_IS_UID, "ANNOTATION_ID_IS_UID"},
- {ANNOTATION_ID_TRUNCATE_TIMESTAMP, "ANNOTATION_ID_TRUNCATE_TIMESTAMP"},
- {ANNOTATION_ID_PRIMARY_FIELD, "ANNOTATION_ID_PRIMARY_FIELD"},
- {ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID, "ANNOTATION_ID_PRIMARY_FIELD_FIRST_UID"},
- {ANNOTATION_ID_EXCLUSIVE_STATE, "ANNOTATION_ID_EXCLUSIVE_STATE"},
- {ANNOTATION_ID_TRIGGER_STATE_RESET, "ANNOTATION_ID_TRIGGER_STATE_RESET"},
- {ANNOTATION_ID_STATE_NESTED, "ANNOTATION_ID_STATE_NESTED"}};
-
-string make_constant_name(const string& str);
-
-const char* cpp_type_name(java_type_t type);
-
-const char* java_type_name(java_type_t type);
-
-// Common Native helpers
-void write_namespace(FILE* out, const string& cppNamespaces);
-
-void write_closing_namespace(FILE* out, const string& cppNamespaces);
-
-void write_native_atom_constants(FILE* out, const Atoms& atoms, const AtomDecl& attributionDecl);
-
-void write_native_method_signature(FILE* out, const string& methodName,
- const vector<java_type_t>& signature,
- const AtomDecl& attributionDecl, const string& closer);
-
-void write_native_method_call(FILE* out, const string& methodName,
- const vector<java_type_t>& signature, const AtomDecl& attributionDecl,
- int argIndex = 1);
-
-// Common Java helpers.
-void write_java_atom_codes(FILE* out, const Atoms& atoms);
-
-void write_java_enum_values(FILE* out, const Atoms& atoms);
-
-void write_java_usage(FILE* out, const string& method_name, const string& atom_code_name,
- const AtomDecl& atom);
-
-int write_java_non_chained_methods(FILE* out, const SignatureInfoMap& signatureInfoMap);
-
-int write_java_work_source_methods(FILE* out, const SignatureInfoMap& signatureInfoMap);
-
-} // namespace stats_log_api_gen
-} // namespace android
diff --git a/wifi/Android.bp b/wifi/Android.bp
deleted file mode 100644
index 8b89959a4f05..000000000000
--- 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 b30689ca5d16..000000000000
--- 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 bf30709f15d1..000000000000
--- 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 1d06f458318f..000000000000
--- 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 d4551cfac044..000000000000
--- 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 accdaddfc848..000000000000
--- 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 237a74da3052..000000000000
--- 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 b0f5f849c7ec..000000000000
--- 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 db47f0b5aa31..000000000000
--- 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 5f497e2796d8..000000000000
--- 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 eb6995f561de..000000000000
--- 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 839af54b81ba..000000000000
--- 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 f5e4ebe4f1af..000000000000
--- 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 77305e9dae0a..000000000000
--- 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/SubscribeConfig.aidl b/wifi/aidl-export/android/net/wifi/aware/SubscribeConfig.aidl
deleted file mode 100644
index bd73d5ee5ecc..000000000000
--- 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 23d0f22e866b..000000000000
--- 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 6b1cea8edb5a..000000000000
--- 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 3d8e8330c2c4..000000000000
--- 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 6d343bde7081..000000000000
--- 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 ea3b2803d514..000000000000
--- 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 8790c6ffe903..000000000000
--- 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 6c79009315b5..000000000000
--- 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 403f2b19bfda..000000000000
--- 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 a347148622ff..000000000000
--- 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 57055f78d03d..000000000000
--- 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 e4d28bb2d39f..000000000000
--- 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 8053c9416aeb..000000000000
--- 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/ResponderConfig.aidl b/wifi/aidl-export/android/net/wifi/rtt/ResponderConfig.aidl
deleted file mode 100644
index fd3988aca06c..000000000000
--- 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 53c3b33d9845..000000000000
--- 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 892411f8c3a1..000000000000
--- 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 d802177e249b..000000000000
--- 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 d802177e249b..000000000000
--- 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 d802177e249b..000000000000
--- 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 07793c1eb02a..000000000000
--- 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 6547ee8a2188..000000000000
--- 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 a2d0dff3e712..000000000000
--- 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 75b5e728eb0d..000000000000
--- 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.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.TcpKeepalivePacketData* 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 47b712991c49..000000000000
--- 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 ed8845dd2ae3..000000000000
--- 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 b5f7c946ff05..000000000000
--- 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 6c2e6ddf5dd2..000000000000
--- 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 faa0901cb087..000000000000
--- 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 d7a958a5b4b1..000000000000
--- 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 b567f29660a7..000000000000
--- 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 d14ec57ea07a..000000000000
--- 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 524cefbb295f..000000000000
--- 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 7e25fd8a3be2..000000000000
--- 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 4687f3088eef..000000000000
--- 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 56f602510fd9..000000000000
--- 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 e7eaddd712c9..000000000000
--- 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 f81bcb9e06d7..000000000000
--- 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 b49e49ba0cd5..000000000000
--- 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 0c8e777f67ba..000000000000
--- 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 9105bd0265cb..000000000000
--- 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/IWifiManager.aidl b/wifi/java/android/net/wifi/IWifiManager.aidl
deleted file mode 100644
index 3f79364b7eef..000000000000
--- 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/ParcelUtil.java b/wifi/java/android/net/wifi/ParcelUtil.java
deleted file mode 100644
index a26877d9b095..000000000000
--- 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 9479cf0b936e..000000000000
--- 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 034defb083de..000000000000
--- 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 5589bd137bcc..000000000000
--- 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 dcb57ecc933f..000000000000
--- 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 d2ff658b59bc..000000000000
--- 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 24ed8effe471..000000000000
--- 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 de7e2b556be3..000000000000
--- 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 9926b1b5f7dc..000000000000
--- 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 acda7e06c95d..000000000000
--- 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 3794566f3d8f..000000000000
--- 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 8c32d18c035c..000000000000
--- 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 90edc4523b7b..000000000000
--- 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 1507199b0264..000000000000
--- 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 53883674e058..000000000000
--- 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 ccf8a80665aa..000000000000
--- 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 0d13805a08d8..000000000000
--- 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 95b2e77c5c1e..000000000000
--- 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 e12bb9178235..000000000000
--- 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 d8be1d2c853c..000000000000
--- 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 4163c88c0418..000000000000
--- 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 704ae81f71aa..000000000000
--- 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 8f3635fd2f04..000000000000
--- 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 689ace5bf5b9..000000000000
--- 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 c368b4692de4..000000000000
--- 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 d5fd48e9e7b3..000000000000
--- 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 68a7c85eabc4..000000000000
--- 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 61ab92c9416f..000000000000
--- 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 4d92ae174e6d..000000000000
--- 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 bfb0462952b1..000000000000
--- 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 421a8af2073e..000000000000
--- 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 b646567512ac..000000000000
--- 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 0e7289cd9c46..000000000000
--- 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 88f95ad4d495..000000000000
--- 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 a8b19b3e2f64..000000000000
--- 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 ca473db691e3..000000000000
--- 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 422e177ed7ad..000000000000
--- 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 a8844c1d3812..000000000000
--- 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 1c99c87195a9..000000000000
--- 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 76780f421af2..000000000000
--- 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 ca88a908cdbd..000000000000
--- 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 2d3cc1eda643..000000000000
--- 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 9ae3bd0c93c0..000000000000
--- 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 c2ae17c4bdeb..000000000000
--- 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 60fe60438ce7..000000000000
--- 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 3547750896b3..000000000000
--- 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 fe0872caf5f8..000000000000
--- 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 3ece93dfdf0a..000000000000
--- 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 c4f2e1fec96b..000000000000
--- 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 bb01365d6722..000000000000
--- 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 a6bdd5b6bfff..000000000000
--- 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 f0a06076961c..000000000000
--- 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 d1d1780a25fd..000000000000
--- 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 1d499b6654d0..000000000000
--- 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 ae60ed47fd6a..000000000000
--- 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 959d5057e257..000000000000
--- 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 948052c9bf8a..000000000000
--- 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 282757ac5a14..000000000000
--- 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 8f34579f6a5d..000000000000
--- 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 b0a2cc397c53..000000000000
--- 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 4a8aa361a849..000000000000
--- 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 bfdd45d9f9b0..000000000000
--- 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 d3a6bac2513f..000000000000
--- 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 567637af02c7..000000000000
--- 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 e7866e618089..000000000000
--- 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 e497b22d7769..000000000000
--- 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 8a86311defca..000000000000
--- 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 33bc37e155b5..000000000000
--- 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 5a270870c70a..000000000000
--- 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 d0fe92d5249d..000000000000
--- 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 e399b5b9afa6..000000000000
--- 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 dad431c1ca2c..000000000000
--- 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 d5415e055b21..000000000000
--- 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 ed84a1a0803e..000000000000
--- 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 5d018e75488e..000000000000
--- 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 dea0477cf09b..000000000000
--- 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 1b9c080993fa..000000000000
--- 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 a4cdfd97f20d..000000000000
--- 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 98e447e37bae..000000000000
--- 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 ab95af6f64b3..000000000000
--- 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 6a5e8e6a79b6..000000000000
--- 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 b21d39d065b5..000000000000
--- 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 1d411779267d..000000000000
--- 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 b03f4a93e962..000000000000
--- 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 578dd1e94997..000000000000
--- 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 7c92a6b6bdba..000000000000
--- 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 318efa61a110..000000000000
--- 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 a065bbc4b656..000000000000
--- 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 fa7d79ec0a8c..000000000000
--- 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 be4eeccd0c31..000000000000
--- 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 218b2dcae71d..000000000000
--- 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 865702af695c..000000000000
--- 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 4a32f5206fde..000000000000
--- 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 9ebf947e2dc3..000000000000
--- 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 000000000000..b35b4be55818
--- /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
index c5472ce34478..c5472ce34478 100755
--- a/wifi/java/android/net/wifi/SoftApConfToXmlMigrationUtil.java
+++ b/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
index 5792d27a94f9..4fabc0b0babc 100755
--- a/wifi/java/android/net/wifi/WifiMigration.java
+++ b/wifi/non-updatable/java/src/android/net/wifi/WifiMigration.java
@@ -139,8 +139,8 @@ public final class WifiMigration {
/**
* 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 @@ public final class WifiMigration {
/**
* 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
index 378549d62edf..39036580e2ef 100755
--- a/wifi/java/android/net/wifi/WifiNetworkScoreCache.java
+++ b/wifi/non-updatable/java/src/android/net/wifi/WifiNetworkScoreCache.java
@@ -89,7 +89,7 @@ public class WifiNetworkScoreCache extends INetworkScoreCache.Stub {
@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 @@ public class WifiNetworkScoreCache extends INetworkScoreCache.Stub {
boolean changed = false;
- synchronized(mLock) {
+ synchronized (mLock) {
for (ScoredNetwork network : networks) {
String networkKey = buildNetworkKey(network);
if (networkKey == null) {
@@ -189,7 +189,7 @@ public class WifiNetworkScoreCache extends INetworkScoreCache.Stub {
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
index 4c14fd499c28..4c14fd499c28 100644
--- a/wifi/java/android/net/wifi/nl80211/ChannelSettings.java
+++ b/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
index bb0cc975a3db..bb0cc975a3db 100644
--- a/wifi/java/android/net/wifi/nl80211/DeviceWiphyCapabilities.java
+++ b/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
index b1475b2c7b43..b1475b2c7b43 100644
--- a/wifi/java/android/net/wifi/nl80211/HiddenNetwork.java
+++ b/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
index a8e999973fe8..a8e999973fe8 100644
--- a/wifi/java/android/net/wifi/nl80211/NativeScanResult.java
+++ b/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
index 984d7d034302..984d7d034302 100644
--- a/wifi/java/android/net/wifi/nl80211/NativeWifiClient.java
+++ b/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
index e8eff09583b9..e8eff09583b9 100644
--- a/wifi/java/android/net/wifi/nl80211/PnoNetwork.java
+++ b/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
index 00ebe624ba0d..00ebe624ba0d 100644
--- a/wifi/java/android/net/wifi/nl80211/PnoSettings.java
+++ b/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
index 2c12163dc9a1..2c12163dc9a1 100644
--- a/wifi/java/android/net/wifi/nl80211/RadioChainInfo.java
+++ b/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
index 24b1854fbf6c..24b1854fbf6c 100644
--- a/wifi/java/android/net/wifi/nl80211/SingleScanSettings.java
+++ b/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
index 4116234c4c8d..4116234c4c8d 100644
--- a/wifi/java/android/net/wifi/nl80211/WifiNl80211Manager.java
+++ b/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
index 264debaa51f9..264debaa51f9 100644
--- a/wifi/java/android/net/wifi/migration_samples/README.txt
+++ b/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
index 3063276fae6a..3063276fae6a 100644
--- a/wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStore.xml
+++ b/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
index fd99dd3df8b2..fd99dd3df8b2 100644
--- a/wifi/java/android/net/wifi/migration_samples/Shared_WifiConfigStoreSoftAp.xml
+++ b/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
index 67d5aab215f2..67d5aab215f2 100644
--- a/wifi/java/android/net/wifi/migration_samples/User_WifiConfigStore.xml
+++ b/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
index 4ecdd29709b4..4ecdd29709b4 100644
--- a/wifi/java/android/net/wifi/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml
+++ b/wifi/non-updatable/migration_samples/User_WifiConfigStoreNetworkSuggestions.xml
diff --git a/wifi/tests/Android.bp b/wifi/non-updatable/tests/Android.bp
index b710a1492d8c..3f5cacff017f 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 @@ android_test {
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 @@ android_test {
],
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
index b6c38bcf5a72..b4b6b2d7997a 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
index 34e2e3af9cda..5f3fdd46556e 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
index f90940470432..ad535f4ed86a 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
index f49f387cbc6b..f49f387cbc6b 100644
--- a/wifi/tests/src/android/net/wifi/SoftApConfToXmlMigrationUtilTest.java
+++ b/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
index fdd11a385651..c4967ebf1736 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
index 7b900fec70a8..7b900fec70a8 100644
--- a/wifi/tests/src/android/net/wifi/nl80211/DeviceWiphyCapabilitiesTest.java
+++ b/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
index 8ddd1899179a..8ddd1899179a 100644
--- a/wifi/tests/src/android/net/wifi/nl80211/NativeScanResultTest.java
+++ b/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
index dec1db8d274e..dec1db8d274e 100644
--- a/wifi/tests/src/android/net/wifi/nl80211/PnoSettingsTest.java
+++ b/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
index 905920888012..905920888012 100644
--- a/wifi/tests/src/android/net/wifi/nl80211/SingleScanSettingsTest.java
+++ b/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
index 9ee0acbfbaa2..9ee0acbfbaa2 100644
--- a/wifi/tests/src/android/net/wifi/nl80211/WifiNl80211ManagerTest.java
+++ b/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 760c8395e659..000000000000
--- 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 5b4e4cb947cd..000000000000
--- 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 2775a9f419f9..000000000000
--- 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 7023453b3992..000000000000
--- 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 5c23f61b1711..000000000000
--- 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 bab7607512c8..000000000000
--- 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 833c52751b95..000000000000
--- 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 9f3cdc274ee1..000000000000
--- 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 e9afb35fec94..000000000000
--- 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 e13eb2a2d85e..000000000000
--- 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 8719ffaaa6e6..000000000000
--- 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 c761237b2f18..000000000000
--- 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 6b807af2e774..000000000000
--- 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 ed06b47a0c4d..000000000000
--- 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 f7e35ddee5a4..000000000000
--- 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 369c0a943d1b..000000000000
--- 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 b10141434b0b..000000000000
--- 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 8aa6add4a4e4..000000000000
--- 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 917b1df74da7..000000000000
--- 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 f1ec5e829316..000000000000
--- 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 73b501a4d8f2..000000000000
--- 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 2d7e53598bd9..000000000000
--- 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 929f3ab88fd8..000000000000
--- 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 7a3baf9ebaf2..000000000000
--- 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 a7b6765e886a..000000000000
--- 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 62485ecb6f7b..000000000000
--- 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 311bbc41b8fe..000000000000
--- 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 1398bfeef031..000000000000
--- 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 d479aacdd296..000000000000
--- 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 6f47f3da710f..000000000000
--- 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 00a044269db3..000000000000
--- 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 b68616f560f3..000000000000
--- 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 10a37c09f500..000000000000
--- 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 5184152bce34..000000000000
--- 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 79e95e81396a..000000000000
--- 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 b65de6b9789d..000000000000
--- 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 43d728bf593e..000000000000
--- 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 439e67259cb9..000000000000
--- 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 2ded849331d7..000000000000
--- 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 8270d643ca65..000000000000
--- 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 8d55acb87f15..000000000000
--- 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 1ac9cb87c0e1..000000000000
--- 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 85d0a909a230..000000000000
--- 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 a44df40a8e97..000000000000
--- 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 93d471ab6b81..000000000000
--- 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 980b199c04b8..000000000000
--- 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 07cb151499ae..000000000000
--- 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 61993252c05e..000000000000
--- 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 22936bd352fe..000000000000
--- 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 6edc287068e8..000000000000
--- 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 2402f5bb4658..000000000000
--- 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 9473e42184e3..000000000000
--- 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 e207ca1f3e7a..000000000000
--- 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 9e8dca4057f2..000000000000
--- 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 e3b10a7a52f0..000000000000
--- 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 2a9b36b47172..000000000000
--- 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 e1cffee361e8..000000000000
--- 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 7d46a5f3a79d..000000000000
--- 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 49ead11065ae..000000000000
--- 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 79930dc83372..000000000000
--- 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 f746fb7dc46a..000000000000
--- 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 271339cecf1e..000000000000
--- 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 e6eae416ba78..000000000000
--- 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 0d751389e244..000000000000
--- 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 41b97abb87b5..000000000000
--- a/wifi/tests/test-jarjar-rules.txt
+++ /dev/null
@@ -1 +0,0 @@
-rule com.android.modules.utils.** com.android.wifi.test.x.@0