diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/widgets/WPTextView.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/widgets/WPTextView.java | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPTextView.java b/WordPress/src/main/java/org/wordpress/android/widgets/WPTextView.java new file mode 100644 index 000000000..7cad53f35 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/widgets/WPTextView.java @@ -0,0 +1,82 @@ +package org.wordpress.android.widgets; + +import android.content.Context; +import android.content.res.TypedArray; +import android.support.v7.widget.AppCompatTextView; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.Spanned; +import android.text.TextUtils; +import android.util.AttributeSet; + +import org.wordpress.android.R; + +/** + * custom TextView used in layouts - enables keeping custom typeface handling in one place (so we + * avoid having to set the typeface for every single TextView in every single activity) + */ +public class WPTextView extends AppCompatTextView { + protected boolean mFixWidowWordEnabled; + + public WPTextView(Context context) { + super(context, null); + TypefaceCache.setCustomTypeface(context, this, null); + } + + public WPTextView(Context context, AttributeSet attrs) { + super(context, attrs); + TypefaceCache.setCustomTypeface(context, this, attrs); + readCustomAttrs(context, attrs); + } + + public WPTextView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + TypefaceCache.setCustomTypeface(context, this, attrs); + readCustomAttrs(context, attrs); + } + + public void setFixWidowWord(boolean enabled) { + mFixWidowWordEnabled = enabled; + } + + @Override + public void setText(CharSequence text, BufferType type) { + if (!mFixWidowWordEnabled) { + super.setText(text, type); + return; + } + Spannable out; + int lastSpace = text.toString().lastIndexOf(' '); + if (lastSpace != -1 && lastSpace < text.length() - 1) { + // Replace last space character by a non breaking space. + CharSequence tmpText = replaceCharacter(text, lastSpace, "\u00A0"); + out = new SpannableString(tmpText); + // Restore spans if text is an instance of Spanned + if (text instanceof Spanned) { + TextUtils.copySpansFrom((Spanned) text, 0, text.length(), null, out, 0); + } + } else { + out = new SpannableString(text); + } + super.setText(out, type); + } + + private void readCustomAttrs(Context context, AttributeSet attrs) { + TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.WPTextView, 0, 0); + if (array != null) { + mFixWidowWordEnabled = array.getBoolean(R.styleable.WPTextView_fixWidowWords, false); + if (mFixWidowWordEnabled) { + // Force text update + setText(getText()); + } + } + } + + private CharSequence replaceCharacter(CharSequence source, int charIndex, CharSequence replacement) { + if (charIndex != -1 && charIndex < source.length() - 1) { + return TextUtils.concat(source.subSequence(0, charIndex), replacement, source.subSequence(charIndex + 1, + source.length())); + } + return source; + } +} |