Make PrecomputedText Spannable for supporting selection
To support selectable TextView, make PrecomputedText spannable.
By this change, TextView start using DynamicLayout instead of
StaticLayout. DynamicLayout requires boundary rectangle of the
text, so this CL also adds getBounds method to PrecomputedText
which retrieves measured boundary box from native.
By this change, the selectable TextView performance for the
precomputed text 10x faster. On the other hand, the performacne
for the non-selectable text gets 2.5x slower. However, we concluded
that we accept this performance regression since it still 10 times
faster than non precomputed text.
Here is a precomputed text performance result of TextView.
android.widget.TextViewPrecomputedTextPerfTest:
newLayout_PrecomputedText : 736,130 -> 1,648,694: (+124.0%)
newLayout_PrecomputedText_Selectable : 17,379,765 -> 1,700,146: (-90.2%)
onDraw_PrecomputedText : 1,274,921 -> 1,848,076: (+45.0%)
onDraw_PrecomputedText_Selectable : 17,367,238 -> 1,399,169: (-91.9%)
onMeasure_PrecomputedText : 752,875 -> 1,766,606: (+134.6%)
onMeasure_PrecomputedText_Selectable : 17,647,842 -> 1,810,704: (-89.7%)
setText_PrecomputedText : 92,894 -> 135,471: (+45.8%)
setText_PrecomputedText_Selectable : 145,134 -> 215,757: (+48.7%)
Verified no effects for other performance metrics:
android.widget.TextViewPrecomputedTextPerfTest:
newLayout_RandomText : 16,495,200 -> 16,450,483: (-0.3%)
newLayout_RandomText_Selectable : 17,482,439 -> 17,534,207: (+0.3%)
onDraw_RandomText : 17,224,949 -> 17,228,072: (+0.0%)
onDraw_RandomText_Selectable : 18,067,397 -> 17,958,235: (-0.6%)
onMeasure_RandomText : 16,435,649 -> 16,516,352: (+0.5%)
onMeasure_RandomText_Selectable : 17,724,819 -> 17,879,508: (+0.9%)
setText_RandomText : 11,130 -> 11,259: (+1.2%)
setText_RandomText_Selectable : 48,900 -> 48,607: (-0.6%)
android.text.PrecomputedTextPerfTest:
create_NoStyled_Hyphenation : 17,695,377 -> 17,660,233: (-0.2%)
create_NoStyled_Hyphenation_WidthOnly : 17,677,423 -> 17,541,823: (-0.8%)
create_NoStyled_NoHyphenation : 7,021,486 -> 7,030,069: (+0.1%)
create_NoStyled_NoHyphenation_WidthOnly : 7,045,453 -> 7,067,021: (+0.3%)
create_Styled_Hyphenation : 12,090,933 -> 12,267,730: (+1.5%)
create_Styled_Hyphenation_WidthOnly : 12,105,491 -> 12,277,272: (+1.4%)
create_Styled_NoHyphenation : 11,835,249 -> 11,960,278: (+1.1%)
create_Styled_NoHyphenation_WidthOnly : 11,871,765 -> 11,912,444: (+0.3%)
android.text.StaticLayoutPerfTest:
create_PrecomputedText_NoStyled_Balanced_Hyphenation : 709,839 -> 697,134: (-1.8%)
create_PrecomputedText_NoStyled_Balanced_NoHyphenation: 527,671 -> 528,928: (+0.2%)
create_PrecomputedText_NoStyled_Greedy_Hyphenation : 477,259 -> 481,966: (+1.0%)
create_PrecomputedText_NoStyled_Greedy_NoHyphenation : 479,772 -> 482,278: (+0.5%)
create_PrecomputedText_Styled_Greedy_NoHyphenation : 639,322 -> 637,790: (-0.2%)
create_RandomText_NoStyled_Balanced_Hyphenation : 17,123,681 -> 16,989,227: (-0.8%)
create_RandomText_NoStyled_Balanced_NoHyphenation : 7,040,572 -> 7,064,175: (+0.3%)
create_RandomText_NoStyled_Greedy_Hyphenation : 7,000,681 -> 7,002,322: (+0.0%)
create_RandomText_NoStyled_Greedy_NoHyphenation : 6,997,115 -> 6,996,953: (-0.0%)
create_RandomText_Styled_Greedy_NoHyphenation : 11,948,744 -> 12,052,791: (+0.9%)
draw_PrecomputedText_NoStyled : 543,623 -> 513,741: (-5.5%)
draw_PrecomputedText_NoStyled_WithoutCache : 564,742 -> 541,795: (-4.1%)
draw_PrecomputedText_Styled : 838,581 -> 837,438: (-0.1%)
draw_PrecomputedText_Styled_WithoutCache : 826,775 -> 850,586: (+2.9%)
draw_RandomText_NoStyled : 538,162 -> 533,603: (-0.8%)
draw_RandomText_NoStyled_WithoutCache : 6,401,486 -> 6,424,604: (+0.4%)
draw_RandomText_Styled : 1,024,683 -> 1,011,575: (-1.3%)
draw_RandomText_Styled_WithoutCache : 2,733,204 -> 2,722,828: (-0.4%)
Bug: 72998298
Test: atest CtsWidgetTestCases:EditTextTest
CtsWidgetTestCases:TextViewFadingEdgeTest
FrameworksCoreTests:TextViewFallbackLineSpacingTest
FrameworksCoreTests:TextViewTest FrameworksCoreTests:TypefaceTest
CtsGraphicsTestCases:TypefaceTest CtsWidgetTestCases:TextViewTest
CtsTextTestCases FrameworksCoreTests:android.text
CtsWidgetTestCases:TextViewPrecomputedTextTest
Change-Id: I072dfd70b9a687d9c47e310d8cdb34f988fbb32e
6 files changed