• 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.content.Context
19 import android.content.Intent
20 import android.net.Uri
21 import android.os.Bundle
22 import androidx.activity.ComponentActivity
23 import androidx.fragment.app.Fragment
24 import com.android.wallpaper.compat.WallpaperManagerCompat
25 import com.android.wallpaper.config.BaseFlags
26 import com.android.wallpaper.effects.EffectsController
27 import com.android.wallpaper.model.CategoryProvider
28 import com.android.wallpaper.model.LiveWallpaperInfo
29 import com.android.wallpaper.model.WallpaperColorsViewModel
30 import com.android.wallpaper.model.WallpaperInfo
31 import com.android.wallpaper.monitor.PerformanceMonitor
32 import com.android.wallpaper.network.Requester
33 import com.android.wallpaper.network.WallpaperRequester
34 import com.android.wallpaper.picker.CustomizationPickerActivity
35 import com.android.wallpaper.picker.ImagePreviewFragment
36 import com.android.wallpaper.picker.LivePreviewFragment
37 import com.android.wallpaper.picker.PreviewFragment
38 import com.android.wallpaper.picker.customization.data.content.WallpaperClientImpl
39 import com.android.wallpaper.picker.customization.data.repository.WallpaperRepository
40 import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor
41 import com.android.wallpaper.picker.customization.domain.interactor.WallpaperSnapshotRestorer
42 import com.android.wallpaper.picker.individual.IndividualPickerFragment
43 import com.android.wallpaper.picker.undo.data.repository.UndoRepository
44 import com.android.wallpaper.picker.undo.domain.interactor.UndoInteractor
45 import com.android.wallpaper.settings.data.repository.SecureSettingsRepository
46 import com.android.wallpaper.settings.data.repository.SecureSettingsRepositoryImpl
47 import com.android.wallpaper.util.DisplayUtils
48 import kotlinx.coroutines.Dispatchers
49 import kotlinx.coroutines.GlobalScope
50 
51 open class WallpaperPicker2Injector() : Injector {
52     private var alarmManagerWrapper: AlarmManagerWrapper? = null
53     private var bitmapCropper: BitmapCropper? = null
54     private var categoryProvider: CategoryProvider? = null
55     private var currentWallpaperFactory: CurrentWallpaperInfoFactory? = null
56     private var customizationSections: CustomizationSections? = null
57     private var displayUtils: DisplayUtils? = null
58     private var drawableLayerResolver: DrawableLayerResolver? = null
59     private var exploreIntentChecker: ExploreIntentChecker? = null
60     private var liveWallpaperInfoFactory: LiveWallpaperInfoFactory? = null
61     private var networkStatusNotifier: NetworkStatusNotifier? = null
62     private var packageStatusNotifier: PackageStatusNotifier? = null
63     private var partnerProvider: PartnerProvider? = null
64     private var performanceMonitor: PerformanceMonitor? = null
65     private var requester: Requester? = null
66     private var systemFeatureChecker: SystemFeatureChecker? = null
67     private var userEventLogger: UserEventLogger? = null
68     private var wallpaperManagerCompat: WallpaperManagerCompat? = null
69     private var wallpaperPersister: WallpaperPersister? = null
70     private var prefs: WallpaperPreferences? = null
71     private var wallpaperPreviewFragmentManager: WallpaperPreviewFragmentManager? = null
72     private var wallpaperRefresher: WallpaperRefresher? = null
73     private var wallpaperRotationRefresher: WallpaperRotationRefresher? = null
74     private var wallpaperStatusChecker: WallpaperStatusChecker? = null
75     private var flags: BaseFlags? = null
76     private var undoInteractor: UndoInteractor? = null
77     private var wallpaperInteractor: WallpaperInteractor? = null
78     private var wallpaperSnapshotRestorer: WallpaperSnapshotRestorer? = null
79     private var secureSettingsRepository: SecureSettingsRepository? = null
80     private var wallpaperColorsViewModel: WallpaperColorsViewModel? = null
81 
82     @Synchronized
83     override fun getAlarmManagerWrapper(context: Context): AlarmManagerWrapper {
84         return alarmManagerWrapper
85             ?: DefaultAlarmManagerWrapper(context.applicationContext).also {
86                 alarmManagerWrapper = it
87             }
88     }
89 
90     @Synchronized
91     override fun getBitmapCropper(): BitmapCropper {
92         return bitmapCropper ?: DefaultBitmapCropper().also { bitmapCropper = it }
93     }
94 
95     override fun getCategoryProvider(context: Context): CategoryProvider {
96         return categoryProvider
97             ?: DefaultCategoryProvider(context.applicationContext).also { categoryProvider = it }
98     }
99 
100     @Synchronized
101     override fun getCurrentWallpaperInfoFactory(context: Context): CurrentWallpaperInfoFactory {
102         return currentWallpaperFactory
103             ?: DefaultCurrentWallpaperInfoFactory(context.applicationContext).also {
104                 currentWallpaperFactory = it
105             }
106     }
107 
108     override fun getCustomizationSections(activity: ComponentActivity): CustomizationSections {
109         return customizationSections
110             ?: WallpaperPickerSections().also { customizationSections = it }
111     }
112 
113     override fun getDeepLinkRedirectIntent(context: Context, uri: Uri): Intent {
114         val intent = Intent()
115         intent.setClass(context, CustomizationPickerActivity::class.java)
116         intent.data = uri
117         intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
118         return intent
119     }
120 
121     override fun getDisplayUtils(context: Context): DisplayUtils {
122         return displayUtils ?: DisplayUtils(context.applicationContext).also { displayUtils = it }
123     }
124 
125     override fun getDownloadableIntentAction(): String? {
126         return null
127     }
128 
129     override fun getDrawableLayerResolver(): DrawableLayerResolver {
130         return drawableLayerResolver
131             ?: DefaultDrawableLayerResolver().also { drawableLayerResolver = it }
132     }
133 
134     override fun getEffectsController(
135         context: Context,
136     ): EffectsController? {
137         return null
138     }
139 
140     @Synchronized
141     override fun getExploreIntentChecker(context: Context): ExploreIntentChecker {
142         return exploreIntentChecker
143             ?: DefaultExploreIntentChecker(context.applicationContext).also {
144                 exploreIntentChecker = it
145             }
146     }
147 
148     override fun getIndividualPickerFragment(context: Context, collectionId: String): Fragment {
149         return IndividualPickerFragment.newInstance(collectionId)
150     }
151 
152     override fun getLiveWallpaperInfoFactory(context: Context): LiveWallpaperInfoFactory {
153         return liveWallpaperInfoFactory
154             ?: DefaultLiveWallpaperInfoFactory().also { liveWallpaperInfoFactory = it }
155     }
156 
157     @Synchronized
158     override fun getNetworkStatusNotifier(context: Context): NetworkStatusNotifier {
159         return networkStatusNotifier
160             ?: DefaultNetworkStatusNotifier(context.applicationContext).also {
161                 networkStatusNotifier = it
162             }
163     }
164 
165     @Synchronized
166     override fun getPackageStatusNotifier(context: Context): PackageStatusNotifier {
167         return packageStatusNotifier
168             ?: DefaultPackageStatusNotifier(context.applicationContext).also {
169                 packageStatusNotifier = it
170             }
171     }
172 
173     @Synchronized
174     override fun getPartnerProvider(context: Context): PartnerProvider {
175         return partnerProvider
176             ?: DefaultPartnerProvider(context.applicationContext).also { partnerProvider = it }
177     }
178 
179     @Synchronized
180     override fun getPerformanceMonitor(): PerformanceMonitor? {
181 
182         return performanceMonitor
183             ?: PerformanceMonitor {
184                     /** No Op */
185                 }
186                 .also { performanceMonitor = it }
187     }
188 
189     override fun getPreviewFragment(
190         context: Context,
191         wallpaperInfo: WallpaperInfo,
192         mode: Int,
193         viewAsHome: Boolean,
194         viewFullScreen: Boolean,
195         testingModeEnabled: Boolean
196     ): Fragment {
197         val args = Bundle()
198         args.putParcelable(PreviewFragment.ARG_WALLPAPER, wallpaperInfo)
199         args.putInt(PreviewFragment.ARG_PREVIEW_MODE, mode)
200         args.putBoolean(PreviewFragment.ARG_VIEW_AS_HOME, viewAsHome)
201         args.putBoolean(PreviewFragment.ARG_FULL_SCREEN, viewFullScreen)
202         args.putBoolean(PreviewFragment.ARG_TESTING_MODE_ENABLED, testingModeEnabled)
203         val fragment =
204             if (wallpaperInfo is LiveWallpaperInfo) LivePreviewFragment()
205             else ImagePreviewFragment()
206         fragment.arguments = args
207         return fragment
208     }
209 
210     @Synchronized
211     override fun getRequester(context: Context): Requester {
212         return requester ?: WallpaperRequester(context.applicationContext).also { requester = it }
213     }
214 
215     @Synchronized
216     override fun getSystemFeatureChecker(): SystemFeatureChecker {
217         return systemFeatureChecker
218             ?: DefaultSystemFeatureChecker().also { systemFeatureChecker = it }
219     }
220 
221     override fun getUserEventLogger(context: Context): UserEventLogger {
222         return userEventLogger ?: NoOpUserEventLogger().also { userEventLogger = it }
223     }
224 
225     @Synchronized
226     override fun getWallpaperManagerCompat(context: Context): WallpaperManagerCompat {
227         return wallpaperManagerCompat
228             ?: WallpaperManagerCompat.getInstance(context).also { wallpaperManagerCompat = it }
229     }
230 
231     @Synchronized
232     override fun getWallpaperPersister(context: Context): WallpaperPersister {
233         return wallpaperPersister
234             ?: DefaultWallpaperPersister(context.applicationContext).also {
235                 wallpaperPersister = it
236             }
237     }
238 
239     @Synchronized
240     override fun getPreferences(context: Context): WallpaperPreferences {
241         return prefs ?: DefaultWallpaperPreferences(context.applicationContext).also { prefs = it }
242     }
243 
244     @Synchronized
245     override fun getWallpaperPreviewFragmentManager(): WallpaperPreviewFragmentManager {
246         return wallpaperPreviewFragmentManager
247             ?: DefaultWallpaperPreviewFragmentManager().also {
248                 wallpaperPreviewFragmentManager = it
249             }
250     }
251 
252     @Synchronized
253     override fun getWallpaperRefresher(context: Context): WallpaperRefresher {
254         return wallpaperRefresher
255             ?: DefaultWallpaperRefresher(context.applicationContext).also {
256                 wallpaperRefresher = it
257             }
258     }
259 
260     @Synchronized
261     override fun getWallpaperRotationRefresher(): WallpaperRotationRefresher {
262         return wallpaperRotationRefresher
263             ?: WallpaperRotationRefresher { _, listener ->
264                     // Not implemented
265                     listener.onError()
266                 }
267                 .also { wallpaperRotationRefresher = it }
268     }
269 
270     override fun getWallpaperStatusChecker(): WallpaperStatusChecker {
271         return wallpaperStatusChecker
272             ?: DefaultWallpaperStatusChecker().also { wallpaperStatusChecker = it }
273     }
274 
275     override fun getFlags(): BaseFlags {
276         return flags ?: object : BaseFlags() {}.also { flags = it }
277     }
278 
279     override fun getUndoInteractor(context: Context): UndoInteractor {
280         return undoInteractor
281             ?: UndoInteractor(GlobalScope, UndoRepository(), getSnapshotRestorers(context)).also {
282                 undoInteractor = it
283             }
284     }
285 
286     override fun getWallpaperInteractor(context: Context): WallpaperInteractor {
287         return wallpaperInteractor
288             ?: WallpaperInteractor(
289                     repository =
290                         WallpaperRepository(
291                             scope = GlobalScope,
292                             client = WallpaperClientImpl(context = context),
293                             backgroundDispatcher = Dispatchers.IO,
294                         ),
295                 )
296                 .also { wallpaperInteractor = it }
297     }
298 
299     override fun getWallpaperSnapshotRestorer(context: Context): WallpaperSnapshotRestorer {
300         return wallpaperSnapshotRestorer
301             ?: WallpaperSnapshotRestorer(
302                     scope = GlobalScope,
303                     interactor = getWallpaperInteractor(context),
304                 )
305                 .also { wallpaperSnapshotRestorer = it }
306     }
307 
308     protected fun getSecureSettingsRepository(context: Context): SecureSettingsRepository {
309         return secureSettingsRepository
310             ?: SecureSettingsRepositoryImpl(
311                     contentResolver = context.contentResolver,
312                     backgroundDispatcher = Dispatchers.IO,
313                 )
314                 .also { secureSettingsRepository = it }
315     }
316 
317     override fun getWallpaperColorsViewModel(): WallpaperColorsViewModel {
318         return wallpaperColorsViewModel
319             ?: WallpaperColorsViewModel().also { wallpaperColorsViewModel = it }
320     }
321 
322     companion object {
323         /**
324          * When this injector is overridden, this is the minimal value that should be used by
325          * restorers returns in [getSnapshotRestorers].
326          */
327         @JvmStatic protected val MIN_SNAPSHOT_RESTORER_KEY = 0
328     }
329 }
330