Status Update
Comments
jo...@google.com <jo...@google.com>
co...@protonmail.com <co...@protonmail.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
to...@gmail.com <to...@gmail.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
jo...@google.com <jo...@google.com> #4
We recently landed significant changes to the affected code paths. The changes have not been released yet. Can we ask you to either wait for the next alpha release or try one of the latest snapshots?
Thanks!
to...@gmail.com <to...@gmail.com> #5
I've lived 80% of the time on snapshot builds for that app due to all the reports and fixes leading to other reports so not a problem.
Can you point me to the corresponding CLs so I can look at them before removing the workaround for my next release?
jo...@google.com <jo...@google.com> #6
The changes I'm referring to were added in
to...@gmail.com <to...@gmail.com> #7
I'd love to have a repro too, it's easier, but as quite a few compose crashes, the stack traces does not give any clue about where in the app it can happen so without the users contacting me with a repro there's not much I can do.
That CL is quite a major change so effectively hard to know if it can fix this.
Let's trust it will.
I'll remove the workaround for next release and we'll see. It's rare enough to be allowed for a short period in prod.
jo...@google.com <jo...@google.com> #8
Thanks! Keep us posted.
to...@gmail.com <to...@gmail.com> #9
If I may just add a note it's been 6 month without any reaction before today :)
After many many reports, now for quite a few parts of Compose I know who to ping to get the issue moving and get necessary data to try to repro, pointers, ...
But it's still quite frustrating when I don't know who to ping, I know you receive tons of bad reports or incomplete like this one, but you can also easily check the number of reports from issue OP and priority and number of fixed to maybe help decide when engaging can help fixing things faster.
Anyway sorry just a small rant.
ro...@gmail.com <ro...@gmail.com> #10
Hey guys, I also found this bug today in my development process, and I can provide a 100% reproducible code:
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
ComposetestTheme {
Box(
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
val textState = rememberTextFieldState("name")
MyListItem(
onClick = { /*TODO*/ },
enabled = false,
trailingContent = {
},
modifier = Modifier.padding(horizontal = 16.dp)
) {
BasicTextField(
state = textState,
decorator = {
it()
}
)
}
}
}
}
}
}
@Composable
fun MyListItem(
onClick: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
shape: Shape = RoundedCornerShape(16.dp),
contentHorizontalAlignment: Alignment.Horizontal = Alignment.Start,
background: Color = Color.White,
description: @Composable (() -> Unit)? = null,
leadingContent: @Composable (() -> Unit)? = null,
trailingContent: @Composable (() -> Unit)? = null,
content: @Composable () -> Unit,
) = Box(
modifier = modifier
.clip(shape)
.background(background, shape)
.clickable(onClick = onClick, enabled = enabled)
) {
CenterRow(Modifier.padding(16.dp)) {
Box(
modifier = Modifier.weight(1f)
) {
Column(
modifier = Modifier.fillMaxWidth(),
horizontalAlignment = contentHorizontalAlignment,
verticalArrangement = Arrangement.spacedBy(6.dp)
) {
CenterRow {
RenderIf(conditionContent = leadingContent) {
Spacer(Modifier.width(10.dp))
}
content()
}
description?.invoke()
}
}
trailingContent?.invoke()
}
}
/**
* A layout that renders condition content and content only when the condition content size is not empty.
*/
@Composable
fun RenderIf(
modifier: Modifier = Modifier,
conditionContent: @Composable (() -> Unit)? = null,
content: @Composable (() -> Unit)? = null
) {
var isEmptyContent by remember(conditionContent) { mutableStateOf(true) }
Layout(
modifier = modifier,
content = conditionContent ?: {},
) { measurable, constraints ->
val placeables = measurable.map { it.measure(constraints) }
val placeableMaxWidth = placeables.maxOfOrNull { it.width } ?: 0
val placeableMaxHeight = placeables.maxOfOrNull { it.height } ?: 0
layout(placeableMaxWidth, placeableMaxHeight) {
if (placeables.isNotEmpty()) {
placeables.forEach { it.place(0, 0) }
isEmptyContent = false
}
}
}
if (!isEmptyContent) content?.invoke()
}
@Composable
fun CenterRow(
modifier: Modifier = Modifier,
horizontalArrangement: Arrangement.Horizontal = Arrangement.Start,
content: @Composable RowScope.() -> Unit
) = Row(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = horizontalArrangement,
modifier = modifier
) {
content()
}
Run the program, click on the ListItem and it crashes
Compose version: 1.7.0-beta04
ro...@gmail.com <ro...@gmail.com> #11
I found smaller reproducible code.
Box(
modifier = Modifier.clickable(enabled = false, onClick = { })
) {
BasicTextField(
state = textState,
decorator = {
it()
}
)
}
kl...@google.com <kl...@google.com> #12
Neither of those snippets reproduce the bug for me on an API 33 emulator on tip-of-tree. What devices are you using?
co...@protonmail.com <co...@protonmail.com> #13
I'm getting a similar crash. I have a small app (5 users) and it's happening to 2 users. i cant repro. the app is pretty small since im in beta at the moment.
Fatal Exception: java.lang.IllegalStateException: Cannot obtain node coordinator. Is the Modifier.Node attached?
at androidx.compose.ui.internal.InlineClassHelperKt.throwIllegalStateExceptionForNullCheck(InlineClassHelper.kt:30)
at androidx.compose.ui.node.DelegatableNodeKt.requireLayoutNode(DelegatableNode.kt:1389)
at androidx.compose.ui.node.DelegatableNodeKt.requireOwner(DelegatableNode.kt)
at androidx.compose.ui.Modifier$Node.getCoroutineScope(Modifier.kt:207)
at androidx.compose.foundation.FocusableNode.onFocusEvent(Focusable.kt:221)
at androidx.compose.foundation.AbstractClickableNode.onFocusEvent(Clickable.kt:1102)
at androidx.compose.ui.focus.FocusEventModifierNodeKt.refreshFocusEventNodes(FocusEventModifierNode.kt:68)
at androidx.compose.ui.focus.FocusTransactionsKt.performRequestFocus(FocusTransactions.kt:82)
at androidx.compose.ui.focus.FocusTransactionsKt.requestFocus-Mxy_nc0(FocusTransactions.kt:50)
at androidx.compose.ui.platform.AndroidComposeView$keyInputModifier$1$focusWasMovedOrCancelled$1.invoke(AndroidComposeView.java:343)
at androidx.compose.ui.platform.AndroidComposeView$keyInputModifier$1$focusWasMovedOrCancelled$1.invoke(AndroidComposeView.java:342)
at androidx.compose.ui.focus.FocusOwnerImpl$focusSearch$1.invoke(FocusOwnerImpl.java:250)
at androidx.compose.ui.focus.FocusOwnerImpl$focusSearch$1.invoke(FocusOwnerImpl.java:246)
at androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.searchChildren-4C6V_qg(TwoDimensionalFocusSearch.kt:185)
at androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.generateAndSearchChildren-4C6V_qg(TwoDimensionalFocusSearch.kt)
at androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.twoDimensionalFocusSearch-sMXa3k8(TwoDimensionalFocusSearch.kt:88)
at androidx.compose.ui.focus.TwoDimensionalFocusSearchKt.twoDimensionalFocusSearch-sMXa3k8(TwoDimensionalFocusSearch.kt:77)
at androidx.compose.ui.focus.FocusTraversalKt.focusSearch-0X8WOeE(FocusTraversal.kt:109)
at androidx.compose.ui.focus.FocusOwnerImpl.focusSearch-ULY8qGw(FocusOwnerImpl.kt:246)
at androidx.compose.ui.platform.AndroidComposeView$keyInputModifier$1.invoke-ZmokQxo(AndroidComposeView.java:342)
at androidx.compose.ui.platform.AndroidComposeView$keyInputModifier$1.invoke(AndroidComposeView.java:334)
at androidx.compose.ui.input.key.KeyInputNode.onKeyEvent-ZmokQxo(KeyInputModifier.kt:80)
at androidx.compose.ui.focus.FocusOwnerImpl.dispatchKeyEvent-YhN2O0w(FocusOwnerImpl.kt:273)
at androidx.compose.ui.focus.FocusOwner.dispatchKeyEvent-YhN2O0w$default(FocusOwner.java:142)
at androidx.compose.ui.platform.AndroidComposeView.dispatchKeyEvent(AndroidComposeView.android.kt:950)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1964)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1964)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1964)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1964)
at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:486)
at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1880)
at android.app.Activity.dispatchKeyEvent(Activity.java:4159)
at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.kt:103)
at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:85)
at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.kt:117)
at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:400)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:6377)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:6243)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5725)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5782)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5748)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5913)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5756)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5970)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5729)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5782)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5748)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5756)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5729)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5782)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5748)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5946)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:6104)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:3159)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:2723)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:2714)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:3136)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:154)
at android.os.MessageQueue.nativePollOnce(MessageQueue.java)
at android.os.MessageQueue.next(MessageQueue.java:335)
at android.os.Looper.loopOnce(Looper.java:161)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7870)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1009)
What's most interesting is that i dont have any text input in my app. my app is essentially two buttons, and a lazylist.
co...@protonmail.com <co...@protonmail.com> #14
Not sure if it's actually helpful. but it seems to only happen on Pixel 6 Pro. but with only 5 users. that could be a red herring
br...@adesso-mobile.de <br...@adesso-mobile.de> #15
At least the disabled click listener in the parent an a custom TextFieldDecorator are present as well.
Device: Pixel 8, Android 14.
an...@sigma.software <an...@sigma.software> #16
Similar crash:
Fatal Exception: java.lang.IllegalStateException: Cannot read CompositionLocal because the Modifier node is not currently attached.
at androidx.compose.ui.node.CompositionLocalConsumerModifierNodeKt.currentValueOf(CompositionLocalConsumerModifierNode.kt:72)
at com.my.package.RequestAutofillOnFocusedNode.onFocusEvent(AutofillModifier.kt:171)
at androidx.compose.ui.focus.FocusInvalidationManager$invalidateNodes$1.invoke(FocusInvalidationManager.kt:79)
at androidx.compose.ui.focus.FocusInvalidationManager$invalidateNodes$1.invoke(FocusInvalidationManager.kt:57)
at androidx.compose.ui.platform.AndroidComposeView.onEndApplyChanges(AndroidComposeView.android.kt:742)
at androidx.compose.ui.node.UiApplier.onEndChanges(UiApplier.android.kt:48)
at androidx.compose.runtime.CompositionImpl.applyChangesInLocked(Composition.kt:978)
at androidx.compose.runtime.CompositionImpl.applyChanges(Composition.kt:1005)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:639)
at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:551)
at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41)
at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.java:109)
at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.java:41)
at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1404)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1415)
at android.view.Choreographer.doCallbacks(Choreographer.java:1015)
at android.view.Choreographer.doFrame(Choreographer.java:941)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1389)
at android.os.Handler.handleCallback(Handler.java:959)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loopOnce(Looper.java:232)
at android.os.Looper.loop(Looper.java:317)
at android.app.ActivityThread.main(ActivityThread.java:8592)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:878)
lp...@google.com <lp...@google.com> #17
R.e AutofillModifier
- make sure to guard your composition local read with if (isAttached)
, since you are currently trying to query this when the node is unattached.
For the other issues in this bug, this is no longer an issue in 1.8, and we are looking at backporting a fix for this to 1.7
ap...@google.com <ap...@google.com> #18
Branch: androidx-main
commit b15d0eefd3ecc892ff01bfe532a41e9c421acf51
Author: Louis Pullen-Freilich <lpf@google.com>
Date: Wed Aug 14 17:11:58 2024
Adds regression test for a disabled clickable crashing on focus event
This was fixed as a side effect of refactoring clickable and focusable to directly delegate to a FocusTargetNode.
Bug:
Test: ClickableTest
Change-Id: I717676e75fe31807744834d0cfa1570cd2221ac7
M compose/foundation/foundation/src/androidInstrumentedTest/kotlin/androidx/compose/foundation/ClickableTest.kt
na...@google.com <na...@google.com> #20
The following release(s) address this bug.It is possible this bug has only been partially addressed:
androidx.compose.foundation:foundation:1.7.0-rc01
androidx.compose.foundation:foundation-android:1.7.0-rc01
androidx.compose.foundation:foundation-desktop:1.7.0-rc01
sa...@gmail.com <sa...@gmail.com> #21
We are still seeing the crash in our app after updating to 1.7.2 (BOM 2024.09.02). Ours is a View interop case. (Two text fields and a Compose Button in XML layout). Clicking on IME done crashes the app with:
Fatal Exception: java.lang.IllegalStateException: focus search returned a view that wasn't able to take focus!
at android.widget.TextView.onKeyUp(TextView.java:10271)
at android.view.KeyEvent.dispatch(KeyEvent.java:3175)
at android.view.View.dispatchKeyEvent(View.java:15781)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.widget.ScrollView.dispatchKeyEvent(ScrollView.java:591)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.widget.ScrollView.dispatchKeyEvent(ScrollView.java:591)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1987)
at com.android.internal.policy.DecorView.superDispatchKeyEvent(DecorView.java:669)
at com.android.internal.policy.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:2010)
at android.app.Activity.dispatchKeyEvent(Activity.java:4595)
at androidx.core.app.ComponentActivity.superDispatchKeyEvent(ComponentActivity.kt:103)
at androidx.core.view.KeyEventDispatcher.dispatchKeyEvent(KeyEventDispatcher.java:85)
at androidx.core.app.ComponentActivity.dispatchKeyEvent(ComponentActivity.kt:117)
at androidx.appcompat.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:604)
at androidx.appcompat.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59)
at androidx.appcompat.app.AppCompatDelegateImpl$AppCompatWindowCallback.dispatchKeyEvent(AppCompatDelegateImpl.java:3397)
at com.android.internal.policy.DecorView.dispatchKeyEvent(DecorView.java:515)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:7822)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:7679)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7058)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7125)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7086)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:7259)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:7094)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:7316)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7062)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:7125)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:7086)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:7094)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:7062)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:10383)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:10334)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:10295)
at android.view.ViewRootImpl$ViewRootHandler.handleMessageImpl(ViewRootImpl.java:6803)
at android.view.ViewRootImpl$ViewRootHandler.handleMessage(ViewRootImpl.java:6667)
at android.os.Handler.dispatchMessage(Handler.java:108)
at android.os.Looper.loopOnce(Looper.java:226)
at android.os.Looper.loop(Looper.java:328)
at android.app.ActivityThread.main(ActivityThread.java:9239)
at java.lang.reflect.Method.invoke(Method.java)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:594)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
lp...@google.com <lp...@google.com> #22
This seems like a different issue, please file a new bug (with sample code if you have it)
Description
Jetpack Compose version: 1.7 snapshot 11251205
Jetpack Compose component(s) used: many
Android Studio Build:Android Studio Iguana | 2023.2.1 Canary 18
Kotlin version: 1.9.21
I do not have yet a repro and moving to holidays but reporting this new crash that I just get on Crashlytics.
The device was probably connected to AS via Running device so it's possible the keyevent was from keyboard on AS. I did not see the crash so no idea. If you need things to test I'll check when back from holidays.