Status Update
Comments
se...@google.com <se...@google.com> #2
Forgot to paste the exception that was thrown:
No destination with route subGraph is on the NavController's back stack. The current destination is Destination(0xe5901274) route=a
ma...@bokhorst.biz <ma...@bokhorst.biz> #3
This is still happening with navigation-compose 2.4.0-alpha06
se...@google.com <se...@google.com> #4
Branch: androidx-main
commit d7af5243adb70d92a0104005ff353c83933c97ed
Author: Jeremy Woods <jbwoods@google.com>
Date: Mon Aug 23 22:03:09 2021
Ensure NavGraph Navigators are destroyed properly
When navigating with transitions, we properly hold destination entries
until the transition completes, but not for NavGraph entries. This is a
particular issue for popping since it results in NavGraph entries will
be moved to DESTROYED before their child destinations.
We need to make NavGraph back stack entries keep the maximum lifecycle
state of all of the entries in the graph. This means that as long as one
entry in the graph is CREATED, the graph itself will be CREATED and only
after all entries have been DESTROYED, will the NavGraph entry also be
destroyed.
RelNote: "Using getBackStackEntry and previousBackStackEntry inside
composable(), in conjuction with remember() will no longer cause an
exception for no destination being on the back stack."
Test: add new test
Bug: 194313238
Change-Id: I75138d24d27dac83b5301507161578ac811454e3
M navigation/navigation-compose/src/androidTest/java/androidx/navigation/compose/NavHostTest.kt
M navigation/navigation-runtime/src/androidTest/java/androidx/navigation/NavBackStackEntryLifecycleTest.kt
M navigation/navigation-runtime/src/main/java/androidx/navigation/NavController.kt
ma...@bokhorst.biz <ma...@bokhorst.biz> #5
This has been fixed internally and will be available in the Navigation 2.4.0-alpha08
release.
This also includes a lint check to ensure you surround any calls to getBackStackEntry
within composition with a remember
, which you should always be doing anyway, and that is the only way this actually works.
se...@google.com <se...@google.com> #6
I don't understand why and how do we need to surround getBackStackEntry
with a remember
.
Even the docs does not do that
se...@google.com <se...@google.com>
ma...@bokhorst.biz <ma...@bokhorst.biz> #7
This crash is taking apps down (not mine anymore, which was confirmed by the reporter of the crash). So, I think this issue deserves at least some attention.
se...@google.com <se...@google.com> #8
Related
se...@google.com <se...@google.com> #9
Test case that reproduces crash prior to P
@Test
//@SdkSuppress(maxSdkVersion = 27) /* this is for testing before P crash */
public void testSpanRangeOldValueCalculation() throws Exception {
// this test is ported from CTS
// DynamicLayoutTest.testReflow_afterSpanChangedShouldNotThrowException
String className = "android.text.DynamicLayout$ChangeWatcher";
Class<?> watcherClass = Class.forName(className, false,
getClass().getClassLoader());
SpannableBuilder builder = new SpannableBuilder(watcherClass, "crash crash crash!!");
TypefaceSpan span = mock(TypefaceSpan.class);
builder.setSpan(span, 1, 4, SPAN_EXCLUSIVE_EXCLUSIVE);
// this DynamicLayout causes the replace/insert before position 1 below to crash prior to P
new DynamicLayout(builder, new TextPaint(), Integer.MAX_VALUE,
Layout.Alignment.ALIGN_NORMAL, 1.0f, 1.0f, true);
try {
builder.replace(1, 1, "Hello there\n\n");
} catch (Throwable e) {
throw new RuntimeException("Inserting text into DynamicLayout should not crash", e);
}
}
ma...@bokhorst.biz <ma...@bokhorst.biz> #10
I see good progress here ;-)
se...@google.com <se...@google.com> #11
Fix coming in the next release.
It's a platform DynamicLayout bug, but since it's running through emoji2 we have an opportunity to backport it prior to P :party:.
ap...@google.com <ap...@google.com> #12
Branch: androidx-main
commit 96445c4b96e57ac060ea06c88e477622f28a2e00
Author: Sean McQuillan <seanmcq@google.com>
Date: Tue Mar 08 12:35:32 2022
Backport platform DynamicLayout crashfix to emoji2
Backport of Android P crashfix (
This causes insert and replace calls to not crash when they happen
adjacent to spans that are EXCLUSIVE_EXCLUSIVE.
Previously, the range would be negative which would cause incorrect
integer math inside of DynamicLayout. The new behavior is to never pass
negative ranges by ressetting start to 0 before passing to DynamicLayout
which causes more reflow and avoids a crash.
This was previously fixed on platform and is covered by CTS test
DynamicLayoutTest#testReflow_afterSpanChangedShouldNotThrowException()
Fixes:
Test: ./gradlew :e2:e2:cAT
Relnote: "Backport editor crash fix from Android P to EditText that is
configured to use emoji2 (platform bug
Change-Id: Ifd70914816fdb732aae34690666d790a6fc9783a
M emoji2/emoji2/src/main/java/androidx/emoji2/text/SpannableBuilder.java
M emoji2/emoji2/src/androidTest/java/androidx/emoji2/text/SpannableBuilderTest.java
Description
Component used: androidx.emoji2:emoji2
Version used: 1.0.1
Devices/Android versions reproduced on: Huawei BAH2-W19 and probably others