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