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