Loading packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java +15 −3 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.media.MediaRoute2Info; import android.os.SystemProperties; import android.util.SparseIntArray; import androidx.annotation.NonNull; Loading @@ -42,6 +43,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.R; import com.android.settingslib.media.flags.Flags; import java.util.Arrays; import java.util.Objects; /** A util class to get the appropriate icon for different device types. */ Loading @@ -50,18 +52,23 @@ public class DeviceIconUtil { private static final SparseIntArray AUDIO_DEVICE_TO_MEDIA_ROUTE_TYPE = new SparseIntArray(); private final boolean mIsTv; private final boolean mIsTablet; private final Context mContext; public DeviceIconUtil(@NonNull Context context) { mContext = Objects.requireNonNull(context); mIsTv = mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK) && Flags.enableTvMediaOutputDialog(); mIsTablet = Arrays.asList(SystemProperties.get("ro.build.characteristics").split(",")) .contains("tablet"); } @VisibleForTesting /* package */ DeviceIconUtil(boolean isTv) { mContext = null; mIsTv = isTv; mIsTablet = false; } /** Returns a drawable for an icon representing the given audioDeviceType. */ Loading @@ -80,12 +87,17 @@ public class DeviceIconUtil { /** Returns a drawable res ID for an icon representing the given mediaRouteType. */ @DrawableRes public int getIconResIdFromMediaRouteType(@MediaRoute2Info.Type int type) { return mIsTv ? getIconResourceIdForTv(type) : getIconResourceIdForPhone(type); return mIsTv ? getIconResourceIdForTv(type) : getIconResourceIdForPhoneOrTablet(type, mIsTablet); } @SuppressLint("SwitchIntDef") @DrawableRes private static int getIconResourceIdForPhone(@MediaRoute2Info.Type int type) { private static int getIconResourceIdForPhoneOrTablet( @MediaRoute2Info.Type int type, boolean isTablet) { int defaultResId = isTablet ? R.drawable.ic_media_tablet : R.drawable.ic_smartphone; return switch (type) { case MediaRoute2Info.TYPE_USB_DEVICE, MediaRoute2Info.TYPE_USB_HEADSET, Loading @@ -98,7 +110,7 @@ public class DeviceIconUtil { MediaRoute2Info.TYPE_HDMI_ARC, MediaRoute2Info.TYPE_HDMI_EARC -> R.drawable.ic_external_display; default -> R.drawable.ic_smartphone; // Includes TYPE_BUILTIN_SPEAKER. default -> defaultResId; // Includes TYPE_BUILTIN_SPEAKER. }; } Loading packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/DeviceIconUtilTest.java +22 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.settingslib.media; import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.media.AudioDeviceInfo; import android.media.MediaRoute2Info; import android.platform.test.flag.junit.SetFlagsRule; Loading @@ -30,6 +31,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.ShadowSystemProperties; @RunWith(RobolectricTestRunner.class) public class DeviceIconUtilTest { Loading @@ -37,9 +40,12 @@ public class DeviceIconUtilTest { @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private Context mContext; @Before public void setup() { mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TV_MEDIA_OUTPUT_DIALOG); mContext = RuntimeEnvironment.getApplication(); } @Test Loading Loading @@ -170,6 +176,14 @@ public class DeviceIconUtilTest { .isEqualTo(R.drawable.ic_tv); } @Test public void getIconResIdFromMediaRouteType_onTablet_builtinSpeaker_isTablet() { ShadowSystemProperties.override("ro.build.characteristics", "tablet"); assertThat(new DeviceIconUtil(mContext) .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_BUILTIN_SPEAKER)) .isEqualTo(R.drawable.ic_media_tablet); } @Test public void getIconResIdFromMediaRouteType_unsupportedType_isSmartphone() { assertThat(new DeviceIconUtil(/* isTv */ false) Loading @@ -177,6 +191,14 @@ public class DeviceIconUtilTest { .isEqualTo(R.drawable.ic_smartphone); } @Test public void getIconResIdFromMediaRouteType_onTablet_unsupportedType_isTablet() { ShadowSystemProperties.override("ro.build.characteristics", "tablet"); assertThat(new DeviceIconUtil(mContext) .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_UNKNOWN)) .isEqualTo(R.drawable.ic_media_tablet); } @Test public void getIconResIdFromMediaRouteType_tv_unsupportedType_isSpeaker() { assertThat(new DeviceIconUtil(/* isTv */ true) Loading packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ class AudioOutputInteractorTest : SysuiTestCase() { addOverride(R.drawable.ic_headphone, testIcon) addOverride(R.drawable.ic_smartphone, testIcon) addOverride(R.drawable.ic_media_speaker_device, testIcon) addOverride(R.drawable.ic_media_tablet, testIcon) addOverride(com.android.internal.R.drawable.ic_bt_hearing_aid, testIcon) Loading packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputComponentInteractorTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ class MediaOutputComponentInteractorTest : SysuiTestCase() { with(context.orCreateTestableResources) { addOverride(R.drawable.ic_smartphone, testIcon) addOverride(R.drawable.ic_media_tablet, testIcon) addOverride(R.string.media_transfer_this_device_name_tv, builtInDeviceName) addOverride(R.string.media_transfer_this_device_name_tablet, builtInDeviceName) Loading Loading
packages/SettingsLib/src/com/android/settingslib/media/DeviceIconUtil.java +15 −3 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.graphics.drawable.Drawable; import android.media.MediaRoute2Info; import android.os.SystemProperties; import android.util.SparseIntArray; import androidx.annotation.NonNull; Loading @@ -42,6 +43,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.settingslib.R; import com.android.settingslib.media.flags.Flags; import java.util.Arrays; import java.util.Objects; /** A util class to get the appropriate icon for different device types. */ Loading @@ -50,18 +52,23 @@ public class DeviceIconUtil { private static final SparseIntArray AUDIO_DEVICE_TO_MEDIA_ROUTE_TYPE = new SparseIntArray(); private final boolean mIsTv; private final boolean mIsTablet; private final Context mContext; public DeviceIconUtil(@NonNull Context context) { mContext = Objects.requireNonNull(context); mIsTv = mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_LEANBACK) && Flags.enableTvMediaOutputDialog(); mIsTablet = Arrays.asList(SystemProperties.get("ro.build.characteristics").split(",")) .contains("tablet"); } @VisibleForTesting /* package */ DeviceIconUtil(boolean isTv) { mContext = null; mIsTv = isTv; mIsTablet = false; } /** Returns a drawable for an icon representing the given audioDeviceType. */ Loading @@ -80,12 +87,17 @@ public class DeviceIconUtil { /** Returns a drawable res ID for an icon representing the given mediaRouteType. */ @DrawableRes public int getIconResIdFromMediaRouteType(@MediaRoute2Info.Type int type) { return mIsTv ? getIconResourceIdForTv(type) : getIconResourceIdForPhone(type); return mIsTv ? getIconResourceIdForTv(type) : getIconResourceIdForPhoneOrTablet(type, mIsTablet); } @SuppressLint("SwitchIntDef") @DrawableRes private static int getIconResourceIdForPhone(@MediaRoute2Info.Type int type) { private static int getIconResourceIdForPhoneOrTablet( @MediaRoute2Info.Type int type, boolean isTablet) { int defaultResId = isTablet ? R.drawable.ic_media_tablet : R.drawable.ic_smartphone; return switch (type) { case MediaRoute2Info.TYPE_USB_DEVICE, MediaRoute2Info.TYPE_USB_HEADSET, Loading @@ -98,7 +110,7 @@ public class DeviceIconUtil { MediaRoute2Info.TYPE_HDMI_ARC, MediaRoute2Info.TYPE_HDMI_EARC -> R.drawable.ic_external_display; default -> R.drawable.ic_smartphone; // Includes TYPE_BUILTIN_SPEAKER. default -> defaultResId; // Includes TYPE_BUILTIN_SPEAKER. }; } Loading
packages/SettingsLib/tests/robotests/src/com/android/settingslib/media/DeviceIconUtilTest.java +22 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.settingslib.media; import static com.google.common.truth.Truth.assertThat; import android.content.Context; import android.media.AudioDeviceInfo; import android.media.MediaRoute2Info; import android.platform.test.flag.junit.SetFlagsRule; Loading @@ -30,6 +31,8 @@ import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; import org.robolectric.RuntimeEnvironment; import org.robolectric.shadows.ShadowSystemProperties; @RunWith(RobolectricTestRunner.class) public class DeviceIconUtilTest { Loading @@ -37,9 +40,12 @@ public class DeviceIconUtilTest { @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); private Context mContext; @Before public void setup() { mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_TV_MEDIA_OUTPUT_DIALOG); mContext = RuntimeEnvironment.getApplication(); } @Test Loading Loading @@ -170,6 +176,14 @@ public class DeviceIconUtilTest { .isEqualTo(R.drawable.ic_tv); } @Test public void getIconResIdFromMediaRouteType_onTablet_builtinSpeaker_isTablet() { ShadowSystemProperties.override("ro.build.characteristics", "tablet"); assertThat(new DeviceIconUtil(mContext) .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_BUILTIN_SPEAKER)) .isEqualTo(R.drawable.ic_media_tablet); } @Test public void getIconResIdFromMediaRouteType_unsupportedType_isSmartphone() { assertThat(new DeviceIconUtil(/* isTv */ false) Loading @@ -177,6 +191,14 @@ public class DeviceIconUtilTest { .isEqualTo(R.drawable.ic_smartphone); } @Test public void getIconResIdFromMediaRouteType_onTablet_unsupportedType_isTablet() { ShadowSystemProperties.override("ro.build.characteristics", "tablet"); assertThat(new DeviceIconUtil(mContext) .getIconResIdFromMediaRouteType(MediaRoute2Info.TYPE_UNKNOWN)) .isEqualTo(R.drawable.ic_media_tablet); } @Test public void getIconResIdFromMediaRouteType_tv_unsupportedType_isSpeaker() { assertThat(new DeviceIconUtil(/* isTv */ true) Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/volume/domain/interactor/AudioOutputInteractorTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -71,6 +71,7 @@ class AudioOutputInteractorTest : SysuiTestCase() { addOverride(R.drawable.ic_headphone, testIcon) addOverride(R.drawable.ic_smartphone, testIcon) addOverride(R.drawable.ic_media_speaker_device, testIcon) addOverride(R.drawable.ic_media_tablet, testIcon) addOverride(com.android.internal.R.drawable.ic_bt_hearing_aid, testIcon) Loading
packages/SystemUI/multivalentTests/src/com/android/systemui/volume/panel/component/mediaoutput/domain/interactor/MediaOutputComponentInteractorTest.kt +1 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ class MediaOutputComponentInteractorTest : SysuiTestCase() { with(context.orCreateTestableResources) { addOverride(R.drawable.ic_smartphone, testIcon) addOverride(R.drawable.ic_media_tablet, testIcon) addOverride(R.string.media_transfer_this_device_name_tv, builtInDeviceName) addOverride(R.string.media_transfer_this_device_name_tablet, builtInDeviceName) Loading