diff --git a/kommunicate/.gitignore b/kommunicate/.gitignore index 2f9c601e..f9baf5e3 100644 --- a/kommunicate/.gitignore +++ b/kommunicate/.gitignore @@ -5,3 +5,4 @@ /.idea /gradle /src/main/resources/META-INF/io/kommunicate/sdk/kommunicate/verification.properties +/.cxx/ diff --git a/kommunicate/src/main/java/com/applozic/mobicomkit/api/conversation/MobiComConversationService.java b/kommunicate/src/main/java/com/applozic/mobicomkit/api/conversation/MobiComConversationService.java index 29e2cde1..db6d9548 100755 --- a/kommunicate/src/main/java/com/applozic/mobicomkit/api/conversation/MobiComConversationService.java +++ b/kommunicate/src/main/java/com/applozic/mobicomkit/api/conversation/MobiComConversationService.java @@ -1,5 +1,7 @@ package com.applozic.mobicomkit.api.conversation; +import static io.kommunicate.utils.KmConstants.KM_SUMMARY; + import android.content.Context; import android.content.Intent; import android.os.Bundle; @@ -55,6 +57,7 @@ import java.util.List; import io.kommunicate.KmConversationResponse; +import kotlin.jvm.functions.Function1; public class MobiComConversationService { @@ -345,7 +348,7 @@ public synchronized List getMessagesForParticularThread(Long startTime, } - public synchronized List getMessages(Long startTime, Long endTime, Contact contact, Channel channel, Integer conversationId, boolean isSkipRead, boolean isForSearch) { + public synchronized List getMessages(Function1 ignoreMessageWhen, Long startTime, Long endTime, Contact contact, Channel channel, Integer conversationId, boolean isSkipRead, boolean isForSearch) { if (isForSearch) { return getMessagesForParticularThread(startTime, endTime, contact, channel, conversationId, isSkipRead); } @@ -442,8 +445,16 @@ public synchronized List getMessages(Long startTime, Long endTime, Cont FileClientService fileClientService = new FileClientService(context); fileClientService.loadContactsvCard(message); } - if (Message.MetaDataType.HIDDEN.getValue().equals(message.getMetaDataValueForKey(Message.MetaDataType.KEY.getValue())) || Message.MetaDataType.PUSHNOTIFICATION.getValue().equals(message.getMetaDataValueForKey(Message.MetaDataType.KEY.getValue()))) { - continue; + + + if (Message.MetaDataType.HIDDEN.getValue().equals(message.getMetaDataValueForKey(Message.MetaDataType.KEY.getValue())) + || Message.MetaDataType.PUSHNOTIFICATION.getValue().equals(message.getMetaDataValueForKey(Message.MetaDataType.KEY.getValue())) + ) { + + // Avoid storing message if ignoreMessageWhen is true. + if (ignoreMessageWhen.invoke(message)) { + continue; + } } message.setHidden((isHideActionMessage && message.isActionMessage()) || (message.isActionMessage() && TextUtils.isEmpty(message.getMessage()))); @@ -460,10 +471,10 @@ public synchronized List getMessages(Long startTime, Long endTime, Cont if (message.getGroupId() != null) { Channel newChannel = ChannelService.getInstance(context).getChannelByChannelKey(message.getGroupId()); if (newChannel != null) { - getMessages(null, null, null, newChannel, null, true, isForSearch); + getMessages(ignoreMessageWhen, null, null, null, newChannel, null, true, isForSearch); } } else { - getMessages(null, null, new Contact(message.getContactIds()), null, null, true, isForSearch); + getMessages(ignoreMessageWhen, null, null, new Contact(message.getContactIds()), null, null, true, isForSearch); } } } diff --git a/kommunicate/src/main/java/io/kommunicate/utils/KmConstants.kt b/kommunicate/src/main/java/io/kommunicate/utils/KmConstants.kt index 9b28c858..b0ec926b 100644 --- a/kommunicate/src/main/java/io/kommunicate/utils/KmConstants.kt +++ b/kommunicate/src/main/java/io/kommunicate/utils/KmConstants.kt @@ -43,4 +43,5 @@ object KmConstants { const val HIDDEN: String = "hidden" const val PSEUDONAME: String = "pseudoName" const val KM_PSEUDO_USER: String = "KM_PSEUDO_USER" + const val KM_SUMMARY: String = "KM_SUMMARY" } \ No newline at end of file diff --git a/kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/adapter/DetailedConversationAdapter.java b/kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/adapter/DetailedConversationAdapter.java index cd2ddeb1..22179486 100644 --- a/kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/adapter/DetailedConversationAdapter.java +++ b/kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/adapter/DetailedConversationAdapter.java @@ -3,6 +3,7 @@ import android.animation.AnimatorSet; import android.annotation.SuppressLint; import android.app.Activity; +import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; @@ -30,6 +31,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.Window; import android.view.WindowManager; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -37,6 +39,7 @@ import android.widget.Filter; import android.widget.Filterable; import android.widget.FrameLayout; +import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; @@ -47,6 +50,7 @@ import androidx.annotation.NonNull; import androidx.appcompat.content.res.AppCompatResources; +import androidx.cardview.widget.CardView; import androidx.core.content.ContextCompat; import androidx.core.content.FileProvider; import androidx.fragment.app.FragmentActivity; @@ -116,6 +120,7 @@ import java.util.Date; import java.util.List; import java.util.Locale; +import java.util.Objects; import androidx.vectordrawable.graphics.drawable.AnimatorInflaterCompat; @@ -125,8 +130,10 @@ import io.kommunicate.utils.KmUtils; import static android.view.View.GONE; +import static android.view.View.VISIBLE; import static androidx.core.content.ContextCompat.startActivity; import static com.applozic.mobicomkit.api.conversation.stat.SourceUrl.SOURCE_URL; +import static io.kommunicate.utils.KmConstants.KM_SUMMARY; /** * Created by adarsh on 4/7/15. @@ -396,11 +403,29 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } else if (type == 3) { MyViewHolder3 myViewHolder3 = (MyViewHolder3) holder; myViewHolder3.customContentTextView.setText(message.getMessage()); - myViewHolder3.customContentTextView.setVisibility(View.VISIBLE); + myViewHolder3.customContentTextView.setVisibility(VISIBLE); return; } else if (type == 4) { MyViewHolder4 myViewHolder4 = (MyViewHolder4) holder; - if (alCustomizationSettings.isAgentApp()) { + + if (message.getMetadata().containsKey(KM_SUMMARY) + && Objects.equals(message.getMetadata().get(KM_SUMMARY), "true") + ) { + myViewHolder4.normalTextLayout.setVisibility(GONE); + + if (alCustomizationSettings.isAgentApp()) { + // Show summary UI + myViewHolder4.summaryCardView.setVisibility(VISIBLE); + myViewHolder4.summaryMessage.setText(message.getMessage()); + myViewHolder4.summaryReadMore.setOnClickListener(view -> { + // Open Dialog... + createCustomDialog(message.getMessage()); + }); + } + } else if (alCustomizationSettings.isAgentApp()) { + myViewHolder4.summaryCardView.setVisibility(GONE); + myViewHolder4.normalTextLayout.setVisibility(VISIBLE); + GradientDrawable bgGradientDrawable = (GradientDrawable) myViewHolder4.channelMessageTextView.getBackground(); bgGradientDrawable.setColor(Color.parseColor(isDarkModeEnabled ? alCustomizationSettings.getChannelCustomMessageBgColor().get(1) : alCustomizationSettings.getChannelCustomMessageBgColor().get(0))); @@ -413,7 +438,6 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { myViewHolder4.channelMessageStaticText.setTextColor(Color.parseColor(isDarkModeEnabled ? alCustomizationSettings.getChannelCustomMessageTextColor().get(1) : alCustomizationSettings.getChannelCustomMessageTextColor().get(0))); myViewHolder4.channelMessageLeftBg.setBackgroundColor(Color.parseColor(isDarkModeEnabled ? alCustomizationSettings.getChannelCustomMessageBgColor().get(1) : alCustomizationSettings.getChannelCustomMessageBgColor().get(0))); myViewHolder4.channelMessageRightBg.setBackgroundColor(Color.parseColor(isDarkModeEnabled ? alCustomizationSettings.getChannelCustomMessageBgColor().get(1) : alCustomizationSettings.getChannelCustomMessageBgColor().get(0))); - } return; } else if (type == 5) { @@ -523,6 +547,26 @@ public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { } } + private void createCustomDialog(String message) { + Dialog dialog = new Dialog(context); + dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); + dialog.setContentView(R.layout.custom_dialog_layout); + Window window = dialog.getWindow(); + if (window != null) { + window.setBackgroundDrawableResource(android.R.color.transparent); + } + + TextView dialogMessage = dialog.findViewById(R.id.dialog_message); + dialogMessage.setText(message); + + ImageButton btnClose = dialog.findViewById(R.id.dialog_close); + btnClose.setOnClickListener( view -> { + dialog.dismiss(); + }); + + dialog.show(); + } + protected void bindMessageView(RecyclerView.ViewHolder holder, final Message message, final int position) { final MyViewHolder myHolder = (MyViewHolder) holder; if (message != null) { @@ -1957,17 +2001,25 @@ static class MyViewHolder4 extends RecyclerView.ViewHolder { TextView channelMessageStaticText; View channelMessageLeftBg; View channelMessageRightBg; + CardView summaryCardView; + TextView summaryMessage; + Button summaryReadMore; + LinearLayout normalTextLayout; public MyViewHolder4(View itemView, boolean isAgentApp) { super(itemView); if (isAgentApp) { channelMessageTextView = (TextView) itemView.findViewById(R.id.channel_message); + summaryCardView = (CardView) itemView.findViewById(R.id.conversation_summary); + summaryMessage = (TextView) itemView.findViewById(R.id.summary_message); + summaryReadMore = (Button) itemView.findViewById(R.id.summary_read_more); } else { channelMessageTextView = (TextView) itemView.findViewById(R.id.km_transferred_to); channelMessageStaticText = (TextView) itemView.findViewById(R.id.km_transferred_text); channelMessageLeftBg = (View) itemView.findViewById(R.id.km_transferred_to_left_bg); channelMessageRightBg = (View) itemView.findViewById(R.id.km_transferred_to_right_bg); } + normalTextLayout = (LinearLayout) itemView.findViewById(R.id.normal_text); } } diff --git a/kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/fragment/MobiComConversationFragment.java b/kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/fragment/MobiComConversationFragment.java index c8792bea..a3951763 100644 --- a/kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/fragment/MobiComConversationFragment.java +++ b/kommunicateui/src/main/java/com/applozic/mobicomkit/uiwidgets/conversation/fragment/MobiComConversationFragment.java @@ -6,6 +6,8 @@ import static com.applozic.mobicomkit.uiwidgets.utils.KmViewHelper.setDocumentIcon; import static java.util.Collections.disjoint; +import static io.kommunicate.utils.KmConstants.KM_SUMMARY; + import android.annotation.SuppressLint; import android.app.Activity; import android.app.AlertDialog; @@ -4217,7 +4219,7 @@ protected Long doInBackground(Void... voids) { } - nextMessageList = conversationService.getMessages(lastConversationloadTime + 1L, null, contact, channel, conversationId, false, !TextUtils.isEmpty(messageSearchString)); + nextMessageList = conversationService.getMessages(this::ignoreSummaryMessageForUser, lastConversationloadTime + 1L, null, contact, channel, conversationId, false, !TextUtils.isEmpty(messageSearchString)); isNewConversation = isNewConversation(nextMessageList); } else if (firstVisibleItem == 1 && loadMore && !messageList.isEmpty()) { loadMore = false; @@ -4229,7 +4231,7 @@ protected Long doInBackground(Void... voids) { endTime = messageList.get(!TextUtils.isEmpty(alCustomizationSettings.getStaticTopMessage()) ? 1 : 0).getCreatedAtTime(); break; } - nextMessageList = conversationService.getMessages(null, endTime, contact, channel, conversationId, false, !TextUtils.isEmpty(messageSearchString)); + nextMessageList = conversationService.getMessages(this::ignoreSummaryMessageForUser, null, endTime, contact, channel, conversationId, false, !TextUtils.isEmpty(messageSearchString)); isNewConversation = isNewConversation(nextMessageList); } if (BroadcastService.isContextBasedChatEnabled()) { @@ -4287,6 +4289,15 @@ protected Long doInBackground(Void... voids) { return 0L; } + private Boolean ignoreSummaryMessageForUser(Message message) { + // Check if message is conversation summary. + boolean isKmSummary = message.getMetadata().containsKey(KM_SUMMARY) + && Boolean.parseBoolean(message.getMetaDataValueForKey(KM_SUMMARY)); + + // Ignore message if app is not agent and message type is not summary message. + return !(alCustomizationSettings.isAgentApp() && isKmSummary); + } + private boolean isNewConversation(List nextMessageList) { if (nextMessageList.size() == 0) { return false; diff --git a/kommunicateui/src/main/res/drawable/dialog_background.xml b/kommunicateui/src/main/res/drawable/dialog_background.xml new file mode 100644 index 00000000..ee677332 --- /dev/null +++ b/kommunicateui/src/main/res/drawable/dialog_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/kommunicateui/src/main/res/drawable/ic_cancel.xml b/kommunicateui/src/main/res/drawable/ic_cancel.xml new file mode 100644 index 00000000..8f6008e1 --- /dev/null +++ b/kommunicateui/src/main/res/drawable/ic_cancel.xml @@ -0,0 +1,9 @@ + + + diff --git a/kommunicateui/src/main/res/layout/custom_dialog_layout.xml b/kommunicateui/src/main/res/layout/custom_dialog_layout.xml new file mode 100644 index 00000000..d1132373 --- /dev/null +++ b/kommunicateui/src/main/res/layout/custom_dialog_layout.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/kommunicateui/src/main/res/layout/km_channel_custom_message_layout.xml b/kommunicateui/src/main/res/layout/km_channel_custom_message_layout.xml index 6d701cd9..06c0e34d 100644 --- a/kommunicateui/src/main/res/layout/km_channel_custom_message_layout.xml +++ b/kommunicateui/src/main/res/layout/km_channel_custom_message_layout.xml @@ -2,23 +2,85 @@ - - + + + + + + + + app:cardCornerRadius="12dp" + android:visibility="gone" + android:elevation="0dp" + android:backgroundTint="#EFEFEF" + android:layout_margin="12dp"> + + + + + + + +