From a40517dcbe884f052c10735ae1d44c97f5e5c8d2 Mon Sep 17 00:00:00 2001 From: Jacqueline Bronger Date: Tue, 22 Aug 2023 16:32:46 +0200 Subject: Adjust PhoneMediaDevice icons and (sub)titles (TV) Bug: 292064765 Test: atest DeviceIconUtilTest Test: atest MediaDeviceManagerTest Test: atest MediaDeviceTest Change-Id: Ie11f399894516ef4db1a0cae673352cbbc9b5af1 --- packages/SettingsLib/res/drawable/ic_hdmi.xml | 26 ++ packages/SettingsLib/res/drawable/ic_tv.xml | 26 ++ packages/SettingsLib/res/drawable/ic_usb.xml | 26 ++ .../SettingsLib/res/drawable/ic_wired_device.xml | 25 ++ packages/SettingsLib/res/values/strings.xml | 22 ++ .../android/settingslib/media/DeviceIconUtil.java | 45 ++-- .../settingslib/media/PhoneMediaDevice.java | 99 +++++++- .../settingslib/media/DeviceIconUtilTest.java | 276 +++++++++++++++++---- .../MediaMuteAwaitConnectionManagerFactory.kt | 2 +- 9 files changed, 478 insertions(+), 69 deletions(-) create mode 100644 packages/SettingsLib/res/drawable/ic_hdmi.xml create mode 100644 packages/SettingsLib/res/drawable/ic_tv.xml create mode 100644 packages/SettingsLib/res/drawable/ic_usb.xml create mode 100644 packages/SettingsLib/res/drawable/ic_wired_device.xml diff --git a/packages/SettingsLib/res/drawable/ic_hdmi.xml b/packages/SettingsLib/res/drawable/ic_hdmi.xml new file mode 100644 index 000000000000..c7a553bddb8c --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_hdmi.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/packages/SettingsLib/res/drawable/ic_tv.xml b/packages/SettingsLib/res/drawable/ic_tv.xml new file mode 100644 index 000000000000..87abaf42bd65 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_tv.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/drawable/ic_usb.xml b/packages/SettingsLib/res/drawable/ic_usb.xml new file mode 100644 index 000000000000..b5f15eae3855 --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_usb.xml @@ -0,0 +1,26 @@ + + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/drawable/ic_wired_device.xml b/packages/SettingsLib/res/drawable/ic_wired_device.xml new file mode 100644 index 000000000000..7964c9f08d7e --- /dev/null +++ b/packages/SettingsLib/res/drawable/ic_wired_device.xml @@ -0,0 +1,25 @@ + + + + \ No newline at end of file diff --git a/packages/SettingsLib/res/values/strings.xml b/packages/SettingsLib/res/values/strings.xml index 22131df60b0d..a7d79c116da5 100644 --- a/packages/SettingsLib/res/values/strings.xml +++ b/packages/SettingsLib/res/values/strings.xml @@ -1327,6 +1327,8 @@ This phone This tablet + + @string/tv_media_transfer_default Dock speaker @@ -1350,6 +1352,26 @@ Can\’t play this media here + + Connected + + + HDMI ARC + + HDMI eARC + + + Connected via ARC + + Connected via eARC + + + TV Default + + HDMI Output + + Internal Speakers + Problem connecting. Turn device off & back on diff --git a/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java b/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java index 2a2841745fa0..cf224dc3be5f 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java @@ -18,11 +18,13 @@ package com.android.settingslib.media; import android.annotation.DrawableRes; import android.content.Context; +import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.media.AudioDeviceInfo; import android.media.MediaRoute2Info; import com.android.settingslib.R; +import com.android.settingslib.media.flags.Flags; import java.util.Arrays; import java.util.HashMap; @@ -31,16 +33,25 @@ import java.util.Map; /** A util class to get the appropriate icon for different device types. */ public class DeviceIconUtil { + + // A default icon to use if the type is not present in the map. + @DrawableRes private static final int DEFAULT_ICON = R.drawable.ic_smartphone; + @DrawableRes private static final int DEFAULT_ICON_TV = R.drawable.ic_media_speaker_device; + // A map from a @AudioDeviceInfo.AudioDeviceType to full device information. private final Map mAudioDeviceTypeToIconMap = new HashMap<>(); // A map from a @MediaRoute2Info.Type to full device information. private final Map mMediaRouteTypeToIconMap = new HashMap<>(); - // A default icon to use if the type is not present in the map. - @DrawableRes private static final int DEFAULT_ICON = R.drawable.ic_smartphone; - public DeviceIconUtil() { - List deviceList = - Arrays.asList( + private final boolean mIsTv; + + public DeviceIconUtil(Context context) { + this(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK)); + } + + public DeviceIconUtil(boolean isTv) { + mIsTv = isTv && Flags.enableTvMediaOutputDialog(); + List deviceList = Arrays.asList( new Device( AudioDeviceInfo.TYPE_USB_DEVICE, MediaRoute2Info.TYPE_USB_DEVICE, @@ -52,7 +63,7 @@ public class DeviceIconUtil { new Device( AudioDeviceInfo.TYPE_USB_ACCESSORY, MediaRoute2Info.TYPE_USB_ACCESSORY, - R.drawable.ic_headphone), + mIsTv ? R.drawable.ic_usb : R.drawable.ic_headphone), new Device( AudioDeviceInfo.TYPE_DOCK, MediaRoute2Info.TYPE_DOCK, @@ -60,29 +71,27 @@ public class DeviceIconUtil { new Device( AudioDeviceInfo.TYPE_HDMI, MediaRoute2Info.TYPE_HDMI, - R.drawable.ic_headphone), - // TODO: b/306359110 - Put proper iconography for HDMI_ARC type. + mIsTv ? R.drawable.ic_tv : R.drawable.ic_headphone), new Device( AudioDeviceInfo.TYPE_HDMI_ARC, MediaRoute2Info.TYPE_HDMI_ARC, - R.drawable.ic_headphone), - // TODO: b/306359110 - Put proper iconography for HDMI_EARC type. + mIsTv ? R.drawable.ic_hdmi : R.drawable.ic_headphone), new Device( AudioDeviceInfo.TYPE_HDMI_EARC, MediaRoute2Info.TYPE_HDMI_EARC, - R.drawable.ic_headphone), + mIsTv ? R.drawable.ic_hdmi : R.drawable.ic_headphone), new Device( AudioDeviceInfo.TYPE_WIRED_HEADSET, MediaRoute2Info.TYPE_WIRED_HEADSET, - R.drawable.ic_headphone), + mIsTv ? R.drawable.ic_wired_device : R.drawable.ic_headphone), new Device( AudioDeviceInfo.TYPE_WIRED_HEADPHONES, MediaRoute2Info.TYPE_WIRED_HEADPHONES, - R.drawable.ic_headphone), + mIsTv ? R.drawable.ic_wired_device : R.drawable.ic_headphone), new Device( AudioDeviceInfo.TYPE_BUILTIN_SPEAKER, MediaRoute2Info.TYPE_BUILTIN_SPEAKER, - R.drawable.ic_smartphone)); + mIsTv ? R.drawable.ic_tv : R.drawable.ic_smartphone)); for (int i = 0; i < deviceList.size(); i++) { Device device = deviceList.get(i); mAudioDeviceTypeToIconMap.put(device.mAudioDeviceType, device); @@ -90,6 +99,10 @@ public class DeviceIconUtil { } } + private int getDefaultIcon() { + return mIsTv ? DEFAULT_ICON_TV : DEFAULT_ICON; + } + /** Returns a drawable for an icon representing the given audioDeviceType. */ public Drawable getIconFromAudioDeviceType( @AudioDeviceInfo.AudioDeviceType int audioDeviceType, Context context) { @@ -103,7 +116,7 @@ public class DeviceIconUtil { if (mAudioDeviceTypeToIconMap.containsKey(audioDeviceType)) { return mAudioDeviceTypeToIconMap.get(audioDeviceType).mIconDrawableRes; } - return DEFAULT_ICON; + return getDefaultIcon(); } /** Returns a drawable res ID for an icon representing the given mediaRouteType. */ @@ -113,7 +126,7 @@ public class DeviceIconUtil { if (mMediaRouteTypeToIconMap.containsKey(mediaRouteType)) { return mMediaRouteTypeToIconMap.get(mediaRouteType).mIconDrawableRes; } - return DEFAULT_ICON; + return getDefaultIcon(); } private static class Device { diff --git a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java index c44f66e99d00..80eeab56cc45 100644 --- a/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java +++ b/packages/SettingsLib/src/com/android/settingslib/media/PhoneMediaDevice.java @@ -28,15 +28,24 @@ import static android.media.MediaRoute2Info.TYPE_WIRED_HEADSET; import static com.android.settingslib.media.MediaDevice.SelectionBehavior.SELECTION_BEHAVIOR_TRANSFER; +import android.Manifest; import android.annotation.NonNull; import android.content.Context; +import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; +import android.hardware.hdmi.HdmiControlManager; +import android.hardware.hdmi.HdmiDeviceInfo; +import android.hardware.hdmi.HdmiPortInfo; import android.media.MediaRoute2Info; import android.media.RouteListingPreference; +import android.util.Log; import androidx.annotation.VisibleForTesting; import com.android.settingslib.R; +import com.android.settingslib.media.flags.Flags; + +import java.util.List; /** * PhoneMediaDevice extends MediaDevice to represents Phone device. @@ -58,6 +67,7 @@ public class PhoneMediaDevice extends MediaDevice { public static String getSystemRouteNameFromType( @NonNull Context context, @NonNull MediaRoute2Info routeInfo) { CharSequence name; + boolean isTv = isTv(context); switch (routeInfo.getType()) { case TYPE_WIRED_HEADSET: case TYPE_WIRED_HEADPHONES: @@ -73,9 +83,32 @@ public class PhoneMediaDevice extends MediaDevice { name = context.getString(R.string.media_transfer_this_device_name); break; case TYPE_HDMI: + name = context.getString(isTv ? R.string.tv_media_transfer_default : + R.string.media_transfer_external_device_name); + break; case TYPE_HDMI_ARC: + if (isTv) { + String deviceName = getHdmiOutDeviceName(context); + if (deviceName != null) { + name = deviceName; + } else { + name = context.getString(R.string.tv_media_transfer_arc_fallback_title); + } + } else { + name = context.getString(R.string.media_transfer_external_device_name); + } + break; case TYPE_HDMI_EARC: - name = context.getString(R.string.media_transfer_external_device_name); + if (isTv) { + String deviceName = getHdmiOutDeviceName(context); + if (deviceName != null) { + name = deviceName; + } else { + name = context.getString(R.string.tv_media_transfer_arc_fallback_title); + } + } else { + name = context.getString(R.string.media_transfer_external_device_name); + } break; default: name = context.getString(R.string.media_transfer_default_device_name); @@ -94,10 +127,15 @@ public class PhoneMediaDevice extends MediaDevice { String packageName, RouteListingPreference.Item item) { super(context, info, packageName, item); - mDeviceIconUtil = new DeviceIconUtil(); + mDeviceIconUtil = new DeviceIconUtil(mContext); initDeviceRecord(); } + static boolean isTv(Context context) { + return context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK) + && Flags.enableTvMediaOutputDialog(); + } + // MediaRoute2Info.getType was made public on API 34, but exists since API 30. @SuppressWarnings("NewApi") @Override @@ -111,9 +149,64 @@ public class PhoneMediaDevice extends MediaDevice { return SELECTION_BEHAVIOR_TRANSFER; } + private static String getHdmiOutDeviceName(Context context) { + HdmiControlManager hdmiControlManager; + if (context.checkCallingOrSelfPermission(Manifest.permission.HDMI_CEC) + == PackageManager.PERMISSION_GRANTED) { + hdmiControlManager = context.getSystemService(HdmiControlManager.class); + } else { + Log.w(TAG, "Could not get HDMI device name, android.permission.HDMI_CEC denied"); + return null; + } + + HdmiPortInfo hdmiOutputPortInfo = null; + for (HdmiPortInfo hdmiPortInfo : hdmiControlManager.getPortInfo()) { + if (hdmiPortInfo.getType() == HdmiPortInfo.PORT_OUTPUT) { + hdmiOutputPortInfo = hdmiPortInfo; + break; + } + } + if (hdmiOutputPortInfo == null) { + return null; + } + List connectedDevices = hdmiControlManager.getConnectedDevices(); + for (HdmiDeviceInfo deviceInfo : connectedDevices) { + if (deviceInfo.getPortId() == hdmiOutputPortInfo.getId()) { + String deviceName = deviceInfo.getDisplayName(); + if (deviceName != null && !deviceName.isEmpty()) { + return deviceName; + } + } + } + return null; + } + @Override public String getSummary() { - return mSummary; + if (!isTv(mContext)) { + return mSummary; + } + switch (mRouteInfo.getType()) { + case TYPE_BUILTIN_SPEAKER: + return mContext.getString(R.string.tv_media_transfer_internal_speakers); + case TYPE_HDMI: + return mContext.getString(R.string.tv_media_transfer_hdmi); + case TYPE_HDMI_ARC: + if (getHdmiOutDeviceName(mContext) == null) { + // Connection type is already part of the title. + return mContext.getString(R.string.tv_media_transfer_connected); + } + return mContext.getString(R.string.tv_media_transfer_arc_subtitle); + case TYPE_HDMI_EARC: + if (getHdmiOutDeviceName(mContext) == null) { + // Connection type is already part of the title. + return mContext.getString(R.string.tv_media_transfer_connected); + } + return mContext.getString(R.string.tv_media_transfer_earc_subtitle); + default: + return null; + } + } @Override diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/DeviceIconUtilTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/DeviceIconUtilTest.java index 72dfc1733275..5669276a0424 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/DeviceIconUtilTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/DeviceIconUtilTest.java @@ -20,131 +20,309 @@ import static com.google.common.truth.Truth.assertThat; import android.media.AudioDeviceInfo; import android.media.MediaRoute2Info; +import android.platform.test.flag.junit.SetFlagsRule; import com.android.settingslib.R; +import com.android.settingslib.media.flags.Flags; +import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; @RunWith(RobolectricTestRunner.class) public class DeviceIconUtilTest { - private final DeviceIconUtil mDeviceIconUtil = new DeviceIconUtil(); + + @Rule + public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + + @Before + public void setup() { + mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TV_MEDIA_OUTPUT_DIALOG); + } @Test public void getIconResIdFromMediaRouteType_usbDevice_isHeadphone() { - assertThat(mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_DEVICE)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_DEVICE)) + .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_DEVICE)) + .isEqualTo(R.drawable.ic_headphone); } @Test public void getIconResIdFromMediaRouteType_usbHeadset_isHeadphone() { - assertThat(mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_HEADSET)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_HEADSET)) + .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_HEADSET)) + .isEqualTo(R.drawable.ic_headphone); } @Test public void getIconResIdFromMediaRouteType_usbAccessory_isHeadphone() { - assertThat( - mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_ACCESSORY)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_ACCESSORY)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromMediaRouteType_tv_usbAccessory_isUsb() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_USB_ACCESSORY)) + .isEqualTo(R.drawable.ic_usb); + } + + @Test + public void getIconResIdFromMediaRouteType_dock_isDock() { + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_DOCK)) + .isEqualTo(R.drawable.ic_dock_device); + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_DOCK)) + .isEqualTo(R.drawable.ic_dock_device); + } + + @Test + public void getIconResIdFromMediaRouteType_hdmi() { + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_HDMI)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromMediaRouteType_tv_hdmi_isTv() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_HDMI)) + .isEqualTo(R.drawable.ic_tv); + } + + @Test + public void getIconResIdFromMediaRouteType_hdmiArc_isHeadphone() { + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_HDMI_ARC)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromMediaRouteType_tv_hdmiArc_isHdmi() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_HDMI_ARC)) + .isEqualTo(R.drawable.ic_hdmi); } @Test - public void getIconResIdFromMediaRouteType_dock_isHeadphone() { - assertThat(mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_DOCK)) - .isEqualTo(R.drawable.ic_headphone); + public void getIconResIdFromMediaRouteType_hdmiEarc_isHeadphone() { + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_HDMI_EARC)) + .isEqualTo(R.drawable.ic_headphone); } @Test - public void getIconResIdFromMediaRouteType_hdmi_isHeadphone() { - assertThat(mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_HDMI)) - .isEqualTo(R.drawable.ic_headphone); + public void getIconResIdFromMediaRouteType_tv_hdmiEarc_isHdmi() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_HDMI_EARC)) + .isEqualTo(R.drawable.ic_hdmi); } @Test public void getIconResIdFromMediaRouteType_wiredHeadset_isHeadphone() { - assertThat( - mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_WIRED_HEADSET)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_WIRED_HEADSET)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromMediaRouteType_tv_wiredHeadset_isWiredDevice() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_WIRED_HEADSET)) + .isEqualTo(R.drawable.ic_wired_device); } @Test public void getIconResIdFromMediaRouteType_wiredHeadphones_isHeadphone() { - assertThat( - mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_WIRED_HEADPHONES)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_WIRED_HEADPHONES)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromMediaRouteType_tv_wiredHeadphones_isWiredDevice() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_WIRED_HEADPHONES)) + .isEqualTo(R.drawable.ic_wired_device); } @Test public void getIconResIdFromMediaRouteType_builtinSpeaker_isSmartphone() { - assertThat( - mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_BUILTIN_SPEAKER)) - .isEqualTo(R.drawable.ic_smartphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_BUILTIN_SPEAKER)) + .isEqualTo(R.drawable.ic_smartphone); + } + + @Test + public void getIconResIdFromMediaRouteType_tv_builtinSpeaker_isTv() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_BUILTIN_SPEAKER)) + .isEqualTo(R.drawable.ic_tv); } @Test public void getIconResIdFromMediaRouteType_unsupportedType_isSmartphone() { - assertThat(mDeviceIconUtil.getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_UNKNOWN)) - .isEqualTo(R.drawable.ic_smartphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_UNKNOWN)) + .isEqualTo(R.drawable.ic_smartphone); + } + + @Test + public void getIconResIdFromMediaRouteType_tv_unsupportedType_isSpeaker() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_UNKNOWN)) + .isEqualTo(R.drawable.ic_media_speaker_device); } @Test public void getIconResIdFromAudioDeviceType_usbDevice_isHeadphone() { - assertThat(mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_DEVICE)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_DEVICE)) + .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_DEVICE)) + .isEqualTo(R.drawable.ic_headphone); } @Test public void getIconResIdFromAudioDeviceType_usbHeadset_isHeadphone() { - assertThat( - mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_HEADSET)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_HEADSET)) + .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_HEADSET)) + .isEqualTo(R.drawable.ic_headphone); } @Test public void getIconResIdFromAudioDeviceType_usbAccessory_isHeadphone() { - assertThat( - mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_ACCESSORY)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_ACCESSORY)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromAudioDeviceType_tv_usbAccessory_isUsb() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_USB_ACCESSORY)) + .isEqualTo(R.drawable.ic_usb); } @Test - public void getIconResIdFromAudioDeviceType_dock_isHeadphone() { - assertThat(mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_DOCK)) - .isEqualTo(R.drawable.ic_headphone); + public void getIconResIdFromAudioDeviceType_dock_isDock() { + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_DOCK)) + .isEqualTo(R.drawable.ic_dock_device); + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_DOCK)) + .isEqualTo(R.drawable.ic_dock_device); } @Test public void getIconResIdFromAudioDeviceType_hdmi_isHeadphone() { - assertThat(mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_HDMI)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_HDMI)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromAudioDeviceType_tv_hdmi_isTv() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_HDMI)) + .isEqualTo(R.drawable.ic_tv); + } + + @Test + public void getIconResIdFromAudioDeviceType_hdmiArc_isHeadphone() { + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_HDMI_ARC)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromAudioDeviceType_hdmiArc_isHdmi() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_HDMI_ARC)) + .isEqualTo(R.drawable.ic_hdmi); + } + + @Test + public void getIconResIdFromAudioDeviceType_hdmiEarc_isHeadphone() { + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_HDMI_EARC)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromAudioDeviceType_tv_hdmiEarc() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_HDMI_EARC)) + .isEqualTo(R.drawable.ic_hdmi); } @Test public void getIconResIdFromAudioDeviceType_wiredHeadset_isHeadphone() { - assertThat( - mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_WIRED_HEADSET)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_WIRED_HEADSET)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromAudioDeviceType_tv_wiredHeadset_isWiredDevice() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_WIRED_HEADSET)) + .isEqualTo(R.drawable.ic_wired_device); } @Test public void getIconResIdFromAudioDeviceType_wiredHeadphones_isHeadphone() { - assertThat( - mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_WIRED_HEADPHONES)) - .isEqualTo(R.drawable.ic_headphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_WIRED_HEADPHONES)) + .isEqualTo(R.drawable.ic_headphone); + } + + @Test + public void getIconResIdFromAudioDeviceType_tv_wiredHeadphones_isWiredDevice() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_WIRED_HEADPHONES)) + .isEqualTo(R.drawable.ic_wired_device); } @Test public void getIconResIdFromAudioDeviceType_builtinSpeaker_isSmartphone() { - assertThat( - mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)) - .isEqualTo(R.drawable.ic_smartphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)) + .isEqualTo(R.drawable.ic_smartphone); + } + + @Test + public void getIconResIdFromAudioDeviceType_tv_builtinSpeaker_isTv() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_BUILTIN_SPEAKER)) + .isEqualTo(R.drawable.ic_tv); } @Test public void getIconResIdFromAudioDeviceType_unsupportedType_isSmartphone() { - assertThat(mDeviceIconUtil.getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_UNKNOWN)) - .isEqualTo(R.drawable.ic_smartphone); + assertThat(new DeviceIconUtil(/* isTv */ false) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_UNKNOWN)) + .isEqualTo(R.drawable.ic_smartphone); + } + + @Test + public void getIconResIdFromAudioDeviceType_tv_unsupportedType_isSpeaker() { + assertThat(new DeviceIconUtil(/* isTv */ true) + .getIconResIdFromAudioDeviceType(AudioDeviceInfo.TYPE_UNKNOWN)) + .isEqualTo(R.drawable.ic_media_speaker_device); } } diff --git a/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerFactory.kt b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerFactory.kt index 97ec654a627b..6e3b7b865cb0 100644 --- a/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerFactory.kt +++ b/packages/SystemUI/src/com/android/systemui/media/muteawait/MediaMuteAwaitConnectionManagerFactory.kt @@ -31,7 +31,7 @@ class MediaMuteAwaitConnectionManagerFactory @Inject constructor( private val logger: MediaMuteAwaitLogger, @Main private val mainExecutor: Executor ) { - private val deviceIconUtil = DeviceIconUtil() + private val deviceIconUtil = DeviceIconUtil(context) /** Creates a [MediaMuteAwaitConnectionManager]. */ fun create(localMediaManager: LocalMediaManager): MediaMuteAwaitConnectionManager { -- cgit v1.2.3-59-g8ed1b