Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 099901dc authored by Juan Sebastian Martinez's avatar Juan Sebastian Martinez
Browse files

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
parent 8a9733fc
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -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].
+13 −4
Original line number Diff line number Diff line
@@ -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)
        }
    }

+1 −1
Original line number Diff line number Diff line
@@ -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) {
+53 −3
Original line number Diff line number Diff line
@@ -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)
        )
    }
}