Status Update
Comments
so...@google.com <so...@google.com>
lp...@google.com <lp...@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
[Deleted User] <[Deleted User]> #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
lp...@google.com <lp...@google.com>
lp...@google.com <lp...@google.com> #4
Thanks for the reproduction - I can reproduce too.
I think the problem is that we wait for an up signal to emit a PressInteraction.Release
/ PressInteraction.Cancel
event, and hence cancel the ripple (tryAwaitRelease
). To do this we wait for an up event:
And because we create a Popup
during long press, something changes in dispatch - events seem to be coming through, so I think there is something strange happening with awaitPointerEvent
- from some brief logging it looks like we never resume after:
So maybe we aren't correctly dispatching the events after the popup has launched, in the correct pass? Matvei, can you take a look?
Note: since we migrated to use RippleDrawable
I noticed a small issue that means this doesn't reproduce cleanly, since when window focus changes the RippleDrawable has its ripple cleared. You can reproduce on ToT by doing:
CompositionLocalProvider(LocalRippleNativeRendering provides false) {
}
around the ripple - but the actual root bug here is we are not emitting the PressInteraction
release / cancel events.
ma...@google.com <ma...@google.com> #5
Thanks for a lot of useful info Louis. Assigning to George to take a look at the popup overlap situation, since I believe we faced the similar ones in the past. Also cc-ing Andrey how had dealt with it as well.
am...@google.com <am...@google.com> #6
Interactive Preview is also affected by that, and the ripple gets stuck sometimes when users interact with some buttons. See
lp...@google.com <lp...@google.com> #7
Re:
That bug appears to be a separate issue with Interactive Preview - this bug only occurs when a long press opens a new window.
mo...@google.com <mo...@google.com> #8
I'm sorry, I haven't been able to get to this bug with all the other things on my plate. If someone else wants to take it, please do.
lp...@google.com <lp...@google.com> #9
Ok, finally managed to find the root problem - we don't use rememberUpdatedState()
to remember the long click / double click lambdas, so if a long click triggers a recomposition, and those lambdas aren't explicitly memoized / have unstable types that cannot be memoized automatically, new lambda instances will be passed to combinedClickable
during recomposition. This means that the keys provided to Modifier.pointerInput
change, so we cancel the old coroutine, and we never finish waiting for the up event, and awaitPointerEvent
never returns because things are cancelled / no longer being dispatched here.
ap...@google.com <ap...@google.com> #10
Branch: androidx-main
commit 9653864b3c491ed7371ef841bdd292160cbf244e
Author: Louis Pullen-Freilich <lpf@google.com>
Date: Fri May 21 00:55:12 2021
Fixes ripples / indication sometimes getting stuck on a long click
If a long click causes a recomposition and causes the instance of the long click lambda to change, this would cause us to cancel and restart the pointer input scope in Modifier.pointerInput(). This means that we would miss the corresponding up event for that long click, causing no PressInteraction.Release to be emitted, and hence causing ripples / other indication to get 'stuck'.
Now we only cancel and restart this scope if we change from having a long click lambda to not having one (null), and in which case we will now correctly emit PressInteraction.Cancel to clean up any existing long clicks if needed.
Fixes:
Test: ClickableTest
Relnote: "Fixed an issue where ripples / other indication would sometimes get stuck on a long click when using Modifier.combinedClickable"
Change-Id: I2298ce564e3940875c3f3525255424da25dc9414
M compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ClickableTest.kt
M compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Clickable.kt
Description
Jetpack Compose release version:
1.0.0-beta05
I'm using a modifier like this:
When the long click listener is called I show a popup dialog which causes the ripple to be stuck in the pressed state until I touch the item again.