Merge changes I3af271d0,I46df1c8b,I1eb116e4,I492bfc97
* changes: CachedBluetoothDevice: Add tests for connect fail CachedBluetoothDevice: Fix merge conflict CachedBluetoothDevice: Fix detecting connect fail CachedBluetoothDevice: Add missing LeAudioProfile
This commit is contained in:
@@ -208,7 +208,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
|
||||
|
||||
synchronized (mProfileLock) {
|
||||
if (profile instanceof A2dpProfile || profile instanceof HeadsetProfile
|
||||
|| profile instanceof HearingAidProfile) {
|
||||
|| profile instanceof HearingAidProfile || profile instanceof LeAudioProfile) {
|
||||
setProfileConnectedStatus(profile.getProfileId(), false);
|
||||
switch (newProfileState) {
|
||||
case BluetoothProfile.STATE_CONNECTED:
|
||||
@@ -226,7 +226,20 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
|
||||
case BluetoothProfile.STATE_DISCONNECTED:
|
||||
if (mHandler.hasMessages(profile.getProfileId())) {
|
||||
mHandler.removeMessages(profile.getProfileId());
|
||||
setProfileConnectedStatus(profile.getProfileId(), true);
|
||||
if (profile.getConnectionPolicy(mDevice) >
|
||||
BluetoothProfile.CONNECTION_POLICY_FORBIDDEN) {
|
||||
/*
|
||||
* If we received state DISCONNECTED and previous state was
|
||||
* CONNECTING and connection policy is FORBIDDEN or UNKNOWN
|
||||
* then it's not really a failure to connect.
|
||||
*
|
||||
* Connection profile is considered as failed when connection
|
||||
* policy indicates that profile should be connected
|
||||
* but it got disconnected.
|
||||
*/
|
||||
Log.w(TAG, "onProfileStateChanged(): Failed to connect profile");
|
||||
setProfileConnectedStatus(profile.getProfileId(), true);
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
@@ -1188,6 +1201,13 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
|
||||
}
|
||||
|
||||
private boolean isProfileConnectedFail() {
|
||||
Log.d(TAG, "anonymizedAddress=" + mDevice.getAnonymizedAddress()
|
||||
+ " mIsA2dpProfileConnectedFail=" + mIsA2dpProfileConnectedFail
|
||||
+ " mIsHearingAidProfileConnectedFail=" + mIsHearingAidProfileConnectedFail
|
||||
+ " mIsLeAudioProfileConnectedFail=" + mIsLeAudioProfileConnectedFail
|
||||
+ " mIsHeadsetProfileConnectedFail=" + mIsHeadsetProfileConnectedFail
|
||||
+ " isConnectedSapDevice()=" + isConnectedSapDevice());
|
||||
|
||||
return mIsA2dpProfileConnectedFail || mIsHearingAidProfileConnectedFail
|
||||
|| (!isConnectedSapDevice() && mIsHeadsetProfileConnectedFail)
|
||||
|| mIsLeAudioProfileConnectedFail;
|
||||
|
||||
@@ -74,6 +74,8 @@ public class CachedBluetoothDeviceTest {
|
||||
@Mock
|
||||
private HearingAidProfile mHearingAidProfile;
|
||||
@Mock
|
||||
private LeAudioProfile mLeAudioProfile;
|
||||
@Mock
|
||||
private BluetoothDevice mDevice;
|
||||
@Mock
|
||||
private BluetoothDevice mSubDevice;
|
||||
@@ -92,15 +94,76 @@ public class CachedBluetoothDeviceTest {
|
||||
mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
|
||||
when(mDevice.getAddress()).thenReturn(DEVICE_ADDRESS);
|
||||
when(mHfpProfile.isProfileReady()).thenReturn(true);
|
||||
when(mHfpProfile.getProfileId()).thenReturn(BluetoothProfile.HEADSET);
|
||||
when(mA2dpProfile.isProfileReady()).thenReturn(true);
|
||||
when(mA2dpProfile.getProfileId()).thenReturn(BluetoothProfile.A2DP);
|
||||
when(mPanProfile.isProfileReady()).thenReturn(true);
|
||||
when(mPanProfile.getProfileId()).thenReturn(BluetoothProfile.PAN);
|
||||
when(mHearingAidProfile.isProfileReady()).thenReturn(true);
|
||||
when(mHearingAidProfile.getProfileId()).thenReturn(BluetoothProfile.HEARING_AID);
|
||||
when(mLeAudioProfile.isProfileReady()).thenReturn(true);
|
||||
when(mLeAudioProfile.getProfileId()).thenReturn(BluetoothProfile.LE_AUDIO);
|
||||
mCachedDevice = spy(new CachedBluetoothDevice(mContext, mProfileManager, mDevice));
|
||||
mSubCachedDevice = spy(new CachedBluetoothDevice(mContext, mProfileManager, mSubDevice));
|
||||
doAnswer((invocation) -> mBatteryLevel).when(mCachedDevice).getBatteryLevel();
|
||||
doAnswer((invocation) -> mBatteryLevel).when(mSubCachedDevice).getBatteryLevel();
|
||||
}
|
||||
|
||||
private void testTransitionFromConnectingToDisconnected(
|
||||
LocalBluetoothProfile connectingProfile, LocalBluetoothProfile connectedProfile,
|
||||
int connectionPolicy, String expectedSummary) {
|
||||
// Arrange:
|
||||
// At least one profile has to be connected
|
||||
updateProfileStatus(connectedProfile, BluetoothProfile.STATE_CONNECTED);
|
||||
// Set profile under test to CONNECTING
|
||||
updateProfileStatus(connectingProfile, BluetoothProfile.STATE_CONNECTING);
|
||||
// Set connection policy
|
||||
when(connectingProfile.getConnectionPolicy(mDevice)).thenReturn(connectionPolicy);
|
||||
|
||||
// Act & Assert:
|
||||
// Get the expected connection summary.
|
||||
updateProfileStatus(connectingProfile, BluetoothProfile.STATE_DISCONNECTED);
|
||||
assertThat(mCachedDevice.getConnectionSummary()).isEqualTo(expectedSummary);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onProfileStateChanged_testConnectingToDisconnected_policyAllowed_problem() {
|
||||
String connectTimeoutString = mContext.getString(R.string.profile_connect_timeout_subtext);
|
||||
|
||||
testTransitionFromConnectingToDisconnected(mA2dpProfile, mLeAudioProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_ALLOWED, connectTimeoutString);
|
||||
testTransitionFromConnectingToDisconnected(mHearingAidProfile, mLeAudioProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_ALLOWED, connectTimeoutString);
|
||||
testTransitionFromConnectingToDisconnected(mHfpProfile, mLeAudioProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_ALLOWED, connectTimeoutString);
|
||||
testTransitionFromConnectingToDisconnected(mLeAudioProfile, mA2dpProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_ALLOWED, connectTimeoutString);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onProfileStateChanged_testConnectingToDisconnected_policyForbidden_noProblem() {
|
||||
testTransitionFromConnectingToDisconnected(mA2dpProfile, mLeAudioProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_FORBIDDEN, null);
|
||||
testTransitionFromConnectingToDisconnected(mHearingAidProfile, mLeAudioProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_FORBIDDEN, null);
|
||||
testTransitionFromConnectingToDisconnected(mHfpProfile, mLeAudioProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_FORBIDDEN, null);
|
||||
testTransitionFromConnectingToDisconnected(mLeAudioProfile, mA2dpProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_FORBIDDEN, null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onProfileStateChanged_testConnectingToDisconnected_policyUnknown_noProblem() {
|
||||
testTransitionFromConnectingToDisconnected(mA2dpProfile, mLeAudioProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_UNKNOWN, null);
|
||||
testTransitionFromConnectingToDisconnected(mHearingAidProfile, mLeAudioProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_UNKNOWN, null);
|
||||
testTransitionFromConnectingToDisconnected(mHfpProfile, mLeAudioProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_UNKNOWN, null);
|
||||
testTransitionFromConnectingToDisconnected(mLeAudioProfile, mA2dpProfile,
|
||||
BluetoothProfile.CONNECTION_POLICY_UNKNOWN, null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getConnectionSummary_testProfilesInactive_returnPairing() {
|
||||
// Arrange:
|
||||
|
||||
Reference in New Issue
Block a user