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.statusbar.notification.icon.ui.viewbinder
17 
18 import android.testing.AndroidTestingRunner
19 import android.testing.TestableLooper.RunWithLooper
20 import androidx.test.filters.SmallTest
21 import com.android.systemui.SysuiTestCase
22 import com.android.systemui.demomode.DemoModeController
23 import com.android.systemui.flags.FeatureFlags
24 import com.android.systemui.plugins.DarkIconDispatcher
25 import com.android.systemui.plugins.statusbar.StatusBarStateController
26 import com.android.systemui.statusbar.NotificationListener
27 import com.android.systemui.statusbar.NotificationMediaManager
28 import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator
29 import com.android.systemui.statusbar.notification.collection.provider.SectionStyleProvider
30 import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel
31 import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerShelfViewModel
32 import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerStatusBarViewModel
33 import com.android.systemui.statusbar.phone.DozeParameters
34 import com.android.systemui.statusbar.phone.KeyguardBypassController
35 import com.android.systemui.statusbar.phone.NotificationIconContainer
36 import com.android.systemui.statusbar.phone.ScreenOffAnimationController
37 import com.android.systemui.statusbar.window.StatusBarWindowController
38 import com.android.systemui.util.mockito.whenever
39 import com.android.wm.shell.bubbles.Bubbles
40 import java.util.Optional
41 import org.junit.Assert.assertFalse
42 import org.junit.Assert.assertTrue
43 import org.junit.Before
44 import org.junit.Test
45 import org.junit.runner.RunWith
46 import org.mockito.Mock
47 import org.mockito.Mockito.verify
48 import org.mockito.MockitoAnnotations
49 
50 @SmallTest
51 @RunWith(AndroidTestingRunner::class)
52 @RunWithLooper(setAsMainLooper = true)
53 class NotificationIconAreaControllerViewBinderWrapperImplTest : SysuiTestCase() {
54     @Mock private lateinit var notifListener: NotificationListener
55     @Mock private lateinit var statusBarStateController: StatusBarStateController
56     @Mock private lateinit var wakeUpCoordinator: NotificationWakeUpCoordinator
57     @Mock private lateinit var keyguardBypassController: KeyguardBypassController
58     @Mock private lateinit var notifMediaManager: NotificationMediaManager
59     @Mock private lateinit var dozeParams: DozeParameters
60     @Mock private lateinit var sectionStyleProvider: SectionStyleProvider
61     @Mock private lateinit var darkIconDispatcher: DarkIconDispatcher
62     @Mock private lateinit var statusBarWindowController: StatusBarWindowController
63     @Mock private lateinit var screenOffAnimController: ScreenOffAnimationController
64     @Mock private lateinit var bubbles: Bubbles
65     @Mock private lateinit var demoModeController: DemoModeController
66     @Mock private lateinit var aodIcons: NotificationIconContainer
67     @Mock private lateinit var featureFlags: FeatureFlags
68 
69     private val shelfViewModel = NotificationIconContainerShelfViewModel()
70     private val statusBarViewModel = NotificationIconContainerStatusBarViewModel()
71     private val aodViewModel = NotificationIconContainerAlwaysOnDisplayViewModel()
72 
73     private lateinit var underTest: NotificationIconAreaControllerViewBinderWrapperImpl
74 
75     @Before
76     fun setup() {
77         MockitoAnnotations.initMocks(this)
78         underTest =
79             NotificationIconAreaControllerViewBinderWrapperImpl(
80                 mContext,
81                 statusBarStateController,
82                 wakeUpCoordinator,
83                 keyguardBypassController,
84                 notifMediaManager,
85                 notifListener,
86                 dozeParams,
87                 sectionStyleProvider,
88                 Optional.of(bubbles),
89                 demoModeController,
90                 darkIconDispatcher,
91                 featureFlags,
92                 statusBarWindowController,
93                 screenOffAnimController,
94                 shelfViewModel,
95                 statusBarViewModel,
96                 aodViewModel,
97             )
98     }
99 
100     @Test
101     fun testNotificationIcons_settingHideIcons() {
102         underTest.settingsListener.onStatusBarIconsBehaviorChanged(true)
103         assertFalse(underTest.shouldShowLowPriorityIcons())
104     }
105 
106     @Test
107     fun testNotificationIcons_settingShowIcons() {
108         underTest.settingsListener.onStatusBarIconsBehaviorChanged(false)
109         assertTrue(underTest.shouldShowLowPriorityIcons())
110     }
111 
112     @Test
113     fun testAppearResetsTranslation() {
114         underTest.setupAodIcons(aodIcons)
115         whenever(dozeParams.shouldControlScreenOff()).thenReturn(false)
116         underTest.appearAodIcons()
117         verify(aodIcons).translationY = 0f
118         verify(aodIcons).alpha = 1.0f
119     }
120 }
121