Fix renderring of the content that is smaller than the screen.
Test: Added new tests.
Bug: 374758615
Change-Id: I6c3e1df767684c2cd65c5633bd4f1be2827f0522
diff --git a/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt b/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt
index ee6664e..ff4156e 100644
--- a/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt
+++ b/wear/compose/compose-foundation/src/androidTest/kotlin/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategyTest.kt
@@ -283,6 +283,8 @@
transformedHeight = { measuredHeight, _ -> measuredHeight / 2 }
)
+ assertThat(result.canScrollForward).isFalse()
+ assertThat(result.canScrollBackward).isFalse()
assertThat(result.visibleItems.size).isEqualTo(1)
assertThat(result.visibleItems.first().offset).isEqualTo(0)
assertThat(result.visibleItems.first().measuredHeight).isEqualTo(screenHeight)
@@ -290,6 +292,73 @@
}
@Test
+ fun renderContentSmallerThanTheScreen_hasNoScrolling() {
+ val strategy =
+ TransformingLazyColumnContentPaddingMeasurementStrategy(
+ PaddingValues(0.dp),
+ measureScope
+ )
+ val result =
+ strategy.measure(
+ listOf(
+ // Centered item.
+ screenHeight / 5,
+ screenHeight / 5,
+ screenHeight / 5,
+ )
+ )
+
+ assertThat(result.canScrollForward).isFalse()
+ assertThat(result.canScrollBackward).isFalse()
+ assertThat(result.visibleItems.size).isEqualTo(3)
+ }
+
+ @Test
+ fun renderContentOnTopOfList_hasNoBackwardScrolling() {
+ val strategy =
+ TransformingLazyColumnContentPaddingMeasurementStrategy(
+ PaddingValues(0.dp),
+ measureScope
+ )
+ val result =
+ strategy.measure(
+ listOf(
+ // Centered item.
+ screenHeight / 2,
+ screenHeight / 2,
+ screenHeight / 2,
+ )
+ )
+
+ assertThat(result.canScrollForward).isTrue()
+ assertThat(result.canScrollBackward).isFalse()
+ assertThat(result.visibleItems.size).isEqualTo(2)
+ }
+
+ @Test
+ fun renderContentOnBottomOfList_hasNoForwardScrolling() {
+ val strategy =
+ TransformingLazyColumnContentPaddingMeasurementStrategy(
+ PaddingValues(0.dp),
+ measureScope
+ )
+ val result =
+ strategy.measure(
+ listOf(
+ screenHeight / 2,
+ screenHeight / 2,
+ // Centered item.
+ screenHeight / 2,
+ ),
+ anchorItemIndex = 2
+ )
+
+ assertThat(result.canScrollForward).isFalse()
+ assertThat(result.canScrollBackward).isTrue()
+ assertThat(result.visibleItems.size).isEqualTo(2)
+ }
+
+ @Test
fun dynamicHeightItems_measuredWithCorrectOffsets() {
val strategy = TransformingLazyColumnCenterBoundsMeasurementStrategy()
val result =
diff --git a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt
index be60fced..914a09d 100644
--- a/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt
+++ b/wear/compose/compose-foundation/src/main/java/androidx/wear/compose/foundation/lazy/TransformingLazyColumnContentPaddingMeasurementStrategy.kt
@@ -120,8 +120,16 @@
}
val totalHeight =
- visibleItems.sumOf { it.transformedHeight } + itemSpacing * (itemsCount - 1)
- if (totalHeight < containerConstraints.maxHeight) {
+ visibleItems.sumOf { it.transformedHeight } +
+ itemSpacing * (itemsCount - 1) +
+ beforeContentPadding +
+ afterContentPadding
+
+ if (
+ totalHeight < containerConstraints.maxHeight &&
+ visibleItems.first().index == 0 &&
+ visibleItems.last().index == itemsCount - 1
+ ) {
restoreLayoutTopToBottom(visibleItems, itemSpacing, containerConstraints)
canScrollBackward = false
canScrollForward = false