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