Status Update
Comments
ma...@google.com <ma...@google.com>
mo...@google.com <mo...@google.com> #2
Branch: androidx-main
commit a1154475dd101bcf9867c11ceb567f9511dc7c1c
Author: Mariano Martin <marianomartin@google.com>
Date: Fri Apr 05 12:00:06 2024
[PullToRefresh] Update Material 3 PullToRefresh APIs
Test: updated existing tests
Fixes: 314496282, 317177684, 323787138, 324573502, 317177683
Relnote: "New pull-to-refresh APIs:
- Simplified PullToRefreshState to use fractional values instead of Dp units.
- isRefreshing state is controlled by the user instead of PullToRefreshState.
- Separated out the nested scroll connection from PullToRefreshState. It is handled by the new PullToRefreshBox or Modifier.pullToRefresh.
- This update is a breaking change to previous experimental APIs."
Change-Id: I0adeb950063988d1a05aca7aa135ccd982431423
M compose/material3/material3/api/current.txt
M compose/material3/material3/api/restricted_current.txt
M compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/model/Examples.kt
M compose/material3/material3/integration-tests/material3-demos/src/main/java/androidx/compose/material3/demos/PullToRefreshDemo.kt
M compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/PullToRefreshSamples.kt
M compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshIndicatorScreenshotTest.kt
M compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshIndicatorTest.kt
M compose/material3/material3/src/androidInstrumentedTest/kotlin/androidx/compose/material3/pulltorefresh/PullToRefreshStateImplTest.kt
M compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/pulltorefresh/PullToRefresh.kt
sa...@gmail.com <sa...@gmail.com> #3
A problem I had was passing the insets to a LazyColumn
. The LazyColumn
was sometimes under the insets and so needed the insets given as its contentPadding
parameter. In tablet mode the LazyColumn
wasn't under the navigation bar and a parent consumed the insets, but there was no easy way to pass that info to the LazyColumn
. The only alternative that I can see is to have the parent that consumed the insets to calculate what the child insets should be manually and then to pass the insets down the tree to where the LazyColumn
is. This seems like reinventing the ModifierLocal
that handles the consumed insets when it would be easier if that info could be accessed directly.
mo...@google.com <mo...@google.com> #4
Thank you. It doesn't look like this will be a trivial solution as yet. However, one of our team members is just now adding a feature that will make this possible. Because the feature is going to be experimental API, we likely won't be able to use it in the foundation
library for a few months.
va...@google.com <va...@google.com> #5
One potential workaround is applying a windowInsetsPadding
or windowInsets*Height
to an item inside the LazyColumn
, as opposed to using contentPadding
(since that allows using the ModifierLocal
normally. But that may not always be an option (or that has other non-desirable effects).
mo...@google.com <mo...@google.com> #6
Any solution that involves composition means that layout will be delayed by 1 frame.
For the above problem, I think we need something like this:
val consumedNavigationBars by remember { MutableWindowInsets() }
Box(
modifier = Modifier
.consumedWindowInsets(WindowInsets.navigationBars)
.withConsumedWindowInsets {
consumedNavigationBars.insets = WindowInsets.navigationBars.exclude(it)
}
) {
// will have non-zero insets
val insets = consumedNavigationBars.asPaddingValues()
}
class MutableWindowInsets : WindowInsets {
var insets by mutableStateOf(WindowInsets(0, 0, 0, 0))
fun getLeft(density: Density, layoutDirection: LayoutDirection): Int = insets.getLeft(density, layoutDirection)
fun getTop(density: Density): Int = insets.getTop(density)
fun getRight(density: Density, layoutDirection: LayoutDirection): Int = insets.getRight(density, layoutDirection)
fun getBottom(density: Density): Int = insets.getBottom(density)
}
ap...@google.com <ap...@google.com> #7
Branch: androidx-main
commit f6c646af9c5d6eed33998affaccdba72dcc9b825
Author: George Mount <mount@google.com>
Date: Mon Aug 29 15:55:07 2022
Allow access to consumed WindowInsets
Fixes: 237019262
Fixes: 243119659
Relnote: "Added Modifier.withConsumedWindowInsets() to
to get consumed WindowInsets for use outside windowInsetsPadding.
Added MutableWindowInsets to allow easily changing WindowInsets
without recomposition."
Test: new tests
Change-Id: I7fd28c29953ca10b4182d07996f16b66263548b1
M compose/foundation/foundation-layout/src/test/kotlin/androidx/compose/foundation/layout/WindowInsetsTest.kt
M compose/foundation/foundation-layout/samples/src/main/java/androidx/compose/foundation/layout/samples/WindowInsetsPaddingSample.kt
M compose/foundation/foundation-layout/api/public_plus_experimental_1.3.0-beta02.txt
M compose/foundation/foundation-layout/src/androidAndroidTest/kotlin/androidx/compose/foundation/layout/WindowInsetsPaddingTest.kt
M compose/foundation/foundation-layout/api/public_plus_experimental_current.txt
M compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsets.kt
M compose/foundation/foundation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.kt
na...@google.com <na...@google.com> #8
This bug was linked in a change in the following release(s):
androidx.compose.foundation:foundation-layout:1.3.0-beta03
Description
Jetpack Compose version: 1.2.0-rc02
Jetpack Compose component(s) used: Foundation
Android Studio Build: #AI-221.4165.146.2211.8713749
Kotlin version: 1.6.21
When accessing the window insets via
asPaddingValues()
it does not account for the already consumed insets further in the hierarchy. E.g.The
PaddingValues
could be added to aLazyColumn
or similar layout that need extra padding, but only when a parent has not already consumed them. As far as I can tell it is not possible to access the amount of consumed insets, which makes it difficult to achieve this kind of layout.My feature request is either having
asPaddingValues
already account for the consumed insets (just likeModifier.navigationBarPadding()
) or at least provide read-only access to the amount of consumed insets.