diff --git a/packages/SystemUI/res/values/strings.xml b/packages/SystemUI/res/values/strings.xml
index 227b00ee6aa2a..7d5b66e9cbab9 100644
--- a/packages/SystemUI/res/values/strings.xml
+++ b/packages/SystemUI/res/values/strings.xml
@@ -2382,6 +2382,10 @@
Loading
tablet
+
+ Casting your media
+
+ Casting %1$s
Inactive, check app
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt
index a3ae943c97047..720c44a0904b4 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/common/MediaTttUtils.kt
@@ -44,25 +44,37 @@ class MediaTttUtils {
* @param appPackageName the package name of the app playing the media.
* @param onPackageNotFoundException a function run if a
* [PackageManager.NameNotFoundException] occurs.
+ * @param isReceiver indicates whether the icon is displayed in a receiver view.
*/
fun getIconInfoFromPackageName(
context: Context,
appPackageName: String?,
+ isReceiver: Boolean,
onPackageNotFoundException: () -> Unit,
): IconInfo {
if (appPackageName != null) {
val packageManager = context.packageManager
try {
+ val appName =
+ packageManager
+ .getApplicationInfo(
+ appPackageName,
+ PackageManager.ApplicationInfoFlags.of(0),
+ )
+ .loadLabel(packageManager)
+ .toString()
val contentDescription =
- ContentDescription.Loaded(
- packageManager
- .getApplicationInfo(
- appPackageName,
- PackageManager.ApplicationInfoFlags.of(0)
+ if (isReceiver) {
+ ContentDescription.Loaded(
+ context.getString(
+ R.string
+ .media_transfer_receiver_content_description_with_app_name,
+ appName
)
- .loadLabel(packageManager)
- .toString()
- )
+ )
+ } else {
+ ContentDescription.Loaded(appName)
+ }
return IconInfo(
contentDescription,
MediaTttIcon.Loaded(packageManager.getApplicationIcon(appPackageName)),
@@ -74,7 +86,15 @@ class MediaTttUtils {
}
}
return IconInfo(
- ContentDescription.Resource(R.string.media_output_dialog_unknown_launch_app_name),
+ if (isReceiver) {
+ ContentDescription.Resource(
+ R.string.media_transfer_receiver_content_description_unknown_app
+ )
+ } else {
+ ContentDescription.Resource(
+ R.string.media_output_dialog_unknown_launch_app_name
+ )
+ },
MediaTttIcon.Resource(R.drawable.ic_cast),
tintAttr = android.R.attr.textColorPrimary,
isAppIcon = false
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
index 34bf74faa11ab..8000cd84b151a 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiver.kt
@@ -173,7 +173,11 @@ open class MediaTttChipControllerReceiver @Inject constructor(
override fun updateView(newInfo: ChipReceiverInfo, currentView: ViewGroup) {
val packageName = newInfo.routeInfo.clientPackageName
- var iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, packageName) {
+ var iconInfo = MediaTttUtils.getIconInfoFromPackageName(
+ context,
+ packageName,
+ isReceiver = true,
+ ) {
logger.logPackageNotFound(packageName)
}
diff --git a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt
index 89ca5d33645c2..6bb6906a0dfc9 100644
--- a/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt
+++ b/packages/SystemUI/src/com/android/systemui/media/taptotransfer/sender/MediaTttSenderCoordinator.kt
@@ -161,7 +161,7 @@ constructor(
routeInfo.name.toString()
}
val icon =
- MediaTttUtils.getIconInfoFromPackageName(context, packageName) {
+ MediaTttUtils.getIconInfoFromPackageName(context, packageName, isReceiver = false) {
logger.logPackageNotFound(packageName)
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt
index 8055b987973be..4fc9ca71aeaaa 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/common/MediaTttUtilsTest.kt
@@ -65,7 +65,13 @@ class MediaTttUtilsTest : SysuiTestCase() {
@Test
fun getIconInfoFromPackageName_nullPackageName_returnsDefault() {
- val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, appPackageName = null) {}
+ val iconInfo =
+ MediaTttUtils.getIconInfoFromPackageName(
+ context,
+ appPackageName = null,
+ isReceiver = false,
+ ) {
+ }
assertThat(iconInfo.isAppIcon).isFalse()
assertThat(iconInfo.contentDescription.loadContentDescription(context))
@@ -73,11 +79,33 @@ class MediaTttUtilsTest : SysuiTestCase() {
assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Resource(R.drawable.ic_cast))
}
+ @Test
+ fun getIconInfoFromPackageName_nullPackageName_isReceiver_returnsDefault() {
+ val iconInfo =
+ MediaTttUtils.getIconInfoFromPackageName(
+ context,
+ appPackageName = null,
+ isReceiver = true,
+ ) {
+ }
+
+ assertThat(iconInfo.isAppIcon).isFalse()
+ assertThat(iconInfo.contentDescription.loadContentDescription(context))
+ .isEqualTo(
+ context.getString(R.string.media_transfer_receiver_content_description_unknown_app)
+ )
+ assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Resource(R.drawable.ic_cast))
+ }
+
@Test
fun getIconInfoFromPackageName_nullPackageName_exceptionFnNotTriggered() {
var exceptionTriggered = false
- MediaTttUtils.getIconInfoFromPackageName(context, appPackageName = null) {
+ MediaTttUtils.getIconInfoFromPackageName(
+ context,
+ appPackageName = null,
+ isReceiver = false,
+ ) {
exceptionTriggered = true
}
@@ -86,7 +114,13 @@ class MediaTttUtilsTest : SysuiTestCase() {
@Test
fun getIconInfoFromPackageName_invalidPackageName_returnsDefault() {
- val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, "fakePackageName") {}
+ val iconInfo =
+ MediaTttUtils.getIconInfoFromPackageName(
+ context,
+ appPackageName = "fakePackageName",
+ isReceiver = false,
+ ) {
+ }
assertThat(iconInfo.isAppIcon).isFalse()
assertThat(iconInfo.contentDescription.loadContentDescription(context))
@@ -94,31 +128,102 @@ class MediaTttUtilsTest : SysuiTestCase() {
assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Resource(R.drawable.ic_cast))
}
+ @Test
+ fun getIconInfoFromPackageName_invalidPackageName_isReceiver_returnsDefault() {
+ val iconInfo =
+ MediaTttUtils.getIconInfoFromPackageName(
+ context,
+ appPackageName = "fakePackageName",
+ isReceiver = true,
+ ) {
+ }
+
+ assertThat(iconInfo.isAppIcon).isFalse()
+ assertThat(iconInfo.contentDescription.loadContentDescription(context))
+ .isEqualTo(
+ context.getString(R.string.media_transfer_receiver_content_description_unknown_app)
+ )
+ assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Resource(R.drawable.ic_cast))
+ }
+
@Test
fun getIconInfoFromPackageName_invalidPackageName_exceptionFnTriggered() {
var exceptionTriggered = false
- MediaTttUtils.getIconInfoFromPackageName(context, appPackageName = "fakePackageName") {
- exceptionTriggered = true
- }
+ MediaTttUtils.getIconInfoFromPackageName(
+ context,
+ appPackageName = "fakePackageName",
+ isReceiver = false
+ ) { exceptionTriggered = true }
+
+ assertThat(exceptionTriggered).isTrue()
+ }
+
+ @Test
+ fun getIconInfoFromPackageName_invalidPackageName_isReceiver_exceptionFnTriggered() {
+ var exceptionTriggered = false
+
+ MediaTttUtils.getIconInfoFromPackageName(
+ context,
+ appPackageName = "fakePackageName",
+ isReceiver = true
+ ) { exceptionTriggered = true }
assertThat(exceptionTriggered).isTrue()
}
@Test
fun getIconInfoFromPackageName_validPackageName_returnsAppInfo() {
- val iconInfo = MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME) {}
+ val iconInfo =
+ MediaTttUtils.getIconInfoFromPackageName(
+ context,
+ PACKAGE_NAME,
+ isReceiver = false,
+ ) {
+ }
assertThat(iconInfo.isAppIcon).isTrue()
assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Loaded(appIconFromPackageName))
assertThat(iconInfo.contentDescription.loadContentDescription(context)).isEqualTo(APP_NAME)
}
+ @Test
+ fun getIconInfoFromPackageName_validPackageName_isReceiver_returnsAppInfo() {
+ val iconInfo =
+ MediaTttUtils.getIconInfoFromPackageName(
+ context,
+ PACKAGE_NAME,
+ isReceiver = true,
+ ) {
+ }
+
+ assertThat(iconInfo.isAppIcon).isTrue()
+ assertThat(iconInfo.icon).isEqualTo(MediaTttIcon.Loaded(appIconFromPackageName))
+ assertThat(iconInfo.contentDescription.loadContentDescription(context))
+ .isEqualTo(
+ context.getString(
+ R.string.media_transfer_receiver_content_description_with_app_name,
+ APP_NAME
+ )
+ )
+ }
+
@Test
fun getIconInfoFromPackageName_validPackageName_exceptionFnNotTriggered() {
var exceptionTriggered = false
- MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME) {
+ MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME, isReceiver = false) {
+ exceptionTriggered = true
+ }
+
+ assertThat(exceptionTriggered).isFalse()
+ }
+
+ @Test
+ fun getIconInfoFromPackageName_validPackageName_isReceiver_exceptionFnNotTriggered() {
+ var exceptionTriggered = false
+
+ MediaTttUtils.getIconInfoFromPackageName(context, PACKAGE_NAME, isReceiver = true) {
exceptionTriggered = true
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
index dba2da7d74b24..19dd2f035c627 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/media/taptotransfer/receiver/MediaTttChipControllerReceiverTest.kt
@@ -354,7 +354,11 @@ class MediaTttChipControllerReceiverTest : SysuiTestCase() {
val view = getChipView()
assertThat(view.getAppIconView().drawable).isEqualTo(fakeAppIconDrawable)
- assertThat(view.getAppIconView().contentDescription).isEqualTo(APP_NAME)
+ assertThat(view.getAppIconView().contentDescription)
+ .isEqualTo(context.getString(
+ R.string.media_transfer_receiver_content_description_with_app_name,
+ APP_NAME,
+ ))
}
@Test