Fix UI incorrect when switch active device to hearing aid
When active device change to Hearing Aid, BluetoothEventManager also send onActiveDeviceChanged() to notify that active device of A2DP profile is null. To handle this case, check hearing aid device is active device or not. If Hearing aid device is active device then return Hearing aid device id, otherwise return phone device id. Bug: 128956186 Test: RunSettingsLibRoboTests Change-Id: I1ba9249d7a7f634b56df019450643cfe147a5fb8
This commit is contained in:
@@ -277,14 +277,39 @@ public class BluetoothMediaManager extends MediaManager implements BluetoothCall
|
||||
public void onActiveDeviceChanged(CachedBluetoothDevice activeDevice, int bluetoothProfile) {
|
||||
Log.d(TAG, "onActiveDeviceChanged : device : "
|
||||
+ activeDevice + ", profile : " + bluetoothProfile);
|
||||
if (BluetoothProfile.HEARING_AID == bluetoothProfile
|
||||
|| BluetoothProfile.A2DP == bluetoothProfile) {
|
||||
|
||||
if (BluetoothProfile.HEARING_AID == bluetoothProfile) {
|
||||
if (activeDevice != null) {
|
||||
dispatchConnectedDeviceChanged(MediaDeviceUtils.getId(activeDevice));
|
||||
}
|
||||
} else if (BluetoothProfile.A2DP == bluetoothProfile) {
|
||||
// When active device change to Hearing Aid,
|
||||
// BluetoothEventManager also send onActiveDeviceChanged() to notify that active device
|
||||
// of A2DP profile is null. To handle this case, check hearing aid device
|
||||
// is active device or not
|
||||
final MediaDevice activeHearingAidDevice = findActiveHearingAidDevice();
|
||||
final String id = activeDevice == null
|
||||
? PhoneMediaDevice.ID : MediaDeviceUtils.getId(activeDevice);
|
||||
? activeHearingAidDevice == null
|
||||
? PhoneMediaDevice.ID : activeHearingAidDevice.getId()
|
||||
: MediaDeviceUtils.getId(activeDevice);
|
||||
dispatchConnectedDeviceChanged(id);
|
||||
}
|
||||
}
|
||||
|
||||
private MediaDevice findActiveHearingAidDevice() {
|
||||
final HearingAidProfile hearingAidProfile = mProfileManager.getHearingAidProfile();
|
||||
|
||||
if (hearingAidProfile != null) {
|
||||
final List<BluetoothDevice> activeDevices = hearingAidProfile.getActiveDevices();
|
||||
for (BluetoothDevice btDevice : activeDevices) {
|
||||
if (btDevice != null) {
|
||||
return findMediaDevice(MediaDeviceUtils.getId(btDevice));
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onServiceConnected() {
|
||||
if (!mIsA2dpProfileReady || !mIsHearingAidProfileReady) {
|
||||
|
||||
@@ -15,6 +15,8 @@
|
||||
*/
|
||||
package com.android.settingslib.media;
|
||||
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
|
||||
import androidx.mediarouter.media.MediaRouter;
|
||||
|
||||
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
||||
@@ -33,6 +35,16 @@ public class MediaDeviceUtils {
|
||||
return cachedDevice.getAddress();
|
||||
}
|
||||
|
||||
/**
|
||||
* Use BluetoothDevice address to represent unique id
|
||||
*
|
||||
* @param bluetoothDevice the BluetoothDevice
|
||||
* @return BluetoothDevice address
|
||||
*/
|
||||
public static String getId(BluetoothDevice bluetoothDevice) {
|
||||
return bluetoothDevice.getAddress();
|
||||
}
|
||||
|
||||
/**
|
||||
* Use RouteInfo id to represent unique id
|
||||
*
|
||||
|
||||
@@ -425,4 +425,34 @@ public class BluetoothMediaManagerTest {
|
||||
|
||||
verify(mCallback, never()).onConnectedDeviceChanged(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onActiveDeviceChanged_hearingAidDeviceIsActive_returnHearingAidDeviceId() {
|
||||
final BluetoothDevice bluetoothDevice = mock(BluetoothDevice.class);
|
||||
final List<BluetoothDevice> devices = new ArrayList<>();
|
||||
devices.add(bluetoothDevice);
|
||||
final BluetoothMediaDevice bluetoothMediaDevice = mock(BluetoothMediaDevice.class);
|
||||
mMediaManager.mMediaDevices.add(bluetoothMediaDevice);
|
||||
|
||||
when(bluetoothDevice.getAddress()).thenReturn(TEST_ADDRESS);
|
||||
when(mHapProfile.getActiveDevices()).thenReturn(devices);
|
||||
when(bluetoothMediaDevice.getId()).thenReturn(TEST_ADDRESS);
|
||||
|
||||
mMediaManager.registerCallback(mCallback);
|
||||
mMediaManager.onActiveDeviceChanged(null, BluetoothProfile.A2DP);
|
||||
|
||||
verify(mCallback).onConnectedDeviceChanged(TEST_ADDRESS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onActiveDeviceChanged_hearingAidDeviceNotActive_returnPhoneDeviceId() {
|
||||
final List<BluetoothDevice> devices = new ArrayList<>();
|
||||
|
||||
when(mHapProfile.getActiveDevices()).thenReturn(devices);
|
||||
|
||||
mMediaManager.registerCallback(mCallback);
|
||||
mMediaManager.onActiveDeviceChanged(null, BluetoothProfile.A2DP);
|
||||
|
||||
verify(mCallback).onConnectedDeviceChanged(PhoneMediaDevice.ID);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,6 +20,8 @@ import static com.google.common.truth.Truth.assertThat;
|
||||
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.bluetooth.BluetoothDevice;
|
||||
|
||||
import androidx.mediarouter.media.MediaRouter;
|
||||
|
||||
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
|
||||
@@ -38,7 +40,9 @@ public class MediaDeviceUtilsTest {
|
||||
private static final String TEST_ROUTE_ID = "test_route_id";
|
||||
|
||||
@Mock
|
||||
private CachedBluetoothDevice mDevice;
|
||||
private CachedBluetoothDevice mCachedDevice;
|
||||
@Mock
|
||||
private BluetoothDevice mBluetoothDevice;
|
||||
@Mock
|
||||
private MediaRouter.RouteInfo mRouteInfo;
|
||||
|
||||
@@ -48,10 +52,19 @@ public class MediaDeviceUtilsTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getId_returnBluetoothDeviceAddress() {
|
||||
when(mDevice.getAddress()).thenReturn(TEST_ADDRESS);
|
||||
public void getId_returnCachedBluetoothDeviceAddress() {
|
||||
when(mCachedDevice.getAddress()).thenReturn(TEST_ADDRESS);
|
||||
|
||||
final String id = MediaDeviceUtils.getId(mDevice);
|
||||
final String id = MediaDeviceUtils.getId(mCachedDevice);
|
||||
|
||||
assertThat(id).isEqualTo(TEST_ADDRESS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getId_returnBluetoothDeviceAddress() {
|
||||
when(mBluetoothDevice.getAddress()).thenReturn(TEST_ADDRESS);
|
||||
|
||||
final String id = MediaDeviceUtils.getId(mBluetoothDevice);
|
||||
|
||||
assertThat(id).isEqualTo(TEST_ADDRESS);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user