summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-03-15 23:25:28 +0000
committerAndroid Build Coastguard Worker <android-build-coastguard-worker@google.com>2023-03-15 23:25:28 +0000
commit45d07e8248fd7fb7cf25412c994cc1ceff3bfcdb (patch)
tree10d563e3e788f48d2db23fa1b5a9237b241883cf
parent7e4252f4e266f8a4431c0bd17bb76cee61f4c255 (diff)
parent13b32c2243106e7f68353dd85bad6cf9dcc74b2e (diff)
downloadWallpaperPicker2-45d07e8248fd7fb7cf25412c994cc1ceff3bfcdb.tar.gz
Snap for 9752887 from 13b32c2243106e7f68353dd85bad6cf9dcc74b2e to tm-qpr3-release
Change-Id: I9135c0da4842072dcc3e975155ca55912751bd45
-rw-r--r--src/com/android/wallpaper/module/CustomizationSections.java4
-rw-r--r--src/com/android/wallpaper/module/WallpaperPickerSections.java7
-rw-r--r--src/com/android/wallpaper/picker/CustomizationPickerFragment.java3
-rw-r--r--src/com/android/wallpaper/picker/customization/domain/interactor/WallpaperInteractor.kt17
-rw-r--r--src/com/android/wallpaper/picker/customization/ui/binder/ScreenPreviewBinder.kt19
-rw-r--r--src/com/android/wallpaper/picker/customization/ui/section/ScreenPreviewSectionController.kt19
-rw-r--r--src/com/android/wallpaper/picker/customization/ui/viewmodel/ScreenPreviewViewModel.kt16
-rw-r--r--src/com/android/wallpaper/picker/option/ui/adapter/OptionItemAdapter.kt2
-rw-r--r--src/com/android/wallpaper/picker/option/ui/viewmodel/OptionItemViewModel.kt18
-rw-r--r--tests/src/com/android/wallpaper/picker/customization/domain/interactor/WallpaperInteractorTest.kt32
-rw-r--r--tests/src/com/android/wallpaper/testing/TestCustomizationSections.kt2
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()
}