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