diff options
author | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-03-15 23:25:28 +0000 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2023-03-15 23:25:28 +0000 |
commit | 45d07e8248fd7fb7cf25412c994cc1ceff3bfcdb (patch) | |
tree | 10d563e3e788f48d2db23fa1b5a9237b241883cf | |
parent | 7e4252f4e266f8a4431c0bd17bb76cee61f4c255 (diff) | |
parent | 13b32c2243106e7f68353dd85bad6cf9dcc74b2e (diff) | |
download | WallpaperPicker2-45d07e8248fd7fb7cf25412c994cc1ceff3bfcdb.tar.gz |
Snap for 9752887 from 13b32c2243106e7f68353dd85bad6cf9dcc74b2e to tm-qpr3-release
Change-Id: I9135c0da4842072dcc3e975155ca55912751bd45
11 files changed, 130 insertions, 9 deletions
diff --git a/src/com/android/wallpaper/module/CustomizationSections.java b/src/com/android/wallpaper/module/CustomizationSections.java index 2f94430a..5fa62f76 100644 --- a/src/com/android/wallpaper/module/CustomizationSections.java +++ b/src/com/android/wallpaper/module/CustomizationSections.java @@ -11,6 +11,7 @@ import com.android.wallpaper.model.CustomizationSectionController.CustomizationS import com.android.wallpaper.model.PermissionRequester; import com.android.wallpaper.model.WallpaperColorsViewModel; import com.android.wallpaper.model.WallpaperPreviewNavigator; +import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor; import com.android.wallpaper.picker.customization.ui.viewmodel.WallpaperQuickSwitchViewModel; import com.android.wallpaper.util.DisplayUtils; @@ -45,7 +46,8 @@ public interface CustomizationSections { @Nullable Bundle savedInstanceState, CurrentWallpaperInfoFactory wallpaperInfoFactory, DisplayUtils displayUtils, - WallpaperQuickSwitchViewModel wallpaperQuickSwitchViewModel); + WallpaperQuickSwitchViewModel wallpaperQuickSwitchViewModel, + WallpaperInteractor wallpaperInteractor); /** * Gets a new instance of the section controller list. diff --git a/src/com/android/wallpaper/module/WallpaperPickerSections.java b/src/com/android/wallpaper/module/WallpaperPickerSections.java index 91d9520a..a77bf2e0 100644 --- a/src/com/android/wallpaper/module/WallpaperPickerSections.java +++ b/src/com/android/wallpaper/module/WallpaperPickerSections.java @@ -12,6 +12,7 @@ import com.android.wallpaper.model.PermissionRequester; import com.android.wallpaper.model.WallpaperColorsViewModel; import com.android.wallpaper.model.WallpaperPreviewNavigator; import com.android.wallpaper.model.WallpaperSectionController; +import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor; import com.android.wallpaper.picker.customization.ui.section.ScreenPreviewSectionController; import com.android.wallpaper.picker.customization.ui.section.WallpaperQuickSwitchSectionController; import com.android.wallpaper.picker.customization.ui.viewmodel.WallpaperQuickSwitchViewModel; @@ -35,7 +36,8 @@ public final class WallpaperPickerSections implements CustomizationSections { @Nullable Bundle savedInstanceState, CurrentWallpaperInfoFactory wallpaperInfoFactory, DisplayUtils displayUtils, - WallpaperQuickSwitchViewModel wallpaperQuickSwitchViewModel) { + WallpaperQuickSwitchViewModel wallpaperQuickSwitchViewModel, + WallpaperInteractor wallpaperInteractor) { List<CustomizationSectionController<?>> sectionControllers = new ArrayList<>(); sectionControllers.add( @@ -46,7 +48,8 @@ public final class WallpaperPickerSections implements CustomizationSections { wallpaperInfoFactory, wallpaperColorsViewModel, displayUtils, - sectionNavigationController)); + sectionNavigationController, + wallpaperInteractor)); sectionControllers.add( new WallpaperQuickSwitchSectionController( screen, diff --git a/src/com/android/wallpaper/picker/CustomizationPickerFragment.java b/src/com/android/wallpaper/picker/CustomizationPickerFragment.java index 1f666e0e..cb0820d0 100644 --- a/src/com/android/wallpaper/picker/CustomizationPickerFragment.java +++ b/src/com/android/wallpaper/picker/CustomizationPickerFragment.java @@ -307,7 +307,8 @@ public class CustomizationPickerFragment extends AppbarFragment implements savedInstanceState, injector.getCurrentWallpaperInfoFactory(requireContext()), injector.getDisplayUtils(getActivity()), - wallpaperQuickSwitchViewModel); + wallpaperQuickSwitchViewModel, + injector.getWallpaperInteractor(requireContext())); } } diff --git a/src/com/android/wallpaper/picker/customization/domain/interactor/WallpaperInteractor.kt b/src/com/android/wallpaper/picker/customization/domain/interactor/WallpaperInteractor.kt index 50b08c1c..d9e2ef64 100644 --- a/src/com/android/wallpaper/picker/customization/domain/interactor/WallpaperInteractor.kt +++ b/src/com/android/wallpaper/picker/customization/domain/interactor/WallpaperInteractor.kt @@ -18,6 +18,7 @@ package com.android.wallpaper.picker.customization.domain.interactor import android.graphics.Bitmap +import com.android.wallpaper.module.CustomizationSections import com.android.wallpaper.picker.customization.data.repository.WallpaperRepository import com.android.wallpaper.picker.customization.shared.model.WallpaperDestination import com.android.wallpaper.picker.customization.shared.model.WallpaperModel @@ -28,7 +29,23 @@ import kotlinx.coroutines.flow.map /** Handles business logic for wallpaper-related use-cases. */ class WallpaperInteractor( private val repository: WallpaperRepository, + /** Returns whether wallpaper picker should handle reload */ + val shouldHandleReload: () -> Boolean = { true }, ) { + /** Returns a flow that is updated whenever the wallpaper has been updated */ + fun wallpaperUpdateEvents(screen: CustomizationSections.Screen): Flow<WallpaperModel> { + return when (screen) { + CustomizationSections.Screen.LOCK_SCREEN -> + previews(WallpaperDestination.LOCK, 1).map { recentWallpapers -> + recentWallpapers[0] + } + CustomizationSections.Screen.HOME_SCREEN -> + previews(WallpaperDestination.HOME, 1).map { recentWallpapers -> + recentWallpapers[0] + } + } + } + /** Returns the ID of the currently-selected wallpaper. */ fun selectedWallpaperId( destination: WallpaperDestination, diff --git a/src/com/android/wallpaper/picker/customization/ui/binder/ScreenPreviewBinder.kt b/src/com/android/wallpaper/picker/customization/ui/binder/ScreenPreviewBinder.kt index adc97f36..01903142 100644 --- a/src/com/android/wallpaper/picker/customization/ui/binder/ScreenPreviewBinder.kt +++ b/src/com/android/wallpaper/picker/customization/ui/binder/ScreenPreviewBinder.kt @@ -37,6 +37,7 @@ import com.android.wallpaper.asset.BitmapCachingAsset import com.android.wallpaper.asset.CurrentWallpaperAssetVN import com.android.wallpaper.model.LiveWallpaperInfo import com.android.wallpaper.model.WallpaperInfo +import com.android.wallpaper.module.CustomizationSections import com.android.wallpaper.picker.WorkspaceSurfaceHolderCallback import com.android.wallpaper.picker.customization.ui.viewmodel.ScreenPreviewViewModel import com.android.wallpaper.util.ResourceUtils @@ -77,6 +78,9 @@ object ScreenPreviewBinder { lifecycleOwner: LifecycleOwner, offsetToStart: Boolean, dimWallpaper: Boolean = false, + // TODO (b/270193793): add below fields to all usages of this class & remove default values + screen: CustomizationSections.Screen = CustomizationSections.Screen.LOCK_SCREEN, + onPreviewDirty: () -> Unit = {}, ): Binding { val workspaceSurface: SurfaceView = previewView.requireViewById(R.id.workspace_surface) val wallpaperSurface: SurfaceView = previewView.requireViewById(R.id.wallpaper_surface) @@ -147,7 +151,20 @@ object ScreenPreviewBinder { launch { lifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) { - // Do nothing. + var initialWallpaperUpdate = true + viewModel.wallpaperUpdateEvents(screen)?.collect { + // Do not update screen preview on initial update,since the initial + // update results from starting or resuming the activity. + // + // In addition, update screen preview only if system color is a preset + // color. Otherwise, setting wallpaper will cause a change in wallpaper + // color and trigger a reset from system ui + if (initialWallpaperUpdate) { + initialWallpaperUpdate = false + } else if (viewModel.shouldHandleReload()) { + onPreviewDirty() + } + } } // Here when stopped. diff --git a/src/com/android/wallpaper/picker/customization/ui/section/ScreenPreviewSectionController.kt b/src/com/android/wallpaper/picker/customization/ui/section/ScreenPreviewSectionController.kt index a4d1aebc..134dc042 100644 --- a/src/com/android/wallpaper/picker/customization/ui/section/ScreenPreviewSectionController.kt +++ b/src/com/android/wallpaper/picker/customization/ui/section/ScreenPreviewSectionController.kt @@ -24,6 +24,7 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import androidx.cardview.widget.CardView +import androidx.core.view.isVisible import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.lifecycleScope import com.android.systemui.shared.clocks.shared.model.ClockPreviewConstants @@ -34,6 +35,7 @@ import com.android.wallpaper.model.WallpaperInfo import com.android.wallpaper.module.CurrentWallpaperInfoFactory import com.android.wallpaper.module.CustomizationSections import com.android.wallpaper.picker.CategorySelectorFragment +import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor import com.android.wallpaper.picker.customization.ui.binder.ScreenPreviewBinder import com.android.wallpaper.picker.customization.ui.viewmodel.ScreenPreviewViewModel import com.android.wallpaper.util.DisplayUtils @@ -54,6 +56,7 @@ open class ScreenPreviewSectionController( private val colorViewModel: WallpaperColorsViewModel, private val displayUtils: DisplayUtils, private val navigator: CustomizationSectionController.CustomizationSectionNavigationController, + private val wallpaperInteractor: WallpaperInteractor, ) : CustomizationSectionController<ScreenPreviewView> { private lateinit var lockScreenBinding: ScreenPreviewBinder.Binding @@ -129,9 +132,17 @@ open class ScreenPreviewSectionController( ) } }, + wallpaperInteractor = wallpaperInteractor, ), lifecycleOwner = lifecycleOwner, offsetToStart = displayUtils.isOnWallpaperDisplay(activity), + screen = CustomizationSections.Screen.LOCK_SCREEN, + onPreviewDirty = { + // only the visible binding should recreate the activity so it's not done twice + if (lockScreenView.isVisible) { + activity.recreate() + } + }, ) homeScreenBinding = ScreenPreviewBinder.bind( @@ -166,9 +177,17 @@ open class ScreenPreviewSectionController( onWallpaperColorChanged = { colors -> colorViewModel.setHomeWallpaperColors(colors) }, + wallpaperInteractor = wallpaperInteractor, ), lifecycleOwner = lifecycleOwner, offsetToStart = displayUtils.isOnWallpaperDisplay(activity), + screen = CustomizationSections.Screen.HOME_SCREEN, + onPreviewDirty = { + // only the visible binding should recreate the activity so it's not done twice + if (homeScreenView.isVisible) { + activity.recreate() + } + }, ) onScreenSwitched(isOnLockScreen = initialScreen == CustomizationSections.Screen.LOCK_SCREEN) diff --git a/src/com/android/wallpaper/picker/customization/ui/viewmodel/ScreenPreviewViewModel.kt b/src/com/android/wallpaper/picker/customization/ui/viewmodel/ScreenPreviewViewModel.kt index 79e18a38..1ceaa80b 100644 --- a/src/com/android/wallpaper/picker/customization/ui/viewmodel/ScreenPreviewViewModel.kt +++ b/src/com/android/wallpaper/picker/customization/ui/viewmodel/ScreenPreviewViewModel.kt @@ -20,7 +20,11 @@ package com.android.wallpaper.picker.customization.ui.viewmodel import android.app.WallpaperColors import android.os.Bundle import com.android.wallpaper.model.WallpaperInfo +import com.android.wallpaper.module.CustomizationSections +import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor +import com.android.wallpaper.picker.customization.shared.model.WallpaperModel import com.android.wallpaper.util.PreviewUtils +import kotlinx.coroutines.flow.Flow /** Models the UI state for a preview of the home screen or lock screen. */ class ScreenPreviewViewModel( @@ -28,7 +32,19 @@ class ScreenPreviewViewModel( private val initialExtrasProvider: () -> Bundle? = { null }, private val wallpaperInfoProvider: suspend () -> WallpaperInfo?, private val onWallpaperColorChanged: (WallpaperColors?) -> Unit = {}, + // TODO (b/270193793): add below field to all usages, remove default value & make non-nullable + private val wallpaperInteractor: WallpaperInteractor? = null, ) { + /** Returns whether wallpaper picker should handle reload */ + fun shouldHandleReload(): Boolean { + return wallpaperInteractor?.let { it.shouldHandleReload() } ?: true + } + + /** Returns a flow that is updated whenever the wallpaper has been updated */ + fun wallpaperUpdateEvents(screen: CustomizationSections.Screen): Flow<WallpaperModel>? { + return wallpaperInteractor?.wallpaperUpdateEvents(screen) + } + fun getInitialExtras(): Bundle? { return initialExtrasProvider.invoke() } diff --git a/src/com/android/wallpaper/picker/option/ui/adapter/OptionItemAdapter.kt b/src/com/android/wallpaper/picker/option/ui/adapter/OptionItemAdapter.kt index 1bc713bf..150dc42c 100644 --- a/src/com/android/wallpaper/picker/option/ui/adapter/OptionItemAdapter.kt +++ b/src/com/android/wallpaper/picker/option/ui/adapter/OptionItemAdapter.kt @@ -67,7 +67,7 @@ class OptionItemAdapter<T>( ): Boolean { val oldItem = oldItems[oldItemPosition] val newItem = newItems[newItemPosition] - return oldItem.key == newItem.key + return oldItem.key.value == newItem.key.value } override fun areContentsTheSame( diff --git a/src/com/android/wallpaper/picker/option/ui/viewmodel/OptionItemViewModel.kt b/src/com/android/wallpaper/picker/option/ui/viewmodel/OptionItemViewModel.kt index f712fe35..61068867 100644 --- a/src/com/android/wallpaper/picker/option/ui/viewmodel/OptionItemViewModel.kt +++ b/src/com/android/wallpaper/picker/option/ui/viewmodel/OptionItemViewModel.kt @@ -19,6 +19,7 @@ package com.android.wallpaper.picker.option.ui.viewmodel import com.android.wallpaper.picker.common.text.ui.viewmodel.Text import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow /** Models UI state for an item in a list of selectable options. */ data class OptionItemViewModel<Payload>( @@ -26,7 +27,7 @@ data class OptionItemViewModel<Payload>( * A stable key that uniquely identifies this option amongst all other options in the same list * of options. */ - val key: Flow<String>, + val key: StateFlow<String>, /** * The view model representing additional details needed for binding the icon of an option item @@ -40,7 +41,7 @@ data class OptionItemViewModel<Payload>( val text: Text, /** Whether this option is selected. */ - val isSelected: Flow<Boolean>, + val isSelected: StateFlow<Boolean>, /** Whether this option is enabled. */ val isEnabled: Boolean = true, @@ -50,4 +51,15 @@ data class OptionItemViewModel<Payload>( /** Notifies that the option has been long-clicked by the user. */ val onLongClicked: (() -> Unit)? = null, -) +) { + override fun equals(other: Any?): Boolean { + val otherItem = other as? OptionItemViewModel<*> ?: return false + // skipping comparison of onClicked because it is correlated with + // changes on isSelected + return this.payload == otherItem.payload && + this.text == otherItem.text && + this.isSelected.value == otherItem.isSelected.value && + this.isEnabled == otherItem.isEnabled && + this.onLongClicked == otherItem.onLongClicked + } +} diff --git a/tests/src/com/android/wallpaper/picker/customization/domain/interactor/WallpaperInteractorTest.kt b/tests/src/com/android/wallpaper/picker/customization/domain/interactor/WallpaperInteractorTest.kt index f369a4ce..1686c536 100644 --- a/tests/src/com/android/wallpaper/picker/customization/domain/interactor/WallpaperInteractorTest.kt +++ b/tests/src/com/android/wallpaper/picker/customization/domain/interactor/WallpaperInteractorTest.kt @@ -18,6 +18,7 @@ package com.android.wallpaper.picker.customization.domain.interactor import androidx.test.filters.SmallTest +import com.android.wallpaper.module.CustomizationSections import com.android.wallpaper.picker.customization.data.content.FakeWallpaperClient import com.android.wallpaper.picker.customization.data.repository.WallpaperRepository import com.android.wallpaper.picker.customization.shared.model.WallpaperDestination @@ -80,6 +81,37 @@ class WallpaperInteractorTest { } @Test + fun wallpaperUpdateEvents() = + testScope.runTest { + val homeWallpaperUpdateEvents = + collectLastValue( + underTest.wallpaperUpdateEvents(CustomizationSections.Screen.HOME_SCREEN) + ) + val lockWallpaperUpdateEvents = + collectLastValue( + underTest.wallpaperUpdateEvents(CustomizationSections.Screen.LOCK_SCREEN) + ) + val homeWallpaperUpdateOutput1 = homeWallpaperUpdateEvents() + val lockWallpaperUpdateOutput1 = lockWallpaperUpdateEvents() + + val homeWallpaperId1 = FakeWallpaperClient.INITIAL_RECENT_WALLPAPERS[1].wallpaperId + val lockWallpaperId1 = FakeWallpaperClient.INITIAL_RECENT_WALLPAPERS[2].wallpaperId + underTest.setWallpaper(WallpaperDestination.HOME, homeWallpaperId1) + underTest.setWallpaper(WallpaperDestination.LOCK, lockWallpaperId1) + assertThat(homeWallpaperUpdateEvents()).isNotEqualTo(homeWallpaperUpdateOutput1) + assertThat(lockWallpaperUpdateEvents()).isNotEqualTo(lockWallpaperUpdateOutput1) + val homeWallpaperUpdateOutput2 = homeWallpaperUpdateEvents() + val lockWallpaperUpdateOutput2 = lockWallpaperUpdateEvents() + + val homeWallpaperId2 = FakeWallpaperClient.INITIAL_RECENT_WALLPAPERS[2].wallpaperId + val lockWallpaperId2 = FakeWallpaperClient.INITIAL_RECENT_WALLPAPERS[2].wallpaperId + underTest.setWallpaper(WallpaperDestination.HOME, homeWallpaperId2) + underTest.setWallpaper(WallpaperDestination.LOCK, lockWallpaperId2) + assertThat(homeWallpaperUpdateEvents()).isNotEqualTo(homeWallpaperUpdateOutput2) + assertThat(lockWallpaperUpdateEvents()).isEqualTo(lockWallpaperUpdateOutput2) + } + + @Test fun setWallpaper() = testScope.runTest { val homePreviews = diff --git a/tests/src/com/android/wallpaper/testing/TestCustomizationSections.kt b/tests/src/com/android/wallpaper/testing/TestCustomizationSections.kt index 5b7dd37e..d66306ac 100644 --- a/tests/src/com/android/wallpaper/testing/TestCustomizationSections.kt +++ b/tests/src/com/android/wallpaper/testing/TestCustomizationSections.kt @@ -9,6 +9,7 @@ import com.android.wallpaper.model.WallpaperColorsViewModel import com.android.wallpaper.model.WallpaperPreviewNavigator import com.android.wallpaper.module.CurrentWallpaperInfoFactory import com.android.wallpaper.module.CustomizationSections +import com.android.wallpaper.picker.customization.domain.interactor.WallpaperInteractor import com.android.wallpaper.picker.customization.ui.viewmodel.WallpaperQuickSwitchViewModel import com.android.wallpaper.util.DisplayUtils @@ -27,6 +28,7 @@ class TestCustomizationSections : CustomizationSections { wallpaperInfoFactory: CurrentWallpaperInfoFactory?, displayUtils: DisplayUtils?, wallpaperQuickSwitchViewModel: WallpaperQuickSwitchViewModel, + wallpaperInteractor: WallpaperInteractor, ): MutableList<CustomizationSectionController<*>> { return arrayListOf() } |