aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/ui/widget/CopyTextView.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/eu/siacs/conversations/ui/widget/CopyTextView.java')
-rw-r--r--src/main/java/eu/siacs/conversations/ui/widget/CopyTextView.java66
1 files changed, 66 insertions, 0 deletions
diff --git a/src/main/java/eu/siacs/conversations/ui/widget/CopyTextView.java b/src/main/java/eu/siacs/conversations/ui/widget/CopyTextView.java
new file mode 100644
index 00000000..bed56192
--- /dev/null
+++ b/src/main/java/eu/siacs/conversations/ui/widget/CopyTextView.java
@@ -0,0 +1,66 @@
+package eu.siacs.conversations.ui.widget;
+
+import android.annotation.TargetApi;
+import android.content.ClipData;
+import android.content.ClipboardManager;
+import android.content.Context;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.widget.TextView;
+
+public class CopyTextView extends TextView {
+
+ public CopyTextView(Context context) {
+ super(context);
+ }
+
+ public CopyTextView(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ }
+
+ public CopyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @SuppressWarnings("unused")
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public CopyTextView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ }
+
+ public interface CopyHandler {
+ public String transformTextForCopy(CharSequence text, int start, int end);
+ }
+
+ private CopyHandler copyHandler;
+
+ public void setCopyHandler(CopyHandler copyHandler) {
+ this.copyHandler = copyHandler;
+ }
+
+ @Override
+ public boolean onTextContextMenuItem(int id) {
+ CharSequence text = getText();
+ int min = 0;
+ int max = text.length();
+ if (isFocused()) {
+ final int selStart = getSelectionStart();
+ final int selEnd = getSelectionEnd();
+ min = Math.max(0, Math.min(selStart, selEnd));
+ max = Math.max(0, Math.max(selStart, selEnd));
+ }
+ String textForCopy = null;
+ if (id == android.R.id.copy && copyHandler != null) {
+ textForCopy = copyHandler.transformTextForCopy(getText(), min, max);
+ }
+ try {
+ return super.onTextContextMenuItem(id);
+ } finally {
+ if (textForCopy != null) {
+ ClipboardManager clipboard = (ClipboardManager) getContext().
+ getSystemService(Context.CLIPBOARD_SERVICE);
+ clipboard.setPrimaryClip(ClipData.newPlainText(null, textForCopy));
+ }
+ }
+ }
+} \ No newline at end of file