An editable TextView caches text rendering inside an adaptive
number of sub display lists. The bounds of these use to be those
of the entire View.
This CL creates block display lists with tighten bounds, so that
(a still-to-be-implemented) quick rejection can occur.
Also cleaned-up the contradictory translations that were used to
handle the TextView's internal scroll and removed the invalidation
of display lists in that case.
TODO: When internal scroll sets a tighter clipping rect, quick
reject the creation and display of the clipped display lists.
Also renamed blockEnds to a more explicit blockEndLines.
Change-Id: I7d79bea78d06d19b6935aef75ff7aa7df2594050
Bug 6344997
The early exit we used to do when both replaced and replacement
strings were empty has been added back.
Only this time it correctly also makes sure no spans from the
replacement string would get added with a 0-length.
Change-Id: Ifc38a7e3619c57aa7647c0a8e63d7627d86f1036
Found while tracking bug 6326750
A bug in the SpannableStringBuilderSpanTest JUnit CTS test was hiding
this problem.
Also removed the instanceof test on SpanWatcher. All spans, including
those implementing this interface should be copied.
Change-Id: I5233818fb0c08ab56477720db932a5be453e88ee
When using the clipboard, ACTION_SEND, etc., you can now supply
HTML formatted text as one of the representations. This is exposed
as a set of methods on ClipData for building items with HTML
formatted text, and retrieving and coercing to HTML (and styled)
text. In addtion, there is a new EXTRA_HTML_TEXT for interoperating
with the old ACTION_SEND protocol.
Change-Id: I8846520a480c8a5f829ec1e693aeebd425ac170d
Bug 6331765
A call to replace was previously not sending any span modification to the
attached span watchers.
Change-Id: Ic9e4a8ac0210e422961adfb18e205d80531889fe
This is a new version of CL 179343 which had to be reverted.
This problem of the previous CL is that the ComposingSpan that
was part of the replacement text was correctly added during the
replace but was immediately removed because it had a zero-length
size.
Swapping the add and remove blocks solves the problem.
The new non-zero length enforcement also revealed a bug in the
spell checker where we were creating useless range spans.
Change-Id: I59cebd4708af3becc7ab625ae41bc36837f1a1cf
Bug 6300658
This change reveals a weird race condition where sometimes the
text is entered twice. Adding a debugger slows down everything,
and the problem is no longer reproducable. Reverting for now.
This reverts commit ebd9a23817.
The original method was adding a suspicious space that was eventually
removed with a series of 3 calls to change.
This should not be necessary. I have tested this with various gap
positions and lengths, for all replace cases I could think of.
The test can not be added to the CTS as it would need to expose the
internal resizeFor and moveGapTo methods.
Change-Id: I194457fbcfd758fa69a7f380665cfd5ae4d3f1d4
Made TextWatcher notification process clearer by moving it to
a single place, with methods renamed.
Also reverts CL 177544: we cannot broadcast span chages just yet,
the layout has not been reflown. A future CL will change this
behavior to make sure span changes are correctly broadcasted.
Change-Id: I9ef88dce91dff5f5f45e2845d5b3f18f1c853de3
Bug 5763685
Long text in a ScrollView (not when the View's internal
scroll is used) is cached as a unique display list when hardware
rendering is on.
As a result, each time the text is edited, the entire display
list has to be updated, which takes a significant amount of
time (up to 500ms for a few thousand lines), proportional to the
size of the text.
This CL splits the text into multiple display lists as the
text is edited. The boundaries of the display list are aligned
with paragraphs.
There is still an issue when the number of lines changes: onLayout()
is called which invalidates all the display list. When the source
of that change is line wrapping and not a change in the view's
dimensions, we should be able to simply shift down the previous DL
instead of re-creating everything.
Change-Id: I7de49a1e5637cdfc9ef06b64b1ec4b61d9ea2415
The main performance improvement should come from the fact
that we entirely skip the loop (which calls getLineStart, getLineTop
and getLineDescent on each line) in the frequent case where there
are no LineBackgroundSpans.
Change-Id: Ie2d3168521e88d43f1a4236da2b3e8447606df1e
Decorelate background and text in layout display. This allows
to only store the text in the editable TextView's display list.
Selection and cursor changes no longer need to invalidate the
display list, leading to faster rendering.
Change-Id: I3af3a98846e1bfe2d9ec6c42590e71bf3704595e
Bug 5509226
Change ellipsize bounds to take spaces into account
The hardcoded ' ' character may be problematic with other langages.
Note that a different ellipsize logic also exists in StaticLayout.
Created 6062415 to track this.
Change-Id: I3406ec23a592f952bf3e0ca68f0838ee807baba0
Bug 5916225
Duplicates were removed when received from SpellChecker, in a way
that could move the top candidates lower in the list.
Moved that code to the part that creates the actual suggestion list,
to make it more generic. The order of the first SuggestionSpan is
guaranteed to be respected.
Also mentionned non null suggestions and fixed a problem in SuggestionSpan
constructor.
Change-Id: Iaa3b1b84ae512451e439e5c5e63448c2a19145b5
Bug 5753061
https://android-git.corp.google.com/g/#/c/154756/1 revealed an
other bug in SpanSet. The fitered (non empty) spans were added
in their original position instead of being indexed by count.
The nullation on recycle hence left null holes in the array.
Change-Id: If5c1435cee9a2cb88a608aa8e5f4f2f23382154c
Bug 5740435
The new SpanSet cached objects should be recycled when the TextLine is
recycled to prevent a reference to their span, which may lead to the
entire activity.
Change-Id: I4469e418a228bd71eb8be1d43ed86de49baba165
TextLine objects are already stored in a pool to limit allocation.
Associate SpanSet objects to each TextLine to further limit the
allocation of these and re-use their internal arrays (re-sized if needed).
Drastically reduces new objects allocation during rendering.
Priority code removed in init: priorities are already handled by getSpans.
This is a duplicate of the already accepted
https://android-git.corp.google.com/g/#/c/153970/
but without the dependency on an other CL.
Change-Id: Iaa7e2f7a8ea4337c8d60c3a9a620e9e3e60caf12