diff --git a/media/java/android/media/NearbyDevice.java b/media/java/android/media/NearbyDevice.java index c203e7b2b88ba..dbcc6b716c8fc 100644 --- a/media/java/android/media/NearbyDevice.java +++ b/media/java/android/media/NearbyDevice.java @@ -22,9 +22,10 @@ import android.annotation.SystemApi; import android.os.Parcel; import android.os.Parcelable; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Arrays; +import java.util.List; /** * A parcelable representing a nearby device that can be used for media transfer. @@ -35,6 +36,7 @@ import java.lang.annotation.RetentionPolicy; *
  • a range zone specifying how far away this device is from the device with the media route. *
  • * + * * @hide */ @SystemApi @@ -69,7 +71,7 @@ public final class NearbyDevice implements Parcelable { * * @hide */ - @IntDef(prefix = { "RANGE_" }, value = { + @IntDef(prefix = {"RANGE_"}, value = { RANGE_UNKNOWN, RANGE_FAR, RANGE_LONG, @@ -77,7 +79,8 @@ public final class NearbyDevice implements Parcelable { RANGE_WITHIN_REACH }) @Retention(RetentionPolicy.SOURCE) - public @interface RangeZone {} + public @interface RangeZone { + } /** * Gets a human-readable string of the range zone. @@ -102,8 +105,17 @@ public final class NearbyDevice implements Parcelable { } } - @NonNull private final String mMediaRoute2Id; - @RangeZone private final int mRangeZone; + /** + * A list stores all the range and list from far to close, used for range comparison. + */ + private static final List RANGE_WEIGHT_LIST = + Arrays.asList(RANGE_UNKNOWN, + RANGE_FAR, RANGE_LONG, RANGE_CLOSE, RANGE_WITHIN_REACH); + + @NonNull + private final String mMediaRoute2Id; + @RangeZone + private final int mRangeZone; /** Creates a device object with the given ID and range zone. */ public NearbyDevice(@NonNull String mediaRoute2Id, @RangeZone int rangeZone) { @@ -129,6 +141,22 @@ public final class NearbyDevice implements Parcelable { } }; + /** + * Compares two ranges and return result. + * + * @return 0 means two ranges are the same, -1 means first range is closer, 1 means farther + * + * @hide + */ + public static int compareRangeZones(@RangeZone int rangeZone, @RangeZone int anotherRangeZone) { + if (rangeZone == anotherRangeZone) { + return 0; + } else { + return RANGE_WEIGHT_LIST.indexOf(rangeZone) > RANGE_WEIGHT_LIST.indexOf( + anotherRangeZone) ? -1 : 1; + } + } + @Override public int describeContents() { return 0; diff --git a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java index c7599623c465f..3984ee9aa007b 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/MediaDevice.java @@ -35,6 +35,7 @@ import android.content.Context; import android.graphics.drawable.Drawable; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; +import android.media.NearbyDevice; import android.text.TextUtils; import android.util.Log; @@ -77,6 +78,8 @@ public abstract class MediaDevice implements Comparable { private int mConnectedRecord; private int mState; + @NearbyDevice.RangeZone + private int mRangeZone = NearbyDevice.RANGE_UNKNOWN; protected final Context mContext; protected final MediaRoute2Info mRouteInfo; @@ -136,6 +139,14 @@ public abstract class MediaDevice implements Comparable { getId()); } + public @NearbyDevice.RangeZone int getRangeZone() { + return mRangeZone; + } + + public void setRangeZone(@NearbyDevice.RangeZone int rangeZone) { + mRangeZone = rangeZone; + } + /** * Get name from MediaDevice. * @@ -319,6 +330,11 @@ public abstract class MediaDevice implements Comparable { } } + // Both devices have same connection status, compare the range zone + if (NearbyDevice.compareRangeZones(getRangeZone(), another.getRangeZone()) != 0) { + return NearbyDevice.compareRangeZones(getRangeZone(), another.getRangeZone()); + } + if (mType == another.mType) { // Check device is muting expected device if (isMutingExpectedDevice()) { diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java index c122a37d0f79c..179a498b73970 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/MediaDeviceTest.java @@ -31,6 +31,7 @@ import android.bluetooth.BluetoothDevice; import android.content.Context; import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; +import android.media.NearbyDevice; import android.os.Parcel; import com.android.settingslib.bluetooth.A2dpProfile; @@ -199,6 +200,18 @@ public class MediaDeviceTest { assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice2); } + @Test + public void compareTo_differentRange_sortWithRange() { + mBluetoothMediaDevice1.setRangeZone(NearbyDevice.RANGE_FAR); + mBluetoothMediaDevice2.setRangeZone(NearbyDevice.RANGE_CLOSE); + mMediaDevices.add(mBluetoothMediaDevice1); + mMediaDevices.add(mBluetoothMediaDevice2); + + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice1); + Collections.sort(mMediaDevices, COMPARATOR); + assertThat(mMediaDevices.get(0)).isEqualTo(mBluetoothMediaDevice2); + } + @Test public void compareTo_carKit_info_carKitFirst() { when(mDevice1.getBluetoothClass()).thenReturn(mCarkitClass); 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 f16ca7dd73616..0c202e09b62ef 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputController.java @@ -30,12 +30,16 @@ import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; +import android.media.INearbyMediaDevicesUpdateCallback; import android.media.MediaMetadata; import android.media.MediaRoute2Info; +import android.media.NearbyDevice; import android.media.RoutingSessionInfo; import android.media.session.MediaController; import android.media.session.MediaSessionManager; import android.media.session.PlaybackState; +import android.os.IBinder; +import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; import android.provider.Settings; @@ -61,6 +65,7 @@ import com.android.settingslib.utils.ThreadUtils; import com.android.systemui.R; import com.android.systemui.animation.ActivityLaunchAnimator; import com.android.systemui.animation.DialogLaunchAnimator; +import com.android.systemui.media.nearby.NearbyMediaDevicesManager; import com.android.systemui.monet.ColorScheme; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.notification.collection.NotificationEntry; @@ -70,6 +75,9 @@ import com.android.systemui.statusbar.phone.ShadeController; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import javax.inject.Inject; @@ -77,7 +85,8 @@ import javax.inject.Inject; /** * Controller for media output dialog */ -public class MediaOutputController implements LocalMediaManager.DeviceCallback { +public class MediaOutputController implements LocalMediaManager.DeviceCallback, + INearbyMediaDevicesUpdateCallback { private static final String TAG = "MediaOutputController"; private static final boolean DEBUG = Log.isLoggable(TAG, Log.DEBUG); @@ -95,6 +104,8 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback { private final CommonNotifCollection mNotifCollection; @VisibleForTesting final List mMediaDevices = new CopyOnWriteArrayList<>(); + private final NearbyMediaDevicesManager mNearbyMediaDevicesManager; + private final Map mNearbyDeviceInfoMap = new ConcurrentHashMap<>(); private MediaController mMediaController; @VisibleForTesting @@ -116,7 +127,8 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback { boolean aboveStatusbar, MediaSessionManager mediaSessionManager, LocalBluetoothManager lbm, ShadeController shadeController, ActivityStarter starter, CommonNotifCollection notifCollection, UiEventLogger uiEventLogger, - DialogLaunchAnimator dialogLaunchAnimator) { + DialogLaunchAnimator dialogLaunchAnimator, + Optional nearbyMediaDevicesManagerOptional) { mContext = context; mPackageName = packageName; mMediaSessionManager = mediaSessionManager; @@ -130,6 +142,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback { mMetricLogger = new MediaOutputMetricLogger(mContext, mPackageName); mUiEventLogger = uiEventLogger; mDialogLaunchAnimator = dialogLaunchAnimator; + mNearbyMediaDevicesManager = nearbyMediaDevicesManagerOptional.orElse(null); mColorActiveItem = Utils.getColorStateListDefaultColor(mContext, R.color.media_dialog_active_item_main_content); mColorInactiveItem = Utils.getColorStateListDefaultColor(mContext, @@ -144,6 +157,10 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback { void start(@NonNull Callback cb) { mMediaDevices.clear(); + mNearbyDeviceInfoMap.clear(); + if (mNearbyMediaDevicesManager != null) { + mNearbyMediaDevicesManager.registerNearbyDevicesCallback(this); + } if (!TextUtils.isEmpty(mPackageName)) { for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) { if (TextUtils.equals(controller.getPackageName(), mPackageName)) { @@ -187,6 +204,10 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback { mLocalMediaManager.stopScan(); } mMediaDevices.clear(); + if (mNearbyMediaDevicesManager != null) { + mNearbyMediaDevicesManager.unregisterNearbyDevicesCallback(this); + } + mNearbyDeviceInfoMap.clear(); } @Override @@ -417,6 +438,15 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback { } mMediaDevices.clear(); mMediaDevices.addAll(targetMediaDevices); + attachRangeInfo(); + } + + private void attachRangeInfo() { + for (MediaDevice mediaDevice : mMediaDevices) { + if (mNearbyDeviceInfoMap.containsKey(mediaDevice.getId())) { + mediaDevice.setRangeZone(mNearbyDeviceInfoMap.get(mediaDevice.getId())); + } + } } List getGroupMediaDevices() { @@ -604,7 +634,9 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback { // We show the output group dialog from the output dialog. MediaOutputController controller = new MediaOutputController(mContext, mPackageName, mAboveStatusbar, mMediaSessionManager, mLocalBluetoothManager, mShadeController, - mActivityStarter, mNotifCollection, mUiEventLogger, mDialogLaunchAnimator); + mActivityStarter, mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, + Optional.of(mNearbyMediaDevicesManager)); + MediaOutputGroupDialog dialog = new MediaOutputGroupDialog(mContext, mAboveStatusbar, controller); mDialogLaunchAnimator.showFromView(dialog, mediaOutputDialog); @@ -629,6 +661,20 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback { || mLocalMediaManager.isMediaSessionAvailableForVolumeControl(); } + @Override + public void onDevicesUpdated(List nearbyDevices) throws RemoteException { + mNearbyDeviceInfoMap.clear(); + for (NearbyDevice nearbyDevice : nearbyDevices) { + mNearbyDeviceInfoMap.put(nearbyDevice.getMediaRoute2Id(), nearbyDevice.getRangeZone()); + } + mNearbyMediaDevicesManager.unregisterNearbyDevicesCallback(this); + } + + @Override + public IBinder asBinder() { + return null; + } + private final MediaController.Callback mCb = new MediaController.Callback() { @Override public void onMetadataChanged(MediaMetadata metadata) { 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 9e252ea1eddc1..a7e54801bf47b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/media/dialog/MediaOutputDialogFactory.kt @@ -22,9 +22,11 @@ import android.view.View import com.android.internal.logging.UiEventLogger import com.android.settingslib.bluetooth.LocalBluetoothManager import com.android.systemui.animation.DialogLaunchAnimator +import com.android.systemui.media.nearby.NearbyMediaDevicesManager import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection import com.android.systemui.statusbar.phone.ShadeController +import java.util.Optional import javax.inject.Inject /** @@ -38,7 +40,8 @@ class MediaOutputDialogFactory @Inject constructor( private val starter: ActivityStarter, private val notifCollection: CommonNotifCollection, private val uiEventLogger: UiEventLogger, - private val dialogLaunchAnimator: DialogLaunchAnimator + private val dialogLaunchAnimator: DialogLaunchAnimator, + private val nearbyMediaDevicesManagerOptional: Optional ) { companion object { var mediaOutputDialog: MediaOutputDialog? = null @@ -50,8 +53,8 @@ class MediaOutputDialogFactory @Inject constructor( mediaOutputDialog?.dismiss() val controller = MediaOutputController(context, packageName, aboveStatusBar, - mediaSessionManager, lbm, shadeController, starter, notifCollection, - uiEventLogger, dialogLaunchAnimator) + mediaSessionManager, lbm, shadeController, starter, notifCollection, + uiEventLogger, dialogLaunchAnimator, nearbyMediaDevicesManagerOptional) val dialog = MediaOutputDialog(context, aboveStatusBar, 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 2be30b39763ec..13e582196ffbf 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 @@ -42,6 +42,7 @@ import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.animation.DialogLaunchAnimator; +import com.android.systemui.media.nearby.NearbyMediaDevicesManager; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.phone.ShadeController; @@ -50,6 +51,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.Optional; + @SmallTest @RunWith(AndroidTestingRunner.class) @TestableLooper.RunWithLooper(setAsMainLooper = true) @@ -66,6 +69,8 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { private NotificationEntryManager mNotificationEntryManager = mock(NotificationEntryManager.class); private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class); + private NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( + NearbyMediaDevicesManager.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); private MediaOutputBaseDialogImpl mMediaOutputBaseDialogImpl; @@ -80,7 +85,8 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase { public void setUp() { mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, - mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); + mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, + Optional.of(mNearbyMediaDevicesManager)); mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext, 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 789822e262d52..6230700a6a2ed 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 @@ -33,9 +33,11 @@ import android.content.Context; import android.graphics.drawable.Icon; import android.media.MediaDescription; import android.media.MediaMetadata; +import android.media.NearbyDevice; import android.media.RoutingSessionInfo; import android.media.session.MediaController; import android.media.session.MediaSessionManager; +import android.os.RemoteException; import android.service.notification.StatusBarNotification; import android.testing.AndroidTestingRunner; import android.text.TextUtils; @@ -51,17 +53,21 @@ import com.android.settingslib.media.MediaDevice; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.animation.DialogLaunchAnimator; +import com.android.systemui.media.nearby.NearbyMediaDevicesManager; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; import com.android.systemui.statusbar.phone.ShadeController; +import com.google.common.collect.ImmutableList; + import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @SmallTest @RunWith(AndroidTestingRunner.class) @@ -86,6 +92,8 @@ public class MediaOutputControllerTest extends SysuiTestCase { private MediaOutputController.Callback mCb = mock(MediaOutputController.Callback.class); private MediaDevice mMediaDevice1 = mock(MediaDevice.class); private MediaDevice mMediaDevice2 = mock(MediaDevice.class); + private NearbyDevice mNearbyDevice1 = mock(NearbyDevice.class); + private NearbyDevice mNearbyDevice2 = mock(NearbyDevice.class); private MediaMetadata mMediaMetadata = mock(MediaMetadata.class); private RoutingSessionInfo mRemoteSessionInfo = mock(RoutingSessionInfo.class); private ShadeController mShadeController = mock(ShadeController.class); @@ -93,12 +101,15 @@ public class MediaOutputControllerTest extends SysuiTestCase { private CommonNotifCollection mNotifCollection = mock(CommonNotifCollection.class); private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); + private final NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( + NearbyMediaDevicesManager.class); private Context mSpyContext; private MediaOutputController mMediaOutputController; private LocalMediaManager mLocalMediaManager; private List mMediaControllers = new ArrayList<>(); private List mMediaDevices = new ArrayList<>(); + private List mNearbyDevices = new ArrayList<>(); private MediaDescription mMediaDescription; private List mRoutingSessionInfos = new ArrayList<>(); @@ -115,7 +126,8 @@ public class MediaOutputControllerTest extends SysuiTestCase { mMediaOutputController = new MediaOutputController(mSpyContext, TEST_PACKAGE_NAME, false, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, - mNotifCollection, mUiEventLogger, mDialogLaunchAnimator); + mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, + Optional.of(mNearbyMediaDevicesManager)); mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; MediaDescription.Builder builder = new MediaDescription.Builder(); @@ -127,6 +139,13 @@ public class MediaOutputControllerTest extends SysuiTestCase { when(mMediaDevice2.getId()).thenReturn(TEST_DEVICE_2_ID); mMediaDevices.add(mMediaDevice1); mMediaDevices.add(mMediaDevice2); + + when(mNearbyDevice1.getMediaRoute2Id()).thenReturn(TEST_DEVICE_1_ID); + when(mNearbyDevice1.getRangeZone()).thenReturn(NearbyDevice.RANGE_CLOSE); + when(mNearbyDevice2.getMediaRoute2Id()).thenReturn(TEST_DEVICE_2_ID); + when(mNearbyDevice2.getRangeZone()).thenReturn(NearbyDevice.RANGE_FAR); + mNearbyDevices.add(mNearbyDevice1); + mNearbyDevices.add(mNearbyDevice2); } @Test @@ -159,13 +178,21 @@ public class MediaOutputControllerTest extends SysuiTestCase { public void start_withoutPackageName_verifyMediaControllerInit() { mMediaOutputController = new MediaOutputController(mSpyContext, null, false, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, - mNotifCollection, mUiEventLogger, mDialogLaunchAnimator); + mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, + Optional.of(mNearbyMediaDevicesManager)); mMediaOutputController.start(mCb); verify(mMediaController, never()).registerCallback(any()); } + @Test + public void start_nearbyMediaDevicesManagerNotNull_registersNearbyDevicesCallback() { + mMediaOutputController.start(mCb); + + verify(mNearbyMediaDevicesManager).registerNearbyDevicesCallback(any()); + } + @Test public void stop_withPackageName_verifyMediaControllerDeinit() { mMediaOutputController.start(mCb); @@ -180,7 +207,8 @@ public class MediaOutputControllerTest extends SysuiTestCase { public void stop_withoutPackageName_verifyMediaControllerDeinit() { mMediaOutputController = new MediaOutputController(mSpyContext, null, false, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, - mNotifCollection, mUiEventLogger, mDialogLaunchAnimator); + mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, + Optional.of(mNearbyMediaDevicesManager)); mMediaOutputController.start(mCb); @@ -189,6 +217,39 @@ public class MediaOutputControllerTest extends SysuiTestCase { verify(mMediaController, never()).unregisterCallback(any()); } + + @Test + public void stop_nearbyMediaDevicesManagerNotNull_unregistersNearbyDevicesCallback() { + mMediaOutputController.start(mCb); + reset(mMediaController); + + mMediaOutputController.stop(); + + verify(mNearbyMediaDevicesManager).unregisterNearbyDevicesCallback(any()); + } + + @Test + public void onDevicesUpdated_unregistersNearbyDevicesCallback() throws RemoteException { + mMediaOutputController.start(mCb); + + mMediaOutputController.onDevicesUpdated(ImmutableList.of()); + + verify(mNearbyMediaDevicesManager).unregisterNearbyDevicesCallback(any()); + } + + @Test + public void onDeviceListUpdate_withNearbyDevices_updatesRangeInformation() + throws RemoteException { + mMediaOutputController.start(mCb); + reset(mCb); + + mMediaOutputController.onDevicesUpdated(mNearbyDevices); + mMediaOutputController.onDeviceListUpdate(mMediaDevices); + + verify(mMediaDevice1).setRangeZone(NearbyDevice.RANGE_CLOSE); + verify(mMediaDevice2).setRangeZone(NearbyDevice.RANGE_FAR); + } + @Test public void onDeviceListUpdate_verifyDeviceListCallback() { mMediaOutputController.start(mCb); @@ -451,7 +512,8 @@ public class MediaOutputControllerTest extends SysuiTestCase { public void getNotificationLargeIcon_withoutPackageName_returnsNull() { mMediaOutputController = new MediaOutputController(mSpyContext, null, false, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, - mNotifCollection, mUiEventLogger, mDialogLaunchAnimator); + mNotifCollection, mUiEventLogger, mDialogLaunchAnimator, + Optional.of(mNearbyMediaDevicesManager)); 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 8a3ea562269d8..cb52e7c20464e 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 @@ -37,6 +37,7 @@ import com.android.settingslib.media.LocalMediaManager; import com.android.settingslib.media.MediaDevice; import com.android.systemui.SysuiTestCase; import com.android.systemui.animation.DialogLaunchAnimator; +import com.android.systemui.media.nearby.NearbyMediaDevicesManager; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.phone.ShadeController; @@ -48,6 +49,7 @@ import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @SmallTest @RunWith(AndroidTestingRunner.class) @@ -67,6 +69,8 @@ public class MediaOutputDialogTest extends SysuiTestCase { mock(NotificationEntryManager.class); private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); + private final NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( + NearbyMediaDevicesManager.class); private MediaOutputDialog mMediaOutputDialog; private MediaOutputController mMediaOutputController; @@ -76,7 +80,8 @@ public class MediaOutputDialogTest extends SysuiTestCase { public void setUp() { mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, - mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); + mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, + Optional.of(mNearbyMediaDevicesManager)); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputDialog = new MediaOutputDialog(mContext, false, 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 e8cd6c88956d2..f186f57fd0e55 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 @@ -35,6 +35,7 @@ import com.android.settingslib.media.MediaDevice; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; import com.android.systemui.animation.DialogLaunchAnimator; +import com.android.systemui.media.nearby.NearbyMediaDevicesManager; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.statusbar.notification.NotificationEntryManager; import com.android.systemui.statusbar.phone.ShadeController; @@ -46,6 +47,7 @@ import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @SmallTest @RunWith(AndroidTestingRunner.class) @@ -66,6 +68,8 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase { mock(NotificationEntryManager.class); private final UiEventLogger mUiEventLogger = mock(UiEventLogger.class); private final DialogLaunchAnimator mDialogLaunchAnimator = mock(DialogLaunchAnimator.class); + private NearbyMediaDevicesManager mNearbyMediaDevicesManager = mock( + NearbyMediaDevicesManager.class); private MediaOutputGroupDialog mMediaOutputGroupDialog; private MediaOutputController mMediaOutputController; @@ -75,7 +79,8 @@ public class MediaOutputGroupDialogTest extends SysuiTestCase { public void setUp() { mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE, false, mMediaSessionManager, mLocalBluetoothManager, mShadeController, mStarter, - mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator); + mNotificationEntryManager, mUiEventLogger, mDialogLaunchAnimator, + Optional.of(mNearbyMediaDevicesManager)); mMediaOutputController.mLocalMediaManager = mLocalMediaManager; mMediaOutputGroupDialog = new MediaOutputGroupDialog(mContext, false, mMediaOutputController);