Move enable/disable LE Audio to Utils
Bug: 381353150
Test: atest UtilsTest
Flag: EXEMPT minor refactor
Change-Id: Id017f2b5a0f51d19878bf91b219334baeda97d6d
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
index 58d2787..d7f53ca 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
@@ -419,32 +419,7 @@
mContext,
SettingsEnums.ACTION_BLUETOOTH_PROFILE_LE_AUDIO_OFF,
isCurrentDeviceInOrByPassAllowList());
-
- LocalBluetoothProfile asha = mProfileManager.getHearingAidProfile();
- LocalBluetoothProfile broadcastAssistant =
- mProfileManager.getLeAudioBroadcastAssistantProfile();
-
- for (CachedBluetoothDevice leAudioDevice : mProfileDeviceMap.get(profile.toString())) {
- Log.d(TAG,
- "device:" + leAudioDevice.getDevice().getAnonymizedAddress()
- + " disable LE profile");
- profile.setEnabled(leAudioDevice.getDevice(), false);
- if (asha != null) {
- asha.setEnabled(leAudioDevice.getDevice(), true);
- }
- if (broadcastAssistant != null) {
- Log.d(TAG,
- "device:" + leAudioDevice.getDevice().getAnonymizedAddress()
- + " disable LE broadcast assistant profile");
- broadcastAssistant.setEnabled(leAudioDevice.getDevice(), false);
- }
- }
-
- if (!SystemProperties.getBoolean(ENABLE_DUAL_MODE_AUDIO, false)) {
- Log.i(TAG, "Enabling classic audio profiles because dual mode is disabled");
- enableProfileAfterUserDisablesLeAudio(mProfileManager.getA2dpProfile());
- enableProfileAfterUserDisablesLeAudio(mProfileManager.getHeadsetProfile());
- }
+ Utils.setLeAudioEnabled(mManager, List.copyOf(mCachedDeviceGroup), false);
}
/**
@@ -462,75 +437,7 @@
mContext,
SettingsEnums.ACTION_BLUETOOTH_PROFILE_LE_AUDIO_ON,
isCurrentDeviceInOrByPassAllowList());
-
- if (!SystemProperties.getBoolean(ENABLE_DUAL_MODE_AUDIO, false)) {
- Log.i(TAG, "Disabling classic audio profiles because dual mode is disabled");
- disableProfileBeforeUserEnablesLeAudio(mProfileManager.getA2dpProfile());
- disableProfileBeforeUserEnablesLeAudio(mProfileManager.getHeadsetProfile());
- }
- LocalBluetoothProfile asha = mProfileManager.getHearingAidProfile();
- LocalBluetoothProfile broadcastAssistant =
- mProfileManager.getLeAudioBroadcastAssistantProfile();
-
- for (CachedBluetoothDevice leAudioDevice : mProfileDeviceMap.get(profile.toString())) {
- Log.d(TAG,
- "device:" + leAudioDevice.getDevice().getAnonymizedAddress()
- + " enable LE profile");
- profile.setEnabled(leAudioDevice.getDevice(), true);
- if (asha != null) {
- asha.setEnabled(leAudioDevice.getDevice(), false);
- }
- if (broadcastAssistant != null) {
- Log.d(TAG,
- "device:" + leAudioDevice.getDevice().getAnonymizedAddress()
- + " enable LE broadcast assistant profile");
- broadcastAssistant.setEnabled(leAudioDevice.getDevice(), true);
- }
- }
- }
-
- private void disableProfileBeforeUserEnablesLeAudio(LocalBluetoothProfile profile) {
- if (profile != null && mProfileDeviceMap.get(profile.toString()) != null) {
- Log.d(TAG, "Disable " + profile.toString() + " before user enables LE");
- for (CachedBluetoothDevice profileDevice : mProfileDeviceMap.get(profile.toString())) {
- if (profile.isEnabled(profileDevice.getDevice())) {
- Log.d(TAG, "The " + profileDevice.getDevice().getAnonymizedAddress() + ":"
- + profile.toString() + " set disable");
- profile.setEnabled(profileDevice.getDevice(), false);
- } else {
- Log.d(TAG, "The " + profileDevice.getDevice().getAnonymizedAddress() + ":"
- + profile.toString() + " profile is disabled. Do nothing.");
- }
- }
- } else {
- if (profile == null) {
- Log.w(TAG, "profile is null");
- } else {
- Log.w(TAG, profile.toString() + " is not in " + mProfileDeviceMap);
- }
- }
- }
-
- private void enableProfileAfterUserDisablesLeAudio(LocalBluetoothProfile profile) {
- if (profile != null && mProfileDeviceMap.get(profile.toString()) != null) {
- Log.d(TAG, "enable " + profile.toString() + "after user disables LE");
- for (CachedBluetoothDevice profileDevice : mProfileDeviceMap.get(profile.toString())) {
- if (!profile.isEnabled(profileDevice.getDevice())) {
- Log.d(TAG, "The " + profileDevice.getDevice().getAnonymizedAddress() + ":"
- + profile.toString() + " set enable");
- profile.setEnabled(profileDevice.getDevice(), true);
- } else {
- Log.d(TAG, "The " + profileDevice.getDevice().getAnonymizedAddress() + ":"
- + profile.toString() + " profile is enabled. Do nothing.");
- }
- }
- } else {
- if (profile == null) {
- Log.w(TAG, "profile is null");
- } else {
- Log.w(TAG, profile.toString() + " is not in " + mProfileDeviceMap);
- }
- }
+ Utils.setLeAudioEnabled(mManager, List.copyOf(mCachedDeviceGroup), true);
}
/**
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index 9f4bb13..76c3ed0 100644
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -28,6 +28,7 @@
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.os.SystemProperties;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.Log;
@@ -45,15 +46,20 @@
import com.android.settingslib.bluetooth.BluetoothUtils.ErrorListener;
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.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.bluetooth.LocalBluetoothManager.BluetoothManagerCallback;
+import com.android.settingslib.bluetooth.LocalBluetoothProfile;
+import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
import com.android.settingslib.utils.ThreadUtils;
import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
@@ -70,6 +76,7 @@
public final class Utils {
private static final String TAG = "BluetoothUtils";
+ private static final String ENABLE_DUAL_MODE_AUDIO = "persist.bluetooth.enable_dual_mode_audio";
static final boolean V = BluetoothUtils.V; // verbose logging
static final boolean D = BluetoothUtils.D; // regular logging
@@ -360,4 +367,119 @@
dialog.show();
return dialog;
}
+
+ /** Enables/disables LE Audio profile for the device. */
+ public static void setLeAudioEnabled(
+ @NonNull LocalBluetoothManager manager,
+ @NonNull CachedBluetoothDevice cachedDevice,
+ boolean enable) {
+ List<CachedBluetoothDevice> devices =
+ List.copyOf(findAllCachedBluetoothDevicesByGroupId(manager, cachedDevice));
+ setLeAudioEnabled(manager, devices, enable);
+ }
+
+ /** Enables/disables LE Audio profile for the devices in the same csip group. */
+ public static void setLeAudioEnabled(
+ @NonNull LocalBluetoothManager manager,
+ @NonNull List<CachedBluetoothDevice> devicesWithSameGroupId,
+ boolean enable) {
+ LocalBluetoothProfileManager profileManager = manager.getProfileManager();
+ LeAudioProfile leAudioProfile = profileManager.getLeAudioProfile();
+ List<CachedBluetoothDevice> leAudioDevices =
+ getDevicesWithProfile(devicesWithSameGroupId, leAudioProfile);
+ if (leAudioDevices.isEmpty()) {
+ Log.i(TAG, "Fail to setLeAudioEnabled, no LE Audio profile found.");
+ }
+ boolean dualModeEnabled = SystemProperties.getBoolean(ENABLE_DUAL_MODE_AUDIO, false);
+
+ if (enable && !dualModeEnabled) {
+ Log.i(TAG, "Disabling classic audio profiles because dual mode is disabled");
+ setProfileEnabledWhenChangingLeAudio(
+ devicesWithSameGroupId, profileManager.getA2dpProfile(), false);
+ setProfileEnabledWhenChangingLeAudio(
+ devicesWithSameGroupId, profileManager.getHeadsetProfile(), false);
+ }
+
+ HearingAidProfile asha = profileManager.getHearingAidProfile();
+ LocalBluetoothLeBroadcastAssistant broadcastAssistant =
+ profileManager.getLeAudioBroadcastAssistantProfile();
+
+ for (CachedBluetoothDevice leAudioDevice : leAudioDevices) {
+ Log.d(
+ TAG,
+ "device:"
+ + leAudioDevice.getDevice().getAnonymizedAddress()
+ + " set LE profile enabled: "
+ + enable);
+ leAudioProfile.setEnabled(leAudioDevice.getDevice(), enable);
+ if (asha != null) {
+ asha.setEnabled(leAudioDevice.getDevice(), !enable);
+ }
+ if (broadcastAssistant != null) {
+ Log.d(
+ TAG,
+ "device:"
+ + leAudioDevice.getDevice().getAnonymizedAddress()
+ + " enable LE broadcast assistant profile: "
+ + enable);
+ broadcastAssistant.setEnabled(leAudioDevice.getDevice(), enable);
+ }
+ }
+
+ if (!enable && !dualModeEnabled) {
+ Log.i(TAG, "Enabling classic audio profiles because dual mode is disabled");
+ setProfileEnabledWhenChangingLeAudio(
+ devicesWithSameGroupId, profileManager.getA2dpProfile(), true);
+ setProfileEnabledWhenChangingLeAudio(
+ devicesWithSameGroupId, profileManager.getHeadsetProfile(), true);
+ }
+ }
+
+ private static List<CachedBluetoothDevice> getDevicesWithProfile(
+ List<CachedBluetoothDevice> devices, LocalBluetoothProfile profile) {
+ List<CachedBluetoothDevice> devicesWithProfile = new ArrayList<>();
+ for (CachedBluetoothDevice device : devices) {
+ for (LocalBluetoothProfile currentProfile : device.getProfiles()) {
+ if (currentProfile.toString().equals(profile.toString())) {
+ devicesWithProfile.add(device);
+ }
+ }
+ }
+ return devicesWithProfile;
+ }
+
+ private static void setProfileEnabledWhenChangingLeAudio(
+ List<CachedBluetoothDevice> devices,
+ @Nullable LocalBluetoothProfile profile,
+ boolean enable) {
+ if (profile == null) {
+ Log.i(TAG, "profile is null");
+ return;
+ }
+ List<CachedBluetoothDevice> deviceWithProfile = getDevicesWithProfile(devices, profile);
+ Log.d(TAG, "Set " + profile + " enabled:" + enable + " when switching LE Audio");
+ for (CachedBluetoothDevice profileDevice : deviceWithProfile) {
+ if (profile.isEnabled(profileDevice.getDevice()) != enable) {
+ Log.d(
+ TAG,
+ "The "
+ + profileDevice.getDevice().getAnonymizedAddress()
+ + ":"
+ + profile
+ + " set to "
+ + enable);
+ profile.setEnabled(profileDevice.getDevice(), enable);
+ } else {
+ Log.d(
+ TAG,
+ "The "
+ + profileDevice.getDevice().getAnonymizedAddress()
+ + ":"
+ + profile
+ + " profile is already "
+ + enable
+ + ". Do nothing.");
+ }
+ }
+ }
}
diff --git a/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java b/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
index 8859ebd..176bfa8 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/UtilsTest.java
@@ -18,22 +18,29 @@
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import android.bluetooth.BluetoothCsipSetCoordinator;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothLeBroadcastReceiveState;
import android.content.Context;
+import android.os.SystemProperties;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.settings.testutils.FakeFeatureFactory;
-import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
+import com.android.settingslib.bluetooth.A2dpProfile;
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;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -41,8 +48,8 @@
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
-import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -52,10 +59,8 @@
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
-import org.robolectric.annotation.Config;
@RunWith(RobolectricTestRunner.class)
-@Config(shadows = {ShadowBluetoothUtils.class})
public class UtilsTest {
private static final int METADATA_FAST_PAIR_CUSTOMIZED_FIELDS = 25;
private static final String TEMP_BOND_METADATA =
@@ -73,6 +78,14 @@
@Mock
private LocalBluetoothLeBroadcastAssistant mAssistant;
@Mock
+ private A2dpProfile mA2dpProfile;
+ @Mock
+ private HeadsetProfile mHeadsetProfile;
+ @Mock
+ private LeAudioProfile mLeAudioProfile;
+ @Mock
+ private HearingAidProfile mHearingAidProfile;
+ @Mock
private CachedBluetoothDeviceManager mDeviceManager;
private MetricsFeatureProvider mMetricsFeatureProvider;
@@ -80,17 +93,14 @@
@Before
public void setUp() {
mMetricsFeatureProvider = FakeFeatureFactory.setupForTest().getMetricsFeatureProvider();
- ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBtManager;
- mLocalBtManager = Utils.getLocalBtManager(mContext);
when(mLocalBtManager.getProfileManager()).thenReturn(mProfileManager);
when(mLocalBtManager.getCachedDeviceManager()).thenReturn(mDeviceManager);
when(mProfileManager.getLeAudioBroadcastProfile()).thenReturn(mBroadcast);
when(mProfileManager.getLeAudioBroadcastAssistantProfile()).thenReturn(mAssistant);
- }
-
- @After
- public void tearDown() {
- ShadowBluetoothUtils.reset();
+ when(mProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile);
+ when(mProfileManager.getHeadsetProfile()).thenReturn(mHeadsetProfile);
+ when(mProfileManager.getLeAudioProfile()).thenReturn(mLeAudioProfile);
+ when(mProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile);
}
@Test
@@ -170,4 +180,148 @@
when(mAssistant.getAllSources(any())).thenReturn(ImmutableList.of(state));
assertThat(Utils.shouldBlockPairingInAudioSharing(mLocalBtManager)).isTrue();
}
+
+ @Test
+ public void enableLeAudioProfile_multipleDeviceInGroup() {
+ CachedBluetoothDevice cachedDevice1 = mock(CachedBluetoothDevice.class);
+ CachedBluetoothDevice cachedDevice2 = mock(CachedBluetoothDevice.class);
+ CachedBluetoothDevice cachedDevice3 = mock(CachedBluetoothDevice.class);
+ BluetoothDevice device1 = mock(BluetoothDevice.class);
+ BluetoothDevice device2 = mock(BluetoothDevice.class);
+ BluetoothDevice device3 = mock(BluetoothDevice.class);
+ when(cachedDevice1.getDevice()).thenReturn(device1);
+ when(cachedDevice2.getDevice()).thenReturn(device2);
+ when(cachedDevice3.getDevice()).thenReturn(device3);
+ when(cachedDevice1.getMemberDevice()).thenReturn(ImmutableSet.of(cachedDevice2));
+ when(mDeviceManager.getCachedDevicesCopy())
+ .thenReturn(ImmutableList.of(cachedDevice1, cachedDevice3));
+ when(cachedDevice1.getGroupId()).thenReturn(1);
+ when(cachedDevice2.getGroupId()).thenReturn(1);
+ when(cachedDevice3.getGroupId()).thenReturn(2);
+ when(cachedDevice1.getProfiles())
+ .thenReturn(ImmutableList.of(mA2dpProfile, mHeadsetProfile, mLeAudioProfile));
+ when(cachedDevice2.getProfiles()).thenReturn(ImmutableList.of(mLeAudioProfile));
+ when(cachedDevice3.getProfiles())
+ .thenReturn(ImmutableList.of(mA2dpProfile, mHeadsetProfile, mLeAudioProfile));
+
+ Utils.setLeAudioEnabled(mLocalBtManager, cachedDevice2, true);
+
+ verify(mLeAudioProfile).setEnabled(device1, true);
+ verify(mLeAudioProfile).setEnabled(device2, true);
+ verify(mHearingAidProfile).setEnabled(device1, false);
+ verify(mAssistant).setEnabled(device1, true);
+ verify(mLeAudioProfile, never()).setEnabled(eq(device3), anyBoolean());
+ verify(mA2dpProfile, never()).setEnabled(eq(device3), anyBoolean());
+ verify(mHeadsetProfile, never()).setEnabled(eq(device3), anyBoolean());
+ }
+
+ @Test
+ public void enableLeAudioProfile_dualModeEnabled_a2dpAndHfpNotChanged() {
+ SystemProperties.set("persist.bluetooth.enable_dual_mode_audio", "true");
+ CachedBluetoothDevice cachedDevice1 = mock(CachedBluetoothDevice.class);
+ BluetoothDevice device1 = mock(BluetoothDevice.class);
+ when(cachedDevice1.getDevice()).thenReturn(device1);
+ when(cachedDevice1.getGroupId()).thenReturn(BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+ when(cachedDevice1.getProfiles())
+ .thenReturn(ImmutableList.of(mA2dpProfile, mHeadsetProfile, mLeAudioProfile));
+ when(mA2dpProfile.isEnabled(device1)).thenReturn(true);
+ when(mHeadsetProfile.isEnabled(device1)).thenReturn(true);
+
+ Utils.setLeAudioEnabled(mLocalBtManager, cachedDevice1, true);
+
+ verify(mLeAudioProfile).setEnabled(device1, true);
+ verify(mA2dpProfile, never()).setEnabled(device1, false);
+ verify(mHeadsetProfile, never()).setEnabled(device1, false);
+ }
+
+ @Test
+ public void enableLeAudioProfile_dualModeDisabled_disableA2dpAndHfp() {
+ SystemProperties.set("persist.bluetooth.enable_dual_mode_audio", "false");
+ CachedBluetoothDevice cachedDevice1 = mock(CachedBluetoothDevice.class);
+ BluetoothDevice device1 = mock(BluetoothDevice.class);
+ when(cachedDevice1.getDevice()).thenReturn(device1);
+ when(cachedDevice1.getGroupId()).thenReturn(BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+ when(cachedDevice1.getProfiles())
+ .thenReturn(ImmutableList.of(mA2dpProfile, mHeadsetProfile, mLeAudioProfile));
+ when(mA2dpProfile.isEnabled(device1)).thenReturn(true);
+ when(mHeadsetProfile.isEnabled(device1)).thenReturn(true);
+
+ Utils.setLeAudioEnabled(mLocalBtManager, cachedDevice1, true);
+
+ verify(mLeAudioProfile).setEnabled(device1, true);
+ verify(mA2dpProfile).setEnabled(device1, false);
+ verify(mHeadsetProfile).setEnabled(device1, false);
+ }
+
+ @Test
+ public void disableLeAudioProfile_multipleDeviceInGroup() {
+ CachedBluetoothDevice cachedDevice1 = mock(CachedBluetoothDevice.class);
+ CachedBluetoothDevice cachedDevice2 = mock(CachedBluetoothDevice.class);
+ CachedBluetoothDevice cachedDevice3 = mock(CachedBluetoothDevice.class);
+ BluetoothDevice device1 = mock(BluetoothDevice.class);
+ BluetoothDevice device2 = mock(BluetoothDevice.class);
+ BluetoothDevice device3 = mock(BluetoothDevice.class);
+ when(cachedDevice1.getDevice()).thenReturn(device1);
+ when(cachedDevice2.getDevice()).thenReturn(device2);
+ when(cachedDevice3.getDevice()).thenReturn(device3);
+ when(cachedDevice1.getMemberDevice()).thenReturn(ImmutableSet.of(cachedDevice2));
+ when(mDeviceManager.getCachedDevicesCopy())
+ .thenReturn(ImmutableList.of(cachedDevice1, cachedDevice3));
+ when(cachedDevice1.getGroupId()).thenReturn(1);
+ when(cachedDevice2.getGroupId()).thenReturn(1);
+ when(cachedDevice3.getGroupId()).thenReturn(2);
+ when(cachedDevice1.getProfiles())
+ .thenReturn(ImmutableList.of(mA2dpProfile, mHeadsetProfile, mLeAudioProfile));
+ when(cachedDevice2.getProfiles()).thenReturn(ImmutableList.of(mLeAudioProfile));
+ when(cachedDevice3.getProfiles())
+ .thenReturn(ImmutableList.of(mA2dpProfile, mHeadsetProfile, mLeAudioProfile));
+
+ Utils.setLeAudioEnabled(mLocalBtManager, cachedDevice2, false);
+
+ verify(mLeAudioProfile).setEnabled(device1, false);
+ verify(mLeAudioProfile).setEnabled(device2, false);
+ verify(mHearingAidProfile).setEnabled(device1, true);
+ verify(mAssistant).setEnabled(device1, false);
+ verify(mLeAudioProfile, never()).setEnabled(eq(device3), anyBoolean());
+ verify(mA2dpProfile, never()).setEnabled(eq(device3), anyBoolean());
+ verify(mHeadsetProfile, never()).setEnabled(eq(device3), anyBoolean());
+ }
+
+ @Test
+ public void disableLeAudioProfile_dualModeEnabled_a2dpAndHfpNotChanged() {
+ SystemProperties.set("persist.bluetooth.enable_dual_mode_audio", "true");
+ CachedBluetoothDevice cachedDevice1 = mock(CachedBluetoothDevice.class);
+ BluetoothDevice device1 = mock(BluetoothDevice.class);
+ when(cachedDevice1.getDevice()).thenReturn(device1);
+ when(cachedDevice1.getGroupId()).thenReturn(BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+ when(cachedDevice1.getProfiles())
+ .thenReturn(ImmutableList.of(mA2dpProfile, mHeadsetProfile, mLeAudioProfile));
+ when(mA2dpProfile.isEnabled(device1)).thenReturn(false);
+ when(mHeadsetProfile.isEnabled(device1)).thenReturn(false);
+
+ Utils.setLeAudioEnabled(mLocalBtManager, cachedDevice1, false);
+
+ verify(mLeAudioProfile).setEnabled(device1, false);
+ verify(mA2dpProfile, never()).setEnabled(device1, true);
+ verify(mHeadsetProfile, never()).setEnabled(device1, true);
+ }
+
+ @Test
+ public void disableLeAudioProfile_dualModeDisabled_enableA2dpAndHfp() {
+ SystemProperties.set("persist.bluetooth.enable_dual_mode_audio", "false");
+ CachedBluetoothDevice cachedDevice1 = mock(CachedBluetoothDevice.class);
+ BluetoothDevice device1 = mock(BluetoothDevice.class);
+ when(cachedDevice1.getDevice()).thenReturn(device1);
+ when(cachedDevice1.getGroupId()).thenReturn(BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+ when(cachedDevice1.getProfiles())
+ .thenReturn(ImmutableList.of(mA2dpProfile, mHeadsetProfile, mLeAudioProfile));
+ when(mA2dpProfile.isEnabled(device1)).thenReturn(false);
+ when(mHeadsetProfile.isEnabled(device1)).thenReturn(false);
+
+ Utils.setLeAudioEnabled(mLocalBtManager, cachedDevice1, false);
+
+ verify(mLeAudioProfile).setEnabled(device1, false);
+ verify(mA2dpProfile).setEnabled(device1, true);
+ verify(mHeadsetProfile).setEnabled(device1, true);
+ }
}
diff --git a/tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowBluetoothUtils.java b/tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowBluetoothUtils.java
index 4dca749..72de746 100644
--- a/tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowBluetoothUtils.java
+++ b/tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowBluetoothUtils.java
@@ -18,24 +18,48 @@
import android.content.Context;
+import androidx.annotation.NonNull;
+
import com.android.settings.bluetooth.Utils;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;
import org.robolectric.annotation.Resetter;
+import java.util.HashMap;
+import java.util.Map;
+
/** Robolectric shadow for the bluetooth utils. */
@Implements(Utils.class)
public class ShadowBluetoothUtils {
public static LocalBluetoothManager sLocalBluetoothManager;
+ private static final Map<CachedBluetoothDevice, Boolean> sLeAudioState = new HashMap<>();
@Implementation
protected static LocalBluetoothManager getLocalBtManager(Context context) {
return sLocalBluetoothManager;
}
+ /** Sets le audio state for the device. */
+ @Implementation
+ public static void setLeAudioEnabled(
+ @NonNull LocalBluetoothManager manager,
+ @NonNull CachedBluetoothDevice cachedDevice,
+ boolean enable) {
+ sLeAudioState.put(cachedDevice, enable);
+ }
+
+ /** Checks whether le audio is enabled for the device. */
+ public static boolean isLeAudioEnabled(@NonNull CachedBluetoothDevice cachedDevice) {
+ if (sLeAudioState.containsKey(cachedDevice)) {
+ return sLeAudioState.get(cachedDevice);
+ }
+ return false;
+ }
+
/** Resets the local bluetooth manager to null. */
@Resetter
public static void reset() {