diff options
| author | 2024-04-23 22:31:09 +0000 | |
|---|---|---|
| committer | 2024-04-23 22:31:09 +0000 | |
| commit | 8bbfc25c8a3583d5a2cae6de6aa25e89badee7d7 (patch) | |
| tree | acadd4e859851a08d4eadc24a07591db1455c2b4 | |
| parent | ecb650dd4b4a19979089b3b3982abd269ab25233 (diff) | |
| parent | f00fd4459802a86538e95a509f64ebefdb7fb462 (diff) | |
Merge "Refactor of the SeekableSliderEventProducer and SeekableSliderTracker." into main
13 files changed, 351 insertions, 350 deletions
diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekableSliderHapticPluginTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekbarHapticPluginTest.kt index 805b4a828bda..855b6d0b95d7 100644 --- a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekableSliderHapticPluginTest.kt +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SeekbarHapticPluginTest.kt @@ -44,14 +44,14 @@ import org.mockito.junit.MockitoRule @SmallTest @RunWith(AndroidJUnit4::class) @OptIn(ExperimentalCoroutinesApi::class) -class SeekableSliderHapticPluginTest : SysuiTestCase() { +class SeekbarHapticPluginTest : SysuiTestCase() { private val kosmos = Kosmos() @Rule @JvmField val mMockitoRule: MockitoRule = MockitoJUnit.rule() @Mock private lateinit var vibratorHelper: VibratorHelper private val seekBar = SeekBar(mContext) - private lateinit var plugin: SeekableSliderHapticPlugin + private lateinit var plugin: SeekbarHapticPlugin @Before fun setup() { @@ -142,7 +142,7 @@ class SeekableSliderHapticPluginTest : SysuiTestCase() { private fun createPlugin() { plugin = - SeekableSliderHapticPlugin( + SeekbarHapticPlugin( vibratorHelper, kosmos.fakeSystemClock, ) diff --git a/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateProducerTest.kt b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateProducerTest.kt new file mode 100644 index 000000000000..88189dbafa6c --- /dev/null +++ b/packages/SystemUI/multivalentTests/src/com/android/systemui/haptics/slider/SliderStateProducerTest.kt @@ -0,0 +1,134 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.haptics.slider + +import androidx.test.ext.junit.runners.AndroidJUnit4 +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.coroutines.collectLastValue +import junit.framework.Assert.assertEquals +import kotlinx.coroutines.test.runTest +import org.junit.Test +import org.junit.runner.RunWith + +@SmallTest +@RunWith(AndroidJUnit4::class) +class SliderStateProducerTest : SysuiTestCase() { + + private val eventProducer = SliderStateProducer() + private val eventFlow = eventProducer.produceEvents() + + @Test + fun onStartTrackingTouch_noProgress_trackingTouchEventProduced() = runTest { + val latest by collectLastValue(eventFlow) + + eventProducer.onStartTracking(/*fromUser =*/ true) + + assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, 0F), latest) + } + + @Test + fun onStopTrackingTouch_noProgress_StoppedTrackingTouchEventProduced() = runTest { + val latest by collectLastValue(eventFlow) + + eventProducer.onStopTracking(/*fromUser =*/ true) + + assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0F), latest) + } + + @Test + fun onStartTrackingProgram_noProgress_trackingTouchEventProduced() = runTest { + val latest by collectLastValue(eventFlow) + + eventProducer.onStartTracking(/*fromUser =*/ false) + + assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, 0F), latest) + } + + @Test + fun onStopTrackingProgram_noProgress_StoppedTrackingTouchEventProduced() = runTest { + val latest by collectLastValue(eventFlow) + + eventProducer.onStopTracking(/*fromUser =*/ false) + + assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, 0F), latest) + } + + @Test + fun onProgressChangeByUser_changeByUserEventProduced() = runTest { + val progress = 0.5f + val latest by collectLastValue(eventFlow) + + eventProducer.onProgressChanged(/*fromUser =*/ true, progress) + + assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, progress), latest) + } + + @Test + fun onProgressChangeByProgram_changeByProgramEventProduced() = runTest { + val progress = 0.5f + val latest by collectLastValue(eventFlow) + + eventProducer.onProgressChanged(/*fromUser =*/ false, progress) + + assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress), latest) + } + + @Test + fun onStartTrackingTouch_afterProgress_trackingTouchEventProduced() = runTest { + val progress = 0.5f + val latest by collectLastValue(eventFlow) + + eventProducer.onProgressChanged(/*fromUser =*/ true, progress) + eventProducer.onStartTracking(/*fromUser =*/ true) + + assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress), latest) + } + + @Test + fun onStopTrackingTouch_afterProgress_stopTrackingTouchEventProduced() = runTest { + val progress = 0.5f + val latest by collectLastValue(eventFlow) + + eventProducer.onProgressChanged(/*fromUser =*/ true, progress) + eventProducer.onStopTracking(/*fromUser =*/ true) + + assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, progress), latest) + } + + @Test + fun onStartTrackingProgram_afterProgress_trackingProgramEventProduced() = runTest { + val progress = 0.5f + val latest by collectLastValue(eventFlow) + + eventProducer.onProgressChanged(/*fromUser =*/ false, progress) + eventProducer.onStartTracking(/*fromUser =*/ false) + + assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress), latest) + } + + @Test + fun onStopTrackingProgram_afterProgress_stopTrackingProgramEventProduced() = runTest { + val progress = 0.5f + val latest by collectLastValue(eventFlow) + + eventProducer.onProgressChanged(/*fromUser =*/ false, progress) + eventProducer.onStopTracking(/*fromUser =*/ false) + + assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, progress), latest) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/HapticSliderViewBinder.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/HapticSliderViewBinder.kt index 304fdd61a992..ca6c8da380fe 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/HapticSliderViewBinder.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/HapticSliderViewBinder.kt @@ -23,11 +23,11 @@ import kotlinx.coroutines.awaitCancellation object HapticSliderViewBinder { /** - * Binds a [SeekableSliderHapticPlugin] to a [View]. The binded view should be a + * Binds a [SeekbarHapticPlugin] to a [View]. The binded view should be a * [android.widget.SeekBar] or a container of a [android.widget.SeekBar] */ @JvmStatic - fun bind(view: View?, plugin: SeekableSliderHapticPlugin) { + fun bind(view: View?, plugin: SeekbarHapticPlugin) { view?.repeatWhenAttached { plugin.startInScope(lifecycleScope) try { diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderEventProducer.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderEventProducer.kt deleted file mode 100644 index cfa5294567b7..000000000000 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderEventProducer.kt +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.haptics.slider - -import android.widget.SeekBar -import android.widget.SeekBar.OnSeekBarChangeListener -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.asStateFlow -import kotlinx.coroutines.flow.update - -/** An event producer for a Seekable element such as the Android [SeekBar] */ -class SeekableSliderEventProducer : SliderEventProducer, OnSeekBarChangeListener { - - /** The current event reported by a SeekBar */ - private val _currentEvent = MutableStateFlow(SliderEvent(SliderEventType.NOTHING, 0f)) - - override fun produceEvents(): Flow<SliderEvent> = _currentEvent.asStateFlow() - - override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { - val eventType = - if (fromUser) SliderEventType.PROGRESS_CHANGE_BY_USER - else SliderEventType.PROGRESS_CHANGE_BY_PROGRAM - - _currentEvent.value = SliderEvent(eventType, normalizeProgress(seekBar, progress)) - } - - /** - * Normalize the integer progress of a SeekBar to the range from 0F to 1F. - * - * @param[seekBar] The SeekBar that reports a progress. - * @param[progress] The integer progress of the SeekBar within its min and max values. - * @return The progress in the range from 0F to 1F. - */ - private fun normalizeProgress(seekBar: SeekBar, progress: Int): Float { - if (seekBar.max == seekBar.min) { - return 1.0f - } - val range = seekBar.max - seekBar.min - return (progress - seekBar.min) / range.toFloat() - } - - override fun onStartTrackingTouch(seekBar: SeekBar) { - _currentEvent.update { previousEvent -> - SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, previousEvent.currentProgress) - } - } - - override fun onStopTrackingTouch(seekBar: SeekBar) { - _currentEvent.update { previousEvent -> - SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, previousEvent.currentProgress) - } - } - - /** The arrow navigation that was operating the slider has stopped. */ - fun onArrowUp() { - _currentEvent.update { previousEvent -> - SliderEvent(SliderEventType.ARROW_UP, previousEvent.currentProgress) - } - } -} diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderHapticPlugin.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt index ed82278a7346..2007db3448e2 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderHapticPlugin.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekbarHapticPlugin.kt @@ -30,12 +30,12 @@ import kotlinx.coroutines.launch /** * A plugin added to a manager of a [android.widget.SeekBar] that adds dynamic haptic feedback. * - * A [SeekableSliderEventProducer] is used as the producer of slider events, a + * A [SliderStateProducer] is used as the producer of slider events, a * [SliderHapticFeedbackProvider] is used as the listener of slider states to play haptic feedback - * depending on the state, and a [SeekableSliderTracker] is used as the state machine handler that + * depending on the state, and a [SliderStateTracker] is used as the state machine handler that * tracks and manipulates the slider state. */ -class SeekableSliderHapticPlugin +class SeekbarHapticPlugin @JvmOverloads constructor( vibratorHelper: VibratorHelper, @@ -46,7 +46,7 @@ constructor( private val velocityTracker = VelocityTracker.obtain() - private val sliderEventProducer = SeekableSliderEventProducer() + private val sliderEventProducer = SliderStateProducer() private val sliderHapticFeedbackProvider = SliderHapticFeedbackProvider( @@ -56,7 +56,7 @@ constructor( systemClock, ) - private var sliderTracker: SeekableSliderTracker? = null + private var sliderTracker: SliderStateTracker? = null private var pluginScope: CoroutineScope? = null @@ -86,7 +86,7 @@ constructor( fun startInScope(scope: CoroutineScope) { if (sliderTracker != null) stop() sliderTracker = - SeekableSliderTracker( + SliderStateTracker( sliderHapticFeedbackProvider, sliderEventProducer, scope, @@ -116,28 +116,52 @@ constructor( /** onStartTrackingTouch event from the slider's [android.widget.SeekBar] */ fun onStartTrackingTouch(seekBar: SeekBar) { if (isTracking) { - sliderEventProducer.onStartTrackingTouch(seekBar) + sliderEventProducer.onStartTracking(true) } } /** onProgressChanged event from the slider's [android.widget.SeekBar] */ fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) { if (isTracking) { - sliderEventProducer.onProgressChanged(seekBar, progress, fromUser) + if (sliderTracker?.currentState == SliderState.IDLE && !fromUser) { + // This case translates to the slider starting to track program changes + sliderEventProducer.resetWithProgress(normalizeProgress(seekBar, progress)) + sliderEventProducer.onStartTracking(false) + } else { + sliderEventProducer.onProgressChanged( + fromUser, + normalizeProgress(seekBar, progress), + ) + } + } + } + + /** + * Normalize the integer progress of a SeekBar to the range from 0F to 1F. + * + * @param[seekBar] The SeekBar that reports a progress. + * @param[progress] The integer progress of the SeekBar within its min and max values. + * @return The progress in the range from 0F to 1F. + */ + private fun normalizeProgress(seekBar: SeekBar, progress: Int): Float { + if (seekBar.max == seekBar.min) { + return 1.0f } + val range = seekBar.max - seekBar.min + return (progress - seekBar.min) / range.toFloat() } /** onStopTrackingTouch event from the slider's [android.widget.SeekBar] */ fun onStopTrackingTouch(seekBar: SeekBar) { if (isTracking) { - sliderEventProducer.onStopTrackingTouch(seekBar) + sliderEventProducer.onStopTracking(true) } } - /** onArrowUp event recorded */ - fun onArrowUp() { + /** Programmatic changes have stopped */ + private fun onStoppedTrackingProgram() { if (isTracking) { - sliderEventProducer.onArrowUp() + sliderEventProducer.onStopTracking(false) } } @@ -146,7 +170,7 @@ constructor( * * This event is used to estimate the key-up event based on a running a timer as a waiting * coroutine in the [pluginScope]. A key-up event in a slider corresponds to an onArrowUp event. - * Therefore, [onArrowUp] must be called after the timeout. + * Therefore, [onStoppedTrackingProgram] must be called after the timeout. */ fun onKeyDown() { if (!isTracking) return @@ -158,7 +182,7 @@ constructor( keyUpJob = pluginScope?.launch { delay(KEY_UP_TIMEOUT) - onArrowUp() + onStoppedTrackingProgram() } } diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderEventType.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderEventType.kt index 4a63941b3f8c..0edef993b782 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderEventType.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderEventType.kt @@ -22,6 +22,8 @@ enum class SliderEventType { NOTHING, /* The slider has captured a touch input and is tracking touch events. */ STARTED_TRACKING_TOUCH, + /* The slider started tracking programmatic value changes */ + STARTED_TRACKING_PROGRAM, /* The slider progress is changing due to user touch input. */ PROGRESS_CHANGE_BY_USER, /* The slider progress is changing programmatically. */ @@ -29,5 +31,5 @@ enum class SliderEventType { /* The slider has stopped tracking touch events. */ STOPPED_TRACKING_TOUCH, /* The external (not touch) stimulus that was modifying the slider progress has stopped. */ - ARROW_UP, + STOPPED_TRACKING_PROGRAM, } diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateProducer.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateProducer.kt new file mode 100644 index 000000000000..1124ab1eb1d4 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateProducer.kt @@ -0,0 +1,62 @@ +/* + * Copyright (C) 2024 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.systemui.haptics.slider + +import androidx.annotation.FloatRange +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.update + +/** A stateful producer of [SliderEvent] */ +class SliderStateProducer : SliderEventProducer { + + /** The current event of a slider */ + private val _currentEvent = MutableStateFlow(SliderEvent(SliderEventType.NOTHING, 0f)) + + override fun produceEvents(): Flow<SliderEvent> = _currentEvent.asStateFlow() + + fun onProgressChanged(fromUser: Boolean, @FloatRange(from = 0.0, to = 1.0) progress: Float) { + val eventType = + if (fromUser) SliderEventType.PROGRESS_CHANGE_BY_USER + else SliderEventType.PROGRESS_CHANGE_BY_PROGRAM + + _currentEvent.value = SliderEvent(eventType, progress) + } + + fun onStartTracking(fromUser: Boolean) { + val eventType = + if (fromUser) SliderEventType.STARTED_TRACKING_TOUCH + else SliderEventType.STARTED_TRACKING_PROGRAM + _currentEvent.update { previousEvent -> + SliderEvent(eventType, previousEvent.currentProgress) + } + } + + fun onStopTracking(fromUser: Boolean) { + val eventType = + if (fromUser) SliderEventType.STOPPED_TRACKING_TOUCH + else SliderEventType.STOPPED_TRACKING_PROGRAM + _currentEvent.update { previousEvent -> + SliderEvent(eventType, previousEvent.currentProgress) + } + } + + fun resetWithProgress(@FloatRange(from = 0.0, to = 1.0) progress: Float) { + _currentEvent.value = SliderEvent(SliderEventType.NOTHING, progress) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderTracker.kt b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateTracker.kt index 0af303843a45..14cf4110272f 100644 --- a/packages/SystemUI/src/com/android/systemui/haptics/slider/SeekableSliderTracker.kt +++ b/packages/SystemUI/src/com/android/systemui/haptics/slider/SliderStateTracker.kt @@ -25,11 +25,12 @@ import kotlinx.coroutines.isActive import kotlinx.coroutines.launch /** - * Slider tracker attached to a seekable slider. + * Slider tracker attached to a slider. * - * The tracker runs a state machine to execute actions on touch-based events typical of a seekable - * slider such as [android.widget.SeekBar]. Coroutines responsible for running the state machine, - * collecting slider events and maintaining waiting states are run on the provided [CoroutineScope]. + * The tracker runs a state machine to execute actions on touch-based events typical of a general + * slider (including a [android.widget.SeekBar]). Coroutines responsible for running the state + * machine, collecting slider events and maintaining waiting states are run on the provided + * [CoroutineScope]. * * @param[sliderStateListener] Listener of the slider state. * @param[sliderEventProducer] Producer of slider events arising from the slider. @@ -37,7 +38,7 @@ import kotlinx.coroutines.launch * events and the launch of timer jobs. * @property[config] Configuration parameters of the slider tracker. */ -class SeekableSliderTracker( +class SliderStateTracker( sliderStateListener: SliderStateListener, sliderEventProducer: SliderEventProducer, trackerScope: CoroutineScope, @@ -79,7 +80,7 @@ class SeekableSliderTracker( // This will disambiguate between an imprecise touch that acquires the slider handle, // and a select and jump operation in the slider track. setState(SliderState.WAIT) - } else if (newEventType == SliderEventType.PROGRESS_CHANGE_BY_PROGRAM) { + } else if (newEventType == SliderEventType.STARTED_TRACKING_PROGRAM) { val state = if (bookendReached(currentProgress)) SliderState.ARROW_HANDLE_REACHED_BOOKEND else SliderState.ARROW_HANDLE_MOVED_ONCE @@ -227,7 +228,7 @@ class SeekableSliderTracker( } SliderEventType.PROGRESS_CHANGE_BY_PROGRAM -> SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY - SliderEventType.ARROW_UP -> SliderState.IDLE + SliderEventType.STOPPED_TRACKING_PROGRAM -> SliderState.IDLE else -> SliderState.ARROW_HANDLE_MOVED_ONCE } setState(nextState) @@ -237,7 +238,7 @@ class SeekableSliderTracker( val reachedBookend = bookendReached(currentProgress) val nextState = when (newEventType) { - SliderEventType.ARROW_UP -> SliderState.IDLE + SliderEventType.STOPPED_TRACKING_PROGRAM -> SliderState.IDLE SliderEventType.STARTED_TRACKING_TOUCH -> { // Launching the timer and going to WAIT timerJob = launchTimer() diff --git a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java index b425fb997d9e..083cee73f591 100644 --- a/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java +++ b/packages/SystemUI/src/com/android/systemui/settings/brightness/BrightnessSliderController.java @@ -33,7 +33,7 @@ import com.android.settingslib.RestrictedLockUtils; import com.android.systemui.Gefingerpoken; import com.android.systemui.classifier.Classifier; import com.android.systemui.haptics.slider.HapticSliderViewBinder; -import com.android.systemui.haptics.slider.SeekableSliderHapticPlugin; +import com.android.systemui.haptics.slider.SeekbarHapticPlugin; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.res.R; @@ -65,7 +65,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV private final FalsingManager mFalsingManager; private final UiEventLogger mUiEventLogger; - private final SeekableSliderHapticPlugin mBrightnessSliderHapticPlugin; + private final SeekbarHapticPlugin mBrightnessSliderHapticPlugin; private final ActivityStarter mActivityStarter; private final Gefingerpoken mOnInterceptListener = new Gefingerpoken() { @@ -89,7 +89,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV BrightnessSliderView brightnessSliderView, FalsingManager falsingManager, UiEventLogger uiEventLogger, - SeekableSliderHapticPlugin brightnessSliderHapticPlugin, + SeekbarHapticPlugin brightnessSliderHapticPlugin, ActivityStarter activityStarter) { super(brightnessSliderView); mFalsingManager = falsingManager; @@ -314,7 +314,7 @@ public class BrightnessSliderController extends ViewController<BrightnessSliderV int layout = getLayout(); BrightnessSliderView root = (BrightnessSliderView) LayoutInflater.from(context) .inflate(layout, viewRoot, false); - SeekableSliderHapticPlugin plugin = new SeekableSliderHapticPlugin( + SeekbarHapticPlugin plugin = new SeekbarHapticPlugin( mVibratorHelper, mSystemClock); if (hapticBrightnessSlider()) { diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java index 22455417b647..cd82e1dcbb8d 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogImpl.java @@ -118,7 +118,7 @@ import com.android.systemui.Dumpable; import com.android.systemui.Prefs; import com.android.systemui.dump.DumpManager; import com.android.systemui.haptics.slider.HapticSliderViewBinder; -import com.android.systemui.haptics.slider.SeekableSliderHapticPlugin; +import com.android.systemui.haptics.slider.SeekbarHapticPlugin; import com.android.systemui.haptics.slider.SliderHapticFeedbackConfig; import com.android.systemui.media.dialog.MediaOutputDialogManager; import com.android.systemui.plugins.VolumeDialog; @@ -2640,7 +2640,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, private ObjectAnimator anim; // slider progress animation for non-touch-related updates private int animTargetProgress; private int lastAudibleLevel = 1; - private SeekableSliderHapticPlugin mHapticPlugin; + private SeekbarHapticPlugin mHapticPlugin; private int mProgressHapticsType = PROGRESS_HAPTICS_DISABLED; void setIcon(int iconRes, Resources.Theme theme) { @@ -2658,7 +2658,7 @@ public class VolumeDialogImpl implements VolumeDialog, Dumpable, com.android.systemui.util.time.SystemClock systemClock) { if (mHapticPlugin != null) return; - mHapticPlugin = new SeekableSliderHapticPlugin( + mHapticPlugin = new SeekbarHapticPlugin( vibratorHelper, systemClock, sSliderHapticFeedbackConfig); diff --git a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderEventProducerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderEventProducerTest.kt deleted file mode 100644 index c22d35cb214f..000000000000 --- a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderEventProducerTest.kt +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (C) 2023 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.android.systemui.haptics.slider - -import android.widget.SeekBar -import androidx.test.ext.junit.runners.AndroidJUnit4 -import androidx.test.filters.SmallTest -import com.android.systemui.SysuiTestCase -import com.android.systemui.coroutines.collectLastValue -import junit.framework.Assert.assertEquals -import kotlinx.coroutines.test.runTest -import org.junit.Test -import org.junit.runner.RunWith - -@SmallTest -@RunWith(AndroidJUnit4::class) -class SeekableSliderEventProducerTest : SysuiTestCase() { - - private val seekBar = SeekBar(mContext) - private val eventProducer = SeekableSliderEventProducer() - private val eventFlow = eventProducer.produceEvents() - - @Test - fun onStartTrackingTouch_noProgress_trackingTouchEventProduced() = runTest { - val latest by collectLastValue(eventFlow) - - eventProducer.onStartTrackingTouch(seekBar) - - assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, 0F), latest) - } - - @Test - fun onStopTrackingTouch_noProgress_StoppedTrackingTouchEventProduced() = runTest { - val latest by collectLastValue(eventFlow) - - eventProducer.onStopTrackingTouch(seekBar) - - assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0F), latest) - } - - @Test - fun onProgressChangeByUser_changeByUserEventProduced_withNormalizedProgress() = runTest { - val progress = 50 - val latest by collectLastValue(eventFlow) - - eventProducer.onProgressChanged(seekBar, progress, true) - - assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 0.5F), latest) - } - - @Test - fun onProgressChangeByUser_zeroWidthSlider_changeByUserEventProduced_withMaxProgress() = - runTest { - // No-width slider where the min and max values are the same - seekBar.min = 100 - seekBar.max = 100 - val progress = 50 - val latest by collectLastValue(eventFlow) - - eventProducer.onProgressChanged(seekBar, progress, true) - - assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 1.0F), latest) - } - - @Test - fun onProgressChangeByProgram_changeByProgramEventProduced_withNormalizedProgress() = runTest { - val progress = 50 - val latest by collectLastValue(eventFlow) - - eventProducer.onProgressChanged(seekBar, progress, false) - - assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, 0.5F), latest) - } - - @Test - fun onProgressChangeByProgram_zeroWidthSlider_changeByProgramEventProduced_withMaxProgress() = - runTest { - // No-width slider where the min and max values are the same - seekBar.min = 100 - seekBar.max = 100 - val progress = 50 - val latest by collectLastValue(eventFlow) - - eventProducer.onProgressChanged(seekBar, progress, false) - - assertEquals(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, 1.0F), latest) - } - - @Test - fun onStartTrackingTouch_afterProgress_trackingTouchEventProduced_withNormalizedProgress() = - runTest { - val progress = 50 - val latest by collectLastValue(eventFlow) - - eventProducer.onProgressChanged(seekBar, progress, true) - eventProducer.onStartTrackingTouch(seekBar) - - assertEquals(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, 0.5F), latest) - } - - @Test - fun onStopTrackingTouch_afterProgress_stopTrackingTouchEventProduced_withNormalizedProgress() = - runTest { - val progress = 50 - val latest by collectLastValue(eventFlow) - - eventProducer.onProgressChanged(seekBar, progress, true) - eventProducer.onStopTrackingTouch(seekBar) - - assertEquals(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5F), latest) - } - - @Test - fun onArrowUp_afterStartTrackingTouch_ArrowUpProduced() = runTest { - val latest by collectLastValue(eventFlow) - - eventProducer.onStartTrackingTouch(seekBar) - eventProducer.onArrowUp() - - assertEquals(SliderEvent(SliderEventType.ARROW_UP, 0f), latest) - } - - @Test - fun onArrowUp_afterChangeByProgram_ArrowUpProduced_withProgress() = runTest { - val progress = 50 - val latest by collectLastValue(eventFlow) - - eventProducer.onProgressChanged(seekBar, progress, false) - eventProducer.onArrowUp() - - assertEquals(SliderEvent(SliderEventType.ARROW_UP, 0.5f), latest) - } -} diff --git a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderTrackerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt index 796d6d9c3359..a09d34579e2f 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SeekableSliderTrackerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/haptics/slider/SliderStateTrackerTest.kt @@ -38,11 +38,11 @@ import org.mockito.MockitoAnnotations @SmallTest @OptIn(ExperimentalCoroutinesApi::class) @RunWith(AndroidJUnit4::class) -class SeekableSliderTrackerTest : SysuiTestCase() { +class SliderStateTrackerTest : SysuiTestCase() { @Mock private lateinit var sliderStateListener: SliderStateListener private val sliderEventProducer = FakeSliderEventProducer() - private lateinit var mSeekableSliderTracker: SeekableSliderTracker + private lateinit var mSliderStateTracker: SliderStateTracker @Before fun setup() { @@ -55,7 +55,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // THEN the tracker job is active - assertThat(mSeekableSliderTracker.isTracking).isTrue() + assertThat(mSliderStateTracker.isTracking).isTrue() } @Test @@ -65,14 +65,14 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a state in the state machine - mSeekableSliderTracker.setState(it) + mSliderStateTracker.setState(it) // WHEN the tracker stops tracking the state and listening to events - mSeekableSliderTracker.stopTracking() + mSliderStateTracker.stopTracking() // THEN The state is idle and the tracker is not active - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) - assertThat(mSeekableSliderTracker.isTracking).isFalse() + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.isTracking).isFalse() } } @@ -83,7 +83,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // THEN The state is idle and the listener is not called to play haptics - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) verifyZeroInteractions(sliderStateListener) } @@ -96,9 +96,9 @@ class SeekableSliderTrackerTest : SysuiTestCase() { sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress)) // THEN the tracker moves to the wait state and the timer job begins - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.WAIT) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT) verifyZeroInteractions(sliderStateListener) - assertThat(mSeekableSliderTracker.isWaiting).isTrue() + assertThat(mSliderStateTracker.isWaiting).isTrue() } // Tests on the WAIT state @@ -117,9 +117,9 @@ class SeekableSliderTrackerTest : SysuiTestCase() { advanceTimeBy(config.waitTimeMillis + 10L) // THEN the tracker moves to the DRAG_HANDLE_ACQUIRED_BY_TOUCH state - assertThat(mSeekableSliderTracker.currentState) + assertThat(mSliderStateTracker.currentState) .isEqualTo(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH) - assertThat(mSeekableSliderTracker.isWaiting).isFalse() + assertThat(mSliderStateTracker.isWaiting).isFalse() verify(sliderStateListener).onHandleAcquiredByTouch() verifyNoMoreInteractions(sliderStateListener) } @@ -142,9 +142,9 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker moves to the DRAG_HANDLE_ACQUIRED_BY_TOUCH state without the timer job // being complete - assertThat(mSeekableSliderTracker.currentState) + assertThat(mSliderStateTracker.currentState) .isEqualTo(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH) - assertThat(mSeekableSliderTracker.isWaiting).isFalse() + assertThat(mSliderStateTracker.isWaiting).isFalse() verify(sliderStateListener).onHandleAcquiredByTouch() verifyNoMoreInteractions(sliderStateListener) } @@ -166,9 +166,9 @@ class SeekableSliderTrackerTest : SysuiTestCase() { ) // THEN the tracker moves to the jump-track location selected state - assertThat(mSeekableSliderTracker.currentState) + assertThat(mSliderStateTracker.currentState) .isEqualTo(SliderState.JUMP_TRACK_LOCATION_SELECTED) - assertThat(mSeekableSliderTracker.isWaiting).isFalse() + assertThat(mSliderStateTracker.isWaiting).isFalse() verify(sliderStateListener).onProgressJump(anyFloat()) verifyNoMoreInteractions(sliderStateListener) } @@ -190,8 +190,8 @@ class SeekableSliderTrackerTest : SysuiTestCase() { ) // THEN the tracker moves to the jump-track location selected state - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED) - assertThat(mSeekableSliderTracker.isWaiting).isFalse() + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED) + assertThat(mSliderStateTracker.isWaiting).isFalse() verifyNoMoreInteractions(sliderStateListener) } @@ -212,8 +212,8 @@ class SeekableSliderTrackerTest : SysuiTestCase() { ) // THEN the tracker moves to the JUMP_TRACK_LOCATION_SELECTED state - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED) - assertThat(mSeekableSliderTracker.isWaiting).isFalse() + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.JUMP_BOOKEND_SELECTED) + assertThat(mSliderStateTracker.isWaiting).isFalse() verifyNoMoreInteractions(sliderStateListener) } @@ -225,15 +225,15 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // GIVEN a start of tracking touch event that moves the tracker to WAIT at the middle of the // slider sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, 0.5f)) - assertThat(mSeekableSliderTracker.isWaiting).isTrue() + assertThat(mSliderStateTracker.isWaiting).isTrue() // GIVEN that the tracker stops tracking the state and listening to events - mSeekableSliderTracker.stopTracking() + mSliderStateTracker.stopTracking() // THEN the tracker moves to the IDLE state without the timer job being complete - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) - assertThat(mSeekableSliderTracker.isWaiting).isFalse() - assertThat(mSeekableSliderTracker.isTracking).isFalse() + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.isWaiting).isFalse() + assertThat(mSliderStateTracker.isTracking).isFalse() verifyNoMoreInteractions(sliderStateListener) } @@ -244,13 +244,13 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a JUMP_TRACK_LOCATION_SELECTED state - mSeekableSliderTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED) + mSliderStateTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED) // GIVEN a progress event due to dragging the handle sliderEventProducer.sendEvent(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 0.5f)) // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) verify(sliderStateListener).onProgress(anyFloat()) verifyNoMoreInteractions(sliderStateListener) } @@ -260,14 +260,14 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a JUMP_TRACK_LOCATION_SELECTED state - mSeekableSliderTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED) + mSliderStateTracker.setState(SliderState.JUMP_TRACK_LOCATION_SELECTED) // GIVEN that the slider stopped tracking touch sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f)) // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state verify(sliderStateListener).onHandleReleasedFromTouch() - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) verifyNoMoreInteractions(sliderStateListener) } @@ -276,13 +276,13 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a JUMP_BOOKEND_SELECTED state - mSeekableSliderTracker.setState(SliderState.JUMP_BOOKEND_SELECTED) + mSliderStateTracker.setState(SliderState.JUMP_BOOKEND_SELECTED) // GIVEN that the slider stopped tracking touch sliderEventProducer.sendEvent(SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_USER, 0.5f)) // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) verify(sliderStateListener).onProgress(anyFloat()) verifyNoMoreInteractions(sliderStateListener) } @@ -292,14 +292,14 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a JUMP_BOOKEND_SELECTED state - mSeekableSliderTracker.setState(SliderState.JUMP_BOOKEND_SELECTED) + mSliderStateTracker.setState(SliderState.JUMP_BOOKEND_SELECTED) // GIVEN that the slider stopped tracking touch sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f)) // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state verify(sliderStateListener).onHandleReleasedFromTouch() - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) verifyNoMoreInteractions(sliderStateListener) } @@ -310,7 +310,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a DRAG_HANDLE_ACQUIRED_BY_TOUCH state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH) // GIVEN a progress change by the user val progress = 0.5f @@ -320,7 +320,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state verify(sliderStateListener).onProgress(progress) - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) verifyNoMoreInteractions(sliderStateListener) } @@ -329,14 +329,14 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a DRAG_HANDLE_ACQUIRED_BY_TOUCH state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_ACQUIRED_BY_TOUCH) // GIVEN that the handle stops tracking touch sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f)) // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state verify(sliderStateListener).onHandleReleasedFromTouch() - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) verifyNoMoreInteractions(sliderStateListener) } @@ -348,7 +348,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a DRAG_HANDLE_DRAGGING state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_DRAGGING) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING) // GIVEN a progress change by the user outside of bookend bounds val progress = 0.5f @@ -357,8 +357,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { ) // THEN the tracker does not change state and executes the onProgress call - assertThat(mSeekableSliderTracker.currentState) - .isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) verify(sliderStateListener).onProgress(progress) verifyNoMoreInteractions(sliderStateListener) } @@ -370,7 +369,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config) // GIVEN a DRAG_HANDLE_DRAGGING state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_DRAGGING) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING) // GIVEN a progress change by the user reaching the lower bookend val progress = config.lowerBookendThreshold - 0.01f @@ -380,7 +379,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker moves to the DRAG_HANDLE_REACHED_BOOKEND state and executes the // corresponding callback - assertThat(mSeekableSliderTracker.currentState) + assertThat(mSliderStateTracker.currentState) .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND) verify(sliderStateListener).onLowerBookend() verifyNoMoreInteractions(sliderStateListener) @@ -393,7 +392,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config) // GIVEN a DRAG_HANDLE_DRAGGING state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_DRAGGING) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING) // GIVEN a progress change by the user reaching the upper bookend val progress = config.upperBookendThreshold + 0.01f @@ -403,7 +402,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker moves to the DRAG_HANDLE_REACHED_BOOKEND state and executes the // corresponding callback - assertThat(mSeekableSliderTracker.currentState) + assertThat(mSliderStateTracker.currentState) .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND) verify(sliderStateListener).onUpperBookend() verifyNoMoreInteractions(sliderStateListener) @@ -414,14 +413,14 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a DRAG_HANDLE_DRAGGING state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_DRAGGING) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_DRAGGING) // GIVEN that the slider stops tracking touch sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f)) // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state verify(sliderStateListener).onHandleReleasedFromTouch() - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) verifyNoMoreInteractions(sliderStateListener) } @@ -434,7 +433,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config) // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND) // GIVEN a progress event that falls outside of the lower bookend range val progress = config.lowerBookendThreshold + 0.01f @@ -444,8 +443,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state and executes accordingly verify(sliderStateListener).onProgress(progress) - assertThat(mSeekableSliderTracker.currentState) - .isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) verifyNoMoreInteractions(sliderStateListener) } @@ -455,7 +453,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config) // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND) // GIVEN a progress event that falls inside of the lower bookend range val progress = config.lowerBookendThreshold - 0.01f @@ -465,7 +463,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker stays in the current state and executes accordingly verify(sliderStateListener).onLowerBookend() - assertThat(mSeekableSliderTracker.currentState) + assertThat(mSliderStateTracker.currentState) .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND) verifyNoMoreInteractions(sliderStateListener) } @@ -477,7 +475,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config) // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND) // GIVEN a progress event that falls outside of the upper bookend range val progress = config.upperBookendThreshold - 0.01f @@ -487,8 +485,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker moves to the DRAG_HANDLE_DRAGGING state and executes accordingly verify(sliderStateListener).onProgress(progress) - assertThat(mSeekableSliderTracker.currentState) - .isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.DRAG_HANDLE_DRAGGING) verifyNoMoreInteractions(sliderStateListener) } @@ -498,7 +495,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config) // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND) // GIVEN a progress event that falls inside of the upper bookend range val progress = config.upperBookendThreshold + 0.01f @@ -508,7 +505,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker stays in the current state and executes accordingly verify(sliderStateListener).onUpperBookend() - assertThat(mSeekableSliderTracker.currentState) + assertThat(mSliderStateTracker.currentState) .isEqualTo(SliderState.DRAG_HANDLE_REACHED_BOOKEND) verifyNoMoreInteractions(sliderStateListener) } @@ -518,37 +515,36 @@ class SeekableSliderTrackerTest : SysuiTestCase() { initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a DRAG_HANDLE_REACHED_BOOKEND state - mSeekableSliderTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND) + mSliderStateTracker.setState(SliderState.DRAG_HANDLE_REACHED_BOOKEND) // GIVEN that the handle stops tracking touch sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STOPPED_TRACKING_TOUCH, 0.5f)) // THEN the tracker executes on onHandleReleasedFromTouch before moving to the IDLE state verify(sliderStateListener).onHandleReleasedFromTouch() - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) verifyNoMoreInteractions(sliderStateListener) } @Test - fun onProgressChangeByProgram_atTheMiddle_onIdle_movesToArrowHandleMovedOnce() = runTest { + fun onStartedTrackingProgram_atTheMiddle_onIdle_movesToArrowHandleMovedOnce() = runTest { // GIVEN an initialized tracker in the IDLE state initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) // GIVEN a progress due to an external source that lands at the middle of the slider val progress = 0.5f sliderEventProducer.sendEvent( - SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress) + SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress) ) // THEN the state moves to ARROW_HANDLE_MOVED_ONCE and the listener is called to play // haptics - assertThat(mSeekableSliderTracker.currentState) - .isEqualTo(SliderState.ARROW_HANDLE_MOVED_ONCE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.ARROW_HANDLE_MOVED_ONCE) verify(sliderStateListener).onSelectAndArrow(progress) } @Test - fun onProgressChangeByProgram_atUpperBookend_onIdle_movesToIdle() = runTest { + fun onStartedTrackingProgram_atUpperBookend_onIdle_movesToIdle() = runTest { // GIVEN an initialized tracker in the IDLE state val config = SeekableSliderTrackerConfig() initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config) @@ -556,16 +552,16 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // GIVEN a progress due to an external source that lands at the upper bookend val progress = config.upperBookendThreshold + 0.01f sliderEventProducer.sendEvent( - SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress) + SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress) ) // THEN the tracker executes upper bookend haptics before moving back to IDLE verify(sliderStateListener).onUpperBookend() - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) } @Test - fun onProgressChangeByProgram_atLowerBookend_onIdle_movesToIdle() = runTest { + fun onStartedTrackingProgram_atLowerBookend_onIdle_movesToIdle() = runTest { // GIVEN an initialized tracker in the IDLE state val config = SeekableSliderTrackerConfig() initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config) @@ -573,26 +569,28 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // WHEN a progress is recorded due to an external source that lands at the lower bookend val progress = config.lowerBookendThreshold - 0.01f sliderEventProducer.sendEvent( - SliderEvent(SliderEventType.PROGRESS_CHANGE_BY_PROGRAM, progress) + SliderEvent(SliderEventType.STARTED_TRACKING_PROGRAM, progress) ) // THEN the tracker executes lower bookend haptics before moving to IDLE verify(sliderStateListener).onLowerBookend() - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) } @Test fun onArrowUp_onArrowMovedOnce_movesToIdle() = runTest { // GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) - mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE) + mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE) // WHEN the external stimulus is released val progress = 0.5f - sliderEventProducer.sendEvent(SliderEvent(SliderEventType.ARROW_UP, progress)) + sliderEventProducer.sendEvent( + SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, progress) + ) // THEN the tracker moves back to IDLE and there are no haptics - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) verifyZeroInteractions(sliderStateListener) } @@ -600,7 +598,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { fun onStartTrackingTouch_onArrowMovedOnce_movesToWait() = runTest { // GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) - mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE) + mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE) // WHEN the slider starts tracking touch val progress = 0.5f @@ -608,8 +606,8 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker moves back to WAIT and starts the waiting job. Also, there are no // haptics - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.WAIT) - assertThat(mSeekableSliderTracker.isWaiting).isTrue() + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT) + assertThat(mSliderStateTracker.isWaiting).isTrue() verifyZeroInteractions(sliderStateListener) } @@ -617,7 +615,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { fun onProgressChangeByProgram_onArrowMovedOnce_movesToArrowMovesContinuously() = runTest { // GIVEN an initialized tracker in the ARROW_HANDLE_MOVED_ONCE state initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) - mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE) + mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVED_ONCE) // WHEN the slider gets an external progress change val progress = 0.5f @@ -627,7 +625,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker moves to ARROW_HANDLE_MOVES_CONTINUOUSLY and calls the appropriate // haptics - assertThat(mSeekableSliderTracker.currentState) + assertThat(mSliderStateTracker.currentState) .isEqualTo(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) verify(sliderStateListener).onProgress(progress) } @@ -636,14 +634,16 @@ class SeekableSliderTrackerTest : SysuiTestCase() { fun onArrowUp_onArrowMovesContinuously_movesToIdle() = runTest { // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) - mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) + mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) // WHEN the external stimulus is released val progress = 0.5f - sliderEventProducer.sendEvent(SliderEvent(SliderEventType.ARROW_UP, progress)) + sliderEventProducer.sendEvent( + SliderEvent(SliderEventType.STOPPED_TRACKING_PROGRAM, progress) + ) // THEN the tracker moves to IDLE and no haptics are played - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) verifyZeroInteractions(sliderStateListener) } @@ -651,15 +651,15 @@ class SeekableSliderTrackerTest : SysuiTestCase() { fun onStartTrackingTouch_onArrowMovesContinuously_movesToWait() = runTest { // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) - mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) + mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) // WHEN the slider starts tracking touch val progress = 0.5f sliderEventProducer.sendEvent(SliderEvent(SliderEventType.STARTED_TRACKING_TOUCH, progress)) // THEN the tracker moves to WAIT and the wait job starts. - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.WAIT) - assertThat(mSeekableSliderTracker.isWaiting).isTrue() + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.WAIT) + assertThat(mSliderStateTracker.isWaiting).isTrue() verifyZeroInteractions(sliderStateListener) } @@ -667,7 +667,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { fun onProgressChangeByProgram_onArrowMovesContinuously_preservesState() = runTest { // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler))) - mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) + mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) // WHEN the slider changes progress programmatically at the middle val progress = 0.5f @@ -676,7 +676,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { ) // THEN the tracker stays in the same state and haptics are delivered appropriately - assertThat(mSeekableSliderTracker.currentState) + assertThat(mSliderStateTracker.currentState) .isEqualTo(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) verify(sliderStateListener).onProgress(progress) } @@ -686,7 +686,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state val config = SeekableSliderTrackerConfig() initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config) - mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) + mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) // WHEN the slider reaches the lower bookend programmatically val progress = config.lowerBookendThreshold - 0.01f @@ -696,7 +696,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker executes lower bookend haptics before moving to IDLE verify(sliderStateListener).onLowerBookend() - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) } @Test @@ -704,7 +704,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // GIVEN an initialized tracker in the ARROW_HANDLE_MOVES_CONTINUOUSLY state val config = SeekableSliderTrackerConfig() initTracker(CoroutineScope(UnconfinedTestDispatcher(testScheduler)), config) - mSeekableSliderTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) + mSliderStateTracker.setState(SliderState.ARROW_HANDLE_MOVES_CONTINUOUSLY) // WHEN the slider reaches the lower bookend programmatically val progress = config.upperBookendThreshold + 0.01f @@ -714,7 +714,7 @@ class SeekableSliderTrackerTest : SysuiTestCase() { // THEN the tracker executes upper bookend haptics before moving to IDLE verify(sliderStateListener).onUpperBookend() - assertThat(mSeekableSliderTracker.currentState).isEqualTo(SliderState.IDLE) + assertThat(mSliderStateTracker.currentState).isEqualTo(SliderState.IDLE) } @OptIn(ExperimentalCoroutinesApi::class) @@ -722,8 +722,8 @@ class SeekableSliderTrackerTest : SysuiTestCase() { scope: CoroutineScope, config: SeekableSliderTrackerConfig = SeekableSliderTrackerConfig(), ) { - mSeekableSliderTracker = - SeekableSliderTracker(sliderStateListener, sliderEventProducer, scope, config) - mSeekableSliderTracker.startTracking() + mSliderStateTracker = + SliderStateTracker(sliderStateListener, sliderEventProducer, scope, config) + mSliderStateTracker.startTracking() } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt index 6a22d8648d91..fb91c78b9041 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/settings/brightness/BrightnessSliderControllerTest.kt @@ -24,7 +24,7 @@ import com.android.internal.logging.testing.UiEventLoggerFake import com.android.settingslib.RestrictedLockUtils import com.android.systemui.SysuiTestCase import com.android.systemui.classifier.FalsingManagerFake -import com.android.systemui.haptics.slider.SeekableSliderHapticPlugin +import com.android.systemui.haptics.slider.SeekbarHapticPlugin import com.android.systemui.plugins.ActivityStarter import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.policy.BrightnessMirrorController @@ -93,7 +93,7 @@ class BrightnessSliderControllerTest : SysuiTestCase() { brightnessSliderView, mFalsingManager, uiEventLogger, - SeekableSliderHapticPlugin(vibratorHelper, systemClock), + SeekbarHapticPlugin(vibratorHelper, systemClock), activityStarter, ) mController.init() |