[Audiosharing] Impl audio sharing feature provider in Settings
Add createAvailableMediaDeviceGroupController interface to provide
different controller in Settings and SettingsGoogle.
Bug: 324023639
Test: atest
Change-Id: Ibf2ea2620c878e609eb937ff6947f5aaa0b89e7a
diff --git a/res/xml/connected_devices.xml b/res/xml/connected_devices.xml
index 34a5798..e9ec19e 100644
--- a/res/xml/connected_devices.xml
+++ b/res/xml/connected_devices.xml
@@ -41,8 +41,7 @@
<PreferenceCategory
android:key="available_device_list"
- android:title="@string/connected_device_media_device_title"
- settings:controller="com.android.settings.connecteddevice.AvailableMediaDeviceGroupController" />
+ android:title="@string/connected_device_media_device_title"/>
<PreferenceCategory
android:key="connected_device_list"
diff --git a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
index fc3493c..0535d15 100644
--- a/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
+++ b/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupController.java
@@ -17,18 +17,17 @@
import static com.android.settingslib.Utils.isAudioModeOngoingCall;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothLeBroadcastAssistant;
-import android.bluetooth.BluetoothLeBroadcastMetadata;
-import android.bluetooth.BluetoothLeBroadcastReceiveState;
import android.bluetooth.BluetoothProfile;
import android.content.Context;
import android.content.pm.PackageManager;
import android.util.Log;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.FragmentManager;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceScreen;
@@ -38,138 +37,66 @@
import com.android.settings.bluetooth.AvailableMediaBluetoothDeviceUpdater;
import com.android.settings.bluetooth.BluetoothDeviceUpdater;
import com.android.settings.bluetooth.Utils;
-import com.android.settings.connecteddevice.audiosharing.AudioSharingUtils;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settingslib.bluetooth.BluetoothCallback;
import com.android.settingslib.bluetooth.BluetoothUtils;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
-import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.core.lifecycle.LifecycleObserver;
-import com.android.settingslib.core.lifecycle.events.OnStart;
-import com.android.settingslib.core.lifecycle.events.OnStop;
-
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
+import com.android.settingslib.core.lifecycle.Lifecycle;
/**
* Controller to maintain the {@link androidx.preference.PreferenceGroup} for all available media
* devices. It uses {@link DevicePreferenceCallback} to add/remove {@link Preference}
*/
public class AvailableMediaDeviceGroupController extends BasePreferenceController
- implements LifecycleObserver, OnStart, OnStop, DevicePreferenceCallback, BluetoothCallback {
+ implements DefaultLifecycleObserver, DevicePreferenceCallback, BluetoothCallback {
private static final boolean DEBUG = BluetoothUtils.D;
private static final String TAG = "AvailableMediaDeviceGroupController";
private static final String KEY = "available_device_list";
- @VisibleForTesting PreferenceGroup mPreferenceGroup;
+ @VisibleForTesting @Nullable PreferenceGroup mPreferenceGroup;
@VisibleForTesting LocalBluetoothManager mLocalBluetoothManager;
- private final Executor mExecutor;
- private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
- private FragmentManager mFragmentManager;
- private BluetoothLeBroadcastAssistant.Callback mAssistantCallback =
- new BluetoothLeBroadcastAssistant.Callback() {
- @Override
- public void onSearchStarted(int reason) {}
+ @Nullable private BluetoothDeviceUpdater mBluetoothDeviceUpdater;
+ @Nullable private FragmentManager mFragmentManager;
- @Override
- public void onSearchStartFailed(int reason) {}
-
- @Override
- public void onSearchStopped(int reason) {}
-
- @Override
- public void onSearchStopFailed(int reason) {}
-
- @Override
- public void onSourceFound(@NonNull BluetoothLeBroadcastMetadata source) {}
-
- @Override
- public void onSourceAdded(@NonNull BluetoothDevice sink, int sourceId, int reason) {
- mBluetoothDeviceUpdater.forceUpdate();
- }
-
- @Override
- public void onSourceAddFailed(
- @NonNull BluetoothDevice sink,
- @NonNull BluetoothLeBroadcastMetadata source,
- int reason) {}
-
- @Override
- public void onSourceModified(
- @NonNull BluetoothDevice sink, int sourceId, int reason) {}
-
- @Override
- public void onSourceModifyFailed(
- @NonNull BluetoothDevice sink, int sourceId, int reason) {}
-
- @Override
- public void onSourceRemoved(
- @NonNull BluetoothDevice sink, int sourceId, int reason) {
- mBluetoothDeviceUpdater.forceUpdate();
- }
-
- @Override
- public void onSourceRemoveFailed(
- @NonNull BluetoothDevice sink, int sourceId, int reason) {}
-
- @Override
- public void onReceiveStateChanged(
- BluetoothDevice sink,
- int sourceId,
- BluetoothLeBroadcastReceiveState state) {}
- };
-
- public AvailableMediaDeviceGroupController(Context context) {
+ public AvailableMediaDeviceGroupController(
+ Context context,
+ @Nullable DashboardFragment fragment,
+ @Nullable Lifecycle lifecycle) {
super(context, KEY);
+ if (fragment != null) {
+ init(fragment);
+ }
+ if (lifecycle != null) {
+ lifecycle.addObserver(this);
+ }
mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
- mExecutor = Executors.newSingleThreadExecutor();
}
@Override
- public void onStart() {
+ public void onStart(@NonNull LifecycleOwner owner) {
if (mLocalBluetoothManager == null) {
Log.e(TAG, "onStart() Bluetooth is not supported on this device");
return;
}
- if (AudioSharingUtils.isFeatureEnabled()) {
- LocalBluetoothLeBroadcastAssistant assistant =
- mLocalBluetoothManager
- .getProfileManager()
- .getLeAudioBroadcastAssistantProfile();
- if (assistant != null) {
- if (DEBUG) {
- Log.d(TAG, "onStart() Register callbacks for assistant.");
- }
- assistant.registerServiceCallBack(mExecutor, mAssistantCallback);
- }
- }
- mBluetoothDeviceUpdater.registerCallback();
mLocalBluetoothManager.getEventManager().registerCallback(this);
- mBluetoothDeviceUpdater.refreshPreference();
+ if (mBluetoothDeviceUpdater != null) {
+ mBluetoothDeviceUpdater.registerCallback();
+ mBluetoothDeviceUpdater.refreshPreference();
+ }
}
@Override
- public void onStop() {
+ public void onStop(@NonNull LifecycleOwner owner) {
if (mLocalBluetoothManager == null) {
Log.e(TAG, "onStop() Bluetooth is not supported on this device");
return;
}
- if (AudioSharingUtils.isFeatureEnabled()) {
- LocalBluetoothLeBroadcastAssistant assistant =
- mLocalBluetoothManager
- .getProfileManager()
- .getLeAudioBroadcastAssistantProfile();
- if (assistant != null) {
- if (DEBUG) {
- Log.d(TAG, "onStop() Register callbacks for assistant.");
- }
- assistant.unregisterServiceCallBack(mAssistantCallback);
- }
+ if (mBluetoothDeviceUpdater != null) {
+ mBluetoothDeviceUpdater.unregisterCallback();
}
- mBluetoothDeviceUpdater.unregisterCallback();
mLocalBluetoothManager.getEventManager().unregisterCallback(this);
}
@@ -178,12 +105,16 @@
super.displayPreference(screen);
mPreferenceGroup = screen.findPreference(KEY);
- mPreferenceGroup.setVisible(false);
+ if (mPreferenceGroup != null) {
+ mPreferenceGroup.setVisible(false);
+ }
if (isAvailable()) {
updateTitle();
- mBluetoothDeviceUpdater.setPrefContext(screen.getContext());
- mBluetoothDeviceUpdater.forceUpdate();
+ if (mBluetoothDeviceUpdater != null) {
+ mBluetoothDeviceUpdater.setPrefContext(screen.getContext());
+ mBluetoothDeviceUpdater.forceUpdate();
+ }
}
}
@@ -201,17 +132,21 @@
@Override
public void onDeviceAdded(Preference preference) {
- if (mPreferenceGroup.getPreferenceCount() == 0) {
- mPreferenceGroup.setVisible(true);
+ if (mPreferenceGroup != null) {
+ if (mPreferenceGroup.getPreferenceCount() == 0) {
+ mPreferenceGroup.setVisible(true);
+ }
+ mPreferenceGroup.addPreference(preference);
}
- mPreferenceGroup.addPreference(preference);
}
@Override
public void onDeviceRemoved(Preference preference) {
- mPreferenceGroup.removePreference(preference);
- if (mPreferenceGroup.getPreferenceCount() == 0) {
- mPreferenceGroup.setVisible(false);
+ if (mPreferenceGroup != null) {
+ mPreferenceGroup.removePreference(preference);
+ if (mPreferenceGroup.getPreferenceCount() == 0) {
+ mPreferenceGroup.setVisible(false);
+ }
}
}
@@ -253,14 +188,16 @@
}
private void updateTitle() {
- if (isAudioModeOngoingCall(mContext)) {
- // in phone call
- mPreferenceGroup.setTitle(
- mContext.getString(R.string.connected_device_call_device_title));
- } else {
- // without phone call
- mPreferenceGroup.setTitle(
- mContext.getString(R.string.connected_device_media_device_title));
+ if (mPreferenceGroup != null) {
+ if (isAudioModeOngoingCall(mContext)) {
+ // in phone call
+ mPreferenceGroup.setTitle(
+ mContext.getString(R.string.connected_device_call_device_title));
+ } else {
+ // without phone call
+ mPreferenceGroup.setTitle(
+ mContext.getString(R.string.connected_device_media_device_title));
+ }
}
}
}
diff --git a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
index 2798be4..04ba5d2 100644
--- a/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
+++ b/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragment.java
@@ -24,12 +24,10 @@
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
-import androidx.lifecycle.Lifecycle;
import com.android.settings.R;
import com.android.settings.SettingsActivity;
import com.android.settings.Utils;
-import com.android.settings.connecteddevice.audiosharing.AudioSharingUtils;
import com.android.settings.core.SettingsUIDeviceConfig;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.overlay.FeatureFactory;
@@ -38,6 +36,7 @@
import com.android.settings.slices.SlicePreferenceController;
import com.android.settingslib.bluetooth.HearingAidStatsLogUtils;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
import com.android.settingslib.search.SearchIndexable;
import java.util.ArrayList;
@@ -92,7 +91,6 @@
+ ", action : "
+ action);
}
- use(AvailableMediaDeviceGroupController.class).init(this);
use(ConnectedDeviceGroupController.class).init(this);
use(PreviouslyConnectedDevicePreferenceController.class).init(this);
use(SlicePreferenceController.class)
@@ -124,15 +122,17 @@
@Nullable ConnectedDeviceDashboardFragment fragment,
@Nullable Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
- if (AudioSharingUtils.isFeatureEnabled()) {
- AbstractPreferenceController audioSharingController =
- FeatureFactory.getFeatureFactory()
- .getAudioSharingFeatureProvider()
- .createAudioSharingDevicePreferenceController(
- context, fragment, lifecycle);
- if (audioSharingController != null) {
- controllers.add(audioSharingController);
- }
+ AbstractPreferenceController availableMediaController =
+ FeatureFactory.getFeatureFactory()
+ .getAudioSharingFeatureProvider()
+ .createAvailableMediaDeviceGroupController(context, fragment, lifecycle);
+ controllers.add(availableMediaController);
+ AbstractPreferenceController audioSharingController =
+ FeatureFactory.getFeatureFactory()
+ .getAudioSharingFeatureProvider()
+ .createAudioSharingDevicePreferenceController(context, fragment, lifecycle);
+ if (audioSharingController != null) {
+ controllers.add(audioSharingController);
}
return controllers;
}
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProvider.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProvider.java
index c71a368..9fe4d50 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProvider.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProvider.java
@@ -20,12 +20,12 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.lifecycle.Lifecycle;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
/** Feature provider for the audio sharing related features, */
public interface AudioSharingFeatureProvider {
@@ -37,6 +37,12 @@
@Nullable DashboardFragment fragment,
@Nullable Lifecycle lifecycle);
+ /** Create available media device preference controller. */
+ AbstractPreferenceController createAvailableMediaDeviceGroupController(
+ @NonNull Context context,
+ @Nullable DashboardFragment fragment,
+ @Nullable Lifecycle lifecycle);
+
/**
* Check if the device match the audio sharing filter.
*
diff --git a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProviderImpl.java b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProviderImpl.java
index 05a6a63..259ed7a 100644
--- a/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProviderImpl.java
+++ b/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProviderImpl.java
@@ -20,12 +20,13 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
-import androidx.lifecycle.Lifecycle;
+import com.android.settings.connecteddevice.AvailableMediaDeviceGroupController;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
import com.android.settingslib.core.AbstractPreferenceController;
+import com.android.settingslib.core.lifecycle.Lifecycle;
public class AudioSharingFeatureProviderImpl implements AudioSharingFeatureProvider {
@@ -39,6 +40,14 @@
}
@Override
+ public AbstractPreferenceController createAvailableMediaDeviceGroupController(
+ @NonNull Context context,
+ @Nullable DashboardFragment fragment,
+ @Nullable Lifecycle lifecycle) {
+ return new AvailableMediaDeviceGroupController(context, fragment, lifecycle);
+ }
+
+ @Override
public boolean isAudioSharingFilterMatched(
@NonNull CachedBluetoothDevice cachedDevice, LocalBluetoothManager localBtManager) {
return false;
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
index e5964d0..357420a 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/AvailableMediaDeviceGroupControllerTest.java
@@ -22,27 +22,23 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.robolectric.shadows.ShadowLooper.shadowMainLooper;
-import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothLeBroadcastAssistant;
import android.bluetooth.BluetoothProfile;
-import android.bluetooth.BluetoothStatusCodes;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.AudioManager;
-import android.platform.test.annotations.RequiresFlagsEnabled;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.FragmentActivity;
+import androidx.lifecycle.LifecycleOwner;
import androidx.preference.Preference;
import androidx.preference.PreferenceGroup;
import androidx.preference.PreferenceManager;
@@ -51,19 +47,16 @@
import com.android.settings.R;
import com.android.settings.bluetooth.AvailableMediaBluetoothDeviceUpdater;
import com.android.settings.bluetooth.Utils;
-import com.android.settings.flags.Flags;
import com.android.settings.testutils.shadow.ShadowAlertDialogCompat;
import com.android.settings.testutils.shadow.ShadowAudioManager;
-import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
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.HearingAidInfo;
-import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcastAssistant;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
-import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
+import com.android.settingslib.core.lifecycle.Lifecycle;
import org.junit.Before;
import org.junit.Rule;
@@ -76,16 +69,12 @@
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
-import org.robolectric.shadow.api.Shadow;
-
-import java.util.concurrent.Executor;
/** Tests for {@link AvailableMediaDeviceGroupController}. */
@RunWith(RobolectricTestRunner.class)
@Config(
shadows = {
ShadowAudioManager.class,
- ShadowBluetoothAdapter.class,
ShadowBluetoothUtils.class,
ShadowAlertDialogCompat.class,
})
@@ -105,9 +94,7 @@
@Mock private PackageManager mPackageManager;
@Mock private BluetoothEventManager mEventManager;
@Mock private LocalBluetoothManager mLocalBluetoothManager;
- @Mock private LocalBluetoothProfileManager mLocalBtProfileManager;
@Mock private CachedBluetoothDeviceManager mCachedDeviceManager;
- @Mock private LocalBluetoothLeBroadcastAssistant mAssistant;
@Mock private CachedBluetoothDevice mCachedBluetoothDevice;
private PreferenceGroup mPreferenceGroup;
@@ -115,13 +102,16 @@
private Preference mPreference;
private AvailableMediaDeviceGroupController mAvailableMediaDeviceGroupController;
private AudioManager mAudioManager;
- private ShadowBluetoothAdapter mShadowBluetoothAdapter;
+ private LifecycleOwner mLifecycleOwner;
+ private Lifecycle mLifecycle;
@Before
public void setUp() {
MockitoAnnotations.initMocks(this);
mContext = spy(RuntimeEnvironment.application);
+ mLifecycleOwner = () -> mLifecycle;
+ mLifecycle = new Lifecycle(mLifecycleOwner);
mPreference = new Preference(mContext);
mPreference.setKey(PREFERENCE_KEY_1);
mPreferenceGroup = spy(new PreferenceScreen(mContext, null));
@@ -130,24 +120,17 @@
doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
- mShadowBluetoothAdapter = Shadow.extract(BluetoothAdapter.getDefaultAdapter());
- mShadowBluetoothAdapter.setEnabled(true);
- mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
- BluetoothStatusCodes.FEATURE_NOT_SUPPORTED);
- mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
- BluetoothStatusCodes.FEATURE_NOT_SUPPORTED);
ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager;
mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
mAudioManager = mContext.getSystemService(AudioManager.class);
doReturn(mEventManager).when(mLocalBluetoothManager).getEventManager();
- when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBtProfileManager);
when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(mCachedDeviceManager);
when(mCachedDeviceManager.findDevice(any(BluetoothDevice.class)))
.thenReturn(mCachedBluetoothDevice);
when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS);
mAvailableMediaDeviceGroupController =
- spy(new AvailableMediaDeviceGroupController(mContext));
+ spy(new AvailableMediaDeviceGroupController(mContext, null, mLifecycle));
mAvailableMediaDeviceGroupController.setBluetoothDeviceUpdater(
mAvailableMediaBluetoothDeviceUpdater);
mAvailableMediaDeviceGroupController.setFragmentManager(
@@ -197,7 +180,7 @@
@Test
public void testRegister() {
// register the callback in onStart()
- mAvailableMediaDeviceGroupController.onStart();
+ mAvailableMediaDeviceGroupController.onStart(mLifecycleOwner);
verify(mAvailableMediaBluetoothDeviceUpdater).registerCallback();
verify(mLocalBluetoothManager.getEventManager())
@@ -206,36 +189,15 @@
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
- public void testRegister_audioSharingOn() {
- setUpBroadcast();
- // register the callback in onStart()
- mAvailableMediaDeviceGroupController.onStart();
- verify(mAssistant)
- .registerServiceCallBack(
- any(Executor.class), any(BluetoothLeBroadcastAssistant.Callback.class));
- }
-
- @Test
public void testUnregister() {
// unregister the callback in onStop()
- mAvailableMediaDeviceGroupController.onStop();
+ mAvailableMediaDeviceGroupController.onStop(mLifecycleOwner);
verify(mAvailableMediaBluetoothDeviceUpdater).unregisterCallback();
verify(mLocalBluetoothManager.getEventManager())
.unregisterCallback(any(BluetoothCallback.class));
}
@Test
- @RequiresFlagsEnabled(Flags.FLAG_ENABLE_LE_AUDIO_SHARING)
- public void testUnregister_audioSharingOn() {
- setUpBroadcast();
- // unregister the callback in onStop()
- mAvailableMediaDeviceGroupController.onStop();
- verify(mAssistant)
- .unregisterServiceCallBack(any(BluetoothLeBroadcastAssistant.Callback.class));
- }
-
- @Test
public void testGetAvailabilityStatus_noBluetoothFeature_returnUnSupported() {
doReturn(false).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
@@ -274,7 +236,7 @@
mAvailableMediaDeviceGroupController.mLocalBluetoothManager = null;
// Shouldn't crash
- mAvailableMediaDeviceGroupController.onStart();
+ mAvailableMediaDeviceGroupController.onStart(mLifecycleOwner);
}
@Test
@@ -282,7 +244,7 @@
mAvailableMediaDeviceGroupController.mLocalBluetoothManager = null;
// Shouldn't crash
- mAvailableMediaDeviceGroupController.onStop();
+ mAvailableMediaDeviceGroupController.onStop(mLifecycleOwner);
}
@Test
@@ -300,19 +262,4 @@
final AlertDialog dialog = ShadowAlertDialogCompat.getLatestAlertDialog();
assertThat(dialog.isShowing()).isTrue();
}
-
- private void setUpBroadcast() {
- mShadowBluetoothAdapter.setIsLeAudioBroadcastSourceSupported(
- BluetoothStatusCodes.FEATURE_SUPPORTED);
- mShadowBluetoothAdapter.setIsLeAudioBroadcastAssistantSupported(
- BluetoothStatusCodes.FEATURE_SUPPORTED);
- when(mLocalBtProfileManager.getLeAudioBroadcastAssistantProfile()).thenReturn(mAssistant);
- doNothing()
- .when(mAssistant)
- .registerServiceCallBack(
- any(Executor.class), any(BluetoothLeBroadcastAssistant.Callback.class));
- doNothing()
- .when(mAssistant)
- .unregisterServiceCallBack(any(BluetoothLeBroadcastAssistant.Callback.class));
- }
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
index 09f7a38..ee4f952 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/ConnectedDeviceDashboardFragmentTest.java
@@ -20,19 +20,25 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
import android.content.Context;
import android.content.pm.PackageManager;
import android.platform.test.flag.junit.CheckFlagsRule;
import android.platform.test.flag.junit.DeviceFlagsValueProvider;
+import android.platform.test.flag.junit.SetFlagsRule;
import android.provider.SearchIndexableResource;
import com.android.settings.R;
+import com.android.settings.connecteddevice.fastpair.FastPairDeviceUpdater;
import com.android.settings.core.BasePreferenceController;
import com.android.settings.core.PreferenceControllerListHelper;
+import com.android.settings.flags.Flags;
import com.android.settings.slices.SlicePreferenceController;
+import com.android.settings.testutils.FakeFeatureFactory;
import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
import com.android.settings.testutils.shadow.ShadowConnectivityManager;
import com.android.settings.testutils.shadow.ShadowUserManager;
@@ -60,6 +66,8 @@
@Rule
public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule();
+ @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
+
private static final String KEY_NEARBY_DEVICES = "bt_nearby_slice";
private static final String KEY_DISCOVERABLE_FOOTER = "discoverable_footer";
private static final String KEY_SAVED_DEVICE_SEE_ALL = "previously_connected_devices_see_all";
@@ -75,8 +83,11 @@
private static final String TEST_ACTION = "com.testapp.settings.ACTION_START";
@Mock private PackageManager mPackageManager;
+ @Mock private FastPairDeviceUpdater mFastPairDeviceUpdater;
private Context mContext;
private ConnectedDeviceDashboardFragment mFragment;
+ private FakeFeatureFactory mFeatureFactory;
+ private AvailableMediaDeviceGroupController mMediaDeviceGroupController;
@Before
public void setUp() {
@@ -84,6 +95,22 @@
mContext = spy(RuntimeEnvironment.application);
mFragment = new ConnectedDeviceDashboardFragment();
+ mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_SUBSEQUENT_PAIR_SETTINGS_INTEGRATION);
+ mFeatureFactory = FakeFeatureFactory.setupForTest();
+ when(mFeatureFactory
+ .getFastPairFeatureProvider()
+ .getFastPairDeviceUpdater(
+ any(Context.class), any(DevicePreferenceCallback.class)))
+ .thenReturn(mFastPairDeviceUpdater);
+ when(mFeatureFactory
+ .getAudioSharingFeatureProvider()
+ .createAudioSharingDevicePreferenceController(mContext, null, null))
+ .thenReturn(null);
+ mMediaDeviceGroupController = new AvailableMediaDeviceGroupController(mContext, null, null);
+ when(mFeatureFactory
+ .getAudioSharingFeatureProvider()
+ .createAvailableMediaDeviceGroupController(mContext, null, null))
+ .thenReturn(mMediaDeviceGroupController);
doReturn(mPackageManager).when(mContext).getPackageManager();
doReturn(true).when(mPackageManager).hasSystemFeature(PackageManager.FEATURE_BLUETOOTH);
}
diff --git a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProviderImplTest.java b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProviderImplTest.java
index 0edbc77..1965bff 100644
--- a/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProviderImplTest.java
+++ b/tests/robotests/src/com/android/settings/connecteddevice/audiosharing/AudioSharingFeatureProviderImplTest.java
@@ -22,6 +22,7 @@
import androidx.test.core.app.ApplicationProvider;
+import com.android.settings.connecteddevice.AvailableMediaDeviceGroupController;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settingslib.bluetooth.CachedBluetoothDevice;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -60,6 +61,14 @@
}
@Test
+ public void createAvailableMediaDeviceGroupController_returnsNull() {
+ assertThat(
+ mFeatureProvider.createAvailableMediaDeviceGroupController(
+ mContext, /* fragment= */ null, /* lifecycle= */ null))
+ .isInstanceOf(AvailableMediaDeviceGroupController.class);
+ }
+
+ @Test
public void isAudioSharingFilterMatched_returnsFalse() {
assertThat(mFeatureProvider.isAudioSharingFilterMatched(mCachedDevice, mLocalBtManager))
.isFalse();
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAudioManager.java b/tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowAudioManager.java
similarity index 92%
rename from tests/robotests/src/com/android/settings/testutils/shadow/ShadowAudioManager.java
rename to tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowAudioManager.java
index 9c06665..b465a41 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowAudioManager.java
+++ b/tests/robotests/testutils/com/android/settings/testutils/shadow/ShadowAudioManager.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2018 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -38,6 +38,7 @@
import java.util.ArrayList;
import java.util.List;
+/** Robolectric shadow for the AudioManager. */
@Implements(value = AudioManager.class)
public class ShadowAudioManager extends org.robolectric.shadows.ShadowAudioManager {
private int mRingerMode;
@@ -58,11 +59,13 @@
mRingerMode = mode;
}
+ /** Register audio device callback. */
@Implementation
public void registerAudioDeviceCallback(AudioDeviceCallback callback, Handler handler) {
mDeviceCallbacks.add(callback);
}
+ /** Unregister audio device callback. */
@Implementation
public void unregisterAudioDeviceCallback(AudioDeviceCallback callback) {
if (mDeviceCallbacks.contains(callback)) {
@@ -79,10 +82,12 @@
return mMusicActiveRemotely;
}
+ /** Set output device. */
public void setOutputDevice(int deviceCodes) {
mDeviceCodes = deviceCodes;
}
+ /** Get devices for stream. */
@Implementation
public int getDevicesForStream(int streamType) {
switch (streamType) {