aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/ui/widget/CopyTextView.java
blob: bed56192e5e4e7d2f294abae07df1d5fc91ad5cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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));
			}
		}
	}
}