From f0a9a302bb0fa4c6ffc73253a8e25ed211a90412 Mon Sep 17 00:00:00 2001 From: Marcel Hibbe Date: Mon, 22 May 2023 17:27:49 +0200 Subject: [PATCH] make typing indicator two lines if necessary Signed-off-by: Marcel Hibbe --- .../com/nextcloud/talk/chat/ChatActivity.kt | 43 +++++++++++++------ .../nextcloud/talk/utils/DisplayUtils.java | 7 +++ app/src/main/res/layout/activity_chat.xml | 6 ++- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt index d1bc3da78..d0f62eff7 100644 --- a/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt +++ b/app/src/main/java/com/nextcloud/talk/chat/ChatActivity.kt @@ -909,30 +909,38 @@ class ChatActivity : } private fun updateTypingIndicator() { + fun ellipsize(text: String): String { + return DisplayUtils.ellipsize(text, TYPING_INDICATOR_MAX_NAME_LENGTH) + } + val participantNames = ArrayList(typingParticipants.values) val typingString: SpannableStringBuilder when (typingParticipants.size) { 0 -> typingString = SpannableStringBuilder().append(binding.typingIndicator.text) + // person1 is typing 1 -> typingString = SpannableStringBuilder() - .bold { append(participantNames[0]) } + .bold { append(ellipsize(participantNames[0])) } .append(WHITESPACE + context.resources?.getString(R.string.typing_is_typing)) + // person1 and person2 are typing 2 -> typingString = SpannableStringBuilder() - .bold { append(participantNames[0]) } + .bold { append(ellipsize(participantNames[0])) } .append(WHITESPACE + context.resources?.getString(R.string.nc_common_and) + WHITESPACE) - .bold { append(participantNames[1]) } + .bold { append(ellipsize(participantNames[1])) } .append(WHITESPACE + context.resources?.getString(R.string.typing_are_typing)) + // person1, person2 and person3 are typing 3 -> typingString = SpannableStringBuilder() - .bold { append(participantNames[0]) } + .bold { append(ellipsize(participantNames[0])) } .append(COMMA) - .bold { append(participantNames[1]) } + .bold { append(ellipsize(participantNames[1])) } .append(WHITESPACE + context.resources?.getString(R.string.nc_common_and) + WHITESPACE) - .bold { append(participantNames[2]) } + .bold { append(ellipsize(participantNames[2])) } .append(WHITESPACE + context.resources?.getString(R.string.typing_are_typing)) + // person1, person2, person3 and 1 other is typing 4 -> typingString = SpannableStringBuilder() .bold { append(participantNames[0]) } .append(COMMA) @@ -941,6 +949,7 @@ class ChatActivity : .bold { append(participantNames[2]) } .append(WHITESPACE + context.resources?.getString(R.string.typing_1_other)) + // person1, person2, person3 and x others are typing else -> { val moreTypersAmount = typingParticipants.size - 3 val othersTyping = context.resources?.getString(R.string.typing_x_others)?.let { @@ -957,19 +966,26 @@ class ChatActivity : } runOnUiThread { + binding.typingIndicator.text = typingString + if (participantNames.size > 0) { binding.typingIndicatorWrapper.animate() - .translationY(binding.messageInputView.y - binding.typingIndicator.height) + .translationY(binding.messageInputView.y - DisplayUtils.convertDpToPixel(20f, context)) .setInterpolator(AccelerateDecelerateInterpolator()) .duration = TYPING_INDICATOR_ANIMATION_DURATION } else { - binding.typingIndicatorWrapper.animate() - .translationY(binding.messageInputView.y) - .setInterpolator(AccelerateDecelerateInterpolator()) - .duration = TYPING_INDICATOR_ANIMATION_DURATION + if (binding.typingIndicator.lineCount == 1) { + binding.typingIndicatorWrapper.animate() + .translationY(binding.messageInputView.y) + .setInterpolator(AccelerateDecelerateInterpolator()) + .duration = TYPING_INDICATOR_ANIMATION_DURATION + } else if (binding.typingIndicator.lineCount == 2) { + binding.typingIndicatorWrapper.animate() + .translationY(binding.messageInputView.y + DisplayUtils.convertDpToPixel(15f, context)) + .setInterpolator(AccelerateDecelerateInterpolator()) + .duration = TYPING_INDICATOR_ANIMATION_DURATION + } } - - binding.typingIndicator.text = typingString } } @@ -3778,5 +3794,6 @@ class ChatActivity : private const val WHITESPACE = " " private const val COMMA = ", " private const val TYPING_INDICATOR_ANIMATION_DURATION = 200L + private const val TYPING_INDICATOR_MAX_NAME_LENGTH = 14 } } 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 ceeea1aa5..aac979cba 100644 --- a/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java +++ b/app/src/main/java/com/nextcloud/talk/utils/DisplayUtils.java @@ -553,4 +553,11 @@ public class DisplayUtils { DateFormat df = DateFormat.getDateTimeInstance(); return df.format(date); } + + public static String ellipsize(String text, int maxLength) { + if (text.length() > maxLength) { + return text.substring(0, maxLength - 1) + "…"; + } + return text; + } } diff --git a/app/src/main/res/layout/activity_chat.xml b/app/src/main/res/layout/activity_chat.xml index b90eb204d..6b31e45a8 100644 --- a/app/src/main/res/layout/activity_chat.xml +++ b/app/src/main/res/layout/activity_chat.xml @@ -156,7 +156,7 @@ android:layout_height="wrap_content" android:orientation="vertical" android:layout_alignParentBottom="true" - android:layout_marginBottom="-20dp"> + android:layout_marginBottom="-19dp">