[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) {