package br.com.instachat.emojilibrary.model.layout; import android.annotation.TargetApi; import android.content.Context; import android.content.res.TypedArray; import android.os.Build; import android.text.style.DynamicDrawableSpan; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.View; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import br.com.instachat.emojilibrary.R; import br.com.instachat.emojilibrary.util.EmojiUtil; import br.com.instachat.emojilibrary.util.SoftKeyboardUtil; public class EmojiEditText extends EditText { public static final String TAG = "EmojiEditText"; private Context mContext; private OnSoftKeyboardListener mOnSoftKeyboardListener; private Boolean isSoftKeyboardVisible = Boolean.FALSE; private int mEmojiconSize; private int mEmojiconAlignment; private int mEmojiconTextSize; private boolean mUseSystemDefault = Boolean.FALSE; // CONSTRUCTORS public EmojiEditText(Context context) { super(context); this.init(context, null); } public EmojiEditText(Context context, AttributeSet attrs) { super(context, attrs); this.init(context, attrs); } public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.initFocusListener(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public EmojiEditText(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); this.initFocusListener(); } // INITIALIZATIONS private void init(Context context, AttributeSet attrs) { this.mContext = context; this.initFocusListener(); TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.Emoji); this.mEmojiconSize = (int) a.getDimension(R.styleable.Emoji_emojiSize, getTextSize()); this.mEmojiconAlignment = a.getInt(R.styleable.Emoji_emojiAlignment, DynamicDrawableSpan.ALIGN_BASELINE); this.mUseSystemDefault = a.getBoolean(R.styleable.Emoji_emojiUseSystemDefault, false); a.recycle(); this.mEmojiconTextSize = (int) getTextSize(); setText(getText()); } private void initFocusListener() { this.setOnFocusChangeListener(new OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { if (EmojiEditText.this.mOnSoftKeyboardListener != null) { EmojiEditText.this.isSoftKeyboardVisible = Boolean.TRUE; EmojiEditText.this.mOnSoftKeyboardListener.onSoftKeyboardDisplay(); } } } }); } // CALLBACKS @Override public boolean onKeyPreIme(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { InputMethodManager mgr = (InputMethodManager) mContext.getSystemService(Context.INPUT_METHOD_SERVICE); mgr.hideSoftInputFromWindow(this.getWindowToken(), 0); if (this.mOnSoftKeyboardListener != null) { this.clearFocus(); EmojiEditText.this.isSoftKeyboardVisible = Boolean.FALSE; this.mOnSoftKeyboardListener.onSoftKeyboardHidden(); } } return true; } @Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { this.updateText(); } // EMOJI HANDLER private void updateText() { EmojiUtil.addEmojis( this.getContext(), this.getText(), this.mEmojiconSize, this.mEmojiconAlignment, this.mEmojiconTextSize, this.mUseSystemDefault ); } // SOFT KEYBOARD LISTENER public void showSoftKeyboard() { this.isSoftKeyboardVisible = Boolean.TRUE; SoftKeyboardUtil.showSoftKeyboard(this.mContext, this); } public void hideSoftKeyboard() { this.isSoftKeyboardVisible = Boolean.FALSE; this.clearFocus(); SoftKeyboardUtil.dismissSoftKeyboard(this.mContext, this); } public interface OnSoftKeyboardListener { public void onSoftKeyboardDisplay(); public void onSoftKeyboardHidden(); } // GETTERS AND SETTERS public Boolean isSoftKeyboardVisible() { return isSoftKeyboardVisible; } public void addOnSoftKeyboardListener(OnSoftKeyboardListener mOnSoftKeyboardListener) { this.mOnSoftKeyboardListener = mOnSoftKeyboardListener; } public void setEmojiSize(int pixels) { this.mEmojiconSize = pixels; this.updateText(); } public void setUseSystemDefault(boolean useSystemDefault) { this.mUseSystemDefault = useSystemDefault; } }