Merge "Merge cherrypicks of ['aosp/2401513', 'aosp/2401512'] into androidx-wear-compose-release." into androidx-wear-compose-release
diff --git a/libraryversions.toml b/libraryversions.toml
index ed56e22..9267507 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -130,7 +130,7 @@
VIEWPAGER = "1.1.0-alpha02"
VIEWPAGER2 = "1.2.0-alpha01"
WEAR = "1.3.0-alpha04"
-WEAR_COMPOSE = "1.1.1"
+WEAR_COMPOSE = "1.1.2"
WEAR_INPUT = "1.2.0-alpha03"
WEAR_INPUT_TESTING = "1.2.0-alpha03"
WEAR_ONGOING = "1.1.0-alpha01"
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt
index b6f60a4..90a46ad 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/ScalingLazyColumnTest.kt
@@ -963,6 +963,42 @@
assertThat(state.centerItemIndex).isEqualTo(24)
assertThat(state.centerItemScrollOffset).isEqualTo(0)
}
+
+ @Test
+ fun centerItemIndexPublishesUpdatesOnChangeOnly() {
+ lateinit var state: ScalingLazyListState
+ var recompositionCount = 0
+
+ rule.setContent {
+ state = rememberScalingLazyListState(initialCenterItemIndex = 0)
+
+ WithTouchSlop(0f) {
+ state.centerItemIndex
+ recompositionCount++
+
+ ScalingLazyColumn(
+ state = state,
+ modifier = Modifier.testTag(TEST_TAG).requiredSize(
+ itemSizeDp * 3.5f + defaultItemSpacingDp * 2.5f
+ ),
+ autoCentering = AutoCenteringParams(itemIndex = 0)
+ ) {
+ items(5) {
+ Box(Modifier.requiredSize(itemSizeDp))
+ }
+ }
+ }
+ }
+ // TODO(b/210654937): Remove the waitUntil once we no longer need 2 stage initialization
+ rule.waitUntil { state.initialized.value }
+
+ rule.onNodeWithTag(TEST_TAG).performTouchInput {
+ swipeUp(endY = bottom - (itemSizePx.toFloat() + defaultItemSpacingPx.toFloat()))
+ }
+
+ rule.waitForIdle()
+ assertThat(recompositionCount).isEqualTo(2)
+ }
}
internal const val TestTouchSlop = 18f
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt
index 5193fec..cce6091 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ScalingLazyListState.kt
@@ -104,14 +104,17 @@
private val incompleteScrollOffset = mutableStateOf<Int?>(null)
private val incompleteScrollAnimated = mutableStateOf(false)
+ private val _centerItemIndex = derivedStateOf {
+ (layoutInfo as? DefaultScalingLazyListLayoutInfo)?.let {
+ if (it.initialized) it.centerItemIndex else null
+ } ?: initialCenterItemIndex
+ }
+
/**
* The index of the item positioned closest to the viewport center
*/
public val centerItemIndex: Int
- get() =
- (layoutInfo as? DefaultScalingLazyListLayoutInfo)?.let {
- if (it.initialized) it.centerItemIndex else null
- } ?: initialCenterItemIndex
+ get() = _centerItemIndex.value
internal val topAutoCenteringItemSizePx: Int by derivedStateOf {
if (extraPaddingPx.value == null || scalingParams.value == null ||