This takes utility functions from Styled and a few other classes and
incorporates them into two new utility classes, TextLine and
MeasuredText. The main point of this is to support shaping by skia,
to experiment with how this will look, this also introduces
character-based Arabic shaping.
MeasuredText is used by code that determines line breaks by generating
and examining character widths in logical order. Factoring the code
in this way makes it usable by the ellipsize functions in TextUtils as
well as by StaticLayout. This class takes over the caching of widths
and chars arrays that was previously performed by StyledText. A small
number of MeasuredText objects are themselves cached by the class and
accesed using static obtain and recycle methods. Generally only these
few cached instances are ever created.
TextLine is used by code that draws or measures text on a line. This
unifies the line measuring and rendering code, and pushes assumptions
about how rtl text is treated closer to the points where skia code is
invoked. TextLine implements the functions that were previously
provided by Styled, working on member arrays rather than
explicitly-passed arguments. It implements the same kind of static
cache as MeasuredText.
TextLine and MeasureText simulate arabic glyph generation and shaping
by using ArabicShaping, ported with very minor changes from ICU4J's
ArabicShaping. This class generates shaped Arabic glyphs and Lam-Alef
ligatures using Unicode presentation forms. ArabicShaping is not
intended to be permanent, but to be replaced by real shaping from the
skia layer. It is introduced in order to emulate the behavior of real
shaping so that higher level code dealing with rendering shaped text
and cursor movement over ligatures can be developed and tested; it
also provides basic-level support for Arabic.
Since cursor movement depends on conjuncts whose formation is
font-dependent, cursor movement code that was formerly in Layout and
StaticLayout was moved into TextLine so that it can work on the shaped
text.
Other than these changes, the other major change is a rework of the
ellipsize utility functions to combine multiple branches into fewer
branches with additional state.
Updated copyright notices on new files.
Change-Id: I492cb58b51f5aaf6f14cb1419bdbed49eac5ba29
Merge commit 'dbad286c4640ab7d2244695c5b175ebd1b6fcbab' into kraken
* commit 'dbad286c4640ab7d2244695c5b175ebd1b6fcbab':
Per requested by API council, rename MediaScannerConneciton.ScanResultListener to .OnScanCompletedListener
Merge commit '25c2dd60d43298c18b9459abd6ff33046d675fe6' into froyo-plus-aosp
* commit '25c2dd60d43298c18b9459abd6ff33046d675fe6':
Per requested by API council, rename MediaScannerConneciton.ScanResultListener to .OnScanCompletedListener
Merge commit 'd66e2b23a5c6b4b2b6586015c1a6951b4d6d1bfa' into kraken
* commit 'd66e2b23a5c6b4b2b6586015c1a6951b4d6d1bfa':
Maybe fix issue #2568615: System server crashed in SyncStorageEngine
Merge commit '4e7cacd3e44bd222a7892113336caff571a9983a' into froyo-plus-aosp
* commit '4e7cacd3e44bd222a7892113336caff571a9983a':
Maybe fix issue #2568615: System server crashed in SyncStorageEngine
Merge commit '2a9ec9869ee0fb8112426f85a85dffd966a2fa97' into kraken
* commit '2a9ec9869ee0fb8112426f85a85dffd966a2fa97':
Search for focusable views only after layout has happened when the window is first created.
Merge commit '7b70f6589205dec10afdb358b7ddef7aa61b7dd8' into froyo-plus-aosp
* commit '7b70f6589205dec10afdb358b7ddef7aa61b7dd8':
Search for focusable views only after layout has happened when the window is first created.
Merge commit 'efaee761022305d74e63237d87809582514bd5e2' into kraken
* commit 'efaee761022305d74e63237d87809582514bd5e2':
Show the microphone when the search box is opened from browser
Merge commit '083c715d06a99951429b38c62484f8c3caf43cd1' into froyo-plus-aosp
* commit '083c715d06a99951429b38c62484f8c3caf43cd1':
Show the microphone when the search box is opened from browser
Fix for http://b/issue?id=2549036
Also required moving the call to updateWidgetState to after the
update of mUserQuery so mUserQuery could be used as a comparison.
Change-Id: I4996f09c02751a6d74e8f517669025e4bdd709d8
Merge commit '93720cad0c2905e7d0a80aee154684396d8b0ed1' into kraken
* commit '93720cad0c2905e7d0a80aee154684396d8b0ed1':
Add more WindowManager flags to ViewDebug.
Merge commit 'c957ebef9755d15f92c27d690641995587c0ba2f' into froyo-plus-aosp
* commit 'c957ebef9755d15f92c27d690641995587c0ba2f':
Add more WindowManager flags to ViewDebug.
Merge commit 'aa94842c1ad16298e27adf07701bf0bb792e0a51' into kraken
* commit 'aa94842c1ad16298e27adf07701bf0bb792e0a51':
Comment-only change to clarify the role and use of IntentService
Merge commit '9807d6a5b7d27f438d0bd30389c5930e3fe389d8' into froyo-plus-aosp
* commit '9807d6a5b7d27f438d0bd30389c5930e3fe389d8':
Comment-only change to clarify the role and use of IntentService
Merge commit '140d040b6a5d2dc01e999e6f7b69863c71b2272b' into kraken
* commit '140d040b6a5d2dc01e999e6f7b69863c71b2272b':
Pass cookie to TOKEN_CONTACT_INFO so that QuickContact without photo works again
Merge commit 'd8b9b511821a06d86b3ffaab0d71ee9ce3834678' into froyo-plus-aosp
* commit 'd8b9b511821a06d86b3ffaab0d71ee9ce3834678':
Pass cookie to TOKEN_CONTACT_INFO so that QuickContact without photo works again
This is a fix for http://code.google.com/p/android/issues/detail?id=907. Note that
that issue was declined without comment, but the bug (while incredibly minor)
does exist. This can be seen on the facebook app, as well as many third party apps.
Change-Id: I8f1449c47228f5f757a5baf389656e51c817b150
Merge commit '92b46ffb2c0c9f2bf6700f7004b26bf952bce1ae' into kraken
* commit '92b46ffb2c0c9f2bf6700f7004b26bf952bce1ae':
Correctly resize dialogs when measured in WRAP_CONTENT
Merge commit 'bd4808dccf8cd3e5d8e96e667fa435a6c68e0f7c' into froyo-plus-aosp
* commit 'bd4808dccf8cd3e5d8e96e667fa435a6c68e0f7c':
Correctly resize dialogs when measured in WRAP_CONTENT
Bug #2549649
If the window had a different size than its content but the content had already
been measured with the appropriate size, the window would not be resized. This
happens in wrap_content windows (dialogs.) This change simply adds a new codition
to window resizing: if the window is wrap_content, not as big as it can be and
not as big as its content, it gets resized.
Change-Id: I1d82d03af5a15c9ad8dffa0511d5f6d522578285