Merge "[Output Switcher] Handle muting expected device" into tm-dev

This commit is contained in:
Shaowei Shen
2022-06-10 03:44:58 +00:00
committed by Android (Google) Code Review
10 changed files with 129 additions and 34 deletions

View File

@@ -439,7 +439,7 @@ public abstract class MediaDevice implements Comparable<MediaDevice> {
* Check if it is muting expected device * Check if it is muting expected device
* @return {@code true} if it is muting expected device, otherwise return {@code false} * @return {@code true} if it is muting expected device, otherwise return {@code false}
*/ */
protected boolean isMutingExpectedDevice() { public boolean isMutingExpectedDevice() {
return false; return false;
} }

View File

@@ -107,6 +107,7 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
@Override @Override
void onBind(MediaDevice device, boolean topMargin, boolean bottomMargin, int position) { void onBind(MediaDevice device, boolean topMargin, boolean bottomMargin, int position) {
super.onBind(device, topMargin, bottomMargin, position); super.onBind(device, topMargin, bottomMargin, position);
boolean isMutingExpectedDeviceExist = mController.hasMutingExpectedDevice();
final boolean currentlyConnected = !mIncludeDynamicGroup final boolean currentlyConnected = !mIncludeDynamicGroup
&& isCurrentlyConnected(device); && isCurrentlyConnected(device);
boolean isCurrentSeekbarInvisible = mSeekBar.getVisibility() == View.GONE; boolean isCurrentSeekbarInvisible = mSeekBar.getVisibility() == View.GONE;
@@ -146,7 +147,19 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
} }
} else { } else {
// Set different layout for each device // 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); setUpDeviceIcon(device);
mStatusIcon.setImageDrawable( mStatusIcon.setImageDrawable(
mContext.getDrawable(R.drawable.media_output_status_failed)); mContext.getDrawable(R.drawable.media_output_status_failed));
@@ -193,17 +206,26 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
mEndTouchArea.setImportantForAccessibility( mEndTouchArea.setImportantForAccessibility(
View.IMPORTANT_FOR_ACCESSIBILITY_YES); View.IMPORTANT_FOR_ACCESSIBILITY_YES);
setUpContentDescriptionForView(mEndTouchArea, true, device); setUpContentDescriptionForView(mEndTouchArea, true, device);
} else if (!mController.hasAdjustVolumeUserRestriction() && currentlyConnected) { } else if (!mController.hasAdjustVolumeUserRestriction()
mTitleIcon.setImageDrawable( && currentlyConnected) {
mContext.getDrawable(R.drawable.media_output_icon_volume)); if (isMutingExpectedDeviceExist
mTitleIcon.setColorFilter(mController.getColorItemContent()); && !mController.isCurrentConnectedDeviceRemote()) {
mTitleText.setTextColor(mController.getColorItemContent()); // mark as disconnected and set special click listener
setSingleLineLayout(getItemTitle(device), true /* bFocused */, setUpDeviceIcon(device);
true /* showSeekBar */, setSingleLineLayout(getItemTitle(device), false /* bFocused */);
false /* showProgressBar */, false /* showStatus */); mContainerLayout.setOnClickListener(v -> cancelMuteAwaitConnection());
initSeekbar(device, isCurrentSeekbarInvisible); } else {
setUpContentDescriptionForView(mContainerLayout, false, device); mTitleIcon.setImageDrawable(
mCurrentActivePosition = position; 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)) { } else if (isDeviceIncluded(mController.getSelectableMediaDevice(), device)) {
setUpDeviceIcon(device); setUpDeviceIcon(device);
mCheckBox.setOnCheckedChangeListener(null); mCheckBox.setOnCheckedChangeListener(null);
@@ -269,6 +291,11 @@ public class MediaOutputAdapter extends MediaOutputBaseAdapter {
notifyDataSetChanged(); notifyDataSetChanged();
} }
private void cancelMuteAwaitConnection() {
mController.cancelMuteAwaitConnection();
notifyDataSetChanged();
}
private void setUpContentDescriptionForView(View view, boolean clickable, private void setUpContentDescriptionForView(View view, boolean clickable,
MediaDevice device) { MediaDevice device) {
view.setClickable(clickable); view.setClickable(clickable);

View File

@@ -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() { void initSessionSeekbar() {
disableSeekBar(); disableSeekBar();
mSeekBar.setMax(mController.getSessionVolumeMax()); mSeekBar.setMax(mController.getSessionVolumeMax());

View File

@@ -17,6 +17,7 @@
package com.android.systemui.media.dialog package com.android.systemui.media.dialog
import android.content.Context import android.content.Context
import android.media.AudioManager
import android.media.session.MediaSessionManager import android.media.session.MediaSessionManager
import android.view.View import android.view.View
import com.android.internal.logging.UiEventLogger import com.android.internal.logging.UiEventLogger
@@ -41,7 +42,8 @@ class MediaOutputBroadcastDialogFactory @Inject constructor(
private val notifCollection: CommonNotifCollection, private val notifCollection: CommonNotifCollection,
private val uiEventLogger: UiEventLogger, private val uiEventLogger: UiEventLogger,
private val dialogLaunchAnimator: DialogLaunchAnimator, private val dialogLaunchAnimator: DialogLaunchAnimator,
private val nearbyMediaDevicesManagerOptional: Optional<NearbyMediaDevicesManager> private val nearbyMediaDevicesManagerOptional: Optional<NearbyMediaDevicesManager>,
private val audioManager: AudioManager
) { ) {
var mediaOutputBroadcastDialog: MediaOutputBroadcastDialog? = null var mediaOutputBroadcastDialog: MediaOutputBroadcastDialog? = null
@@ -52,7 +54,7 @@ class MediaOutputBroadcastDialogFactory @Inject constructor(
val controller = MediaOutputController(context, packageName, val controller = MediaOutputController(context, packageName,
mediaSessionManager, lbm, starter, notifCollection, mediaSessionManager, lbm, starter, notifCollection,
dialogLaunchAnimator, nearbyMediaDevicesManagerOptional) dialogLaunchAnimator, nearbyMediaDevicesManagerOptional, audioManager)
val dialog = val dialog =
MediaOutputBroadcastDialog(context, aboveStatusBar, broadcastSender, controller) MediaOutputBroadcastDialog(context, aboveStatusBar, broadcastSender, controller)
mediaOutputBroadcastDialog = dialog mediaOutputBroadcastDialog = dialog

View File

@@ -34,6 +34,7 @@ import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.media.AudioManager;
import android.media.INearbyMediaDevicesUpdateCallback; import android.media.INearbyMediaDevicesUpdateCallback;
import android.media.MediaMetadata; import android.media.MediaMetadata;
import android.media.MediaRoute2Info; import android.media.MediaRoute2Info;
@@ -112,6 +113,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
@VisibleForTesting @VisibleForTesting
final List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>(); final List<MediaDevice> mMediaDevices = new CopyOnWriteArrayList<>();
final List<MediaDevice> mCachedMediaDevices = new CopyOnWriteArrayList<>(); final List<MediaDevice> mCachedMediaDevices = new CopyOnWriteArrayList<>();
private final AudioManager mAudioManager;
private final NearbyMediaDevicesManager mNearbyMediaDevicesManager; private final NearbyMediaDevicesManager mNearbyMediaDevicesManager;
private final Map<String, Integer> mNearbyDeviceInfoMap = new ConcurrentHashMap<>(); private final Map<String, Integer> mNearbyDeviceInfoMap = new ConcurrentHashMap<>();
@@ -122,7 +124,6 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
Callback mCallback; Callback mCallback;
@VisibleForTesting @VisibleForTesting
LocalMediaManager mLocalMediaManager; LocalMediaManager mLocalMediaManager;
private MediaOutputMetricLogger mMetricLogger; private MediaOutputMetricLogger mMetricLogger;
private int mColorItemContent; private int mColorItemContent;
@@ -145,13 +146,15 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
lbm, ActivityStarter starter, lbm, ActivityStarter starter,
CommonNotifCollection notifCollection, CommonNotifCollection notifCollection,
DialogLaunchAnimator dialogLaunchAnimator, DialogLaunchAnimator dialogLaunchAnimator,
Optional<NearbyMediaDevicesManager> nearbyMediaDevicesManagerOptional) { Optional<NearbyMediaDevicesManager> nearbyMediaDevicesManagerOptional,
AudioManager audioManager) {
mContext = context; mContext = context;
mPackageName = packageName; mPackageName = packageName;
mMediaSessionManager = mediaSessionManager; mMediaSessionManager = mediaSessionManager;
mLocalBluetoothManager = lbm; mLocalBluetoothManager = lbm;
mActivityStarter = starter; mActivityStarter = starter;
mNotifCollection = notifCollection; mNotifCollection = notifCollection;
mAudioManager = audioManager;
InfoMediaManager imm = new InfoMediaManager(mContext, packageName, null, lbm); InfoMediaManager imm = new InfoMediaManager(mContext, packageName, null, lbm);
mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, packageName); mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, packageName);
mMetricLogger = new MediaOutputMetricLogger(mContext, mPackageName); mMetricLogger = new MediaOutputMetricLogger(mContext, mPackageName);
@@ -217,14 +220,14 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
return false; return false;
} }
void setRefreshing(boolean refreshing) {
mIsRefreshing = refreshing;
}
boolean isRefreshing() { boolean isRefreshing() {
return mIsRefreshing; return mIsRefreshing;
} }
void setRefreshing(boolean refreshing) {
mIsRefreshing = refreshing;
}
void stop() { void stop() {
if (mMediaController != null) { if (mMediaController != null) {
mMediaController.unregisterCallback(mCb); mMediaController.unregisterCallback(mCb);
@@ -275,6 +278,27 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
mMetricLogger.logOutputFailure(new ArrayList<>(mMediaDevices), reason); 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() { Drawable getAppSourceIcon() {
if (mPackageName.isEmpty()) { if (mPackageName.isEmpty()) {
return null; 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 // For the first time building list, to make sure the top device is the connected
// device. // device.
if (mMediaDevices.isEmpty()) { if (mMediaDevices.isEmpty()) {
final MediaDevice connectedMediaDevice = getCurrentConnectedMediaDevice(); boolean needToHandleMutingExpectedDevice =
hasMutingExpectedDevice() && !isCurrentConnectedDeviceRemote();
final MediaDevice connectedMediaDevice =
needToHandleMutingExpectedDevice ? null
: getCurrentConnectedMediaDevice();
if (connectedMediaDevice == null) { if (connectedMediaDevice == null) {
if (DEBUG) { 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; return;
} }
for (MediaDevice device : devices) { 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<MediaDevice> getGroupMediaDevices() { List<MediaDevice> getGroupMediaDevices() {
final List<MediaDevice> selectedDevices = getSelectedMediaDevice(); final List<MediaDevice> selectedDevices = getSelectedMediaDevice();
final List<MediaDevice> selectableDevices = getSelectableMediaDevice(); final List<MediaDevice> selectableDevices = getSelectableMediaDevice();
@@ -731,7 +775,8 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
void launchMediaOutputBroadcastDialog(View mediaOutputDialog, BroadcastSender broadcastSender) { void launchMediaOutputBroadcastDialog(View mediaOutputDialog, BroadcastSender broadcastSender) {
MediaOutputController controller = new MediaOutputController(mContext, mPackageName, MediaOutputController controller = new MediaOutputController(mContext, mPackageName,
mMediaSessionManager, mLocalBluetoothManager, mActivityStarter, mMediaSessionManager, mLocalBluetoothManager, mActivityStarter,
mNotifCollection, mDialogLaunchAnimator, Optional.of(mNearbyMediaDevicesManager)); mNotifCollection, mDialogLaunchAnimator, Optional.of(mNearbyMediaDevicesManager),
mAudioManager);
MediaOutputBroadcastDialog dialog = new MediaOutputBroadcastDialog(mContext, true, MediaOutputBroadcastDialog dialog = new MediaOutputBroadcastDialog(mContext, true,
broadcastSender, controller); broadcastSender, controller);
mDialogLaunchAnimator.showFromView(dialog, mediaOutputDialog); mDialogLaunchAnimator.showFromView(dialog, mediaOutputDialog);

View File

@@ -17,6 +17,7 @@
package com.android.systemui.media.dialog package com.android.systemui.media.dialog
import android.content.Context import android.content.Context
import android.media.AudioManager
import android.media.session.MediaSessionManager import android.media.session.MediaSessionManager
import android.view.View import android.view.View
import com.android.internal.logging.UiEventLogger import com.android.internal.logging.UiEventLogger
@@ -41,7 +42,8 @@ class MediaOutputDialogFactory @Inject constructor(
private val notifCollection: CommonNotifCollection, private val notifCollection: CommonNotifCollection,
private val uiEventLogger: UiEventLogger, private val uiEventLogger: UiEventLogger,
private val dialogLaunchAnimator: DialogLaunchAnimator, private val dialogLaunchAnimator: DialogLaunchAnimator,
private val nearbyMediaDevicesManagerOptional: Optional<NearbyMediaDevicesManager> private val nearbyMediaDevicesManagerOptional: Optional<NearbyMediaDevicesManager>,
private val audioManager: AudioManager
) { ) {
companion object { companion object {
var mediaOutputDialog: MediaOutputDialog? = null var mediaOutputDialog: MediaOutputDialog? = null
@@ -54,7 +56,7 @@ class MediaOutputDialogFactory @Inject constructor(
val controller = MediaOutputController(context, packageName, val controller = MediaOutputController(context, packageName,
mediaSessionManager, lbm, starter, notifCollection, mediaSessionManager, lbm, starter, notifCollection,
dialogLaunchAnimator, nearbyMediaDevicesManagerOptional) dialogLaunchAnimator, nearbyMediaDevicesManagerOptional, audioManager)
val dialog = val dialog =
MediaOutputDialog(context, aboveStatusBar, broadcastSender, controller, uiEventLogger) MediaOutputDialog(context, aboveStatusBar, broadcastSender, controller, uiEventLogger)
mediaOutputDialog = dialog mediaOutputDialog = dialog

View File

@@ -27,6 +27,7 @@ import static org.mockito.Mockito.when;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.media.AudioManager;
import android.media.session.MediaController; import android.media.session.MediaController;
import android.media.session.MediaSessionManager; import android.media.session.MediaSessionManager;
import android.media.session.PlaybackState; import android.media.session.PlaybackState;
@@ -84,6 +85,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
private NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( private NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock(
NearbyMediaDevicesManager.class); NearbyMediaDevicesManager.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private final AudioManager mAudioManager = mock(AudioManager.class);
private List<MediaController> mMediaControllers = new ArrayList<>(); private List<MediaController> mMediaControllers = new ArrayList<>();
private MediaOutputBaseDialogImpl mMediaOutputBaseDialogImpl; private MediaOutputBaseDialogImpl mMediaOutputBaseDialogImpl;
@@ -108,7 +110,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE,
mMediaSessionManager, mLocalBluetoothManager, mStarter, mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotificationEntryManager, mDialogLaunchAnimator, mNotificationEntryManager, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager)); Optional.of(mNearbyMediaDevicesManager), mAudioManager);
mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext, mBroadcastSender, mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext, mBroadcastSender,
mMediaOutputController); mMediaOutputController);
mMediaOutputBaseDialogImpl.onCreate(new Bundle()); mMediaOutputBaseDialogImpl.onCreate(new Bundle());

View File

@@ -31,6 +31,7 @@ import static org.mockito.Mockito.when;
import android.app.Notification; import android.app.Notification;
import android.content.Context; import android.content.Context;
import android.graphics.drawable.Icon; import android.graphics.drawable.Icon;
import android.media.AudioManager;
import android.media.MediaDescription; import android.media.MediaDescription;
import android.media.MediaMetadata; import android.media.MediaMetadata;
import android.media.NearbyDevice; import android.media.NearbyDevice;
@@ -95,6 +96,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
private MediaMetadata mMediaMetadata = mock(MediaMetadata.class); private MediaMetadata mMediaMetadata = mock(MediaMetadata.class);
private RoutingSessionInfo mRemoteSessionInfo = mock(RoutingSessionInfo.class); private RoutingSessionInfo mRemoteSessionInfo = mock(RoutingSessionInfo.class);
private ActivityStarter mStarter = mock(ActivityStarter.class); private ActivityStarter mStarter = mock(ActivityStarter.class);
private AudioManager mAudioManager = mock(AudioManager.class);
private CommonNotifCollection mNotifCollection = mock(CommonNotifCollection.class); private CommonNotifCollection mNotifCollection = mock(CommonNotifCollection.class);
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private final NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( private final NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock(
@@ -123,7 +125,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME, mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME,
mMediaSessionManager, mLocalBluetoothManager, mStarter, mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotifCollection, mDialogLaunchAnimator, mNotifCollection, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager)); Optional.of(mNearbyMediaDevicesManager), mAudioManager);
mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager); mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager);
mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
MediaDescription.Builder builder = new MediaDescription.Builder(); MediaDescription.Builder builder = new MediaDescription.Builder();
@@ -175,7 +177,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
mMediaOutputController = new MediaOutputController(mSpyContext, null, mMediaOutputController = new MediaOutputController(mSpyContext, null,
mMediaSessionManager, mLocalBluetoothManager, mStarter, mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotifCollection, mDialogLaunchAnimator, mNotifCollection, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager)); Optional.of(mNearbyMediaDevicesManager), mAudioManager);
mMediaOutputController.start(mCb); mMediaOutputController.start(mCb);
@@ -204,7 +206,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
mMediaOutputController = new MediaOutputController(mSpyContext, null, mMediaOutputController = new MediaOutputController(mSpyContext, null,
mMediaSessionManager, mLocalBluetoothManager, mStarter, mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotifCollection, mDialogLaunchAnimator, mNotifCollection, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager)); Optional.of(mNearbyMediaDevicesManager), mAudioManager);
mMediaOutputController.start(mCb); mMediaOutputController.start(mCb);
@@ -509,7 +511,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
mMediaOutputController = new MediaOutputController(mSpyContext, null, mMediaOutputController = new MediaOutputController(mSpyContext, null,
mMediaSessionManager, mLocalBluetoothManager, mStarter, mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotifCollection, mDialogLaunchAnimator, mNotifCollection, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager)); Optional.of(mNearbyMediaDevicesManager), mAudioManager);
assertThat(mMediaOutputController.getNotificationIcon()).isNull(); assertThat(mMediaOutputController.getNotificationIcon()).isNull();
} }

View File

@@ -24,6 +24,7 @@ import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.media.AudioManager;
import android.media.MediaRoute2Info; import android.media.MediaRoute2Info;
import android.media.session.MediaController; import android.media.session.MediaController;
import android.media.session.MediaSessionManager; import android.media.session.MediaSessionManager;
@@ -82,6 +83,7 @@ public class MediaOutputDialogTest extends SysuiTestCase {
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private final NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( private final NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock(
NearbyMediaDevicesManager.class); NearbyMediaDevicesManager.class);
private final AudioManager mAudioManager = mock(AudioManager.class);
private List<MediaController> mMediaControllers = new ArrayList<>(); private List<MediaController> mMediaControllers = new ArrayList<>();
private MediaOutputDialog mMediaOutputDialog; private MediaOutputDialog mMediaOutputDialog;
@@ -101,7 +103,7 @@ public class MediaOutputDialogTest extends SysuiTestCase {
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE,
mMediaSessionManager, mLocalBluetoothManager, mStarter, mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotificationEntryManager, mDialogLaunchAnimator, mNotificationEntryManager, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager)); Optional.of(mNearbyMediaDevicesManager), mAudioManager);
mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
mMediaOutputDialog = new MediaOutputDialog(mContext, false, mBroadcastSender, mMediaOutputDialog = new MediaOutputDialog(mContext, false, mBroadcastSender,
mMediaOutputController, mUiEventLogger); mMediaOutputController, mUiEventLogger);

View File

@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.media.AudioManager;
import android.media.session.MediaSessionManager; import android.media.session.MediaSessionManager;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.testing.TestableLooper;
@@ -68,6 +69,7 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase {
private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class);
private NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( private NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock(
NearbyMediaDevicesManager.class); NearbyMediaDevicesManager.class);
private final AudioManager mAudioManager = mock(AudioManager.class);
private MediaOutputGroupDialog mMediaOutputGroupDialog; private MediaOutputGroupDialog mMediaOutputGroupDialog;
private MediaOutputController mMediaOutputController; private MediaOutputController mMediaOutputController;
@@ -78,7 +80,7 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase {
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE,
mMediaSessionManager, mLocalBluetoothManager, mStarter, mMediaSessionManager, mLocalBluetoothManager, mStarter,
mNotificationEntryManager, mDialogLaunchAnimator, mNotificationEntryManager, mDialogLaunchAnimator,
Optional.of(mNearbyMediaDevicesManager)); Optional.of(mNearbyMediaDevicesManager), mAudioManager);
mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
mMediaOutputGroupDialog = new MediaOutputGroupDialog(mContext, false, mBroadcastSender, mMediaOutputGroupDialog = new MediaOutputGroupDialog(mContext, false, mBroadcastSender,
mMediaOutputController); mMediaOutputController);