Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix emoji only filter #393

Merged
merged 19 commits into from
Nov 6, 2019
1 change: 1 addition & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ dependencies {
androidTestImplementation deps.support.test.runner
androidTestImplementation deps.support.test.rules
androidTestImplementation deps.fastLaneScreenGrab
androidTestAnnotationProcessor deps.support.test.autoService
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

}

configurations.all {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
sendButton.setColorFilter(ContextCompat.getColor(this, R.color.emoji_icons), PorterDuff.Mode.SRC_IN);

emojiButton.setOnClickListener(ignore -> emojiPopup.toggle());

sendButton.setOnClickListener(ignore -> {
final String text = editText.getText().toString().trim();

Expand Down
4 changes: 3 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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",
],
'material': "com.google.android.material:material:1.1.0-beta01",
],
Expand Down Expand Up @@ -100,7 +101,8 @@ ext {
junit : 'junit:junit:4.13-beta-3',
robolectric : 'org.robolectric:robolectric:4.3.1',
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'
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

]

javaVersion = JavaVersion.VERSION_1_7
Expand Down
1 change: 1 addition & 0 deletions emoji/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ dependencies {
testImplementation rootProject.ext.testing.assertJ
testImplementation rootProject.ext.testing.robolectric
testImplementation rootProject.ext.testing.privateConstructor
androidTestAnnotationProcessor deps.support.test.autoService
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What do we need this for?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

One of the lints complained about it missing.

}

apply plugin: "com.vanniktech.maven.publish"
8 changes: 8 additions & 0 deletions emoji/src/main/java/com/vanniktech/emoji/EmojiEditText.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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) {
Expand All @@ -126,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();
Expand Down
93 changes: 51 additions & 42 deletions emoji/src/main/java/com/vanniktech/emoji/EmojiPopup.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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()));
Expand Down Expand Up @@ -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,
Expand All @@ -101,52 +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 EmojiView emojiView = new EmojiView(context,
internalOnEmojiClickListener, internalOnEmojiLongClickListener, recentEmoji, variantEmoji,
backgroundColor, iconColor, dividerColor, pageTransformer);

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);

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 (onEmojiPopupDismissListener != null) {
onEmojiPopupDismissListener.onEmojiPopupDismiss();
}
}
});
popupWindow.setOnDismissListener(onDismissListener);

if (animationStyle != 0) {
popupWindow.setAnimationStyle(animationStyle);
Expand Down