Fix consuming window insets in system window insets padding#2665
Merged
Fix consuming window insets in system window insets padding#2665
Conversation
MatkovIvan
requested changes
Jan 7, 2026
...ation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.kt
Show resolved
Hide resolved
MatkovIvan
reviewed
Jan 7, 2026
...ation-layout/src/commonMain/kotlin/androidx/compose/foundation/layout/WindowInsetsPadding.kt
Outdated
Show resolved
Hide resolved
MatkovIvan
reviewed
Jan 8, 2026
| insetsCalculation: PlatformWindowInsets.() -> WindowInsets, | ||
| ): Modifier = this then | ||
| PlatformInsetsPaddingModifierElement(inspectorInfo) then | ||
| PlatformWindowInsetsPaddingModifierElement(inspectorInfo, insetsCalculation) |
Member
There was a problem hiding this comment.
Adding both of them works, but kind of suspicious and creates more elements to allocate/iterate/etc 🤔
Just to be informed: what's about these alternatives?
- Delegate
PlatformWindowInsetsProviderNodefromInsetsPaddingModifierNode(not visa versa). - Using
DelegatableNode.visitAncestors(includeDelegates = true)
(1) looks more promising for me. WDYT?
Author
There was a problem hiding this comment.
The problem in general is that both the PlatformWindowInsetsProviderNode and InsetsPaddingModifierNode are traversable (they have different TraverseKey) and need to traverse their respective descendants to update them with ancestor properties.
As for
- I have thought about delegating
PlatformWindowInsetsProviderNodefromInsetsPaddingModifierNodebut the problem is that the commonInsetsPaddingModifierNodeis not aDelegatingNodeso we cannot delegate from it to another node. And I am not sure we want to make it aDelegatingNodein common just to use this functionality on the platform level. Also I think that the problem with the delegated node not being discovered would still remain. Or do you see some other option that I don't? DelegatableNode.visitAncestors(includeDelegates = true)is internal tocommonMainso is the idea to use it inInsetsConsumingModifierNodeinstead oftraverseAncestors?
Member
There was a problem hiding this comment.
is internal to commonMain
It's internal to the module, not source-set
MatkovIvan
approved these changes
Jan 12, 2026
3e294b9 to
e2c0104
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR fixes an issue where window insets (like
statusBarsPadding()) did not correctly respect or propagate consumed window insets. The core problem was that theInsetsPaddingModifierNodelogic was "hidden" from the layout traversal system because it was implemented via delegation.The
Modifier.windowInsetsPaddingnow applies two separate modifiers which create nodes of two types:PlatformInsetsPaddingModifierNodeis anInsetsPaddingModifierNodethat handles actual layout padding and correct resolve of window insets consumed by ancestors.PlatformWindowInsetsPaddingModifierNodeis responsible for retrieving platform-specificWindowInsetsvalues. On attachment, it traverses up the modifier chain to find the ancestorPlatformInsetsPaddingModifierNodeand establishes a link. It provides the insets back up to this ancestor node.Fixes CMP-9390 iOS seems to ignore consumeWindowInsets
Testing
Adds skiko tests to
WindowInsetsTestThis should be tested by QA
Release Notes
Fixes - Multiple Platforms