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

Commit 065ddcc7 authored by Nick Chameyev's avatar Nick Chameyev
Browse files

Make haptics during unfold animation configurable

Adds a resource property to control if we should
play haptics effect during unfold animation.

Bug: 336388573
Test: atest UnfoldHapticsPlayerTest
Test: manual test that haptics could be disabled
Merged-In: I379472097f46cab8eac82febe6eace2d45791c9c
Change-Id: I379472097f46cab8eac82febe6eace2d45791c9c
parent 8bd6d5d6
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -764,6 +764,9 @@
    <!-- Indicates whether to enable hinge angle sensor when using unfold animation -->
    <bool name="config_unfoldTransitionHingeAngle">false</bool>

    <!-- Indicates whether to enable haptics during unfold animation -->
    <bool name="config_unfoldTransitionHapticsEnabled">false</bool>

    <!-- Indicates the time needed to time out the fold animation if the device stops in half folded
         mode. -->
    <integer name="config_unfoldTransitionHalfFoldedTimeout">1000</integer>
+1 −0
Original line number Diff line number Diff line
@@ -4198,6 +4198,7 @@
  <java-symbol type="bool" name="config_supportsConcurrentInternalDisplays" />
  <java-symbol type="bool" name="config_unfoldTransitionEnabled" />
  <java-symbol type="bool" name="config_unfoldTransitionHingeAngle" />
  <java-symbol type="bool" name="config_unfoldTransitionHapticsEnabled" />
  <java-symbol type="integer" name="config_unfoldTransitionHalfFoldedTimeout" />
  <java-symbol type="array" name="config_perDeviceStateRotationLockDefaults" />

+8 −12
Original line number Diff line number Diff line
@@ -6,8 +6,8 @@ import android.os.VibrationEffect
import android.os.Vibrator
import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
import com.android.systemui.unfold.config.UnfoldTransitionConfig
import com.android.systemui.unfold.updates.FoldProvider
import com.android.systemui.unfold.updates.FoldProvider.FoldCallback
import java.util.concurrent.Executor
import javax.inject.Inject

@@ -18,6 +18,7 @@ class UnfoldHapticsPlayer
constructor(
    unfoldTransitionProgressProvider: UnfoldTransitionProgressProvider,
    foldProvider: FoldProvider,
    transitionConfig: UnfoldTransitionConfig,
    @Main private val mainExecutor: Executor,
    private val vibrator: Vibrator?
) : TransitionProgressListener {
@@ -27,22 +28,17 @@ constructor(
            VibrationAttributes.createForUsage(VibrationAttributes.USAGE_HARDWARE_FEEDBACK)

    init {
        if (vibrator != null) {
        if (vibrator != null && transitionConfig.isHapticsEnabled) {
            // We don't need to remove the callback because we should listen to it
            // the whole time when SystemUI process is alive
            unfoldTransitionProgressProvider.addCallback(this)
        }

        foldProvider.registerCallback(
            object : FoldCallback {
                override fun onFoldUpdated(isFolded: Boolean) {
            foldProvider.registerCallback({ isFolded ->
                if (isFolded) {
                    isFirstAnimationAfterUnfold = true
                }
            }, mainExecutor)
        }
            },
            mainExecutor
        )
    }

    private var lastTransitionProgress = TRANSITION_PROGRESS_FULL_OPEN
+1 −0
Original line number Diff line number Diff line
@@ -313,6 +313,7 @@ class PhoneStatusBarViewControllerTest : SysuiTestCase() {
    private class UnfoldConfig : UnfoldTransitionConfig {
        override var isEnabled: Boolean = false
        override var isHingeAngleEnabled: Boolean = false
        override val isHapticsEnabled: Boolean = false
        override val halfFoldedTimeoutMillis: Int = 0
    }

+25 −6
Original line number Diff line number Diff line
@@ -17,13 +17,12 @@ package com.android.systemui.unfold

import android.os.VibrationAttributes
import android.os.VibrationEffect
import android.os.Vibrator
import android.os.vibrator
import android.testing.AndroidTestingRunner
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.unfold.util.TestFoldProvider
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
@@ -35,15 +34,20 @@ import org.mockito.Mockito.verify
@SmallTest
class UnfoldHapticsPlayerTest : SysuiTestCase() {

    private val kosmos = testKosmos()

    private val progressProvider = TestUnfoldTransitionProvider()
    private val vibrator: Vibrator = mock()
    private val testFoldProvider = TestFoldProvider()
    private val vibrator = kosmos.vibrator
    private val transitionConfig = kosmos.unfoldTransitionConfig
    private val testFoldProvider = kosmos.foldProvider

    private lateinit var player: UnfoldHapticsPlayer

    @Before
    fun before() {
        player = UnfoldHapticsPlayer(progressProvider, testFoldProvider, Runnable::run, vibrator)
        transitionConfig.isHapticsEnabled = true
        player = UnfoldHapticsPlayer(progressProvider, testFoldProvider, transitionConfig,
            Runnable::run, vibrator)
    }

    @Test
@@ -57,6 +61,21 @@ class UnfoldHapticsPlayerTest : SysuiTestCase() {
        verify(vibrator).vibrate(any<VibrationEffect>(), any<VibrationAttributes>())
    }

    @Test
    fun testHapticsDisabled_unfoldingTransitionFinishing_doesNotPlayHaptics() {
        transitionConfig.isHapticsEnabled = false
        player = UnfoldHapticsPlayer(progressProvider, testFoldProvider, transitionConfig,
                Runnable::run, vibrator)

        testFoldProvider.onFoldUpdate(isFolded = true)
        testFoldProvider.onFoldUpdate(isFolded = false)
        progressProvider.onTransitionStarted()
        progressProvider.onTransitionProgress(0.5f)
        progressProvider.onTransitionFinishing()

        verify(vibrator).vibrate(any<VibrationEffect>(), any<VibrationAttributes>())
    }

    @Test
    fun testUnfoldingTransitionFinishingLate_doesNotPlayHaptics() {
        testFoldProvider.onFoldUpdate(isFolded = true)
Loading