• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
<lambda>null2  * 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.customization.picker.color.data.repository
18 
19 import android.graphics.Color
20 import com.android.customization.model.ResourceConstants
21 import com.android.customization.model.color.ColorOption
22 import com.android.customization.model.color.ColorOptionImpl
23 import com.android.customization.model.color.ColorOptionsProvider
24 import com.android.customization.model.color.ColorUtils.toColorString
25 import com.android.customization.picker.color.shared.model.ColorType
26 import com.android.systemui.monet.Style
27 import javax.inject.Inject
28 import javax.inject.Singleton
29 import kotlinx.coroutines.flow.MutableStateFlow
30 import kotlinx.coroutines.flow.StateFlow
31 import kotlinx.coroutines.flow.asStateFlow
32 
33 @Singleton
34 class FakeColorPickerRepository2 @Inject constructor() : ColorPickerRepository2 {
35 
36     private val _selectedColorOption = MutableStateFlow<ColorOption?>(null)
37     override val selectedColorOption = _selectedColorOption.asStateFlow()
38 
39     private val _colorOptions =
40         MutableStateFlow(
41             mapOf<ColorType, List<ColorOption>>(
42                 ColorType.WALLPAPER_COLOR to listOf(),
43                 ColorType.PRESET_COLOR to listOf(),
44             )
45         )
46     override val colorOptions: StateFlow<Map<ColorType, List<ColorOption>>> =
47         _colorOptions.asStateFlow()
48 
49     init {
50         setOptions(4, 4, ColorType.WALLPAPER_COLOR, 0)
51     }
52 
53     fun setOptions(
54         wallpaperOptions: List<ColorOptionImpl>,
55         presetOptions: List<ColorOptionImpl>,
56         selectedColorOptionType: ColorType,
57         selectedColorOptionIndex: Int,
58     ) {
59         _colorOptions.value =
60             mapOf(
61                 ColorType.WALLPAPER_COLOR to
62                     buildList {
63                         for ((index, colorOption) in wallpaperOptions.withIndex()) {
64                             val isSelected =
65                                 selectedColorOptionType == ColorType.WALLPAPER_COLOR &&
66                                     selectedColorOptionIndex == index
67                             if (isSelected) {
68                                 _selectedColorOption.value = colorOption
69                             }
70                             add(colorOption)
71                         }
72                     },
73                 ColorType.PRESET_COLOR to
74                     buildList {
75                         for ((index, colorOption) in presetOptions.withIndex()) {
76                             val isSelected =
77                                 selectedColorOptionType == ColorType.PRESET_COLOR &&
78                                     selectedColorOptionIndex == index
79                             if (isSelected) {
80                                 _selectedColorOption.value = colorOption
81                             }
82                             add(colorOption)
83                         }
84                     },
85             )
86     }
87 
88     fun setOptions(
89         numWallpaperOptions: Int,
90         numPresetOptions: Int,
91         selectedColorOptionType: ColorType,
92         selectedColorOptionIndex: Int,
93     ) {
94         _colorOptions.value =
95             mapOf(
96                 ColorType.WALLPAPER_COLOR to
97                     buildList {
98                         repeat(times = numWallpaperOptions) { index ->
99                             val isSelected =
100                                 selectedColorOptionType == ColorType.WALLPAPER_COLOR &&
101                                     selectedColorOptionIndex == index
102                             val colorOption = buildWallpaperOption(index)
103                             if (isSelected) {
104                                 _selectedColorOption.value = colorOption
105                             }
106                             add(colorOption)
107                         }
108                     },
109                 ColorType.PRESET_COLOR to
110                     buildList {
111                         repeat(times = numPresetOptions) { index ->
112                             val isSelected =
113                                 selectedColorOptionType == ColorType.PRESET_COLOR &&
114                                     selectedColorOptionIndex == index
115                             val colorOption = buildPresetOption(index)
116                             if (isSelected) {
117                                 _selectedColorOption.value = colorOption
118                             }
119                             add(colorOption)
120                         }
121                     },
122             )
123     }
124 
125     private fun buildPresetOption(index: Int): ColorOptionImpl {
126         val builder = ColorOptionImpl.Builder()
127         builder.lightColors =
128             intArrayOf(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT)
129         builder.darkColors =
130             intArrayOf(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT)
131         builder.index = index
132         builder.type = ColorType.PRESET_COLOR
133         builder.source = ColorOptionsProvider.COLOR_SOURCE_PRESET
134         builder.title = "Preset"
135         builder
136             .addOverlayPackage("TEST_PACKAGE_TYPE", "preset_color")
137             .addOverlayPackage("TEST_PACKAGE_INDEX", "$index")
138         return builder.build()
139     }
140 
141     fun buildPresetOption(@Style.Type style: Int, seedColor: Int): ColorOptionImpl {
142         val builder = ColorOptionImpl.Builder()
143         builder.lightColors =
144             intArrayOf(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT)
145         builder.darkColors =
146             intArrayOf(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT)
147         builder.type = ColorType.PRESET_COLOR
148         builder.source = ColorOptionsProvider.COLOR_SOURCE_PRESET
149         builder.style = style
150         builder.title = "Preset"
151         builder.seedColor = seedColor
152         builder
153             .addOverlayPackage("TEST_PACKAGE_TYPE", "preset_color")
154             .addOverlayPackage(
155                 ResourceConstants.OVERLAY_CATEGORY_SYSTEM_PALETTE,
156                 toColorString(seedColor),
157             )
158         return builder.build()
159     }
160 
161     private fun buildWallpaperOption(index: Int): ColorOptionImpl {
162         val builder = ColorOptionImpl.Builder()
163         builder.lightColors =
164             intArrayOf(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT)
165         builder.darkColors =
166             intArrayOf(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT)
167         builder.index = index
168         builder.type = ColorType.WALLPAPER_COLOR
169         builder.source = ColorOptionsProvider.COLOR_SOURCE_HOME
170         builder.title = "Dynamic"
171         builder
172             .addOverlayPackage("TEST_PACKAGE_TYPE", "wallpaper_color")
173             .addOverlayPackage("TEST_PACKAGE_INDEX", "$index")
174         return builder.build()
175     }
176 
177     fun buildWallpaperOption(
178         source: String,
179         @Style.Type style: Int,
180         seedColor: Int,
181     ): ColorOptionImpl {
182         val builder = ColorOptionImpl.Builder()
183         builder.lightColors =
184             intArrayOf(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT)
185         builder.darkColors =
186             intArrayOf(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT)
187         builder.type = ColorType.WALLPAPER_COLOR
188         builder.source = source
189         builder.style = style
190         builder.title = "Dynamic"
191         builder.seedColor = seedColor
192         builder
193             .addOverlayPackage("TEST_PACKAGE_TYPE", "wallpaper_color")
194             .addOverlayPackage(
195                 ResourceConstants.OVERLAY_CATEGORY_SYSTEM_PALETTE,
196                 toColorString(seedColor),
197             )
198         return builder.build()
199     }
200 
201     override suspend fun select(colorOption: ColorOption) {
202         _selectedColorOption.value = colorOption
203     }
204 }
205