Loading services/core/java/com/android/server/media/BluetoothRouteProvider.java +49 −49 Original line number Diff line number Diff line Loading @@ -59,17 +59,9 @@ class BluetoothRouteProvider { private static final String HEARING_AID_ROUTE_ID_PREFIX = "HEARING_AID_"; private static final String LE_AUDIO_ROUTE_ID_PREFIX = "LE_AUDIO_"; @SuppressWarnings("WeakerAccess") /* synthetic access */ // Maps hardware address to BluetoothRouteInfo final Map<String, BluetoothRouteInfo> mBluetoothRoutes = new HashMap<>(); @SuppressWarnings("WeakerAccess") /* synthetic access */ final List<BluetoothRouteInfo> mActiveRoutes = new ArrayList<>(); @SuppressWarnings("WeakerAccess") /* synthetic access */ BluetoothA2dp mA2dpProfile; @SuppressWarnings("WeakerAccess") /* synthetic access */ BluetoothHearingAid mHearingAidProfile; @SuppressWarnings("WeakerAccess") /* synthetic access */ BluetoothLeAudio mLeAudioProfile; private final Map<String, BluetoothRouteInfo> mBluetoothRoutes = new HashMap<>(); private final List<BluetoothRouteInfo> mActiveRoutes = new ArrayList<>(); // Route type -> volume map private final SparseIntArray mVolumeMap = new SparseIntArray(); Loading @@ -83,6 +75,10 @@ class BluetoothRouteProvider { private final BroadcastReceiver mBroadcastReceiver = new BluetoothBroadcastReceiver(); private final BluetoothProfileListener mProfileListener = new BluetoothProfileListener(); private BluetoothA2dp mA2dpProfile; private BluetoothHearingAid mHearingAidProfile; private BluetoothLeAudio mLeAudioProfile; /** * Create an instance of {@link BluetoothRouteProvider}. * It may return {@code null} if Bluetooth is not supported on this hardware platform. Loading @@ -109,7 +105,7 @@ class BluetoothRouteProvider { buildBluetoothRoutes(); } public void start(UserHandle user) { void start(UserHandle user) { mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.A2DP); mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.HEARING_AID); mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.LE_AUDIO); Loading @@ -133,7 +129,7 @@ class BluetoothRouteProvider { mIntentFilter, null, null); } public void stop() { void stop() { mContext.unregisterReceiver(mBroadcastReceiver); } Loading @@ -144,7 +140,7 @@ class BluetoothRouteProvider { * @param routeId the id of the Bluetooth device. {@code null} denotes to clear the use of * BT routes. */ public void transferTo(@Nullable String routeId) { void transferTo(@Nullable String routeId) { if (routeId == null) { clearActiveDevices(); return; Loading @@ -158,7 +154,7 @@ class BluetoothRouteProvider { } if (mBluetoothAdapter != null) { mBluetoothAdapter.setActiveDevice(btRouteInfo.btDevice, ACTIVE_DEVICE_AUDIO); mBluetoothAdapter.setActiveDevice(btRouteInfo.mBtDevice, ACTIVE_DEVICE_AUDIO); } } Loading @@ -183,7 +179,7 @@ class BluetoothRouteProvider { for (BluetoothDevice device : bondedDevices) { if (device.isConnected()) { BluetoothRouteInfo newBtRoute = createBluetoothRoute(device); if (newBtRoute.connectedProfiles.size() > 0) { if (newBtRoute.mConnectedProfiles.size() > 0) { mBluetoothRoutes.put(device.getAddress(), newBtRoute); } } Loading @@ -195,14 +191,14 @@ class BluetoothRouteProvider { MediaRoute2Info getSelectedRoute() { // For now, active routes can be multiple only when a pair of hearing aid devices is active. // Let the first active device represent them. return (mActiveRoutes.isEmpty() ? null : mActiveRoutes.get(0).route); return (mActiveRoutes.isEmpty() ? null : mActiveRoutes.get(0).mRoute); } @NonNull List<MediaRoute2Info> getTransferableRoutes() { List<MediaRoute2Info> routes = getAllBluetoothRoutes(); for (BluetoothRouteInfo btRoute : mActiveRoutes) { routes.remove(btRoute.route); routes.remove(btRoute.mRoute); } return routes; } Loading @@ -220,11 +216,11 @@ class BluetoothRouteProvider { for (BluetoothRouteInfo btRoute : mBluetoothRoutes.values()) { // A pair of hearing aid devices or having the same hardware address if (routeIds.contains(btRoute.route.getId())) { if (routeIds.contains(btRoute.mRoute.getId())) { continue; } routes.add(btRoute.route); routeIds.add(btRoute.route.getId()); routes.add(btRoute.mRoute); routeIds.add(btRoute.mRoute.getId()); } return routes; } Loading @@ -234,7 +230,7 @@ class BluetoothRouteProvider { return null; } for (BluetoothRouteInfo btRouteInfo : mBluetoothRoutes.values()) { if (TextUtils.equals(btRouteInfo.route.getId(), routeId)) { if (TextUtils.equals(btRouteInfo.mRoute.getId(), routeId)) { return btRouteInfo; } } Loading @@ -246,7 +242,7 @@ class BluetoothRouteProvider { * * @return true if devices can be handled by the provider. */ public boolean updateVolumeForDevices(int devices, int volume) { boolean updateVolumeForDevices(int devices, int volume) { int routeType; if ((devices & (AudioSystem.DEVICE_OUT_HEARING_AID)) != 0) { routeType = MediaRoute2Info.TYPE_HEARING_AID; Loading @@ -263,10 +259,10 @@ class BluetoothRouteProvider { boolean shouldNotify = false; for (BluetoothRouteInfo btRoute : mActiveRoutes) { if (btRoute.route.getType() != routeType) { if (btRoute.mRoute.getType() != routeType) { continue; } btRoute.route = new MediaRoute2Info.Builder(btRoute.route) btRoute.mRoute = new MediaRoute2Info.Builder(btRoute.mRoute) .setVolume(volume) .build(); shouldNotify = true; Loading @@ -285,7 +281,7 @@ class BluetoothRouteProvider { private BluetoothRouteInfo createBluetoothRoute(BluetoothDevice device) { BluetoothRouteInfo newBtRoute = new BluetoothRouteInfo(); newBtRoute.btDevice = device; newBtRoute.mBtDevice = device; String routeId = device.getAddress(); String deviceName = device.getName(); Loading @@ -293,26 +289,26 @@ class BluetoothRouteProvider { deviceName = mContext.getResources().getText(R.string.unknownName).toString(); } int type = MediaRoute2Info.TYPE_BLUETOOTH_A2DP; newBtRoute.connectedProfiles = new SparseBooleanArray(); newBtRoute.mConnectedProfiles = new SparseBooleanArray(); if (mA2dpProfile != null && mA2dpProfile.getConnectedDevices().contains(device)) { newBtRoute.connectedProfiles.put(BluetoothProfile.A2DP, true); newBtRoute.mConnectedProfiles.put(BluetoothProfile.A2DP, true); } if (mHearingAidProfile != null && mHearingAidProfile.getConnectedDevices().contains(device)) { newBtRoute.connectedProfiles.put(BluetoothProfile.HEARING_AID, true); newBtRoute.mConnectedProfiles.put(BluetoothProfile.HEARING_AID, true); // Intentionally assign the same ID for a pair of devices to publish only one of them. routeId = HEARING_AID_ROUTE_ID_PREFIX + mHearingAidProfile.getHiSyncId(device); type = MediaRoute2Info.TYPE_HEARING_AID; } if (mLeAudioProfile != null && mLeAudioProfile.getConnectedDevices().contains(device)) { newBtRoute.connectedProfiles.put(BluetoothProfile.LE_AUDIO, true); newBtRoute.mConnectedProfiles.put(BluetoothProfile.LE_AUDIO, true); routeId = LE_AUDIO_ROUTE_ID_PREFIX + mLeAudioProfile.getGroupId(device); type = MediaRoute2Info.TYPE_BLE_HEADSET; } // Current volume will be set when connected. newBtRoute.route = new MediaRoute2Info.Builder(routeId, deviceName) newBtRoute.mRoute = new MediaRoute2Info.Builder(routeId, deviceName) .addFeature(MediaRoute2Info.FEATURE_LIVE_AUDIO) .addFeature(MediaRoute2Info.FEATURE_LOCAL_PLAYBACK) .setConnectionState(MediaRoute2Info.CONNECTION_STATE_DISCONNECTED) Loading @@ -332,18 +328,18 @@ class BluetoothRouteProvider { Slog.w(TAG, "setRouteConnectionState: route shouldn't be null"); return; } if (btRoute.route.getConnectionState() == state) { if (btRoute.mRoute.getConnectionState() == state) { return; } MediaRoute2Info.Builder builder = new MediaRoute2Info.Builder(btRoute.route) MediaRoute2Info.Builder builder = new MediaRoute2Info.Builder(btRoute.mRoute) .setConnectionState(state); builder.setType(btRoute.getRouteType()); if (state == MediaRoute2Info.CONNECTION_STATE_CONNECTED) { builder.setVolume(mVolumeMap.get(btRoute.getRouteType(), 0)); } btRoute.route = builder.build(); btRoute.mRoute = builder.build(); } private void addActiveRoute(BluetoothRouteInfo btRoute) { Loading @@ -352,7 +348,7 @@ class BluetoothRouteProvider { return; } if (DEBUG) { Log.d(TAG, "Adding active route: " + btRoute.route); Log.d(TAG, "Adding active route: " + btRoute.mRoute); } if (mActiveRoutes.contains(btRoute)) { Slog.w(TAG, "addActiveRoute: btRoute is already added."); Loading @@ -364,7 +360,7 @@ class BluetoothRouteProvider { private void removeActiveRoute(BluetoothRouteInfo btRoute) { if (DEBUG) { Log.d(TAG, "Removing active route: " + btRoute.route); Log.d(TAG, "Removing active route: " + btRoute.mRoute); } if (mActiveRoutes.remove(btRoute)) { setRouteConnectionState(btRoute, STATE_DISCONNECTED); Loading @@ -378,7 +374,7 @@ class BluetoothRouteProvider { Iterator<BluetoothRouteInfo> iter = mActiveRoutes.iterator(); while (iter.hasNext()) { BluetoothRouteInfo btRoute = iter.next(); if (btRoute.route.getType() == type) { if (btRoute.mRoute.getType() == type) { iter.remove(); setRouteConnectionState(btRoute, STATE_DISCONNECTED); } Loading @@ -398,9 +394,9 @@ class BluetoothRouteProvider { // A bluetooth route with the same route ID should be added. for (BluetoothRouteInfo btRoute : mBluetoothRoutes.values()) { if (TextUtils.equals(btRoute.route.getId(), activeBtRoute.route.getId()) && !TextUtils.equals(btRoute.btDevice.getAddress(), activeBtRoute.btDevice.getAddress())) { if (TextUtils.equals(btRoute.mRoute.getId(), activeBtRoute.mRoute.getId()) && !TextUtils.equals(btRoute.mBtDevice.getAddress(), activeBtRoute.mBtDevice.getAddress())) { addActiveRoute(btRoute); } } Loading @@ -425,19 +421,19 @@ class BluetoothRouteProvider { void onBluetoothRoutesUpdated(@NonNull List<MediaRoute2Info> routes); } private class BluetoothRouteInfo { public BluetoothDevice btDevice; public MediaRoute2Info route; public SparseBooleanArray connectedProfiles; private static class BluetoothRouteInfo { private BluetoothDevice mBtDevice; private MediaRoute2Info mRoute; private SparseBooleanArray mConnectedProfiles; @MediaRoute2Info.Type int getRouteType() { // Let hearing aid profile have a priority. if (connectedProfiles.get(BluetoothProfile.HEARING_AID, false)) { if (mConnectedProfiles.get(BluetoothProfile.HEARING_AID, false)) { return MediaRoute2Info.TYPE_HEARING_AID; } if (connectedProfiles.get(BluetoothProfile.LE_AUDIO, false)) { if (mConnectedProfiles.get(BluetoothProfile.LE_AUDIO, false)) { return MediaRoute2Info.TYPE_BLE_HEADSET; } Loading @@ -447,6 +443,7 @@ class BluetoothRouteProvider { // These callbacks run on the main thread. private final class BluetoothProfileListener implements BluetoothProfile.ServiceListener { @Override public void onServiceConnected(int profile, BluetoothProfile proxy) { List<BluetoothDevice> activeDevices; switch (profile) { Loading Loading @@ -480,6 +477,7 @@ class BluetoothRouteProvider { notifyBluetoothRoutesUpdated(); } @Override public void onServiceDisconnected(int profile) { switch (profile) { case BluetoothProfile.A2DP: Loading @@ -496,6 +494,7 @@ class BluetoothRouteProvider { } } } private class BluetoothBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Loading @@ -514,6 +513,7 @@ class BluetoothRouteProvider { } 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 Loading Loading @@ -573,18 +573,18 @@ class BluetoothRouteProvider { if (state == BluetoothProfile.STATE_CONNECTED) { if (btRoute == null) { btRoute = createBluetoothRoute(device); if (btRoute.connectedProfiles.size() > 0) { if (btRoute.mConnectedProfiles.size() > 0) { mBluetoothRoutes.put(device.getAddress(), btRoute); notifyBluetoothRoutesUpdated(); } } else { btRoute.connectedProfiles.put(profile, true); btRoute.mConnectedProfiles.put(profile, true); } } else if (state == BluetoothProfile.STATE_DISCONNECTING || state == BluetoothProfile.STATE_DISCONNECTED) { if (btRoute != null) { btRoute.connectedProfiles.delete(profile); if (btRoute.connectedProfiles.size() == 0) { btRoute.mConnectedProfiles.delete(profile); if (btRoute.mConnectedProfiles.size() == 0) { removeActiveRoute(mBluetoothRoutes.remove(device.getAddress())); notifyBluetoothRoutesUpdated(); } Loading Loading
services/core/java/com/android/server/media/BluetoothRouteProvider.java +49 −49 Original line number Diff line number Diff line Loading @@ -59,17 +59,9 @@ class BluetoothRouteProvider { private static final String HEARING_AID_ROUTE_ID_PREFIX = "HEARING_AID_"; private static final String LE_AUDIO_ROUTE_ID_PREFIX = "LE_AUDIO_"; @SuppressWarnings("WeakerAccess") /* synthetic access */ // Maps hardware address to BluetoothRouteInfo final Map<String, BluetoothRouteInfo> mBluetoothRoutes = new HashMap<>(); @SuppressWarnings("WeakerAccess") /* synthetic access */ final List<BluetoothRouteInfo> mActiveRoutes = new ArrayList<>(); @SuppressWarnings("WeakerAccess") /* synthetic access */ BluetoothA2dp mA2dpProfile; @SuppressWarnings("WeakerAccess") /* synthetic access */ BluetoothHearingAid mHearingAidProfile; @SuppressWarnings("WeakerAccess") /* synthetic access */ BluetoothLeAudio mLeAudioProfile; private final Map<String, BluetoothRouteInfo> mBluetoothRoutes = new HashMap<>(); private final List<BluetoothRouteInfo> mActiveRoutes = new ArrayList<>(); // Route type -> volume map private final SparseIntArray mVolumeMap = new SparseIntArray(); Loading @@ -83,6 +75,10 @@ class BluetoothRouteProvider { private final BroadcastReceiver mBroadcastReceiver = new BluetoothBroadcastReceiver(); private final BluetoothProfileListener mProfileListener = new BluetoothProfileListener(); private BluetoothA2dp mA2dpProfile; private BluetoothHearingAid mHearingAidProfile; private BluetoothLeAudio mLeAudioProfile; /** * Create an instance of {@link BluetoothRouteProvider}. * It may return {@code null} if Bluetooth is not supported on this hardware platform. Loading @@ -109,7 +105,7 @@ class BluetoothRouteProvider { buildBluetoothRoutes(); } public void start(UserHandle user) { void start(UserHandle user) { mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.A2DP); mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.HEARING_AID); mBluetoothAdapter.getProfileProxy(mContext, mProfileListener, BluetoothProfile.LE_AUDIO); Loading @@ -133,7 +129,7 @@ class BluetoothRouteProvider { mIntentFilter, null, null); } public void stop() { void stop() { mContext.unregisterReceiver(mBroadcastReceiver); } Loading @@ -144,7 +140,7 @@ class BluetoothRouteProvider { * @param routeId the id of the Bluetooth device. {@code null} denotes to clear the use of * BT routes. */ public void transferTo(@Nullable String routeId) { void transferTo(@Nullable String routeId) { if (routeId == null) { clearActiveDevices(); return; Loading @@ -158,7 +154,7 @@ class BluetoothRouteProvider { } if (mBluetoothAdapter != null) { mBluetoothAdapter.setActiveDevice(btRouteInfo.btDevice, ACTIVE_DEVICE_AUDIO); mBluetoothAdapter.setActiveDevice(btRouteInfo.mBtDevice, ACTIVE_DEVICE_AUDIO); } } Loading @@ -183,7 +179,7 @@ class BluetoothRouteProvider { for (BluetoothDevice device : bondedDevices) { if (device.isConnected()) { BluetoothRouteInfo newBtRoute = createBluetoothRoute(device); if (newBtRoute.connectedProfiles.size() > 0) { if (newBtRoute.mConnectedProfiles.size() > 0) { mBluetoothRoutes.put(device.getAddress(), newBtRoute); } } Loading @@ -195,14 +191,14 @@ class BluetoothRouteProvider { MediaRoute2Info getSelectedRoute() { // For now, active routes can be multiple only when a pair of hearing aid devices is active. // Let the first active device represent them. return (mActiveRoutes.isEmpty() ? null : mActiveRoutes.get(0).route); return (mActiveRoutes.isEmpty() ? null : mActiveRoutes.get(0).mRoute); } @NonNull List<MediaRoute2Info> getTransferableRoutes() { List<MediaRoute2Info> routes = getAllBluetoothRoutes(); for (BluetoothRouteInfo btRoute : mActiveRoutes) { routes.remove(btRoute.route); routes.remove(btRoute.mRoute); } return routes; } Loading @@ -220,11 +216,11 @@ class BluetoothRouteProvider { for (BluetoothRouteInfo btRoute : mBluetoothRoutes.values()) { // A pair of hearing aid devices or having the same hardware address if (routeIds.contains(btRoute.route.getId())) { if (routeIds.contains(btRoute.mRoute.getId())) { continue; } routes.add(btRoute.route); routeIds.add(btRoute.route.getId()); routes.add(btRoute.mRoute); routeIds.add(btRoute.mRoute.getId()); } return routes; } Loading @@ -234,7 +230,7 @@ class BluetoothRouteProvider { return null; } for (BluetoothRouteInfo btRouteInfo : mBluetoothRoutes.values()) { if (TextUtils.equals(btRouteInfo.route.getId(), routeId)) { if (TextUtils.equals(btRouteInfo.mRoute.getId(), routeId)) { return btRouteInfo; } } Loading @@ -246,7 +242,7 @@ class BluetoothRouteProvider { * * @return true if devices can be handled by the provider. */ public boolean updateVolumeForDevices(int devices, int volume) { boolean updateVolumeForDevices(int devices, int volume) { int routeType; if ((devices & (AudioSystem.DEVICE_OUT_HEARING_AID)) != 0) { routeType = MediaRoute2Info.TYPE_HEARING_AID; Loading @@ -263,10 +259,10 @@ class BluetoothRouteProvider { boolean shouldNotify = false; for (BluetoothRouteInfo btRoute : mActiveRoutes) { if (btRoute.route.getType() != routeType) { if (btRoute.mRoute.getType() != routeType) { continue; } btRoute.route = new MediaRoute2Info.Builder(btRoute.route) btRoute.mRoute = new MediaRoute2Info.Builder(btRoute.mRoute) .setVolume(volume) .build(); shouldNotify = true; Loading @@ -285,7 +281,7 @@ class BluetoothRouteProvider { private BluetoothRouteInfo createBluetoothRoute(BluetoothDevice device) { BluetoothRouteInfo newBtRoute = new BluetoothRouteInfo(); newBtRoute.btDevice = device; newBtRoute.mBtDevice = device; String routeId = device.getAddress(); String deviceName = device.getName(); Loading @@ -293,26 +289,26 @@ class BluetoothRouteProvider { deviceName = mContext.getResources().getText(R.string.unknownName).toString(); } int type = MediaRoute2Info.TYPE_BLUETOOTH_A2DP; newBtRoute.connectedProfiles = new SparseBooleanArray(); newBtRoute.mConnectedProfiles = new SparseBooleanArray(); if (mA2dpProfile != null && mA2dpProfile.getConnectedDevices().contains(device)) { newBtRoute.connectedProfiles.put(BluetoothProfile.A2DP, true); newBtRoute.mConnectedProfiles.put(BluetoothProfile.A2DP, true); } if (mHearingAidProfile != null && mHearingAidProfile.getConnectedDevices().contains(device)) { newBtRoute.connectedProfiles.put(BluetoothProfile.HEARING_AID, true); newBtRoute.mConnectedProfiles.put(BluetoothProfile.HEARING_AID, true); // Intentionally assign the same ID for a pair of devices to publish only one of them. routeId = HEARING_AID_ROUTE_ID_PREFIX + mHearingAidProfile.getHiSyncId(device); type = MediaRoute2Info.TYPE_HEARING_AID; } if (mLeAudioProfile != null && mLeAudioProfile.getConnectedDevices().contains(device)) { newBtRoute.connectedProfiles.put(BluetoothProfile.LE_AUDIO, true); newBtRoute.mConnectedProfiles.put(BluetoothProfile.LE_AUDIO, true); routeId = LE_AUDIO_ROUTE_ID_PREFIX + mLeAudioProfile.getGroupId(device); type = MediaRoute2Info.TYPE_BLE_HEADSET; } // Current volume will be set when connected. newBtRoute.route = new MediaRoute2Info.Builder(routeId, deviceName) newBtRoute.mRoute = new MediaRoute2Info.Builder(routeId, deviceName) .addFeature(MediaRoute2Info.FEATURE_LIVE_AUDIO) .addFeature(MediaRoute2Info.FEATURE_LOCAL_PLAYBACK) .setConnectionState(MediaRoute2Info.CONNECTION_STATE_DISCONNECTED) Loading @@ -332,18 +328,18 @@ class BluetoothRouteProvider { Slog.w(TAG, "setRouteConnectionState: route shouldn't be null"); return; } if (btRoute.route.getConnectionState() == state) { if (btRoute.mRoute.getConnectionState() == state) { return; } MediaRoute2Info.Builder builder = new MediaRoute2Info.Builder(btRoute.route) MediaRoute2Info.Builder builder = new MediaRoute2Info.Builder(btRoute.mRoute) .setConnectionState(state); builder.setType(btRoute.getRouteType()); if (state == MediaRoute2Info.CONNECTION_STATE_CONNECTED) { builder.setVolume(mVolumeMap.get(btRoute.getRouteType(), 0)); } btRoute.route = builder.build(); btRoute.mRoute = builder.build(); } private void addActiveRoute(BluetoothRouteInfo btRoute) { Loading @@ -352,7 +348,7 @@ class BluetoothRouteProvider { return; } if (DEBUG) { Log.d(TAG, "Adding active route: " + btRoute.route); Log.d(TAG, "Adding active route: " + btRoute.mRoute); } if (mActiveRoutes.contains(btRoute)) { Slog.w(TAG, "addActiveRoute: btRoute is already added."); Loading @@ -364,7 +360,7 @@ class BluetoothRouteProvider { private void removeActiveRoute(BluetoothRouteInfo btRoute) { if (DEBUG) { Log.d(TAG, "Removing active route: " + btRoute.route); Log.d(TAG, "Removing active route: " + btRoute.mRoute); } if (mActiveRoutes.remove(btRoute)) { setRouteConnectionState(btRoute, STATE_DISCONNECTED); Loading @@ -378,7 +374,7 @@ class BluetoothRouteProvider { Iterator<BluetoothRouteInfo> iter = mActiveRoutes.iterator(); while (iter.hasNext()) { BluetoothRouteInfo btRoute = iter.next(); if (btRoute.route.getType() == type) { if (btRoute.mRoute.getType() == type) { iter.remove(); setRouteConnectionState(btRoute, STATE_DISCONNECTED); } Loading @@ -398,9 +394,9 @@ class BluetoothRouteProvider { // A bluetooth route with the same route ID should be added. for (BluetoothRouteInfo btRoute : mBluetoothRoutes.values()) { if (TextUtils.equals(btRoute.route.getId(), activeBtRoute.route.getId()) && !TextUtils.equals(btRoute.btDevice.getAddress(), activeBtRoute.btDevice.getAddress())) { if (TextUtils.equals(btRoute.mRoute.getId(), activeBtRoute.mRoute.getId()) && !TextUtils.equals(btRoute.mBtDevice.getAddress(), activeBtRoute.mBtDevice.getAddress())) { addActiveRoute(btRoute); } } Loading @@ -425,19 +421,19 @@ class BluetoothRouteProvider { void onBluetoothRoutesUpdated(@NonNull List<MediaRoute2Info> routes); } private class BluetoothRouteInfo { public BluetoothDevice btDevice; public MediaRoute2Info route; public SparseBooleanArray connectedProfiles; private static class BluetoothRouteInfo { private BluetoothDevice mBtDevice; private MediaRoute2Info mRoute; private SparseBooleanArray mConnectedProfiles; @MediaRoute2Info.Type int getRouteType() { // Let hearing aid profile have a priority. if (connectedProfiles.get(BluetoothProfile.HEARING_AID, false)) { if (mConnectedProfiles.get(BluetoothProfile.HEARING_AID, false)) { return MediaRoute2Info.TYPE_HEARING_AID; } if (connectedProfiles.get(BluetoothProfile.LE_AUDIO, false)) { if (mConnectedProfiles.get(BluetoothProfile.LE_AUDIO, false)) { return MediaRoute2Info.TYPE_BLE_HEADSET; } Loading @@ -447,6 +443,7 @@ class BluetoothRouteProvider { // These callbacks run on the main thread. private final class BluetoothProfileListener implements BluetoothProfile.ServiceListener { @Override public void onServiceConnected(int profile, BluetoothProfile proxy) { List<BluetoothDevice> activeDevices; switch (profile) { Loading Loading @@ -480,6 +477,7 @@ class BluetoothRouteProvider { notifyBluetoothRoutesUpdated(); } @Override public void onServiceDisconnected(int profile) { switch (profile) { case BluetoothProfile.A2DP: Loading @@ -496,6 +494,7 @@ class BluetoothRouteProvider { } } } private class BluetoothBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Loading @@ -514,6 +513,7 @@ class BluetoothRouteProvider { } 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 Loading Loading @@ -573,18 +573,18 @@ class BluetoothRouteProvider { if (state == BluetoothProfile.STATE_CONNECTED) { if (btRoute == null) { btRoute = createBluetoothRoute(device); if (btRoute.connectedProfiles.size() > 0) { if (btRoute.mConnectedProfiles.size() > 0) { mBluetoothRoutes.put(device.getAddress(), btRoute); notifyBluetoothRoutesUpdated(); } } else { btRoute.connectedProfiles.put(profile, true); btRoute.mConnectedProfiles.put(profile, true); } } else if (state == BluetoothProfile.STATE_DISCONNECTING || state == BluetoothProfile.STATE_DISCONNECTED) { if (btRoute != null) { btRoute.connectedProfiles.delete(profile); if (btRoute.connectedProfiles.size() == 0) { btRoute.mConnectedProfiles.delete(profile); if (btRoute.mConnectedProfiles.size() == 0) { removeActiveRoute(mBluetoothRoutes.remove(device.getAddress())); notifyBluetoothRoutesUpdated(); } Loading