Status Update
Comments
ma...@google.com <ma...@google.com> #2
Project: platform/frameworks/support
Branch: androidx-main
Author: Louis Pullen-Freilich <
Link:
Adds OverscrollEffect#withoutDrawing and OverscrollEffect#withoutEventHandling
Expand for full commit details
Adds OverscrollEffect#withoutDrawing and OverscrollEffect#withoutEventHandling
These APIs allow overscroll to have events dispatched to it by one component, and rendered in a separate component.
Fixes: b/266550551
Fixes: b/204650733
Fixes: b/255554340
Fixes: b/229537244
Test: OverscrollTest
Relnote: "Adds OverscrollEffect#withoutDrawing and OverscrollEffect#withoutEventHandling APIs - these APIs create a wrapped instance of the provided overscroll effect that doesn't draw / handle events respectively, which allows for rendering overscroll in a separate component from the component that is dispatching events. For example, disabling drawing the overscroll inside a lazy list, and then drawing the overscroll separately on top / elsewhere."
Change-Id: Idbb3d91546b49c1987a041f959bce4b2b09a9f61
Files:
- M
compose/foundation/foundation/api/current.txt
- M
compose/foundation/foundation/api/restricted_current.txt
- M
compose/foundation/foundation/integration-tests/foundation-demos/src/main/java/androidx/compose/foundation/demos/OverscrollDemo.kt
- M
compose/foundation/foundation/samples/src/main/java/androidx/compose/foundation/samples/OverscrollSample.kt
- M
compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/OverscrollTest.kt
- M
compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Overscroll.kt
Hash: f64e25b7a473c757d080521e7dd97b3f6670f60d
Date: Fri Nov 01 18:43:56 2024
va...@google.com <va...@google.com> #3
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.compose.foundation:foundation:1.8.0-alpha06
androidx.compose.foundation:foundation-android:1.8.0-alpha06
androidx.compose.foundation:foundation-jvmstubs:1.8.0-alpha06
androidx.compose.foundation:foundation-linuxx64stubs:1.8.0-alpha06
ma...@google.com <ma...@google.com> #4
the underlying component of the top bar or bottom bar is.
Right, but in cases when top or bottom app bars handle this insets, we need to make sure that those insets are claimed successfully so that they are not reapplied again? It becomes a burden of the scaffold to make sure this is done properly, otherwise content
code will have to check and adjust based on the top/bottom app bar presence, which is not ideal.
And that could be an opt-out point as well: Passing an empty window insets would keep the old behavior
Same here, I would like to avoid the cases where you would need to check the top/bottom app bar presence in the content lambda. Not sure it is completely possible though, i will look into it more.
de...@gmail.com <de...@gmail.com> #5
I would also like to throw in the following:
With the changes, the entire screen is now reduced in size when the keyboard appears.
This was not the case before the change and I would like to deactivate it again. Is it possible to add this as an option?
do...@gmail.com <do...@gmail.com> #6
I would also appreciate the ability to turn off Scaffold
insets handling. We are handling insets on each screen, and this update made our app look odd (double insets all over the place). Fortunately, it's quite easy to fix it. But there is one thing that is not easily fixable.
We are using Scaffold
for the base structure on each screen, but most of our screens with LazyColumn are supposed to draw behind the navigation bar. But this is currently not easily possible with the Scaffold
. I know, I can remove the bottom inset from the bottom padding, but this is not a great solution.
Also, Scaffold's snackbarHost
slot (or SnackbarHost
) doesn't handle insets by default.
va...@google.com <va...@google.com> #7
otherwise content code will have to check and adjust based on the top/bottom app bar presence, which is not ideal.
The usage I'm thinking of shouldn't have the content care if the top/bottom app bar is there.
Let's say the Scaffold
didn't interact with insets at all.
Then, the inner padding passed to the content will pass down the space information taken up by the app bars. That may or may not include the insets.
But what the content can do is do call consumedWindowInsets(innerPadding)
unconditionally. If there are app bars, then the height of those will be consumed so that they are not reapplied later. If there aren't app bars, then the innerPadding
will be empty, and the insets will be left available for an inner component to take into account.
I think that pass-through behavior should be available as an option for Scaffold
, to also handle the cases for the reasons highlighted above by others.
ma...@google.com <ma...@google.com> #8
re
With the changes, the entire screen is now reduced in size when the keyboard appears.
I'm not sure I follow what's happening in your case. This change handles no ime insets and ime insets should work as before. Please file a separate bug with the repro sample if you see something strange.
va...@google.com <va...@google.com> #10
Currently Scaffold
is including safeDrawing
, which includes IME insets as well.
So innerPadding
will contain the ime
insets (assuming there is no bottom bar).
If there is a bottom bar, it will depend on whether the bottom bar is handling the ime
insets or not.
ma...@google.com <ma...@google.com> #11
re Alex
But what the content can do is do call consumedWindowInsets(innerPadding) unconditionally.
calling consumedWindowInsets(innerPadding)
unconditionally would consume more than intended as it will include the top and bottom app bar heights, causing the amount of unconsumed insets to be smaller then the real insets are. This will cause ime and other insets to break potentially and show incorrect padding.
This is one of the reasons we might never promote the PaddingValues overload of consumeWindowInsets
, it is just too dangerous.
I'm looking into what would be a sensible shape of the API
ma...@google.com <ma...@google.com> #12
Currently Scaffold is including safeDrawing, which includes IME insets as well.
Ooooh, that's true. I don't think we want to handle ime at all here in the scaffold or in other places to be honest. Is there a reason to handle it there? Probably for snackbar only..
de...@gmail.com <de...@gmail.com> #13
I don't think we want to handle ime at all here in the scaffold or in other places to be honest. Is there a reason to handle it there?
It's horrible when ime is handled there that the bottom bar moves up. It looks really weird.
ma...@google.com <ma...@google.com> #14
It is a bug, we should only consume status and navigation bars, but not ime. It can be an opt-in behavior if desired.
ma...@google.com <ma...@google.com> #15
snackbar and fab problem will be adressed here:
ap...@google.com <ap...@google.com> #16
Branch: androidx-main
commit 82cc43345ae181e2b1d708627e42fd0313738efa
Author: Matvei Malkov <malkov@google.com>
Date: Mon Aug 29 18:15:05 2022
Adjust material inset logic to account for ime and to allow for scaffold opt-out.
This change makes sure scaffold is handling the insets well. Allows for opt-outs and doesn't interfere with the IME paddings.
While we are at it, this change adjusts other components to never account for IME padding as well, making it an opt-in behavior.
Fixes: 243713323
Test: added new for new API + adjusted existing
Relnote: Default components insets introduced in m3 components in beta01 version are no longer account for IME insets.
Relnote: material3 Scaffold component now has a contentWindowInsets parameter, allowing to specify the amount of insets to handle for the content slot.
Change-Id: Icf11a4169c801d2670d88066984328205f48bb4f
M compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
M compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationBar.kt
M compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/SystemBarsDefaultInsets.kt
M compose/material3/material3/api/public_plus_experimental_current.txt
A compose/material3/material3/api/restricted_current.ignore
M compose/material3/material3/src/desktopMain/kotlin/androidx/compose/material/SystemBarsDefaultInsets.desktop.kt
M compose/material3/material3/api/restricted_current.txt
A compose/material3/material3/api/current.ignore
M compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/AppBar.kt
M compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationDrawer.kt
M compose/material3/material3/api/current.txt
M compose/material3/material3/api/public_plus_experimental_1.0.0-beta02.txt
M compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialComponentsInsetSupportTest.kt
M compose/material3/material3/api/1.0.0-beta02.txt
M compose/material3/material3/src/androidMain/kotlin/androidx/compose/material3/SystemBarsDefaultInsets.android.kt
M compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
M compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/NavigationRail.kt
M compose/material3/material3/api/restricted_1.0.0-beta02.txt
M compose/integration-tests/demos/src/main/java/androidx/compose/integration/demos/DemoApp.kt
M compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ScaffoldSamples.kt
M compose/material3/material3/integration-tests/material3-catalog/src/main/java/androidx/compose/material3/catalog/library/ui/component/Component.kt
na...@google.com <na...@google.com> #17
This bug was linked in a change in the following release(s):
androidx.compose.material3:material3:1.0.0-beta02
va...@google.com <va...@google.com> #18
ma...@quantox.com <ma...@quantox.com> #19
Quick question, I have a problem with Scaffold not updating innerPadding as a result of me showing/hiding a topBar, so is this is a bug I should report or am I missing something?
Scaffold(
topBar = {
val showAppBar = true/false
if (showAppBar) TopAppBar() //topBar shows/hides as expected based on some state
}
) { innerPadding -> //but innerPadding never gets updated based on change in topBar visibility??
//some content that consumes innerPadding
}
If this is actually supposed to work this way I might be forced to move TopBar onto individual screens?
Description
Material3: 1.0.0-beta01
In the latest Material 3 release, insets are automatically handled by some components.
For the
Scaffold
in particular,safeDrawing
insets are added to the inner padding passed to thebody
, but there is no ability to configure this (unlike theTopAppBar
s,NavigationBar
andNavigationRail
).The current behavior isn't always desirable, since a top-level
Scaffold
may want to leave inset support up to individual screens, in which case it makes sense to leave some form of insets untouched to be consumed later (potentially via anotherScaffold
).I think it would make sense to avoid having
Scaffold
interact with insets at all directly, or at the very least, allow opting out of it.