From bf1f2df34415413fcea89de6cdb5177a3d231f48 Mon Sep 17 00:00:00 2001 From: Mario Danic Date: Sat, 12 Jan 2019 14:45:28 +0100 Subject: [PATCH] Fix #410 Signed-off-by: Mario Danic --- app/build.gradle | 10 +-- .../talk/activities/MagicCallActivity.java | 1 - .../talk/activities/MainActivity.java | 4 -- .../talk/adapters/items/ConversationItem.java | 5 +- .../MagicIncomingTextMessageViewHolder.java | 13 ++-- .../MagicOutcomingTextMessageViewHolder.java | 13 ++-- .../application/NextcloudTalkApplication.java | 4 ++ .../talk/controllers/ChatController.java | 29 ++++++++ .../ConversationInfoController.java | 2 +- .../nextcloud/talk/utils/DisplayUtils.java | 7 ++ .../nextcloud/talk/utils/TextMatchers.java | 71 ++----------------- app/src/main/res/layout/emoji_view.xml | 44 ++++++++++++ .../item_custom_incoming_preview_message.xml | 2 +- .../item_custom_incoming_text_message.xml | 2 +- .../item_custom_outcoming_preview_message.xml | 2 +- .../item_custom_outcoming_text_message.xml | 2 +- .../main/res/layout/rv_item_conversation.xml | 2 +- ...rv_item_conversation_with_last_message.xml | 4 +- .../main/res/layout/view_message_input.xml | 15 +++- app/src/main/res/raw/regex | 3 - app/src/main/res/values/colors.xml | 4 ++ 21 files changed, 137 insertions(+), 102 deletions(-) create mode 100644 app/src/main/res/layout/emoji_view.xml delete mode 100644 app/src/main/res/raw/regex diff --git a/app/build.gradle b/app/build.gradle index 97a1df414..df1277417 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -108,12 +108,12 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.0.2' implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha3' - implementation 'androidx.emoji:emoji-bundled:1.0.0' + implementation 'com.github.vanniktech.Emoji:emoji-twitter:182e1ff4f4' implementation 'org.michaelevans.colorart:library:0.0.3' - implementation "android.arch.work:work-runtime:1.0.0-beta01" + implementation "android.arch.work:work-runtime:1.0.0-alpha13" implementation "android.arch.work:work-firebase:${workVersion}" - androidTestImplementation "android.arch.work:work-testing:1.0.0-beta01" - implementation "android.arch.work:work-rxjava2:1.0.0-beta01" + androidTestImplementation "android.arch.work:work-testing:1.0.0-alpha13" + implementation "android.arch.work:work-rxjava2:1.0.0-alpha13" implementation "androidx.lifecycle:lifecycle-extensions:2.0.0" @@ -188,7 +188,7 @@ dependencies { implementation 'com.github.wooplr:Spotlight:1.3' - implementation 'com.github.mario:chatkit:628c909ef4' + implementation 'com.github.mario:chatkit:d63d61db95' implementation 'com.otaliastudios:autocomplete:1.1.0' diff --git a/app/src/main/java/com/nextcloud/talk/activities/MagicCallActivity.java b/app/src/main/java/com/nextcloud/talk/activities/MagicCallActivity.java index a37cd60eb..b350d4d10 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MagicCallActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/MagicCallActivity.java @@ -20,7 +20,6 @@ package com.nextcloud.talk.activities; -import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; import android.view.View; diff --git a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.java b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.java index 828aad5d6..47498f002 100644 --- a/app/src/main/java/com/nextcloud/talk/activities/MainActivity.java +++ b/app/src/main/java/com/nextcloud/talk/activities/MainActivity.java @@ -41,8 +41,6 @@ import com.nextcloud.talk.utils.database.user.UserUtils; import javax.inject.Inject; import androidx.appcompat.widget.Toolbar; -import androidx.emoji.bundled.BundledEmojiCompatConfig; -import androidx.emoji.text.EmojiCompat; import autodagger.AutoInjector; import butterknife.BindView; import butterknife.ButterKnife; @@ -72,8 +70,6 @@ public final class MainActivity extends BaseActivity implements ActionBarProvide @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - EmojiCompat.Config config = new BundledEmojiCompatConfig(this); - EmojiCompat.init(config); setContentView(R.layout.activity_main); diff --git a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java index 476fafeb6..1100d4228 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/items/ConversationItem.java @@ -45,6 +45,7 @@ import com.nextcloud.talk.models.json.rooms.Conversation; import com.nextcloud.talk.utils.ApiUtils; import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.glide.GlideApp; +import com.vanniktech.emoji.EmojiTextView; import org.apache.commons.lang3.StringUtils; @@ -287,13 +288,13 @@ public class ConversationItem extends AbstractFlexibleItem 0) { for (String key : messageParameters.keySet()) { Map individualHashMap = message.getMessageParameters().get(key); @@ -156,13 +157,13 @@ public class MagicIncomingTextMessageViewHolder } } - } else if (TextMatchers.isMessageWithSingleEmoticonOnly(context, message.getText())) { - messageString.setSpan(new RelativeSizeSpan(2.5f), 0, messageString.length(), - Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } else if (TextMatchers.isMessageWithSingleEmoticonOnly(message.getText())) { + emojiSize *= 2.5f; layoutParams.setWrapBefore(true); itemView.setSelected(true); } + messageText.setEmojiSize((int) emojiSize, true); messageTimeView.setLayoutParams(layoutParams); messageText.setText(messageString); } diff --git a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java index ef7be6b83..818c88803 100644 --- a/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java +++ b/app/src/main/java/com/nextcloud/talk/adapters/messages/MagicOutcomingTextMessageViewHolder.java @@ -27,12 +27,10 @@ import android.graphics.drawable.Drawable; import android.net.Uri; import android.text.Spannable; import android.text.SpannableString; -import android.text.style.RelativeSizeSpan; import android.view.View; import android.widget.TextView; import com.google.android.flexbox.FlexboxLayout; -import com.kevalpatel2106.emoticongifkeyboard.widget.EmoticonTextView; import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; import com.nextcloud.talk.models.json.chat.ChatMessage; @@ -40,6 +38,7 @@ import com.nextcloud.talk.utils.DisplayUtils; import com.nextcloud.talk.utils.TextMatchers; import com.nextcloud.talk.utils.database.user.UserUtils; import com.stfalcon.chatkit.messages.MessageHolders; +import com.vanniktech.emoji.EmojiTextView; import java.util.HashMap; import java.util.Map; @@ -54,7 +53,7 @@ import butterknife.ButterKnife; @AutoInjector(NextcloudTalkApplication.class) public class MagicOutcomingTextMessageViewHolder extends MessageHolders.OutcomingTextMessageViewHolder { @BindView(R.id.messageText) - EmoticonTextView messageText; + EmojiTextView messageText; @BindView(R.id.messageTime) TextView messageTimeView; @@ -87,6 +86,8 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin FlexboxLayout.LayoutParams layoutParams = (FlexboxLayout.LayoutParams) messageTimeView.getLayoutParams(); layoutParams.setWrapBefore(false); + float emojiSize = DisplayUtils.getDefaultEmojiFontSize(messageText); + if (messageParameters != null && messageParameters.size() > 0) { for (String key : messageParameters.keySet()) { Map individualHashMap = message.getMessageParameters().get(key); @@ -106,9 +107,8 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin } } - } else if (TextMatchers.isMessageWithSingleEmoticonOnly(context, message.getText())) { - messageString.setSpan(new RelativeSizeSpan(2.5f), 0, messageString.length(), - Spannable.SPAN_INCLUSIVE_EXCLUSIVE); + } else if (TextMatchers.isMessageWithSingleEmoticonOnly(message.getText())) { + emojiSize *= 2.5f; layoutParams.setWrapBefore(true); messageTimeView.setTextColor(context.getResources().getColor(R.color.warm_grey_four)); itemView.setSelected(true); @@ -127,6 +127,7 @@ public class MagicOutcomingTextMessageViewHolder extends MessageHolders.Outcomin ViewCompat.setBackground(bubble, bubbleDrawable); } + messageText.setEmojiSize((int) emojiSize, true); messageTimeView.setLayoutParams(layoutParams); messageText.setText(messageString); } diff --git a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java index eff51cfca..e5185c22f 100644 --- a/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java +++ b/app/src/main/java/com/nextcloud/talk/application/NextcloudTalkApplication.java @@ -42,6 +42,8 @@ import com.nextcloud.talk.utils.OkHttpNetworkFetcherWithCache; import com.nextcloud.talk.utils.database.arbitrarystorage.ArbitraryStorageModule; import com.nextcloud.talk.utils.database.user.UserModule; import com.nextcloud.talk.webrtc.MagicWebRTCUtils; +import com.vanniktech.emoji.EmojiManager; +import com.vanniktech.emoji.twitter.TwitterEmojiProvider; import org.webrtc.PeerConnectionFactory; import org.webrtc.voiceengine.WebRtcAudioManager; @@ -159,6 +161,8 @@ public class NextcloudTalkApplication extends MultiDexApplication implements Lif // ExistingPeriodicWorkPolicy.REPLACE, periodicCapabilitiesUpdateWork); WorkManager.getInstance().cancelUniqueWork("DailyCapabilitiesUpdateWork"); + EmojiManager.install(new TwitterEmojiProvider()); + } @Override diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java index cbbc1ac21..f4b4fa1d4 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ChatController.java @@ -26,6 +26,7 @@ import android.content.ClipboardManager; import android.content.Context; import android.content.Intent; import android.graphics.Color; +import android.graphics.PorterDuff; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -42,6 +43,7 @@ import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; +import android.widget.ImageButton; import android.widget.ProgressBar; import android.widget.RelativeLayout; import android.widget.TextView; @@ -90,6 +92,10 @@ import com.stfalcon.chatkit.messages.MessageInput; import com.stfalcon.chatkit.messages.MessagesList; import com.stfalcon.chatkit.messages.MessagesListAdapter; import com.stfalcon.chatkit.utils.DateFormatter; +import com.vanniktech.emoji.EmojiEditText; +import com.vanniktech.emoji.EmojiPopup; +import com.vanniktech.emoji.listeners.OnEmojiPopupDismissListener; +import com.vanniktech.emoji.listeners.OnEmojiPopupShownListener; import com.webianks.library.PopupBubble; import org.parceler.Parcels; @@ -137,6 +143,8 @@ public class ChatController extends BaseController implements MessagesListAdapte TextView sendHiTextView; @BindView(R.id.progressBar) ProgressBar loadingProgressBar; + @BindView(R.id.smileyButton) + ImageButton smileyButton; private List disposableList = new ArrayList<>(); private String conversationName; private String roomToken; @@ -165,6 +173,7 @@ public class ChatController extends BaseController implements MessagesListAdapte private static final byte CONTENT_TYPE_SYSTEM_MESSAGE = 1; private boolean wasDetached; + private EmojiPopup emojiPopup; public ChatController(Bundle args) { super(args); @@ -467,6 +476,21 @@ public class ChatController extends BaseController implements MessagesListAdapte ApplicationWideCurrentRoomHolder.getInstance().setUserInRoom(conversationUser); + emojiPopup = EmojiPopup.Builder.fromRootView(view).setOnEmojiPopupShownListener(new OnEmojiPopupShownListener() { + @Override + public void onEmojiPopupShown() { + smileyButton.setColorFilter(getResources().getColor(R.color.colorPrimary), + PorterDuff.Mode.SRC_IN); + } + }).setOnEmojiPopupDismissListener(new OnEmojiPopupDismissListener() { + @Override + public void onEmojiPopupDismiss() { + if (smileyButton != null) { + smileyButton.clearColorFilter(); + } + } + }).build((EmojiEditText) messageInputView.getInputEditText()); + if (mentionAutocomplete != null && mentionAutocomplete.isPopupShowing()) { mentionAutocomplete.dismissPopup(); } @@ -552,6 +576,11 @@ public class ChatController extends BaseController implements MessagesListAdapte } } + @OnClick(R.id.smileyButton) + void onSmileyClick() { + emojiPopup.toggle(); + } + @OnClick(R.id.emptyLayout) void sendHello() { if (!isHelloClicked) { diff --git a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java index 19a9206fc..fbb074134 100644 --- a/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java +++ b/app/src/main/java/com/nextcloud/talk/controllers/ConversationInfoController.java @@ -115,7 +115,7 @@ public class ConversationInfoController extends BaseController { private FlexibleAdapter adapter; private List recyclerViewItems = new ArrayList<>(); - ConversationInfoController(Bundle args) { + public ConversationInfoController(Bundle args) { super(args); setHasOptionsMenu(true); NextcloudTalkApplication.getSharedApplication().getComponentApplication().inject(this); diff --git a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java index fc4e5a832..af255aa1c 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java @@ -27,6 +27,7 @@ import android.content.res.ColorStateList; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; +import android.graphics.Paint; import android.graphics.Typeface; import android.graphics.drawable.Animatable; import android.graphics.drawable.BitmapDrawable; @@ -59,6 +60,7 @@ import com.facebook.imagepipeline.request.ImageRequest; import com.facebook.imagepipeline.request.ImageRequestBuilder; import com.nextcloud.talk.R; import com.nextcloud.talk.application.NextcloudTalkApplication; +import com.vanniktech.emoji.EmojiTextView; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; @@ -119,6 +121,11 @@ public class DisplayUtils { return new BitmapDrawable(getRoundedBitmapFromVectorDrawableResource(resources, resource)); } + public static float getDefaultEmojiFontSize(EmojiTextView emojiTextView) { + final Paint.FontMetrics fontMetrics = emojiTextView.getPaint().getFontMetrics(); + return fontMetrics.descent - fontMetrics.ascent; + } + private static Bitmap getBitmap(VectorDrawable vectorDrawable) { Bitmap bitmap = Bitmap.createBitmap(vectorDrawable.getIntrinsicWidth(), vectorDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); diff --git a/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java b/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java index cf4f99e0f..583f42c63 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java +++ b/app/src/main/java/com/nextcloud/talk/utils/TextMatchers.java @@ -22,18 +22,12 @@ package com.nextcloud.talk.utils; -import android.content.Context; -import android.text.TextUtils; -import android.util.Log; import android.util.Patterns; -import com.nextcloud.talk.R; import com.nextcloud.talk.models.json.chat.ChatMessage; +import com.vanniktech.emoji.EmojiInformation; +import com.vanniktech.emoji.EmojiUtils; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; @@ -48,9 +42,7 @@ import eu.medsea.mimeutil.detector.OpendesktopMimeDetector; public final class TextMatchers { - private static final String TAG = "EmojiDetection"; - - private static Pattern regexPattern; + private static final String TAG = "TextMatchers"; public static ChatMessage.MessageType getMessageTypeFromString(@NonNull final String text) { List links = new ArrayList<>(); @@ -97,59 +89,8 @@ public final class TextMatchers { return ChatMessage.MessageType.REGULAR_TEXT_MESSAGE; } - public static boolean isMessageWithSingleEmoticonOnly(@NonNull final Context context, - @Nullable final CharSequence text) { - - int startPosition = -1; - int endPosition = -1; - - if (!TextUtils.isEmpty(text)) { - final Matcher matcher = getRegex(context).matcher(text); - while (matcher.find()) { - if (startPosition == -1 && endPosition == -1) { - startPosition = matcher.start(); - endPosition = matcher.end(); - } else { - return false; - } - } - } else { - return false; - } - - return startPosition == 0 && text.length() == endPosition; - } - - @NonNull - private static Pattern getRegex(@NonNull final Context context) { - if (regexPattern == null) { - String regex = readTextFile(context, R.raw.regex); - regexPattern = Pattern.compile(regex); - } - - return regexPattern; - } - - @NonNull - private static String readTextFile(@NonNull Context context, int rowResource) { - InputStream inputStream = context.getResources().openRawResource(rowResource); - BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); - - StringBuilder builder = new StringBuilder(); - try { - String sCurrentLine; - while ((sCurrentLine = br.readLine()) != null) builder.append(sCurrentLine); - } catch (IOException e) { - Log.e(TAG, e.getLocalizedMessage()); - } finally { - try { - inputStream.close(); - br.close(); - } catch (IOException e) { - Log.e(TAG, e.getLocalizedMessage()); - } - } - - return builder.toString(); + public static boolean isMessageWithSingleEmoticonOnly(@Nullable final String text) { + final EmojiInformation emojiInformation = EmojiUtils.emojiInformation(text); + return (emojiInformation.isOnlyEmojis && emojiInformation.emojis.size() == 1); } } diff --git a/app/src/main/res/layout/emoji_view.xml b/app/src/main/res/layout/emoji_view.xml new file mode 100644 index 000000000..3ae7f332b --- /dev/null +++ b/app/src/main/res/layout/emoji_view.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_custom_incoming_preview_message.xml b/app/src/main/res/layout/item_custom_incoming_preview_message.xml index d6fa3ebe9..16ecd4f50 100644 --- a/app/src/main/res/layout/item_custom_incoming_preview_message.xml +++ b/app/src/main/res/layout/item_custom_incoming_preview_message.xml @@ -59,7 +59,7 @@ android:layout_marginTop="8dp" android:layout_marginBottom="8dp"> - - - - - - - - @@ -47,7 +48,17 @@ android:id="@id/sendButtonSpace" android:layout_width="0dp" android:layout_height="0dp" - android:layout_toStartOf="@id/messageSendButton" /> + android:layout_toStartOf="@id/smileyButton"/> + + #D5D5D5 #E9FFFFFF #111111 + + #ECEFF1 + #61000000 + #15000000