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