• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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.testing
17 
18 import android.app.WallpaperColors
19 import android.content.Context
20 import android.content.Intent
21 import android.net.Uri
22 import android.os.Bundle
23 import androidx.activity.ComponentActivity
24 import androidx.fragment.app.Fragment
25 import androidx.lifecycle.LifecycleOwner
26 import com.android.customization.model.color.DefaultWallpaperColorResources
27 import com.android.customization.model.color.WallpaperColorResources
28 import com.android.systemui.shared.customization.data.content.CustomizationProviderClient
29 import com.android.wallpaper.config.BaseFlags
30 import com.android.wallpaper.effects.EffectsController
31 import com.android.wallpaper.model.CategoryProvider
32 import com.android.wallpaper.model.InlinePreviewIntentFactory
33 import com.android.wallpaper.model.WallpaperInfo
34 import com.android.wallpaper.module.AlarmManagerWrapper
35 import com.android.wallpaper.module.BitmapCropper
36 import com.android.wallpaper.module.CurrentWallpaperInfoFactory
37 import com.android.wallpaper.module.CustomizationSections
38 import com.android.wallpaper.module.DefaultLiveWallpaperInfoFactory
39 import com.android.wallpaper.module.DrawableLayerResolver
40 import com.android.wallpaper.module.ExploreIntentChecker
41 import com.android.wallpaper.module.Injector
42 import com.android.wallpaper.module.LiveWallpaperInfoFactory
43 import com.android.wallpaper.module.NetworkStatusNotifier
44 import com.android.wallpaper.module.PackageStatusNotifier
45 import com.android.wallpaper.module.PartnerProvider
46 import com.android.wallpaper.module.SystemFeatureChecker
47 import com.android.wallpaper.module.WallpaperPersister
48 import com.android.wallpaper.module.WallpaperPreferences
49 import com.android.wallpaper.module.WallpaperRefresher
50 import com.android.wallpaper.module.WallpaperStatusChecker
51 import com.android.wallpaper.module.logging.UserEventLogger
52 import com.android.wallpaper.monitor.PerformanceMonitor
53 import com.android.wallpaper.network.Requester
54 import com.android.wallpaper.picker.ImagePreviewFragment
55 import com.android.wallpaper.picker.MyPhotosStarter
56 import com.android.wallpaper.picker.PreviewActivity
57 import com.android.wallpaper.picker.PreviewFragment
58 import com.android.wallpaper.picker.ViewOnlyPreviewActivity
59 import com.android.wallpaper.picker.category.wrapper.WallpaperCategoryWrapper
60 import com.android.wallpaper.picker.customization.data.repository.WallpaperColorsRepository
61 import com.android.wallpaper.picker.customization.data.repository.WallpaperRepository
62 import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor
63 import com.android.wallpaper.picker.customization.domain.interactor.WallpaperSnapshotRestorer
64 import com.android.wallpaper.picker.individual.IndividualPickerFragment2
65 import com.android.wallpaper.picker.undo.data.repository.UndoRepository
66 import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor
67 import com.android.wallpaper.util.DisplayUtils
68 import javax.inject.Inject
69 import javax.inject.Singleton
70 import kotlinx.coroutines.CoroutineScope
71 import kotlinx.coroutines.Dispatchers
72 
73 /** Test implementation of [Injector] */
74 @Singleton
75 open class TestInjector
76 @Inject
77 constructor(
78     private val userEventLogger: UserEventLogger,
79     private val displayUtils: DisplayUtils,
80     private val requester: Requester,
81     private val networkStatusNotifier: NetworkStatusNotifier,
82     private val partnerProvider: PartnerProvider,
83     private val wallpaperClient: FakeWallpaperClient,
84     private val injectedWallpaperInteractor: WallpaperInteractor,
85     private val prefs: WallpaperPreferences,
86     private val fakeWallpaperCategoryWrapper: WallpaperCategoryWrapper,
87     private val testStatusNotifier: TestPackageStatusNotifier,
88     private val currentWallpaperInfoFactory: FakeCurrentWallpaperInfoFactory,
89     private val wallpaperRefresher: FakeWallpaperRefresher,
90 ) : Injector {
91     private var appScope: CoroutineScope? = null
92     private var alarmManagerWrapper: AlarmManagerWrapper? = null
93     private var bitmapCropper: BitmapCropper? = null
94     private var categoryProvider: CategoryProvider? = null
95     private var customizationSections: CustomizationSections? = null
96     private var drawableLayerResolver: DrawableLayerResolver? = null
97     private var exploreIntentChecker: ExploreIntentChecker? = null
98     private var performanceMonitor: PerformanceMonitor? = null
99     private var systemFeatureChecker: SystemFeatureChecker? = null
100     private var wallpaperPersister: WallpaperPersister? = null
101     private var wallpaperStatusChecker: WallpaperStatusChecker? = null
102     private var flags: BaseFlags? = null
103     private var undoInteractor: UndoInteractor? = null
104     private var wallpaperInteractor: WallpaperInteractor? = null
105     private var wallpaperSnapshotRestorer: WallpaperSnapshotRestorer? = null
106     private var wallpaperColorsRepository: WallpaperColorsRepository? = null
107     private var previewActivityIntentFactory: InlinePreviewIntentFactory? = null
108     private var viewOnlyPreviewActivityIntentFactory: InlinePreviewIntentFactory? = null
109 
110     // Injected objects, sorted by alphabetical order of the type of object
111 
getWallpaperCategoryWrappernull112     override fun getWallpaperCategoryWrapper(): WallpaperCategoryWrapper {
113         return fakeWallpaperCategoryWrapper
114     }
115 
getApplicationCoroutineScopenull116     override fun getApplicationCoroutineScope(): CoroutineScope {
117         return appScope ?: CoroutineScope(Dispatchers.Main).also { appScope = it }
118     }
119 
getAlarmManagerWrappernull120     override fun getAlarmManagerWrapper(context: Context): AlarmManagerWrapper {
121         return alarmManagerWrapper ?: TestAlarmManagerWrapper().also { alarmManagerWrapper = it }
122     }
123 
getBitmapCroppernull124     override fun getBitmapCropper(): BitmapCropper {
125         return bitmapCropper ?: TestBitmapCropper().also { bitmapCropper = it }
126     }
127 
getCategoryProvidernull128     override fun getCategoryProvider(context: Context): CategoryProvider {
129         return categoryProvider ?: TestCategoryProvider().also { categoryProvider = it }
130     }
131 
getCurrentWallpaperInfoFactorynull132     override fun getCurrentWallpaperInfoFactory(context: Context): CurrentWallpaperInfoFactory {
133         return currentWallpaperInfoFactory
134     }
135 
getCustomizationSectionsnull136     override fun getCustomizationSections(activity: ComponentActivity): CustomizationSections {
137         return customizationSections
138             ?: TestCustomizationSections().also { customizationSections = it }
139     }
140 
getDeepLinkRedirectIntentnull141     override fun getDeepLinkRedirectIntent(context: Context, uri: Uri): Intent {
142         return Intent()
143     }
144 
getDisplayUtilsnull145     override fun getDisplayUtils(context: Context): DisplayUtils {
146         return displayUtils
147     }
148 
getDownloadableIntentActionnull149     override fun getDownloadableIntentAction(): String? {
150         return null
151     }
152 
getDrawableLayerResolvernull153     override fun getDrawableLayerResolver(): DrawableLayerResolver {
154         return drawableLayerResolver
155             ?: TestDrawableLayerResolver().also { drawableLayerResolver = it }
156     }
157 
getEffectsControllernull158     override fun getEffectsController(context: Context): EffectsController? {
159         return null
160     }
161 
getExploreIntentCheckernull162     override fun getExploreIntentChecker(context: Context): ExploreIntentChecker {
163         return exploreIntentChecker ?: TestExploreIntentChecker().also { exploreIntentChecker = it }
164     }
165 
getIndividualPickerFragmentnull166     override fun getIndividualPickerFragment(
167         context: Context,
168         collectionId: String,
169     ): IndividualPickerFragment2 {
170         return IndividualPickerFragment2.newInstance(collectionId)
171     }
172 
getLiveWallpaperInfoFactorynull173     override fun getLiveWallpaperInfoFactory(context: Context): LiveWallpaperInfoFactory {
174         return DefaultLiveWallpaperInfoFactory()
175     }
176 
getNetworkStatusNotifiernull177     override fun getNetworkStatusNotifier(context: Context): NetworkStatusNotifier {
178         return networkStatusNotifier
179     }
180 
getPackageStatusNotifiernull181     override fun getPackageStatusNotifier(context: Context): PackageStatusNotifier {
182         return testStatusNotifier
183     }
184 
getPartnerProvidernull185     override fun getPartnerProvider(context: Context): PartnerProvider {
186         return partnerProvider
187     }
188 
getPerformanceMonitornull189     override fun getPerformanceMonitor(): PerformanceMonitor? {
190         return performanceMonitor ?: TestPerformanceMonitor().also { performanceMonitor = it }
191     }
192 
getPreviewFragmentnull193     override fun getPreviewFragment(
194         context: Context,
195         wallpaperInfo: WallpaperInfo,
196         viewAsHome: Boolean,
197         isAssetIdPresent: Boolean,
198         isNewTask: Boolean,
199     ): Fragment {
200         val args = Bundle()
201         args.putParcelable(PreviewFragment.ARG_WALLPAPER, wallpaperInfo)
202         args.putBoolean(PreviewFragment.ARG_VIEW_AS_HOME, viewAsHome)
203         args.putBoolean(PreviewFragment.ARG_IS_ASSET_ID_PRESENT, isAssetIdPresent)
204         args.putBoolean(PreviewFragment.ARG_IS_NEW_TASK, isNewTask)
205         val fragment = ImagePreviewFragment()
206         fragment.arguments = args
207         return fragment
208     }
209 
getRequesternull210     override fun getRequester(context: Context): Requester {
211         return requester
212     }
213 
getSystemFeatureCheckernull214     override fun getSystemFeatureChecker(): SystemFeatureChecker {
215         return systemFeatureChecker ?: TestSystemFeatureChecker().also { systemFeatureChecker = it }
216     }
217 
getUserEventLoggernull218     override fun getUserEventLogger(): UserEventLogger {
219         return userEventLogger
220     }
221 
getWallpaperPersisternull222     override fun getWallpaperPersister(context: Context): WallpaperPersister {
223         return wallpaperPersister
224             ?: TestWallpaperPersister(context.applicationContext).also { wallpaperPersister = it }
225     }
226 
getPreferencesnull227     override fun getPreferences(context: Context): WallpaperPreferences {
228         return prefs
229     }
230 
getWallpaperRefreshernull231     override fun getWallpaperRefresher(context: Context): WallpaperRefresher {
232         return wallpaperRefresher
233     }
234 
getWallpaperStatusCheckernull235     override fun getWallpaperStatusChecker(context: Context): WallpaperStatusChecker {
236         return wallpaperStatusChecker
237             ?: TestWallpaperStatusChecker().also { wallpaperStatusChecker = it }
238     }
239 
getFlagsnull240     override fun getFlags(): BaseFlags {
241         return flags
242             ?: object : BaseFlags() {
243                     override fun isWallpaperRestorerEnabled(): Boolean {
244                         return true
245                     }
246 
247                     override fun isPageTransitionsFeatureEnabled(context: Context): Boolean {
248                         return true
249                     }
250 
251                     override fun isAIWallpaperEnabled(context: Context): Boolean {
252                         return true
253                     }
254 
255                     override fun isWallpaperCategoryRefactoringEnabled(): Boolean {
256                         return true
257                     }
258 
259                     override fun getCachedFlags(
260                         context: Context
261                     ): List<CustomizationProviderClient.Flag> {
262                         return listOf()
263                     }
264                 }
265                 .also { flags = it }
266     }
267 
getUndoInteractornull268     override fun getUndoInteractor(
269         context: Context,
270         lifecycleOwner: LifecycleOwner,
271     ): UndoInteractor {
272         return undoInteractor
273             ?: UndoInteractor(
274                 getApplicationCoroutineScope(),
275                 UndoRepository(),
276                 HashMap(),
277             ) // Empty because we don't support undoing in WallpaperPicker2..also{}
278     }
279 
getWallpaperInteractornull280     override fun getWallpaperInteractor(context: Context): WallpaperInteractor {
281         if (getFlags().isMultiCropEnabled()) {
282             return injectedWallpaperInteractor
283         }
284 
285         return wallpaperInteractor
286             ?: WallpaperInteractor(
287                     repository =
288                         WallpaperRepository(
289                             scope = getApplicationCoroutineScope(),
290                             client = getWallpaperClient(context),
291                             wallpaperPreferences = getPreferences(context = context),
292                             backgroundDispatcher = Dispatchers.IO,
293                         )
294                 )
295                 .also { wallpaperInteractor = it }
296     }
297 
getWallpaperSnapshotRestorernull298     override fun getWallpaperSnapshotRestorer(context: Context): WallpaperSnapshotRestorer {
299         return wallpaperSnapshotRestorer
300             ?: WallpaperSnapshotRestorer(
301                     scope = getApplicationCoroutineScope(),
302                     interactor = getWallpaperInteractor(context),
303                 )
304                 .also { wallpaperSnapshotRestorer = it }
305     }
306 
getWallpaperColorResourcesnull307     override fun getWallpaperColorResources(
308         wallpaperColors: WallpaperColors,
309         context: Context,
310     ): WallpaperColorResources {
311         return DefaultWallpaperColorResources(wallpaperColors)
312     }
313 
getWallpaperColorsRepositorynull314     override fun getWallpaperColorsRepository(): WallpaperColorsRepository {
315         return wallpaperColorsRepository
316             ?: WallpaperColorsRepository().also { wallpaperColorsRepository = it }
317     }
318 
getMyPhotosIntentProvidernull319     override fun getMyPhotosIntentProvider(): MyPhotosStarter.MyPhotosIntentProvider {
320         return object : MyPhotosStarter.MyPhotosIntentProvider {}
321     }
322 
isCurrentSelectedColorPresetnull323     override fun isCurrentSelectedColorPreset(context: Context): Boolean {
324         return false
325     }
326 
getPreviewActivityIntentFactorynull327     override fun getPreviewActivityIntentFactory(): InlinePreviewIntentFactory {
328         return previewActivityIntentFactory
329             ?: PreviewActivity.PreviewActivityIntentFactory().also {
330                 previewActivityIntentFactory = it
331             }
332     }
333 
getViewOnlyPreviewActivityIntentFactorynull334     override fun getViewOnlyPreviewActivityIntentFactory(): InlinePreviewIntentFactory {
335         return viewOnlyPreviewActivityIntentFactory
336             ?: ViewOnlyPreviewActivity.ViewOnlyPreviewActivityIntentFactory().also {
337                 viewOnlyPreviewActivityIntentFactory = it
338             }
339     }
340 
getWallpaperClientnull341     override fun getWallpaperClient(context: Context): FakeWallpaperClient {
342         return wallpaperClient
343     }
344 
isInstrumentationTestnull345     override fun isInstrumentationTest(): Boolean {
346         return true
347     }
348 }
349