1 /*
2  * Copyright (C) 2023 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.systemui.unfold
17 
18 import android.os.VibrationAttributes
19 import android.os.VibrationEffect
20 import android.os.Vibrator
21 import android.testing.AndroidTestingRunner
22 import androidx.test.filters.SmallTest
23 import com.android.systemui.SysuiTestCase
24 import com.android.systemui.unfold.util.TestFoldProvider
25 import com.android.systemui.util.mockito.any
26 import com.android.systemui.util.mockito.mock
27 import org.junit.Before
28 import org.junit.Test
29 import org.junit.runner.RunWith
30 import org.mockito.Mockito.clearInvocations
31 import org.mockito.Mockito.never
32 import org.mockito.Mockito.verify
33 
34 @RunWith(AndroidTestingRunner::class)
35 @SmallTest
36 class UnfoldHapticsPlayerTest : SysuiTestCase() {
37 
38     private val progressProvider = TestUnfoldTransitionProvider()
39     private val vibrator: Vibrator = mock()
40     private val testFoldProvider = TestFoldProvider()
41 
42     private lateinit var player: UnfoldHapticsPlayer
43 
44     @Before
45     fun before() {
46         player = UnfoldHapticsPlayer(progressProvider, testFoldProvider, Runnable::run, vibrator)
47     }
48 
49     @Test
50     fun testUnfoldingTransitionFinishingEarly_playsHaptics() {
51         testFoldProvider.onFoldUpdate(isFolded = true)
52         testFoldProvider.onFoldUpdate(isFolded = false)
53         progressProvider.onTransitionStarted()
54         progressProvider.onTransitionProgress(0.5f)
55         progressProvider.onTransitionFinishing()
56 
57         verify(vibrator).vibrate(any<VibrationEffect>(), any<VibrationAttributes>())
58     }
59 
60     @Test
61     fun testUnfoldingTransitionFinishingLate_doesNotPlayHaptics() {
62         testFoldProvider.onFoldUpdate(isFolded = true)
63         testFoldProvider.onFoldUpdate(isFolded = false)
64         progressProvider.onTransitionStarted()
65         progressProvider.onTransitionProgress(0.99f)
66         progressProvider.onTransitionFinishing()
67 
68         verify(vibrator, never()).vibrate(any<VibrationEffect>(), any<VibrationAttributes>())
69     }
70 
71     @Test
72     fun testFoldingAfterUnfolding_doesNotPlayHaptics() {
73         // Unfold
74         testFoldProvider.onFoldUpdate(isFolded = true)
75         testFoldProvider.onFoldUpdate(isFolded = false)
76         progressProvider.onTransitionStarted()
77         progressProvider.onTransitionProgress(0.5f)
78         progressProvider.onTransitionFinishing()
79         progressProvider.onTransitionFinished()
80         clearInvocations(vibrator)
81 
82         // Fold
83         progressProvider.onTransitionStarted()
84         progressProvider.onTransitionProgress(0.5f)
85         progressProvider.onTransitionFinished()
86         testFoldProvider.onFoldUpdate(isFolded = true)
87 
88         verify(vibrator, never()).vibrate(any<VibrationEffect>(), any<VibrationAttributes>())
89     }
90 
91     @Test
92     fun testUnfoldingAfterFoldingAndUnfolding_playsHaptics() {
93         // Unfold
94         testFoldProvider.onFoldUpdate(isFolded = true)
95         testFoldProvider.onFoldUpdate(isFolded = false)
96         progressProvider.onTransitionStarted()
97         progressProvider.onTransitionProgress(0.5f)
98         progressProvider.onTransitionFinishing()
99         progressProvider.onTransitionFinished()
100 
101         // Fold
102         progressProvider.onTransitionStarted()
103         progressProvider.onTransitionProgress(0.5f)
104         progressProvider.onTransitionFinished()
105         testFoldProvider.onFoldUpdate(isFolded = true)
106         clearInvocations(vibrator)
107 
108         // Unfold again
109         testFoldProvider.onFoldUpdate(isFolded = true)
110         testFoldProvider.onFoldUpdate(isFolded = false)
111         progressProvider.onTransitionStarted()
112         progressProvider.onTransitionProgress(0.5f)
113         progressProvider.onTransitionFinishing()
114         progressProvider.onTransitionFinished()
115 
116         verify(vibrator).vibrate(any<VibrationEffect>(), any<VibrationAttributes>())
117     }
118 }
119