Fixed
Status Update
Comments
jp...@google.com <jp...@google.com>
jo...@google.com <jo...@google.com> #2
Or when changing to textView.textMetricsParamsCompat still crash.
private fun setAsyncText(textView: AppCompatTextView, text: String?) {
if (!text.isNullOrEmpty()) {
val textFuture = PrecomputedTextCompat.getTextFuture(text!!, textView.textMetricsParamsCompat, null)
textView.setTextFuture(textFuture) //Crash
}
}
private fun setAsyncText(textView: AppCompatTextView, text: String?) {
if (!text.isNullOrEmpty()) {
val textFuture = PrecomputedTextCompat.getTextFuture(text!!, textView.textMetricsParamsCompat, null)
textView.setTextFuture(textFuture) //Crash
}
}
jo...@google.com <jo...@google.com> #3
add this line :
textView.setLayoutDirection(ViewCompat.getLayoutDirection(textView));
before :
setTextFuture(....)
textView.setLayoutDirection(ViewCompat.getLayoutDirection(textView));
before :
setTextFuture(....)
jo...@google.com <jo...@google.com> #4
Thanks, #3. It worked.
But I think it is better when set before this line
val textFuture = PrecomputedTextCompat.getTextFuture(text!!, textView.textMetricsParamsCompat, null)
Set android:layoutDirection="locale" or android:layoutDirection="inherit" for AppCompatTextView in the XML layout didn't this problem.
The new method btw re-set layoutDirector. Weird! This should handle in the AppcompatTextView.
private fun setAsyncText(textView: AppCompatTextView, text: String?) {
if (!text.isNullOrEmpty()) {
textView.layoutDirection = textView.layoutDirection
val textFuture = PrecomputedTextCompat.getTextFuture(text!!, textView.textMetricsParamsCompat, null)
textView.setTextFuture(textFuture) //Crash
}
}
But I think it is better when set before this line
val textFuture = PrecomputedTextCompat.getTextFuture(text!!, textView.textMetricsParamsCompat, null)
Set android:layoutDirection="locale" or android:layoutDirection="inherit" for AppCompatTextView in the XML layout didn't this problem.
The new method btw re-set layoutDirector. Weird! This should handle in the AppcompatTextView.
private fun setAsyncText(textView: AppCompatTextView, text: String?) {
if (!text.isNullOrEmpty()) {
textView.layoutDirection = textView.layoutDirection
val textFuture = PrecomputedTextCompat.getTextFuture(text!!, textView.textMetricsParamsCompat, null)
textView.setTextFuture(textFuture) //Crash
}
}
ap...@google.com <ap...@google.com> #5
Sorry. I forgot the info.
minSdk 21
targetSdk 28
Thanks #3 again.
minSdk 21
targetSdk 28
Thanks #3 again.
jo...@google.com <jo...@google.com>
an...@google.com <an...@google.com> #6
App Crash at
TextViewCompat.java:889
if (!param.equals(precomputed.getParams())) {
throw new IllegalArgumentException("Given text can not be applied to TextView.");
}
PrecomputedTextCompat.class:334
with : this.mTextDir != other.getTextDirection() == true
So,
TextDirection on TextView and TextDirection on Param is difference
maybe, it handled wrong or missing conditional on getTextDirectionHeuristic of TextViewCompat
TextViewCompat.java:889
if (!param.equals(precomputed.getParams())) {
throw new IllegalArgumentException("Given text can not be applied to TextView.");
}
PrecomputedTextCompat.class:334
with : this.mTextDir != other.getTextDirection() == true
So,
TextDirection on TextView and TextDirection on Param is difference
maybe, it handled wrong or missing conditional on getTextDirectionHeuristic of TextViewCompat
an...@google.com <an...@google.com> #7
With reference to comment #4 , issue is resolved by implementing suggested changes in comment #3 . Can you please confirm if we need to still investigate this issue ?
de...@google.com <de...@google.com> #8
Yes. textView.layoutDirection = textView.layoutDirection(>= API17) or ViewCompat.setLayoutDirection(textView, ViewCompat.getLayoutDirection(textView)) will resolve this bug.
But I think you should handle it in the AppcompatTextView. It is better. If a developer forgets testing with RTL. I think this is the nightmare(it is difficult to determine the bug) when they update their app on the Play Store.
I read this article, in the part databing he noted about set the direction
https://medium.com/google-developers/prefetch-text-layout-in-recyclerview-4acf9103f438 '
fun asyncText
..........
// first, set all measurement affecting properties of the text
// (size, locale, typeface, direction, etc)
But in the offical document isn't good (lack direction)
https://developer.android.com/reference/androidx/appcompat/widget/AppCompatTextView.html#setTextFuture(java.util.concurrent.Future%3Candroidx.core.text.PrecomputedTextCompat%3E)
Anything layout related property changes, text size, typeface, letter spacing, etc after this method call will causes IllegalArgumentException during View measurement.
My view: Handling this in the AppcompatTextView is the best choice if you can do it.
Thanks!
But I think you should handle it in the AppcompatTextView. It is better. If a developer forgets testing with RTL. I think this is the nightmare(it is difficult to determine the bug) when they update their app on the Play Store.
I read this article, in the part databing he noted about set the direction
fun asyncText
..........
// first, set all measurement affecting properties of the text
// (size, locale, typeface, direction, etc)
But in the offical document isn't good (lack direction)
Anything layout related property changes, text size, typeface, letter spacing, etc after this method call will causes IllegalArgumentException during View measurement.
My view: Handling this in the AppcompatTextView is the best choice if you can do it.
Thanks!
se...@gmail.com <se...@gmail.com> #9
I think should handle setLayoutDirection in the AppcompatTextView when setTextFuture, it will simpler for dev when implement TextFuture.
Description
We do not (yet) have a way to reproduce the problem, but we can see on go/crash an high level of report with `EXC_BAD_ACCESS` issue with
`std::__1::basic_ostream<char, std::__1::char_traits<char>>::sentry::~sentry()`
The stack doesn't see much, except that this is on M1 ( qemu-arch-aarch64, using Qt6)
```
Stack Quality26%Show frame trust levels
0x00000001aba1d40c (libc++.1.dylib + 0x0001f40c) std::__1::basic_ostream<char, std::__1::char_traits<char>>::sentry::~sentry()
0x000000010103d768 (qemu-system-aarch64 + 0x001b1768)
0x000000010103d768 (qemu-system-aarch64 + 0x001b1768)
0x0000000101447224 (qemu-system-aarch64 + 0x005bb224)
0x000000010143c138 (qemu-system-aarch64 + 0x005b0138)
0x00000001069ccc48 (libQt6CoreAndroidEmu.6.2.1.dylib + 0x00010c48)
0x00000001069ccb10 (libQt6CoreAndroidEmu.6.2.1.dylib + 0x00010b10)
0x00000001069d319c (libQt6CoreAndroidEmu.6.2.1.dylib + 0x0001719c)
0x0000000107c2ea90 (libQt6GuiAndroidEmu.6.2.1.dylib + 0x0008aa90)
0x0000000107c75c8c (libQt6GuiAndroidEmu.6.2.1.dylib + 0x000d1c8c)
0x00000001066c8a4c (libqcocoaAndroidEmu.dylib + 0x00014a4c)
0x00000001abb9da04 (CoreFoundation + 0x00081a04) __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
0x00000001abb9d998 (CoreFoundation + 0x00081998) __CFRunLoopDoSource0
0x00000001abb9d708 (CoreFoundation + 0x00081708) __CFRunLoopDoSources0
0x00000001abb9c30c (CoreFoundation + 0x0008030c) __CFRunLoopRun
0x00000001abb9b874 (CoreFoundation + 0x0007f874) CFRunLoopRunSpecific
0x00000001b527bf9c (HIToolbox + 0x00031f9c) RunCurrentEventLoopInMode
0x00000001b527bc2c (HIToolbox + 0x00031c2c) ReceiveNextEventCommon
0x00000001b527bb28 (HIToolbox + 0x00031b28) _BlockUntilNextEventMatchingListInModeWithFilter
0x00000001aee21848 (AppKit + 0x00039848) _DPSNextEvent
0x00000001aee209d8 (AppKit + 0x000389d8) -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:]
0x00000001aee14e08 (AppKit + 0x0002ce08) -[NSApplication run]
0x00000001066c792c (libqcocoaAndroidEmu.dylib + 0x0001392c)
0x0000000106a547f0 (libQt6CoreAndroidEmu.6.2.1.dylib + 0x000987f0)
0x0000000106a4bb44 (libQt6CoreAndroidEmu.6.2.1.dylib + 0x0008fb44)
0x000000010143a3f8 (qemu-system-aarch64 + 0x005ae3f8)
0x000000010103caf0 (qemu-system-aarch64 + 0x001b0af0)
0x00000001ab793e4c (dyld + 0x00005e4c) start
```
This is seen with stable 32.1.12 , after 1 week we have 2035 sample reports from 745 unique users