From 9c04ac749f51b12f0c86f40b0ac42eaea9dcc687 Mon Sep 17 00:00:00 2001 From: Alex Dadukin Date: Mon, 9 Jan 2023 13:48:50 +0000 Subject: [PATCH] Remove unnecessary broadcast receivers mapping in BluetoothRouteProvider Bug: b/255495104 Test: atest SystemMediaRouter2Test Change-Id: Ib3f42592ddbb7574cf0a647adb23320fa6d60506 --- .../server/media/BluetoothRouteProvider.java | 84 +++++++++---------- 1 file changed, 40 insertions(+), 44 deletions(-) diff --git a/services/core/java/com/android/server/media/BluetoothRouteProvider.java b/services/core/java/com/android/server/media/BluetoothRouteProvider.java index c90554d9cdd8b..8182fe92ff2c6 100644 --- a/services/core/java/com/android/server/media/BluetoothRouteProvider.java +++ b/services/core/java/com/android/server/media/BluetoothRouteProvider.java @@ -70,11 +70,13 @@ class BluetoothRouteProvider { private final BluetoothAdapter mBluetoothAdapter; private final BluetoothRoutesUpdatedListener mListener; private final AudioManager mAudioManager; - private final Map mEventReceiverMap = new HashMap<>(); - private final IntentFilter mIntentFilter = new IntentFilter(); - private final BroadcastReceiver mBroadcastReceiver = new BluetoothBroadcastReceiver(); private final BluetoothProfileListener mProfileListener = new BluetoothProfileListener(); + private final AdapterStateChangedReceiver mAdapterStateChangedReceiver = + new AdapterStateChangedReceiver(); + private final DeviceStateChangedReceiver mDeviceStateChangedReceiver = + new DeviceStateChangedReceiver(); + private BluetoothA2dp mA2dpProfile; private BluetoothHearingAid mHearingAidProfile; private BluetoothLeAudio mLeAudioProfile; @@ -105,32 +107,45 @@ class BluetoothRouteProvider { buildBluetoothRoutes(); } + /** + * Registers listener to bluetooth status changes as the provided user. + * + * The registered receiver listens to {@link BluetoothA2dp#ACTION_ACTIVE_DEVICE_CHANGED} and + * {@link BluetoothA2dp#ACTION_CONNECTION_STATE_CHANGED } events for {@link BluetoothProfile#A2DP}, + * {@link BluetoothProfile#HEARING_AID}, and {@link BluetoothProfile#LE_AUDIO} bluetooth profiles. + * + * @param user {@code UserHandle} as which receiver is registered + */ void start(UserHandle user) { mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.A2DP); mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.HEARING_AID); mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.LE_AUDIO); - // Bluetooth on/off broadcasts - addEventReceiver(BluetoothAdapter.ACTION_STATE_CHANGED, new AdapterStateChangedReceiver()); + IntentFilter adapterStateChangedIntentFilter = new IntentFilter(); - DeviceStateChangedReceiver deviceStateChangedReceiver = new DeviceStateChangedReceiver(); - addEventReceiver(BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED, deviceStateChangedReceiver); - addEventReceiver(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED, deviceStateChangedReceiver); - addEventReceiver(BluetoothHearingAid.ACTION_ACTIVE_DEVICE_CHANGED, - deviceStateChangedReceiver); - addEventReceiver(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED, - deviceStateChangedReceiver); - addEventReceiver(BluetoothLeAudio.ACTION_LE_AUDIO_CONNECTION_STATE_CHANGED, - deviceStateChangedReceiver); - addEventReceiver(BluetoothLeAudio.ACTION_LE_AUDIO_ACTIVE_DEVICE_CHANGED, - deviceStateChangedReceiver); + adapterStateChangedIntentFilter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED); + mContext.registerReceiverAsUser(mAdapterStateChangedReceiver, user, + adapterStateChangedIntentFilter, null, null); - mContext.registerReceiverAsUser(mBroadcastReceiver, user, - mIntentFilter, null, null); + IntentFilter deviceStateChangedIntentFilter = new IntentFilter(); + + deviceStateChangedIntentFilter.addAction(BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED); + deviceStateChangedIntentFilter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED); + deviceStateChangedIntentFilter.addAction(BluetoothHearingAid.ACTION_ACTIVE_DEVICE_CHANGED); + deviceStateChangedIntentFilter.addAction( + BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED); + deviceStateChangedIntentFilter.addAction( + BluetoothLeAudio.ACTION_LE_AUDIO_CONNECTION_STATE_CHANGED); + deviceStateChangedIntentFilter.addAction( + BluetoothLeAudio.ACTION_LE_AUDIO_ACTIVE_DEVICE_CHANGED); + + mContext.registerReceiverAsUser(mDeviceStateChangedReceiver, user, + deviceStateChangedIntentFilter, null, null); } void stop() { - mContext.unregisterReceiver(mBroadcastReceiver); + mContext.unregisterReceiver(mAdapterStateChangedReceiver); + mContext.unregisterReceiver(mDeviceStateChangedReceiver); } /** @@ -167,11 +182,6 @@ class BluetoothRouteProvider { } } - private void addEventReceiver(String action, BluetoothEventReceiver eventReceiver) { - mEventReceiverMap.put(action, eventReceiver); - mIntentFilter.addAction(action); - } - private void buildBluetoothRoutes() { mBluetoothRoutes.clear(); Set bondedDevices = mBluetoothAdapter.getBondedDevices(); @@ -495,26 +505,9 @@ class BluetoothRouteProvider { } } - private class BluetoothBroadcastReceiver extends BroadcastReceiver { + private class AdapterStateChangedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE, android.bluetooth.BluetoothDevice.class); - - BluetoothEventReceiver receiver = mEventReceiverMap.get(action); - if (receiver != null) { - receiver.onReceive(context, intent, device); - } - } - } - - private interface BluetoothEventReceiver { - void onReceive(Context context, Intent intent, BluetoothDevice device); - } - - private class AdapterStateChangedReceiver implements BluetoothEventReceiver { - @Override - public void onReceive(Context context, Intent intent, BluetoothDevice device) { int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1); if (state == BluetoothAdapter.STATE_OFF || state == BluetoothAdapter.STATE_TURNING_OFF) { @@ -529,9 +522,12 @@ class BluetoothRouteProvider { } } - private class DeviceStateChangedReceiver implements BluetoothEventReceiver { + private class DeviceStateChangedReceiver extends BroadcastReceiver { @Override - public void onReceive(Context context, Intent intent, BluetoothDevice device) { + public void onReceive(Context context, Intent intent) { + BluetoothDevice device = intent.getParcelableExtra( + BluetoothDevice.EXTRA_DEVICE, android.bluetooth.BluetoothDevice.class); + switch (intent.getAction()) { case BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED: clearActiveRoutesWithType(MediaRoute2Info.TYPE_BLUETOOTH_A2DP);