diff --git a/res/layout/emoji_drawer.xml b/res/layout/emoji_drawer.xml
index 9c5cf60f95..a6a0f4e22a 100644
--- a/res/layout/emoji_drawer.xml
+++ b/res/layout/emoji_drawer.xml
@@ -16,13 +16,14 @@
android:layout_width="0dp"
android:layout_height="45dp" />
-
+
diff --git a/src/org/thoughtcrime/securesms/components/EmojiDrawer.java b/src/org/thoughtcrime/securesms/components/EmojiDrawer.java
index b37b464bb9..fa2af88520 100644
--- a/src/org/thoughtcrime/securesms/components/EmojiDrawer.java
+++ b/src/org/thoughtcrime/securesms/components/EmojiDrawer.java
@@ -9,7 +9,6 @@ import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.util.Log;
import android.util.Pair;
-import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
@@ -20,7 +19,6 @@ import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.GridView;
-import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
@@ -28,19 +26,21 @@ import android.widget.RelativeLayout;
import com.astuetz.PagerSlidingTabStrip;
import org.thoughtcrime.securesms.R;
+import org.thoughtcrime.securesms.components.RepeatableImageKey.KeyEventListener;
import org.thoughtcrime.securesms.util.Emoji;
public class EmojiDrawer extends KeyboardAwareLinearLayout {
+ private static final KeyEvent DELETE_KEY_EVENT = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
private static final int RECENT_TYPE = 0;
private static final int ALL_TYPE = 1;
+
private FrameLayout[] gridLayouts = new FrameLayout[Emoji.PAGES.length+1];
private EditText composeText;
private Emoji emoji;
private ViewPager pager;
private PagerSlidingTabStrip strip;
- private ImageButton backspace;
@SuppressWarnings("unused")
public EmojiDrawer(Context context) {
@@ -70,7 +70,7 @@ public class EmojiDrawer extends KeyboardAwareLinearLayout {
}
private void initialize() {
- LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+ LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.emoji_drawer, this, true);
initializeResources();
@@ -81,12 +81,18 @@ public class EmojiDrawer extends KeyboardAwareLinearLayout {
}
private void initializeResources() {
- this.pager = (ViewPager ) findViewById(R.id.emoji_pager);
- this.strip = (PagerSlidingTabStrip ) findViewById(R.id.tabs);
- this.backspace = (ImageButton ) findViewById(R.id.backspace);
+ this.pager = (ViewPager) findViewById(R.id.emoji_pager);
+ this.strip = (PagerSlidingTabStrip) findViewById(R.id.tabs);
this.emoji = Emoji.getInstance(getContext());
- this.backspace.setOnClickListener(new BackspaceClickListener());
+ RepeatableImageKey backspace = (RepeatableImageKey)findViewById(R.id.backspace);
+ backspace.setOnKeyEventListener(new KeyEventListener() {
+ @Override public void onKeyEvent() {
+ if (composeText != null && composeText.getText().length() > 0) {
+ composeText.dispatchKeyEvent(DELETE_KEY_EVENT);
+ }
+ }
+ });
}
public void hide() {
@@ -159,19 +165,7 @@ public class EmojiDrawer extends KeyboardAwareLinearLayout {
}
}
- private class BackspaceClickListener implements OnClickListener {
- private final KeyEvent deleteKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL);
-
- @Override
- public void onClick(View v) {
- if (composeText.getText().length() > 0) {
- composeText.dispatchKeyEvent(deleteKeyEvent);
- v.performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP);
- }
- }
-
- }
private class EmojiGridAdapter extends BaseAdapter {
diff --git a/src/org/thoughtcrime/securesms/components/RepeatableImageKey.java b/src/org/thoughtcrime/securesms/components/RepeatableImageKey.java
new file mode 100644
index 0000000000..602db3d9f9
--- /dev/null
+++ b/src/org/thoughtcrime/securesms/components/RepeatableImageKey.java
@@ -0,0 +1,103 @@
+package org.thoughtcrime.securesms.components;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
+import android.util.AttributeSet;
+import android.view.HapticFeedbackConstants;
+import android.view.KeyEvent;
+import android.view.MotionEvent;
+import android.view.View;
+import android.view.ViewConfiguration;
+import android.widget.EditText;
+import android.widget.ImageButton;
+
+public class RepeatableImageKey extends ImageButton {
+
+ private KeyEventListener listener;
+
+ public RepeatableImageKey(Context context) {
+ super(context);
+ init();
+ }
+
+ public RepeatableImageKey(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init();
+ }
+
+ public RepeatableImageKey(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init();
+ }
+
+ @TargetApi(VERSION_CODES.LOLLIPOP)
+ public RepeatableImageKey(Context context, AttributeSet attrs, int defStyleAttr,
+ int defStyleRes)
+ {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init();
+ }
+
+ private void init() {
+ setOnClickListener(new RepeaterClickListener());
+ setOnTouchListener(new RepeaterTouchListener());
+ }
+
+ public void setOnKeyEventListener(KeyEventListener listener) {
+ this.listener = listener;
+ }
+
+ private void notifyListener() {
+ if (this.listener != null) this.listener.onKeyEvent();
+ }
+
+ private class RepeaterClickListener implements OnClickListener {
+ @Override public void onClick(View v) {
+ notifyListener();
+ }
+ }
+
+ private class Repeater implements Runnable {
+ @TargetApi(VERSION_CODES.HONEYCOMB_MR1)
+ @Override
+ public void run() {
+ notifyListener();
+ postDelayed(this, VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1
+ ? ViewConfiguration.getKeyRepeatDelay()
+ : 50);
+ }
+ }
+
+ private class RepeaterTouchListener implements OnTouchListener {
+ private Repeater repeater;
+
+ public RepeaterTouchListener() {
+ this.repeater = new Repeater();
+ }
+
+ @TargetApi(VERSION_CODES.HONEYCOMB_MR1)
+ @Override
+ public boolean onTouch(View view, MotionEvent motionEvent) {
+ switch (motionEvent.getAction()) {
+ case MotionEvent.ACTION_DOWN:
+ view.postDelayed(repeater, VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1
+ ? ViewConfiguration.getKeyRepeatTimeout()
+ : ViewConfiguration.getLongPressTimeout());
+ performHapticFeedback(HapticFeedbackConstants.KEYBOARD_TAP);
+ return false;
+ case MotionEvent.ACTION_CANCEL:
+ case MotionEvent.ACTION_UP:
+ view.removeCallbacks(repeater);
+ return false;
+ default:
+ return false;
+ }
+ }
+ }
+
+ public interface KeyEventListener {
+ void onKeyEvent();
+ }
+}