869 lines
29 KiB
Java
869 lines
29 KiB
Java
![]() |
/*
|
||
|
* Copyright (C) 2022 The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
package android.view.inputmethod;
|
||
|
|
||
|
import static android.graphics.Typeface.NORMAL;
|
||
|
|
||
|
import android.annotation.ColorInt;
|
||
|
import android.annotation.IntRange;
|
||
|
import android.annotation.NonNull;
|
||
|
import android.annotation.Nullable;
|
||
|
import android.annotation.Px;
|
||
|
import android.graphics.Paint;
|
||
|
import android.graphics.Typeface;
|
||
|
import android.graphics.fonts.FontStyle;
|
||
|
import android.graphics.text.LineBreakConfig;
|
||
|
import android.inputmethodservice.InputMethodService;
|
||
|
import android.os.LocaleList;
|
||
|
import android.os.Parcel;
|
||
|
import android.os.Parcelable;
|
||
|
import android.text.Spanned;
|
||
|
import android.text.TextPaint;
|
||
|
import android.text.method.TransformationMethod;
|
||
|
import android.text.style.CharacterStyle;
|
||
|
import android.widget.TextView;
|
||
|
|
||
|
import java.util.Objects;
|
||
|
|
||
|
/**
|
||
|
* Information about text appearance in an editor, passed through
|
||
|
* {@link CursorAnchorInfo} for use by {@link InputMethodService}.
|
||
|
* @see TextView
|
||
|
* @see Paint
|
||
|
* @see CursorAnchorInfo.Builder#setTextAppearanceInfo(TextAppearanceInfo)
|
||
|
* @see CursorAnchorInfo#getTextAppearanceInfo()
|
||
|
*/
|
||
|
public final class TextAppearanceInfo implements Parcelable {
|
||
|
/**
|
||
|
* The text size (in pixels) for current editor.
|
||
|
*/
|
||
|
private final @Px float mTextSize;
|
||
|
|
||
|
/**
|
||
|
* The {@link LocaleList} of the text.
|
||
|
*/
|
||
|
@NonNull private final LocaleList mTextLocales;
|
||
|
|
||
|
/**
|
||
|
* The font family name if the {@link Typeface} of the text is created from a system font
|
||
|
* family, otherwise this value should be null.
|
||
|
*/
|
||
|
@Nullable private final String mSystemFontFamilyName;
|
||
|
|
||
|
/**
|
||
|
* The weight of the text.
|
||
|
*/
|
||
|
@IntRange(from = FontStyle.FONT_WEIGHT_UNSPECIFIED, to = FontStyle.FONT_WEIGHT_MAX)
|
||
|
private final int mTextFontWeight;
|
||
|
|
||
|
/**
|
||
|
* The style (normal, bold, italic, bold|italic) of the text, see {@link Typeface}.
|
||
|
*/
|
||
|
private final @Typeface.Style int mTextStyle;
|
||
|
|
||
|
/**
|
||
|
* Whether the transformation method applied to the current editor is set to all caps.
|
||
|
*/
|
||
|
private final boolean mAllCaps;
|
||
|
|
||
|
/**
|
||
|
* The horizontal offset (in pixels) of the text shadow.
|
||
|
*/
|
||
|
private final @Px float mShadowDx;
|
||
|
|
||
|
/**
|
||
|
* The vertical offset (in pixels) of the text shadow.
|
||
|
*/
|
||
|
private final @Px float mShadowDy;
|
||
|
|
||
|
/**
|
||
|
* The blur radius (in pixels) of the text shadow.
|
||
|
*/
|
||
|
private final @Px float mShadowRadius;
|
||
|
|
||
|
/**
|
||
|
* The shadow color of the text shadow.
|
||
|
*/
|
||
|
private final @ColorInt int mShadowColor;
|
||
|
|
||
|
/**
|
||
|
* The elegant text height, especially for less compacted complex script text.
|
||
|
*/
|
||
|
private final boolean mElegantTextHeight;
|
||
|
|
||
|
/**
|
||
|
* Whether to expand linespacing based on fallback fonts.
|
||
|
*/
|
||
|
private final boolean mFallbackLineSpacing;
|
||
|
|
||
|
/**
|
||
|
* The text letter-spacing (in ems), which determines the spacing between characters.
|
||
|
*/
|
||
|
private final float mLetterSpacing;
|
||
|
|
||
|
/**
|
||
|
* The font feature settings.
|
||
|
*/
|
||
|
@Nullable private final String mFontFeatureSettings;
|
||
|
|
||
|
/**
|
||
|
* The font variation settings.
|
||
|
*/
|
||
|
@Nullable private final String mFontVariationSettings;
|
||
|
|
||
|
/**
|
||
|
* The line-break strategies for text wrapping.
|
||
|
*/
|
||
|
private final @LineBreakConfig.LineBreakStyle int mLineBreakStyle;
|
||
|
|
||
|
/**
|
||
|
* The line-break word strategies for text wrapping.
|
||
|
*/
|
||
|
private final @LineBreakConfig.LineBreakWordStyle int mLineBreakWordStyle;
|
||
|
|
||
|
/**
|
||
|
* The extent by which text should be stretched horizontally. Returns 1.0 if not specified.
|
||
|
*/
|
||
|
private final float mTextScaleX;
|
||
|
|
||
|
/**
|
||
|
* The color of the text selection highlight.
|
||
|
*/
|
||
|
private final @ColorInt int mHighlightTextColor;
|
||
|
|
||
|
/**
|
||
|
* The current text color of the editor.
|
||
|
*/
|
||
|
private final @ColorInt int mTextColor;
|
||
|
|
||
|
/**
|
||
|
* The current color of the hint text.
|
||
|
*/
|
||
|
private final @ColorInt int mHintTextColor;
|
||
|
|
||
|
/**
|
||
|
* The text color used to paint the links in the editor.
|
||
|
*/
|
||
|
private final @ColorInt int mLinkTextColor;
|
||
|
|
||
|
private TextAppearanceInfo(@NonNull final TextAppearanceInfo.Builder builder) {
|
||
|
mTextSize = builder.mTextSize;
|
||
|
mTextLocales = builder.mTextLocales;
|
||
|
mSystemFontFamilyName = builder.mSystemFontFamilyName;
|
||
|
mTextFontWeight = builder.mTextFontWeight;
|
||
|
mTextStyle = builder.mTextStyle;
|
||
|
mAllCaps = builder.mAllCaps;
|
||
|
mShadowDx = builder.mShadowDx;
|
||
|
mShadowDy = builder.mShadowDy;
|
||
|
mShadowRadius = builder.mShadowRadius;
|
||
|
mShadowColor = builder.mShadowColor;
|
||
|
mElegantTextHeight = builder.mElegantTextHeight;
|
||
|
mFallbackLineSpacing = builder.mFallbackLineSpacing;
|
||
|
mLetterSpacing = builder.mLetterSpacing;
|
||
|
mFontFeatureSettings = builder.mFontFeatureSettings;
|
||
|
mFontVariationSettings = builder.mFontVariationSettings;
|
||
|
mLineBreakStyle = builder.mLineBreakStyle;
|
||
|
mLineBreakWordStyle = builder.mLineBreakWordStyle;
|
||
|
mTextScaleX = builder.mTextScaleX;
|
||
|
mHighlightTextColor = builder.mHighlightTextColor;
|
||
|
mTextColor = builder.mTextColor;
|
||
|
mHintTextColor = builder.mHintTextColor;
|
||
|
mLinkTextColor = builder.mLinkTextColor;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates a new instance of {@link TextAppearanceInfo} by extracting text appearance from the
|
||
|
* character before cursor in the target {@link TextView}.
|
||
|
* @param textView the target {@link TextView}.
|
||
|
* @return the new instance of {@link TextAppearanceInfo}.
|
||
|
* @hide
|
||
|
*/
|
||
|
@NonNull
|
||
|
public static TextAppearanceInfo createFromTextView(@NonNull TextView textView) {
|
||
|
final int selectionStart = textView.getSelectionStart();
|
||
|
final CharSequence text = textView.getText();
|
||
|
TextPaint textPaint = new TextPaint();
|
||
|
textPaint.set(textView.getPaint()); // Copy from textView
|
||
|
if (text instanceof Spanned && text.length() > 0 && selectionStart > 0) {
|
||
|
// Extract the CharacterStyle spans that changes text appearance in the character before
|
||
|
// cursor.
|
||
|
Spanned spannedText = (Spanned) text;
|
||
|
int lastCh = selectionStart - 1;
|
||
|
CharacterStyle[] spans = spannedText.getSpans(lastCh, lastCh, CharacterStyle.class);
|
||
|
if (spans != null) {
|
||
|
for (CharacterStyle span: spans) {
|
||
|
// Exclude spans that end at lastCh
|
||
|
if (spannedText.getSpanStart(span) <= lastCh
|
||
|
&& lastCh < spannedText.getSpanEnd(span)) {
|
||
|
span.updateDrawState(textPaint); // Override the TextPaint
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
Typeface typeface = textPaint.getTypeface();
|
||
|
String systemFontFamilyName = null;
|
||
|
int textWeight = FontStyle.FONT_WEIGHT_UNSPECIFIED;
|
||
|
int textStyle = Typeface.NORMAL;
|
||
|
if (typeface != null) {
|
||
|
systemFontFamilyName = typeface.getSystemFontFamilyName();
|
||
|
textWeight = typeface.getWeight();
|
||
|
textStyle = typeface.getStyle();
|
||
|
}
|
||
|
TextAppearanceInfo.Builder builder = new TextAppearanceInfo.Builder();
|
||
|
builder.setTextSize(textPaint.getTextSize())
|
||
|
.setTextLocales(textPaint.getTextLocales())
|
||
|
.setSystemFontFamilyName(systemFontFamilyName)
|
||
|
.setTextFontWeight(textWeight)
|
||
|
.setTextStyle(textStyle)
|
||
|
.setShadowDx(textPaint.getShadowLayerDx())
|
||
|
.setShadowDy(textPaint.getShadowLayerDy())
|
||
|
.setShadowRadius(textPaint.getShadowLayerRadius())
|
||
|
.setShadowColor(textPaint.getShadowLayerColor())
|
||
|
.setElegantTextHeight(textPaint.isElegantTextHeight())
|
||
|
.setLetterSpacing(textPaint.getLetterSpacing())
|
||
|
.setFontFeatureSettings(textPaint.getFontFeatureSettings())
|
||
|
.setFontVariationSettings(textPaint.getFontVariationSettings())
|
||
|
.setTextScaleX(textPaint.getTextScaleX())
|
||
|
// When there is a hint text (text length is 0), the text color should be the normal
|
||
|
// text color rather than hint text color.
|
||
|
.setTextColor(text.length() == 0
|
||
|
? textView.getCurrentTextColor() : textPaint.getColor())
|
||
|
.setLinkTextColor(textPaint.linkColor)
|
||
|
.setAllCaps(textView.isAllCaps())
|
||
|
.setFallbackLineSpacing(textView.isFallbackLineSpacing())
|
||
|
.setLineBreakStyle(textView.getLineBreakStyle())
|
||
|
.setLineBreakWordStyle(textView.getLineBreakWordStyle())
|
||
|
.setHighlightTextColor(textView.getHighlightColor())
|
||
|
.setHintTextColor(textView.getCurrentHintTextColor());
|
||
|
return builder.build();
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public int describeContents() {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void writeToParcel(@NonNull Parcel dest, int flags) {
|
||
|
dest.writeFloat(mTextSize);
|
||
|
mTextLocales.writeToParcel(dest, flags); // NonNull
|
||
|
dest.writeBoolean(mAllCaps);
|
||
|
dest.writeString8(mSystemFontFamilyName);
|
||
|
dest.writeInt(mTextFontWeight);
|
||
|
dest.writeInt(mTextStyle);
|
||
|
dest.writeFloat(mShadowDx);
|
||
|
dest.writeFloat(mShadowDy);
|
||
|
dest.writeFloat(mShadowRadius);
|
||
|
dest.writeInt(mShadowColor);
|
||
|
dest.writeBoolean(mElegantTextHeight);
|
||
|
dest.writeBoolean(mFallbackLineSpacing);
|
||
|
dest.writeFloat(mLetterSpacing);
|
||
|
dest.writeString8(mFontFeatureSettings);
|
||
|
dest.writeString8(mFontVariationSettings);
|
||
|
dest.writeInt(mLineBreakStyle);
|
||
|
dest.writeInt(mLineBreakWordStyle);
|
||
|
dest.writeFloat(mTextScaleX);
|
||
|
dest.writeInt(mHighlightTextColor);
|
||
|
dest.writeInt(mTextColor);
|
||
|
dest.writeInt(mHintTextColor);
|
||
|
dest.writeInt(mLinkTextColor);
|
||
|
}
|
||
|
|
||
|
TextAppearanceInfo(@NonNull Parcel in) {
|
||
|
mTextSize = in.readFloat();
|
||
|
mTextLocales = LocaleList.CREATOR.createFromParcel(in);
|
||
|
mAllCaps = in.readBoolean();
|
||
|
mSystemFontFamilyName = in.readString8();
|
||
|
mTextFontWeight = in.readInt();
|
||
|
mTextStyle = in.readInt();
|
||
|
mShadowDx = in.readFloat();
|
||
|
mShadowDy = in.readFloat();
|
||
|
mShadowRadius = in.readFloat();
|
||
|
mShadowColor = in.readInt();
|
||
|
mElegantTextHeight = in.readBoolean();
|
||
|
mFallbackLineSpacing = in.readBoolean();
|
||
|
mLetterSpacing = in.readFloat();
|
||
|
mFontFeatureSettings = in.readString8();
|
||
|
mFontVariationSettings = in.readString8();
|
||
|
mLineBreakStyle = in.readInt();
|
||
|
mLineBreakWordStyle = in.readInt();
|
||
|
mTextScaleX = in.readFloat();
|
||
|
mHighlightTextColor = in.readInt();
|
||
|
mTextColor = in.readInt();
|
||
|
mHintTextColor = in.readInt();
|
||
|
mLinkTextColor = in.readInt();
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
public static final Creator<TextAppearanceInfo> CREATOR = new Creator<TextAppearanceInfo>() {
|
||
|
@Override
|
||
|
public TextAppearanceInfo createFromParcel(@NonNull Parcel in) {
|
||
|
return new TextAppearanceInfo(in);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public TextAppearanceInfo[] newArray(int size) {
|
||
|
return new TextAppearanceInfo[size];
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Returns the text size (in pixels) for current editor.
|
||
|
*/
|
||
|
public @Px float getTextSize() {
|
||
|
return mTextSize;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the {@link LocaleList} of the text.
|
||
|
*/
|
||
|
@NonNull
|
||
|
public LocaleList getTextLocales() {
|
||
|
return mTextLocales;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the font family name if the {@link Typeface} of the text is created from a
|
||
|
* system font family. Returns null if no {@link Typeface} is specified, or it is not created
|
||
|
* from a system font family.
|
||
|
*
|
||
|
* @see Typeface#getSystemFontFamilyName()
|
||
|
*/
|
||
|
@Nullable
|
||
|
public String getSystemFontFamilyName() {
|
||
|
return mSystemFontFamilyName;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the weight of the text, or {@code FontStyle#FONT_WEIGHT_UNSPECIFIED}
|
||
|
* when no {@link Typeface} is specified.
|
||
|
*/
|
||
|
@IntRange(from = FontStyle.FONT_WEIGHT_UNSPECIFIED, to = FontStyle.FONT_WEIGHT_MAX)
|
||
|
public int getTextFontWeight() {
|
||
|
return mTextFontWeight;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the style (normal, bold, italic, bold|italic) of the text. Returns
|
||
|
* {@link Typeface#NORMAL} when no {@link Typeface} is specified.
|
||
|
*
|
||
|
* @see Typeface
|
||
|
*/
|
||
|
public @Typeface.Style int getTextStyle() {
|
||
|
return mTextStyle;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns whether the transformation method applied to the current editor is set to all caps.
|
||
|
*
|
||
|
* @see TextView#setAllCaps(boolean)
|
||
|
* @see TextView#setTransformationMethod(TransformationMethod)
|
||
|
*/
|
||
|
public boolean isAllCaps() {
|
||
|
return mAllCaps;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the horizontal offset (in pixels) of the text shadow.
|
||
|
*
|
||
|
* @see Paint#setShadowLayer(float, float, float, int)
|
||
|
*/
|
||
|
public @Px float getShadowDx() {
|
||
|
return mShadowDx;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the vertical offset (in pixels) of the text shadow.
|
||
|
*
|
||
|
* @see Paint#setShadowLayer(float, float, float, int)
|
||
|
*/
|
||
|
public @Px float getShadowDy() {
|
||
|
return mShadowDy;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the blur radius (in pixels) of the text shadow.
|
||
|
*
|
||
|
* @see Paint#setShadowLayer(float, float, float, int)
|
||
|
*/
|
||
|
public @Px float getShadowRadius() {
|
||
|
return mShadowRadius;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the color of the text shadow.
|
||
|
*
|
||
|
* @see Paint#setShadowLayer(float, float, float, int)
|
||
|
*/
|
||
|
public @ColorInt int getShadowColor() {
|
||
|
return mShadowColor;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns {@code true} if the elegant height metrics flag is set. This setting selects font
|
||
|
* variants that have not been compacted to fit Latin-based vertical metrics, and also increases
|
||
|
* top and bottom bounds to provide more space.
|
||
|
*
|
||
|
* @see Paint#isElegantTextHeight()
|
||
|
*/
|
||
|
public boolean isElegantTextHeight() {
|
||
|
return mElegantTextHeight;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns whether to expand linespacing based on fallback fonts.
|
||
|
*
|
||
|
* @see TextView#setFallbackLineSpacing(boolean)
|
||
|
*/
|
||
|
public boolean isFallbackLineSpacing() {
|
||
|
return mFallbackLineSpacing;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the text letter-spacing, which determines the spacing between characters.
|
||
|
* The value is in 'EM' units. Normally, this value is 0.0.
|
||
|
*/
|
||
|
public float getLetterSpacing() {
|
||
|
return mLetterSpacing;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the font feature settings. Returns null if not specified.
|
||
|
*
|
||
|
* @see Paint#getFontFeatureSettings()
|
||
|
*/
|
||
|
@Nullable
|
||
|
public String getFontFeatureSettings() {
|
||
|
return mFontFeatureSettings;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the font variation settings. Returns null if no variation is specified.
|
||
|
*
|
||
|
* @see Paint#getFontVariationSettings()
|
||
|
*/
|
||
|
@Nullable
|
||
|
public String getFontVariationSettings() {
|
||
|
return mFontVariationSettings;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the line-break strategies for text wrapping.
|
||
|
*
|
||
|
* @see TextView#setLineBreakStyle(int)
|
||
|
*/
|
||
|
public @LineBreakConfig.LineBreakStyle int getLineBreakStyle() {
|
||
|
return mLineBreakStyle;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the line-break word strategies for text wrapping.
|
||
|
*
|
||
|
* @see TextView#setLineBreakWordStyle(int)
|
||
|
*/
|
||
|
public @LineBreakConfig.LineBreakWordStyle int getLineBreakWordStyle() {
|
||
|
return mLineBreakWordStyle;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the extent by which text should be stretched horizontally. Returns 1.0 if not
|
||
|
* specified.
|
||
|
*/
|
||
|
public float getTextScaleX() {
|
||
|
return mTextScaleX;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the color of the text selection highlight.
|
||
|
*
|
||
|
* @see TextView#getHighlightColor()
|
||
|
*/
|
||
|
public @ColorInt int getHighlightTextColor() {
|
||
|
return mHighlightTextColor;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the current text color of the editor.
|
||
|
*
|
||
|
* @see TextView#getCurrentTextColor()
|
||
|
*/
|
||
|
public @ColorInt int getTextColor() {
|
||
|
return mTextColor;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the current color of the hint text.
|
||
|
*
|
||
|
* @see TextView#getCurrentHintTextColor()
|
||
|
*/
|
||
|
public @ColorInt int getHintTextColor() {
|
||
|
return mHintTextColor;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the text color used to paint the links in the editor.
|
||
|
*
|
||
|
* @see TextView#getLinkTextColors()
|
||
|
*/
|
||
|
public @ColorInt int getLinkTextColor() {
|
||
|
return mLinkTextColor;
|
||
|
}
|
||
|
|
||
|
|
||
|
@Override
|
||
|
public boolean equals(Object o) {
|
||
|
if (this == o) return true;
|
||
|
if (!(o instanceof TextAppearanceInfo)) return false;
|
||
|
TextAppearanceInfo that = (TextAppearanceInfo) o;
|
||
|
return Float.compare(that.mTextSize, mTextSize) == 0
|
||
|
&& mTextFontWeight == that.mTextFontWeight && mTextStyle == that.mTextStyle
|
||
|
&& mAllCaps == that.mAllCaps && Float.compare(that.mShadowDx, mShadowDx) == 0
|
||
|
&& Float.compare(that.mShadowDy, mShadowDy) == 0 && Float.compare(
|
||
|
that.mShadowRadius, mShadowRadius) == 0 && that.mShadowColor == mShadowColor
|
||
|
&& mElegantTextHeight == that.mElegantTextHeight
|
||
|
&& mFallbackLineSpacing == that.mFallbackLineSpacing && Float.compare(
|
||
|
that.mLetterSpacing, mLetterSpacing) == 0 && mLineBreakStyle == that.mLineBreakStyle
|
||
|
&& mLineBreakWordStyle == that.mLineBreakWordStyle
|
||
|
&& mHighlightTextColor == that.mHighlightTextColor
|
||
|
&& mTextColor == that.mTextColor
|
||
|
&& mLinkTextColor == that.mLinkTextColor
|
||
|
&& mHintTextColor == that.mHintTextColor
|
||
|
&& Objects.equals(mTextLocales, that.mTextLocales)
|
||
|
&& Objects.equals(mSystemFontFamilyName, that.mSystemFontFamilyName)
|
||
|
&& Objects.equals(mFontFeatureSettings, that.mFontFeatureSettings)
|
||
|
&& Objects.equals(mFontVariationSettings, that.mFontVariationSettings)
|
||
|
&& Float.compare(that.mTextScaleX, mTextScaleX) == 0;
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public int hashCode() {
|
||
|
return Objects.hash(mTextSize, mTextLocales, mSystemFontFamilyName, mTextFontWeight,
|
||
|
mTextStyle, mAllCaps, mShadowDx, mShadowDy, mShadowRadius, mShadowColor,
|
||
|
mElegantTextHeight, mFallbackLineSpacing, mLetterSpacing, mFontFeatureSettings,
|
||
|
mFontVariationSettings, mLineBreakStyle, mLineBreakWordStyle, mTextScaleX,
|
||
|
mHighlightTextColor, mTextColor, mHintTextColor, mLinkTextColor);
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public String toString() {
|
||
|
return "TextAppearanceInfo{"
|
||
|
+ "mTextSize=" + mTextSize
|
||
|
+ ", mTextLocales=" + mTextLocales
|
||
|
+ ", mSystemFontFamilyName='" + mSystemFontFamilyName + '\''
|
||
|
+ ", mTextFontWeight=" + mTextFontWeight
|
||
|
+ ", mTextStyle=" + mTextStyle
|
||
|
+ ", mAllCaps=" + mAllCaps
|
||
|
+ ", mShadowDx=" + mShadowDx
|
||
|
+ ", mShadowDy=" + mShadowDy
|
||
|
+ ", mShadowRadius=" + mShadowRadius
|
||
|
+ ", mShadowColor=" + mShadowColor
|
||
|
+ ", mElegantTextHeight=" + mElegantTextHeight
|
||
|
+ ", mFallbackLineSpacing=" + mFallbackLineSpacing
|
||
|
+ ", mLetterSpacing=" + mLetterSpacing
|
||
|
+ ", mFontFeatureSettings='" + mFontFeatureSettings + '\''
|
||
|
+ ", mFontVariationSettings='" + mFontVariationSettings + '\''
|
||
|
+ ", mLineBreakStyle=" + mLineBreakStyle
|
||
|
+ ", mLineBreakWordStyle=" + mLineBreakWordStyle
|
||
|
+ ", mTextScaleX=" + mTextScaleX
|
||
|
+ ", mHighlightTextColor=" + mHighlightTextColor
|
||
|
+ ", mTextColor=" + mTextColor
|
||
|
+ ", mHintTextColor=" + mHintTextColor
|
||
|
+ ", mLinkTextColor=" + mLinkTextColor
|
||
|
+ '}';
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Builder for {@link TextAppearanceInfo}.
|
||
|
*/
|
||
|
public static final class Builder {
|
||
|
private @Px float mTextSize = -1;
|
||
|
private @NonNull LocaleList mTextLocales = LocaleList.getAdjustedDefault();
|
||
|
@Nullable private String mSystemFontFamilyName = null;
|
||
|
@IntRange(from = FontStyle.FONT_WEIGHT_UNSPECIFIED, to = FontStyle.FONT_WEIGHT_MAX)
|
||
|
private int mTextFontWeight = FontStyle.FONT_WEIGHT_UNSPECIFIED;
|
||
|
private @Typeface.Style int mTextStyle = NORMAL;
|
||
|
private boolean mAllCaps = false;
|
||
|
private @Px float mShadowDx = 0;
|
||
|
private @Px float mShadowDy = 0;
|
||
|
private @Px float mShadowRadius = 0;
|
||
|
private @ColorInt int mShadowColor = 0;
|
||
|
private boolean mElegantTextHeight = false;
|
||
|
private boolean mFallbackLineSpacing = false;
|
||
|
private float mLetterSpacing = 0;
|
||
|
@Nullable private String mFontFeatureSettings = null;
|
||
|
@Nullable private String mFontVariationSettings = null;
|
||
|
@LineBreakConfig.LineBreakStyle
|
||
|
private int mLineBreakStyle = LineBreakConfig.LINE_BREAK_STYLE_NONE;
|
||
|
@LineBreakConfig.LineBreakWordStyle
|
||
|
private int mLineBreakWordStyle = LineBreakConfig.LINE_BREAK_WORD_STYLE_NONE;
|
||
|
private float mTextScaleX = 1;
|
||
|
private @ColorInt int mHighlightTextColor = 0;
|
||
|
private @ColorInt int mTextColor = 0;
|
||
|
private @ColorInt int mHintTextColor = 0;
|
||
|
private @ColorInt int mLinkTextColor = 0;
|
||
|
|
||
|
/**
|
||
|
* Set the text size (in pixels) obtained from the current editor.
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setTextSize(@Px float textSize) {
|
||
|
mTextSize = textSize;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the {@link LocaleList} of the text.
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setTextLocales(@NonNull LocaleList textLocales) {
|
||
|
mTextLocales = textLocales;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the system font family name if the {@link Typeface} of the text is created from a
|
||
|
* system font family.
|
||
|
*
|
||
|
* @see Typeface#getSystemFontFamilyName()
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setSystemFontFamilyName(@Nullable String systemFontFamilyName) {
|
||
|
mSystemFontFamilyName = systemFontFamilyName;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the weight of the text.
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setTextFontWeight(
|
||
|
@IntRange(from = FontStyle.FONT_WEIGHT_UNSPECIFIED,
|
||
|
to = FontStyle.FONT_WEIGHT_MAX) int textFontWeight) {
|
||
|
mTextFontWeight = textFontWeight;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the style (normal, bold, italic, bold|italic) of the text.
|
||
|
*
|
||
|
* @see Typeface
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setTextStyle(@Typeface.Style int textStyle) {
|
||
|
mTextStyle = textStyle;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set whether the transformation method applied to the current editor is set to all caps.
|
||
|
*
|
||
|
* @see TextView#setAllCaps(boolean)
|
||
|
* @see TextView#setTransformationMethod(TransformationMethod)
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setAllCaps(boolean allCaps) {
|
||
|
mAllCaps = allCaps;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the horizontal offset (in pixels) of the text shadow.
|
||
|
*
|
||
|
* @see Paint#setShadowLayer(float, float, float, int)
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setShadowDx(@Px float shadowDx) {
|
||
|
mShadowDx = shadowDx;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the vertical offset (in pixels) of the text shadow.
|
||
|
*
|
||
|
* @see Paint#setShadowLayer(float, float, float, int)
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setShadowDy(@Px float shadowDy) {
|
||
|
mShadowDy = shadowDy;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the blur radius (in pixels) of the text shadow.
|
||
|
*
|
||
|
* @see Paint#setShadowLayer(float, float, float, int)
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setShadowRadius(@Px float shadowRadius) {
|
||
|
mShadowRadius = shadowRadius;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the color of the text shadow.
|
||
|
*
|
||
|
* @see Paint#setShadowLayer(float, float, float, int)
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setShadowColor(@ColorInt int shadowColor) {
|
||
|
mShadowColor = shadowColor;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the elegant height metrics flag. This setting selects font variants that
|
||
|
* have not been compacted to fit Latin-based vertical metrics, and also increases
|
||
|
* top and bottom bounds to provide more space.
|
||
|
*
|
||
|
* @see Paint#isElegantTextHeight()
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setElegantTextHeight(boolean elegantTextHeight) {
|
||
|
mElegantTextHeight = elegantTextHeight;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set whether to expand linespacing based on fallback fonts.
|
||
|
*
|
||
|
* @see TextView#setFallbackLineSpacing(boolean)
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setFallbackLineSpacing(boolean fallbackLineSpacing) {
|
||
|
mFallbackLineSpacing = fallbackLineSpacing;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the text letter-spacing, which determines the spacing between characters.
|
||
|
* The value is in 'EM' units. Normally, this value is 0.0.
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setLetterSpacing(float letterSpacing) {
|
||
|
mLetterSpacing = letterSpacing;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the font feature settings.
|
||
|
*
|
||
|
* @see Paint#getFontFeatureSettings()
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setFontFeatureSettings(@Nullable String fontFeatureSettings) {
|
||
|
mFontFeatureSettings = fontFeatureSettings;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the font variation settings. Set {@code null} if no variation is specified.
|
||
|
*
|
||
|
* @see Paint#getFontVariationSettings()
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setFontVariationSettings(@Nullable String fontVariationSettings) {
|
||
|
mFontVariationSettings = fontVariationSettings;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the line-break strategies for text wrapping.
|
||
|
*
|
||
|
* @see TextView#setLineBreakStyle(int)
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setLineBreakStyle(@LineBreakConfig.LineBreakStyle int lineBreakStyle) {
|
||
|
mLineBreakStyle = lineBreakStyle;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the line-break word strategies for text wrapping.
|
||
|
*
|
||
|
* @see TextView#setLineBreakWordStyle(int)
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setLineBreakWordStyle(
|
||
|
@LineBreakConfig.LineBreakWordStyle int lineBreakWordStyle) {
|
||
|
mLineBreakWordStyle = lineBreakWordStyle;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the extent by which text should be stretched horizontally.
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setTextScaleX(float textScaleX) {
|
||
|
mTextScaleX = textScaleX;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the color of the text selection highlight.
|
||
|
*
|
||
|
* @see TextView#getHighlightColor()
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setHighlightTextColor(@ColorInt int highlightTextColor) {
|
||
|
mHighlightTextColor = highlightTextColor;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the current text color of the editor.
|
||
|
*
|
||
|
* @see TextView#getCurrentTextColor()
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setTextColor(@ColorInt int textColor) {
|
||
|
mTextColor = textColor;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the current color of the hint text.
|
||
|
*
|
||
|
* @see TextView#getCurrentHintTextColor()
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setHintTextColor(@ColorInt int hintTextColor) {
|
||
|
mHintTextColor = hintTextColor;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set the text color used to paint the links in the editor.
|
||
|
*
|
||
|
* @see TextView#getLinkTextColors()
|
||
|
*/
|
||
|
@NonNull
|
||
|
public Builder setLinkTextColor(@ColorInt int linkTextColor) {
|
||
|
mLinkTextColor = linkTextColor;
|
||
|
return this;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns {@link TextAppearanceInfo} using parameters in this
|
||
|
* {@link TextAppearanceInfo.Builder}.
|
||
|
*/
|
||
|
@NonNull
|
||
|
public TextAppearanceInfo build() {
|
||
|
return new TextAppearanceInfo(this);
|
||
|
}
|
||
|
}
|
||
|
}
|