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
One SuggestionSpan constructor provide null as the default context.
This will always create an NPE in initStyle. Prevent this.
Change-Id: Ic2acffd2c8b9cda9c99b689d1b1a7f15d17b65d0
Using a SpanSet to minimize the number the calls to getSpans.
This is a cherry pick of 145653 in ICS-MR1
Change-Id: I0a6e1fc7bd7a89325c2925bf98d59626d5e12995
Measuring line widths, glyph by glyph slows down the scrolling
process for long text (for some reason, width measure efficiency
is affectedi by text length, maybe because the whole text has to
be passed to JNI layers).
This optimization avoids this computation in the case where there
is no possible horizontal scroll.
This is a cherry pick of 145957 into ICS-MR1
Change-Id: I2082e3d0eedace1a86122a03e4b21f90f3bc8522