• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
<lambda>null2  * Copyright (C) 2017 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.module
17 
18 import android.app.WallpaperManager
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.wallpaper.config.BaseFlags
27 import com.android.wallpaper.dispatchers.BackgroundDispatcher
28 import com.android.wallpaper.dispatchers.MainDispatcher
29 import com.android.wallpaper.effects.EffectsController
30 import com.android.wallpaper.model.CategoryProvider
31 import com.android.wallpaper.model.InlinePreviewIntentFactory
32 import com.android.wallpaper.model.LiveWallpaperInfo
33 import com.android.wallpaper.model.WallpaperColorsViewModel
34 import com.android.wallpaper.model.WallpaperInfo
35 import com.android.wallpaper.monitor.PerformanceMonitor
36 import com.android.wallpaper.network.Requester
37 import com.android.wallpaper.network.WallpaperRequester
38 import com.android.wallpaper.picker.CustomizationPickerActivity
39 import com.android.wallpaper.picker.ImagePreviewFragment
40 import com.android.wallpaper.picker.LivePreviewFragment
41 import com.android.wallpaper.picker.MyPhotosStarter
42 import com.android.wallpaper.picker.PreviewActivity
43 import com.android.wallpaper.picker.PreviewFragment
44 import com.android.wallpaper.picker.ViewOnlyPreviewActivity
45 import com.android.wallpaper.picker.customization.data.content.WallpaperClientImpl
46 import com.android.wallpaper.picker.customization.data.repository.WallpaperRepository
47 import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor
48 import com.android.wallpaper.picker.customization.domain.interactor.WallpaperSnapshotRestorer
49 import com.android.wallpaper.picker.individual.IndividualPickerFragment
50 import com.android.wallpaper.picker.undo.data.repository.UndoRepository
51 import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor
52 import com.android.wallpaper.settings.data.repository.SecureSettingsRepository
53 import com.android.wallpaper.settings.data.repository.SecureSettingsRepositoryImpl
54 import com.android.wallpaper.util.DisplayUtils
55 import javax.inject.Inject
56 import javax.inject.Singleton
57 import kotlinx.coroutines.CoroutineDispatcher
58 import kotlinx.coroutines.CoroutineScope
59 
60 @Singleton
61 open class WallpaperPicker2Injector
62 @Inject
63 internal constructor(
64     @MainDispatcher private val mainScope: CoroutineScope,
65     @BackgroundDispatcher private val bgDispatcher: CoroutineDispatcher,
66 ) : Injector {
67     private var alarmManagerWrapper: AlarmManagerWrapper? = null
68     private var bitmapCropper: BitmapCropper? = null
69     private var categoryProvider: CategoryProvider? = null
70     private var currentWallpaperFactory: CurrentWallpaperInfoFactory? = null
71     private var customizationSections: CustomizationSections? = null
72     private var displayUtils: DisplayUtils? = null
73     private var drawableLayerResolver: DrawableLayerResolver? = null
74     private var exploreIntentChecker: ExploreIntentChecker? = null
75     private var liveWallpaperInfoFactory: LiveWallpaperInfoFactory? = null
76     private var networkStatusNotifier: NetworkStatusNotifier? = null
77     private var packageStatusNotifier: PackageStatusNotifier? = null
78     private var partnerProvider: PartnerProvider? = null
79     private var performanceMonitor: PerformanceMonitor? = null
80     private var requester: Requester? = null
81     private var systemFeatureChecker: SystemFeatureChecker? = null
82     private var userEventLogger: UserEventLogger? = null
83     private var wallpaperPersister: WallpaperPersister? = null
84     @Inject lateinit var prefs: WallpaperPreferences
85     private var wallpaperRefresher: WallpaperRefresher? = null
86     private var wallpaperRotationRefresher: WallpaperRotationRefresher? = null
87     private var wallpaperStatusChecker: WallpaperStatusChecker? = null
88     private var flags: BaseFlags? = null
89     private var undoInteractor: UndoInteractor? = null
90     private var wallpaperInteractor: WallpaperInteractor? = null
91     private var wallpaperSnapshotRestorer: WallpaperSnapshotRestorer? = null
92     private var secureSettingsRepository: SecureSettingsRepository? = null
93     private var wallpaperColorsViewModel: WallpaperColorsViewModel? = null
94     private var previewActivityIntentFactory: InlinePreviewIntentFactory? = null
95     private var viewOnlyPreviewActivityIntentFactory: InlinePreviewIntentFactory? = null
96 
97     override fun getApplicationCoroutineScope(): CoroutineScope {
98         return mainScope
99     }
100 
101     @Synchronized
102     override fun getAlarmManagerWrapper(context: Context): AlarmManagerWrapper {
103         return alarmManagerWrapper
104             ?: DefaultAlarmManagerWrapper(context.applicationContext).also {
105                 alarmManagerWrapper = it
106             }
107     }
108 
109     @Synchronized
110     override fun getBitmapCropper(): BitmapCropper {
111         return bitmapCropper ?: DefaultBitmapCropper().also { bitmapCropper = it }
112     }
113 
114     override fun getCategoryProvider(context: Context): CategoryProvider {
115         return categoryProvider
116             ?: DefaultCategoryProvider(context.applicationContext).also { categoryProvider = it }
117     }
118 
119     @Synchronized
120     override fun getCurrentWallpaperInfoFactory(context: Context): CurrentWallpaperInfoFactory {
121         return currentWallpaperFactory
122             ?: DefaultCurrentWallpaperInfoFactory(
123                     getWallpaperRefresher(context.applicationContext),
124                     getLiveWallpaperInfoFactory(context.applicationContext),
125                 )
126                 .also { currentWallpaperFactory = it }
127     }
128 
129     override fun getCustomizationSections(activity: ComponentActivity): CustomizationSections {
130         return customizationSections
131             ?: WallpaperPickerSections().also { customizationSections = it }
132     }
133 
134     override fun getDeepLinkRedirectIntent(context: Context, uri: Uri): Intent {
135         val intent = Intent()
136         intent.setClass(context, CustomizationPickerActivity::class.java)
137         intent.data = uri
138         intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
139         return intent
140     }
141 
142     override fun getDisplayUtils(context: Context): DisplayUtils {
143         return displayUtils ?: DisplayUtils(context.applicationContext).also { displayUtils = it }
144     }
145 
146     override fun getDownloadableIntentAction(): String? {
147         return null
148     }
149 
150     override fun getDrawableLayerResolver(): DrawableLayerResolver {
151         return drawableLayerResolver
152             ?: DefaultDrawableLayerResolver().also { drawableLayerResolver = it }
153     }
154 
155     override fun getEffectsController(
156         context: Context,
157     ): EffectsController? {
158         return null
159     }
160 
161     @Synchronized
162     override fun getExploreIntentChecker(context: Context): ExploreIntentChecker {
163         return exploreIntentChecker
164             ?: DefaultExploreIntentChecker(context.applicationContext).also {
165                 exploreIntentChecker = it
166             }
167     }
168 
169     override fun getIndividualPickerFragment(context: Context, collectionId: String): Fragment {
170         return IndividualPickerFragment.newInstance(collectionId)
171     }
172 
173     override fun getLiveWallpaperInfoFactory(context: Context): LiveWallpaperInfoFactory {
174         return liveWallpaperInfoFactory
175             ?: DefaultLiveWallpaperInfoFactory().also { liveWallpaperInfoFactory = it }
176     }
177 
178     @Synchronized
179     override fun getNetworkStatusNotifier(context: Context): NetworkStatusNotifier {
180         return networkStatusNotifier
181             ?: DefaultNetworkStatusNotifier(context.applicationContext).also {
182                 networkStatusNotifier = it
183             }
184     }
185 
186     @Synchronized
187     override fun getPackageStatusNotifier(context: Context): PackageStatusNotifier {
188         return packageStatusNotifier
189             ?: DefaultPackageStatusNotifier(context.applicationContext).also {
190                 packageStatusNotifier = it
191             }
192     }
193 
194     @Synchronized
195     override fun getPartnerProvider(context: Context): PartnerProvider {
196         return partnerProvider
197             ?: DefaultPartnerProvider(context.applicationContext).also { partnerProvider = it }
198     }
199 
200     @Synchronized
201     override fun getPerformanceMonitor(): PerformanceMonitor? {
202 
203         return performanceMonitor
204             ?: PerformanceMonitor {
205                     /** No Op */
206                 }
207                 .also { performanceMonitor = it }
208     }
209 
210     override fun getPreviewFragment(
211         context: Context,
212         wallpaperInfo: WallpaperInfo,
213         viewAsHome: Boolean,
214         isAssetIdPresent: Boolean,
215         isNewTask: Boolean,
216     ): Fragment {
217         val isLiveWallpaper = wallpaperInfo is LiveWallpaperInfo
218         return (if (isLiveWallpaper) LivePreviewFragment() else ImagePreviewFragment()).apply {
219             arguments =
220                 Bundle().apply {
221                     putParcelable(PreviewFragment.ARG_WALLPAPER, wallpaperInfo)
222                     putBoolean(PreviewFragment.ARG_VIEW_AS_HOME, viewAsHome)
223                     putBoolean(PreviewFragment.ARG_IS_ASSET_ID_PRESENT, isAssetIdPresent)
224                     putBoolean(PreviewFragment.ARG_IS_NEW_TASK, isNewTask)
225                 }
226         }
227     }
228 
229     @Synchronized
230     override fun getRequester(context: Context): Requester {
231         return requester ?: WallpaperRequester(context.applicationContext).also { requester = it }
232     }
233 
234     @Synchronized
235     override fun getSystemFeatureChecker(): SystemFeatureChecker {
236         return systemFeatureChecker
237             ?: DefaultSystemFeatureChecker().also { systemFeatureChecker = it }
238     }
239 
240     override fun getUserEventLogger(context: Context): UserEventLogger {
241         return userEventLogger ?: NoOpUserEventLogger().also { userEventLogger = it }
242     }
243 
244     @Synchronized
245     override fun getWallpaperPersister(context: Context): WallpaperPersister {
246         return wallpaperPersister
247             ?: DefaultWallpaperPersister(
248                     context.applicationContext,
249                     WallpaperManager.getInstance(context),
250                     getPreferences(context),
251                     WallpaperChangedNotifier.getInstance(),
252                     getDisplayUtils(context),
253                     getBitmapCropper(),
254                     getWallpaperStatusChecker(context),
255                     getFlags().isRefactorSettingWallpaper(),
256                 )
257                 .also { wallpaperPersister = it }
258     }
259 
260     @Synchronized
261     override fun getPreferences(context: Context): WallpaperPreferences {
262         return prefs
263     }
264 
265     @Synchronized
266     override fun getWallpaperRefresher(context: Context): WallpaperRefresher {
267         return wallpaperRefresher
268             ?: DefaultWallpaperRefresher(context.applicationContext).also {
269                 wallpaperRefresher = it
270             }
271     }
272 
273     @Synchronized
274     override fun getWallpaperRotationRefresher(): WallpaperRotationRefresher {
275         return wallpaperRotationRefresher
276             ?: WallpaperRotationRefresher { _, listener ->
277                     // Not implemented
278                     listener.onError()
279                 }
280                 .also { wallpaperRotationRefresher = it }
281     }
282 
283     override fun getWallpaperStatusChecker(context: Context): WallpaperStatusChecker {
284         return wallpaperStatusChecker
285             ?: DefaultWallpaperStatusChecker(
286                     wallpaperManager = WallpaperManager.getInstance(context.applicationContext),
287                 )
288                 .also { wallpaperStatusChecker = it }
289     }
290 
291     override fun getFlags(): BaseFlags {
292         return flags ?: object : BaseFlags() {}.also { flags = it }
293     }
294 
295     override fun getUndoInteractor(
296         context: Context,
297         lifecycleOwner: LifecycleOwner
298     ): UndoInteractor {
299         return undoInteractor
300             ?: UndoInteractor(
301                     getApplicationCoroutineScope(),
302                     UndoRepository(),
303                     getSnapshotRestorers(context),
304                 )
305                 .also { undoInteractor = it }
306     }
307 
308     override fun getWallpaperInteractor(context: Context): WallpaperInteractor {
309         val appContext = context.applicationContext
310         return wallpaperInteractor
311             ?: WallpaperInteractor(
312                     repository =
313                         WallpaperRepository(
314                             scope = getApplicationCoroutineScope(),
315                             client =
316                                 WallpaperClientImpl(
317                                     context = appContext,
318                                     infoFactory = getCurrentWallpaperInfoFactory(appContext),
319                                     wallpaperManager = WallpaperManager.getInstance(appContext)
320                                 ),
321                             wallpaperPreferences = getPreferences(context = appContext),
322                             backgroundDispatcher = bgDispatcher,
323                         ),
324                 )
325                 .also { wallpaperInteractor = it }
326     }
327 
328     override fun getWallpaperSnapshotRestorer(context: Context): WallpaperSnapshotRestorer {
329         return wallpaperSnapshotRestorer
330             ?: WallpaperSnapshotRestorer(
331                     scope = getApplicationCoroutineScope(),
332                     interactor = getWallpaperInteractor(context),
333                 )
334                 .also { wallpaperSnapshotRestorer = it }
335     }
336 
337     protected fun getSecureSettingsRepository(context: Context): SecureSettingsRepository {
338         return secureSettingsRepository
339             ?: SecureSettingsRepositoryImpl(
340                     contentResolver = context.applicationContext.contentResolver,
341                     backgroundDispatcher = bgDispatcher,
342                 )
343                 .also { secureSettingsRepository = it }
344     }
345 
346     override fun getWallpaperColorsViewModel(): WallpaperColorsViewModel {
347         return wallpaperColorsViewModel
348             ?: WallpaperColorsViewModel().also { wallpaperColorsViewModel = it }
349     }
350 
351     override fun getMyPhotosIntentProvider(): MyPhotosStarter.MyPhotosIntentProvider {
352         return object : MyPhotosStarter.MyPhotosIntentProvider {}
353     }
354 
355     override fun isCurrentSelectedColorPreset(context: Context): Boolean {
356         return false
357     }
358 
359     override fun getPreviewActivityIntentFactory(): InlinePreviewIntentFactory {
360         return previewActivityIntentFactory
361             ?: PreviewActivity.PreviewActivityIntentFactory().also {
362                 previewActivityIntentFactory = it
363             }
364     }
365 
366     override fun getViewOnlyPreviewActivityIntentFactory(): InlinePreviewIntentFactory {
367         return viewOnlyPreviewActivityIntentFactory
368             ?: ViewOnlyPreviewActivity.ViewOnlyPreviewActivityIntentFactory().also {
369                 viewOnlyPreviewActivityIntentFactory = it
370             }
371     }
372 
373     companion object {
374         /**
375          * When this injector is overridden, this is the minimal value that should be used by
376          * restorers returns in [getSnapshotRestorers].
377          */
378         @JvmStatic protected val MIN_SNAPSHOT_RESTORER_KEY = 0
379     }
380 }
381