From 6b1264cc88016b98180d57d64b456461997b6988 Mon Sep 17 00:00:00 2001 From: Nate Jiang Date: Mon, 19 Oct 2020 15:29:29 -0700 Subject: [PATCH] [AWARE] Add API to get available aware resources Bug: 159100865 Test: atest android.net.wifi Change-Id: I8ed29471be987822ab27b91452c62e9e6a09cb12 --- api/current.txt | 12 +- .../net/wifi/aware/AwareResources.aidl | 19 +++ wifi/api/current.txt | 12 +- .../net/wifi/aware/AwareResources.java | 146 ++++++++++++++++++ .../net/wifi/aware/IWifiAwareManager.aidl | 2 + .../net/wifi/aware/WifiAwareManager.java | 19 ++- .../net/wifi/aware/WifiAwareManagerTest.java | 11 ++ 7 files changed, 218 insertions(+), 3 deletions(-) create mode 100644 wifi/aidl-export/android/net/wifi/aware/AwareResources.aidl create mode 100644 wifi/java/android/net/wifi/aware/AwareResources.java diff --git a/api/current.txt b/api/current.txt index b880f85e3830c..2c352f9e61ef0 100644 --- a/api/current.txt +++ b/api/current.txt @@ -31861,6 +31861,15 @@ package android.net.wifi.aware { method public void onAttached(android.net.wifi.aware.WifiAwareSession); } + public final class AwareResources implements android.os.Parcelable { + method public int describeContents(); + method public int getNumOfAvailableDataPaths(); + method public int getNumOfAvailablePublishSessions(); + method public int getNumOfAvailableSubscribeSessions(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + public final class Characteristics implements android.os.Parcelable { method public int describeContents(); method public int getMaxMatchFilterLength(); @@ -31963,7 +31972,8 @@ package android.net.wifi.aware { 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 @Nullable public android.net.wifi.aware.AwareResources getAvailableAwareResources(); + method @Nullable public android.net.wifi.aware.Characteristics getCharacteristics(); method public boolean isAvailable(); method public boolean isDeviceAttached(); method public boolean isInstantCommunicationModeEnabled(); diff --git a/wifi/aidl-export/android/net/wifi/aware/AwareResources.aidl b/wifi/aidl-export/android/net/wifi/aware/AwareResources.aidl new file mode 100644 index 0000000000000..d0bd2dda57220 --- /dev/null +++ b/wifi/aidl-export/android/net/wifi/aware/AwareResources.aidl @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.wifi.aware; + +parcelable AwareResources; \ No newline at end of file diff --git a/wifi/api/current.txt b/wifi/api/current.txt index 0bc1ff22b7042..d5ef703253cba 100644 --- a/wifi/api/current.txt +++ b/wifi/api/current.txt @@ -561,6 +561,15 @@ package android.net.wifi.aware { method public void onAttached(android.net.wifi.aware.WifiAwareSession); } + public final class AwareResources implements android.os.Parcelable { + method public int describeContents(); + method public int getNumOfAvailableDataPaths(); + method public int getNumOfAvailablePublishSessions(); + method public int getNumOfAvailableSubscribeSessions(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + public final class Characteristics implements android.os.Parcelable { method public int describeContents(); method public int getMaxMatchFilterLength(); @@ -663,7 +672,8 @@ package android.net.wifi.aware { 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 @Nullable public android.net.wifi.aware.AwareResources getAvailableAwareResources(); + method @Nullable public android.net.wifi.aware.Characteristics getCharacteristics(); method public boolean isAvailable(); method public boolean isDeviceAttached(); method public boolean isInstantCommunicationModeEnabled(); diff --git a/wifi/java/android/net/wifi/aware/AwareResources.java b/wifi/java/android/net/wifi/aware/AwareResources.java new file mode 100644 index 0000000000000..cee1f40c05cd6 --- /dev/null +++ b/wifi/java/android/net/wifi/aware/AwareResources.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.net.wifi.aware; + +import android.annotation.NonNull; +import android.os.Handler; +import android.os.Parcel; +import android.os.Parcelable; + +/** + * The resources of the Aware service. + */ +public final class AwareResources implements Parcelable { + /** + * Number of the NDPs are available. + */ + private int mNumOfAvailableNdps; + + /** + * Number of the publish sessions are available. + */ + private int mNumOfAvailablePublishSessions; + + /** + * Number of the subscribe sessions are available. + */ + private int mNumOfAvailableSubscribeSessions; + + /** + * @hide : should not be created by apps + */ + public AwareResources() { + } + + /** + * Return the number of Aware data-paths (also known as NDPs - NAN Data Paths) which an app + * could create. Please refer to the {@link WifiAwareNetworkSpecifier} to create + * a Network Specifier and request a data-path. + *

+ * Note that these resources aren't reserved - other apps could use them by the time you + * attempt to create a data-path. + *

+ * @return A Non-negative integer, number of data-paths that could be created. + */ + public int getNumOfAvailableDataPaths() { + return mNumOfAvailableNdps; + } + + /** + * Return the number of Aware publish sessions which an app could create. Please refer to the + * {@link WifiAwareSession#publish(PublishConfig, DiscoverySessionCallback, Handler)} + * to create a publish session. + *

+ * Note that these resources aren't reserved - other apps could use them by the time you + * attempt to create a publish session. + *

+ * @return A Non-negative integer, number of publish sessions that could be created. + */ + public int getNumOfAvailablePublishSessions() { + return mNumOfAvailablePublishSessions; + } + + /** + * Return the number of Aware subscribe sessions which an app could create. Please refer to the + * {@link WifiAwareSession#subscribe(SubscribeConfig, DiscoverySessionCallback, Handler)} + * to create a publish session. + *

+ * Note that these resources aren't reserved - other apps could use them by the time you + * attempt to create a subscribe session. + *

+ * @return A Non-negative integer, number of subscribe sessions that could be created. + */ + public int getNumOfAvailableSubscribeSessions() { + return mNumOfAvailableSubscribeSessions; + } + + /** + * Set the number of the available NDPs. + * @hide + * @param numOfAvailableNdps Number of available NDPs. + */ + public void setNumOfAvailableDataPaths(int numOfAvailableNdps) { + mNumOfAvailableNdps = numOfAvailableNdps; + } + + /** + * Set the number of the available publish sessions. + * @hide + * @param numOfAvailablePublishSessions Number of available publish sessions. + */ + public void setNumOfAvailablePublishSessions(int numOfAvailablePublishSessions) { + mNumOfAvailablePublishSessions = numOfAvailablePublishSessions; + } + + /** + * Set the number of the available subscribe sessions. + * @hide + * @param numOfAvailableSubscribeSessions Number of available subscribe sessions. + */ + public void setNumOfAvailableSubscribeSessions(int numOfAvailableSubscribeSessions) { + mNumOfAvailableSubscribeSessions = numOfAvailableSubscribeSessions; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(@NonNull Parcel dest, int flags) { + dest.writeInt(mNumOfAvailableNdps); + dest.writeInt(mNumOfAvailablePublishSessions); + dest.writeInt(mNumOfAvailableSubscribeSessions); + } + + public static final @android.annotation.NonNull Creator CREATOR = + new Creator() { + @Override + public AwareResources createFromParcel(Parcel in) { + AwareResources awareResources = new AwareResources(); + awareResources.setNumOfAvailableDataPaths(in.readInt()); + awareResources.setNumOfAvailablePublishSessions(in.readInt()); + awareResources.setNumOfAvailableSubscribeSessions(in.readInt()); + return awareResources; + } + + @Override + public AwareResources[] newArray(int size) { + return new AwareResources[size]; + } + }; +} diff --git a/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl b/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl index cd2ca692137df..c90c4d8a27b2c 100644 --- a/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl +++ b/wifi/java/android/net/wifi/aware/IWifiAwareManager.aidl @@ -25,6 +25,7 @@ import android.net.wifi.aware.IWifiAwareMacAddressProvider; import android.net.wifi.aware.PublishConfig; import android.net.wifi.aware.SubscribeConfig; import android.net.wifi.aware.Characteristics; +import android.net.wifi.aware.AwareResources; /** * Interface that WifiAwareService implements @@ -36,6 +37,7 @@ interface IWifiAwareManager // Aware API boolean isUsageEnabled(); Characteristics getCharacteristics(); + AwareResources getAvailableAwareResources(); boolean isDeviceAttached(); void enableInstantCommunicationMode(in String callingPackage, boolean enable); boolean isInstantCommunicationModeEnabled(); diff --git a/wifi/java/android/net/wifi/aware/WifiAwareManager.java b/wifi/java/android/net/wifi/aware/WifiAwareManager.java index bb146e37d48c4..57985b6c1e764 100644 --- a/wifi/java/android/net/wifi/aware/WifiAwareManager.java +++ b/wifi/java/android/net/wifi/aware/WifiAwareManager.java @@ -262,7 +262,7 @@ public class WifiAwareManager { * * @return An object specifying configuration limitations of Aware. */ - public Characteristics getCharacteristics() { + public @Nullable Characteristics getCharacteristics() { try { return mService.getCharacteristics(); } catch (RemoteException e) { @@ -270,6 +270,23 @@ public class WifiAwareManager { } } + /** + * Return the available resources of the Wi-Fi aware service: a set of parameters which specify + * limitations on service usage, e.g the number of data-paths which could be created.. + * + * @return An object specifying the currently available resource of the Wi-Fi Aware service. + */ + public @Nullable AwareResources getAvailableAwareResources() { + if (!SdkLevelUtil.isAtLeastS()) { + throw new UnsupportedOperationException(); + } + try { + return mService.getAvailableAwareResources(); + } 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 diff --git a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java index 2cf7f2c1b8cf6..80a6273166959 100644 --- a/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java +++ b/wifi/tests/src/android/net/wifi/aware/WifiAwareManagerTest.java @@ -154,6 +154,7 @@ public class WifiAwareManagerTest { */ @Test public void testIsAttached() throws Exception { + assumeTrue(SdkLevelUtil.isAtLeastS()); mDut.isDeviceAttached(); verify(mockAwareService).isDeviceAttached(); } @@ -171,6 +172,16 @@ public class WifiAwareManagerTest { verify(mockAwareService).enableInstantCommunicationMode(anyString(), eq(true)); } + /** + * Validate pass-through of getAvailableAwareResources() API. + */ + @Test + public void testGetAvailableAwareResource() throws Exception { + assumeTrue(SdkLevelUtil.isAtLeastS()); + mDut.getAvailableAwareResources(); + verify(mockAwareService).getAvailableAwareResources(); + } + /* * WifiAwareEventCallbackProxy Tests */