Merge "[LE Audio] Remove the broadcast icon when the device does not support broadcast feature" into tm-qpr-dev
diff --git a/src/com/android/settings/media/MediaOutputIndicatorWorker.java b/src/com/android/settings/media/MediaOutputIndicatorWorker.java
index 09e0672..bf1e06e 100644
--- a/src/com/android/settings/media/MediaOutputIndicatorWorker.java
+++ b/src/com/android/settings/media/MediaOutputIndicatorWorker.java
@@ -165,6 +165,13 @@
         return mPackageName;
     }
 
+    /** Check if this device supports LE Audio Broadcast feature */
+    public boolean isBroadcastSupported() {
+        LocalBluetoothLeBroadcast broadcast =
+                mLocalBluetoothManager.getProfileManager().getLeAudioBroadcastProfile();
+        return broadcast != null ? true : false;
+    }
+
     public boolean isDeviceBroadcasting() {
         LocalBluetoothLeBroadcast broadcast =
                 mLocalBluetoothManager.getProfileManager().getLeAudioBroadcastProfile();
diff --git a/src/com/android/settings/notification/MediaVolumePreferenceController.java b/src/com/android/settings/notification/MediaVolumePreferenceController.java
index 2466b77..0ddba08 100644
--- a/src/com/android/settings/notification/MediaVolumePreferenceController.java
+++ b/src/com/android/settings/notification/MediaVolumePreferenceController.java
@@ -93,7 +93,7 @@
 
     @VisibleForTesting
     boolean isSupportEndItem() {
-        return isConnectedBLEDevice();
+        return getWorker() != null && getWorker().isBroadcastSupported() && isConnectedBLEDevice();
     }
 
     private boolean isConnectedBLEDevice() {
diff --git a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorWorkerTest.java b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorWorkerTest.java
index 2339f4c..cd06bae 100644
--- a/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorWorkerTest.java
+++ b/tests/robotests/src/com/android/settings/media/MediaOutputIndicatorWorkerTest.java
@@ -38,11 +38,14 @@
 import android.media.session.PlaybackState;
 import android.net.Uri;
 
+import com.android.settings.bluetooth.Utils;
 import com.android.settings.slices.ShadowSliceBackgroundWorker;
 import com.android.settings.testutils.shadow.ShadowBluetoothAdapter;
 import com.android.settings.testutils.shadow.ShadowBluetoothUtils;
 import com.android.settingslib.bluetooth.BluetoothEventManager;
+import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
+import com.android.settingslib.bluetooth.LocalBluetoothProfileManager;
 import com.android.settingslib.media.LocalMediaManager;
 
 import org.junit.Before;
@@ -69,13 +72,17 @@
     @Mock
     private BluetoothEventManager mBluetoothEventManager;
     @Mock
-    private LocalBluetoothManager mLocalBluetoothManager;
+    private LocalBluetoothManager mLocalBtManager;
+    @Mock
+    private LocalBluetoothProfileManager mLocalBluetoothProfileManager;
     @Mock
     private MediaSessionManager mMediaSessionManager;
     @Mock
     private MediaController mMediaController;
     @Mock
     private LocalMediaManager mLocalMediaManager;
+    @Mock
+    private LocalBluetoothLeBroadcast mLeAudioBroadcastProfile;
 
     private Context mContext;
     private MediaOutputIndicatorWorker mMediaOutputIndicatorWorker;
@@ -84,14 +91,18 @@
     private List<MediaController> mMediaControllers = new ArrayList<>();
     private PlaybackState mPlaybackState;
     private MediaController.PlaybackInfo mPlaybackInfo;
+    private LocalBluetoothManager mLocalBluetoothManager;
 
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
         mShadowApplication = ShadowApplication.getInstance();
         mContext = spy(RuntimeEnvironment.application);
-        ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBluetoothManager;
+        ShadowBluetoothUtils.sLocalBluetoothManager = mLocalBtManager;
+        mLocalBluetoothManager = Utils.getLocalBtManager(mContext);
         when(mLocalBluetoothManager.getEventManager()).thenReturn(mBluetoothEventManager);
+        when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager);
+        when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn(null);
         mMediaOutputIndicatorWorker = new MediaOutputIndicatorWorker(mContext, URI);
         doReturn(mMediaSessionManager).when(mContext).getSystemService(MediaSessionManager.class);
         mMediaControllers.add(mMediaController);
@@ -284,4 +295,22 @@
 
         assertThat(mMediaOutputIndicatorWorker.getActiveLocalMediaController()).isNull();
     }
+
+    @Test
+    public void isBroadcastSupported_leAudioBroadcastProfileIsNull_returnFalse() {
+        mMediaOutputIndicatorWorker.mLocalMediaManager = mLocalMediaManager;
+        mMediaOutputIndicatorWorker.onSlicePinned();
+
+        assertThat(mMediaOutputIndicatorWorker.isBroadcastSupported()).isFalse();
+    }
+
+    @Test
+    public void isBroadcastSupported_leAudioBroadcastProfileNotNull_returnTrue() {
+        mMediaOutputIndicatorWorker.mLocalMediaManager = mLocalMediaManager;
+        mMediaOutputIndicatorWorker.onSlicePinned();
+        when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile())
+                .thenReturn(mLeAudioBroadcastProfile);
+
+        assertThat(mMediaOutputIndicatorWorker.isBroadcastSupported()).isTrue();
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
index 56e83bb..2d023d7 100644
--- a/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/MediaVolumePreferenceControllerTest.java
@@ -113,13 +113,23 @@
 
     @Test
     public void isSupportEndItem_withBleDevice_returnsTrue() {
+        doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
 
         assertThat(mController.isSupportEndItem()).isTrue();
     }
 
     @Test
+    public void isSupportEndItem_notSupportedBroadcast_returnsFalse() {
+        doReturn(false).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
+        doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
+
+        assertThat(mController.isSupportEndItem()).isFalse();
+    }
+
+    @Test
     public void isSupportEndItem_withNonBleDevice_returnsFalse() {
+        doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(mDevice2).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
 
         assertThat(mController.isSupportEndItem()).isFalse();
@@ -127,6 +137,7 @@
 
     @Test
     public void getSliceEndItem_NotSupportEndItem_getsNullSliceAction() {
+        doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(mDevice2).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
 
         final SliceAction sliceAction = mController.getSliceEndItem(mContext);
@@ -136,6 +147,7 @@
 
     @Test
     public void getSliceEndItem_deviceIsBroadcasting_getsBroadcastIntent() {
+        doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(mDevice1).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
         doReturn(true).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
         doReturn(mMediaController).when(sMediaOutputIndicatorWorker)
@@ -155,6 +167,7 @@
         final CachedBluetoothDevice cachedDevice = mock(CachedBluetoothDevice.class);
         when(((BluetoothMediaDevice) device).getCachedDevice()).thenReturn(cachedDevice);
         when(device.isBLEDevice()).thenReturn(true);
+        doReturn(true).when(sMediaOutputIndicatorWorker).isBroadcastSupported();
         doReturn(device).when(sMediaOutputIndicatorWorker).getCurrentConnectedMediaDevice();
         doReturn(false).when(sMediaOutputIndicatorWorker).isDeviceBroadcasting();
         doReturn(mMediaController).when(sMediaOutputIndicatorWorker)