1package eu.siacs.conversations.ui;
2
3import android.content.Context;
4import android.os.Handler;
5import android.util.AttributeSet;
6import android.view.KeyEvent;
7import android.widget.EditText;
8
9import eu.siacs.conversations.Config;
10
11public class EditMessage extends EditText {
12
13 public EditMessage(Context context, AttributeSet attrs) {
14 super(context, attrs);
15 }
16
17 public EditMessage(Context context) {
18 super(context);
19 }
20
21 protected Handler mTypingHandler = new Handler();
22
23 protected Runnable mTypingTimeout = new Runnable() {
24 @Override
25 public void run() {
26 if (isUserTyping && keyboardListener != null) {
27 keyboardListener.onTypingStopped();
28 isUserTyping = false;
29 }
30 }
31 };
32
33 private boolean isUserTyping = false;
34
35 protected KeyboardListener keyboardListener;
36
37 @Override
38 public boolean onKeyDown(int keyCode, KeyEvent event) {
39 if (keyCode == KeyEvent.KEYCODE_ENTER) {
40 if (keyboardListener != null) {
41 keyboardListener.onEnterPressed();
42 }
43 return true;
44 }
45 return super.onKeyDown(keyCode, event);
46 }
47
48 @Override
49 public void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
50 super.onTextChanged(text,start,lengthBefore,lengthAfter);
51 if (this.mTypingHandler != null && this.keyboardListener != null) {
52 this.mTypingHandler.removeCallbacks(mTypingTimeout);
53 this.mTypingHandler.postDelayed(mTypingTimeout, Config.TYPING_TIMEOUT * 1000);
54 final int length = text.length();
55 if (!isUserTyping && length > 0) {
56 this.isUserTyping = true;
57 this.keyboardListener.onTypingStarted();
58 } else if (length == 0) {
59 this.isUserTyping = false;
60 this.keyboardListener.onTextDeleted();
61 }
62 }
63 }
64
65 public void setKeyboardListener(KeyboardListener listener) {
66 this.keyboardListener = listener;
67 if (listener != null) {
68 this.isUserTyping = false;
69 }
70 }
71
72 public interface KeyboardListener {
73 public void onEnterPressed();
74 public void onTypingStarted();
75 public void onTypingStopped();
76 public void onTextDeleted();
77 }
78
79}