Merge "Fix Connect State message in Device details for Hearing Aids"

This commit is contained in:
Treehugger Robot
2018-10-17 04:48:36 +00:00
committed by Gerrit Code Review
6 changed files with 91 additions and 15 deletions

View File

@@ -110,6 +110,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
mHiSyncId = id;
}
public boolean isHearingAidDevice() {
return mHiSyncId != BluetoothHearingAid.HI_SYNC_ID_INVALID;
}
/**
* Last time a bt profile auto-connect was attempted.
* If an ACTION_UUID intent comes in within
@@ -144,8 +148,8 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
void onProfileStateChanged(LocalBluetoothProfile profile, int newProfileState) {
if (Utils.D) {
Log.d(TAG, "onProfileStateChanged: profile " + profile +
" newProfileState " + newProfileState);
Log.d(TAG, "onProfileStateChanged: profile " + profile + ", device=" + mDevice
+ ", newProfileState " + newProfileState);
}
if (mLocalAdapter.getBluetoothState() == BluetoothAdapter.STATE_TURNING_OFF)
{

View File

@@ -162,14 +162,14 @@ public class CachedBluetoothDeviceManager {
*/
public synchronized String getHearingAidPairDeviceSummary(CachedBluetoothDevice device) {
String pairDeviceSummary = null;
if (device.getHiSyncId() != BluetoothHearingAid.HI_SYNC_ID_INVALID) {
for (CachedBluetoothDevice hearingAidDevice : mHearingAidDevicesNotAddedInCache) {
if (hearingAidDevice.getHiSyncId() != BluetoothHearingAid.HI_SYNC_ID_INVALID
&& hearingAidDevice.getHiSyncId() == device.getHiSyncId()) {
pairDeviceSummary = hearingAidDevice.getConnectionSummary();
}
}
CachedBluetoothDevice otherHearingAidDevice =
getHearingAidOtherDevice(device, device.getHiSyncId());
if (otherHearingAidDevice != null) {
pairDeviceSummary = otherHearingAidDevice.getConnectionSummary();
}
log("getHearingAidPairDeviceSummary: pairDeviceSummary=" + pairDeviceSummary
+ ", otherHearingAidDevice=" + otherHearingAidDevice);
return pairDeviceSummary;
}
@@ -358,7 +358,7 @@ public class CachedBluetoothDeviceManager {
}
}
private CachedBluetoothDevice getHearingAidOtherDevice(CachedBluetoothDevice thisDevice,
public CachedBluetoothDevice getHearingAidOtherDevice(CachedBluetoothDevice thisDevice,
long hiSyncId) {
if (hiSyncId == BluetoothHearingAid.HI_SYNC_ID_INVALID) {
return null;

View File

@@ -378,9 +378,10 @@ public class LocalBluetoothProfileManager {
Log.i(TAG, "Failed to connect " + mProfile + " device");
}
if (getHearingAidProfile() != null &&
mProfile instanceof HearingAidProfile &&
(newState == BluetoothProfile.STATE_CONNECTED)) {
boolean isHearingAidProfile = (getHearingAidProfile() != null) &&
(mProfile instanceof HearingAidProfile);
if (isHearingAidProfile && (newState == BluetoothProfile.STATE_CONNECTED)) {
// Check if the HiSyncID has being initialized
if (cachedDevice.getHiSyncId() == BluetoothHearingAid.HI_SYNC_ID_INVALID) {
@@ -393,10 +394,22 @@ public class LocalBluetoothProfileManager {
}
}
mEventManager.dispatchProfileConnectionStateChanged(cachedDevice, newState,
mProfile.getProfileId());
cachedDevice.onProfileStateChanged(mProfile, newState);
cachedDevice.refresh();
if (isHearingAidProfile) {
CachedBluetoothDevice otherDevice =
mDeviceManager.getHearingAidOtherDevice(cachedDevice, cachedDevice.getHiSyncId());
if (otherDevice != null) {
if (DEBUG) {
Log.d(TAG, "Refreshing other hearing aid=" + otherDevice
+ ", newState=" + newState);
}
otherDevice.refresh();
}
}
mEventManager.dispatchProfileConnectionStateChanged(cachedDevice, newState,
mProfile.getProfileId());
}
}

View File

@@ -828,4 +828,20 @@ public class CachedBluetoothDeviceManagerTest {
assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEADSET)).isFalse();
assertThat(cachedDevice2.isActiveDevice(BluetoothProfile.HEARING_AID)).isFalse();
}
/**
* Test to verify getHearingAidOtherDevice() for hearing aid devices with same HiSyncId.
*/
@Test
public void testGetHearingAidOtherDevice_bothHearingAidsPaired_returnsOtherDevice() {
mCachedDevice1.setHiSyncId(HISYNCID1);
mCachedDevice2.setHiSyncId(HISYNCID1);
mCachedDeviceManager.mCachedDevices.add(mCachedDevice1);
mCachedDeviceManager.mHearingAidDevicesNotAddedInCache.add(mCachedDevice2);
doAnswer((invocation) -> DEVICE_SUMMARY_1).when(mCachedDevice1).getConnectionSummary();
doAnswer((invocation) -> DEVICE_SUMMARY_2).when(mCachedDevice2).getConnectionSummary();
assertThat(mCachedDeviceManager.getHearingAidOtherDevice(mCachedDevice1, HISYNCID1))
.isEqualTo(mCachedDevice2);
}
}

View File

@@ -28,6 +28,7 @@ import static org.robolectric.Shadows.shadowOf;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHearingAid;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.media.AudioManager;
@@ -572,4 +573,16 @@ public class CachedBluetoothDeviceTest {
assertThat(mCachedDevice.isHfpDevice()).isFalse();
}
@Test
public void testIsHearingAidDevice_isHearingAidDevice() {
mCachedDevice.setHiSyncId(0x1234);
assertThat(mCachedDevice.isHearingAidDevice()).isTrue();
}
@Test
public void testIsHearingAidDevice_isNotHearingAidDevice() {
mCachedDevice.setHiSyncId(BluetoothHearingAid.HI_SYNC_ID_INVALID);
assertThat(mCachedDevice.isHearingAidDevice()).isFalse();
}
}

View File

@@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -51,6 +52,7 @@ import java.util.List;
@RunWith(RobolectricTestRunner.class)
@Config(resourceDir = "../../res")
public class LocalBluetoothProfileManagerTest {
private final static long HI_SYNC_ID = 0x1234;
@Mock
private CachedBluetoothDeviceManager mDeviceManager;
@Mock
@@ -61,6 +63,8 @@ public class LocalBluetoothProfileManagerTest {
private BluetoothDevice mDevice;
@Mock
private CachedBluetoothDevice mCachedBluetoothDevice;
@Mock
private CachedBluetoothDevice mHearingAidOtherDevice;
private Context mContext;
private LocalBluetoothProfileManager mProfileManager;
@@ -198,6 +202,32 @@ public class LocalBluetoothProfileManagerTest {
BluetoothProfile.STATE_CONNECTED, BluetoothProfile.HEARING_AID);
}
/**
* Verify BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED with uuid intent will dispatch to
* refresh both sides devices.
*/
@Test
public void stateChangedHandler_receiveHAPConnectionStateChanged_shouldRefreshBothSides() {
ArrayList<Integer> supportProfiles = new ArrayList<>();
supportProfiles.add(BluetoothProfile.HEARING_AID);
when(mAdapter.getSupportedProfiles()).thenReturn(supportProfiles);
when(mCachedBluetoothDevice.getHiSyncId()).thenReturn(HI_SYNC_ID);
when(mDeviceManager.getHearingAidOtherDevice(mCachedBluetoothDevice, HI_SYNC_ID))
.thenReturn(mHearingAidOtherDevice);
mProfileManager = new LocalBluetoothProfileManager(mContext, mAdapter, mDeviceManager,
mEventManager);
mIntent = new Intent(BluetoothHearingAid.ACTION_CONNECTION_STATE_CHANGED);
mIntent.putExtra(BluetoothDevice.EXTRA_DEVICE, mDevice);
mIntent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, BluetoothProfile.STATE_CONNECTING);
mIntent.putExtra(BluetoothProfile.EXTRA_STATE, BluetoothProfile.STATE_CONNECTED);
mContext.sendBroadcast(mIntent);
verify(mCachedBluetoothDevice).refresh();
verify(mHearingAidOtherDevice).refresh();
}
/**
* Verify BluetoothPan.ACTION_CONNECTION_STATE_CHANGED intent with uuid will dispatch to
* profile connection state changed callback