summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author maheshkkv <maheshkkv@google.com> 2024-12-19 09:15:00 -0800
committer maheshkkv <maheshkkv@google.com> 2024-12-20 10:03:29 -0800
commitbc0abe1a8189657a8876d5b52b1becd747aa1647 (patch)
treec4283dab9d46cb6a0a90b90992c121ac370f885b
parentca1c557d3e126f6a1563838facdbe4beb5095ee3 (diff)
Update USD subscriber/publisher availability APIs
Bug: 382079822 Test: atest FrameworksWifiApiTests Flag: android.net.wifi.flags.usd Change-Id: I161f829eea6e6a417943fab47f45d72fdaae9753
-rw-r--r--framework/api/system-current.txt13
-rw-r--r--framework/java/android/net/wifi/usd/IAvailabilityCallback.aidl33
-rw-r--r--framework/java/android/net/wifi/usd/IUsdManager.aidl9
-rw-r--r--framework/java/android/net/wifi/usd/UsdManager.java277
-rw-r--r--service/java/com/android/server/wifi/usd/UsdServiceImpl.java92
5 files changed, 183 insertions, 241 deletions
diff --git a/framework/api/system-current.txt b/framework/api/system-current.txt
index 55bd9eb3a4..e5d5e8feb0 100644
--- a/framework/api/system-current.txt
+++ b/framework/api/system-current.txt
@@ -2015,17 +2015,12 @@ package android.net.wifi.usd {
@FlaggedApi("android.net.wifi.flags.usd") public class UsdManager {
method @Nullable @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public android.net.wifi.usd.Characteristics getCharacteristics();
- method @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public boolean isPublisherAvailable();
- method @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public boolean isSubscriberAvailable();
method @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public void publish(@NonNull android.net.wifi.usd.PublishConfig, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.usd.PublishSessionCallback);
- method @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public void registerAvailabilityCallback(@NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.usd.UsdManager.AvailabilityCallback);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public void registerPublisherStatusListener(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public void registerSubscriberStatusListener(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>);
method @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public void subscribe(@NonNull android.net.wifi.usd.SubscribeConfig, @NonNull java.util.concurrent.Executor, @NonNull android.net.wifi.usd.SubscribeSessionCallback);
- method @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public void unregisterAvailabilityCallback(@NonNull android.net.wifi.usd.UsdManager.AvailabilityCallback);
- }
-
- public static interface UsdManager.AvailabilityCallback {
- method public default void onPublisherAvailable();
- method public default void onSubscriberAvailable();
+ method @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public void unregisterPublisherStatusListener(@NonNull java.util.function.Consumer<java.lang.Boolean>);
+ method @RequiresPermission(android.Manifest.permission.MANAGE_WIFI_NETWORK_SELECTION) public void unregisterSubscriberStatusListener(@NonNull java.util.function.Consumer<java.lang.Boolean>);
}
}
diff --git a/framework/java/android/net/wifi/usd/IAvailabilityCallback.aidl b/framework/java/android/net/wifi/usd/IAvailabilityCallback.aidl
deleted file mode 100644
index 691ec093ef..0000000000
--- a/framework/java/android/net/wifi/usd/IAvailabilityCallback.aidl
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2024 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.wifi.usd;
-
-/**
- * Interface for USD availability callback.
- *
- * @hide
- */
-oneway interface IAvailabilityCallback {
- /**
- * Called when subscriber is available
- */
- void onSubscriberAvailable();
- /**
- * Called when publisher is available
- */
- void onPublisherAvailable();
-}
diff --git a/framework/java/android/net/wifi/usd/IUsdManager.aidl b/framework/java/android/net/wifi/usd/IUsdManager.aidl
index 030b240002..132c736526 100644
--- a/framework/java/android/net/wifi/usd/IUsdManager.aidl
+++ b/framework/java/android/net/wifi/usd/IUsdManager.aidl
@@ -18,7 +18,6 @@ package android.net.wifi.usd;
import android.net.wifi.IBooleanListener;
import android.net.wifi.usd.Characteristics;
-import android.net.wifi.usd.IAvailabilityCallback;
import android.net.wifi.usd.IPublishSessionCallback;
import android.net.wifi.usd.ISubscribeSessionCallback;
import android.net.wifi.usd.PublishConfig;
@@ -30,10 +29,6 @@ import android.net.wifi.usd.SubscribeConfig;
* {@hide}
*/
interface IUsdManager {
- boolean isSubscriberAvailable();
- boolean isPublisherAvailable();
- void registerAvailabilityCallback(IAvailabilityCallback callback);
- void unregisterAvailabilityCallback(IAvailabilityCallback callback);
Characteristics getCharacteristics();
void sendMessage(int peerId, in byte[] message, in IBooleanListener listener);
void cancelSubscribe(int sessionId);
@@ -41,4 +36,8 @@ interface IUsdManager {
void updatePublish(int sessionId, in byte[] ssi);
void publish(in PublishConfig publishConfig, IPublishSessionCallback callback);
void subscribe(in SubscribeConfig subscribeConfig, ISubscribeSessionCallback callback);
+ void registerSubscriberStatusListener(IBooleanListener listener);
+ void unregisterSubscriberStatusListener(IBooleanListener listener);
+ void registerPublisherStatusListener(IBooleanListener listener);
+ void unregisterPublisherStatusListener(IBooleanListener listener);
}
diff --git a/framework/java/android/net/wifi/usd/UsdManager.java b/framework/java/android/net/wifi/usd/UsdManager.java
index 98601ee5c8..93f951a020 100644
--- a/framework/java/android/net/wifi/usd/UsdManager.java
+++ b/framework/java/android/net/wifi/usd/UsdManager.java
@@ -68,8 +68,9 @@ public class UsdManager {
private final Context mContext;
private final IUsdManager mService;
private static final String TAG = UsdManager.class.getName();
-
- private static final SparseArray<IAvailabilityCallback> sAvailabilityCallbackMap =
+ private static final SparseArray<IBooleanListener> sPublisherAvailabilityListenerMap =
+ new SparseArray<>();
+ private static final SparseArray<IBooleanListener> sSubscriberAvailabilityListenerMap =
new SparseArray<>();
/** @hide */
@@ -122,148 +123,6 @@ public class UsdManager {
}
/**
- * Checks if the subscriber feature is currently available or not. Due to concurrent operations
- * such as Station, SoftAP, Wi-Fi Aware, Wi-Fi Direct ..etc. the subscriber functionality
- * may not be available.
- *
- * @return true if subscriber feature is available, otherwise false.
- */
- @RequiresPermission(MANAGE_WIFI_NETWORK_SELECTION)
- public boolean isSubscriberAvailable() {
- if (!Environment.isSdkAtLeastB()) {
- throw new UnsupportedOperationException();
- }
- try {
- return mService.isSubscriberAvailable();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
-
- /**
- * Checks if the publisher feature is currently available or not. Due to concurrent
- * operations such as Station, SoftAP, Wi-Fi Aware, Wi-Fi Direct ..etc. the publisher
- * functionality may not be available.
- *
- * @return true if publisher feature is available, otherwise false.
- */
- @RequiresPermission(MANAGE_WIFI_NETWORK_SELECTION)
- public boolean isPublisherAvailable() {
- if (!Environment.isSdkAtLeastB()) {
- throw new UnsupportedOperationException();
- }
- try {
- return mService.isPublisherAvailable();
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- }
- }
-
- private static class AvailabilityCallbackProxy extends IAvailabilityCallback.Stub {
- private final Executor mExecutor;
- private final AvailabilityCallback mAvailabilityCallback;
-
- private AvailabilityCallbackProxy(Executor executor,
- AvailabilityCallback availabilityCallback) {
- mExecutor = executor;
- mAvailabilityCallback = availabilityCallback;
- }
-
- @Override
- public void onSubscriberAvailable() {
- Log.d(TAG, "onSubscriberAvailable");
- Binder.clearCallingIdentity();
- mExecutor.execute(mAvailabilityCallback::onSubscriberAvailable);
- }
-
- @Override
- public void onPublisherAvailable() {
- Log.d(TAG, "onPublisherAvailable");
- Binder.clearCallingIdentity();
- mExecutor.execute(mAvailabilityCallback::onPublisherAvailable);
- }
- }
-
- /**
- * Interface for indicating publisher or subscriber availability.
- */
- public interface AvailabilityCallback {
- /**
- * Callback to notify subscriber functionality is available.
- */
- default void onSubscriberAvailable() {
- }
-
- /**
- * Callback to notify publisher functionality is available.
- */
- default void onPublisherAvailable() {
- }
- }
-
- /**
- * Register for publisher or subscriber availability. Concurrent operations such as Station,
- * SoftAP, Wi-Fi Aware, Wi-Fi Direct ..etc. impact the current availability of publisher or
- * subscriber functionality.
- *
- * @param executor The Executor on whose thread to execute the callbacks of the {@code
- * callback} object
- * @param callback Callback for USD roles availability
- * @throws NullPointerException if executor or callback is null
- */
- @RequiresPermission(MANAGE_WIFI_NETWORK_SELECTION)
- public void registerAvailabilityCallback(@NonNull @CallbackExecutor Executor executor,
- @NonNull AvailabilityCallback callback) {
- Objects.requireNonNull(executor, "executor must not be null");
- Objects.requireNonNull(callback, "callback must not be null");
- if (!Environment.isSdkAtLeastB()) {
- throw new UnsupportedOperationException();
- }
- final int callbackHash = System.identityHashCode(callback);
- synchronized (sAvailabilityCallbackMap) {
- try {
- IAvailabilityCallback.Stub availabilityCallbackProxy =
- new AvailabilityCallbackProxy(executor, callback);
- sAvailabilityCallbackMap.put(callbackHash, availabilityCallbackProxy);
- mService.registerAvailabilityCallback(availabilityCallbackProxy);
- } catch (RemoteException e) {
- sAvailabilityCallbackMap.remove(callbackHash);
- throw e.rethrowFromSystemServer();
- }
- }
- }
-
- /**
- * Unregister the callback previously registered with
- * {@link #registerAvailabilityCallback(Executor, AvailabilityCallback)}.
- *
- * @param callback a registered callback
- * @throws NullPointerException if callback is null
- */
- @RequiresPermission(MANAGE_WIFI_NETWORK_SELECTION)
- public void unregisterAvailabilityCallback(@NonNull AvailabilityCallback callback) {
- Objects.requireNonNull(callback, "callback must not be null");
- if (!Environment.isSdkAtLeastB()) {
- throw new UnsupportedOperationException();
- }
- final int callbackHash = System.identityHashCode(callback);
- synchronized (sAvailabilityCallbackMap) {
- try {
- if (!sAvailabilityCallbackMap.contains(callbackHash)) {
- Log.w(TAG, "Unknown callback");
- return;
- }
- mService.unregisterAvailabilityCallback(sAvailabilityCallbackMap.get(callbackHash));
- } catch (RemoteException e) {
- throw e.rethrowFromSystemServer();
- } finally {
- sAvailabilityCallbackMap.remove(callbackHash);
- }
- }
- }
-
- /**
* Gets the characteristics of USD: a set of parameters which specify limitations on
* configurations, e.g. maximum service name length.
*
@@ -466,4 +325,134 @@ public class UsdManager {
throw e.rethrowFromSystemServer();
}
}
+
+ /**
+ * Register for subscriber availability. Concurrent operations such as Station, SoftAP, Wi-Fi
+ * Aware, Wi-Fi Direct ..etc. impact the current availability of subscriber functionality.
+ * Current availability status will be returned immediately after registering.
+ *
+ * @param executor The executor on which callback will be invoked.
+ * @param callback An asynchronous callback that will return {@code Boolean} indicating
+ * whether subscriber is available or not. {@code true} if subscriber is
+ * available, otherwise unavailable.
+ */
+ @RequiresPermission(MANAGE_WIFI_NETWORK_SELECTION)
+ public void registerSubscriberStatusListener(@NonNull Executor executor,
+ @NonNull Consumer<Boolean> callback) {
+ Objects.requireNonNull(executor, "executor must not be null");
+ Objects.requireNonNull(callback, "callback must not be null");
+ if (!Environment.isSdkAtLeastB()) {
+ throw new UnsupportedOperationException();
+ }
+ final int callbackHash = System.identityHashCode(callback);
+ synchronized (sSubscriberAvailabilityListenerMap) {
+ try {
+ IBooleanListener listener = new IBooleanListener.Stub() {
+ @Override
+ public void onResult(boolean value) throws RemoteException {
+ Binder.clearCallingIdentity();
+ executor.execute(() -> callback.accept(value));
+ }
+ };
+ sSubscriberAvailabilityListenerMap.put(callbackHash, listener);
+ mService.registerSubscriberStatusListener(listener);
+ } catch (RemoteException e) {
+ sSubscriberAvailabilityListenerMap.remove(callbackHash);
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Unregister the callback previously registered for subscriber availability.
+ *
+ * @param callback A registered callback.
+ */
+ @RequiresPermission(MANAGE_WIFI_NETWORK_SELECTION)
+ public void unregisterSubscriberStatusListener(@NonNull Consumer<Boolean> callback) {
+ Objects.requireNonNull(callback, "callback must not be null");
+ if (!Environment.isSdkAtLeastB()) {
+ throw new UnsupportedOperationException();
+ }
+ final int callbackHash = System.identityHashCode(callback);
+ synchronized (sSubscriberAvailabilityListenerMap) {
+ if (!sSubscriberAvailabilityListenerMap.contains(callbackHash)) {
+ Log.w(TAG, "Unknown callback");
+ return;
+ }
+ try {
+ mService.unregisterSubscriberStatusListener(
+ sSubscriberAvailabilityListenerMap.get(callbackHash));
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } finally {
+ sSubscriberAvailabilityListenerMap.remove(callbackHash);
+ }
+ }
+ }
+
+ /**
+ * Register for publisher availability. Concurrent operations such as Station, SoftAP, Wi-Fi
+ * Aware, Wi-Fi Direct ..etc. impact the current availability of publisher functionality.
+ * Current availability status will be returned immediately after registering.
+ *
+ * @param executor The executor on which callback will be invoked.
+ * @param callback An asynchronous callback that will return {@code Boolean} indicating
+ * whether publisher is available or not. {@code true} if publisher is
+ * available, otherwise unavailable.
+ */
+ @RequiresPermission(MANAGE_WIFI_NETWORK_SELECTION)
+ public void registerPublisherStatusListener(@NonNull Executor executor,
+ @NonNull Consumer<Boolean> callback) {
+ Objects.requireNonNull(executor, "executor must not be null");
+ Objects.requireNonNull(callback, "callback must not be null");
+ if (!Environment.isSdkAtLeastB()) {
+ throw new UnsupportedOperationException();
+ }
+ final int callbackHash = System.identityHashCode(callback);
+ synchronized (sPublisherAvailabilityListenerMap) {
+ try {
+ IBooleanListener listener = new IBooleanListener.Stub() {
+ @Override
+ public void onResult(boolean value) throws RemoteException {
+ Binder.clearCallingIdentity();
+ executor.execute(() -> callback.accept(value));
+ }
+ };
+ sPublisherAvailabilityListenerMap.put(callbackHash, listener);
+ mService.registerPublisherStatusListener(listener);
+ } catch (RemoteException e) {
+ sPublisherAvailabilityListenerMap.remove(callbackHash);
+ throw e.rethrowFromSystemServer();
+ }
+ }
+ }
+
+ /**
+ * Unregister the callback previously registered for publisher availability.
+ *
+ * @param callback A registered callback.
+ */
+ @RequiresPermission(MANAGE_WIFI_NETWORK_SELECTION)
+ public void unregisterPublisherStatusListener(@NonNull Consumer<Boolean> callback) {
+ Objects.requireNonNull(callback, "callback must not be null");
+ if (!Environment.isSdkAtLeastB()) {
+ throw new UnsupportedOperationException();
+ }
+ final int callbackHash = System.identityHashCode(callback);
+ synchronized (sPublisherAvailabilityListenerMap) {
+ if (!sPublisherAvailabilityListenerMap.contains(callbackHash)) {
+ Log.w(TAG, "Unknown callback");
+ return;
+ }
+ try {
+ mService.unregisterPublisherStatusListener(
+ sPublisherAvailabilityListenerMap.get(callbackHash));
+ } catch (RemoteException e) {
+ throw e.rethrowFromSystemServer();
+ } finally {
+ sPublisherAvailabilityListenerMap.remove(callbackHash);
+ }
+ }
+ }
}
diff --git a/service/java/com/android/server/wifi/usd/UsdServiceImpl.java b/service/java/com/android/server/wifi/usd/UsdServiceImpl.java
index f1528c9032..d2671b5cc6 100644
--- a/service/java/com/android/server/wifi/usd/UsdServiceImpl.java
+++ b/service/java/com/android/server/wifi/usd/UsdServiceImpl.java
@@ -20,7 +20,6 @@ import android.annotation.NonNull;
import android.content.Context;
import android.net.wifi.IBooleanListener;
import android.net.wifi.usd.Characteristics;
-import android.net.wifi.usd.IAvailabilityCallback;
import android.net.wifi.usd.IPublishSessionCallback;
import android.net.wifi.usd.ISubscribeSessionCallback;
import android.net.wifi.usd.IUsdManager;
@@ -86,55 +85,6 @@ public class UsdServiceImpl extends IUsdManager.Stub {
}
/**
- * See {@link UsdManager#isSubscriberAvailable()}
- */
- @Override
- public boolean isSubscriberAvailable() {
- int uid = getMockableCallingUid();
- if (!mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(uid)) {
- throw new SecurityException("App not allowed to use USD (uid = " + uid + ")");
- }
- Log.i(TAG, "Subscriber is not available");
- return false;
- }
-
- /**
- * See {@link UsdManager#isPublisherAvailable()}
- */
- @Override
- public boolean isPublisherAvailable() {
- int uid = getMockableCallingUid();
- if (!mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(uid)) {
- throw new SecurityException("App not allowed to use USD (uid = " + uid + ")");
- }
- Log.i(TAG, "Publisher is not available");
- return false;
- }
-
- /**
- * See
- * {@link UsdManager#registerAvailabilityCallback(Executor, UsdManager.AvailabilityCallback)}
- */
- @Override
- public void registerAvailabilityCallback(IAvailabilityCallback callback) {
- int uid = getMockableCallingUid();
- if (!mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(uid)) {
- throw new SecurityException("App not allowed to use USD (uid = " + uid + ")");
- }
- }
-
- /**
- * See {@link UsdManager#unregisterAvailabilityCallback(UsdManager.AvailabilityCallback)}
- */
- @Override
- public void unregisterAvailabilityCallback(IAvailabilityCallback callback) {
- int uid = getMockableCallingUid();
- if (!mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(uid)) {
- throw new SecurityException("App not allowed to use USD (uid = " + uid + ")");
- }
- }
-
- /**
* See {@link UsdManager#getCharacteristics()}
*/
@Override
@@ -229,4 +179,46 @@ public class UsdServiceImpl extends IUsdManager.Stub {
}
Log.i(TAG, "subscribe " + subscribeConfig);
}
+
+ /**
+ * See {@link UsdManager#registerPublisherStatusListener(Executor, Consumer)}
+ */
+ public void registerPublisherStatusListener(@NonNull IBooleanListener listener) {
+ int uid = getMockableCallingUid();
+ if (!mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(uid)) {
+ throw new SecurityException("App not allowed to use USD (uid = " + uid + ")");
+ }
+
+ }
+
+ /**
+ * See {@link UsdManager#unregisterPublisherStatusListener(Consumer)}
+ */
+ public void unregisterPublisherStatusListener(@NonNull IBooleanListener listener) {
+ int uid = getMockableCallingUid();
+ if (!mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(uid)) {
+ throw new SecurityException("App not allowed to use USD (uid = " + uid + ")");
+ }
+ }
+
+ /**
+ * See {@link UsdManager#registerSubscriberStatusListener(Executor, Consumer)}
+ */
+ public void registerSubscriberStatusListener(@NonNull IBooleanListener listener) {
+ int uid = getMockableCallingUid();
+ if (!mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(uid)) {
+ throw new SecurityException("App not allowed to use USD (uid = " + uid + ")");
+ }
+
+ }
+
+ /**
+ * See {@link UsdManager#unregisterSubscriberStatusListener(Consumer)}
+ */
+ public void unregisterSubscriberStatusListener(@NonNull IBooleanListener listener) {
+ int uid = getMockableCallingUid();
+ if (!mWifiPermissionsUtil.checkManageWifiNetworkSelectionPermission(uid)) {
+ throw new SecurityException("App not allowed to use USD (uid = " + uid + ")");
+ }
+ }
}