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 }