aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/widgets/WPTextView.java
diff options
context:
space:
mode:
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.java82
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;
+ }
+}