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