diff --git a/src/com/android/settings/sound/AudioSwitchPreferenceController.java b/src/com/android/settings/sound/AudioSwitchPreferenceController.java index 38fecfc5bc2..6475257b29c 100644 --- a/src/com/android/settings/sound/AudioSwitchPreferenceController.java +++ b/src/com/android/settings/sound/AudioSwitchPreferenceController.java @@ -53,6 +53,7 @@ import com.android.settingslib.core.lifecycle.events.OnStart; import com.android.settingslib.core.lifecycle.events.OnStop; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; @@ -227,13 +228,29 @@ public abstract class AudioSwitchPreferenceController extends BasePreferenceCont } final List devices = leAudioProfile.getConnectedDevices(); for (BluetoothDevice device : devices) { - if (device.isConnected()) { + if (device.isConnected() && isDeviceInCachedList(device)) { connectedDevices.add(device); } } return connectedDevices; } + /** + * Confirm if the device exists in the cached devices list. If return true, it means + * the device is main device in the LE Audio device group. Otherwise, the device is the member + * device in the group. + */ + protected boolean isDeviceInCachedList(BluetoothDevice device) { + Collection cachedDevices = + mLocalBluetoothManager.getCachedDeviceManager().getCachedDevicesCopy(); + for (CachedBluetoothDevice cachedDevice : cachedDevices) { + if (cachedDevice.getDevice().equals(device)) { + return true; + } + } + return false; + } + /** * get hearing aid profile connected device, exclude other devices with same hiSyncId. */ diff --git a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java index 77ddfbd6ef9..151d1f289c1 100644 --- a/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/sound/AudioOutputSwitchPreferenceControllerTest.java @@ -51,6 +51,8 @@ import com.android.settings.testutils.shadow.ShadowBluetoothUtils; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.BluetoothCallback; import com.android.settingslib.bluetooth.BluetoothEventManager; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.HeadsetProfile; import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LeAudioProfile; @@ -71,6 +73,7 @@ import org.robolectric.shadows.ShadowBluetoothDevice; import org.robolectric.shadows.ShadowPackageManager; import java.util.ArrayList; +import java.util.Collection; import java.util.List; @RunWith(RobolectricTestRunner.class) @@ -103,6 +106,12 @@ public class AudioOutputSwitchPreferenceControllerTest { private HearingAidProfile mHearingAidProfile; @Mock private LeAudioProfile mLeAudioProfile; + @Mock + private CachedBluetoothDeviceManager mCachedDeviceManager; + @Mock + private CachedBluetoothDevice mCachedBluetoothDeviceL; + @Mock + private CachedBluetoothDevice mCachedBluetoothDeviceR; private Context mContext; private PreferenceScreen mScreen; @@ -121,6 +130,7 @@ public class AudioOutputSwitchPreferenceControllerTest { private List mLeAudioActiveDevices; private List mEmptyDevices; private ShadowPackageManager mPackageManager; + private Collection mCachedDevices; @Before public void setUp() { @@ -135,6 +145,7 @@ public class AudioOutputSwitchPreferenceControllerTest { when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager); when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager); + when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager); when(mLocalBluetoothProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile); when(mLocalBluetoothProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile); when(mLocalBluetoothProfileManager.getHeadsetProfile()).thenReturn(mHeadsetProfile); @@ -145,6 +156,11 @@ public class AudioOutputSwitchPreferenceControllerTest { mBluetoothManager = mContext.getSystemService(BluetoothManager.class); mBluetoothAdapter = mBluetoothManager.getAdapter(); + mCachedDevices = new ArrayList<>(); + mCachedDevices.add(mCachedBluetoothDeviceL); + mCachedDevices.add(mCachedBluetoothDeviceR); + when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(mCachedDevices); + mBluetoothDevice = spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_1)); when(mBluetoothDevice.getName()).thenReturn(TEST_DEVICE_NAME_1); when(mBluetoothDevice.isConnected()).thenReturn(true); @@ -397,6 +413,7 @@ public class AudioOutputSwitchPreferenceControllerTest { @Test public void getConnectedLeAudioDevices_connectedLeAudioDevice_shouldAddDeviceToList() { + when(mCachedBluetoothDeviceL.getDevice()).thenReturn(mBluetoothDevice); mEmptyDevices.clear(); mProfileConnectedDevices.clear(); mProfileConnectedDevices.add(mBluetoothDevice); @@ -409,22 +426,45 @@ public class AudioOutputSwitchPreferenceControllerTest { @Test public void getConnectedLeAudioDevices_disconnectedLeAudioDevice_shouldNotAddDeviceToList() { - BluetoothDevice connectdBtLeAduioDevice = + BluetoothDevice connectedBtLeAduioDevice = spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_2)); - when(connectdBtLeAduioDevice.isConnected()).thenReturn(true); - BluetoothDevice disonnectdBtLeAduioDevice = + when(connectedBtLeAduioDevice.isConnected()).thenReturn(true); + BluetoothDevice disconnectedBtLeAduioDevice = spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_3)); - when(disonnectdBtLeAduioDevice.isConnected()).thenReturn(false); + when(disconnectedBtLeAduioDevice.isConnected()).thenReturn(false); + when(mCachedBluetoothDeviceL.getDevice()).thenReturn(mBluetoothDevice); + when(mCachedBluetoothDeviceR.getDevice()).thenReturn(connectedBtLeAduioDevice); mEmptyDevices.clear(); mProfileConnectedDevices.clear(); mProfileConnectedDevices.add(mBluetoothDevice); - mProfileConnectedDevices.add(connectdBtLeAduioDevice); - mProfileConnectedDevices.add(disonnectdBtLeAduioDevice); + mProfileConnectedDevices.add(connectedBtLeAduioDevice); + mProfileConnectedDevices.add(disconnectedBtLeAduioDevice); when(mLeAudioProfile.getConnectedDevices()).thenReturn(mProfileConnectedDevices); mEmptyDevices.addAll(mController.getConnectedLeAudioDevices()); - assertThat(mEmptyDevices).containsExactly(mBluetoothDevice, connectdBtLeAduioDevice); + assertThat(mEmptyDevices).containsExactly(mBluetoothDevice, connectedBtLeAduioDevice); + } + + @Test + public void getConnectedLeAudioDevices_notInCachedDeviceList_shouldNotAddDeviceToList() { + BluetoothDevice connectedBtLeAduioDevice1 = + spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_2)); + when(connectedBtLeAduioDevice1.isConnected()).thenReturn(true); + BluetoothDevice connectedBtLeAduioDevice2 = + spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_3)); + when(connectedBtLeAduioDevice2.isConnected()).thenReturn(true); + when(mCachedBluetoothDeviceL.getDevice()).thenReturn(mBluetoothDevice); + when(mCachedBluetoothDeviceR.getDevice()).thenReturn(connectedBtLeAduioDevice1); + mEmptyDevices.clear(); + mProfileConnectedDevices.clear(); + mProfileConnectedDevices.add(connectedBtLeAduioDevice1); + mProfileConnectedDevices.add(connectedBtLeAduioDevice2); + when(mLeAudioProfile.getConnectedDevices()).thenReturn(mProfileConnectedDevices); + + mEmptyDevices.addAll(mController.getConnectedLeAudioDevices()); + + assertThat(mEmptyDevices).containsExactly(connectedBtLeAduioDevice1); } @Test diff --git a/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java index 7543b5f83a5..cc2606b06a2 100644 --- a/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/sound/HandsFreeProfileOutputPreferenceControllerTest.java @@ -45,6 +45,8 @@ import com.android.settings.bluetooth.Utils; import com.android.settings.testutils.shadow.ShadowAudioManager; import com.android.settings.testutils.shadow.ShadowBluetoothUtils; import com.android.settingslib.bluetooth.BluetoothEventManager; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.HeadsetProfile; import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LeAudioProfile; @@ -63,6 +65,7 @@ import org.robolectric.annotation.Config; import org.robolectric.shadows.ShadowBluetoothDevice; import java.util.ArrayList; +import java.util.Collection; import java.util.List; @RunWith(RobolectricTestRunner.class) @@ -100,6 +103,12 @@ public class HandsFreeProfileOutputPreferenceControllerTest { private LeAudioProfile mLeAudioProfile; @Mock private AudioSwitchPreferenceController.AudioSwitchCallback mAudioSwitchPreferenceCallback; + @Mock + private CachedBluetoothDeviceManager mCachedDeviceManager; + @Mock + private CachedBluetoothDevice mCachedBluetoothDeviceL; + @Mock + private CachedBluetoothDevice mCachedBluetoothDeviceR; private Context mContext; private PreferenceScreen mScreen; @@ -117,6 +126,7 @@ public class HandsFreeProfileOutputPreferenceControllerTest { private List mProfileConnectedDevices; private List mHearingAidActiveDevices; private List mLeAudioActiveDevices; + private Collection mCachedDevices; @Before public void setUp() { @@ -131,6 +141,7 @@ public class HandsFreeProfileOutputPreferenceControllerTest { when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager); when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager); + when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager); when(mLocalBluetoothProfileManager.getHeadsetProfile()).thenReturn(mHeadsetProfile); when(mLocalBluetoothProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile); when(mLocalBluetoothProfileManager.getLeAudioProfile()).thenReturn(mLeAudioProfile); @@ -138,6 +149,11 @@ public class HandsFreeProfileOutputPreferenceControllerTest { mBluetoothManager = mContext.getSystemService(BluetoothManager.class); mBluetoothAdapter = mBluetoothManager.getAdapter(); + mCachedDevices = new ArrayList<>(); + mCachedDevices.add(mCachedBluetoothDeviceL); + mCachedDevices.add(mCachedBluetoothDeviceR); + when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(mCachedDevices); + mBluetoothDevice = spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_1)); when(mBluetoothDevice.getName()).thenReturn(TEST_DEVICE_NAME_1); when(mBluetoothDevice.getAlias()).thenReturn(TEST_DEVICE_NAME_1); @@ -480,6 +496,7 @@ public class HandsFreeProfileOutputPreferenceControllerTest { public void updateState_leAudioDeviceActive_shouldSetActivatedDeviceName() { mAudioManager.setMode(AudioManager.MODE_IN_COMMUNICATION); mShadowAudioManager.setOutputDevice(DEVICE_OUT_BLE_HEADSET); + when(mCachedBluetoothDeviceL.getDevice()).thenReturn(mBluetoothDevice); when(mBluetoothDevice.getName()).thenReturn(TEST_LE_AUDIO_DEVICE_NAME_1); when(mBluetoothDevice.getAlias()).thenReturn(TEST_LE_AUDIO_DEVICE_NAME_1); mProfileConnectedDevices.clear(); diff --git a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java index 036d58c2cd5..5a92a0838a1 100644 --- a/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/sound/MediaOutputPreferenceControllerTest.java @@ -56,6 +56,8 @@ import com.android.settings.testutils.shadow.ShadowAudioManager; import com.android.settings.testutils.shadow.ShadowBluetoothUtils; import com.android.settingslib.bluetooth.A2dpProfile; import com.android.settingslib.bluetooth.BluetoothEventManager; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.HearingAidProfile; import com.android.settingslib.bluetooth.LeAudioProfile; import com.android.settingslib.bluetooth.LocalBluetoothManager; @@ -77,6 +79,7 @@ import org.robolectric.shadows.ShadowBluetoothDevice; import org.robolectric.shadows.ShadowPackageManager; import java.util.ArrayList; +import java.util.Collection; import java.util.List; @RunWith(RobolectricTestRunner.class) @@ -118,6 +121,12 @@ public class MediaOutputPreferenceControllerTest { private MediaSessionManager mMediaSessionManager; @Mock private MediaController mMediaController; + @Mock + private CachedBluetoothDeviceManager mCachedDeviceManager; + @Mock + private CachedBluetoothDevice mCachedBluetoothDeviceL; + @Mock + private CachedBluetoothDevice mCachedBluetoothDeviceR; private Context mContext; private PreferenceScreen mScreen; @@ -142,6 +151,7 @@ public class MediaOutputPreferenceControllerTest { private ApplicationInfo mAppInfo; private PackageInfo mPackageInfo; private PackageStats mPackageStats; + private Collection mCachedDevices; @Before public void setUp() { @@ -173,6 +183,7 @@ public class MediaOutputPreferenceControllerTest { when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager); when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager); + when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager); when(mLocalBluetoothProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile); when(mLocalBluetoothProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile); when(mLocalBluetoothProfileManager.getLeAudioProfile()).thenReturn(mLeAudioProfile); @@ -180,6 +191,11 @@ public class MediaOutputPreferenceControllerTest { mBluetoothManager = mContext.getSystemService(BluetoothManager.class); mBluetoothAdapter = mBluetoothManager.getAdapter(); + mCachedDevices = new ArrayList<>(); + mCachedDevices.add(mCachedBluetoothDeviceL); + mCachedDevices.add(mCachedBluetoothDeviceR); + when(mCachedDeviceManager.getCachedDevicesCopy()).thenReturn(mCachedDevices); + mBluetoothDevice = spy(mBluetoothAdapter.getRemoteDevice(TEST_DEVICE_ADDRESS_1)); when(mBluetoothDevice.getName()).thenReturn(TEST_DEVICE_NAME_1); when(mBluetoothDevice.getAlias()).thenReturn(TEST_DEVICE_NAME_1); @@ -280,6 +296,8 @@ public class MediaOutputPreferenceControllerTest { public void updateState_withActiveLeAudioDevice_setActivatedDeviceName() { mShadowAudioManager.setOutputDevice(DEVICE_OUT_BLE_HEADSET); mAudioManager.setMode(AudioManager.MODE_NORMAL); + when(mCachedBluetoothDeviceL.getDevice()).thenReturn(mBluetoothDevice); + when(mCachedBluetoothDeviceR.getDevice()).thenReturn(mSecondBluetoothDevice); when(mBluetoothDevice.getAlias()).thenReturn(TEST_LE_AUDIO_DEVICE_NAME_1); mProfileConnectedDevices.clear(); mProfileConnectedDevices.add(mBluetoothDevice);