diff options
author | 2024-12-19 09:15:00 -0800 | |
---|---|---|
committer | 2024-12-20 10:03:29 -0800 | |
commit | bc0abe1a8189657a8876d5b52b1becd747aa1647 (patch) | |
tree | c4283dab9d46cb6a0a90b90992c121ac370f885b | |
parent | ca1c557d3e126f6a1563838facdbe4beb5095ee3 (diff) |
Update USD subscriber/publisher availability APIs
Bug: 382079822
Test: atest FrameworksWifiApiTests
Flag: android.net.wifi.flags.usd
Change-Id: I161f829eea6e6a417943fab47f45d72fdaae9753
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 + ")"); + } + } } |