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

Commit dab379e0 authored by Nick Chameyev's avatar Nick Chameyev Committed by Android (Google) Code Review
Browse files

Merge "Make haptics during unfold animation configurable" into 24D1-dev

parents 56fd37ce 065ddcc7
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