In support of layout of paragraphs to non-rectangular regions, add
arrays for left and right indents to TextView, along with supporting
StaticLayout builder setters.
Bug: 20182243
Change-Id: I015bcef8f258c89001fcf8a54c179d2dfc0d7943
Ctrl+Backspace deletes preceding one word and Ctrl+ForwardDelete delets
following one word.
Used Chrome's implementation/behvior as a reference.
Bug: 17810742
Change-Id: I7b2ca515b2f017e457f7104ec7b8e7473ca4e081
The paint of a layout may be reused with other things (in particular,
it can be passed to a BoringLayout), so make sure the hyphenEdit is
zeroed out after use.
Change-Id: If58c5588af9642c3ba827acefea7895e814daab9
If SpanSet.init() is called several times in a row with different
values, it is possible to change "numberOfSpans" in a way that
will prevent SpanSet.recycle() from nulling out all the spans.
This can lead to memory leaks of large objects through spans
references. User @piwai reported this leak:
com.squareup.marketfont.MarketSpan
`-[1] of array android.text.style.CharacterStyle[]
`-spans of object android.text.SpanSet
`-mCharacterStyleSpanSet of object android.text.TextLine
`-[1] of array android.text.TextLine[]
`-sCached of class android.text.TextLine
The MarketSpan instance is kept alive through a recycled TextLine
which itself contains a SpanSet.
Change-Id: Idfb2233ca16895dbe735c312662eaf0b4a2ecd65
Loading hyphenation data on demand can cause UI jank (and can be a
strict mode violation). This patch explicitly loads the data at
Zygote init time. It also chooses /system/usr/hyphen-data as the path
for this data.
Bug: 20060770
Change-Id: Idac68e3971f8638f1d70960594bf6c1050bb23d6
This patch adds plumbing to TextView to control the strategy used
for breaking paragraphs into lines.
The default for TextView is "quality", while the default for EditText
is "simple", largely to avoid too much re-layout when editing.
StaticLayout now has a builder which provides access to more
functionality and is also cleaner than the old mechanism of having
lots of constructors with varying numbers of arguments. This patch
changes TextView to use that builder, and also contains cleanups
of the Builder within StaticLayout.
Change-Id: Iee3cf3a05a3e51ba0834554e4a3ec606e9cabca5
This reverts commit 5a6eeb3cbe and
fixes the underlying issue (needed to @hide getHyphen() for subclasses
of Layout, not just the base class), and layoutlib changes for
checkbuild.
Change-Id: I7a2b5f20ae014ea8e224d8c4079cf9131e17e1c1
This patch plumbs up hyphens computed in Minikin's LineBreaker,
records them in a new column in StaticLayout, and draws them.
DynamicLayout mirrors the new column, and TextLine is also changed to
make sure the hyphen is only drawn for the last run in a line.
There is a rather primitive mechanism for loading hyphenation
patterns, for testing only at this point.
Change-Id: Ib208568c0f6cff12cf834047500ec1da9ea9f430
This patch moves the calculation of line breaks for StaticLayout into
the new LineBreaker class provided by Minikin. This specific patch
should preserve existing functionality, but perhaps performance is
better, and the movement opens the door to much more sophisticated
line-breaking.
Change-Id: Iafccb9da4e3559bbeaeb2c7c85f86ddfd8ae2fa1
Previously, after the first paragraph, the the detected bidi
direction of the text in the last paragraph was used, nstead of the
detected bidi direction of the current one.
Bug: 12027356
Change-Id: I51622a3156f1e321f53f7ca1855bc37aa6f77319
Use span properties to detect:
* Composing text - don't record undo operations
* Completing a composition - record an insert undo operation
* Canceling a composition - don't record
Save the composition state on parcel/unparcel.
Stop using begin/end batch edit to try to detect when a TextWatcher
is modifying the text. IMEs trigger multiple InputFilter passes in
a single batch edit. Use SpannableStringBuilder to determine when
we're in a TextWatcher callback because it is the authority on that
state.
Fix a bug in undo manager where it doesn't forget undos correctly if
there are more than one in the stack.
Bug: 19332904
Change-Id: Iaa9b0b2a7bf6683302cc85e7616e5d5fcc9fa202
The comparator's equal implementation doesn't satisfy the constraints
of an equals method, namely being reflexive. Use the standard Object
implementation instead.
Bug: 19797138
Change-Id: I74f888e99533e1945aab7ab10fe8ee3ded6388f4
We want to move text measurement into native code, mostly so that
alternate measurement for hyphens can be performant. This patch begins
that migration, in the main StaticLayout case, but still surfaces the
widths array to Java (for ellipsis calculation), and also includes a
hack (used mostly for testing) for computing widths in Java and sending
them down to native code when TextPaint is subclassed.
Change-Id: I476c9e8b3aa8e4e3552eb18f66c4bcd5683f3a72
The "moreChars" predicate (which is used in ellipsis computation) was
slightly incorrect, sometimes being computed as false when the line
break is at the end of a paragraph but not the end of the buffer.
This patch makes the behavior consistent with shipping versions.
Bug: 19676414
Change-Id: I72e16794e895c2eb765b21feaf59fcdccc4857f1
This patch adds a native C++ Builder object for StaticLayout to
complement the Java one introduced in a previous patch.
The Builder object contains state used in constructing a layout, as well
as temporary buffers, to avoid having to allocate such. In particular,
it holds a break iterator, so avoids the cost of constructing that in
the common case of a single locale.
Change-Id: I1125103b7ccf00b8674c1586c3ea8d5d915fdd5b
This patch refactors construction of StaticLayout to use an explicit
Builder object, which is intended to hold state used for constructing
the layout but not needed for merely reading out the results.
Builder objects are allocated from a pool and explicitly recycled,
so there is insignificant additional allocation cost.
This patch has very little impact on performance (it does avoid
allocating a FontMetricsInt object) but opens the way for significant
performance and functionality improvements as more of the Builder
functionality migrates to native code.
Change-Id: I2a576643e573a38b61f895a80d5d92a85c94b6b4
Explain that we are using WebView#findAddresses() which is
limited to US addresses at the moment (at least according
to its documentation), among various other limitations.
Bug: 5847264
Change-Id: If86c6d7c11cc080f0fe3401ffb7bce8068c6016f
This CL greatly improves the speed of SpannableStringBuilder by storing
the spans as an interval tree with binary search.
Bug: 7404182
Change-Id: I2540b2cfe8aef128337e63829479660ba51e62b5
Rewrite the DateUtils' relative time formatting APIs
(getRelativeTimeSpanString, getRelativeDateTimeString) to use ICU ones.
Two APIs that take withPreposition parameter are not changed. Because
(a) ICU doesn't provide functionality to format preposition; (b) They
are not really computing relative time but instead calling
formatDateRange() to get the absolute time/date string.
Bug: 19146457
Bug: 5252772
Change-Id: Iea8d699d63cc4438513910da66d038912e44fb8d
This works around a bug in standalone (e.g. non-Zygote)
runtimes when a device is attached to a host that is running
DDM.
There is a race condition:
When the runtime receives a HELLO from DDM it calls
TextUtils.isEmpty().
Calling any TextUtils methods statically initializes
Layout. Layout has dependencies on other classes, which in
turn have dependencies on native methods that are not always
registered when the call takes place. Registration and DDM
handling are done in separate threads.
This is not a fix, merely a workaround until the race can
be resolved.
Bug: 18081539
(cherry-picked from commit d29bdb266d)
Change-Id: Id0d8578eab9e59d479a7c1b2e7ea1890ac0c8de6
This works around a bug in standalone (e.g. non-Zygote)
runtimes when a device is attached to a host that is running
DDM.
There is a race condition:
When the runtime receives a HELLO from DDM it calls
TextUtils.isEmpty().
Calling any TextUtils methods statically initializes
Layout. Layout has dependencies on other classes, which in
turn have dependencies on native methods that are not always
registered when the call takes place. Registration and DDM
handling are done in separate threads.
This is not a fix, merely a workaround until the race can
be resolved.
Bug: 18081539
Change-Id: If1bd3de6597bc93da381c8f86dacf40156449561
All supported locales use only U+2025 and U+2026 to represent
ellipses, and it will unlikely change in future. Given translated
resources are inconsistent and often use three dots it is safer
to use constants instead of resources.
(cherry-pick of ed0daa93e48d38e54a7ad1c99c461510a4c07599.)
Bug: 18542179
Change-Id: I51a6cb903f62f739fbadd6b78e5765c0028d641a