Merge "Fix Audio output sometimes fails to apply when bluetooth re-enabled" into udc-dev am: 346fd1aeb8
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23225170 Change-Id: Icf59e877b030fce781d3e728d522da0359fac488 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -250,6 +250,7 @@ public class BluetoothEventManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
cachedDevice.onActiveDeviceChanged(isActive, bluetoothProfile);
|
cachedDevice.onActiveDeviceChanged(isActive, bluetoothProfile);
|
||||||
|
mDeviceManager.onActiveDeviceChanged(cachedDevice);
|
||||||
}
|
}
|
||||||
for (BluetoothCallback callback : mCallbacks) {
|
for (BluetoothCallback callback : mCallbacks) {
|
||||||
callback.onActiveDeviceChanged(activeDevice, bluetoothProfile);
|
callback.onActiveDeviceChanged(activeDevice, bluetoothProfile);
|
||||||
|
|||||||
@@ -328,6 +328,13 @@ public class CachedBluetoothDeviceManager {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Handles when the device been set as active/inactive. */
|
||||||
|
public synchronized void onActiveDeviceChanged(CachedBluetoothDevice cachedBluetoothDevice) {
|
||||||
|
if (cachedBluetoothDevice.isHearingAidDevice()) {
|
||||||
|
mHearingAidDeviceManager.onActiveDeviceChanged(cachedBluetoothDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public synchronized void onDeviceUnpaired(CachedBluetoothDevice device) {
|
public synchronized void onDeviceUnpaired(CachedBluetoothDevice device) {
|
||||||
device.setGroupId(BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
|
device.setGroupId(BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
|
||||||
CachedBluetoothDevice mainDevice = mCsipDeviceManager.findMainDevice(device);
|
CachedBluetoothDevice mainDevice = mCsipDeviceManager.findMainDevice(device);
|
||||||
|
|||||||
@@ -224,15 +224,9 @@ public class HearingAidDeviceManager {
|
|||||||
// It is necessary to do remove and add for updating the mapping on
|
// It is necessary to do remove and add for updating the mapping on
|
||||||
// preference and device
|
// preference and device
|
||||||
mBtManager.getEventManager().dispatchDeviceAdded(mainDevice);
|
mBtManager.getEventManager().dispatchDeviceAdded(mainDevice);
|
||||||
// Only need to set first device of a set. AudioDeviceInfo for
|
|
||||||
// GET_DEVICES_OUTPUTS will not change device.
|
|
||||||
setAudioRoutingConfig(cachedDevice);
|
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// Only need to set first device of a set. AudioDeviceInfo for GET_DEVICES_OUTPUTS
|
|
||||||
// will not change device.
|
|
||||||
setAudioRoutingConfig(cachedDevice);
|
|
||||||
break;
|
break;
|
||||||
case BluetoothProfile.STATE_DISCONNECTED:
|
case BluetoothProfile.STATE_DISCONNECTED:
|
||||||
mainDevice = findMainDevice(cachedDevice);
|
mainDevice = findMainDevice(cachedDevice);
|
||||||
@@ -258,13 +252,20 @@ public class HearingAidDeviceManager {
|
|||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// Only need to clear when last device of a set get disconnected
|
|
||||||
clearAudioRoutingConfig();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void onActiveDeviceChanged(CachedBluetoothDevice device) {
|
||||||
|
if (device.isActiveDevice(BluetoothProfile.HEARING_AID) || device.isActiveDevice(
|
||||||
|
BluetoothProfile.LE_AUDIO)) {
|
||||||
|
setAudioRoutingConfig(device);
|
||||||
|
} else {
|
||||||
|
clearAudioRoutingConfig();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void setAudioRoutingConfig(CachedBluetoothDevice device) {
|
private void setAudioRoutingConfig(CachedBluetoothDevice device) {
|
||||||
AudioDeviceAttributes hearingDeviceAttributes =
|
AudioDeviceAttributes hearingDeviceAttributes =
|
||||||
mRoutingHelper.getMatchedHearingDeviceAttributes(device);
|
mRoutingHelper.getMatchedHearingDeviceAttributes(device);
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ import org.robolectric.RobolectricTestRunner;
|
|||||||
import org.robolectric.RuntimeEnvironment;
|
import org.robolectric.RuntimeEnvironment;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@RunWith(RobolectricTestRunner.class)
|
@RunWith(RobolectricTestRunner.class)
|
||||||
@@ -395,6 +396,21 @@ public class BluetoothEventManagerTest {
|
|||||||
assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse();
|
assertThat(mCachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void dispatchActiveDeviceChanged_callExpectedOnActiveDeviceChanged() {
|
||||||
|
mBluetoothEventManager.registerCallback(mBluetoothCallback);
|
||||||
|
when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
|
||||||
|
when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(
|
||||||
|
Collections.singletonList(mCachedDevice1));
|
||||||
|
|
||||||
|
mBluetoothEventManager.dispatchActiveDeviceChanged(mCachedDevice1,
|
||||||
|
BluetoothProfile.HEARING_AID);
|
||||||
|
|
||||||
|
verify(mCachedDeviceManager).onActiveDeviceChanged(mCachedDevice1);
|
||||||
|
verify(mBluetoothCallback).onActiveDeviceChanged(mCachedDevice1,
|
||||||
|
BluetoothProfile.HEARING_AID);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void showUnbondMessage_reasonAuthTimeout_showCorrectedErrorCode() {
|
public void showUnbondMessage_reasonAuthTimeout_showCorrectedErrorCode() {
|
||||||
mIntent = new Intent(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
|
mIntent = new Intent(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
|
||||||
|
|||||||
@@ -17,7 +17,9 @@ package com.android.settingslib.bluetooth;
|
|||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.Mockito.doAnswer;
|
import static org.mockito.Mockito.doAnswer;
|
||||||
|
import static org.mockito.Mockito.doNothing;
|
||||||
import static org.mockito.Mockito.doReturn;
|
import static org.mockito.Mockito.doReturn;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.spy;
|
import static org.mockito.Mockito.spy;
|
||||||
@@ -604,4 +606,20 @@ public class CachedBluetoothDeviceManagerTest {
|
|||||||
verify(mDevice2).setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
|
verify(mDevice2).setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
|
||||||
verify(mDevice2).createBond(BluetoothDevice.TRANSPORT_LE);
|
verify(mDevice2).createBond(BluetoothDevice.TRANSPORT_LE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void onActiveDeviceChanged_validHiSyncId_callExpectedFunction() {
|
||||||
|
mHearingAidDeviceManager = spy(new HearingAidDeviceManager(mContext, mLocalBluetoothManager,
|
||||||
|
mCachedDeviceManager.mCachedDevices));
|
||||||
|
doNothing().when(mHearingAidDeviceManager).onActiveDeviceChanged(any());
|
||||||
|
mCachedDeviceManager.mHearingAidDeviceManager = mHearingAidDeviceManager;
|
||||||
|
when(mDevice1.getBondState()).thenReturn(BluetoothDevice.BOND_BONDED);
|
||||||
|
CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1);
|
||||||
|
cachedDevice1.setHearingAidInfo(
|
||||||
|
new HearingAidInfo.Builder().setHiSyncId(HISYNCID1).build());
|
||||||
|
|
||||||
|
mCachedDeviceManager.onActiveDeviceChanged(cachedDevice1);
|
||||||
|
|
||||||
|
verify(mHearingAidDeviceManager).onActiveDeviceChanged(cachedDevice1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -478,37 +478,24 @@ public class HearingAidDeviceManagerTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onProfileConnectionStateChanged_connected_callSetStrategies() {
|
public void onActiveDeviceChanged_connected_callSetStrategies() {
|
||||||
when(mHelper.getMatchedHearingDeviceAttributes(mCachedDevice1)).thenReturn(
|
when(mHelper.getMatchedHearingDeviceAttributes(mCachedDevice1)).thenReturn(
|
||||||
mHearingDeviceAttribute);
|
mHearingDeviceAttribute);
|
||||||
|
when(mCachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).thenReturn(true);
|
||||||
|
|
||||||
mHearingAidDeviceManager.onProfileConnectionStateChangedIfProcessed(mCachedDevice1,
|
mHearingAidDeviceManager.onActiveDeviceChanged(mCachedDevice1);
|
||||||
BluetoothProfile.STATE_CONNECTED);
|
|
||||||
|
|
||||||
verify(mHelper, atLeastOnce()).setPreferredDeviceRoutingStrategies(
|
verify(mHelper, atLeastOnce()).setPreferredDeviceRoutingStrategies(
|
||||||
eq(List.of(mAudioStrategy)), any(AudioDeviceAttributes.class), anyInt());
|
eq(List.of(mAudioStrategy)), any(AudioDeviceAttributes.class), anyInt());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void onProfileConnectionStateChanged_disconnected_callSetStrategiesWithAutoValue() {
|
public void onActiveDeviceChanged_disconnected_callSetStrategiesWithAutoValue() {
|
||||||
when(mHelper.getMatchedHearingDeviceAttributes(mCachedDevice1)).thenReturn(
|
when(mHelper.getMatchedHearingDeviceAttributes(mCachedDevice1)).thenReturn(
|
||||||
mHearingDeviceAttribute);
|
mHearingDeviceAttribute);
|
||||||
|
when(mCachedDevice1.isActiveDevice(BluetoothProfile.HEARING_AID)).thenReturn(false);
|
||||||
|
|
||||||
mHearingAidDeviceManager.onProfileConnectionStateChangedIfProcessed(mCachedDevice1,
|
mHearingAidDeviceManager.onActiveDeviceChanged(mCachedDevice1);
|
||||||
BluetoothProfile.STATE_DISCONNECTED);
|
|
||||||
|
|
||||||
verify(mHelper, atLeastOnce()).setPreferredDeviceRoutingStrategies(
|
|
||||||
eq(List.of(mAudioStrategy)), /* hearingDevice= */ isNull(),
|
|
||||||
eq(HearingAidAudioRoutingConstants.RoutingValue.AUTO));
|
|
||||||
}
|
|
||||||
@Test
|
|
||||||
public void onProfileConnectionStateChanged_unpairing_callSetStrategiesWithAutoValue() {
|
|
||||||
when(mHelper.getMatchedHearingDeviceAttributes(mCachedDevice1)).thenReturn(
|
|
||||||
mHearingDeviceAttribute);
|
|
||||||
|
|
||||||
when(mCachedDevice1.getUnpairing()).thenReturn(true);
|
|
||||||
mHearingAidDeviceManager.onProfileConnectionStateChangedIfProcessed(mCachedDevice1,
|
|
||||||
BluetoothProfile.STATE_DISCONNECTED);
|
|
||||||
|
|
||||||
verify(mHelper, atLeastOnce()).setPreferredDeviceRoutingStrategies(
|
verify(mHelper, atLeastOnce()).setPreferredDeviceRoutingStrategies(
|
||||||
eq(List.of(mAudioStrategy)), /* hearingDevice= */ isNull(),
|
eq(List.of(mAudioStrategy)), /* hearingDevice= */ isNull(),
|
||||||
|
|||||||
Reference in New Issue
Block a user