Fix focus at ttt chip

Fix talkback focus to be at tap-to-transfer chip.
The talkback says the name of the app running and the event.

Bug: 229557832
Test: atest MediaTttChipControllerSenderTest
Change-Id: If862b0eb9b50533ff184a23b609808611d2be5bd
This commit is contained in:
Michael Mikhail
2022-08-04 15:54:11 +00:00
parent 382cf79482
commit 25b7b8520c
2 changed files with 23 additions and 8 deletions

View File

@@ -56,7 +56,7 @@ abstract class MediaTttChipControllerCommon<T : ChipInfoCommon>(
internal val logger: MediaTttLogger,
internal val windowManager: WindowManager,
private val viewUtil: ViewUtil,
@Main private val mainExecutor: DelayableExecutor,
@Main internal val mainExecutor: DelayableExecutor,
private val accessibilityManager: AccessibilityManager,
private val configurationController: ConfigurationController,
private val powerManager: PowerManager,
@@ -205,13 +205,15 @@ abstract class MediaTttChipControllerCommon<T : ChipInfoCommon>(
*
* @param appPackageName the package name of the app playing the media. Will be used to fetch
* the app icon and app name if overrides aren't provided.
*
* @return the content description of the icon.
*/
internal fun setIcon(
currentChipView: ViewGroup,
appPackageName: String?,
appIconDrawableOverride: Drawable? = null,
appNameOverride: CharSequence? = null,
) {
): CharSequence {
val appIconView = currentChipView.requireViewById<CachingIconView>(R.id.app_icon)
val iconInfo = getIconInfo(appPackageName)
@@ -224,6 +226,7 @@ abstract class MediaTttChipControllerCommon<T : ChipInfoCommon>(
appIconView.contentDescription = appNameOverride ?: iconInfo.iconName
appIconView.setImageDrawable(appIconDrawableOverride ?: iconInfo.icon)
return appIconView.contentDescription.toString()
}
/**

View File

@@ -122,13 +122,12 @@ class MediaTttChipControllerSender @Inject constructor(
val chipState = newChipInfo.state
// App icon
setIcon(currentChipView, newChipInfo.routeInfo.packageName)
val iconName = setIcon(currentChipView, newChipInfo.routeInfo.packageName)
// Text
val otherDeviceName = newChipInfo.routeInfo.name.toString()
currentChipView.requireViewById<TextView>(R.id.text).apply {
text = chipState.getChipTextString(context, otherDeviceName)
}
val chipText = chipState.getChipTextString(context, otherDeviceName)
currentChipView.requireViewById<TextView>(R.id.text).text = chipText
// Loading
currentChipView.requireViewById<View>(R.id.loading).visibility =
@@ -145,17 +144,29 @@ class MediaTttChipControllerSender @Inject constructor(
// Failure
currentChipView.requireViewById<View>(R.id.failure_icon).visibility =
chipState.isTransferFailure.visibleIfTrue()
// For accessibility
currentChipView.requireViewById<ViewGroup>(
R.id.media_ttt_sender_chip_inner
).contentDescription = "$iconName $chipText"
}
override fun animateChipIn(chipView: ViewGroup) {
val chipInnerView = chipView.requireViewById<ViewGroup>(R.id.media_ttt_sender_chip_inner)
ViewHierarchyAnimator.animateAddition(
chipView.requireViewById<ViewGroup>(R.id.media_ttt_sender_chip_inner),
chipInnerView,
ViewHierarchyAnimator.Hotspot.TOP,
Interpolators.EMPHASIZED_DECELERATE,
duration = 500L,
duration = ANIMATION_DURATION,
includeMargins = true,
includeFadeIn = true,
)
// We can only request focus once the animation finishes.
mainExecutor.executeDelayed(
{ chipInnerView.requestAccessibilityFocus() },
ANIMATION_DURATION
)
}
override fun removeChip(removalReason: String) {
@@ -186,3 +197,4 @@ data class ChipSenderInfo(
}
const val SENDER_TAG = "MediaTapToTransferSender"
private const val ANIMATION_DURATION = 500L