1 /* 2 * 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 package com.android.wallpaper 17 18 import android.content.Context 19 import androidx.test.core.app.ApplicationProvider 20 import com.android.customization.model.color.ColorCustomizationManager 21 import com.android.customization.model.theme.OverlayManagerCompat 22 import com.android.customization.module.CustomizationInjector 23 import com.android.customization.module.CustomizationPreferences 24 import com.android.customization.module.logging.TestThemesUserEventLogger 25 import com.android.customization.module.logging.ThemesUserEventLogger 26 import com.android.customization.picker.clock.data.repository.ClockPickerRepository 27 import com.android.customization.picker.clock.data.repository.ClockPickerRepositoryImpl 28 import com.android.customization.picker.clock.data.repository.ClockRegistryProvider 29 import com.android.customization.picker.color.data.repository.ColorPickerRepository 30 import com.android.customization.picker.color.data.repository.ColorPickerRepository2 31 import com.android.customization.picker.color.data.repository.ColorPickerRepositoryImpl 32 import com.android.customization.picker.color.data.repository.FakeColorPickerRepository2 33 import com.android.customization.picker.themedicon.data.repository.FakeThemedIconRepository 34 import com.android.customization.picker.themedicon.data.repository.ThemedIconRepository 35 import com.android.customization.testing.TestCustomizationInjector 36 import com.android.customization.testing.TestDefaultCustomizationPreferences 37 import com.android.systemui.shared.clocks.ClockRegistry 38 import com.android.systemui.shared.customization.data.content.CustomizationProviderClient 39 import com.android.systemui.shared.customization.data.content.CustomizationProviderClientImpl 40 import com.android.systemui.shared.settings.data.repository.SecureSettingsRepository 41 import com.android.systemui.shared.settings.data.repository.SecureSettingsRepositoryImpl 42 import com.android.wallpaper.customization.ui.binder.ThemePickerToolbarBinder 43 import com.android.wallpaper.effects.EffectsController 44 import com.android.wallpaper.effects.FakeEffectsController 45 import com.android.wallpaper.module.DefaultRecentWallpaperManager 46 import com.android.wallpaper.module.Injector 47 import com.android.wallpaper.module.PartnerProvider 48 import com.android.wallpaper.module.RecentWallpaperManager 49 import com.android.wallpaper.module.WallpaperPreferences 50 import com.android.wallpaper.module.logging.TestUserEventLogger 51 import com.android.wallpaper.module.logging.UserEventLogger 52 import com.android.wallpaper.modules.ThemePickerAppModule 53 import com.android.wallpaper.network.Requester 54 import com.android.wallpaper.picker.category.domain.interactor.CategoryInteractor 55 import com.android.wallpaper.picker.category.domain.interactor.CuratedPhotosInteractor 56 import com.android.wallpaper.picker.category.domain.interactor.OnDeviceWallpapersInteractor 57 import com.android.wallpaper.picker.category.domain.interactor.ThirdPartyCategoryInteractor 58 import com.android.wallpaper.picker.category.ui.view.providers.IndividualPickerFactory 59 import com.android.wallpaper.picker.category.ui.view.providers.implementation.DefaultIndividualPickerFactory 60 import com.android.wallpaper.picker.category.wrapper.WallpaperCategoryWrapper 61 import com.android.wallpaper.picker.common.preview.ui.binder.ThemePickerWorkspaceCallbackBinder 62 import com.android.wallpaper.picker.common.preview.ui.binder.WorkspaceCallbackBinder 63 import com.android.wallpaper.picker.customization.ui.binder.CustomizationOptionsBinder 64 import com.android.wallpaper.picker.customization.ui.binder.DefaultCustomizationOptionsBinder 65 import com.android.wallpaper.picker.customization.ui.binder.ToolbarBinder 66 import com.android.wallpaper.picker.di.modules.BackgroundDispatcher 67 import com.android.wallpaper.picker.di.modules.MainDispatcher 68 import com.android.wallpaper.picker.preview.ui.util.DefaultImageEffectDialogUtil 69 import com.android.wallpaper.picker.preview.ui.util.ImageEffectDialogUtil 70 import com.android.wallpaper.testing.FakeCategoryInteractor 71 import com.android.wallpaper.testing.FakeCuratedPhotosInteractorImpl 72 import com.android.wallpaper.testing.FakeDefaultRequester 73 import com.android.wallpaper.testing.FakeOnDeviceWallpapersInteractor 74 import com.android.wallpaper.testing.FakeThirdPartyCategoryInteractor 75 import com.android.wallpaper.testing.FakeWallpaperCategoryWrapper 76 import com.android.wallpaper.testing.TestPartnerProvider 77 import com.android.wallpaper.util.converter.DefaultWallpaperModelFactory 78 import com.android.wallpaper.util.converter.WallpaperModelFactory 79 import dagger.Binds 80 import dagger.Module 81 import dagger.Provides 82 import dagger.hilt.android.qualifiers.ApplicationContext 83 import dagger.hilt.components.SingletonComponent 84 import dagger.hilt.testing.TestInstallIn 85 import javax.inject.Singleton 86 import kotlinx.coroutines.CoroutineDispatcher 87 import kotlinx.coroutines.CoroutineScope 88 89 @Module 90 @TestInstallIn(components = [SingletonComponent::class], replaces = [ThemePickerAppModule::class]) 91 abstract class ThemePickerTestModule { 92 93 @Binds 94 @Singleton bindClockPickerRepositorynull95 abstract fun bindClockPickerRepository(impl: ClockPickerRepositoryImpl): ClockPickerRepository 96 97 @Binds 98 @Singleton 99 abstract fun bindColorPickerRepository(impl: ColorPickerRepositoryImpl): ColorPickerRepository 100 101 @Binds 102 @Singleton 103 abstract fun bindColorPickerRepository2( 104 impl: FakeColorPickerRepository2 105 ): ColorPickerRepository2 106 107 @Binds 108 @Singleton 109 abstract fun bindThemedIconRepository(impl: FakeThemedIconRepository): ThemedIconRepository 110 111 @Binds 112 @Singleton 113 abstract fun bindCustomizationInjector(impl: TestCustomizationInjector): CustomizationInjector 114 115 @Binds 116 @Singleton 117 abstract fun bindCustomizationOptionsBinder( 118 impl: DefaultCustomizationOptionsBinder 119 ): CustomizationOptionsBinder 120 121 @Binds 122 @Singleton 123 abstract fun bindCustomizationPreferences( 124 impl: TestDefaultCustomizationPreferences 125 ): CustomizationPreferences 126 127 @Binds 128 @Singleton 129 abstract fun bindEffectsController(impl: FakeEffectsController): EffectsController 130 131 @Binds 132 @Singleton 133 abstract fun bindWallpaperCategoryWrapper( 134 impl: FakeWallpaperCategoryWrapper 135 ): WallpaperCategoryWrapper 136 137 @Binds 138 @Singleton 139 abstract fun bindImageEffectDialogUtil( 140 impl: DefaultImageEffectDialogUtil 141 ): ImageEffectDialogUtil 142 143 @Binds 144 @Singleton 145 abstract fun bindIndividualPickerFactoryFragment( 146 impl: DefaultIndividualPickerFactory 147 ): IndividualPickerFactory 148 149 @Binds 150 @Singleton 151 abstract fun bindCategoryInteractor(impl: FakeCategoryInteractor): CategoryInteractor 152 153 @Binds 154 @Singleton 155 abstract fun bindCuratedPhotosInteractor( 156 impl: FakeCuratedPhotosInteractorImpl 157 ): CuratedPhotosInteractor 158 159 @Binds @Singleton abstract fun bindInjector(impl: TestCustomizationInjector): Injector 160 161 @Binds 162 @Singleton 163 abstract fun bindOnDeviceWallpapersInteractor( 164 impl: FakeOnDeviceWallpapersInteractor 165 ): OnDeviceWallpapersInteractor 166 167 @Binds 168 @Singleton 169 abstract fun providePartnerProvider(impl: TestPartnerProvider): PartnerProvider 170 171 @Binds @Singleton abstract fun bindRequester(impl: FakeDefaultRequester): Requester 172 173 @Binds 174 @Singleton 175 abstract fun bindThemesUserEventLogger(impl: TestThemesUserEventLogger): ThemesUserEventLogger 176 177 @Binds 178 @Singleton 179 abstract fun bindThirdPartyCategoryInteractor( 180 impl: FakeThirdPartyCategoryInteractor 181 ): ThirdPartyCategoryInteractor 182 183 @Binds @Singleton abstract fun bindToolbarBinder(impl: ThemePickerToolbarBinder): ToolbarBinder 184 185 @Binds @Singleton abstract fun bindUserEventLogger(impl: TestUserEventLogger): UserEventLogger 186 187 @Binds 188 @Singleton 189 abstract fun bindWallpaperModelFactory( 190 impl: DefaultWallpaperModelFactory 191 ): WallpaperModelFactory 192 193 @Binds 194 @Singleton 195 abstract fun bindWallpaperPreferences( 196 impl: TestDefaultCustomizationPreferences 197 ): WallpaperPreferences 198 199 @Binds 200 @Singleton 201 abstract fun bindWorkspaceCallbackBinder( 202 impl: ThemePickerWorkspaceCallbackBinder 203 ): WorkspaceCallbackBinder 204 205 @Binds 206 @Singleton 207 abstract fun bindRecentWallpaperManager( 208 impl: DefaultRecentWallpaperManager 209 ): RecentWallpaperManager 210 211 companion object { 212 213 @Provides 214 @Singleton 215 fun provideClockRegistry( 216 @ApplicationContext context: Context, 217 @MainDispatcher mainScope: CoroutineScope, 218 @MainDispatcher mainDispatcher: CoroutineDispatcher, 219 @BackgroundDispatcher bgDispatcher: CoroutineDispatcher, 220 ): ClockRegistry { 221 return ClockRegistryProvider( 222 context = context, 223 coroutineScope = mainScope, 224 mainDispatcher = mainDispatcher, 225 backgroundDispatcher = bgDispatcher, 226 ) 227 .get() 228 } 229 230 @Provides 231 @Singleton 232 fun provideColorCustomizationManager(): ColorCustomizationManager { 233 return ColorCustomizationManager.getInstance( 234 ApplicationProvider.getApplicationContext(), 235 OverlayManagerCompat(ApplicationProvider.getApplicationContext()), 236 ) 237 } 238 239 @Provides 240 @Singleton 241 fun provideCustomizationProviderClient( 242 @ApplicationContext context: Context, 243 @BackgroundDispatcher bgDispatcher: CoroutineDispatcher, 244 ): CustomizationProviderClient { 245 return CustomizationProviderClientImpl(context, bgDispatcher) 246 } 247 248 @Provides 249 @Singleton 250 fun provideSecureSettingsRepository( 251 @ApplicationContext context: Context, 252 @BackgroundDispatcher bgDispatcher: CoroutineDispatcher, 253 ): SecureSettingsRepository { 254 return SecureSettingsRepositoryImpl(context.contentResolver, bgDispatcher) 255 } 256 } 257 } 258