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