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