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