1 /*
2  * Copyright (C) 2023 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.domain.interactor
18 
19 import com.android.customization.picker.color.data.repository.ColorPickerRepository
20 import com.android.customization.picker.color.shared.model.ColorOptionModel
21 import javax.inject.Provider
22 import kotlinx.coroutines.flow.MutableStateFlow
23 import kotlinx.coroutines.flow.asStateFlow
24 import kotlinx.coroutines.flow.onEach
25 
26 /** Single entry-point for all application state and business logic related to system color. */
27 class ColorPickerInteractor(
28     private val repository: ColorPickerRepository,
29     private val snapshotRestorer: Provider<ColorPickerSnapshotRestorer>,
30 ) {
31     val isApplyingSystemColor = repository.isApplyingSystemColor
32 
33     /**
34      * The newly selected color option for overwriting the current active option during an
35      * optimistic update, the value is set to null when update completes
36      */
37     private val _selectingColorOption = MutableStateFlow<ColorOptionModel?>(null)
38     val selectingColorOption = _selectingColorOption.asStateFlow()
39 
40     /** List of wallpaper and preset color options on the device, categorized by Color Type */
41     val colorOptions =
<lambda>null42         repository.colorOptions.onEach {
43             // Reset optimistic update value when colorOptions updates
44             _selectingColorOption.value = null
45         }
46 
selectnull47     suspend fun select(colorOptionModel: ColorOptionModel) {
48         _selectingColorOption.value = colorOptionModel
49         try {
50             // Do not reset optimistic update selection on selection success because UI color is not
51             // actually updated until the picker restarts. Wait to do so when updated color options
52             // become available
53             repository.select(colorOptionModel)
54             snapshotRestorer.get().storeSnapshot(colorOptionModel)
55         } catch (e: Exception) {
56             _selectingColorOption.value = null
57         }
58     }
59 
getCurrentColorOptionnull60     fun getCurrentColorOption(): ColorOptionModel = repository.getCurrentColorOption()
61 }
62