1 /*
2  * Copyright (C) 2024 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.impl.modes.ui
18 
19 import android.app.Flags
20 import android.graphics.drawable.TestStubDrawable
21 import android.platform.test.annotations.EnableFlags
22 import androidx.test.ext.junit.runners.AndroidJUnit4
23 import androidx.test.filters.SmallTest
24 import com.android.systemui.SysuiTestCase
25 import com.android.systemui.common.shared.model.asIcon
26 import com.android.systemui.qs.tiles.impl.modes.domain.model.ModesTileModel
27 import com.android.systemui.qs.tiles.viewmodel.QSTileConfigTestBuilder
28 import com.android.systemui.qs.tiles.viewmodel.QSTileState
29 import com.android.systemui.qs.tiles.viewmodel.QSTileUIConfig
30 import com.android.systemui.res.R
31 import com.google.common.truth.Truth.assertThat
32 import org.junit.Test
33 import org.junit.runner.RunWith
34 
35 @SmallTest
36 @RunWith(AndroidJUnit4::class)
37 @EnableFlags(Flags.FLAG_MODES_UI)
38 class ModesTileMapperTest : SysuiTestCase() {
39     val config =
<lambda>null40         QSTileConfigTestBuilder.build {
41             uiConfig =
42                 QSTileUIConfig.Resource(
43                     iconRes = R.drawable.qs_dnd_icon_off,
44                     labelRes = R.string.quick_settings_modes_label,
45                 )
46         }
47 
48     val underTest =
49         ModesTileMapper(
50             context.orCreateTestableResources
<lambda>null51                 .apply {
52                     addOverride(R.drawable.qs_dnd_icon_on, TestStubDrawable())
53                     addOverride(R.drawable.qs_dnd_icon_off, TestStubDrawable())
54                 }
55                 .resources,
56             context.theme,
57         )
58 
59     @Test
inactiveStatenull60     fun inactiveState() {
61         val icon = TestStubDrawable("res123").asIcon()
62         val model = ModesTileModel(isActivated = false, activeModes = emptyList(), icon = icon)
63 
64         val state = underTest.map(config, model)
65 
66         assertThat(state.activationState).isEqualTo(QSTileState.ActivationState.INACTIVE)
67         assertThat(state.icon).isEqualTo(icon)
68         assertThat(state.secondaryLabel).isEqualTo("No active modes")
69     }
70 
71     @Test
activeState_oneModenull72     fun activeState_oneMode() {
73         val icon = TestStubDrawable("res123").asIcon()
74         val model = ModesTileModel(isActivated = true, activeModes = listOf("DND"), icon = icon)
75 
76         val state = underTest.map(config, model)
77 
78         assertThat(state.activationState).isEqualTo(QSTileState.ActivationState.ACTIVE)
79         assertThat(state.icon).isEqualTo(icon)
80         assertThat(state.secondaryLabel).isEqualTo("DND is active")
81     }
82 
83     @Test
activeState_multipleModesnull84     fun activeState_multipleModes() {
85         val icon = TestStubDrawable("res123").asIcon()
86         val model =
87             ModesTileModel(
88                 isActivated = true,
89                 activeModes = listOf("Mode 1", "Mode 2", "Mode 3"),
90                 icon = icon,
91             )
92 
93         val state = underTest.map(config, model)
94 
95         assertThat(state.activationState).isEqualTo(QSTileState.ActivationState.ACTIVE)
96         assertThat(state.icon).isEqualTo(icon)
97         assertThat(state.secondaryLabel).isEqualTo("3 modes are active")
98     }
99 
100     @Test
state_modelHasIconResId_includesIconResIdnull101     fun state_modelHasIconResId_includesIconResId() {
102         val icon = TestStubDrawable("res123").asIcon()
103         val model =
104             ModesTileModel(
105                 isActivated = false,
106                 activeModes = emptyList(),
107                 icon = icon,
108                 iconResId = 123,
109             )
110 
111         val state = underTest.map(config, model)
112 
113         assertThat(state.icon).isEqualTo(icon)
114         assertThat(state.iconRes).isEqualTo(123)
115     }
116 }
117