Using performHapticFeedback on ControlActionCoordinatorImpl

Replacing the calls to vibrate() with performHapticFeedback when a drag()
action is performed. The vibrations for when the drag event corresponds to
an edge or not where replaced by the SEGMENT_TICK and
SEGMENT_FREQUENT_TICK, respectively. The changes are controlled by a feature
flag

Test: Unit tests were added to ControlActionCoordinatorImplTest to verify
  that vibrate() or performHapticFeedback are used depending on the flag.
Bug: 245528624
Change-Id: Ifdb9e45c97071838a92d998912b5d8529b789320
This commit is contained in:
Juan Sebastian Martinez
2023-08-09 11:09:57 -07:00
parent 8a9733fc8d
commit 099901dc7e
4 changed files with 69 additions and 9 deletions

View File

@@ -54,9 +54,10 @@ interface ControlActionCoordinator {
/**
* When a ToggleRange control is interacting with, a drag event is sent.
*
* @param cvh [ControlViewHolder] for the control
* @param isEdge did the drag event reach a control edge
*/
fun drag(isEdge: Boolean)
fun drag(cvh: ControlViewHolder, isEdge: Boolean)
/**
* Send a request to update the value of a device using the [FloatAction].

View File

@@ -37,6 +37,8 @@ import com.android.systemui.controls.ControlsMetricsLogger
import com.android.systemui.controls.settings.ControlsSettingsRepository
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags.ONE_WAY_HAPTICS_API_MIGRATION
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -57,6 +59,7 @@ class ControlActionCoordinatorImpl @Inject constructor(
private val controlsMetricsLogger: ControlsMetricsLogger,
private val vibrator: VibratorHelper,
private val controlsSettingsRepository: ControlsSettingsRepository,
private val featureFlags: FeatureFlags,
) : ControlActionCoordinator {
private var dialog: Dialog? = null
private var pendingAction: Action? = null
@@ -119,11 +122,17 @@ class ControlActionCoordinatorImpl @Inject constructor(
)
}
override fun drag(isEdge: Boolean) {
if (isEdge) {
vibrate(Vibrations.rangeEdgeEffect)
override fun drag(cvh: ControlViewHolder, isEdge: Boolean) {
if (featureFlags.isEnabled(ONE_WAY_HAPTICS_API_MIGRATION)) {
val constant =
if (isEdge)
HapticFeedbackConstants.SEGMENT_TICK
else
HapticFeedbackConstants.SEGMENT_FREQUENT_TICK
vibrator.performHapticFeedback(cvh.layout, constant)
} else {
vibrate(Vibrations.rangeMiddleEffect)
val effect = if (isEdge) Vibrations.rangeEdgeEffect else Vibrations.rangeMiddleEffect
vibrate(effect)
}
}

View File

@@ -235,7 +235,7 @@ class ToggleRangeBehavior : Behavior {
if (isDragging) {
val isEdge = newLevel == MIN_LEVEL || newLevel == MAX_LEVEL
if (clipLayer.level != newLevel) {
cvh.controlActionCoordinator.drag(isEdge)
cvh.controlActionCoordinator.drag(cvh, isEdge)
clipLayer.level = newLevel
}
} else if (newLevel != clipLayer.level) {

View File

@@ -18,12 +18,14 @@ package com.android.systemui.controls.ui
import android.test.suitebuilder.annotation.SmallTest
import android.testing.AndroidTestingRunner
import android.view.HapticFeedbackConstants
import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastSender
import com.android.systemui.controls.ControlsMetricsLogger
import com.android.systemui.controls.settings.ControlsSettingsDialogManager
import com.android.systemui.controls.settings.FakeControlsSettingsRepository
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.FakeFeatureFlags
import com.android.systemui.flags.Flags.ONE_WAY_HAPTICS_API_MIGRATION
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.statusbar.VibratorHelper
import com.android.systemui.statusbar.policy.KeyguardStateController
@@ -33,6 +35,7 @@ import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Answers
import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.anyBoolean
@@ -68,8 +71,6 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() {
@Mock
private lateinit var metricsLogger: ControlsMetricsLogger
@Mock
private lateinit var featureFlags: FeatureFlags
@Mock
private lateinit var controlsSettingsDialogManager: ControlsSettingsDialogManager
companion object {
@@ -82,6 +83,8 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() {
private lateinit var action: ControlActionCoordinatorImpl.Action
private lateinit var controlsSettingsRepository: FakeControlsSettingsRepository
private val featureFlags = FakeFeatureFlags()
@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
@@ -101,6 +104,7 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() {
metricsLogger,
vibratorHelper,
controlsSettingsRepository,
featureFlags
))
coordinator.activityContext = mContext
@@ -194,4 +198,50 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() {
verify(coordinator).bouncerOrRun(action)
verify(action, never()).invoke()
}
@Test
fun drag_isEdge_oneWayHapticsDisabled_usesVibrate() {
featureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false)
coordinator.drag(cvh, true)
verify(vibratorHelper).vibrate(
Vibrations.rangeEdgeEffect
)
}
@Test
fun drag_isNotEdge_oneWayHapticsDisabled_usesVibrate() {
featureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, false)
coordinator.drag(cvh, false)
verify(vibratorHelper).vibrate(
Vibrations.rangeMiddleEffect
)
}
@Test
fun drag_isEdge_oneWayHapticsEnabled_usesPerformHapticFeedback() {
featureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true)
coordinator.drag(cvh, true)
verify(vibratorHelper).performHapticFeedback(
any(),
eq(HapticFeedbackConstants.SEGMENT_TICK)
)
}
@Test
fun drag_isNotEdge_oneWayHapticsEnabled_usesPerformHapticFeedback() {
featureFlags.set(ONE_WAY_HAPTICS_API_MIGRATION, true)
coordinator.drag(cvh, false)
verify(vibratorHelper).performHapticFeedback(
any(),
eq(HapticFeedbackConstants.SEGMENT_FREQUENT_TICK)
)
}
}