<NME> IndexOutOfBoundsAvoidingTextView.java
<BEF> package cgeo.geocaching.ui;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * https://code.google.com/p/android/issues/detail?id=35466
 */
public class IndexOutOfBoundsAvoidingTextView extends AppCompatTextView {

    private boolean shouldWindowFocusWait;


    public IndexOutOfBoundsAvoidingTextView(final Context context, final AttributeSet attrs, final int defStyle) {
		super(context, attrs, defStyle);
	}

	public IndexOutOfBoundsAvoidingTextView(final Context context, final AttributeSet attrs) {
		super(context, attrs);
	}

	public IndexOutOfBoundsAvoidingTextView(final Context context) {
		super(context);
	}

	@Override
        try {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        } catch (final IndexOutOfBoundsException ignored) {
            setText(getText().toString());
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        }
    }

    @Override
    public void setGravity(final int gravity) {
        try {
            super.setGravity(gravity);
        } catch (final IndexOutOfBoundsException ignored) {
            setText(getText().toString());
            super.setGravity(gravity);
        }
    }

    @Override
    public void setText(final CharSequence text, final BufferType type) {
        try {
            super.setText(text, type);
        } catch (final IndexOutOfBoundsException ignored) {
            setText(text.toString());
			setText(text.toString());
		}
	}
}

<MSG> fix #3819: make description text selectable

<DFF> @@ -1,7 +1,10 @@
 package cgeo.geocaching.ui;
 
 import android.content.Context;
+import android.text.Selection;
+import android.text.Spannable;
 import android.util.AttributeSet;
+import android.view.MenuItem;
 import android.widget.TextView;
 
 /**
@@ -14,14 +17,17 @@ public class IndexOutOfBoundsAvoidingTextView extends TextView {
 
     public IndexOutOfBoundsAvoidingTextView(final Context context, final AttributeSet attrs, final int defStyle) {
 		super(context, attrs, defStyle);
+		shouldWindowFocusWait = false;
 	}
 
 	public IndexOutOfBoundsAvoidingTextView(final Context context, final AttributeSet attrs) {
 		super(context, attrs);
+		shouldWindowFocusWait = false;
 	}
 
 	public IndexOutOfBoundsAvoidingTextView(final Context context) {
 		super(context);
+		shouldWindowFocusWait = false;
 	}
 
 	@Override
@@ -52,4 +58,30 @@ public class IndexOutOfBoundsAvoidingTextView extends TextView {
 			setText(text.toString());
 		}
 	}
-}
\ No newline at end of file
+
+	@Override
+	protected void onSelectionChanged(int selStart, int selEnd) {
+		if (selStart == -1 || selEnd == -1) {
+			// @hack : https://code.google.com/p/android/issues/detail?id=137509
+			CharSequence text = getText();
+			if (text instanceof Spannable) {
+				Selection.setSelection((Spannable) text, 0, 0);
+			}
+		} else {
+			super.onSelectionChanged(selStart, selEnd);
+		}
+	}
+
+	// https://code.google.com/p/android/issues/detail?id=23381
+	private boolean shouldWindowFocusWait;
+	public void setWindowFocusWait(final boolean shouldWindowFocusWait) {
+		this.shouldWindowFocusWait = shouldWindowFocusWait;
+	}
+
+	@Override
+	public void onWindowFocusChanged(boolean hasWindowFocus) {
+		if (!shouldWindowFocusWait) {
+			super.onWindowFocusChanged(hasWindowFocus);
+		}
+	}
+}

fix #3819: make description text selectable