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