EmojiAppCompatEditText.java revision d6e62a9d119a07f4d2bd686f357d8a667085fe71
1f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir/* 2f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * Copyright (C) 2017 The Android Open Source Project 3f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * 4f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * Licensed under the Apache License, Version 2.0 (the "License"); 5f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * you may not use this file except in compliance with the License. 6f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * You may obtain a copy of the License at 7f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * 8f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * http://www.apache.org/licenses/LICENSE-2.0 9f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * 10f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * Unless required by applicable law or agreed to in writing, software 11f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * distributed under the License is distributed on an "AS IS" BASIS, 12f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * See the License for the specific language governing permissions and 14f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * limitations under the License. 15f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir */ 16f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir 17f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinirpackage android.support.text.emoji.widget; 18f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir 19f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinirimport android.content.Context; 20d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinirimport android.support.annotation.IntRange; 21d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinirimport android.support.annotation.Nullable; 22d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinirimport android.support.text.emoji.EmojiCompat; 23f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinirimport android.support.v7.widget.AppCompatEditText; 24f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinirimport android.util.AttributeSet; 25f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinirimport android.view.inputmethod.EditorInfo; 26f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinirimport android.view.inputmethod.InputConnection; 27f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir 28f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir/** 29f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir * AppCompatEditText widget enhanced with emoji capability by using {@link EmojiEditTextHelper}. 3077b5c5b734f9f665577d1e3d178615db43ae1d4fSiyamed Sinir * When used on devices running API 18 or below, this widget acts as a regular 3177b5c5b734f9f665577d1e3d178615db43ae1d4fSiyamed Sinir * {@link AppCompatEditText}. 32f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir */ 33f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinirpublic class EmojiAppCompatEditText extends AppCompatEditText { 34f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir private EmojiEditTextHelper mEmojiEditTextHelper; 35f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir private boolean mInitialized; 36f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir 37f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir public EmojiAppCompatEditText(Context context) { 38f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir super(context); 39d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir init(null /*attrs*/, 0 /*defStyleAttr*/); 40f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir } 41f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir 42f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir public EmojiAppCompatEditText(Context context, AttributeSet attrs) { 43f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir super(context, attrs); 44d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir init(attrs, android.support.v7.appcompat.R.attr.editTextStyle); 45f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir } 46f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir 47f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir public EmojiAppCompatEditText(Context context, AttributeSet attrs, int defStyleAttr) { 48f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir super(context, attrs, defStyleAttr); 49d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir init(attrs, defStyleAttr); 50f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir } 51f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir 52d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir private void init(@Nullable AttributeSet attrs, int defStyleAttr) { 53f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir if (!mInitialized) { 54f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir mInitialized = true; 55d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir final EditTextAttributeHelper attrHelper = new EditTextAttributeHelper(this, attrs, 56d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir defStyleAttr); 57d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir setMaxEmojiCount(attrHelper.getMaxEmojiCount()); 58d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir setKeyListener(super.getKeyListener()); 59f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir } 60f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir } 61f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir 62f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir @Override 63f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir public void setKeyListener(android.text.method.KeyListener input) { 64f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir super.setKeyListener(getEmojiEditTextHelper().getKeyListener(input)); 65f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir } 66f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir 67f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir @Override 68f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir public InputConnection onCreateInputConnection(EditorInfo outAttrs) { 69f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir InputConnection inputConnection = super.onCreateInputConnection(outAttrs); 70f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir return getEmojiEditTextHelper().onCreateInputConnection(inputConnection, outAttrs); 71f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir } 72f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir 73d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir /** 74d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * Set the maximum number of EmojiSpans to be added to a CharSequence. The number of spans in a 75d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * CharSequence affects the performance of the EditText insert/delete operations. Insert/delete 76d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * operations slow down as the number of spans increases. 77d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * 78d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * @param maxEmojiCount maximum number of EmojiSpans to be added to a single CharSequence, 79d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * should be equal or greater than 0 80d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * 81d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * @see EmojiCompat#process(CharSequence, int, int, int) 82d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir */ 83d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir public void setMaxEmojiCount(@IntRange(from = 0) int maxEmojiCount) { 84d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir getEmojiEditTextHelper().setMaxEmojiCount(maxEmojiCount); 85d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir } 86d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir 87d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir /** 88d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * Returns the maximum number of EmojiSpans to be added to a CharSequence. 89d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * 90d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * @see #setMaxEmojiCount(int) 91d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir * @see EmojiCompat#process(CharSequence, int, int, int) 92d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir */ 93d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir public int getMaxEmojiCount() { 94d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir return getEmojiEditTextHelper().getMaxEmojiCount(); 95d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir } 96d6e62a9d119a07f4d2bd686f357d8a667085fe71Siyamed Sinir 97f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir private EmojiEditTextHelper getEmojiEditTextHelper() { 98f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir if (mEmojiEditTextHelper == null) { 99f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir mEmojiEditTextHelper = new EmojiEditTextHelper(this); 100f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir } 101f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir return mEmojiEditTextHelper; 102f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir } 103f8ec169d022fbed42fd82091d24c45f3767cdfe7Siyamed Sinir} 104