• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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