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

Commit 483729b9 authored by William Escande's avatar William Escande
Browse files

AdapterProperties use correct looper

Bug: 372777933
Bug: 372775662
Flag: com.android.bluetooth.flags.adapter_properties_looper
Test: m Bluetooth
Change-Id: I4dd286ee2028e481efd9f0b67ec4a7c5798db3b5
parent eb3ad027
Loading
Loading
Loading
Loading
+22 −10
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import android.bluetooth.BluetoothHearingAid;
import android.bluetooth.BluetoothHidDevice;
import android.bluetooth.BluetoothHidHost;
import android.bluetooth.BluetoothLeAudio;
import android.bluetooth.BluetoothManager;
import android.bluetooth.BluetoothMap;
import android.bluetooth.BluetoothMapClient;
import android.bluetooth.BluetoothPan;
@@ -48,6 +49,8 @@ import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.ParcelUuid;
import android.os.SystemProperties;
import android.os.UserHandle;
@@ -72,7 +75,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CopyOnWriteArrayList;

class AdapterProperties {
    private static final String TAG = "AdapterProperties";
    private static final String TAG = AdapterProperties.class.getSimpleName();

    private static final String MAX_CONNECTED_AUDIO_DEVICES_PROPERTY =
            "persist.bluetooth.maxconnectedaudiodevices";
@@ -95,8 +98,7 @@ class AdapterProperties {
    private volatile int mDiscoverableTimeout;
    private volatile ParcelUuid[] mUuids;

    private CopyOnWriteArrayList<BluetoothDevice> mBondedDevices =
            new CopyOnWriteArrayList<BluetoothDevice>();
    private CopyOnWriteArrayList<BluetoothDevice> mBondedDevices = new CopyOnWriteArrayList<>();

    private int mProfilesConnecting, mProfilesConnected, mProfilesDisconnecting;
    private final HashMap<Integer, Pair<Integer, Integer>> mProfileConnectionState =
@@ -111,10 +113,12 @@ class AdapterProperties {
    private boolean mA2dpOffloadEnabled = false;

    private final AdapterService mService;
    private final BluetoothAdapter mAdapter;
    private final RemoteDevices mRemoteDevices;
    private final Handler mHandler;

    private boolean mDiscovering;
    private long mDiscoveryEndMs; // < Time (ms since epoch) that discovery ended or will end.
    private RemoteDevices mRemoteDevices;
    private BluetoothAdapter mAdapter;
    // TODO - all hw capabilities to be exposed as a class
    private int mNumOfAdvertisementInstancesSupported;
    private boolean mRpaOffloadSupported;
@@ -212,15 +216,16 @@ class AdapterProperties {
    // can be added here.
    private final Object mObject = new Object();

    AdapterProperties(AdapterService service) {
    AdapterProperties(AdapterService service, RemoteDevices remoteDevices, Looper looper) {
        mAdapter = ((Context) service).getSystemService(BluetoothManager.class).getAdapter();
        mRemoteDevices = remoteDevices;
        mService = service;
        mAdapter = BluetoothAdapter.getDefaultAdapter();
        mHandler = new Handler(looper);
        invalidateBluetoothCaches();
    }

    public void init(RemoteDevices remoteDevices) {
    public void init() {
        mProfileConnectionState.clear();
        mRemoteDevices = remoteDevices;

        // Get default max connected audio devices from config.xml
        int configDefaultMaxConnectedAudioDevices =
@@ -275,7 +280,6 @@ class AdapterProperties {
    }

    public void cleanup() {
        mRemoteDevices = null;
        mProfileConnectionState.clear();

        if (mReceiverRegistered) {
@@ -959,6 +963,14 @@ class AdapterProperties {
    }

    void adapterPropertyChangedCallback(int[] types, byte[][] values) {
        if (Flags.adapterPropertiesLooper()) {
            mHandler.post(() -> adapterPropertyChangedCallbackInternal(types, values));
        } else {
            adapterPropertyChangedCallbackInternal(types, values);
        }
    }

    private void adapterPropertyChangedCallbackInternal(int[] types, byte[][] values) {
        Intent intent;
        int type;
        byte[] val;
+13 −7
Original line number Diff line number Diff line
@@ -631,7 +631,7 @@ public class AdapterService extends Service {
        }
        // OnCreate must perform the minimum of infaillible and mandatory initialization
        mRemoteDevices = new RemoteDevices(this, mLooper);
        mAdapterProperties = new AdapterProperties(this);
        mAdapterProperties = new AdapterProperties(this, mRemoteDevices, mLooper);
        mAdapterStateMachine = new AdapterState(this, mLooper);
        mBinder = new AdapterServiceBinder(this);
        mUserManager = getNonNullSystemService(UserManager.class);
@@ -666,7 +666,7 @@ public class AdapterService extends Service {
        mAdapter = BluetoothAdapter.getDefaultAdapter();
        if (!Flags.fastBindToApp()) {
            // Moved to OnCreate
            mAdapterProperties = new AdapterProperties(this);
            mAdapterProperties = new AdapterProperties(this, mRemoteDevices, mLooper);
            mAdapterStateMachine = new AdapterState(this, mLooper);
        }
        boolean isCommonCriteriaMode =
@@ -1001,7 +1001,7 @@ public class AdapterService extends Service {
        // calling cleanup but this may not be necessary at all
        // We should figure out why this is needed later
        mRemoteDevices.reset();
        mAdapterProperties.init(mRemoteDevices);
        mAdapterProperties.init();

        Log.d(TAG, "bleOnProcessStart() - Make Bond State Machine");
        mBondStateMachine = BondStateMachine.make(this, mAdapterProperties, mRemoteDevices);
@@ -1200,9 +1200,12 @@ public class AdapterService extends Service {
    }

    void updateAdapterName(String name) {
        // TODO: b/372775662 - remove post once caller is on correct thread
        if (Flags.adapterPropertiesLooper()) {
            updateAdapterNameInternal(name);
        } else {
            mHandler.post(() -> updateAdapterNameInternal(name));
        }
    }

    private void updateAdapterNameInternal(String name) {
        int n = mRemoteCallbacks.beginBroadcast();
@@ -1218,9 +1221,12 @@ public class AdapterService extends Service {
    }

    void updateAdapterAddress(String address) {
        // TODO: b/372775662 - remove post once caller is on correct thread
        if (Flags.adapterPropertiesLooper()) {
            updateAdapterAddressInternal(address);
        } else {
            mHandler.post(() -> updateAdapterAddressInternal(address));
        }
    }

    private void updateAdapterAddressInternal(String address) {
        int n = mRemoteCallbacks.beginBroadcast();
+3 −4
Original line number Diff line number Diff line
@@ -21,9 +21,10 @@ import android.bluetooth.UidTraffic;

class JniCallbacks {

    private final AdapterProperties mAdapterProperties;
    private final AdapterService mAdapterService;

    private RemoteDevices mRemoteDevices;
    private AdapterProperties mAdapterProperties;
    private AdapterService mAdapterService;
    private BondStateMachine mBondStateMachine;

    JniCallbacks(AdapterService adapterService, AdapterProperties adapterProperties) {
@@ -38,8 +39,6 @@ class JniCallbacks {

    void cleanup() {
        mRemoteDevices = null;
        mAdapterProperties = null;
        mAdapterService = null;
        mBondStateMachine = null;
    }

+3 −2
Original line number Diff line number Diff line
@@ -93,8 +93,9 @@ public class AdapterPropertiesTest {
                .thenReturn(InstrumentationRegistry.getTargetContext().getResources());

        // Must be called to initialize services
        mAdapterProperties = new AdapterProperties(mAdapterService);
        mAdapterProperties.init(mRemoteDevices);
        mAdapterProperties =
                new AdapterProperties(mAdapterService, mRemoteDevices, mHandlerThread.getLooper());
        mAdapterProperties.init();
    }

    @Test
+3 −2
Original line number Diff line number Diff line
@@ -99,8 +99,9 @@ public class BondStateMachineTest {
        mRemoteDevices = new RemoteDevices(mAdapterService, mHandlerThread.getLooper());
        mRemoteDevices.reset();
        when(mAdapterService.getResources()).thenReturn(mTargetContext.getResources());
        mAdapterProperties = new AdapterProperties(mAdapterService);
        mAdapterProperties.init(mRemoteDevices);
        mAdapterProperties =
                new AdapterProperties(mAdapterService, mRemoteDevices, mHandlerThread.getLooper());
        mAdapterProperties.init();
        mBondStateMachine =
                BondStateMachine.make(mAdapterService, mAdapterProperties, mRemoteDevices);
    }