diff --git a/packages/SystemUI/res/layout/media_output_dialog.xml b/packages/SystemUI/res/layout/media_output_dialog.xml index eb43853abdecd..93c16e4e119db 100644 --- a/packages/SystemUI/res/layout/media_output_dialog.xml +++ b/packages/SystemUI/res/layout/media_output_dialog.xml @@ -42,12 +42,35 @@ android:layout_height="wrap_content" android:paddingStart="12dp" android:orientation="vertical"> - + android:orientation="horizontal"> + + + + + + onStopButtonClick()); + + mBroadcastIcon.setVisibility(getBroadcastIconVisibility()); + mBroadcastIcon.setOnClickListener(v -> onBroadcastIconClick()); } private void updateButtonBackgroundColorFilter() { @@ -490,6 +495,14 @@ public abstract class MediaOutputBaseDialog extends SystemUIDialog implements dismiss(); } + public int getBroadcastIconVisibility() { + return View.GONE; + } + + public void onBroadcastIconClick() { + // Do nothing. + } + public boolean isBroadcastSupported() { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java index 0c9a8d7d16197..9fb96b56c32c5 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialog.java @@ -134,6 +134,17 @@ public class MediaOutputDialog extends MediaOutputBaseDialog { } } + @Override + public int getBroadcastIconVisibility() { + return (isBroadcastSupported() && mMediaOutputController.isBluetoothLeBroadcastEnabled()) + ? View.VISIBLE : View.GONE; + } + + @Override + public void onBroadcastIconClick() { + startLeBroadcastDialog(); + } + @VisibleForTesting public enum MediaOutputEvent implements UiEventLogger.UiEventEnum { @UiEvent(doc = "The MediaOutput dialog became visible on the screen.") diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java index 9eaa20c2afedb..d414660018a8c 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputBaseDialogTest.java @@ -43,6 +43,8 @@ import android.widget.TextView; import androidx.core.graphics.drawable.IconCompat; import androidx.test.filters.SmallTest; +import com.android.settingslib.bluetooth.CachedBluetoothDevice; +import com.android.settingslib.bluetooth.CachedBluetoothDeviceManager; import com.android.settingslib.bluetooth.LocalBluetoothLeBroadcast; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothProfileManager; @@ -98,10 +100,17 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { private CharSequence mHeaderSubtitle; private String mStopText; private boolean mIsBroadcasting; + private boolean mIsBroadcastIconVisibility; + @Before public void setUp() { when(mLocalBluetoothManager.getProfileManager()).thenReturn(mLocalBluetoothProfileManager); + final CachedBluetoothDeviceManager cachedBluetoothDeviceManager = mock( + CachedBluetoothDeviceManager.class); + when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn( + cachedBluetoothDeviceManager); + when(cachedBluetoothDeviceManager.findDevice(any())).thenReturn(null); when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn(null); when(mMediaController.getPlaybackState()).thenReturn(mPlaybackState); when(mPlaybackState.getState()).thenReturn(PlaybackState.STATE_NONE); @@ -152,6 +161,27 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { assertThat(view.getVisibility()).isEqualTo(View.GONE); } + @Test + public void refresh_broadcastIconVisibilityOff_broadcastIconLayoutNotVisible() { + mIsBroadcastIconVisibility = false; + + mMediaOutputBaseDialogImpl.refresh(); + final ImageView view = mMediaOutputBaseDialogImpl.mDialogView.requireViewById( + R.id.broadcast_icon); + + assertThat(view.getVisibility()).isEqualTo(View.GONE); + } + @Test + public void refresh_broadcastIconVisibilityOn_broadcastIconLayoutVisible() { + mIsBroadcastIconVisibility = true; + + mMediaOutputBaseDialogImpl.refresh(); + final ImageView view = mMediaOutputBaseDialogImpl.mDialogView.requireViewById( + R.id.broadcast_icon); + + assertThat(view.getVisibility()).isEqualTo(View.VISIBLE); + } + @Test public void refresh_checkTitle() { mHeaderTitle = "test_string"; @@ -308,5 +338,10 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { public CharSequence getStopButtonText() { return mStopText; } + + @Override + public int getBroadcastIconVisibility() { + return mIsBroadcastIconVisibility ? View.VISIBLE : View.GONE; + } } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java index c45db05baceea..6afed1a846b07 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputDialogTest.java @@ -171,6 +171,39 @@ public class MediaOutputDialogTest extends SysuiTestCase { assertThat(mMediaOutputDialog.getStopButtonVisibility()).isEqualTo(View.GONE); } + @Test + public void getBroadcastIconVisibility_isBroadcasting_returnVisible() { + when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn( + mLocalBluetoothLeBroadcast); + when(mLocalBluetoothLeBroadcast.isEnabled(any())).thenReturn(true); + when(mPlaybackState.getState()).thenReturn(PlaybackState.STATE_PLAYING); + when(mMediaDevice.isBLEDevice()).thenReturn(true); + + assertThat(mMediaOutputDialog.getBroadcastIconVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void getBroadcastIconVisibility_noBroadcasting_returnGone() { + when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn( + mLocalBluetoothLeBroadcast); + when(mLocalBluetoothLeBroadcast.isEnabled(any())).thenReturn(false); + when(mPlaybackState.getState()).thenReturn(PlaybackState.STATE_PLAYING); + when(mMediaDevice.isBLEDevice()).thenReturn(true); + + assertThat(mMediaOutputDialog.getBroadcastIconVisibility()).isEqualTo(View.GONE); + } + + @Test + public void getBroadcastIconVisibility_remoteNonLeDevice_returnGone() { + when(mLocalBluetoothProfileManager.getLeAudioBroadcastProfile()).thenReturn( + mLocalBluetoothLeBroadcast); + when(mLocalBluetoothLeBroadcast.isEnabled(any())).thenReturn(false); + when(mPlaybackState.getState()).thenReturn(PlaybackState.STATE_PLAYING); + when(mMediaDevice.isBLEDevice()).thenReturn(false); + + assertThat(mMediaOutputDialog.getBroadcastIconVisibility()).isEqualTo(View.GONE); + } + @Test // Check the visibility metric logging by creating a new MediaOutput dialog, // and verify if the calling times increases.