diff --git a/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutCategoryModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutCategoryModel.kt index d0ab70af2e29..95a300198517 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutCategoryModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutCategoryModel.kt @@ -11,7 +11,8 @@ import org.wordpress.android.fluxc.network.rest.wpcom.theme.StarterDesignCategor class LayoutCategoryModel( private val starterDesignCategory: StarterDesignCategory? = null, private val blockLayoutCategory: GutenbergLayoutCategory? = null, - val isRecommended: Boolean = false + val isRecommended: Boolean = false, + val randomizeOrder: Boolean = false ) : Parcelable { val slug: String get() = starterDesignCategory?.slug ?: blockLayoutCategory?.slug ?: "" @@ -24,8 +25,14 @@ class LayoutCategoryModel( } @JvmName("starterDesignToLayoutCategories") -fun List.toLayoutCategories(recommended: Boolean = false) = - map { LayoutCategoryModel(starterDesignCategory = it, isRecommended = recommended) } +fun List.toLayoutCategories(recommended: Boolean = false, randomizeOrder: Boolean = false) = + map { + LayoutCategoryModel( + starterDesignCategory = it, + isRecommended = recommended, + randomizeOrder = randomizeOrder + ) + } @JvmName("gutenbergLayoutToLayoutCategories") fun List.toLayoutCategories() = map { LayoutCategoryModel(blockLayoutCategory = it) } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutPickerViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutPickerViewModel.kt index ef43a92b8f6e..a9e9b08e0f8f 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutPickerViewModel.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/layoutpicker/LayoutPickerViewModel.kt @@ -69,6 +69,9 @@ abstract class LayoutPickerViewModel( var nestedScrollStates: Bundle = Bundle() + // Map that holds the ordered/randomised layouts list per category (key: slug) + val orderedLayouts: MutableMap> = mutableMapOf() + abstract fun fetchLayouts(preferCache: Boolean = false) open fun onPreviewChooseTapped() = onDismissPreview() @@ -155,8 +158,16 @@ abstract class LayoutPickerViewModel( } selectedCategories.forEach { category -> - - val layouts = layouts.getFilteredLayouts(category.slug).map { layout -> + val ordered = orderedLayouts[category.slug] ?: if (category.randomizeOrder) { + val randomised = layouts.getFilteredLayouts(category.slug).shuffled() + orderedLayouts[category.slug] = randomised + randomised + } else { + val ordered = layouts.getFilteredLayouts(category.slug) + orderedLayouts[category.slug] = ordered + ordered + } + val layouts = ordered.map { layout -> val preview = when (_previewMode.value) { MOBILE -> layout.previewMobile TABLET -> layout.previewTablet diff --git a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/theme/SiteDesignRecommendationProvider.kt b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/theme/SiteDesignRecommendationProvider.kt index 3441b58e2522..6d2b1ce7bd46 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/theme/SiteDesignRecommendationProvider.kt +++ b/WordPress/src/main/java/org/wordpress/android/ui/sitecreation/theme/SiteDesignRecommendationProvider.kt @@ -40,8 +40,8 @@ class SiteDesignRecommendationProvider @Inject constructor(private val resourceP } }.toLayoutModels() val categoriesWithRecommendations = - listOf(recommendedCategory).toLayoutCategories(true) + - categories.toLayoutCategories() + listOf(recommendedCategory).toLayoutCategories(recommended = true) + + categories.toLayoutCategories(randomizeOrder = true) responseHandler(designsWithRecommendations, categoriesWithRecommendations) } else { // If no designs are recommended for the selected vertical recommend the blog category @@ -55,11 +55,11 @@ class SiteDesignRecommendationProvider @Inject constructor(private val resourceP ) if (recommendedCategory == null) { // If there is no blog category do not show a recommendation - responseHandler(designs.toLayoutModels(), categories.toLayoutCategories()) + responseHandler(designs.toLayoutModels(), categories.toLayoutCategories(randomizeOrder = true)) } else { val categoriesWithRecommendations = - listOf(recommendedCategory).toLayoutCategories(true) + - categories.toLayoutCategories() + listOf(recommendedCategory).toLayoutCategories(recommended = true, randomizeOrder = true) + + categories.toLayoutCategories(randomizeOrder = true) responseHandler(designs.toLayoutModels(), categoriesWithRecommendations) } } diff --git a/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/theme/SiteDesignRecommendationProviderTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/theme/SiteDesignRecommendationProviderTest.kt index 6ea4612c5469..e21a280c14a0 100644 --- a/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/theme/SiteDesignRecommendationProviderTest.kt +++ b/WordPress/src/test/java/org/wordpress/android/ui/sitecreation/theme/SiteDesignRecommendationProviderTest.kt @@ -91,12 +91,20 @@ class SiteDesignRecommendationProviderTest { whenever(resourceProvider.getStringArray(R.array.site_creation_intents_strings)).thenReturn(verticalArray) } + @Test + fun `All non recommended categories are randomised`() { + val handler = ResponseHandler() + recommendationProvider.handleResponse("", allDesigns, allCategories, handler::handle) + assertThat(requireNotNull(handler.categories?.filter { !it.isRecommended })).allMatch { it.randomizeOrder } + } + @Test fun `when no vertical is selected the blog category is recommended`() { val handler = ResponseHandler() recommendationProvider.handleResponse("", allDesigns, allCategories, handler::handle) assertThat(requireNotNull(handler.categories?.filter { it.isRecommended }?.size)).isEqualTo(1) assertThat(requireNotNull(handler.categories?.first()?.isRecommended)).isEqualTo(true) + assertThat(requireNotNull(handler.categories?.first()?.randomizeOrder)).isEqualTo(true) assertThat(requireNotNull(handler.categories?.first()?.slug)).isEqualTo(blogCategory.slug) } @@ -106,6 +114,7 @@ class SiteDesignRecommendationProviderTest { recommendationProvider.handleResponse("art", allDesigns, allCategories, handler::handle) assertThat(requireNotNull(handler.categories?.filter { it.isRecommended }?.size)).isEqualTo(1) assertThat(requireNotNull(handler.categories?.first()?.isRecommended)).isEqualTo(true) + assertThat(requireNotNull(handler.categories?.first()?.randomizeOrder)).isEqualTo(true) assertThat(requireNotNull(handler.categories?.first()?.slug)).isEqualTo(blogCategory.slug) } @@ -115,6 +124,7 @@ class SiteDesignRecommendationProviderTest { recommendationProvider.handleResponse(mockedVerticalTitle, allDesigns, allCategories, handler::handle) assertThat(requireNotNull(handler.categories?.filter { it.isRecommended }?.size)).isEqualTo(1) assertThat(requireNotNull(handler.categories?.first()?.isRecommended)).isEqualTo(true) + assertThat(requireNotNull(handler.categories?.first()?.randomizeOrder)).isEqualTo(false) assertThat(requireNotNull(handler.categories?.first()?.slug)).isEqualTo("recommended_$mockedVerticalSlug") }