diff options
| -rw-r--r-- | system/bta/le_audio/client.cc | 5 | ||||
| -rw-r--r-- | system/bta/le_audio/le_audio_client_test.cc | 29 |
2 files changed, 32 insertions, 2 deletions
diff --git a/system/bta/le_audio/client.cc b/system/bta/le_audio/client.cc index 3aa605e581..d54e9e3b93 100644 --- a/system/bta/le_audio/client.cc +++ b/system/bta/le_audio/client.cc @@ -1258,6 +1258,11 @@ class LeAudioClientImpl : public LeAudioClient { group_remove_node(group, address, true); } leAudioDevices_.Remove(address); + return; + } + /* Attempt background re-connect if disconnect was not intended locally */ + if (reason != GATT_CONN_TERMINATE_LOCAL_HOST) { + BTA_GATTC_Open(gatt_if_, address, false, false); } } diff --git a/system/bta/le_audio/le_audio_client_test.cc b/system/bta/le_audio/le_audio_client_test.cc index 13f8067ad9..5a2c57de80 100644 --- a/system/bta/le_audio/le_audio_client_test.cc +++ b/system/bta/le_audio/le_audio_client_test.cc @@ -264,7 +264,9 @@ class UnicastTestNoInit : public Test { base::Unretained(this->gatt_callback), event_data)); } - void InjectDisconnectedEvent(uint16_t conn_id) { + void InjectDisconnectedEvent( + uint16_t conn_id, + tGATT_DISCONN_REASON reason = GATT_CONN_TERMINATE_LOCAL_HOST) { ASSERT_NE(conn_id, GATT_INVALID_CONN_ID); ASSERT_NE(peer_devices.count(conn_id), 0u); @@ -273,7 +275,7 @@ class UnicastTestNoInit : public Test { .conn_id = conn_id, .client_if = gatt_if, .remote_bda = peer_devices.at(conn_id)->addr, - .reason = GATT_CONN_TERMINATE_PEER_USER, + .reason = reason, }; peer_devices.at(conn_id)->connected = false; @@ -1769,6 +1771,29 @@ TEST_F(UnicastTest, ConnectDisconnectOneEarbud) { DisconnectLeAudio(test_address0, 1); } +/* same as above case except the disconnect is initiated by remote */ +TEST_F(UnicastTest, ConnectRemoteDisconnectOneEarbud) { + const RawAddress test_address0 = GetTestAddress(0); + SetSampleDatabaseEarbudsValid(1, test_address0, + codec_spec_conf::kLeAudioLocationStereo, + codec_spec_conf::kLeAudioLocationStereo); + EXPECT_CALL(mock_client_callbacks_, + OnConnectionState(ConnectionState::CONNECTED, test_address0)) + .Times(1); + ConnectLeAudio(test_address0); + EXPECT_CALL(mock_client_callbacks_, + OnConnectionState(ConnectionState::DISCONNECTED, test_address0)) + .Times(1); + /* For remote disconnection, expect stack to try background re-connect */ + EXPECT_CALL(mock_gatt_interface_, Open(gatt_if, test_address0, false, _)) + .Times(1); + global_conn_id = 1; /* Reset to keep conn_id same during re-connect */ + EXPECT_CALL(mock_client_callbacks_, + OnConnectionState(ConnectionState::CONNECTED, test_address0)) + .Times(1); + InjectDisconnectedEvent(1, GATT_CONN_TERMINATE_PEER_USER); +} + TEST_F(UnicastTest, ConnectTwoEarbudsCsisGrouped) { uint8_t group_size = 2; int group_id = 2; |
