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