From 24474b94bd544522ce3c13e6d81ed40dc60f6a51 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 2 Oct 2019 12:40:10 +0200 Subject: [PATCH 01/17] Cherry Signed-off-by: Mario Danic --- build.gradle | 4 ++-- .../com/vanniktech/emoji/RecentEmojiManager.java | 13 +++++-------- emoji/src/main/java/com/vanniktech/emoji/Utils.java | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index 7c090778ee..f7e3e9e903 100644 --- a/build.gradle +++ b/build.gradle @@ -77,8 +77,8 @@ subprojects { ext { minSdkVersion = 15 - compileSdkVersion = 28 - targetSdkVersion = 28 + compileSdkVersion = 29 + targetSdkVersion = 29 leakCanaryVersion = '2.0-beta-3' diff --git a/emoji/src/main/java/com/vanniktech/emoji/RecentEmojiManager.java b/emoji/src/main/java/com/vanniktech/emoji/RecentEmojiManager.java index abcff023e9..6320d3a36c 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/RecentEmojiManager.java +++ b/emoji/src/main/java/com/vanniktech/emoji/RecentEmojiManager.java @@ -20,16 +20,17 @@ public final class RecentEmojiManager implements RecentEmoji { static final int EMOJI_GUESS_SIZE = 5; static final int MAX_RECENTS = 40; - @NonNull private final Context context; @NonNull private EmojiList emojiList = new EmojiList(0); + @NonNull private SharedPreferences sharedPreferences; public RecentEmojiManager(@NonNull final Context context) { - this.context = context.getApplicationContext(); + this.sharedPreferences = context.getApplicationContext().getSharedPreferences(PREFERENCE_NAME, + Context.MODE_PRIVATE); } @Override @SuppressWarnings({ "PMD.AvoidDeeplyNestedIfStmts", "checkstyle:nestedifdepth" }) @NonNull public Collection getRecentEmojis() { if (emojiList.size() == 0) { - final String savedRecentEmojis = getPreferences().getString(RECENT_EMOJIS, ""); + final String savedRecentEmojis = sharedPreferences.getString(RECENT_EMOJIS, ""); if (savedRecentEmojis.length() > 0) { final StringTokenizer stringTokenizer = new StringTokenizer(savedRecentEmojis, EMOJI_DELIMITER); @@ -76,14 +77,10 @@ public RecentEmojiManager(@NonNull final Context context) { stringBuilder.setLength(stringBuilder.length() - EMOJI_DELIMITER.length()); - getPreferences().edit().putString(RECENT_EMOJIS, stringBuilder.toString()).apply(); + sharedPreferences.edit().putString(RECENT_EMOJIS, stringBuilder.toString()).apply(); } } - private SharedPreferences getPreferences() { - return context.getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); - } - static class EmojiList { static final Comparator COMPARATOR = new Comparator() { @Override public int compare(final Data lhs, final Data rhs) { diff --git a/emoji/src/main/java/com/vanniktech/emoji/Utils.java b/emoji/src/main/java/com/vanniktech/emoji/Utils.java index 52331c350b..5f8c5a47fd 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/Utils.java +++ b/emoji/src/main/java/com/vanniktech/emoji/Utils.java @@ -56,7 +56,7 @@ static int getOrientation(final Context context) { static int getProperWidth(final Activity activity) { final Rect rect = Utils.windowVisibleDisplayFrame(activity); - return Utils.getOrientation(activity) == Configuration.ORIENTATION_PORTRAIT ? rect.right : Utils.getScreenWidth(activity); + return Utils.getOrientation(activity) == Configuration.ORIENTATION_PORTRAIT ? rect.right : getScreenWidth(activity); } static boolean shouldOverrideRegularCondition(@NonNull final Context context, final EditText editText) { From 7c152f31fb108b74b29cca07d47cd715a2815706 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 2 Oct 2019 13:01:00 +0200 Subject: [PATCH 02/17] Fix all the issues Signed-off-by: Mario Danic --- .../vanniktech/emoji/sample/MainActivity.java | 12 ++- .../vanniktech/emoji/sample/MainDialog.java | 11 ++- .../java/com/vanniktech/emoji/EmojiPopup.java | 75 ++++++++++++++----- .../main/java/com/vanniktech/emoji/Utils.java | 5 ++ 4 files changed, 84 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java b/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java index ed7da7ac00..88f3264c82 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java @@ -123,9 +123,17 @@ } } + @Override protected void onStart() { + if (emojiPopup != null) { + emojiPopup.start(); + } + + super.onStart(); + } + @Override protected void onStop() { if (emojiPopup != null) { - emojiPopup.dismiss(); + emojiPopup.stop(); } super.onStop(); @@ -142,5 +150,7 @@ private void setUpEmojiPopup() { .setKeyboardAnimationStyle(R.style.emoji_fade_animation_style) .setPageTransformer(new PageTransformer()) .build(editText); + + emojiPopup.start(); } } diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java b/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java index e1ab6ef653..423c802408 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java @@ -40,9 +40,16 @@ public static void show(@NonNull final AppCompatActivity activity) { chatAdapter = new ChatAdapter(); } + @Override public void onStart() { + if (emojiPopup != null) { + emojiPopup.start(); + } + + super.onStart(); + } @Override public void onStop() { if (emojiPopup != null) { - emojiPopup.dismiss(); + emojiPopup.stop(); } super.onStop(); @@ -96,5 +103,7 @@ private void setUpEmojiPopup() { .setKeyboardAnimationStyle(R.style.emoji_fade_animation_style) .setPageTransformer(new PageTransformer()) .build(editText); + + emojiPopup.start(); } } diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index 4b2cac4890..32c471dd69 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -4,12 +4,14 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.Gravity; import android.view.View; import android.view.ViewTreeObserver; +import android.view.WindowInsets; import android.view.autofill.AutofillManager; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; @@ -20,6 +22,9 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StyleRes; +import androidx.core.view.OnApplyWindowInsetsListener; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.viewpager.widget.ViewPager; import com.vanniktech.emoji.emoji.Emoji; import com.vanniktech.emoji.listeners.OnEmojiBackspaceClickListener; @@ -32,6 +37,7 @@ import static android.os.Build.VERSION.SDK_INT; import static android.os.Build.VERSION_CODES.JELLY_BEAN; +import static android.os.Build.VERSION_CODES.LOLLIPOP; import static android.os.Build.VERSION_CODES.O; import static com.vanniktech.emoji.Utils.backspace; import static com.vanniktech.emoji.Utils.checkNotNull; @@ -65,6 +71,7 @@ public final class EmojiPopup implements EmojiResultReceiver.Receiver { int originalImeOptions = -1; final EmojiResultReceiver emojiResultReceiver = new EmojiResultReceiver(new Handler(Looper.getMainLooper())); + View.OnApplyWindowInsetsListener onApplyWindowInsetsListener; final ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { @Override @SuppressWarnings("PMD.CyclomaticComplexity") public void onGlobalLayout() { @@ -82,10 +89,8 @@ public final class EmojiPopup implements EmojiResultReceiver.Receiver { popupWindow.setOnDismissListener(null); - if (SDK_INT >= JELLY_BEAN) { - rootView.getViewTreeObserver().removeOnGlobalLayoutListener(onGlobalLayoutListener); - } else { - rootView.getViewTreeObserver().removeGlobalOnLayoutListener(onGlobalLayoutListener); + if (SDK_INT < LOLLIPOP) { + rootView.getViewTreeObserver().removeGlobalOnLayoutListener(onGlobalLayoutListener); } rootView.removeOnAttachStateChangeListener(this); @@ -155,7 +160,6 @@ public final class EmojiPopup implements EmojiResultReceiver.Receiver { } rootView.addOnAttachStateChangeListener(onAttachStateChangeListener); - rootView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } void updateKeyboardState() { @@ -168,6 +172,52 @@ void updateKeyboardState() { } } + public void start() { + if (SDK_INT >= LOLLIPOP) { + if (onApplyWindowInsetsListener == null) { + onApplyWindowInsetsListener = new View.OnApplyWindowInsetsListener() { + private int previousOffset = 0; + + @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { + int offset; + + if (insets.getSystemWindowInsetBottom() < insets.getStableInsetBottom()) { + offset = insets.getSystemWindowInsetBottom(); + } else { + offset = insets.getSystemWindowInsetBottom() - insets.getStableInsetBottom(); + } + + if (offset != previousOffset) { + previousOffset = offset; + + if (offset > Utils.dpToPx(context, MIN_KEYBOARD_HEIGHT)) { + updateKeyboardStateOpened(offset); + } else { + updateKeyboardStateClosed(); + } + + } + + return context.getWindow().getDecorView().onApplyWindowInsets(insets); + } + }; + } + + context.getWindow().getDecorView().setOnApplyWindowInsetsListener(onApplyWindowInsetsListener); + } else { + rootView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); + } + } + + public void stop() { + if (SDK_INT >= LOLLIPOP) { + onApplyWindowInsetsListener = null; + context.getWindow().getDecorView().setOnApplyWindowInsetsListener(onApplyWindowInsetsListener); + } + + dismiss(); + } + private void updateKeyboardStateOpened(final int keyboardHeight) { if (popupWindow.getHeight() != keyboardHeight) { popupWindow.setHeight(keyboardHeight); @@ -225,20 +275,11 @@ public void show() { if (Utils.shouldOverrideRegularCondition(context, editText) && originalImeOptions == -1) { originalImeOptions = editText.getImeOptions(); } + editText.setFocusableInTouchMode(true); editText.requestFocus(); - if (popupWindow.getHeight() > 0) { - final int properWidth = Utils.getProperWidth(context); - - if (popupWindow.getWidth() != properWidth) { - popupWindow.setWidth(properWidth); - } - - showAtBottom(); - } else { - showAtBottomPending(); - } + showAtBottomPending(); } private void showAtBottomPending() { @@ -289,7 +330,7 @@ public void dismiss() { void showAtBottom() { isPendingOpen = false; - popupWindow.showAtLocation(rootView, Gravity.BOTTOM, 0, 0); + popupWindow.showAtLocation(rootView, Gravity.NO_GRAVITY, 0, Utils.getProperHeight(context)); if (onEmojiPopupShownListener != null) { onEmojiPopupShownListener.onEmojiPopupShown(); diff --git a/emoji/src/main/java/com/vanniktech/emoji/Utils.java b/emoji/src/main/java/com/vanniktech/emoji/Utils.java index 5f8c5a47fd..7a6fca878f 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/Utils.java +++ b/emoji/src/main/java/com/vanniktech/emoji/Utils.java @@ -116,6 +116,11 @@ static int alternativeInputMethodHeight(final View rootView) { return availableHeight - (rect.bottom - rect.top); } + static int getProperHeight(final Activity activity) { + final Rect rect = Utils.windowVisibleDisplayFrame(activity); + return rect.bottom; + } + static int getScreenWidth(@NonNull final Activity context) { return dpToPx(context, context.getResources().getConfiguration().screenWidthDp); } From ac299c786bc4d9935d2888f6bfe5886599dd7f8c Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 2 Oct 2019 13:06:03 +0200 Subject: [PATCH 03/17] Update readme Signed-off-by: Mario Danic --- README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/README.md b/README.md index 5dd0ec40f5..5e66a0e3a9 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,18 @@ emojiPopup.isShowing(); // Returns true when Popup is showing. The `rootView` is the rootView of your layout xml file which will be used for calculating the height of the keyboard. `emojiEditText` is the [`EmojiEditText`](emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java) that you declared in your layout xml file. +The following code needs to be executed onStart() and after creating EmojiPopup instance: + +```java +emojiPopup.start() +``` + +The following code needs to be executed in onStop(): + +```java +emojiPopup.stop() +``` + **Note: Instantiate the `EmojiPopup` as early as possible in the lifecycle (e.g. in `onCreate` of your `Activity` or `onViewCreated` in your `Fragment`), otherwise the keyboard detection might not work as expected.** ### Displaying Emojis From c91c0c6262af3a60e93ee002afe81ce4b48c3073 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 2 Oct 2019 13:06:48 +0200 Subject: [PATCH 04/17] Optimize imports Signed-off-by: Mario Danic --- .../main/java/com/vanniktech/emoji/EmojiPopup.java | 5 ----- emoji/src/main/java/com/vanniktech/emoji/Utils.java | 12 ++++++------ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index 32c471dd69..d8e14be20e 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -4,7 +4,6 @@ import android.content.Context; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Looper; @@ -22,9 +21,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StyleRes; -import androidx.core.view.OnApplyWindowInsetsListener; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowInsetsCompat; import androidx.viewpager.widget.ViewPager; import com.vanniktech.emoji.emoji.Emoji; import com.vanniktech.emoji.listeners.OnEmojiBackspaceClickListener; @@ -36,7 +32,6 @@ import com.vanniktech.emoji.listeners.OnSoftKeyboardOpenListener; import static android.os.Build.VERSION.SDK_INT; -import static android.os.Build.VERSION_CODES.JELLY_BEAN; import static android.os.Build.VERSION_CODES.LOLLIPOP; import static android.os.Build.VERSION_CODES.O; import static com.vanniktech.emoji.Utils.backspace; diff --git a/emoji/src/main/java/com/vanniktech/emoji/Utils.java b/emoji/src/main/java/com/vanniktech/emoji/Utils.java index 7a6fca878f..7cc7f0b8b2 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/Utils.java +++ b/emoji/src/main/java/com/vanniktech/emoji/Utils.java @@ -9,12 +9,6 @@ import android.graphics.Point; import android.graphics.Rect; import android.util.Log; -import androidx.annotation.AttrRes; -import androidx.annotation.ColorInt; -import androidx.annotation.ColorRes; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; import android.util.TypedValue; import android.view.KeyEvent; import android.view.View; @@ -22,6 +16,12 @@ import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.PopupWindow; +import androidx.annotation.AttrRes; +import androidx.annotation.ColorInt; +import androidx.annotation.ColorRes; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.content.ContextCompat; import com.vanniktech.emoji.emoji.Emoji; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; From 0fb8abb3737618f80f4169dfd736fd5c48e305d5 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 2 Oct 2019 13:14:16 +0200 Subject: [PATCH 05/17] Fix lint issues Signed-off-by: Mario Danic --- app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java b/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java index 423c802408..d321cbe7bf 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java @@ -47,6 +47,7 @@ public static void show(@NonNull final AppCompatActivity activity) { super.onStart(); } + @Override public void onStop() { if (emojiPopup != null) { emojiPopup.stop(); From 43d0be095baf57464efaa74e2e766e1f87c75a19 Mon Sep 17 00:00:00 2001 From: Niklas Baudy Date: Wed, 2 Oct 2019 14:12:33 +0200 Subject: [PATCH 06/17] Fix build. --- .../vanniktech/emoji/sample/MainDialog.java | 2 +- .../java/com/vanniktech/emoji/EmojiPopup.java | 55 ++++++++----------- .../vanniktech/emoji/RecentEmojiManager.java | 5 +- .../main/java/com/vanniktech/emoji/Utils.java | 3 +- 4 files changed, 28 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java b/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java index d321cbe7bf..4a53a9733b 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java @@ -47,7 +47,7 @@ public static void show(@NonNull final AppCompatActivity activity) { super.onStart(); } - + @Override public void onStop() { if (emojiPopup != null) { emojiPopup.stop(); diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index d8e14be20e..ea518874af 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -38,8 +38,6 @@ import static com.vanniktech.emoji.Utils.checkNotNull; public final class EmojiPopup implements EmojiResultReceiver.Receiver { - static final String TAG = "EmojiPopup"; - static final int MIN_KEYBOARD_HEIGHT = 50; final View rootView; @@ -66,7 +64,6 @@ public final class EmojiPopup implements EmojiResultReceiver.Receiver { int originalImeOptions = -1; final EmojiResultReceiver emojiResultReceiver = new EmojiResultReceiver(new Handler(Looper.getMainLooper())); - View.OnApplyWindowInsetsListener onApplyWindowInsetsListener; final ViewTreeObserver.OnGlobalLayoutListener onGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { @Override @SuppressWarnings("PMD.CyclomaticComplexity") public void onGlobalLayout() { @@ -167,53 +164,49 @@ void updateKeyboardState() { } } + /** Call this method in your #onStart method. */ public void start() { if (SDK_INT >= LOLLIPOP) { - if (onApplyWindowInsetsListener == null) { - onApplyWindowInsetsListener = new View.OnApplyWindowInsetsListener() { - private int previousOffset = 0; + context.getWindow().getDecorView().setOnApplyWindowInsetsListener(new View.OnApplyWindowInsetsListener() { + int previousOffset; - @Override public WindowInsets onApplyWindowInsets(View v, WindowInsets insets) { - int offset; + @Override public WindowInsets onApplyWindowInsets(final View v, final WindowInsets insets) { + final int offset; - if (insets.getSystemWindowInsetBottom() < insets.getStableInsetBottom()) { - offset = insets.getSystemWindowInsetBottom(); - } else { - offset = insets.getSystemWindowInsetBottom() - insets.getStableInsetBottom(); - } - - if (offset != previousOffset) { - previousOffset = offset; + if (insets.getSystemWindowInsetBottom() < insets.getStableInsetBottom()) { + offset = insets.getSystemWindowInsetBottom(); + } else { + offset = insets.getSystemWindowInsetBottom() - insets.getStableInsetBottom(); + } - if (offset > Utils.dpToPx(context, MIN_KEYBOARD_HEIGHT)) { - updateKeyboardStateOpened(offset); - } else { - updateKeyboardStateClosed(); - } + if (offset != previousOffset) { + previousOffset = offset; + if (offset > Utils.dpToPx(context, MIN_KEYBOARD_HEIGHT)) { + updateKeyboardStateOpened(offset); + } else { + updateKeyboardStateClosed(); } - - return context.getWindow().getDecorView().onApplyWindowInsets(insets); } - }; - } - context.getWindow().getDecorView().setOnApplyWindowInsetsListener(onApplyWindowInsetsListener); + return context.getWindow().getDecorView().onApplyWindowInsets(insets); + } + }); } else { rootView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } } + /** Call this method in your #onStop method. */ public void stop() { if (SDK_INT >= LOLLIPOP) { - onApplyWindowInsetsListener = null; - context.getWindow().getDecorView().setOnApplyWindowInsetsListener(onApplyWindowInsetsListener); + context.getWindow().getDecorView().setOnApplyWindowInsetsListener(null); } dismiss(); } - private void updateKeyboardStateOpened(final int keyboardHeight) { + void updateKeyboardStateOpened(final int keyboardHeight) { if (popupWindow.getHeight() != keyboardHeight) { popupWindow.setHeight(keyboardHeight); } @@ -221,7 +214,7 @@ private void updateKeyboardStateOpened(final int keyboardHeight) { final int properWidth = Utils.getProperWidth(context); if (popupWindow.getWidth() != properWidth) { - popupWindow.setWidth(properWidth); + popupWindow.setWidth(properWidth);E } if (!isKeyboardOpen) { @@ -236,7 +229,7 @@ private void updateKeyboardStateOpened(final int keyboardHeight) { } } - private void updateKeyboardStateClosed() { + void updateKeyboardStateClosed() { isKeyboardOpen = false; if (onSoftKeyboardCloseListener != null) { diff --git a/emoji/src/main/java/com/vanniktech/emoji/RecentEmojiManager.java b/emoji/src/main/java/com/vanniktech/emoji/RecentEmojiManager.java index 6320d3a36c..aea346f8c3 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/RecentEmojiManager.java +++ b/emoji/src/main/java/com/vanniktech/emoji/RecentEmojiManager.java @@ -21,11 +21,10 @@ public final class RecentEmojiManager implements RecentEmoji { static final int MAX_RECENTS = 40; @NonNull private EmojiList emojiList = new EmojiList(0); - @NonNull private SharedPreferences sharedPreferences; + @NonNull private final SharedPreferences sharedPreferences; public RecentEmojiManager(@NonNull final Context context) { - this.sharedPreferences = context.getApplicationContext().getSharedPreferences(PREFERENCE_NAME, - Context.MODE_PRIVATE); + sharedPreferences = context.getApplicationContext().getSharedPreferences(PREFERENCE_NAME, Context.MODE_PRIVATE); } @Override @SuppressWarnings({ "PMD.AvoidDeeplyNestedIfStmts", "checkstyle:nestedifdepth" }) @NonNull public Collection getRecentEmojis() { diff --git a/emoji/src/main/java/com/vanniktech/emoji/Utils.java b/emoji/src/main/java/com/vanniktech/emoji/Utils.java index 7cc7f0b8b2..87c3f25b9d 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/Utils.java +++ b/emoji/src/main/java/com/vanniktech/emoji/Utils.java @@ -117,8 +117,7 @@ static int alternativeInputMethodHeight(final View rootView) { } static int getProperHeight(final Activity activity) { - final Rect rect = Utils.windowVisibleDisplayFrame(activity); - return rect.bottom; + return Utils.windowVisibleDisplayFrame(activity).bottom; } static int getScreenWidth(@NonNull final Activity context) { From ae316904a79c06076a6d8cbe61736f70e6d7e6bc Mon Sep 17 00:00:00 2001 From: Niklas Baudy Date: Wed, 2 Oct 2019 14:22:10 +0200 Subject: [PATCH 07/17] Still target 28 and fix weird E letter. --- build.gradle | 4 ++-- emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index f7e3e9e903..7c090778ee 100644 --- a/build.gradle +++ b/build.gradle @@ -77,8 +77,8 @@ subprojects { ext { minSdkVersion = 15 - compileSdkVersion = 29 - targetSdkVersion = 29 + compileSdkVersion = 28 + targetSdkVersion = 28 leakCanaryVersion = '2.0-beta-3' diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index ea518874af..5e9976d5c4 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -214,7 +214,7 @@ void updateKeyboardStateOpened(final int keyboardHeight) { final int properWidth = Utils.getProperWidth(context); if (popupWindow.getWidth() != properWidth) { - popupWindow.setWidth(properWidth);E + popupWindow.setWidth(properWidth); } if (!isKeyboardOpen) { From d87c862befefc40ea2465f6858fc19f55cd0562a Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 3 Oct 2019 09:08:06 +0200 Subject: [PATCH 08/17] Fix popup management Signed-off-by: Mario Danic --- .../vanniktech/emoji/sample/MainActivity.java | 10 +++++++--- .../sample/MainActivityAutoCompeteTextView.java | 16 ++++++++++++++-- .../MainActivityMultiAutoCompeteTextView.java | 16 ++++++++++++++-- .../java/com/vanniktech/emoji/EmojiPopup.java | 4 ++-- 4 files changed, 37 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java b/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java index 88f3264c82..5f1e7f87b3 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java @@ -65,7 +65,12 @@ } }); - emojiButton.setOnClickListener(ignore -> emojiPopup.toggle()); + emojiButton.setOnClickListener(ignore -> { + // this is needed because the dialog has cleared the insets listener + emojiPopup.start(); + emojiPopup.toggle(); + }); + sendButton.setOnClickListener(ignore -> { final String text = editText.getText().toString().trim(); @@ -91,6 +96,7 @@ @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { case R.id.menuMainShowDialog: + emojiPopup.stop(); MainDialog.show(this); return true; case R.id.menuMainVariantIos: @@ -150,7 +156,5 @@ private void setUpEmojiPopup() { .setKeyboardAnimationStyle(R.style.emoji_fade_animation_style) .setPageTransformer(new PageTransformer()) .build(editText); - - emojiPopup.start(); } } diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java index 9ea144d8d4..d9a7b58cf5 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java @@ -49,7 +49,10 @@ emojiButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN); sendButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN); - emojiButton.setOnClickListener(ignore -> emojiPopup.toggle()); + emojiButton.setOnClickListener(ignore -> { + emojiPopup.start(); + emojiPopup.toggle(); + }); sendButton.setOnClickListener(ignore -> { final String text = editText.getText().toString().trim(); @@ -75,6 +78,7 @@ @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { case R.id.menuMainShowDialog: + emojiPopup.stop(); MainDialog.show(this); return true; case R.id.menuMainVariantIos: @@ -115,9 +119,17 @@ } } + @Override protected void onStart() { + if (emojiPopup != null) { + emojiPopup.start(); + } + + super.onStart(); + } + @Override protected void onStop() { if (emojiPopup != null) { - emojiPopup.dismiss(); + emojiPopup.stop(); } super.onStop(); diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java index 3338812f4f..5493abe0fb 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java @@ -49,7 +49,10 @@ emojiButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN); sendButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN); - emojiButton.setOnClickListener(ignore -> emojiPopup.toggle()); + emojiButton.setOnClickListener(ignore -> { + emojiPopup.start(); + emojiPopup.toggle(); + }); sendButton.setOnClickListener(ignore -> { final String text = editText.getText().toString().trim(); @@ -75,6 +78,7 @@ @Override public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { case R.id.menuMainShowDialog: + emojiPopup.stop(); MainDialog.show(this); return true; case R.id.menuMainVariantIos: @@ -115,9 +119,17 @@ } } + @Override protected void onStart() { + if (emojiPopup != null) { + emojiPopup.start(); + } + + super.onStart(); + } + @Override protected void onStop() { if (emojiPopup != null) { - emojiPopup.dismiss(); + emojiPopup.stop(); } super.onStop(); diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index 5e9976d5c4..ac008fe173 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -199,11 +199,11 @@ public void start() { /** Call this method in your #onStop method. */ public void stop() { + dismiss(); + if (SDK_INT >= LOLLIPOP) { context.getWindow().getDecorView().setOnApplyWindowInsetsListener(null); } - - dismiss(); } void updateKeyboardStateOpened(final int keyboardHeight) { From 7902c4a852e994251f1e2d64e77d92dd689148c8 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 3 Oct 2019 09:45:54 +0200 Subject: [PATCH 09/17] Fix CR stuff Signed-off-by: Mario Danic --- .../main/java/com/vanniktech/emoji/sample/MainActivity.java | 2 -- .../emoji/sample/MainActivityAutoCompeteTextView.java | 1 - .../emoji/sample/MainActivityMultiAutoCompeteTextView.java | 1 - emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java | 3 +++ 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java b/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java index 5f1e7f87b3..c8ca6e1680 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainActivity.java @@ -66,8 +66,6 @@ }); emojiButton.setOnClickListener(ignore -> { - // this is needed because the dialog has cleared the insets listener - emojiPopup.start(); emojiPopup.toggle(); }); diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java index d9a7b58cf5..940368d209 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java @@ -50,7 +50,6 @@ sendButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN); emojiButton.setOnClickListener(ignore -> { - emojiPopup.start(); emojiPopup.toggle(); }); sendButton.setOnClickListener(ignore -> { diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java index 5493abe0fb..777862c053 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java @@ -50,7 +50,6 @@ sendButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN); emojiButton.setOnClickListener(ignore -> { - emojiPopup.start(); emojiPopup.toggle(); }); sendButton.setOnClickListener(ignore -> { diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index ac008fe173..7f28f7a98b 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -193,6 +193,7 @@ public void start() { } }); } else { + rootView.getViewTreeObserver().removeGlobalOnLayoutListener(onGlobalLayoutListener); rootView.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener); } } @@ -253,6 +254,8 @@ public void setPopupWindowHeight(final int popupWindowHeight) { public void toggle() { if (!popupWindow.isShowing()) { + // this is needed because something might have cleared the insets listener + start(); show(); } else { dismiss(); From abf0caa39a5182d02c432f4a899f3e5ac8c611f0 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 3 Oct 2019 10:17:31 +0200 Subject: [PATCH 10/17] Fixx issues with offset thing Signed-off-by: Mario Danic --- emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index 7f28f7a98b..670b24529e 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -179,7 +179,7 @@ public void start() { offset = insets.getSystemWindowInsetBottom() - insets.getStableInsetBottom(); } - if (offset != previousOffset) { + if (offset != previousOffset || offset == 0) { previousOffset = offset; if (offset > Utils.dpToPx(context, MIN_KEYBOARD_HEIGHT)) { From ad3b1f1b64211295f24cc3aa553eaa566ea74a28 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 3 Oct 2019 09:29:07 +0200 Subject: [PATCH 11/17] Fix emoji-only filter Signed-off-by: Mario Danic --- .../src/main/java/com/vanniktech/emoji/EmojiEditText.java | 7 +++++++ emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java | 5 +++++ 2 files changed, 12 insertions(+) diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java index 771f7230fd..028a733856 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java @@ -16,6 +16,7 @@ /** Reference implementation for an EditText with emoji support. */ @SuppressWarnings("CPD-START") public class EmojiEditText extends AppCompatEditText { private float emojiSize; + private boolean disableKeyboardInput; public EmojiEditText(final Context context) { this(context, null); @@ -100,13 +101,19 @@ public final void setEmojiSizeRes(@DimenRes final int res, final boolean shouldI } } + public boolean isKeyboardInputDisabled() { + return disableKeyboardInput; + } + /** Disables the keyboard input using a focus change listener and delegating to the previous focus change listener. */ public void disableKeyboardInput(final EmojiPopup emojiPopup) { + disableKeyboardInput = true; super.setOnFocusChangeListener(new ForceEmojisOnlyFocusChangeListener(getOnFocusChangeListener(), emojiPopup)); } /** Enables the keyboard input. If it has been disabled before using {@link #disableKeyboardInput(EmojiPopup)} the OnFocusChangeListener will be preserved. */ public void enableKeyboardInput() { + disableKeyboardInput = false; final OnFocusChangeListener onFocusChangeListener = getOnFocusChangeListener(); if (onFocusChangeListener instanceof ForceEmojisOnlyFocusChangeListener) { diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index 670b24529e..3be1de246a 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -141,6 +141,11 @@ public final class EmojiPopup implements EmojiResultReceiver.Receiver { popupWindow.setBackgroundDrawable(new BitmapDrawable(context.getResources(), (Bitmap) null)); // To avoid borders and overdraw. popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { + if (editText instanceof EmojiEditText) { + if (((EmojiEditText)editText).isKeyboardInputDisabled()) { + editText.clearFocus(); + } + } if (onEmojiPopupDismissListener != null) { onEmojiPopupDismissListener.onEmojiPopupDismiss(); } From 1868718e3730d9314991dbf416279a8d3577e886 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 3 Oct 2019 09:36:10 +0200 Subject: [PATCH 12/17] Fix lint warning Signed-off-by: Mario Danic --- emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index 3be1de246a..97aa7f711d 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -142,7 +142,7 @@ public final class EmojiPopup implements EmojiResultReceiver.Receiver { popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { if (editText instanceof EmojiEditText) { - if (((EmojiEditText)editText).isKeyboardInputDisabled()) { + if (((EmojiEditText) editText).isKeyboardInputDisabled()) { editText.clearFocus(); } } From a55662c1c7c43cc47ac234a2a9bbaa4002c19f82 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Thu, 3 Oct 2019 10:30:11 +0200 Subject: [PATCH 13/17] Fix warnings Signed-off-by: Mario Danic --- app/build.gradle | 1 + build.gradle | 4 +++- emoji/build.gradle | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index dc753e3a07..c516cdcc23 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,6 +67,7 @@ dependencies { androidTestImplementation deps.support.test.runner androidTestImplementation deps.support.test.rules androidTestImplementation deps.fastLaneScreenGrab + androidTestAnnotationProcessor deps.support.test.autoService } configurations.all { diff --git a/build.gradle b/build.gradle index 7c090778ee..8a0c2fad66 100644 --- a/build.gradle +++ b/build.gradle @@ -20,6 +20,7 @@ buildscript { ], 'runner': "com.android.support.test:runner:${versions.testRules}", 'rules': "com.android.support.test:rules:${versions.testRules}", + 'autoService': "com.google.auto.service:auto-service:1.0-rc4", ], ], 'fastLaneScreenGrab': "tools.fastlane:screengrab:1.2.0", @@ -99,7 +100,8 @@ ext { junit : 'junit:junit:4.13-beta-3', robolectric : 'org.robolectric:robolectric:4.3', privateConstructor: 'com.pushtorefresh.java-private-constructor-checker:checker:1.2.0', - assertJ : 'org.assertj:assertj-core:2.9.1' + assertJ : 'org.assertj:assertj-core:2.9.1', + autoService : 'com.google.auto.service:auto-service:1.0-rc4' ] javaVersion = JavaVersion.VERSION_1_7 diff --git a/emoji/build.gradle b/emoji/build.gradle index afab6e166b..a11aa79900 100644 --- a/emoji/build.gradle +++ b/emoji/build.gradle @@ -27,6 +27,7 @@ dependencies { testImplementation rootProject.ext.testing.assertJ testImplementation rootProject.ext.testing.robolectric testImplementation rootProject.ext.testing.privateConstructor + androidTestAnnotationProcessor deps.support.test.autoService } apply plugin: "com.vanniktech.maven.publish" From 43f6a04c5f234500e00c27d76464768b0aadd9ec Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Mon, 14 Oct 2019 20:01:40 +0200 Subject: [PATCH 14/17] Update post merge Signed-off-by: Mario Danic --- README.md | 12 ------------ .../sample/MainActivityAutoCompeteTextView.java | 4 +--- .../sample/MainActivityMultiAutoCompeteTextView.java | 5 ++--- .../java/com/vanniktech/emoji/sample/MainDialog.java | 2 -- 4 files changed, 3 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 5e66a0e3a9..5dd0ec40f5 100644 --- a/README.md +++ b/README.md @@ -98,18 +98,6 @@ emojiPopup.isShowing(); // Returns true when Popup is showing. The `rootView` is the rootView of your layout xml file which will be used for calculating the height of the keyboard. `emojiEditText` is the [`EmojiEditText`](emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java) that you declared in your layout xml file. -The following code needs to be executed onStart() and after creating EmojiPopup instance: - -```java -emojiPopup.start() -``` - -The following code needs to be executed in onStop(): - -```java -emojiPopup.stop() -``` - **Note: Instantiate the `EmojiPopup` as early as possible in the lifecycle (e.g. in `onCreate` of your `Activity` or `onViewCreated` in your `Fragment`), otherwise the keyboard detection might not work as expected.** ### Displaying Emojis diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java index 12cc054754..f9fd72bc1d 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityAutoCompeteTextView.java @@ -52,9 +52,7 @@ emojiButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN); sendButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN); - emojiButton.setOnClickListener(ignore -> { - emojiPopup.toggle(); - }); + emojiButton.setOnClickListener(ignore -> emojiPopup.toggle()); sendButton.setOnClickListener(ignore -> { final String text = editText.getText().toString().trim(); diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java index 6c2591bff4..5cd25bc474 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainActivityMultiAutoCompeteTextView.java @@ -52,9 +52,8 @@ emojiButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN); sendButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN); - emojiButton.setOnClickListener(ignore -> { - emojiPopup.toggle(); - }); + emojiButton.setOnClickListener(ignore -> emojiPopup.toggle()); + sendButton.setOnClickListener(ignore -> { final String text = editText.getText().toString().trim(); diff --git a/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java b/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java index 3f49e8df7e..7f9de4a1f8 100644 --- a/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java +++ b/app/src/main/java/com/vanniktech/emoji/sample/MainDialog.java @@ -90,7 +90,5 @@ private void setUpEmojiPopup() { .setKeyboardAnimationStyle(R.style.emoji_fade_animation_style) .setPageTransformer(new PageTransformer()) .build(editText); - - emojiPopup.start(); } } From 52c2c343f35111eef93194e4ba8a9ff563b815c2 Mon Sep 17 00:00:00 2001 From: Ruben Gees Date: Tue, 15 Oct 2019 21:50:21 +0200 Subject: [PATCH 15/17] Fix warnings --- .../java/com/vanniktech/emoji/EmojiPopup.java | 96 ++++++++++--------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index 95948a42f7..a718ae2fa9 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -60,8 +60,8 @@ public final class EmojiPopup implements EmojiResultReceiver.Receiver { @Nullable OnEmojiBackspaceClickListener onEmojiBackspaceClickListener; @Nullable OnEmojiClickListener onEmojiClickListener; @Nullable OnEmojiPopupDismissListener onEmojiPopupDismissListener; - int popupWindowHeight; + int popupWindowHeight; int originalImeOptions = -1; final EmojiResultReceiver emojiResultReceiver = new EmojiResultReceiver(new Handler(Looper.getMainLooper())); @@ -90,6 +90,49 @@ public final class EmojiPopup implements EmojiResultReceiver.Receiver { } }; + final OnEmojiClickListener internalOnEmojiClickListener = new OnEmojiClickListener() { + @Override public void onEmojiClick(@NonNull final EmojiImageView imageView, @NonNull final Emoji emoji) { + Utils.input(editText, emoji); + + recentEmoji.addEmoji(emoji); + variantEmoji.addVariant(emoji); + imageView.updateEmoji(emoji); + + if (onEmojiClickListener != null) { + onEmojiClickListener.onEmojiClick(imageView, emoji); + } + + variantPopup.dismiss(); + } + }; + + final OnEmojiLongClickListener internalOnEmojiLongClickListener = new OnEmojiLongClickListener() { + @Override public void onEmojiLongClick(@NonNull final EmojiImageView view, @NonNull final Emoji emoji) { + variantPopup.show(view, emoji); + } + }; + + final OnEmojiBackspaceClickListener internalOnEmojiBackspaceClickListener = new OnEmojiBackspaceClickListener() { + @Override public void onEmojiBackspaceClick(final View v) { + backspace(editText); + + if (onEmojiBackspaceClickListener != null) { + onEmojiBackspaceClickListener.onEmojiBackspaceClick(v); + } + } + }; + + final PopupWindow.OnDismissListener onDismissListener = new PopupWindow.OnDismissListener() { + @Override public void onDismiss() { + if (editText instanceof EmojiEditText && ((EmojiEditText) editText).isKeyboardInputDisabled()) { + editText.clearFocus(); + } + if (onEmojiPopupDismissListener != null) { + onEmojiPopupDismissListener.onEmojiPopupDismiss(); + } + } + }; + EmojiPopup(@NonNull final View rootView, @NonNull final EditText editText, @Nullable final RecentEmoji recent, @Nullable final VariantEmoji variant, @ColorInt final int backgroundColor, @ColorInt final int iconColor, @ColorInt final int dividerColor, @@ -101,57 +144,18 @@ public final class EmojiPopup implements EmojiResultReceiver.Receiver { this.variantEmoji = variant != null ? variant : new VariantEmojiManager(context); popupWindow = new PopupWindow(context); + variantPopup = new EmojiVariantPopup(this.rootView, internalOnEmojiClickListener); - final OnEmojiLongClickListener longClickListener = new OnEmojiLongClickListener() { - @Override public void onEmojiLongClick(@NonNull final EmojiImageView view, @NonNull final Emoji emoji) { - variantPopup.show(view, emoji); - } - }; - - final OnEmojiClickListener clickListener = new OnEmojiClickListener() { - @Override public void onEmojiClick(@NonNull final EmojiImageView imageView, @NonNull final Emoji emoji) { - Utils.input(editText, emoji); - - recentEmoji.addEmoji(emoji); - variantEmoji.addVariant(emoji); - imageView.updateEmoji(emoji); - - if (onEmojiClickListener != null) { - onEmojiClickListener.onEmojiClick(imageView, emoji); - } - - variantPopup.dismiss(); - } - }; - - variantPopup = new EmojiVariantPopup(this.rootView, clickListener); - - final EmojiView emojiView = new EmojiView(context, clickListener, longClickListener, recentEmoji, variantEmoji, backgroundColor, iconColor, dividerColor, pageTransformer); - emojiView.setOnEmojiBackspaceClickListener(new OnEmojiBackspaceClickListener() { - @Override public void onEmojiBackspaceClick(final View v) { - backspace(editText); + final EmojiView emojiView = new EmojiView(context, + internalOnEmojiClickListener, internalOnEmojiLongClickListener, recentEmoji, variantEmoji, + backgroundColor, iconColor, dividerColor, pageTransformer); - if (onEmojiBackspaceClickListener != null) { - onEmojiBackspaceClickListener.onEmojiBackspaceClick(v); - } - } - }); + emojiView.setOnEmojiBackspaceClickListener(internalOnEmojiBackspaceClickListener); popupWindow.setContentView(emojiView); popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NOT_NEEDED); popupWindow.setBackgroundDrawable(new BitmapDrawable(context.getResources(), (Bitmap) null)); // To avoid borders and overdraw. - popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { - @Override public void onDismiss() { - if (editText instanceof EmojiEditText) { - if (((EmojiEditText) editText).isKeyboardInputDisabled()) { - editText.clearFocus(); - } - } - if (onEmojiPopupDismissListener != null) { - onEmojiPopupDismissListener.onEmojiPopupDismiss(); - } - } - }); + popupWindow.setOnDismissListener(onDismissListener); if (animationStyle != 0) { popupWindow.setAnimationStyle(animationStyle); From 5f5de3210b24b96a6cc7d10dec35d60c082f07e5 Mon Sep 17 00:00:00 2001 From: Niklas Baudy Date: Wed, 16 Oct 2019 17:35:05 +0200 Subject: [PATCH 16/17] Ignore PMD warning. --- emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java index 315b5c302f..ef139cfe62 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java @@ -37,7 +37,7 @@ import static com.vanniktech.emoji.Utils.backspace; import static com.vanniktech.emoji.Utils.checkNotNull; -public final class EmojiPopup implements EmojiResultReceiver.Receiver { +@SuppressWarnings("PMD.GodClass") public final class EmojiPopup implements EmojiResultReceiver.Receiver { static final int MIN_KEYBOARD_HEIGHT = 50; final View rootView; From a8fde45b61aa6ba8e04e79907ac28409a8017711 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Wed, 23 Oct 2019 15:09:23 +0200 Subject: [PATCH 17/17] Fix issues Signed-off-by: Mario Danic --- emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java | 1 + 1 file changed, 1 insertion(+) diff --git a/emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java b/emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java index 028a733856..e964d6317e 100644 --- a/emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java +++ b/emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java @@ -133,6 +133,7 @@ static class ForceEmojisOnlyFocusChangeListener implements OnFocusChangeListener @Override public void onFocusChange(final View view, final boolean hasFocus) { if (hasFocus) { + emojiPopup.start(); emojiPopup.show(); } else { emojiPopup.dismiss();