[Output Switcher] Update device icon and Media metadata
1. add new route type and icons 2. update the way to get Media information to consist with UMO Bug: 279641026 Bug: 278728942 Test: atest MediaOutputAdapterTest MediaOutputControllerTest MediaOutputBaseDialogTest MediaOutputDialogTest Change-Id: I42f1bbc433d7471f54417332102ed7be345df5be
This commit is contained in:
committed by
Shaowei Shen
parent
2e637bb64b
commit
3983f096b9
25
packages/SettingsLib/res/drawable/ic_media_car.xml
Normal file
25
packages/SettingsLib/res/drawable/ic_media_car.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<!--
|
||||
Copyright (C) 2020 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="960"
|
||||
android:viewportHeight="960"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M240,760L240,800Q240,817 228.5,828.5Q217,840 200,840L160,840Q143,840 131.5,828.5Q120,817 120,800L120,480L204,240Q210,222 225.5,211Q241,200 260,200L700,200Q719,200 734.5,211Q750,222 756,240L840,480L840,800Q840,817 828.5,828.5Q817,840 800,840L760,840Q743,840 731.5,828.5Q720,817 720,800L720,760L240,760ZM232,400L728,400L686,280L274,280L232,400ZM200,480L200,480L200,680L200,680L200,480ZM300,640Q325,640 342.5,622.5Q360,605 360,580Q360,555 342.5,537.5Q325,520 300,520Q275,520 257.5,537.5Q240,555 240,580Q240,605 257.5,622.5Q275,640 300,640ZM660,640Q685,640 702.5,622.5Q720,605 720,580Q720,555 702.5,537.5Q685,520 660,520Q635,520 617.5,537.5Q600,555 600,580Q600,605 617.5,622.5Q635,640 660,640ZM200,680L760,680L760,480L200,480L200,680Z"/>
|
||||
</vector>
|
||||
25
packages/SettingsLib/res/drawable/ic_media_computer.xml
Normal file
25
packages/SettingsLib/res/drawable/ic_media_computer.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<!--
|
||||
Copyright (C) 2020 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="960"
|
||||
android:viewportHeight="960"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M80,840Q63,840 51.5,828.5Q40,817 40,800Q40,783 51.5,771.5Q63,760 80,760L880,760Q897,760 908.5,771.5Q920,783 920,800Q920,817 908.5,828.5Q897,840 880,840L80,840ZM160,720Q127,720 103.5,696.5Q80,673 80,640L80,200Q80,167 103.5,143.5Q127,120 160,120L800,120Q833,120 856.5,143.5Q880,167 880,200L880,640Q880,673 856.5,696.5Q833,720 800,720L160,720ZM160,640L800,640Q800,640 800,640Q800,640 800,640L800,200Q800,200 800,200Q800,200 800,200L160,200Q160,200 160,200Q160,200 160,200L160,640Q160,640 160,640Q160,640 160,640ZM160,640Q160,640 160,640Q160,640 160,640L160,200Q160,200 160,200Q160,200 160,200L160,200Q160,200 160,200Q160,200 160,200L160,640Q160,640 160,640Q160,640 160,640L160,640Z"/>
|
||||
</vector>
|
||||
25
packages/SettingsLib/res/drawable/ic_media_game_console.xml
Normal file
25
packages/SettingsLib/res/drawable/ic_media_game_console.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<!--
|
||||
Copyright (C) 2020 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="960"
|
||||
android:viewportHeight="960"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M189,800Q129,800 86.5,757Q44,714 42,653Q42,644 43,635Q44,626 46,617L130,281Q144,227 187,193.5Q230,160 285,160L675,160Q730,160 773,193.5Q816,227 830,281L914,617Q916,626 917.5,635.5Q919,645 919,654Q919,715 875.5,757.5Q832,800 771,800Q729,800 693,778Q657,756 639,718L611,660Q606,650 596,645Q586,640 575,640L385,640Q374,640 364,645Q354,650 349,660L321,718Q303,756 267,778Q231,800 189,800ZM192,720Q211,720 226.5,710Q242,700 250,683L278,626Q293,595 322,577.5Q351,560 385,560L575,560Q609,560 638,578Q667,596 683,626L711,683Q719,700 734.5,710Q750,720 769,720Q797,720 817,701.5Q837,683 838,655Q838,656 836,636L752,301Q745,274 724,257Q703,240 675,240L285,240Q257,240 235.5,257Q214,274 208,301L124,636Q122,642 122,654Q122,682 142.5,701Q163,720 192,720ZM540,440Q557,440 568.5,428.5Q580,417 580,400Q580,383 568.5,371.5Q557,360 540,360Q523,360 511.5,371.5Q500,383 500,400Q500,417 511.5,428.5Q523,440 540,440ZM620,360Q637,360 648.5,348.5Q660,337 660,320Q660,303 648.5,291.5Q637,280 620,280Q603,280 591.5,291.5Q580,303 580,320Q580,337 591.5,348.5Q603,360 620,360ZM620,520Q637,520 648.5,508.5Q660,497 660,480Q660,463 648.5,451.5Q637,440 620,440Q603,440 591.5,451.5Q580,463 580,480Q580,497 591.5,508.5Q603,520 620,520ZM700,440Q717,440 728.5,428.5Q740,417 740,400Q740,383 728.5,371.5Q717,360 700,360Q683,360 671.5,371.5Q660,383 660,400Q660,417 671.5,428.5Q683,440 700,440ZM340,500Q353,500 361.5,491.5Q370,483 370,470L370,430L410,430Q423,430 431.5,421.5Q440,413 440,400Q440,387 431.5,378.5Q423,370 410,370L370,370L370,330Q370,317 361.5,308.5Q353,300 340,300Q327,300 318.5,308.5Q310,317 310,330L310,370L270,370Q257,370 248.5,378.5Q240,387 240,400Q240,413 248.5,421.5Q257,430 270,430L310,430L310,470Q310,483 318.5,491.5Q327,500 340,500ZM480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480L480,480Q480,480 480,480Q480,480 480,480Z"/>
|
||||
</vector>
|
||||
25
packages/SettingsLib/res/drawable/ic_media_smartwatch.xml
Normal file
25
packages/SettingsLib/res/drawable/ic_media_smartwatch.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<!--
|
||||
Copyright (C) 2020 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M16,0L8,0l-0.95,5.73C5.19,7.19 4,9.45 4,12s1.19,4.81 3.05,6.27L8,24h8l0.96,-5.73C18.81,16.81 20,14.54 20,12s-1.19,-4.81 -3.04,-6.27L16,0zM12,18c-3.31,0 -6,-2.69 -6,-6s2.69,-6 6,-6 6,2.69 6,6 -2.69,6 -6,6z"/>
|
||||
</vector>
|
||||
25
packages/SettingsLib/res/drawable/ic_media_tablet.xml
Normal file
25
packages/SettingsLib/res/drawable/ic_media_tablet.xml
Normal file
@@ -0,0 +1,25 @@
|
||||
<!--
|
||||
Copyright (C) 2020 The Android Open Source Project
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="960"
|
||||
android:viewportHeight="960"
|
||||
android:tint="?attr/colorControlNormal">
|
||||
<path
|
||||
android:fillColor="@android:color/white"
|
||||
android:pathData="M200,920Q167,920 143.5,896.5Q120,873 120,840L120,120Q120,87 143.5,63.5Q167,40 200,40L760,40Q793,40 816.5,63.5Q840,87 840,120L840,840Q840,873 816.5,896.5Q793,920 760,920L200,920ZM200,720L200,840Q200,840 200,840Q200,840 200,840L760,840Q760,840 760,840Q760,840 760,840L760,720L200,720ZM400,800L560,800L560,760L400,760L400,800ZM200,640L760,640L760,240L200,240L200,640ZM200,160L760,160L760,120Q760,120 760,120Q760,120 760,120L200,120Q200,120 200,120Q200,120 200,120L200,160ZM200,160L200,120Q200,120 200,120Q200,120 200,120L200,120Q200,120 200,120Q200,120 200,120L200,160L200,160ZM200,720L200,720L200,840Q200,840 200,840Q200,840 200,840L200,840Q200,840 200,840Q200,840 200,840L200,720Z"/>
|
||||
</vector>
|
||||
@@ -15,10 +15,14 @@
|
||||
*/
|
||||
package com.android.settingslib.media;
|
||||
|
||||
import static android.media.MediaRoute2Info.FEATURE_REMOTE_GROUP_PLAYBACK;
|
||||
import static android.media.MediaRoute2Info.FEATURE_REMOTE_VIDEO_PLAYBACK;
|
||||
import static android.media.MediaRoute2Info.TYPE_GROUP;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_CAR;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_COMPUTER;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_GAME_CONSOLE;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_SMARTWATCH;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_TABLET;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_TABLET_DOCKED;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_TV;
|
||||
|
||||
import android.content.Context;
|
||||
@@ -31,8 +35,6 @@ import androidx.annotation.VisibleForTesting;
|
||||
|
||||
import com.android.settingslib.R;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* InfoMediaDevice extends MediaDevice to represents wifi device.
|
||||
*/
|
||||
@@ -69,13 +71,12 @@ public class InfoMediaDevice extends MediaDevice {
|
||||
|
||||
@Override
|
||||
public Drawable getIconWithoutBackground() {
|
||||
return mContext.getDrawable(getDrawableResIdByFeature());
|
||||
return mContext.getDrawable(getDrawableResIdByType());
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
// MediaRoute2Info.getType was made public on API 34, but exists since API 30.
|
||||
@SuppressWarnings("NewApi")
|
||||
int getDrawableResId() {
|
||||
int getDrawableResIdByType() {
|
||||
int resId;
|
||||
switch (mRouteInfo.getType()) {
|
||||
case TYPE_GROUP:
|
||||
@@ -84,6 +85,24 @@ public class InfoMediaDevice extends MediaDevice {
|
||||
case TYPE_REMOTE_TV:
|
||||
resId = R.drawable.ic_media_display_device;
|
||||
break;
|
||||
case TYPE_REMOTE_TABLET:
|
||||
resId = R.drawable.ic_media_tablet;
|
||||
break;
|
||||
case TYPE_REMOTE_TABLET_DOCKED:
|
||||
resId = R.drawable.ic_dock_device;
|
||||
break;
|
||||
case TYPE_REMOTE_COMPUTER:
|
||||
resId = R.drawable.ic_media_computer;
|
||||
break;
|
||||
case TYPE_REMOTE_GAME_CONSOLE:
|
||||
resId = R.drawable.ic_media_game_console;
|
||||
break;
|
||||
case TYPE_REMOTE_CAR:
|
||||
resId = R.drawable.ic_media_car;
|
||||
break;
|
||||
case TYPE_REMOTE_SMARTWATCH:
|
||||
resId = R.drawable.ic_media_smartwatch;
|
||||
break;
|
||||
case TYPE_REMOTE_SPEAKER:
|
||||
default:
|
||||
resId = R.drawable.ic_media_speaker_device;
|
||||
@@ -92,21 +111,6 @@ public class InfoMediaDevice extends MediaDevice {
|
||||
return resId;
|
||||
}
|
||||
|
||||
@VisibleForTesting
|
||||
int getDrawableResIdByFeature() {
|
||||
int resId;
|
||||
final List<String> features = mRouteInfo.getFeatures();
|
||||
if (features.contains(FEATURE_REMOTE_GROUP_PLAYBACK)) {
|
||||
resId = R.drawable.ic_media_group_device;
|
||||
} else if (features.contains(FEATURE_REMOTE_VIDEO_PLAYBACK)) {
|
||||
resId = R.drawable.ic_media_display_device;
|
||||
} else {
|
||||
resId = R.drawable.ic_media_speaker_device;
|
||||
}
|
||||
|
||||
return resId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return MediaDeviceUtils.getId(mRouteInfo);
|
||||
|
||||
@@ -23,7 +23,13 @@ import static android.media.MediaRoute2Info.TYPE_GROUP;
|
||||
import static android.media.MediaRoute2Info.TYPE_HDMI;
|
||||
import static android.media.MediaRoute2Info.TYPE_HEARING_AID;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_AUDIO_VIDEO_RECEIVER;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_CAR;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_COMPUTER;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_GAME_CONSOLE;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_SMARTWATCH;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_TABLET;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_TABLET_DOCKED;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_TV;
|
||||
import static android.media.MediaRoute2Info.TYPE_UNKNOWN;
|
||||
import static android.media.MediaRoute2Info.TYPE_USB_ACCESSORY;
|
||||
@@ -531,7 +537,6 @@ public class InfoMediaManager extends MediaManager {
|
||||
@SuppressWarnings("NewApi")
|
||||
@VisibleForTesting
|
||||
void addMediaDevice(MediaRoute2Info route) {
|
||||
//TODO(b/258141461): Attach flag and disable reason in MediaDevice
|
||||
final int deviceType = route.getType();
|
||||
MediaDevice mediaDevice = null;
|
||||
switch (deviceType) {
|
||||
@@ -539,7 +544,12 @@ public class InfoMediaManager extends MediaManager {
|
||||
case TYPE_REMOTE_TV:
|
||||
case TYPE_REMOTE_SPEAKER:
|
||||
case TYPE_GROUP:
|
||||
//TODO(b/148765806): use correct device type once api is ready.
|
||||
case TYPE_REMOTE_TABLET:
|
||||
case TYPE_REMOTE_TABLET_DOCKED:
|
||||
case TYPE_REMOTE_COMPUTER:
|
||||
case TYPE_REMOTE_GAME_CONSOLE:
|
||||
case TYPE_REMOTE_CAR:
|
||||
case TYPE_REMOTE_SMARTWATCH:
|
||||
mediaDevice = new InfoMediaDevice(mContext, mRouterManager, route,
|
||||
mPackageName, mPreferenceItemMap.get(route.getId()));
|
||||
break;
|
||||
|
||||
@@ -16,11 +16,14 @@
|
||||
|
||||
package com.android.settingslib.media;
|
||||
|
||||
import static android.media.MediaRoute2Info.FEATURE_REMOTE_AUDIO_PLAYBACK;
|
||||
import static android.media.MediaRoute2Info.FEATURE_REMOTE_GROUP_PLAYBACK;
|
||||
import static android.media.MediaRoute2Info.FEATURE_REMOTE_VIDEO_PLAYBACK;
|
||||
import static android.media.MediaRoute2Info.TYPE_GROUP;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_CAR;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_COMPUTER;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_GAME_CONSOLE;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_SMARTWATCH;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_SPEAKER;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_TABLET;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_TABLET_DOCKED;
|
||||
import static android.media.MediaRoute2Info.TYPE_REMOTE_TV;
|
||||
|
||||
import static com.google.common.truth.Truth.assertThat;
|
||||
@@ -41,8 +44,6 @@ import org.mockito.MockitoAnnotations;
|
||||
import org.robolectric.RobolectricTestRunner;
|
||||
import org.robolectric.RuntimeEnvironment;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
@RunWith(RobolectricTestRunner.class)
|
||||
public class InfoMediaDeviceTest {
|
||||
|
||||
@@ -100,40 +101,47 @@ public class InfoMediaDeviceTest {
|
||||
public void getDrawableResId_returnCorrectResId() {
|
||||
when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_TV);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResId()).isEqualTo(
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo(
|
||||
R.drawable.ic_media_display_device);
|
||||
|
||||
when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_SPEAKER);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResId()).isEqualTo(
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo(
|
||||
R.drawable.ic_media_speaker_device);
|
||||
|
||||
when(mRouteInfo.getType()).thenReturn(TYPE_GROUP);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResId()).isEqualTo(R.drawable.ic_media_group_device);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDrawableResIdByFeature_returnCorrectResId() {
|
||||
final ArrayList<String> features = new ArrayList<>();
|
||||
features.add(FEATURE_REMOTE_VIDEO_PLAYBACK);
|
||||
when(mRouteInfo.getFeatures()).thenReturn(features);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByFeature()).isEqualTo(
|
||||
R.drawable.ic_media_display_device);
|
||||
|
||||
features.clear();
|
||||
features.add(FEATURE_REMOTE_AUDIO_PLAYBACK);
|
||||
when(mRouteInfo.getFeatures()).thenReturn(features);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByFeature()).isEqualTo(
|
||||
R.drawable.ic_media_speaker_device);
|
||||
|
||||
features.clear();
|
||||
features.add(FEATURE_REMOTE_GROUP_PLAYBACK);
|
||||
when(mRouteInfo.getFeatures()).thenReturn(features);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByFeature()).isEqualTo(
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo(
|
||||
R.drawable.ic_media_group_device);
|
||||
|
||||
when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_TABLET);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo(
|
||||
R.drawable.ic_media_tablet);
|
||||
|
||||
when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_TABLET_DOCKED);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo(
|
||||
R.drawable.ic_dock_device);
|
||||
|
||||
when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_COMPUTER);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo(
|
||||
R.drawable.ic_media_computer);
|
||||
|
||||
when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_GAME_CONSOLE);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo(
|
||||
R.drawable.ic_media_game_console);
|
||||
|
||||
when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_CAR);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo(
|
||||
R.drawable.ic_media_car);
|
||||
|
||||
when(mRouteInfo.getType()).thenReturn(TYPE_REMOTE_SMARTWATCH);
|
||||
|
||||
assertThat(mInfoMediaDevice.getDrawableResIdByType()).isEqualTo(
|
||||
R.drawable.ic_media_smartwatch);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,6 +29,7 @@ import com.android.systemui.broadcast.BroadcastSender
|
||||
import com.android.systemui.flags.FeatureFlags
|
||||
import com.android.systemui.media.nearby.NearbyMediaDevicesManager
|
||||
import com.android.systemui.plugins.ActivityStarter
|
||||
import com.android.systemui.settings.UserTracker
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
|
||||
import java.util.Optional
|
||||
import javax.inject.Inject
|
||||
@@ -49,7 +50,8 @@ class MediaOutputBroadcastDialogFactory @Inject constructor(
|
||||
private val audioManager: AudioManager,
|
||||
private val powerExemptionManager: PowerExemptionManager,
|
||||
private val keyGuardManager: KeyguardManager,
|
||||
private val featureFlags: FeatureFlags
|
||||
private val featureFlags: FeatureFlags,
|
||||
private val userTracker: UserTracker
|
||||
) {
|
||||
var mediaOutputBroadcastDialog: MediaOutputBroadcastDialog? = null
|
||||
|
||||
@@ -61,7 +63,7 @@ class MediaOutputBroadcastDialogFactory @Inject constructor(
|
||||
val controller = MediaOutputController(context, packageName,
|
||||
mediaSessionManager, lbm, starter, notifCollection,
|
||||
dialogLaunchAnimator, nearbyMediaDevicesManagerOptional, audioManager,
|
||||
powerExemptionManager, keyGuardManager, featureFlags)
|
||||
powerExemptionManager, keyGuardManager, featureFlags, userTracker)
|
||||
val dialog =
|
||||
MediaOutputBroadcastDialog(context, aboveStatusBar, broadcastSender, controller)
|
||||
mediaOutputBroadcastDialog = dialog
|
||||
|
||||
@@ -49,6 +49,7 @@ import android.media.MediaRoute2Info;
|
||||
import android.media.NearbyDevice;
|
||||
import android.media.RoutingSessionInfo;
|
||||
import android.media.session.MediaController;
|
||||
import android.media.session.MediaSession;
|
||||
import android.media.session.MediaSessionManager;
|
||||
import android.media.session.PlaybackState;
|
||||
import android.os.IBinder;
|
||||
@@ -86,6 +87,7 @@ import com.android.systemui.flags.Flags;
|
||||
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
|
||||
import com.android.systemui.monet.ColorScheme;
|
||||
import com.android.systemui.plugins.ActivityStarter;
|
||||
import com.android.systemui.settings.UserTracker;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
|
||||
import com.android.systemui.statusbar.phone.SystemUIDialog;
|
||||
@@ -165,6 +167,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
|
||||
private float mInactiveRadius;
|
||||
private float mActiveRadius;
|
||||
private FeatureFlags mFeatureFlags;
|
||||
private UserTracker mUserTracker;
|
||||
|
||||
public enum BroadcastNotifyDialog {
|
||||
ACTION_FIRST_LAUNCH,
|
||||
@@ -181,7 +184,8 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
|
||||
AudioManager audioManager,
|
||||
PowerExemptionManager powerExemptionManager,
|
||||
KeyguardManager keyGuardManager,
|
||||
FeatureFlags featureFlags) {
|
||||
FeatureFlags featureFlags,
|
||||
UserTracker userTracker) {
|
||||
mContext = context;
|
||||
mPackageName = packageName;
|
||||
mMediaSessionManager = mediaSessionManager;
|
||||
@@ -192,6 +196,7 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
|
||||
mPowerExemptionManager = powerExemptionManager;
|
||||
mKeyGuardManager = keyGuardManager;
|
||||
mFeatureFlags = featureFlags;
|
||||
mUserTracker = userTracker;
|
||||
InfoMediaManager imm = new InfoMediaManager(mContext, packageName, null, lbm);
|
||||
mLocalMediaManager = new LocalMediaManager(mContext, lbm, imm, packageName);
|
||||
mMetricLogger = new MediaOutputMetricLogger(mContext, mPackageName);
|
||||
@@ -232,16 +237,13 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
|
||||
mNearbyMediaDevicesManager.registerNearbyDevicesCallback(this);
|
||||
}
|
||||
if (!TextUtils.isEmpty(mPackageName)) {
|
||||
for (MediaController controller : mMediaSessionManager.getActiveSessions(null)) {
|
||||
if (TextUtils.equals(controller.getPackageName(), mPackageName)) {
|
||||
mMediaController = controller;
|
||||
mMediaController.unregisterCallback(mCb);
|
||||
if (mMediaController.getPlaybackState() != null) {
|
||||
mCurrentState = mMediaController.getPlaybackState().getState();
|
||||
}
|
||||
mMediaController.registerCallback(mCb);
|
||||
break;
|
||||
mMediaController = getMediaController();
|
||||
if (mMediaController != null) {
|
||||
mMediaController.unregisterCallback(mCb);
|
||||
if (mMediaController.getPlaybackState() != null) {
|
||||
mCurrentState = mMediaController.getPlaybackState().getState();
|
||||
}
|
||||
mMediaController.registerCallback(mCb);
|
||||
}
|
||||
}
|
||||
if (mMediaController == null) {
|
||||
@@ -284,6 +286,26 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
|
||||
mNearbyDeviceInfoMap.clear();
|
||||
}
|
||||
|
||||
private MediaController getMediaController() {
|
||||
for (NotificationEntry entry : mNotifCollection.getAllNotifs()) {
|
||||
final Notification notification = entry.getSbn().getNotification();
|
||||
if (notification.isMediaNotification()
|
||||
&& TextUtils.equals(entry.getSbn().getPackageName(), mPackageName)) {
|
||||
MediaSession.Token token = notification.extras.getParcelable(
|
||||
Notification.EXTRA_MEDIA_SESSION,
|
||||
MediaSession.Token.class);
|
||||
return new MediaController(mContext, token);
|
||||
}
|
||||
}
|
||||
for (MediaController controller : mMediaSessionManager.getActiveSessionsForUser(null,
|
||||
mUserTracker.getUserHandle())) {
|
||||
if (TextUtils.equals(controller.getPackageName(), mPackageName)) {
|
||||
return controller;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDeviceListUpdate(List<MediaDevice> devices) {
|
||||
boolean isListEmpty =
|
||||
@@ -1011,7 +1033,8 @@ public class MediaOutputController implements LocalMediaManager.DeviceCallback,
|
||||
MediaOutputController controller = new MediaOutputController(mContext, mPackageName,
|
||||
mMediaSessionManager, mLocalBluetoothManager, mActivityStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator, Optional.of(mNearbyMediaDevicesManager),
|
||||
mAudioManager, mPowerExemptionManager, mKeyGuardManager, mFeatureFlags);
|
||||
mAudioManager, mPowerExemptionManager, mKeyGuardManager, mFeatureFlags,
|
||||
mUserTracker);
|
||||
MediaOutputBroadcastDialog dialog = new MediaOutputBroadcastDialog(mContext, true,
|
||||
broadcastSender, controller);
|
||||
dialog.show();
|
||||
|
||||
@@ -32,6 +32,7 @@ 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.flags.FeatureFlags
|
||||
import com.android.systemui.settings.UserTracker
|
||||
import java.util.Optional
|
||||
import javax.inject.Inject
|
||||
|
||||
@@ -51,7 +52,8 @@ class MediaOutputDialogFactory @Inject constructor(
|
||||
private val audioManager: AudioManager,
|
||||
private val powerExemptionManager: PowerExemptionManager,
|
||||
private val keyGuardManager: KeyguardManager,
|
||||
private val featureFlags: FeatureFlags
|
||||
private val featureFlags: FeatureFlags,
|
||||
private val userTracker: UserTracker
|
||||
) {
|
||||
companion object {
|
||||
private const val INTERACTION_JANK_TAG = "media_output"
|
||||
@@ -67,7 +69,7 @@ class MediaOutputDialogFactory @Inject constructor(
|
||||
context, packageName,
|
||||
mediaSessionManager, lbm, starter, notifCollection,
|
||||
dialogLaunchAnimator, nearbyMediaDevicesManagerOptional, audioManager,
|
||||
powerExemptionManager, keyGuardManager, featureFlags)
|
||||
powerExemptionManager, keyGuardManager, featureFlags, userTracker)
|
||||
val dialog =
|
||||
MediaOutputDialog(context, aboveStatusBar, broadcastSender, controller, uiEventLogger)
|
||||
mediaOutputDialog = dialog
|
||||
|
||||
@@ -54,6 +54,7 @@ import com.android.systemui.broadcast.BroadcastSender;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
|
||||
import com.android.systemui.plugins.ActivityStarter;
|
||||
import com.android.systemui.settings.UserTracker;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
|
||||
|
||||
import org.junit.Before;
|
||||
@@ -91,6 +92,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
|
||||
private PowerExemptionManager mPowerExemptionManager = mock(PowerExemptionManager.class);
|
||||
private KeyguardManager mKeyguardManager = mock(KeyguardManager.class);
|
||||
private FeatureFlags mFlags = mock(FeatureFlags.class);
|
||||
private UserTracker mUserTracker = mock(UserTracker.class);
|
||||
|
||||
private List<MediaController> mMediaControllers = new ArrayList<>();
|
||||
private MediaOutputBaseDialogImpl mMediaOutputBaseDialogImpl;
|
||||
@@ -123,7 +125,7 @@ public class MediaOutputBaseDialogTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
mMediaOutputBaseDialogImpl = new MediaOutputBaseDialogImpl(mContext, mBroadcastSender,
|
||||
mMediaOutputController);
|
||||
mMediaOutputBaseDialogImpl.onCreate(new Bundle());
|
||||
|
||||
@@ -50,6 +50,7 @@ import com.android.systemui.broadcast.BroadcastSender;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
|
||||
import com.android.systemui.plugins.ActivityStarter;
|
||||
import com.android.systemui.settings.UserTracker;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
|
||||
|
||||
import org.junit.After;
|
||||
@@ -95,6 +96,7 @@ public class MediaOutputBroadcastDialogTest extends SysuiTestCase {
|
||||
private PowerExemptionManager mPowerExemptionManager = mock(PowerExemptionManager.class);
|
||||
private KeyguardManager mKeyguardManager = mock(KeyguardManager.class);
|
||||
private FeatureFlags mFlags = mock(FeatureFlags.class);
|
||||
private UserTracker mUserTracker = mock(UserTracker.class);
|
||||
|
||||
private MediaOutputBroadcastDialog mMediaOutputBroadcastDialog;
|
||||
private MediaOutputController mMediaOutputController;
|
||||
@@ -109,7 +111,7 @@ public class MediaOutputBroadcastDialogTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
|
||||
mMediaOutputBroadcastDialog = new MediaOutputBroadcastDialog(mContext, false,
|
||||
mBroadcastSender, mMediaOutputController);
|
||||
|
||||
@@ -30,6 +30,7 @@ import static org.mockito.Mockito.never;
|
||||
import static org.mockito.Mockito.reset;
|
||||
import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.verifyZeroInteractions;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.KeyguardManager;
|
||||
@@ -48,13 +49,18 @@ import android.media.MediaMetadata;
|
||||
import android.media.MediaRoute2Info;
|
||||
import android.media.NearbyDevice;
|
||||
import android.media.RoutingSessionInfo;
|
||||
import android.media.session.ISessionController;
|
||||
import android.media.session.MediaController;
|
||||
import android.media.session.MediaSession;
|
||||
import android.media.session.MediaSessionManager;
|
||||
import android.media.session.PlaybackState;
|
||||
import android.os.Bundle;
|
||||
import android.os.PowerExemptionManager;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserHandle;
|
||||
import android.service.notification.StatusBarNotification;
|
||||
import android.testing.AndroidTestingRunner;
|
||||
import android.testing.TestableLooper;
|
||||
import android.text.TextUtils;
|
||||
import android.view.View;
|
||||
|
||||
@@ -73,6 +79,7 @@ import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.flags.Flags;
|
||||
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
|
||||
import com.android.systemui.plugins.ActivityStarter;
|
||||
import com.android.systemui.settings.UserTracker;
|
||||
import com.android.systemui.statusbar.notification.collection.NotificationEntry;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
|
||||
|
||||
@@ -91,6 +98,7 @@ import java.util.Optional;
|
||||
|
||||
@SmallTest
|
||||
@RunWith(AndroidTestingRunner.class)
|
||||
@TestableLooper.RunWithLooper(setAsMainLooper = true)
|
||||
public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
|
||||
private static final String TEST_PACKAGE_NAME = "com.test.package.name";
|
||||
@@ -111,7 +119,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
private NearbyMediaDevicesManager mNearbyMediaDevicesManager;
|
||||
// Mock
|
||||
@Mock
|
||||
private MediaController mMediaController;
|
||||
private MediaController mSessionMediaController;
|
||||
@Mock
|
||||
private MediaSessionManager mMediaSessionManager;
|
||||
@Mock
|
||||
@@ -151,10 +159,15 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
@Mock
|
||||
private PlaybackState mPlaybackState;
|
||||
|
||||
@Mock
|
||||
private UserTracker mUserTracker;
|
||||
|
||||
private FeatureFlags mFlags = mock(FeatureFlags.class);
|
||||
private View mDialogLaunchView = mock(View.class);
|
||||
private MediaOutputController.Callback mCallback = mock(MediaOutputController.Callback.class);
|
||||
|
||||
final Notification mNotification = mock(Notification.class);
|
||||
|
||||
private Context mSpyContext;
|
||||
private MediaOutputController mMediaOutputController;
|
||||
private LocalMediaManager mLocalMediaManager;
|
||||
@@ -169,10 +182,14 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext.setMockPackageManager(mPackageManager);
|
||||
mSpyContext = spy(mContext);
|
||||
when(mMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
||||
when(mMediaController.getPlaybackState()).thenReturn(mPlaybackState);
|
||||
mMediaControllers.add(mMediaController);
|
||||
when(mMediaSessionManager.getActiveSessions(any())).thenReturn(mMediaControllers);
|
||||
final UserHandle userHandle = mock(UserHandle.class);
|
||||
when(mUserTracker.getUserHandle()).thenReturn(userHandle);
|
||||
when(mSessionMediaController.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
||||
when(mSessionMediaController.getPlaybackState()).thenReturn(mPlaybackState);
|
||||
mMediaControllers.add(mSessionMediaController);
|
||||
when(mMediaSessionManager.getActiveSessionsForUser(any(),
|
||||
Mockito.eq(userHandle))).thenReturn(
|
||||
mMediaControllers);
|
||||
doReturn(mMediaSessionManager).when(mSpyContext).getSystemService(
|
||||
MediaSessionManager.class);
|
||||
when(mLocalBluetoothManager.getCachedDeviceManager()).thenReturn(
|
||||
@@ -182,7 +199,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
when(mFlags.isEnabled(Flags.OUTPUT_SWITCHER_ADVANCED_LAYOUT)).thenReturn(false);
|
||||
when(mFlags.isEnabled(Flags.OUTPUT_SWITCHER_ROUTES_PROCESSING)).thenReturn(false);
|
||||
mLocalMediaManager = spy(mMediaOutputController.mLocalMediaManager);
|
||||
@@ -205,6 +222,24 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
when(mNearbyDevice2.getRangeZone()).thenReturn(NearbyDevice.RANGE_CLOSE);
|
||||
mNearbyDevices.add(mNearbyDevice1);
|
||||
mNearbyDevices.add(mNearbyDevice2);
|
||||
|
||||
final List<NotificationEntry> entryList = new ArrayList<>();
|
||||
final NotificationEntry entry = mock(NotificationEntry.class);
|
||||
final StatusBarNotification sbn = mock(StatusBarNotification.class);
|
||||
final Bundle bundle = mock(Bundle.class);
|
||||
final MediaSession.Token token = mock(MediaSession.Token.class);
|
||||
final ISessionController binder = mock(ISessionController.class);
|
||||
entryList.add(entry);
|
||||
|
||||
when(mNotification.isMediaNotification()).thenReturn(false);
|
||||
when(mNotifCollection.getAllNotifs()).thenReturn(entryList);
|
||||
when(entry.getSbn()).thenReturn(sbn);
|
||||
when(sbn.getNotification()).thenReturn(mNotification);
|
||||
when(sbn.getPackageName()).thenReturn(TEST_PACKAGE_NAME);
|
||||
mNotification.extras = bundle;
|
||||
when(bundle.getParcelable(Notification.EXTRA_MEDIA_SESSION,
|
||||
MediaSession.Token.class)).thenReturn(token);
|
||||
when(token.getBinder()).thenReturn(binder);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -227,10 +262,19 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void start_withPackageName_verifyMediaControllerInit() {
|
||||
public void start_notificationNotFound_mediaControllerInitFromSession() {
|
||||
mMediaOutputController.start(mCb);
|
||||
|
||||
verify(mMediaController).registerCallback(any());
|
||||
verify(mSessionMediaController).registerCallback(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void start_MediaNotificationFound_mediaControllerNotInitFromSession() {
|
||||
when(mNotification.isMediaNotification()).thenReturn(true);
|
||||
mMediaOutputController.start(mCb);
|
||||
|
||||
verify(mSessionMediaController, never()).registerCallback(any());
|
||||
verifyZeroInteractions(mMediaSessionManager);
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -239,11 +283,11 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
|
||||
mMediaOutputController.start(mCb);
|
||||
|
||||
verify(mMediaController, never()).registerCallback(any());
|
||||
verify(mSessionMediaController, never()).registerCallback(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -256,11 +300,11 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
@Test
|
||||
public void stop_withPackageName_verifyMediaControllerDeinit() {
|
||||
mMediaOutputController.start(mCb);
|
||||
reset(mMediaController);
|
||||
reset(mSessionMediaController);
|
||||
|
||||
mMediaOutputController.stop();
|
||||
|
||||
verify(mMediaController).unregisterCallback(any());
|
||||
verify(mSessionMediaController).unregisterCallback(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -269,19 +313,19 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
|
||||
mMediaOutputController.start(mCb);
|
||||
|
||||
mMediaOutputController.stop();
|
||||
|
||||
verify(mMediaController, never()).unregisterCallback(any());
|
||||
verify(mSessionMediaController, never()).unregisterCallback(any());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void stop_nearbyMediaDevicesManagerNotNull_unregistersNearbyDevicesCallback() {
|
||||
mMediaOutputController.start(mCb);
|
||||
reset(mMediaController);
|
||||
reset(mSessionMediaController);
|
||||
|
||||
mMediaOutputController.stop();
|
||||
|
||||
@@ -509,7 +553,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
testMediaOutputController.start(mCb);
|
||||
reset(mCb);
|
||||
|
||||
@@ -532,7 +576,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
testMediaOutputController.start(mCb);
|
||||
reset(mCb);
|
||||
|
||||
@@ -568,7 +612,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
|
||||
LocalMediaManager testLocalMediaManager = spy(testMediaOutputController.mLocalMediaManager);
|
||||
testMediaOutputController.mLocalMediaManager = testLocalMediaManager;
|
||||
@@ -585,7 +629,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
|
||||
LocalMediaManager testLocalMediaManager = spy(testMediaOutputController.mLocalMediaManager);
|
||||
testMediaOutputController.mLocalMediaManager = testLocalMediaManager;
|
||||
@@ -684,7 +728,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void isPlaying_stateIsNull() {
|
||||
when(mMediaController.getPlaybackState()).thenReturn(null);
|
||||
when(mSessionMediaController.getPlaybackState()).thenReturn(null);
|
||||
|
||||
assertThat(mMediaOutputController.isPlaying()).isFalse();
|
||||
}
|
||||
@@ -726,7 +770,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void getHeaderTitle_withoutMetadata_returnDefaultString() {
|
||||
when(mMediaController.getMetadata()).thenReturn(null);
|
||||
when(mSessionMediaController.getMetadata()).thenReturn(null);
|
||||
|
||||
mMediaOutputController.start(mCb);
|
||||
|
||||
@@ -736,7 +780,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void getHeaderTitle_withMetadata_returnSongName() {
|
||||
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
||||
when(mSessionMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
||||
|
||||
mMediaOutputController.start(mCb);
|
||||
|
||||
@@ -745,7 +789,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void getHeaderSubTitle_withoutMetadata_returnNull() {
|
||||
when(mMediaController.getMetadata()).thenReturn(null);
|
||||
when(mSessionMediaController.getMetadata()).thenReturn(null);
|
||||
|
||||
mMediaOutputController.start(mCb);
|
||||
|
||||
@@ -754,7 +798,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
|
||||
@Test
|
||||
public void getHeaderSubTitle_withMetadata_returnArtistName() {
|
||||
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
||||
when(mSessionMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
||||
|
||||
mMediaOutputController.start(mCb);
|
||||
|
||||
@@ -868,7 +912,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
|
||||
assertThat(mMediaOutputController.getNotificationIcon()).isNull();
|
||||
}
|
||||
@@ -1060,7 +1104,7 @@ public class MediaOutputControllerTest extends SysuiTestCase {
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
|
||||
testMediaOutputController.setTemporaryAllowListExceptionIfNeeded(mMediaDevice2);
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ import android.media.session.MediaController;
|
||||
import android.media.session.MediaSessionManager;
|
||||
import android.media.session.PlaybackState;
|
||||
import android.os.PowerExemptionManager;
|
||||
import android.os.UserHandle;
|
||||
import android.testing.AndroidTestingRunner;
|
||||
import android.testing.TestableLooper;
|
||||
import android.util.FeatureFlagUtils;
|
||||
@@ -55,12 +56,14 @@ import com.android.systemui.broadcast.BroadcastSender;
|
||||
import com.android.systemui.flags.FeatureFlags;
|
||||
import com.android.systemui.media.nearby.NearbyMediaDevicesManager;
|
||||
import com.android.systemui.plugins.ActivityStarter;
|
||||
import com.android.systemui.settings.UserTracker;
|
||||
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@@ -98,6 +101,7 @@ public class MediaOutputDialogTest extends SysuiTestCase {
|
||||
private PowerExemptionManager mPowerExemptionManager = mock(PowerExemptionManager.class);
|
||||
private KeyguardManager mKeyguardManager = mock(KeyguardManager.class);
|
||||
private FeatureFlags mFlags = mock(FeatureFlags.class);
|
||||
private UserTracker mUserTracker = mock(UserTracker.class);
|
||||
|
||||
private List<MediaController> mMediaControllers = new ArrayList<>();
|
||||
private MediaOutputDialog mMediaOutputDialog;
|
||||
@@ -119,13 +123,17 @@ public class MediaOutputDialogTest extends SysuiTestCase {
|
||||
when(mMediaController.getMetadata()).thenReturn(mMediaMetadata);
|
||||
when(mMediaMetadata.getDescription()).thenReturn(mMediaDescription);
|
||||
mMediaControllers.add(mMediaController);
|
||||
when(mMediaSessionManager.getActiveSessions(any())).thenReturn(mMediaControllers);
|
||||
final UserHandle userHandle = mock(UserHandle.class);
|
||||
when(mUserTracker.getUserHandle()).thenReturn(userHandle);
|
||||
when(mMediaSessionManager.getActiveSessionsForUser(any(),
|
||||
Mockito.eq(userHandle))).thenReturn(
|
||||
mMediaControllers);
|
||||
|
||||
mMediaOutputController = new MediaOutputController(mContext, TEST_PACKAGE,
|
||||
mMediaSessionManager, mLocalBluetoothManager, mStarter,
|
||||
mNotifCollection, mDialogLaunchAnimator,
|
||||
Optional.of(mNearbyMediaDevicesManager), mAudioManager, mPowerExemptionManager,
|
||||
mKeyguardManager, mFlags);
|
||||
mKeyguardManager, mFlags, mUserTracker);
|
||||
mMediaOutputController.mLocalMediaManager = mLocalMediaManager;
|
||||
mMediaOutputDialog = makeTestDialog(mMediaOutputController);
|
||||
mMediaOutputDialog.show();
|
||||
|
||||
Reference in New Issue
Block a user