From 0b289fe7810ebdb1c1162c734ea3f9d0d0bebe79 Mon Sep 17 00:00:00 2001 From: shaoweishen Date: Thu, 26 May 2022 03:36:46 +0000 Subject: [PATCH] [Output Switcher] Handle muting expected device Update layout based on muting expected device status. Bug: 232334343 Test: Verified on device Change-Id: If48e0ed486a3fc0edfc58ecf09a207bb466c4faa --- .../settingslib/media/MediaDevice.java | 2 +- .../media/dialog/MediaOutputAdapter.java | 51 +++++++++++---- .../media/dialog/MediaOutputBaseAdapter.java | 11 ++++ .../MediaOutputBroadcastDialogFactory.kt | 6 +- .../media/dialog/MediaOutputController.java | 65 ++++++++++++++++--- .../media/dialog/MediaOutputDialogFactory.kt | 6 +- .../dialog/MediaOutputBaseDialogTest.java | 4 +- .../dialog/MediaOutputControllerTest.java | 10 +-- .../media/dialog/MediaOutputDialogTest.java | 4 +- .../dialog/MediaOutputGroupDialogTest.java | 4 +- 10 files changed, 129 insertions(+), 34 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index 1804e86a98f0d..c29d18872ad01 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -439,7 +439,7 @@ public abstract class MediaDevice implements Comparable { * Check if it is muting expected device * @return {@code true} if it is muting expected device, otherwise return {@code false} */ - protected boolean isMutingExpectedDevice() { + public boolean isMutingExpectedDevice() { return false; } diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java index 24dfeafa0decb..f0ce30d2dc66b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputAdapter.java @@ -107,6 +107,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { @Override void onBind(MediaDevice device, boolean topMargin, boolean bottomMargin, int position) { super.onBind(device, topMargin, bottomMargin, position); + boolean isMutingExpectedDeviceExist = mController.hasMutingExpectedDevice(); final boolean currentlyConnected = !mIncludeDynamicGroup && isCurrentlyConnected(device); boolean isCurrentSeekbarInvisible = mSeekBar.getVisibility() == View.GONE; @@ -146,7 +147,19 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { } } else { // Set different layout for each device - if (device.getState() == MediaDeviceState.STATE_CONNECTING_FAILED) { + if (device.isMutingExpectedDevice() + && !mController.isCurrentConnectedDeviceRemote()) { + mTitleIcon.setImageDrawable( + mContext.getDrawable(R.drawable.media_output_icon_volume)); + mTitleIcon.setColorFilter(mController.getColorItemContent()); + mTitleText.setTextColor(mController.getColorItemContent()); + setSingleLineLayout(getItemTitle(device), true /* bFocused */, + false /* showSeekBar */, + false /* showProgressBar */, false /* showStatus */); + initMutingExpectedDevice(); + mCurrentActivePosition = position; + mContainerLayout.setOnClickListener(v -> onItemClick(v, device)); + } else if (device.getState() == MediaDeviceState.STATE_CONNECTING_FAILED) { setUpDeviceIcon(device); mStatusIcon.setImageDrawable( mContext.getDrawable(R.drawable.media_output_status_failed)); @@ -193,17 +206,26 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { mEndTouchArea.setImportantForAccessibility( View.IMPORTANT_FOR_ACCESSIBILITY_YES); setUpContentDescriptionForView(mEndTouchArea, true, device); - } else if (!mController.hasAdjustVolumeUserRestriction() && currentlyConnected) { - mTitleIcon.setImageDrawable( - mContext.getDrawable(R.drawable.media_output_icon_volume)); - mTitleIcon.setColorFilter(mController.getColorItemContent()); - mTitleText.setTextColor(mController.getColorItemContent()); - setSingleLineLayout(getItemTitle(device), true /* bFocused */, - true /* showSeekBar */, - false /* showProgressBar */, false /* showStatus */); - initSeekbar(device, isCurrentSeekbarInvisible); - setUpContentDescriptionForView(mContainerLayout, false, device); - mCurrentActivePosition = position; + } else if (!mController.hasAdjustVolumeUserRestriction() + && currentlyConnected) { + if (isMutingExpectedDeviceExist + && !mController.isCurrentConnectedDeviceRemote()) { + // mark as disconnected and set special click listener + setUpDeviceIcon(device); + setSingleLineLayout(getItemTitle(device), false /* bFocused */); + mContainerLayout.setOnClickListener(v -> cancelMuteAwaitConnection()); + } else { + mTitleIcon.setImageDrawable( + mContext.getDrawable(R.drawable.media_output_icon_volume)); + mTitleIcon.setColorFilter(mController.getColorItemContent()); + mTitleText.setTextColor(mController.getColorItemContent()); + setSingleLineLayout(getItemTitle(device), true /* bFocused */, + true /* showSeekBar */, + false /* showProgressBar */, false /* showStatus */); + initSeekbar(device, isCurrentSeekbarInvisible); + setUpContentDescriptionForView(mContainerLayout, false, device); + mCurrentActivePosition = position; + } } else if (isDeviceIncluded(mController.getSelectableMediaDevice(), device)) { setUpDeviceIcon(device); mCheckBox.setOnCheckedChangeListener(null); @@ -269,6 +291,11 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter { notifyDataSetChanged(); } + private void cancelMuteAwaitConnection() { + mController.cancelMuteAwaitConnection(); + notifyDataSetChanged(); + } + private void setUpContentDescriptionForView(View view, boolean clickable, MediaDevice device) { view.setClickable(clickable); diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java index b407e76f1b116..ccc0a3db06118 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBaseAdapter.java @@ -309,6 +309,17 @@ public abstract class MediaOutputBaseAdapter extends }); } + void initMutingExpectedDevice() { + disableSeekBar(); + final Drawable backgroundDrawable = mContext.getDrawable( + R.drawable.media_output_item_background_active) + .mutate(); + backgroundDrawable.setColorFilter( + new PorterDuffColorFilter(mController.getColorConnectedItemBackground(), + PorterDuff.Mode.SRC_IN)); + mItemLayout.setBackground(backgroundDrawable); + } + void initSessionSeekbar() { disableSeekBar(); mSeekBar.setMax(mController.getSessionVolumeMax()); diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogFactory.kt b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogFactory.kt index 31266b6dc8ec7..38005db28cf61 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputBroadcastDialogFactory.kt @@ -17,6 +17,7 @@ package com.android.systemui.media.dialog import android.content.Context +import android.media.AudioManager import android.media.session.MediaSessionManager import android.view.View import com.android.internal.logging.UiEventLogger @@ -41,7 +42,8 @@ class MediaOutputBroadcastDialogFactory @Inject constructor( private val notifCollection: CommonNotifCollection, private val uiEventLogger: UiEventLogger, private val dialogLaunchAnimator: DialogLaunchAnimator, - private val nearbyMediaDevicesManagerOptional: Optional + private val nearbyMediaDevicesManagerOptional: Optional, + private val audioManager: AudioManager ) { var mediaOutputBroadcastDialog: MediaOutputBroadcastDialog? = null @@ -52,7 +54,7 @@ class MediaOutputBroadcastDialogFactory @Inject constructor( val controller = MediaOutputController(context, packageName, mediaSessionManager, lbm, starter, notifCollection, - dialogLaunchAnimator, nearbyMediaDevicesManagerOptional) + dialogLaunchAnimator, nearbyMediaDevicesManagerOptional, audioManager) val dialog = MediaOutputBroadcastDialog(context, aboveStatusBar, broadcastSender, controller) mediaOutputBroadcastDialog = dialog diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java index 9329b1bfc2a3a..e372be3d18fc3 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java @@ -34,6 +34,7 @@ import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; +import android.media.AudioManager; import android.media.INearbyMediaDevicesUpdateCallback; import android.media.MediaMetadata; import android.media.MediaRoute2Info; @@ -112,6 +113,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, @VisibleForTesting final List mMediaDevices = new CopyOnWriteArrayList<>(); final List mCachedMediaDevices = new CopyOnWriteArrayList<>(); + private final AudioManager mAudioManager; private final NearbyMediaDevicesManager mNearbyMediaDevicesManager; private final Map mNearbyDeviceInfoMap = new ConcurrentHashMap<>(); @@ -122,7 +124,6 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, Callback mCallback; @VisibleForTesting LocalMediaManager mLocalMediaManager; - private MediaOutputMetricLogger mMetricLogger; private int mColorItemContent; @@ -145,13 +146,15 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, lbm, ActivityStarter starter, CommonNotifCollection notifCollection, DialogLaunchAnimator dialogLaunchAnimator, - Optional nearbyMediaDevicesManagerOptional) { + Optional nearbyMediaDevicesManagerOptional, + AudioManager audioManager) { mContext = context; mPackageName = packageName; mMediaSessionManager = mediaSessionManager; mLocalBluetoothManager = lbm; mActivityStarter = starter; mNotifCollection = notifCollection; + mAudioManager = audioManager; InfoMediaManager imm = new InfoMediaManager(mContext, packageName, null, lbm); mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, packageName); mMetricLogger = new MediaOutputMetricLogger(mContext, mPackageName); @@ -217,14 +220,14 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, return false; } - void setRefreshing(boolean refreshing) { - mIsRefreshing = refreshing; - } - boolean isRefreshing() { return mIsRefreshing; } + void setRefreshing(boolean refreshing) { + mIsRefreshing = refreshing; + } + void stop() { if (mMediaController != null) { mMediaController.unregisterCallback(mCb); @@ -275,6 +278,27 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, mMetricLogger.logOutputFailure(new ArrayList<>(mMediaDevices), reason); } + /** + * Checks if there's any muting expected device exist + */ + public boolean hasMutingExpectedDevice() { + return mAudioManager.getMutingExpectedDevice() != null; + } + + /** + * Cancels mute await connection action in follow up request + */ + public void cancelMuteAwaitConnection() { + if (mAudioManager.getMutingExpectedDevice() == null) { + return; + } + try { + mAudioManager.cancelMuteAwaitConnection(mAudioManager.getMutingExpectedDevice()); + } catch (Exception e) { + Log.d(TAG, "Unable to cancel mute await connection"); + } + } + Drawable getAppSourceIcon() { if (mPackageName.isEmpty()) { return null; @@ -471,12 +495,26 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, // For the first time building list, to make sure the top device is the connected // device. if (mMediaDevices.isEmpty()) { - final MediaDevice connectedMediaDevice = getCurrentConnectedMediaDevice(); + boolean needToHandleMutingExpectedDevice = + hasMutingExpectedDevice() && !isCurrentConnectedDeviceRemote(); + final MediaDevice connectedMediaDevice = + needToHandleMutingExpectedDevice ? null + : getCurrentConnectedMediaDevice(); if (connectedMediaDevice == null) { if (DEBUG) { - Log.d(TAG, "No connected media device."); + Log.d(TAG, "No connected media device or muting expected device exist."); + } + if (needToHandleMutingExpectedDevice) { + for (MediaDevice device : devices) { + if (device.isMutingExpectedDevice()) { + mMediaDevices.add(0, device); + } else { + mMediaDevices.add(device); + } + } + } else { + mMediaDevices.addAll(devices); } - mMediaDevices.addAll(devices); return; } for (MediaDevice device : devices) { @@ -516,6 +554,12 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, } + boolean isCurrentConnectedDeviceRemote() { + MediaDevice currentConnectedMediaDevice = getCurrentConnectedMediaDevice(); + return currentConnectedMediaDevice != null && isActiveRemoteDevice( + currentConnectedMediaDevice); + } + List getGroupMediaDevices() { final List selectedDevices = getSelectedMediaDevice(); final List selectableDevices = getSelectableMediaDevice(); @@ -731,7 +775,8 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback, void launchMediaOutputBroadcastDialog(View mediaOutputDialog, BroadcastSender broadcastSender) { MediaOutputController controller = new MediaOutputController(mContext, mPackageName, mMediaSessionManager, mLocalBluetoothManager, mActivityStarter, - mNotifCollection, mDialogLaunchAnimator, Optional.of(mNearbyMediaDevicesManager)); + mNotifCollection, mDialogLaunchAnimator, Optional.of(mNearbyMediaDevicesManager), + mAudioManager); MediaOutputBroadcastDialog dialog = new MediaOutputBroadcastDialog(mContext, true, broadcastSender, controller); mDialogLaunchAnimator.showFromView(dialog, mediaOutputDialog); diff --git a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt index 0d7d60ac59238..36a46f067fb05 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt @@ -17,6 +17,7 @@ package com.android.systemui.media.dialog import android.content.Context +import android.media.AudioManager import android.media.session.MediaSessionManager import android.view.View import com.android.internal.logging.UiEventLogger @@ -41,7 +42,8 @@ class MediaOutputDialogFactory @Inject constructor( private val notifCollection: CommonNotifCollection, private val uiEventLogger: UiEventLogger, private val dialogLaunchAnimator: DialogLaunchAnimator, - private val nearbyMediaDevicesManagerOptional: Optional + private val nearbyMediaDevicesManagerOptional: Optional, + private val audioManager: AudioManager ) { companion object { var mediaOutputDialog: MediaOutputDialog? = null @@ -54,7 +56,7 @@ class MediaOutputDialogFactory @Inject constructor( val controller = MediaOutputController(context, packageName, mediaSessionManager, lbm, starter, notifCollection, - dialogLaunchAnimator, nearbyMediaDevicesManagerOptional) + dialogLaunchAnimator, nearbyMediaDevicesManagerOptional, audioManager) val dialog = MediaOutputDialog(context, aboveStatusBar, broadcastSender, controller, uiEventLogger) mediaOutputDialog = dialog 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 7c53388c81aa2..e3b5059131fab 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 @@ -27,6 +27,7 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.Drawable; +import android.media.AudioManager; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; @@ -84,6 +85,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { private NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( NearbyMediaDevicesManager.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); + private final AudioManager mAudioManager = mock(AudioManager.class); private List mMediaControllers = new ArrayList<>(); private MediaOutputBaseDialogImpl mMediaOutputBaseDialogImpl; @@ -108,7 +110,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, mMediaSessionManager, mLocalBluetoothManager, mStarter, mNotificationEntryManager, mDialogLaunchAnimator, - Optional.of(mNearbyMediaDevicesManager)); + Optional.of(mNearbyMediaDevicesManager), mAudioManager); mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext, mBroadcastSender, mMediaOutputController); mMediaOutputBaseDialogImpl.onCreate(new Bundle()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java index d2dae745bcdcf..edc45ee46dc27 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputControllerTest.java @@ -31,6 +31,7 @@ import static org.mockito.Mockito.when; import android.app.Notification; import android.content.Context; import android.graphics.drawable.Icon; +import android.media.AudioManager; import android.media.MediaDescription; import android.media.MediaMetadata; import android.media.NearbyDevice; @@ -95,6 +96,7 @@ public class MediaOutputControllerTest extends SysuiTestCase { private MediaMetadata mMediaMetadata = mock(MediaMetadata.class); private RoutingSessionInfo mRemoteSessionInfo = mock(RoutingSessionInfo.class); private ActivityStarter mStarter = mock(ActivityStarter.class); + private AudioManager mAudioManager = mock(AudioManager.class); private CommonNotifCollection mNotifCollection = mock(CommonNotifCollection.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private final NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( @@ -123,7 +125,7 @@ public class MediaOutputControllerTest extends SysuiTestCase { mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME, mMediaSessionManager, mLocalBluetoothManager, mStarter, mNotifCollection, mDialogLaunchAnimator, - Optional.of(mNearbyMediaDevicesManager)); + Optional.of(mNearbyMediaDevicesManager), mAudioManager); mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; MediaDescription.Builder builder = new MediaDescription.Builder(); @@ -175,7 +177,7 @@ public class MediaOutputControllerTest extends SysuiTestCase { mMediaOutputController = new MediaOutputController(mSpyContext, null, mMediaSessionManager, mLocalBluetoothManager, mStarter, mNotifCollection, mDialogLaunchAnimator, - Optional.of(mNearbyMediaDevicesManager)); + Optional.of(mNearbyMediaDevicesManager), mAudioManager); mMediaOutputController.start(mCb); @@ -204,7 +206,7 @@ public class MediaOutputControllerTest extends SysuiTestCase { mMediaOutputController = new MediaOutputController(mSpyContext, null, mMediaSessionManager, mLocalBluetoothManager, mStarter, mNotifCollection, mDialogLaunchAnimator, - Optional.of(mNearbyMediaDevicesManager)); + Optional.of(mNearbyMediaDevicesManager), mAudioManager); mMediaOutputController.start(mCb); @@ -509,7 +511,7 @@ public class MediaOutputControllerTest extends SysuiTestCase { mMediaOutputController = new MediaOutputController(mSpyContext, null, mMediaSessionManager, mLocalBluetoothManager, mStarter, mNotifCollection, mDialogLaunchAnimator, - Optional.of(mNearbyMediaDevicesManager)); + Optional.of(mNearbyMediaDevicesManager), mAudioManager); assertThat(mMediaOutputController.getNotificationIcon()).isNull(); } 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 e6ad6edcec45d..6786ad0116ea7 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 @@ -24,6 +24,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import android.media.AudioManager; import android.media.MediaRoute2Info; import android.media.session.MediaController; import android.media.session.MediaSessionManager; @@ -82,6 +83,7 @@ public class MediaOutputDialogTest extends SysuiTestCase { private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private final NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( NearbyMediaDevicesManager.class); + private final AudioManager mAudioManager = mock(AudioManager.class); private List mMediaControllers = new ArrayList<>(); private MediaOutputDialog mMediaOutputDialog; @@ -101,7 +103,7 @@ public class MediaOutputDialogTest extends SysuiTestCase { mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, mMediaSessionManager, mLocalBluetoothManager, mStarter, mNotificationEntryManager, mDialogLaunchAnimator, - Optional.of(mNearbyMediaDevicesManager)); + Optional.of(mNearbyMediaDevicesManager), mAudioManager); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputDialog = new MediaOutputDialog(mContext, false, mBroadcastSender, mMediaOutputController, mUiEventLogger); diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputGroupDialogTest.java b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputGroupDialogTest.java index 0cdde0775b2dc..379bb4fd63366 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputGroupDialogTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/media/dialog/MediaOutputGroupDialogTest.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import android.media.AudioManager; import android.media.session.MediaSessionManager; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -68,6 +69,7 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase { private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( NearbyMediaDevicesManager.class); + private final AudioManager mAudioManager = mock(AudioManager.class); private MediaOutputGroupDialog mMediaOutputGroupDialog; private MediaOutputController mMediaOutputController; @@ -78,7 +80,7 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase { mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, mMediaSessionManager, mLocalBluetoothManager, mStarter, mNotificationEntryManager, mDialogLaunchAnimator, - Optional.of(mNearbyMediaDevicesManager)); + Optional.of(mNearbyMediaDevicesManager), mAudioManager); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputGroupDialog = new MediaOutputGroupDialog(mContext, false, mBroadcastSender, mMediaOutputController);