diff options
| author | 2018-03-07 21:02:37 +0000 | |
|---|---|---|
| committer | 2018-03-07 21:02:37 +0000 | |
| commit | a4d970ea4022998bb55ef4f50cfc576cc2ca76fa (patch) | |
| tree | b7476bc454f6b27b5700e70c7f0e8eb2fe1837e3 | |
| parent | 9c345022d1e4215c3a33942deb34305df24966d7 (diff) | |
| parent | e1ffb54167c8ff78855352a324ff8332a33fc805 (diff) | |
Merge "Throw an exception in case of parameter mismatch of precomputed text" into pi-dev
| -rw-r--r-- | core/java/android/text/PrecomputedText.java | 20 | ||||
| -rw-r--r-- | core/java/android/widget/TextView.java | 24 |
2 files changed, 42 insertions, 2 deletions
diff --git a/core/java/android/text/PrecomputedText.java b/core/java/android/text/PrecomputedText.java index c211e2dba3c0..b74019373f57 100644 --- a/core/java/android/text/PrecomputedText.java +++ b/core/java/android/text/PrecomputedText.java @@ -211,7 +211,8 @@ public class PrecomputedText implements Spanned { return mHyphenationFrequency; } - private boolean isSameTextMetricsInternal(@NonNull TextPaint paint, + /** @hide */ + public boolean isSameTextMetricsInternal(@NonNull TextPaint paint, @NonNull TextDirectionHeuristic textDir, @Layout.BreakStrategy int strategy, @Layout.HyphenationFrequency int frequency) { return mTextDir == textDir @@ -247,6 +248,23 @@ public class PrecomputedText implements Spanned { mPaint.getFontVariationSettings(), mPaint.isElegantTextHeight(), mTextDir, mBreakStrategy, mHyphenationFrequency); } + + @Override + public String toString() { + return "{" + + "textSize=" + mPaint.getTextSize() + + ", textScaleX=" + mPaint.getTextScaleX() + + ", textSkewX=" + mPaint.getTextSkewX() + + ", letterSpacing=" + mPaint.getLetterSpacing() + + ", textLocale=" + mPaint.getTextLocales() + + ", typeface=" + mPaint.getTypeface() + + ", variationSettings=" + mPaint.getFontVariationSettings() + + ", elegantTextHeight=" + mPaint.isElegantTextHeight() + + ", textDir=" + mTextDir + + ", breakStrategy=" + mBreakStrategy + + ", hyphenationFrequency=" + mHyphenationFrequency + + "}"; + } }; // The original text. diff --git a/core/java/android/widget/TextView.java b/core/java/android/widget/TextView.java index 6e40ea85e34a..d358c95ba09b 100644 --- a/core/java/android/widget/TextView.java +++ b/core/java/android/widget/TextView.java @@ -4141,6 +4141,7 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener */ public void setTextMetricsParams(@NonNull PrecomputedText.Params params) { mTextPaint.set(params.getTextPaint()); + mUserSetTextScaleX = true; mTextDir = params.getTextDirection(); mBreakStrategy = params.getBreakStrategy(); mHyphenationFrequency = params.getHyphenationFrequency(); @@ -5528,9 +5529,16 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener * {@link android.text.Editable.Factory} to create final or intermediate * {@link Editable Editables}. * + * If the passed text is a {@link PrecomputedText} but the parameters used to create the + * PrecomputedText mismatches with this TextView, IllegalArgumentException is thrown. To ensure + * the parameters match, you can call {@link TextView#setTextMetricsParams} before calling this. + * * @param text text to be displayed * * @attr ref android.R.styleable#TextView_text + * @throws IllegalArgumentException if the passed text is a {@link PrecomputedText} but the + * parameters used to create the PrecomputedText mismatches + * with this TextView. */ @android.view.RemotableViewMethod public final void setText(CharSequence text) { @@ -5644,7 +5652,21 @@ public class TextView extends View implements ViewTreeObserver.OnPreDrawListener if (imm != null) imm.restartInput(this); } else if (type == BufferType.SPANNABLE || mMovement != null) { text = mSpannableFactory.newSpannable(text); - } else if (!(text instanceof PrecomputedText || text instanceof CharWrapper)) { + } else if (text instanceof PrecomputedText) { + PrecomputedText precomputed = (PrecomputedText) text; + if (mTextDir == null) { + mTextDir = getTextDirectionHeuristic(); + } + if (!precomputed.getParams().isSameTextMetricsInternal( + getPaint(), mTextDir, mBreakStrategy, mHyphenationFrequency)) { + throw new IllegalArgumentException( + "PrecomputedText's Parameters don't match the parameters of this TextView." + + "Consider using setTextMetricsParams(precomputedText.getParams()) " + + "to override the settings of this TextView: " + + "PrecomputedText: " + precomputed.getParams() + + "TextView: " + getTextMetricsParams()); + } + } else if (!(text instanceof CharWrapper)) { text = TextUtils.stringOrSpannedString(text); } |