Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0876571d authored by Etienne Ruffieux's avatar Etienne Ruffieux
Browse files

[API Review] Replace ResultReceiver by Executor

Bug: 223344084
Test: build
Tag: #feature
Ignore-AOSP-First: merge conflict
Change-Id: I9fc420a49a24315e85ad49ce398d8088991b3a4a
parent cbfde9f5
Loading
Loading
Loading
Loading
+9 −10
Original line number Original line Diff line number Diff line
@@ -45,8 +45,6 @@ import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothAdapter.ActiveDeviceProfile;
import android.bluetooth.BluetoothAdapter.ActiveDeviceProfile;
import android.bluetooth.BluetoothAdapter.ActiveDeviceUse;
import android.bluetooth.BluetoothAdapter.ActiveDeviceUse;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothClass;
import android.bluetooth.BluetoothCodecConfig;
import android.bluetooth.BluetoothCodecStatus;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothFrameworkInitializer;
import android.bluetooth.BluetoothFrameworkInitializer;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothProfile;
@@ -57,6 +55,7 @@ import android.bluetooth.BluetoothStatusCodes;
import android.bluetooth.BluetoothUuid;
import android.bluetooth.BluetoothUuid;
import android.bluetooth.BufferConstraints;
import android.bluetooth.BufferConstraints;
import android.bluetooth.IBluetooth;
import android.bluetooth.IBluetooth;
import android.bluetooth.IBluetoothActivityEnergyInfoListener;
import android.bluetooth.IBluetoothCallback;
import android.bluetooth.IBluetoothCallback;
import android.bluetooth.IBluetoothConnectionCallback;
import android.bluetooth.IBluetoothConnectionCallback;
import android.bluetooth.IBluetoothMetadataListener;
import android.bluetooth.IBluetoothMetadataListener;
@@ -86,7 +85,6 @@ import android.os.ParcelUuid;
import android.os.PowerManager;
import android.os.PowerManager;
import android.os.RemoteCallbackList;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.os.SystemClock;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.SystemProperties;
import android.os.UserHandle;
import android.os.UserHandle;
@@ -217,8 +215,6 @@ public class AdapterService extends Service {
    public static final String ACTIVITY_ATTRIBUTION_NO_ACTIVE_DEVICE_ADDRESS =
    public static final String ACTIVITY_ATTRIBUTION_NO_ACTIVE_DEVICE_ADDRESS =
            "no_active_device_address";
            "no_active_device_address";


    public static final String RESULT_RECEIVER_CONTROLLER_KEY = "controller_activity";

    // Report ID definition
    // Report ID definition
    public enum BqrQualityReportId {
    public enum BqrQualityReportId {
        QUALITY_REPORT_ID_MONITOR_MODE(0x01),
        QUALITY_REPORT_ID_MONITOR_MODE(0x01),
@@ -3584,11 +3580,14 @@ public class AdapterService extends Service {
        }
        }


        @Override
        @Override
        public void requestActivityInfo(ResultReceiver result, AttributionSource source) {
        public void requestActivityInfo(IBluetoothActivityEnergyInfoListener listener,
            Bundle bundle = new Bundle();
                    AttributionSource source) {
            bundle.putParcelable(RESULT_RECEIVER_CONTROLLER_KEY,
            BluetoothActivityEnergyInfo info = reportActivityInfo(source);
                    reportActivityInfo(source));
            try {
            result.send(0, bundle);
                listener.onBluetoothActivityEnergyInfo(info);
            } catch (RemoteException e) {
                Log.e(TAG, "onBluetoothActivityEnergyInfo: RemoteException", e);
            }
        }
        }


        @Override
        @Override
+5 −1
Original line number Original line Diff line number Diff line
@@ -73,7 +73,7 @@ package android.bluetooth {
    method public boolean registerServiceLifecycleCallback(@NonNull android.bluetooth.BluetoothAdapter.ServiceLifecycleCallback);
    method public boolean registerServiceLifecycleCallback(@NonNull android.bluetooth.BluetoothAdapter.ServiceLifecycleCallback);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE}) public boolean removeActiveDevice(int);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE}) public boolean removeActiveDevice(int);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean removeOnMetadataChangedListener(@NonNull android.bluetooth.BluetoothDevice, @NonNull android.bluetooth.BluetoothAdapter.OnMetadataChangedListener);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public boolean removeOnMetadataChangedListener(@NonNull android.bluetooth.BluetoothDevice, @NonNull android.bluetooth.BluetoothAdapter.OnMetadataChangedListener);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public void requestControllerActivityEnergyInfo(@NonNull android.os.ResultReceiver);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public void requestControllerActivityEnergyInfo(@NonNull java.util.concurrent.Executor, @NonNull android.bluetooth.BluetoothAdapter.OnBluetoothActivityEnergyInfoListener);
    method @NonNull @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public android.bluetooth.BluetoothSocket retrieveConnectedRfcommSocket(@NonNull java.util.UUID);
    method @NonNull @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public android.bluetooth.BluetoothSocket retrieveConnectedRfcommSocket(@NonNull java.util.UUID);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE}) public boolean setActiveDevice(@NonNull android.bluetooth.BluetoothDevice, int);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT, android.Manifest.permission.BLUETOOTH_PRIVILEGED, android.Manifest.permission.MODIFY_PHONE_STATE}) public boolean setActiveDevice(@NonNull android.bluetooth.BluetoothDevice, int);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int setDiscoverableTimeout(@NonNull java.time.Duration);
    method @RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_PRIVILEGED}) public int setDiscoverableTimeout(@NonNull java.time.Duration);
@@ -99,6 +99,10 @@ package android.bluetooth {
    method public void onDeviceDisconnected(@NonNull android.bluetooth.BluetoothDevice, int);
    method public void onDeviceDisconnected(@NonNull android.bluetooth.BluetoothDevice, int);
  }
  }


  public static interface BluetoothAdapter.OnBluetoothActivityEnergyInfoListener {
    method public void onBluetoothActivityEnergyInfo(@Nullable android.bluetooth.BluetoothActivityEnergyInfo);
  }

  public static interface BluetoothAdapter.OnMetadataChangedListener {
  public static interface BluetoothAdapter.OnMetadataChangedListener {
    method public void onMetadataChanged(@NonNull android.bluetooth.BluetoothDevice, int, @Nullable byte[]);
    method public void onMetadataChanged(@NonNull android.bluetooth.BluetoothDevice, int, @Nullable byte[]);
  }
  }
+57 −9
Original line number Original line Diff line number Diff line
@@ -59,7 +59,6 @@ import android.os.Build;
import android.os.IBinder;
import android.os.IBinder;
import android.os.ParcelUuid;
import android.os.ParcelUuid;
import android.os.RemoteException;
import android.os.RemoteException;
import android.os.ResultReceiver;
import android.sysprop.BluetoothProperties;
import android.sysprop.BluetoothProperties;
import android.util.Log;
import android.util.Log;
import android.util.Pair;
import android.util.Pair;
@@ -821,6 +820,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.
     * Get a handle to the default local Bluetooth adapter.
     * <p>
     * <p>
@@ -2672,22 +2720,22 @@ public final class BluetoothAdapter {
            android.Manifest.permission.BLUETOOTH_CONNECT,
            android.Manifest.permission.BLUETOOTH_CONNECT,
            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
            android.Manifest.permission.BLUETOOTH_PRIVILEGED,
    })
    })
    public void requestControllerActivityEnergyInfo(@NonNull ResultReceiver result) {
    public void requestControllerActivityEnergyInfo(
        requireNonNull(result, "ResultReceiver cannot be null");
            @NonNull @CallbackExecutor Executor executor,
            @NonNull OnBluetoothActivityEnergyInfoListener listener) {
        requireNonNull(executor, "executor cannot be null");
        requireNonNull(listener, "listener cannot be null");
        try {
        try {
            mServiceLock.readLock().lock();
            mServiceLock.readLock().lock();
            if (mService != null) {
            if (mService != null) {
                mService.requestActivityInfo(result, mAttributionSource);
                mService.requestActivityInfo(
                result = null;
                        new OnBluetoothActivityEnergyInfoProxy(executor, listener),
                        mAttributionSource);
            }
            }
        } catch (RemoteException e) {
        } catch (RemoteException e) {
            Log.e(TAG, "getControllerActivityEnergyInfoCallback: " + e);
            Log.e(TAG, "getControllerActivityEnergyInfoCallback: " + e);
        } finally {
        } finally {
            mServiceLock.readLock().unlock();
            mServiceLock.readLock().unlock();
            if (result != null) {
                // Only send an immediate result if we failed.
                result.send(0, null);
            }
        }
        }
    }
    }


+1 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@ filegroup {
        "android/bluetooth/IBluetooth.aidl",
        "android/bluetooth/IBluetooth.aidl",
        "android/bluetooth/IBluetoothA2dp.aidl",
        "android/bluetooth/IBluetoothA2dp.aidl",
        "android/bluetooth/IBluetoothA2dpSink.aidl",
        "android/bluetooth/IBluetoothA2dpSink.aidl",
        "android/bluetooth/IBluetoothActivityEnergyInfoListener.aidl",
        "android/bluetooth/IBluetoothAvrcpController.aidl",
        "android/bluetooth/IBluetoothAvrcpController.aidl",
        "android/bluetooth/IBluetoothAvrcpTarget.aidl",
        "android/bluetooth/IBluetoothAvrcpTarget.aidl",
        "android/bluetooth/IBluetoothCallback.aidl",
        "android/bluetooth/IBluetoothCallback.aidl",
+2 −1
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@
package android.bluetooth;
package android.bluetooth;


import android.app.PendingIntent;
import android.app.PendingIntent;
import android.bluetooth.IBluetoothActivityEnergyInfoListener;
import android.bluetooth.IBluetoothCallback;
import android.bluetooth.IBluetoothCallback;
import android.bluetooth.IBluetoothConnectionCallback;
import android.bluetooth.IBluetoothConnectionCallback;
import android.bluetooth.IBluetoothMetadataListener;
import android.bluetooth.IBluetoothMetadataListener;
@@ -231,7 +232,7 @@ interface IBluetooth
     * The result code is ignored.
     * The result code is ignored.
     */
     */
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
    oneway void requestActivityInfo(in ResultReceiver result, in AttributionSource attributionSource);
    oneway void requestActivityInfo(in IBluetoothActivityEnergyInfoListener listener, in AttributionSource attributionSource);


    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
    @JavaPassthrough(annotation="@android.annotation.RequiresPermission(allOf={android.Manifest.permission.BLUETOOTH_CONNECT,android.Manifest.permission.BLUETOOTH_PRIVILEGED})")
    oneway void onLeServiceUp(in AttributionSource attributionSource, in SynchronousResultReceiver receiver);
    oneway void onLeServiceUp(in AttributionSource attributionSource, in SynchronousResultReceiver receiver);
Loading