• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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