From ae3ce95a8bd7f5eedd95a4f716f4d1cd9abcc6fc Mon Sep 17 00:00:00 2001 From: Varun Jain Date: Mon, 2 Oct 2023 13:51:43 +0530 Subject: [PATCH] TP-40847 | Send message button for free text interaction (#8024) --- .../chat/ui/fragments/NaviChatFragment.kt | 51 ++++++++++++++++++- .../res/drawable/ic_add_attachment_purple.xml | 9 ++++ .../main/res/drawable/ic_send_msg_purple.xml | 20 ++++++++ .../res/layout/fragment_common_navi_chat.xml | 26 ++++++---- .../navi/naviwidgets/utils/AnimationUtils.kt | 20 ++++++++ 5 files changed, 114 insertions(+), 12 deletions(-) create mode 100644 navi-chat/src/main/res/drawable/ic_add_attachment_purple.xml create mode 100644 navi-chat/src/main/res/drawable/ic_send_msg_purple.xml diff --git a/navi-chat/src/main/java/com/navi/chat/ui/fragments/NaviChatFragment.kt b/navi-chat/src/main/java/com/navi/chat/ui/fragments/NaviChatFragment.kt index fe948fa392..dc8fddd11f 100644 --- a/navi-chat/src/main/java/com/navi/chat/ui/fragments/NaviChatFragment.kt +++ b/navi-chat/src/main/java/com/navi/chat/ui/fragments/NaviChatFragment.kt @@ -13,6 +13,8 @@ import android.os.Build import android.os.Bundle import android.os.Handler import android.os.Looper +import android.text.Editable +import android.text.TextWatcher import android.view.LayoutInflater import android.view.View import android.view.View.GONE @@ -84,6 +86,7 @@ import kotlinx.coroutines.delay import kotlinx.coroutines.launch import timber.log.Timber import javax.inject.Inject +import com.navi.design.utils.dpToPx class NaviChatFragment : ChatBaseFragment(), WidgetCallback, MessageOperation, ToolbarInteraction { @@ -298,6 +301,50 @@ class NaviChatFragment : ChatBaseFragment(), WidgetCallback, MessageOperation, T scrollChatToLatestMessageReceived() } } + + fun getSendMessageIconWidthInDp(): Float? { + val sendMessageIconWidthInPx = binding.ivSendFreeText.drawable?.intrinsicWidth + return sendMessageIconWidthInPx?.div(resources.displayMetrics.density) + } + + etFreeText.addTextChangedListener(object : TextWatcher { + var isSendButtonVisible = false + var distance = getSendMessageIconWidthInDp()?.plus(MARGIN_TO_RIGHT) + + override fun beforeTextChanged( + s: CharSequence?, start: Int, count: Int, after: Int + ) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + val hasText = s?.isNotBlank() == true + if (hasText && !isSendButtonVisible) { + isSendButtonVisible = true + val viewsToMove = listOf( + Pair( + ivSendAttachment, -dpToPx((distance ?: 0f).toInt()).toInt() + ), Pair( + ivSendFreeText, -dpToPx((distance ?: 0f).toInt()).toInt() + ) + ) + moveViewsTogetherWithDistance(viewsToMove, ANIMATION_DURATION) + } else if (!hasText) { + isSendButtonVisible = false + val viewsToMove = listOf( + Pair( + ivSendFreeText, dpToPx((distance ?: 0f).toInt()).toInt() + ), Pair( + ivSendAttachment, dpToPx(0f.toInt()).toInt() + ) + ) + moveViewsTogetherWithDistance(viewsToMove, ANIMATION_DURATION) + } + } + }) + } } @@ -762,7 +809,7 @@ class NaviChatFragment : ChatBaseFragment(), WidgetCallback, MessageOperation, T chatDataProvider.writeMessage( formPlainTextNewMessage( metaData = metaData, - message = message, + message = message.trim(), senderName = naviChatSystemLocalData?.currentUserName ?: EMPTY, senderId = naviChatSystemLocalData?.externalCustomerId ?: EMPTY ) @@ -1308,6 +1355,8 @@ class NaviChatFragment : ChatBaseFragment(), WidgetCallback, MessageOperation, T private const val DELAY_TO_SCROLL = 200L private const val RECYCLER_VIEW_BOOT_DELAY = 3000L private const val DELAY_TO_HIDE_TYPING = 10000L + private const val MARGIN_TO_RIGHT = 16 + private const val ANIMATION_DURATION = 400L const val STORAGE_PERMISSION = Manifest.permission.WRITE_EXTERNAL_STORAGE } } diff --git a/navi-chat/src/main/res/drawable/ic_add_attachment_purple.xml b/navi-chat/src/main/res/drawable/ic_add_attachment_purple.xml new file mode 100644 index 0000000000..c4362ec40c --- /dev/null +++ b/navi-chat/src/main/res/drawable/ic_add_attachment_purple.xml @@ -0,0 +1,9 @@ + + + diff --git a/navi-chat/src/main/res/drawable/ic_send_msg_purple.xml b/navi-chat/src/main/res/drawable/ic_send_msg_purple.xml new file mode 100644 index 0000000000..c6edb457b2 --- /dev/null +++ b/navi-chat/src/main/res/drawable/ic_send_msg_purple.xml @@ -0,0 +1,20 @@ + + + + + + + + + + \ No newline at end of file diff --git a/navi-chat/src/main/res/layout/fragment_common_navi_chat.xml b/navi-chat/src/main/res/layout/fragment_common_navi_chat.xml index 542bfa60ef..31f851ed6f 100644 --- a/navi-chat/src/main/res/layout/fragment_common_navi_chat.xml +++ b/navi-chat/src/main/res/layout/fragment_common_navi_chat.xml @@ -47,7 +47,7 @@ + + @@ -81,23 +88,20 @@ android:id="@+id/ivSendAttachment" android:layout_width="wrap_content" android:layout_height="match_parent" + android:layout_marginEnd="@dimen/dp_16" app:layout_constraintBottom_toBottomOf="parent" - app:layout_constraintEnd_toStartOf="@id/ivSendFreeText" - app:layout_constraintStart_toEndOf="@id/etFreeText" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" - app:srcCompat="@drawable/ic_add_attachment" /> + app:srcCompat="@drawable/ic_add_attachment_purple" /> + app:srcCompat="@drawable/ic_send_msg_purple" /> >, animDuration: Long = 1000 +) { + val animatorSet = AnimatorSet() + val animators = mutableListOf() + + for ((view, distance) in views) { + val animator = ObjectAnimator.ofFloat(view, "translationX", distance.toFloat()) + animator.duration = animDuration + animator.interpolator = OvershootInterpolator(1.5f) + animators.add(animator) + } + + animatorSet.playTogether(animators) + animatorSet.start() } \ No newline at end of file