Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -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 ?: ""
Expand All @@ -24,8 +25,14 @@ class LayoutCategoryModel(
}

@JvmName("starterDesignToLayoutCategories")
fun List<StarterDesignCategory>.toLayoutCategories(recommended: Boolean = false) =
map { LayoutCategoryModel(starterDesignCategory = it, isRecommended = recommended) }
fun List<StarterDesignCategory>.toLayoutCategories(recommended: Boolean = false, randomizeOrder: Boolean = false) =
map {
LayoutCategoryModel(
starterDesignCategory = it,
isRecommended = recommended,
randomizeOrder = randomizeOrder
)
}

@JvmName("gutenbergLayoutToLayoutCategories")
fun List<GutenbergLayoutCategory>.toLayoutCategories() = map { LayoutCategoryModel(blockLayoutCategory = it) }
Original file line number Diff line number Diff line change
Expand Up @@ -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<String, List<LayoutModel>> = mutableMapOf()

abstract fun fetchLayouts(preferCache: Boolean = false)

open fun onPreviewChooseTapped() = onDismissPreview()
Expand Down Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand All @@ -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)
}

Expand All @@ -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")
}

Expand Down