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