Fix crash when rotating shape/trace screen#7068
Merged
grzesiek2010 merged 6 commits intogetodk:masterfrom Feb 3, 2026
Merged
Conversation
seadowg
commented
Feb 2, 2026
| val validationResult = it.value | ||
| if (validationResult is FailedValidationResult && validationResult.index == prompt.index) { | ||
| validationResult.customErrorMessage ?: getString(validationResult.defaultErrorMessage) | ||
| if (it is FailedValidationResult && it.index == prompt.index) { |
Member
Author
There was a problem hiding this comment.
@grzesiek2010 I don't think we need the index check here any longer right?
Member
There was a problem hiding this comment.
Yes, it seems to be redundant now.
seadowg
commented
Feb 3, 2026
|
|
||
| import android.content.Context | ||
|
|
||
| sealed class DisplayString { |
Member
Author
There was a problem hiding this comment.
@grzesiek2010 please let me know if I've already created this abstraction! I've definitely used it on other Android projects.
Member
There was a problem hiding this comment.
I don't remember anything like that.
grzesiek2010
requested changes
Feb 3, 2026
...ect_app/src/test/java/org/odk/collect/android/widgets/utilities/GeoPolyDialogFragmentTest.kt
Outdated
Show resolved
Hide resolved
grzesiek2010
approved these changes
Feb 3, 2026
|
Tested with Success! Verified on Android 10 Verified cases:
|
|
Tested with Success! Verified on Android 14 |
|
Tested with success Verified on Android 16 |
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.
Closes #7066
Why is this the best possible solution? Were any other approaches considered?
There were a couple of features of the code that causes this issue:
invalidMessageobject passed toGeoPolyFragmentwas the product ofLiveDatawhich had been created via amapthat referencedgetString- implicitly requiring theFragmentwhere it was executed.LiveDatais then passed to aViewModelmeaning it would be retained between configuration changes - the "original" instance would be reused, and the new one created as part of recreation would effectively be ignoredCombining 1 with 2 gets you a crash as re-executing the
mapoperation after recreation requires aFragmentthat's been destroyed.1 was definitely an issue -
mapoperations should never have side-effects and shouldn't rely on life-cycleable objects. I did also consider changing 2, but alternatives (like using a mediator that both ViewModels could share) felt over-architected. I think this is just a quirk of any stateful view component (be it a Fragment or a Composable or a View): initial state will be ignored when the component is recreated.How does this change affect users? Describe intentional changes to behavior and behavior that could have accidentally been affected by code changes. In other words, what are the regression risks?
Should just fix the issue. No maps code has been touched.
Before submitting this PR, please make sure you have:
./gradlew connectedAndroidTest(or./gradlew testLab) and confirmed all checks still passDateFormatsTest