1 /* <lambda>null2 * Copyright (C) 2023 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 */ 17 18 package com.android.customization.picker.preview.ui.section 19 20 import android.app.Activity 21 import android.app.WallpaperManager 22 import android.content.Context 23 import androidx.lifecycle.LifecycleOwner 24 import com.android.customization.model.themedicon.domain.interactor.ThemedIconInteractor 25 import com.android.customization.picker.color.domain.interactor.ColorPickerInteractor 26 import com.android.customization.picker.preview.ui.viewmodel.PreviewWithThemeViewModel 27 import com.android.wallpaper.R 28 import com.android.wallpaper.model.WallpaperColorsViewModel 29 import com.android.wallpaper.model.WallpaperPreviewNavigator 30 import com.android.wallpaper.module.CurrentWallpaperInfoFactory 31 import com.android.wallpaper.module.CustomizationSections 32 import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor 33 import com.android.wallpaper.picker.customization.ui.section.ScreenPreviewSectionController 34 import com.android.wallpaper.picker.customization.ui.viewmodel.CustomizationPickerViewModel 35 import com.android.wallpaper.picker.customization.ui.viewmodel.ScreenPreviewViewModel 36 import com.android.wallpaper.util.DisplayUtils 37 import com.android.wallpaper.util.PreviewUtils 38 import kotlinx.coroutines.suspendCancellableCoroutine 39 40 /** 41 * A ThemePicker version of the [ScreenPreviewSectionController] that binds the preview view with 42 * the [PreviewWithThemeViewModel] to allow preview updates on theme changes. 43 */ 44 open class PreviewWithThemeSectionController( 45 activity: Activity, 46 lifecycleOwner: LifecycleOwner, 47 private val screen: CustomizationSections.Screen, 48 private val wallpaperInfoFactory: CurrentWallpaperInfoFactory, 49 private val colorViewModel: WallpaperColorsViewModel, 50 displayUtils: DisplayUtils, 51 wallpaperPreviewNavigator: WallpaperPreviewNavigator, 52 private val wallpaperInteractor: WallpaperInteractor, 53 private val themedIconInteractor: ThemedIconInteractor, 54 private val colorPickerInteractor: ColorPickerInteractor, 55 wallpaperManager: WallpaperManager, 56 isTwoPaneAndSmallWidth: Boolean, 57 customizationPickerViewModel: CustomizationPickerViewModel, 58 ) : 59 ScreenPreviewSectionController( 60 activity, 61 lifecycleOwner, 62 screen, 63 wallpaperInfoFactory, 64 colorViewModel, 65 displayUtils, 66 wallpaperPreviewNavigator, 67 wallpaperInteractor, 68 wallpaperManager, 69 isTwoPaneAndSmallWidth, 70 customizationPickerViewModel, 71 ) { 72 override fun createScreenPreviewViewModel(context: Context): ScreenPreviewViewModel { 73 return PreviewWithThemeViewModel( 74 previewUtils = 75 if (isOnLockScreen) { 76 PreviewUtils( 77 context = context, 78 authority = 79 context.getString( 80 R.string.lock_screen_preview_provider_authority, 81 ), 82 ) 83 } else { 84 PreviewUtils( 85 context = context, 86 authorityMetadataKey = 87 context.getString( 88 R.string.grid_control_metadata_name, 89 ), 90 ) 91 }, 92 wallpaperInfoProvider = { forceReload -> 93 suspendCancellableCoroutine { continuation -> 94 wallpaperInfoFactory.createCurrentWallpaperInfos( 95 { homeWallpaper, lockWallpaper, _ -> 96 val wallpaper = 97 if (isOnLockScreen) { 98 lockWallpaper ?: homeWallpaper 99 } else { 100 homeWallpaper ?: lockWallpaper 101 } 102 loadInitialColors( 103 context = context, 104 screen = screen, 105 ) 106 continuation.resume(wallpaper, null) 107 }, 108 forceReload, 109 ) 110 } 111 }, 112 onWallpaperColorChanged = { colors -> 113 if (isOnLockScreen) { 114 colorViewModel.setLockWallpaperColors(colors) 115 } else { 116 colorViewModel.setHomeWallpaperColors(colors) 117 } 118 }, 119 initialExtrasProvider = { getInitialExtras(isOnLockScreen) }, 120 wallpaperInteractor = wallpaperInteractor, 121 themedIconInteractor = themedIconInteractor, 122 colorPickerInteractor = colorPickerInteractor, 123 screen = screen, 124 ) 125 } 126 } 127