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