summaryrefslogtreecommitdiff
path: root/framework/java/android/bluetooth/BluetoothAdapter.java
diff options
context:
space:
mode:
authorEtienne Ruffieux <eruffieux@google.com>2022-03-10 15:53:43 +0000
committerEtienne Ruffieux <eruffieux@google.com>2022-03-10 16:43:28 +0000
commit0876571dd35c58ff443a5c58ac210d916cd15998 (patch)
tree7c47ddd40e3961628f5d064fd04c8a8edd2d32ba /framework/java/android/bluetooth/BluetoothAdapter.java
parentcbfde9f5c58852e610ec2575e05580556d0a5402 (diff)
[API Review] Replace ResultReceiver by Executor
Bug: 223344084 Test: build Tag: #feature Ignore-AOSP-First: merge conflict Change-Id: I9fc420a49a24315e85ad49ce398d8088991b3a4a
Diffstat (limited to 'framework/java/android/bluetooth/BluetoothAdapter.java')
-rw-r--r--framework/java/android/bluetooth/BluetoothAdapter.java66
1 files changed, 57 insertions, 9 deletions
diff --git a/framework/java/android/bluetooth/BluetoothAdapter.java b/framework/java/android/bluetooth/BluetoothAdapter.java
index 936a08569b..2cd7506204 100644
--- a/framework/java/android/bluetooth/BluetoothAdapter.java
+++ b/framework/java/android/bluetooth/BluetoothAdapter.java
@@ -59,7 +59,6 @@ import android.os.Build;
import android.os.IBinder;
import android.os.ParcelUuid;
import android.os.RemoteException;
-import android.os.ResultReceiver;
import android.sysprop.BluetoothProperties;
import android.util.Log;
import android.util.Pair;
@@ -822,6 +821,55 @@ public final class BluetoothAdapter {
};
/**
+ * Interface for Bluetooth activity energy info listener. Should be implemented by applications
+ * and set when calling {@link BluetoothAdapter#requestControllerActivityEnergyInfo}.
+ *
+ * @hide
+ */
+ @SystemApi
+ public interface OnBluetoothActivityEnergyInfoListener {
+ /**
+ * Called when Bluetooth activity energy info is available.
+ * Note: this listener is triggered at most once for each call to
+ * {@link #requestControllerActivityEnergyInfo}.
+ *
+ * @param info the latest {@link BluetoothActivityEnergyInfo}, or null if unavailable.
+ */
+ void onBluetoothActivityEnergyInfo(@Nullable BluetoothActivityEnergyInfo info);
+ }
+
+ private static class OnBluetoothActivityEnergyInfoProxy
+ extends IBluetoothActivityEnergyInfoListener.Stub {
+ private final Object mLock = new Object();
+ @Nullable @GuardedBy("mLock") private Executor mExecutor;
+ @Nullable @GuardedBy("mLock") private OnBluetoothActivityEnergyInfoListener mListener;
+
+ OnBluetoothActivityEnergyInfoProxy(Executor executor,
+ OnBluetoothActivityEnergyInfoListener listener) {
+ mExecutor = executor;
+ mListener = listener;
+ }
+
+ @Override
+ public void onBluetoothActivityEnergyInfo(BluetoothActivityEnergyInfo info) {
+ Executor executor;
+ OnBluetoothActivityEnergyInfoListener 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.onBluetoothActivityEnergyInfo(info));
+ }
+ }
+
+ /**
* Get a handle to the default local Bluetooth adapter.
* <p>
* Currently Android only supports one Bluetooth adapter, but the API could
@@ -2672,22 +2720,22 @@ public final class BluetoothAdapter {
android.Manifest.permission.BLUETOOTH_CONNECT,
android.Manifest.permission.BLUETOOTH_PRIVILEGED,
})
- public void requestControllerActivityEnergyInfo(@NonNull ResultReceiver result) {
- requireNonNull(result, "ResultReceiver cannot be null");
+ public void requestControllerActivityEnergyInfo(
+ @NonNull @CallbackExecutor Executor executor,
+ @NonNull OnBluetoothActivityEnergyInfoListener listener) {
+ requireNonNull(executor, "executor cannot be null");
+ requireNonNull(listener, "listener cannot be null");
try {
mServiceLock.readLock().lock();
if (mService != null) {
- mService.requestActivityInfo(result, mAttributionSource);
- result = null;
+ mService.requestActivityInfo(
+ new OnBluetoothActivityEnergyInfoProxy(executor, listener),
+ mAttributionSource);
}
} catch (RemoteException e) {
Log.e(TAG, "getControllerActivityEnergyInfoCallback: " + e);
} finally {
mServiceLock.readLock().unlock();
- if (result != null) {
- // Only send an immediate result if we failed.
- result.send(0, null);
- }
}
}