From 6e947afdab937d2bf6d8e87bc2e52d9b9d095ba2 Mon Sep 17 00:00:00 2001 From: Caitlin Cassidy Date: Thu, 21 Apr 2022 17:18:37 +0000 Subject: [PATCH] [Media] Allow a11y interactions to change seekbar position. Note that the seekbar UI can now get a bit janky if you have TalkBack on and you very quickly swipe up or down. We can file a new bug for that if we decide it needs fixing. Fixes: 216254595 Fixes: 216254099 Test: SeekBarViewModelTest Test: manual: Turn TalkBack on, select the seekbar, and verify you can swipe up/down to change the track position. Test: manual: Verify seeking without TalkBack on still works. Change-Id: I890e4f396fa704047c5593fff20c8924b890fc75 --- .../com/android/systemui/media/SeekBarViewModel.kt | 10 +++++++++- .../android/systemui/media/SeekBarViewModelTest.kt | 12 ++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt b/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt index 193166b8d331e..0359c6325749b 100644 --- a/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/media/SeekBarViewModel.kt @@ -151,13 +151,21 @@ class SeekBarViewModel @Inject constructor( } /** - * Event indicating that the user has moved the seek bar but hasn't yet finished the gesture. + * Event indicating that the user has moved the seek bar. + * * @param position Current location in the track. */ @AnyThread fun onSeekProgress(position: Long) = bgExecutor.execute { if (scrubbing) { + // The user hasn't yet finished their touch gesture, so only update the data for visual + // feedback and don't update [controller] yet. _data = _data.copy(elapsedTime = position.toInt()) + } else { + // The seek progress came from an a11y action and we should immediately update to the + // new position. (a11y actions to change the seekbar position don't trigger + // SeekBar.OnSeekBarChangeListener.onStartTrackingTouch or onStopTrackingTouch.) + onSeek(position) } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt index afc9c81ff4799..82aa6123917e0 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/media/SeekBarViewModelTest.kt @@ -375,16 +375,20 @@ public class SeekBarViewModelTest : SysuiTestCase() { } @Test - fun onProgressChangedFromUserWithoutStartTrackingTouch() { - // WHEN user starts dragging the seek bar + fun onProgressChangedFromUserWithoutStartTrackingTouch_transportUpdated() { + whenever(mockController.transportControls).thenReturn(mockTransport) + viewModel.updateController(mockController) val pos = 42 val bar = SeekBar(context) + + // WHEN we get an onProgressChanged event without an onStartTrackingTouch event with(viewModel.seekBarListener) { onProgressChanged(bar, pos, true) } fakeExecutor.runAllReady() - // THEN then elapsed time should not be updated - assertThat(viewModel.progress.value!!.elapsedTime).isNull() + + // THEN we immediately update the transport + verify(mockTransport).seekTo(pos.toLong()) } @Test