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 androidx.test.ext.junit.runners.AndroidJUnit4 22 import androidx.test.filters.SmallTest 23 import com.android.systemui.SysuiTestCase 24 import com.android.systemui.testKosmos 25 import com.android.systemui.util.mockito.any 26 import org.junit.Before 27 import org.junit.Test 28 import org.junit.runner.RunWith 29 import org.mockito.Mockito.clearInvocations 30 import org.mockito.Mockito.never 31 import org.mockito.Mockito.verify 32 33 @RunWith(AndroidJUnit4::class) 34 @SmallTest 35 class UnfoldHapticsPlayerTest : SysuiTestCase() { 36 37 private val kosmos = testKosmos() 38 39 private val progressProvider = kosmos.fakeUnfoldTransitionProgressProvider 40 private val vibrator = kosmos.vibrator 41 private val transitionConfig = kosmos.unfoldTransitionConfig 42 private val testFoldProvider = kosmos.foldProvider 43 44 private lateinit var player: UnfoldHapticsPlayer 45 46 @Before beforenull47 fun before() { 48 transitionConfig.isHapticsEnabled = true 49 player = UnfoldHapticsPlayer(progressProvider, testFoldProvider, transitionConfig, 50 Runnable::run, vibrator) 51 } 52 53 @Test testUnfoldingTransitionFinishingEarly_playsHapticsnull54 fun testUnfoldingTransitionFinishingEarly_playsHaptics() { 55 testFoldProvider.onFoldUpdate(isFolded = true) 56 testFoldProvider.onFoldUpdate(isFolded = false) 57 progressProvider.onTransitionStarted() 58 progressProvider.onTransitionProgress(0.5f) 59 progressProvider.onTransitionFinishing() 60 61 verify(vibrator).vibrate(any<VibrationEffect>(), any<VibrationAttributes>()) 62 } 63 64 @Test testHapticsDisabled_unfoldingTransitionFinishing_doesNotPlayHapticsnull65 fun testHapticsDisabled_unfoldingTransitionFinishing_doesNotPlayHaptics() { 66 transitionConfig.isHapticsEnabled = false 67 player = UnfoldHapticsPlayer(progressProvider, testFoldProvider, transitionConfig, 68 Runnable::run, vibrator) 69 70 testFoldProvider.onFoldUpdate(isFolded = true) 71 testFoldProvider.onFoldUpdate(isFolded = false) 72 progressProvider.onTransitionStarted() 73 progressProvider.onTransitionProgress(0.5f) 74 progressProvider.onTransitionFinishing() 75 76 verify(vibrator).vibrate(any<VibrationEffect>(), any<VibrationAttributes>()) 77 } 78 79 @Test testUnfoldingTransitionFinishingLate_doesNotPlayHapticsnull80 fun testUnfoldingTransitionFinishingLate_doesNotPlayHaptics() { 81 testFoldProvider.onFoldUpdate(isFolded = true) 82 testFoldProvider.onFoldUpdate(isFolded = false) 83 progressProvider.onTransitionStarted() 84 progressProvider.onTransitionProgress(0.99f) 85 progressProvider.onTransitionFinishing() 86 87 verify(vibrator, never()).vibrate(any<VibrationEffect>(), any<VibrationAttributes>()) 88 } 89 90 @Test testFoldingAfterUnfolding_doesNotPlayHapticsnull91 fun testFoldingAfterUnfolding_doesNotPlayHaptics() { 92 // Unfold 93 testFoldProvider.onFoldUpdate(isFolded = true) 94 testFoldProvider.onFoldUpdate(isFolded = false) 95 progressProvider.onTransitionStarted() 96 progressProvider.onTransitionProgress(0.5f) 97 progressProvider.onTransitionFinishing() 98 progressProvider.onTransitionFinished() 99 clearInvocations(vibrator) 100 101 // Fold 102 progressProvider.onTransitionStarted() 103 progressProvider.onTransitionProgress(0.5f) 104 progressProvider.onTransitionFinished() 105 testFoldProvider.onFoldUpdate(isFolded = true) 106 107 verify(vibrator, never()).vibrate(any<VibrationEffect>(), any<VibrationAttributes>()) 108 } 109 110 @Test testUnfoldingAfterFoldingAndUnfolding_playsHapticsnull111 fun testUnfoldingAfterFoldingAndUnfolding_playsHaptics() { 112 // Unfold 113 testFoldProvider.onFoldUpdate(isFolded = true) 114 testFoldProvider.onFoldUpdate(isFolded = false) 115 progressProvider.onTransitionStarted() 116 progressProvider.onTransitionProgress(0.5f) 117 progressProvider.onTransitionFinishing() 118 progressProvider.onTransitionFinished() 119 120 // Fold 121 progressProvider.onTransitionStarted() 122 progressProvider.onTransitionProgress(0.5f) 123 progressProvider.onTransitionFinished() 124 testFoldProvider.onFoldUpdate(isFolded = true) 125 clearInvocations(vibrator) 126 127 // Unfold again 128 testFoldProvider.onFoldUpdate(isFolded = true) 129 testFoldProvider.onFoldUpdate(isFolded = false) 130 progressProvider.onTransitionStarted() 131 progressProvider.onTransitionProgress(0.5f) 132 progressProvider.onTransitionFinishing() 133 progressProvider.onTransitionFinished() 134 135 verify(vibrator).vibrate(any<VibrationEffect>(), any<VibrationAttributes>()) 136 } 137 } 138