1 /*
2  * Copyright (C) 2022 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 
17 package com.android.systemui.qs.tiles
18 
19 import android.hardware.display.ColorDisplayManager
20 import android.hardware.display.NightDisplayListener
21 import android.os.Handler
22 import android.testing.AndroidTestingRunner
23 import android.testing.TestableLooper
24 import androidx.test.filters.SmallTest
25 import com.android.internal.logging.MetricsLogger
26 import com.android.systemui.R
27 import com.android.systemui.SysuiTestCase
28 import com.android.systemui.classifier.FalsingManagerFake
29 import com.android.systemui.dagger.NightDisplayListenerModule
30 import com.android.systemui.plugins.ActivityStarter
31 import com.android.systemui.plugins.qs.QSTile
32 import com.android.systemui.plugins.statusbar.StatusBarStateController
33 import com.android.systemui.qs.QSHost
34 import com.android.systemui.qs.QsEventLogger
35 import com.android.systemui.qs.logging.QSLogger
36 import com.android.systemui.qs.tileimpl.QSTileImpl
37 import com.android.systemui.statusbar.policy.LocationController
38 import com.google.common.truth.Truth
39 import org.junit.After
40 import org.junit.Before
41 import org.junit.Test
42 import org.junit.runner.RunWith
43 import org.mockito.Mock
44 import org.mockito.Mockito.anyInt
45 import org.mockito.MockitoAnnotations
46 import org.mockito.Mockito.`when` as whenever
47 
48 @RunWith(AndroidTestingRunner::class)
49 @TestableLooper.RunWithLooper(setAsMainLooper = true)
50 @SmallTest
51 class NightDisplayTileTest : SysuiTestCase() {
52     @Mock private lateinit var mHost: QSHost
53 
54     @Mock private lateinit var mMetricsLogger: MetricsLogger
55 
56     @Mock private lateinit var mStatusBarStateController: StatusBarStateController
57 
58     @Mock private lateinit var mActivityStarter: ActivityStarter
59 
60     @Mock private lateinit var mQsLogger: QSLogger
61 
62     @Mock private lateinit var mLocationController: LocationController
63 
64     @Mock private lateinit var mColorDisplayManager: ColorDisplayManager
65 
66     @Mock private lateinit var mNightDisplayListenerBuilder: NightDisplayListenerModule.Builder
67 
68     @Mock private lateinit var mNightDisplayListener: NightDisplayListener
69 
70     @Mock private lateinit var mUiEventLogger: QsEventLogger
71 
72     private lateinit var mTestableLooper: TestableLooper
73     private lateinit var mTile: NightDisplayTile
74 
75 
76 
77     @Before
78     fun setUp() {
79         MockitoAnnotations.initMocks(this)
80         mTestableLooper = TestableLooper.get(this)
81         whenever(mHost.context).thenReturn(mContext)
82         whenever(mHost.userContext).thenReturn(mContext)
83         whenever(mNightDisplayListenerBuilder.setUser(anyInt()))
84             .thenReturn(mNightDisplayListenerBuilder)
85         whenever(mNightDisplayListenerBuilder.build()).thenReturn(mNightDisplayListener)
86 
87         mTile =
88             NightDisplayTile(
89                 mHost,
90                 mUiEventLogger,
91                 mTestableLooper.looper,
92                 Handler(mTestableLooper.looper),
93                 FalsingManagerFake(),
94                 mMetricsLogger,
95                 mStatusBarStateController,
96                 mActivityStarter,
97                 mQsLogger,
98                 mLocationController,
99                 mColorDisplayManager,
100                 mNightDisplayListenerBuilder
101             )
102     }
103 
104     @After
105     fun tearDown() {
106         mTile.destroy()
107         mTestableLooper.processAllMessages()
108     }
109 
110     @Test
111     fun testIcon_whenDisabled_showsOffState() {
112         whenever(mColorDisplayManager.isNightDisplayActivated).thenReturn(false)
113         val state = QSTile.BooleanState()
114 
115         mTile.handleUpdateState(state, /* arg= */ null)
116 
117         Truth.assertThat(state.icon)
118             .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_nightlight_icon_off))
119     }
120 
121     @Test
122     fun testIcon_whenEnabled_showsOnState() {
123         whenever(mColorDisplayManager.isNightDisplayActivated).thenReturn(true)
124         val state = QSTile.BooleanState()
125 
126         mTile.handleUpdateState(state, /* arg= */ null)
127 
128         Truth.assertThat(state.icon)
129             .isEqualTo(QSTileImpl.ResourceIcon.get(R.drawable.qs_nightlight_icon_on))
130     }
131 }
132