From 52982a9e40650f75105adf96baf4b072af924e88 Mon Sep 17 00:00:00 2001 From: Etan Cohen Date: Wed, 14 Feb 2018 10:47:32 -0800 Subject: [PATCH] [RTT] Replace Handler with Executor in public APIs Per new API guidelines. Bug: 73088768 Test: unit tests & integration tests Change-Id: I5aba667e746f4a031fcf53c168e89cbdcfc0c5ec --- api/current.txt | 2 +- api/system-current.txt | 2 +- wifi/java/android/net/wifi/RttManager.java | 12 ++-- wifi/java/android/net/wifi/rtt/RangingRequest.java | 2 +- wifi/java/android/net/wifi/rtt/RangingResult.java | 4 +- .../net/wifi/rtt/RangingResultCallback.java | 11 ++-- wifi/java/android/net/wifi/rtt/WifiRttManager.java | 69 +++++++++------------- .../android/net/wifi/rtt/WifiRttManagerTest.java | 10 ++-- 8 files changed, 50 insertions(+), 62 deletions(-) diff --git a/api/current.txt b/api/current.txt index f1e3f6aa5177..acf8c2928dd6 100644 --- a/api/current.txt +++ b/api/current.txt @@ -28543,7 +28543,7 @@ package android.net.wifi.rtt { public class WifiRttManager { method public boolean isAvailable(); - method public void startRanging(android.net.wifi.rtt.RangingRequest, android.net.wifi.rtt.RangingResultCallback, android.os.Handler); + method public void startRanging(android.net.wifi.rtt.RangingRequest, java.util.concurrent.Executor, android.net.wifi.rtt.RangingResultCallback); field public static final java.lang.String ACTION_WIFI_RTT_STATE_CHANGED = "android.net.wifi.rtt.action.WIFI_RTT_STATE_CHANGED"; } diff --git a/api/system-current.txt b/api/system-current.txt index adc050017917..b91a69a44e98 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -3541,7 +3541,7 @@ package android.net.wifi.rtt { public class WifiRttManager { method public void cancelRanging(android.os.WorkSource); - method public void startRanging(android.os.WorkSource, android.net.wifi.rtt.RangingRequest, android.net.wifi.rtt.RangingResultCallback, android.os.Handler); + method public void startRanging(android.os.WorkSource, android.net.wifi.rtt.RangingRequest, java.util.concurrent.Executor, android.net.wifi.rtt.RangingResultCallback); } } diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java index 27e6854bc057..b5273dd39c54 100644 --- a/wifi/java/android/net/wifi/RttManager.java +++ b/wifi/java/android/net/wifi/RttManager.java @@ -12,7 +12,6 @@ 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.Handler; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemClock; @@ -933,7 +932,8 @@ public class RttManager { * Request to start an RTT ranging *

* This method is deprecated. Please use the - * {@link WifiRttManager#startRanging(RangingRequest, RangingResultCallback, Handler)} API. + * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)} + * API. * * @param params -- RTT request Parameters * @param listener -- Call back to inform RTT result @@ -969,7 +969,9 @@ public class RttManager { android.net.wifi.rtt.ResponderConfig.fromScanResult(reconstructed)); } try { - mNewService.startRanging(builder.build(), new RangingResultCallback() { + mNewService.startRanging(builder.build(), + mContext.getMainExecutor(), + new RangingResultCallback() { @Override public void onRangingFailure(int code) { int localCode = REASON_UNSPECIFIED; @@ -1000,7 +1002,7 @@ public class RttManager { } listener.onSuccess(legacyResults); } - }, null); + }); } catch (IllegalArgumentException e) { Log.e(TAG, "startRanging: invalid arguments - " + e); listener.onFailure(REASON_INVALID_REQUEST, e.getMessage()); @@ -1191,6 +1193,7 @@ public class RttManager { public static final int CMD_OP_REG_BINDER = BASE + 9; private final WifiRttManager mNewService; + private final Context mContext; private RttCapabilities mRttCapabilities; /** @@ -1204,6 +1207,7 @@ public class RttManager { */ public RttManager(Context context, WifiRttManager service) { mNewService = service; + mContext = context; boolean rttSupported = context.getPackageManager().hasSystemFeature( PackageManager.FEATURE_WIFI_RTT); diff --git a/wifi/java/android/net/wifi/rtt/RangingRequest.java b/wifi/java/android/net/wifi/rtt/RangingRequest.java index 52b3d8691c79..c51d8126fe97 100644 --- a/wifi/java/android/net/wifi/rtt/RangingRequest.java +++ b/wifi/java/android/net/wifi/rtt/RangingRequest.java @@ -37,7 +37,7 @@ 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, RangingResultCallback, Handler)}. + * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)}. *

* The ranging request is a batch request - specifying a set of devices (specified using * {@link RangingRequest.Builder#addAccessPoint(ScanResult)} and diff --git a/wifi/java/android/net/wifi/rtt/RangingResult.java b/wifi/java/android/net/wifi/rtt/RangingResult.java index b262c0bcfde9..dac3357a9697 100644 --- a/wifi/java/android/net/wifi/rtt/RangingResult.java +++ b/wifi/java/android/net/wifi/rtt/RangingResult.java @@ -34,8 +34,8 @@ import java.util.Objects; /** * Ranging result for a request started by - * {@link WifiRttManager#startRanging(RangingRequest, RangingResultCallback, Handler)}. Results are - * returned in {@link RangingResultCallback#onRangingResults(List)}. + * {@link WifiRttManager#startRanging(RangingRequest, java.util.concurrent.Executor, RangingResultCallback)}. + * Results are returned in {@link RangingResultCallback#onRangingResults(List)}. *

* A ranging result is the distance measurement result for a single device specified in the * {@link RangingRequest}. diff --git a/wifi/java/android/net/wifi/rtt/RangingResultCallback.java b/wifi/java/android/net/wifi/rtt/RangingResultCallback.java index 9639dc803a7d..fa7d79ec0a8c 100644 --- a/wifi/java/android/net/wifi/rtt/RangingResultCallback.java +++ b/wifi/java/android/net/wifi/rtt/RangingResultCallback.java @@ -18,7 +18,6 @@ package android.net.wifi.rtt; import android.annotation.IntDef; import android.annotation.NonNull; -import android.os.Handler; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -26,11 +25,11 @@ import java.util.List; /** * Base class for ranging result callbacks. Should be extended by applications and set when calling - * {@link WifiRttManager#startRanging(RangingRequest, RangingResultCallback, Handler)}. 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 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 { diff --git a/wifi/java/android/net/wifi/rtt/WifiRttManager.java b/wifi/java/android/net/wifi/rtt/WifiRttManager.java index ec6c46ec4a7d..d119579f51b2 100644 --- a/wifi/java/android/net/wifi/rtt/WifiRttManager.java +++ b/wifi/java/android/net/wifi/rtt/WifiRttManager.java @@ -21,6 +21,7 @@ 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; @@ -29,13 +30,12 @@ import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; import android.os.Binder; -import android.os.Handler; -import android.os.Looper; 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 @@ -46,7 +46,7 @@ import java.util.List; *

  • Wi-Fi Aware peers *

    * Ranging requests are triggered using - * {@link #startRanging(RangingRequest, RangingResultCallback, Handler)}. Results (in case of + * {@link #startRanging(RangingRequest, Executor, RangingResultCallback)}. Results (in case of * successful operation) are returned in the {@link RangingResultCallback#onRangingResults(List)} * callback. *

    @@ -106,15 +106,13 @@ public class WifiRttManager { * * @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. - * @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. */ @RequiresPermission(allOf = {ACCESS_COARSE_LOCATION, CHANGE_WIFI_STATE, ACCESS_WIFI_STATE}) public void startRanging(@NonNull RangingRequest request, - @NonNull RangingResultCallback callback, @Nullable Handler handler) { - startRanging(null, request, callback, handler); + @NonNull @CallbackExecutor Executor executor, @NonNull RangingResultCallback callback) { + startRanging(null, request, executor, callback); } /** @@ -124,10 +122,8 @@ public class WifiRttManager { * @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. - * @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. * * @hide */ @@ -135,21 +131,36 @@ public class WifiRttManager { @RequiresPermission(allOf = {LOCATION_HARDWARE, ACCESS_COARSE_LOCATION, CHANGE_WIFI_STATE, ACCESS_WIFI_STATE}) public void startRanging(@Nullable WorkSource workSource, @NonNull RangingRequest request, - @NonNull RangingResultCallback callback, @Nullable Handler handler) { + @NonNull @CallbackExecutor Executor executor, @NonNull RangingResultCallback callback) { if (VDBG) { Log.v(TAG, "startRanging: workSource=" + workSource + ", request=" + request - + ", callback=" + callback + ", handler=" + handler); + + ", callback=" + callback + ", executor=" + executor); } + if (executor == null) { + throw new IllegalArgumentException("Null executor provided"); + } if (callback == null) { throw new IllegalArgumentException("Null callback provided"); } - Looper looper = (handler == null) ? Looper.getMainLooper() : handler.getLooper(); Binder binder = new Binder(); try { mService.startRanging(binder, mContext.getOpPackageName(), workSource, request, - new RttCallbackProxy(looper, callback)); + new IRttCallback.Stub() { + @Override + public void onRangingFailure(int status) throws RemoteException { + clearCallingIdentity(); + executor.execute(() -> callback.onRangingFailure(status)); + } + + @Override + public void onRangingResults(List results) + throws RemoteException { + clearCallingIdentity(); + executor.execute(() -> callback.onRangingResults(results)); + } + }); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -157,7 +168,7 @@ public class WifiRttManager { /** * Cancel all ranging requests for the specified work sources. The requests have been requested - * using {@link #startRanging(WorkSource, RangingRequest, RangingResultCallback, Handler)}. + * using {@link #startRanging(WorkSource, RangingRequest, Executor, RangingResultCallback)}. * * @param workSource The work-sources of the requesters. * @@ -176,30 +187,4 @@ public class WifiRttManager { throw e.rethrowFromSystemServer(); } } - - private static class RttCallbackProxy extends IRttCallback.Stub { - private final Handler mHandler; - private final RangingResultCallback mCallback; - - RttCallbackProxy(Looper looper, RangingResultCallback callback) { - mHandler = new Handler(looper); - mCallback = callback; - } - - @Override - public void onRangingFailure(int status) throws RemoteException { - if (VDBG) Log.v(TAG, "RttCallbackProxy: onRangingFailure: status=" + status); - mHandler.post(() -> { - mCallback.onRangingFailure(status); - }); - } - - @Override - public void onRangingResults(List results) throws RemoteException { - if (VDBG) Log.v(TAG, "RttCallbackProxy: onRanginResults: results=" + results); - mHandler.post(() -> { - mCallback.onRangingResults(results); - }); - } - } } diff --git a/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java b/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java index e790c3a51f6f..1e4cea1ec10b 100644 --- a/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java +++ b/wifi/tests/src/android/net/wifi/rtt/WifiRttManagerTest.java @@ -28,7 +28,6 @@ import android.content.Context; import android.net.MacAddress; import android.net.wifi.ScanResult; import android.net.wifi.aware.PeerHandle; -import android.os.Handler; import android.os.IBinder; import android.os.Parcel; import android.os.test.TestLooper; @@ -41,6 +40,7 @@ import org.mockito.MockitoAnnotations; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.Executor; /** * Unit test harness for WifiRttManager class. @@ -48,7 +48,7 @@ import java.util.List; public class WifiRttManagerTest { private WifiRttManager mDut; private TestLooper mMockLooper; - private Handler mMockLooperHandler; + private Executor mMockLooperExecutor; private final String packageName = "some.package.name.for.rtt.app"; @@ -64,7 +64,7 @@ public class WifiRttManagerTest { mDut = new WifiRttManager(mockContext, mockRttService); mMockLooper = new TestLooper(); - mMockLooperHandler = new Handler(mMockLooper.getLooper()); + mMockLooperExecutor = mMockLooper.getNewExecutor(); when(mockContext.getOpPackageName()).thenReturn(packageName); } @@ -83,7 +83,7 @@ public class WifiRttManagerTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(IRttCallback.class); // verify ranging request passed to service - mDut.startRanging(request, callbackMock, mMockLooperHandler); + mDut.startRanging(request, mMockLooperExecutor, callbackMock); verify(mockRttService).startRanging(any(IBinder.class), eq(packageName), eq(null), eq(request), callbackCaptor.capture()); @@ -107,7 +107,7 @@ public class WifiRttManagerTest { ArgumentCaptor callbackCaptor = ArgumentCaptor.forClass(IRttCallback.class); // verify ranging request passed to service - mDut.startRanging(request, callbackMock, mMockLooperHandler); + mDut.startRanging(request, mMockLooperExecutor, callbackMock); verify(mockRttService).startRanging(any(IBinder.class), eq(packageName), eq(null), eq(request), callbackCaptor.capture()); -- 2.11.0