diff --git a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt index 736b5955b..a24e8f1b2 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckState.kt @@ -82,6 +82,13 @@ sealed interface ReviewQualityCheckState : State { "reviewGrade, adjustedRating or highlights is not null" } } + + val showMoreButtonVisible: Boolean = + highlights != null && highlights != highlights.forCompactMode() + + val highlightsFadeVisible: Boolean = + highlights != null && showMoreButtonVisible && + highlights.forCompactMode().entries.first().value.size > 1 } } } diff --git a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt index cacbadccb..dc55d459d 100644 --- a/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt +++ b/app/src/main/java/org/mozilla/fenix/shopping/ui/ProductAnalysis.kt @@ -94,6 +94,8 @@ fun ProductAnalysis( if (productAnalysis.highlights != null) { HighlightsCard( highlights = productAnalysis.highlights, + highlightsFadeVisible = productAnalysis.highlightsFadeVisible, + showMoreButtonVisible = productAnalysis.showMoreButtonVisible, modifier = Modifier.fillMaxWidth(), ) } @@ -192,6 +194,8 @@ private fun AdjustedProductRatingCard( @Composable private fun HighlightsCard( highlights: Map>, + highlightsFadeVisible: Boolean, + showMoreButtonVisible: Boolean, modifier: Modifier = Modifier, ) { ReviewQualityCheckCard(modifier = modifier) { @@ -243,7 +247,7 @@ private fun HighlightsCard( targetState = isExpanded, label = "HighlightsCard-Crossfade", ) { expanded -> - if (expanded.not()) { + if (expanded.not() && highlightsFadeVisible) { Spacer( modifier = Modifier .height(32.dp) @@ -261,16 +265,18 @@ private fun HighlightsCard( } } - Spacer(modifier = Modifier.height(8.dp)) + if (showMoreButtonVisible) { + Spacer(modifier = Modifier.height(8.dp)) - SecondaryButton( - text = if (isExpanded) { - stringResource(R.string.review_quality_check_highlights_show_less) - } else { - stringResource(R.string.review_quality_check_highlights_show_more) - }, - onClick = { isExpanded = isExpanded.not() }, - ) + SecondaryButton( + text = if (isExpanded) { + stringResource(R.string.review_quality_check_highlights_show_less) + } else { + stringResource(R.string.review_quality_check_highlights_show_more) + }, + onClick = { isExpanded = isExpanded.not() }, + ) + } } } diff --git a/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt b/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt index 6bea18941..cceb0778f 100644 --- a/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt +++ b/app/src/test/java/org/mozilla/fenix/shopping/store/ReviewQualityCheckStateTest.kt @@ -5,7 +5,9 @@ package org.mozilla.fenix.shopping.store import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse import org.junit.Assert.assertThrows +import org.junit.Assert.assertTrue import org.junit.Test import org.mozilla.fenix.shopping.store.ReviewQualityCheckState.OptedIn.ProductReviewState.AnalysisPresent @@ -123,4 +125,137 @@ class ReviewQualityCheckStateTest { assert(gradePresent.isSuccess) assert(highlightsPresent.isSuccess) } + + @Test + fun `WHEN AnalysisPresent has more than 2 highlights snippets THEN show more button and highlights fade are visible`() { + val highlights = sortedMapOf( + ReviewQualityCheckState.HighlightType.QUALITY to listOf( + "High quality", + "Excellent craftsmanship", + "Superior materials", + ), + ReviewQualityCheckState.HighlightType.PRICE to listOf( + "Affordable prices", + "Great value for money", + "Discounted offers", + ), + ReviewQualityCheckState.HighlightType.SHIPPING to listOf( + "Fast and reliable shipping", + "Free shipping options", + "Express delivery", + ), + ReviewQualityCheckState.HighlightType.PACKAGING_AND_APPEARANCE to listOf( + "Elegant packaging", + "Attractive appearance", + "Beautiful design", + ), + ReviewQualityCheckState.HighlightType.COMPETITIVENESS to listOf( + "Competitive pricing", + "Strong market presence", + "Unbeatable deals", + ), + ) + val analysis = AnalysisPresent( + productId = "1", + reviewGrade = ReviewQualityCheckState.Grade.A, + needsAnalysis = false, + adjustedRating = 4.2f, + productUrl = "", + highlights = highlights, + ) + + assertTrue(analysis.highlightsFadeVisible) + assertTrue(analysis.showMoreButtonVisible) + } + + @Test + fun `WHEN AnalysisPresent has exactly 1 highlights snippet THEN show more button and highlights fade are not visible`() { + val highlights = sortedMapOf( + ReviewQualityCheckState.HighlightType.PRICE to listOf("Affordable prices"), + ) + val analysis = AnalysisPresent( + productId = "1", + reviewGrade = ReviewQualityCheckState.Grade.A, + needsAnalysis = false, + adjustedRating = 4.2f, + productUrl = "", + highlights = highlights, + ) + + assertFalse(analysis.highlightsFadeVisible) + assertFalse(analysis.showMoreButtonVisible) + } + + @Test + fun `WHEN AnalysisPresent has exactly 2 highlights snippets THEN show more button and highlights fade are not visible`() { + val highlights = sortedMapOf( + ReviewQualityCheckState.HighlightType.SHIPPING to listOf( + "Fast and reliable shipping", + "Free shipping options", + ), + ) + val analysis = AnalysisPresent( + productId = "1", + reviewGrade = ReviewQualityCheckState.Grade.A, + needsAnalysis = false, + adjustedRating = 4.2f, + productUrl = "", + highlights = highlights, + ) + + assertFalse(analysis.highlightsFadeVisible) + assertFalse(analysis.showMoreButtonVisible) + } + + @Test + fun `WHEN AnalysisPresent has a single highlights section and the section has more than 2 snippets THEN show more button and highlights fade are visible`() { + val highlights = sortedMapOf( + ReviewQualityCheckState.HighlightType.SHIPPING to listOf( + "Fast and reliable shipping", + "Free shipping options", + "Express delivery", + ), + ) + val analysis = AnalysisPresent( + productId = "1", + reviewGrade = ReviewQualityCheckState.Grade.A, + needsAnalysis = false, + adjustedRating = 4.2f, + productUrl = "", + highlights = highlights, + ) + + assertTrue(analysis.highlightsFadeVisible) + assertTrue(analysis.showMoreButtonVisible) + } + + @Test + fun `WHEN AnalysisPresent has only 1 highlight snippet for the first category and more for others THEN show more button is visible and highlights fade is not visible`() { + val highlights = sortedMapOf( + ReviewQualityCheckState.HighlightType.QUALITY to listOf( + "High quality", + ), + ReviewQualityCheckState.HighlightType.PACKAGING_AND_APPEARANCE to listOf( + "Elegant packaging", + "Attractive appearance", + "Beautiful design", + ), + ReviewQualityCheckState.HighlightType.COMPETITIVENESS to listOf( + "Competitive pricing", + "Strong market presence", + "Unbeatable deals", + ), + ) + val analysis = AnalysisPresent( + productId = "1", + reviewGrade = ReviewQualityCheckState.Grade.A, + needsAnalysis = false, + adjustedRating = 4.2f, + productUrl = "", + highlights = highlights, + ) + + assertTrue(analysis.showMoreButtonVisible) + assertFalse(analysis.highlightsFadeVisible) + } }