From 38710814e2e6a166164ed9f10c391c9cdd0a5882 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 24 Jun 2021 11:22:32 +1000 Subject: [PATCH] Show typing indicators --- .../components/ConversationTypingView.java | 1 + .../conversation/v2/ConversationActivityV2.kt | 17 +++++++++++- .../v2}/TypingIndicatorView.java | 12 +++------ .../v2/TypingIndicatorViewContainer.kt | 25 +++++++++++++++++ .../res/layout/activity_conversation_v2.xml | 8 ++++++ .../res/layout/conversation_typing_view.xml | 2 +- app/src/main/res/layout/view_conversation.xml | 2 +- .../view_conversation_typing_container.xml | 27 +++++++++++++++++++ ...tor_view.xml => view_typing_indicator.xml} | 2 +- 9 files changed, 84 insertions(+), 12 deletions(-) rename app/src/main/java/org/thoughtcrime/securesms/{components => conversation/v2}/TypingIndicatorView.java (93%) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/TypingIndicatorViewContainer.kt create mode 100644 app/src/main/res/layout/view_conversation_typing_container.xml rename app/src/main/res/layout/{typing_indicator_view.xml => view_typing_indicator.xml} (93%) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java index 4246a79f37..6c42b7b154 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/ConversationTypingView.java @@ -8,6 +8,7 @@ import android.util.AttributeSet; import android.view.View; import android.widget.LinearLayout; +import org.thoughtcrime.securesms.conversation.v2.TypingIndicatorView; import org.thoughtcrime.securesms.mms.GlideRequests; import org.session.libsession.utilities.recipients.Recipient; import org.session.libsession.utilities.ThemeUtil; diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 0b5d99be70..cf46cd30b1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -26,6 +26,8 @@ import kotlinx.android.synthetic.main.view_input_bar_recording.* import kotlinx.android.synthetic.main.view_input_bar_recording.view.* import network.loki.messenger.R import org.session.libsession.messaging.mentions.MentionsManager +import org.session.libsession.utilities.recipients.Recipient +import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity import org.thoughtcrime.securesms.conversation.v2.input_bar.InputBarButton import org.thoughtcrime.securesms.conversation.v2.input_bar.InputBarDelegate @@ -106,6 +108,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe addOpenGroupGuidelinesIfNeeded() scrollToBottomButton.setOnClickListener { conversationRecyclerView.smoothScrollToPosition(0) } updateUnreadCount() + setUpTypingObserver() } private fun setUpRecyclerView() { @@ -175,6 +178,15 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe conversationRecyclerView.layoutParams = recyclerViewLayoutParams } + private fun setUpTypingObserver() { + ApplicationContext.getInstance(this).typingStatusRepository.getTypists(threadID).observe(this) { state -> + val recipients = if (state != null) state.typists else listOf() + typingIndicatorViewContainer.isVisible = recipients.isNotEmpty() + typingIndicatorViewContainer.setTypists(recipients) + inputBarHeightChanged(inputBar.height) + } + } + override fun onPrepareOptionsMenu(menu: Menu): Boolean { ConversationMenuHelper.onPrepareOptionsMenu(menu, menuInflater, thread, this) { onOptionsItemSelected(it) } super.onPrepareOptionsMenu(menu) @@ -189,9 +201,12 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe // region Updating & Animation override fun inputBarHeightChanged(newValue: Int) { + // 36 DP is the exact height of the typing indicator view. It's also exactly 18 * 2, and 18 is the large message + // corner radius. This makes 36 DP look "correct" in the context of other messages on the screen. + val typingIndicatorHeight = if (typingIndicatorViewContainer.isVisible) toPx(36, resources) else 0 // Recycler view val recyclerViewLayoutParams = conversationRecyclerView.layoutParams as RelativeLayout.LayoutParams - recyclerViewLayoutParams.bottomMargin = newValue + additionalContentContainer.height + recyclerViewLayoutParams.bottomMargin = newValue + additionalContentContainer.height + typingIndicatorHeight conversationRecyclerView.layoutParams = recyclerViewLayoutParams // Additional content container val additionalContentContainerLayoutParams = additionalContentContainer.layoutParams as RelativeLayout.LayoutParams diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/TypingIndicatorView.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/TypingIndicatorView.java similarity index 93% rename from app/src/main/java/org/thoughtcrime/securesms/components/TypingIndicatorView.java rename to app/src/main/java/org/thoughtcrime/securesms/conversation/v2/TypingIndicatorView.java index 477776a9dd..bd33600ea7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/TypingIndicatorView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/TypingIndicatorView.java @@ -1,4 +1,4 @@ -package org.thoughtcrime.securesms.components; +package org.thoughtcrime.securesms.conversation.v2; import android.content.Context; import android.content.res.TypedArray; @@ -13,18 +13,14 @@ import android.widget.LinearLayout; import network.loki.messenger.R; public class TypingIndicatorView extends LinearLayout { + private boolean isActive; + private long startTime; - private static final long DURATION = 300; - private static final long PRE_DELAY = 500; - private static final long POST_DELAY = 500; private static final long CYCLE_DURATION = 1500; private static final long DOT_DURATION = 600; private static final float MIN_ALPHA = 0.4f; private static final float MIN_SCALE = 0.75f; - private boolean isActive; - private long startTime; - private View dot1; private View dot2; private View dot3; @@ -40,7 +36,7 @@ public class TypingIndicatorView extends LinearLayout { } private void initialize(@Nullable AttributeSet attrs) { - inflate(getContext(), R.layout.typing_indicator_view, this); + inflate(getContext(), R.layout.view_typing_indicator, this); setWillNotDraw(false); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/TypingIndicatorViewContainer.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/TypingIndicatorViewContainer.kt new file mode 100644 index 0000000000..eaced08344 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/TypingIndicatorViewContainer.kt @@ -0,0 +1,25 @@ +package org.thoughtcrime.securesms.conversation.v2 + +import android.content.Context +import android.util.AttributeSet +import android.view.LayoutInflater +import android.widget.LinearLayout +import kotlinx.android.synthetic.main.view_conversation_typing_container.view.* +import network.loki.messenger.R +import org.session.libsession.utilities.recipients.Recipient + +class TypingIndicatorViewContainer : LinearLayout { + + constructor(context: Context) : super(context) { initialize() } + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { initialize() } + constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { initialize() } + + private fun initialize() { + LayoutInflater.from(context).inflate(R.layout.view_conversation_typing_container, this) + } + + fun setTypists(typists: List) { + if (typists.isEmpty()) { typingIndicator.stopAnimation(); return } + typingIndicator.startAnimation() + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_conversation_v2.xml b/app/src/main/res/layout/activity_conversation_v2.xml index a66dace7dd..6636d05d2f 100644 --- a/app/src/main/res/layout/activity_conversation_v2.xml +++ b/app/src/main/res/layout/activity_conversation_v2.xml @@ -18,6 +18,14 @@ android:layout_height="match_parent" android:layout_marginBottom="@dimen/input_bar_height" /> + + - diff --git a/app/src/main/res/layout/view_conversation.xml b/app/src/main/res/layout/view_conversation.xml index 8cd8030772..48468256f5 100644 --- a/app/src/main/res/layout/view_conversation.xml +++ b/app/src/main/res/layout/view_conversation.xml @@ -126,7 +126,7 @@ android:textColor="@color/text" tools:text="Sorry, gotta go fight crime again" /> - + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/typing_indicator_view.xml b/app/src/main/res/layout/view_typing_indicator.xml similarity index 93% rename from app/src/main/res/layout/typing_indicator_view.xml rename to app/src/main/res/layout/view_typing_indicator.xml index 23a4cf19ef..c264e69d53 100644 --- a/app/src/main/res/layout/typing_indicator_view.xml +++ b/app/src/main/res/layout/view_typing_indicator.xml @@ -5,7 +5,7 @@ android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="org.thoughtcrime.securesms.components.TypingIndicatorView"> + tools:context="org.thoughtcrime.securesms.conversation.v2.TypingIndicatorView">