1 package com.android.systemui.statusbar
2 
3 import android.media.AudioAttributes
4 import android.os.UserHandle
5 import android.os.VibrationAttributes
6 import android.os.VibrationEffect
7 import android.os.Vibrator
8 import android.testing.AndroidTestingRunner
9 import android.view.HapticFeedbackConstants
10 import android.view.View
11 import androidx.test.filters.SmallTest
12 import com.android.systemui.SysuiTestCase
13 import com.android.systemui.util.mockito.eq
14 import com.google.common.truth.Truth.assertThat
15 import org.junit.Before
16 import org.junit.Rule
17 import org.junit.Test
18 import org.junit.runner.RunWith
19 import org.mockito.ArgumentCaptor
20 import org.mockito.Captor
21 import org.mockito.Mock
22 import org.mockito.Mockito.`when` as whenever
23 import org.mockito.Mockito.any
24 import org.mockito.Mockito.mock
25 import org.mockito.Mockito.verify
26 import org.mockito.junit.MockitoJUnit
27 import java.util.concurrent.Executor
28 
29 @RunWith(AndroidTestingRunner::class)
30 @SmallTest
31 class VibratorHelperTest : SysuiTestCase() {
32 
33     @JvmField @Rule
34     var rule = MockitoJUnit.rule()
35 
36     @Mock lateinit var vibrator: Vibrator
37     @Mock lateinit var executor: Executor
38     @Mock lateinit var view: View
39     @Captor lateinit var backgroundTaskCaptor: ArgumentCaptor<Runnable>
40     lateinit var vibratorHelper: VibratorHelper
41 
42     @Before
43     fun setup() {
44         vibratorHelper = VibratorHelper(vibrator, executor)
45         whenever(vibrator.hasVibrator()).thenReturn(true)
46     }
47 
48     @Test
49     fun testVibrate() {
50         vibratorHelper.vibrate(VibrationEffect.EFFECT_CLICK)
51         verifyAsync().vibrate(any(VibrationEffect::class.java),
52                 any(VibrationAttributes::class.java))
53     }
54 
55     @Test
56     fun testVibrate2() {
57         vibratorHelper.vibrate(UserHandle.USER_CURRENT, "package",
58                 mock(VibrationEffect::class.java), "reason",
59                 mock(VibrationAttributes::class.java))
60         verifyAsync().vibrate(eq(UserHandle.USER_CURRENT), eq("package"),
61                 any(VibrationEffect::class.java), eq("reason"),
62                 any(VibrationAttributes::class.java))
63     }
64 
65     @Test
66     fun testVibrate3() {
67         vibratorHelper.vibrate(mock(VibrationEffect::class.java), mock(AudioAttributes::class.java))
68         verifyAsync().vibrate(any(VibrationEffect::class.java), any(AudioAttributes::class.java))
69     }
70 
71     @Test
72     fun testVibrate4() {
73         vibratorHelper.vibrate(mock(VibrationEffect::class.java))
74         verifyAsync().vibrate(any(VibrationEffect::class.java))
75     }
76 
77     @Test
78     fun testPerformHapticFeedback() {
79         val constant = HapticFeedbackConstants.CONFIRM
80         vibratorHelper.performHapticFeedback(view, constant)
81         verify(view).performHapticFeedback(eq(constant))
82     }
83 
84     @Test
85     fun testPerformHapticFeedback_withFlags() {
86         val constant = HapticFeedbackConstants.CONFIRM
87         val flag = HapticFeedbackConstants.FLAG_IGNORE_VIEW_SETTING
88         vibratorHelper.performHapticFeedback(view, constant, flag)
89         verify(view).performHapticFeedback(eq(constant), eq(flag))
90     }
91 
92     @Test
93     fun testHasVibrator() {
94         assertThat(vibratorHelper.hasVibrator()).isTrue()
95         verify(vibrator).hasVibrator()
96     }
97 
98     @Test
99     fun testCancel() {
100         vibratorHelper.cancel()
101         verifyAsync().cancel()
102     }
103 
104     private fun verifyAsync(): Vibrator {
105         verify(executor).execute(backgroundTaskCaptor.capture())
106         verify(vibrator).hasVibrator()
107         backgroundTaskCaptor.value.run()
108 
109         return verify(vibrator)
110     }
111 }