Merge changes I373d54df,I3f839257 into tm-qpr-dev

* changes:
  [Chipbar] Run the linter on ChipbarCoordinator.
  [Media TTT] Add "loading" to the content description if needed.
This commit is contained in:
Caitlin Shkuratov
2023-01-05 14:38:57 +00:00
committed by Android (Google) Code Review
4 changed files with 88 additions and 47 deletions

View File

@@ -485,7 +485,6 @@
-packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowStateController.kt -packages/SystemUI/src/com/android/systemui/statusbar/window/StatusBarWindowStateController.kt
-packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewInfo.kt -packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewInfo.kt
-packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt -packages/SystemUI/src/com/android/systemui/temporarydisplay/TemporaryViewDisplayController.kt
-packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarCoordinator.kt
-packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarRootView.kt -packages/SystemUI/src/com/android/systemui/temporarydisplay/chipbar/ChipbarRootView.kt
-packages/SystemUI/src/com/android/systemui/toast/ToastDefaultAnimation.kt -packages/SystemUI/src/com/android/systemui/toast/ToastDefaultAnimation.kt
-packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt -packages/SystemUI/src/com/android/systemui/toast/ToastLogger.kt

View File

@@ -2362,6 +2362,8 @@
<string name="media_transfer_playing_different_device">Playing on <xliff:g id="deviceName" example="My Tablet">%1$s</xliff:g></string> <string name="media_transfer_playing_different_device">Playing on <xliff:g id="deviceName" example="My Tablet">%1$s</xliff:g></string>
<!-- Text informing the user that the media transfer has failed because something went wrong. [CHAR LIsMIT=50] --> <!-- Text informing the user that the media transfer has failed because something went wrong. [CHAR LIsMIT=50] -->
<string name="media_transfer_failed">Something went wrong. Try again.</string> <string name="media_transfer_failed">Something went wrong. Try again.</string>
<!-- Text to indicate that a media transfer is currently in-progress, aka loading. [CHAR LIMIT=NONE] -->
<string name="media_transfer_loading">Loading</string>
<!-- Error message indicating that a control timed out while waiting for an update [CHAR_LIMIT=30] --> <!-- Error message indicating that a control timed out while waiting for an update [CHAR_LIMIT=30] -->
<string name="controls_error_timeout">Inactive, check app</string> <string name="controls_error_timeout">Inactive, check app</string>

View File

@@ -65,26 +65,27 @@ import javax.inject.Inject
* in the list of notifications until the user dismisses them. * in the list of notifications until the user dismisses them.
* *
* Only one chipbar may be shown at a time. * Only one chipbar may be shown at a time.
* TODO(b/245610654): Should we just display whichever chipbar was most recently requested, or do we
* need to maintain a priority ordering?
*/ */
@SysUISingleton @SysUISingleton
open class ChipbarCoordinator @Inject constructor( open class ChipbarCoordinator
context: Context, @Inject
logger: ChipbarLogger, constructor(
windowManager: WindowManager, context: Context,
@Main mainExecutor: DelayableExecutor, logger: ChipbarLogger,
accessibilityManager: AccessibilityManager, windowManager: WindowManager,
configurationController: ConfigurationController, @Main mainExecutor: DelayableExecutor,
dumpManager: DumpManager, accessibilityManager: AccessibilityManager,
powerManager: PowerManager, configurationController: ConfigurationController,
private val falsingManager: FalsingManager, dumpManager: DumpManager,
private val falsingCollector: FalsingCollector, powerManager: PowerManager,
private val viewUtil: ViewUtil, private val falsingManager: FalsingManager,
private val vibratorHelper: VibratorHelper, private val falsingCollector: FalsingCollector,
wakeLockBuilder: WakeLock.Builder, private val viewUtil: ViewUtil,
systemClock: SystemClock, private val vibratorHelper: VibratorHelper,
) : TemporaryViewDisplayController<ChipbarInfo, ChipbarLogger>( wakeLockBuilder: WakeLock.Builder,
systemClock: SystemClock,
) :
TemporaryViewDisplayController<ChipbarInfo, ChipbarLogger>(
context, context,
logger, logger,
windowManager, windowManager,
@@ -96,18 +97,14 @@ open class ChipbarCoordinator @Inject constructor(
R.layout.chipbar, R.layout.chipbar,
wakeLockBuilder, wakeLockBuilder,
systemClock, systemClock,
) { ) {
private lateinit var parent: ChipbarRootView private lateinit var parent: ChipbarRootView
override val windowLayoutParams = commonWindowLayoutParams.apply { override val windowLayoutParams =
gravity = Gravity.TOP.or(Gravity.CENTER_HORIZONTAL) commonWindowLayoutParams.apply { gravity = Gravity.TOP.or(Gravity.CENTER_HORIZONTAL) }
}
override fun updateView( override fun updateView(newInfo: ChipbarInfo, currentView: ViewGroup) {
newInfo: ChipbarInfo,
currentView: ViewGroup
) {
logger.logViewUpdate( logger.logViewUpdate(
newInfo.windowTitle, newInfo.windowTitle,
newInfo.text.loadText(context), newInfo.text.loadText(context),
@@ -123,12 +120,13 @@ open class ChipbarCoordinator @Inject constructor(
// Detect falsing touches on the chip. // Detect falsing touches on the chip.
parent = currentView.requireViewById(R.id.chipbar_root_view) parent = currentView.requireViewById(R.id.chipbar_root_view)
parent.touchHandler = object : Gefingerpoken { parent.touchHandler =
override fun onTouchEvent(ev: MotionEvent?): Boolean { object : Gefingerpoken {
falsingCollector.onTouchEvent(ev) override fun onTouchEvent(ev: MotionEvent?): Boolean {
return false falsingCollector.onTouchEvent(ev)
return false
}
} }
}
// ---- Start icon ---- // ---- Start icon ----
val iconView = currentView.requireViewById<CachingIconView>(R.id.start_icon) val iconView = currentView.requireViewById<CachingIconView>(R.id.start_icon)
@@ -155,10 +153,12 @@ open class ChipbarCoordinator @Inject constructor(
if (newInfo.endItem is ChipbarEndItem.Button) { if (newInfo.endItem is ChipbarEndItem.Button) {
TextViewBinder.bind(buttonView, newInfo.endItem.text) TextViewBinder.bind(buttonView, newInfo.endItem.text)
val onClickListener = View.OnClickListener { clickedView -> val onClickListener =
if (falsingManager.isFalseTap(FalsingManager.LOW_PENALTY)) return@OnClickListener View.OnClickListener { clickedView ->
newInfo.endItem.onClickListener.onClick(clickedView) if (falsingManager.isFalseTap(FalsingManager.LOW_PENALTY))
} return@OnClickListener
newInfo.endItem.onClickListener.onClick(clickedView)
}
buttonView.setOnClickListener(onClickListener) buttonView.setOnClickListener(onClickListener)
buttonView.visibility = View.VISIBLE buttonView.visibility = View.VISIBLE
@@ -168,21 +168,27 @@ open class ChipbarCoordinator @Inject constructor(
// ---- Overall accessibility ---- // ---- Overall accessibility ----
val iconDesc = newInfo.startIcon.icon.contentDescription val iconDesc = newInfo.startIcon.icon.contentDescription
val loadedIconDesc = if (iconDesc != null) { val loadedIconDesc =
"${iconDesc.loadContentDescription(context)} " if (iconDesc != null) {
} else { "${iconDesc.loadContentDescription(context)} "
"" } else {
} ""
}
val endItemDesc =
if (newInfo.endItem is ChipbarEndItem.Loading) {
". ${context.resources.getString(R.string.media_transfer_loading)}."
} else {
""
}
val chipInnerView = currentView.getInnerView() val chipInnerView = currentView.getInnerView()
chipInnerView.contentDescription = "$loadedIconDesc${newInfo.text.loadText(context)}" chipInnerView.contentDescription =
"$loadedIconDesc${newInfo.text.loadText(context)}$endItemDesc"
chipInnerView.accessibilityLiveRegion = ACCESSIBILITY_LIVE_REGION_ASSERTIVE chipInnerView.accessibilityLiveRegion = ACCESSIBILITY_LIVE_REGION_ASSERTIVE
maybeGetAccessibilityFocus(newInfo, currentView) maybeGetAccessibilityFocus(newInfo, currentView)
// ---- Haptics ---- // ---- Haptics ----
newInfo.vibrationEffect?.let { newInfo.vibrationEffect?.let { vibratorHelper.vibrate(it) }
vibratorHelper.vibrate(it)
}
} }
private fun maybeGetAccessibilityFocus(info: ChipbarInfo?, view: ViewGroup) { private fun maybeGetAccessibilityFocus(info: ChipbarInfo?, view: ViewGroup) {

View File

@@ -124,7 +124,7 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
) )
) )
val contentDescView = getChipbarView().requireViewById<ViewGroup>(R.id.chipbar_inner) val contentDescView = getChipbarView().getInnerView()
assertThat(contentDescView.contentDescription.toString()).contains("loadedCD") assertThat(contentDescView.contentDescription.toString()).contains("loadedCD")
assertThat(contentDescView.contentDescription.toString()).contains("text") assertThat(contentDescView.contentDescription.toString()).contains("text")
} }
@@ -139,10 +139,42 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
) )
) )
val contentDescView = getChipbarView().requireViewById<ViewGroup>(R.id.chipbar_inner) val contentDescView = getChipbarView().getInnerView()
assertThat(contentDescView.contentDescription.toString()).isEqualTo("text") assertThat(contentDescView.contentDescription.toString()).isEqualTo("text")
} }
@Test
fun displayView_contentDescription_endIsLoading() {
underTest.displayView(
createChipbarInfo(
Icon.Resource(R.drawable.ic_cake, ContentDescription.Loaded("loadedCD")),
Text.Loaded("text"),
endItem = ChipbarEndItem.Loading,
)
)
val contentDescView = getChipbarView().getInnerView()
val loadingDesc = context.resources.getString(R.string.media_transfer_loading)
assertThat(contentDescView.contentDescription.toString()).contains("text")
assertThat(contentDescView.contentDescription.toString()).contains(loadingDesc)
}
@Test
fun displayView_contentDescription_endNotLoading() {
underTest.displayView(
createChipbarInfo(
Icon.Resource(R.drawable.ic_cake, ContentDescription.Loaded("loadedCD")),
Text.Loaded("text"),
endItem = ChipbarEndItem.Error,
)
)
val contentDescView = getChipbarView().getInnerView()
val loadingDesc = context.resources.getString(R.string.media_transfer_loading)
assertThat(contentDescView.contentDescription.toString()).contains("text")
assertThat(contentDescView.contentDescription.toString()).doesNotContain(loadingDesc)
}
@Test @Test
fun displayView_loadedIcon_correctlyRendered() { fun displayView_loadedIcon_correctlyRendered() {
val drawable = context.getDrawable(R.drawable.ic_celebration)!! val drawable = context.getDrawable(R.drawable.ic_celebration)!!
@@ -417,6 +449,8 @@ class ChipbarCoordinatorTest : SysuiTestCase() {
) )
} }
private fun ViewGroup.getInnerView() = this.requireViewById<ViewGroup>(R.id.chipbar_inner)
private fun ViewGroup.getStartIconView() = this.requireViewById<ImageView>(R.id.start_icon) private fun ViewGroup.getStartIconView() = this.requireViewById<ImageView>(R.id.start_icon)
private fun ViewGroup.getChipText(): String = private fun ViewGroup.getChipText(): String =