• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
<lambda>null2  * 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 package com.android.wallpaper.config
17 
18 import android.app.WallpaperManager
19 import android.content.Context
20 import com.android.settings.accessibility.Flags.enableColorContrastControl
21 import com.android.systemui.shared.Flags.clockReactiveVariants
22 import com.android.systemui.shared.Flags.extendedWallpaperEffects
23 import com.android.systemui.shared.Flags.lockscreenCustomClocks
24 import com.android.systemui.shared.Flags.newCustomizationPickerUi
25 import com.android.systemui.shared.customization.data.content.CustomizationProviderClient
26 import com.android.systemui.shared.customization.data.content.CustomizationProviderClientImpl
27 import com.android.systemui.shared.customization.data.content.CustomizationProviderContract as Contract
28 import com.android.wallpaper.Flags.composeRefactorFlag
29 import com.android.wallpaper.Flags.newCreativeWallpaperCategory
30 import com.android.wallpaper.Flags.refactorWallpaperCategoryFlag
31 import com.android.wallpaper.Flags.wallpaperRestorerFlag
32 import com.android.wallpaper.module.InjectorProvider
33 import kotlinx.coroutines.Dispatchers
34 import kotlinx.coroutines.runBlocking
35 
36 abstract class BaseFlags {
37     private var customizationProviderClient: CustomizationProviderClient? = null
38     private var cachedFlags: List<CustomizationProviderClient.Flag>? = null
39 
40     open fun isStagingBackdropContentEnabled() = false
41 
42     open fun isWallpaperEffectEnabled() = false
43 
44     open fun isPackThemeEnabled() = false
45 
46     open fun isWallpaperEffectModelDownloadEnabled() = true
47 
48     open fun isInterruptModelDownloadEnabled() = false
49 
50     open fun isWallpaperRestorerEnabled() = wallpaperRestorerFlag()
51 
52     open fun isWallpaperCategoryRefactoringEnabled() = refactorWallpaperCategoryFlag()
53 
54     open fun isNewCreativeWallpaperCategoryEnabled() = newCreativeWallpaperCategory()
55 
56     open fun isColorContrastControlEnabled() = enableColorContrastControl()
57 
58     open fun isExtendedWallpaperEnabled() = extendedWallpaperEffects()
59 
60     open fun isNewPickerUi() = newCustomizationPickerUi()
61 
62     open fun isClockReactiveVariantsEnabled() = clockReactiveVariants()
63 
64     open fun isMultiCropEnabled() = WallpaperManager.isMultiCropEnabled()
65 
66     open fun isComposeRefactorEnabled() = composeRefactorFlag()
67 
68     // This is just a local flag in order to ensure right behaviour in case
69     // something goes wrong with PhotoPicker integration.
70     open fun isPhotoPickerEnabled() = false
71 
72     open fun isKeyguardQuickAffordanceEnabled(context: Context): Boolean {
73         return getCachedFlags(context)
74             .firstOrNull { flag ->
75                 flag.name ==
76                     Contract.FlagsTable.FLAG_NAME_CUSTOM_LOCK_SCREEN_QUICK_AFFORDANCES_ENABLED
77             }
78             ?.value == true
79     }
80 
81     open fun isCustomClocksEnabled(context: Context): Boolean {
82         return lockscreenCustomClocks() ||
83             getCachedFlags(context)
84                 .firstOrNull { flag ->
85                     flag.name == Contract.FlagsTable.FLAG_NAME_CUSTOM_CLOCKS_ENABLED
86                 }
87                 ?.value == true
88     }
89 
90     open fun isMonochromaticThemeEnabled(context: Context): Boolean {
91         return getCachedFlags(context)
92             .firstOrNull { flag -> flag.name == Contract.FlagsTable.FLAG_NAME_MONOCHROMATIC_THEME }
93             ?.value == true
94     }
95 
96     open fun isAIWallpaperEnabled(context: Context): Boolean {
97         return getCachedFlags(context)
98             .firstOrNull { flag ->
99                 flag.name == Contract.FlagsTable.FLAG_NAME_WALLPAPER_PICKER_UI_FOR_AIWP
100             }
101             ?.value == true
102     }
103 
104     /**
105      * This flag is to for refactoring the process of setting a wallpaper from the Wallpaper Picker,
106      * such as changes in WallpaperSetter, WallpaperPersister and WallpaperPreferences.
107      */
108     fun isRefactorSettingWallpaper(): Boolean {
109         return false
110     }
111 
112     open fun isPageTransitionsFeatureEnabled(context: Context): Boolean {
113         return getCachedFlags(context)
114             .firstOrNull { flag -> flag.name == Contract.FlagsTable.FLAG_NAME_PAGE_TRANSITIONS }
115             ?.value == true
116     }
117 
118     open fun isGridApplyButtonEnabled(context: Context): Boolean {
119         return getCachedFlags(context)
120             .firstOrNull { flag -> flag.name == Contract.FlagsTable.FLAG_NAME_GRID_APPLY_BUTTON }
121             ?.value == true
122     }
123 
124     open fun isPreviewLoadingAnimationEnabled(context: Context): Boolean {
125         return getCachedFlags(context)
126             .firstOrNull { flag ->
127                 flag.name == Contract.FlagsTable.FLAG_NAME_WALLPAPER_PICKER_PREVIEW_ANIMATION
128             }
129             ?.value == true
130     }
131 
132     private fun getCustomizationProviderClient(context: Context): CustomizationProviderClient {
133         return customizationProviderClient
134             ?: CustomizationProviderClientImpl(context.applicationContext, Dispatchers.IO).also {
135                 customizationProviderClient = it
136             }
137     }
138 
139     open fun getCachedFlags(context: Context): List<CustomizationProviderClient.Flag> {
140         return cachedFlags
141             ?: runBlocking { getCustomizationProviderClient(context).queryFlags() }
142                 .also { cachedFlags = it }
143     }
144 
145     companion object {
146         @JvmStatic
147         fun get(): BaseFlags {
148             return InjectorProvider.getInjector().getFlags()
149         }
150     }
151 }
152