From 201b8c8e683057cce081de31986b6f004c97fd34 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 24 Jun 2021 10:04:43 +1000 Subject: [PATCH 01/21] Add unread count to scroll to bottom button --- .../conversation/v2/ConversationActivityV2.kt | 12 +++++ .../v2/ConversationRecyclerView.kt | 3 ++ .../res/layout/activity_conversation_v2.xml | 47 +++++++++++++++---- .../main/res/values-notnight-v21/colors.xml | 1 + app/src/main/res/values/colors.xml | 1 + 5 files changed, 54 insertions(+), 10 deletions(-) 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 305f1e282a..41abd31776 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 @@ -7,6 +7,7 @@ import android.database.Cursor import android.graphics.Rect import android.os.Bundle import android.util.Log +import android.util.TypedValue import android.view.* import android.widget.RelativeLayout import androidx.loader.app.LoaderManager @@ -30,6 +31,7 @@ import org.thoughtcrime.securesms.conversation.v2.input_bar.mentions.MentionCand import org.thoughtcrime.securesms.conversation.v2.menus.ConversationActionModeCallback import org.thoughtcrime.securesms.conversation.v2.menus.ConversationMenuHelper import org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageView +import org.thoughtcrime.securesms.database.Database import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.database.DraftDatabase import org.thoughtcrime.securesms.database.DraftDatabase.Drafts @@ -100,6 +102,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe restoreDraftIfNeeded() addOpenGroupGuidelinesIfNeeded() scrollToBottomButton.setOnClickListener { conversationRecyclerView.smoothScrollToPosition(0) } + updateUnreadCount() } private fun setUpRecyclerView() { @@ -319,6 +322,15 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe (scrollButtonFullVisibilityThreshold - scrollButtonNoVisibilityThreshold) val alpha = max(min(rawAlpha, 1.0f), 0.0f) scrollToBottomButton.alpha = alpha + updateUnreadCount() + } + + private fun updateUnreadCount() { + val unreadCount = DatabaseFactory.getMmsSmsDatabase(this).getUnreadCount(threadID) + val formattedUnreadCount = if (unreadCount < 100) unreadCount.toString() else "99+" + unreadCountTextView.text = formattedUnreadCount + val textSize = if (unreadCount < 100) 12.0f else 9.0f + unreadCountTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize) } // endregion diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt index e2d37c0fca..3bffcacc0e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt @@ -5,6 +5,7 @@ import android.util.AttributeSet import android.util.Log import android.view.MotionEvent import android.view.VelocityTracker +import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.activity_conversation_v2.* import org.thoughtcrime.securesms.loki.utilities.disableClipping @@ -33,6 +34,8 @@ class ConversationRecyclerView : RecyclerView { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { bottomOffset += dy // FIXME: Not sure this is fully accurate, but it seems close enough + val layoutManager = recyclerView.layoutManager as LinearLayoutManager + Log.d("Test", "${layoutManager.findFirstVisibleItemPosition()}") delegate?.handleConversationRecyclerViewBottomOffsetChanged(abs(bottomOffset)) } }) diff --git a/app/src/main/res/layout/activity_conversation_v2.xml b/app/src/main/res/layout/activity_conversation_v2.xml index a975516701..db65017001 100644 --- a/app/src/main/res/layout/activity_conversation_v2.xml +++ b/app/src/main/res/layout/activity_conversation_v2.xml @@ -73,21 +73,48 @@ + android:alpha="1"> - + + + + + + + + + + + diff --git a/app/src/main/res/values-notnight-v21/colors.xml b/app/src/main/res/values-notnight-v21/colors.xml index cb728dfba3..84b91b29dd 100644 --- a/app/src/main/res/values-notnight-v21/colors.xml +++ b/app/src/main/res/values-notnight-v21/colors.xml @@ -31,6 +31,7 @@ #0F000000 #FCFCFC #99000000 + #E0E0E0 #ffffff #fcfcfc diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index fa24a3ecee..edf5373392 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -38,6 +38,7 @@ #000000 #171717 #99FFFFFF + #1F1F1F #5ff8b0 From f66309afd89b5cf9f8b0669db1d900b1467ae71e Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 24 Jun 2021 10:18:52 +1000 Subject: [PATCH 02/21] Add unread count to conversation view --- .../conversation/v2/ConversationActivityV2.kt | 5 ++ .../v2/ConversationRecyclerView.kt | 2 - .../securesms/loki/views/ConversationView.kt | 13 +++++- .../res/layout/activity_conversation_v2.xml | 1 + app/src/main/res/layout/view_conversation.xml | 46 +++++++++++++++---- app/src/main/res/values/colors.xml | 2 +- 6 files changed, 55 insertions(+), 14 deletions(-) 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 41abd31776..0b5d99be70 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 @@ -5,11 +5,13 @@ import android.animation.ValueAnimator import android.content.res.Resources import android.database.Cursor import android.graphics.Rect +import android.graphics.Typeface import android.os.Bundle import android.util.Log import android.util.TypedValue import android.view.* import android.widget.RelativeLayout +import androidx.core.view.isVisible import androidx.loader.app.LoaderManager import androidx.loader.content.Loader import androidx.recyclerview.widget.LinearLayoutManager @@ -18,6 +20,7 @@ import kotlinx.android.synthetic.main.activity_conversation_v2.* import kotlinx.android.synthetic.main.activity_conversation_v2.view.* import kotlinx.android.synthetic.main.activity_conversation_v2_action_bar.* import kotlinx.android.synthetic.main.activity_home.* +import kotlinx.android.synthetic.main.view_conversation.view.* import kotlinx.android.synthetic.main.view_input_bar.view.* import kotlinx.android.synthetic.main.view_input_bar_recording.* import kotlinx.android.synthetic.main.view_input_bar_recording.view.* @@ -331,6 +334,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe unreadCountTextView.text = formattedUnreadCount val textSize = if (unreadCount < 100) 12.0f else 9.0f unreadCountTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize) + unreadCountTextView.setTypeface(Typeface.DEFAULT, if (unreadCount < 100) Typeface.BOLD else Typeface.NORMAL) + unreadCountIndicator.isVisible = (unreadCount != 0) } // endregion diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt index 3bffcacc0e..7d8957a065 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRecyclerView.kt @@ -34,8 +34,6 @@ class ConversationRecyclerView : RecyclerView { override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { bottomOffset += dy // FIXME: Not sure this is fully accurate, but it seems close enough - val layoutManager = recyclerView.layoutManager as LinearLayoutManager - Log.d("Test", "${layoutManager.findFirstVisibleItemPosition()}") delegate?.handleConversationRecyclerViewBottomOffsetChanged(abs(bottomOffset)) } }) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt index 5fa8967d95..cff2096de7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/views/ConversationView.kt @@ -4,9 +4,11 @@ import android.content.Context import android.content.res.Resources import android.graphics.Typeface import android.util.AttributeSet +import android.util.TypedValue import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout +import androidx.core.view.isVisible import androidx.recyclerview.widget.RecyclerView import kotlinx.android.synthetic.main.view_conversation.view.* import network.loki.messenger.R @@ -37,13 +39,20 @@ class ConversationView : LinearLayout { fun bind(thread: ThreadRecord, isTyping: Boolean, glide: GlideRequests) { this.thread = thread populateUserPublicKeyCacheIfNeeded(thread.threadId, context) // FIXME: This is a bad place to do this + val unreadCount = thread.unreadCount if (thread.recipient.isBlocked) { accentView.setBackgroundResource(R.color.destructive) accentView.visibility = View.VISIBLE } else { accentView.setBackgroundResource(R.color.accent) - accentView.visibility = if (thread.unreadCount > 0) View.VISIBLE else View.INVISIBLE + accentView.visibility = if (unreadCount > 0) View.VISIBLE else View.INVISIBLE } + val formattedUnreadCount = if (unreadCount < 100) unreadCount.toString() else "99+" + unreadCountTextView.text = formattedUnreadCount + val textSize = if (unreadCount < 100) 12.0f else 9.0f + unreadCountTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize) + unreadCountTextView.setTypeface(Typeface.DEFAULT, if (unreadCount < 100) Typeface.BOLD else Typeface.NORMAL) + unreadCountIndicator.isVisible = (unreadCount != 0) profilePictureView.glide = glide profilePictureView.update(thread.recipient, thread.threadId) val senderDisplayName = getUserDisplayName(thread.recipient) ?: thread.recipient.address.toString() @@ -53,7 +62,7 @@ class ConversationView : LinearLayout { val rawSnippet = thread.getDisplayBody(context) val snippet = highlightMentions(rawSnippet, thread.threadId, context) snippetTextView.text = snippet - snippetTextView.typeface = if (thread.unreadCount > 0) Typeface.DEFAULT_BOLD else Typeface.DEFAULT + snippetTextView.typeface = if (unreadCount > 0) Typeface.DEFAULT_BOLD else Typeface.DEFAULT snippetTextView.visibility = if (isTyping) View.GONE else View.VISIBLE if (isTyping) { typingIndicatorView.startAnimation() diff --git a/app/src/main/res/layout/activity_conversation_v2.xml b/app/src/main/res/layout/activity_conversation_v2.xml index db65017001..a66dace7dd 100644 --- a/app/src/main/res/layout/activity_conversation_v2.xml +++ b/app/src/main/res/layout/activity_conversation_v2.xml @@ -98,6 +98,7 @@ - + android:orientation="horizontal" + android:gravity="center_vertical"> + + + + + + + + + + #000000 #171717 #99FFFFFF - #1F1F1F + #303030 #5ff8b0 From 38710814e2e6a166164ed9f10c391c9cdd0a5882 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 24 Jun 2021 11:22:32 +1000 Subject: [PATCH 03/21] 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"> Date: Thu, 24 Jun 2021 11:24:25 +1000 Subject: [PATCH 04/21] Add documentation --- .../securesms/conversation/v2/ConversationActivityV2.kt | 4 ++++ 1 file changed, 4 insertions(+) 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 cf46cd30b1..3376e7b93d 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 @@ -372,6 +372,10 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe this.actionMode = null } } else { + // NOTE: + // We have to use onContentClick (rather than a click listener directly on + // the view) so as to not interfere with all the other gestures. Do not add + // onClickListeners directly to message content views. view.onContentClick() } } From e4292a3db5c0388f6961347db52cdf7433d8f308 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 24 Jun 2021 11:38:06 +1000 Subject: [PATCH 05/21] Add action bar subtitle --- .../conversation/v2/ConversationActivityV2.kt | 21 ++++++ .../activity_conversation_v2_action_bar.xml | 64 +++++++++++++++---- 2 files changed, 74 insertions(+), 11 deletions(-) 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 3376e7b93d..40c2ec1aa4 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 @@ -43,6 +43,8 @@ import org.thoughtcrime.securesms.database.DraftDatabase.Drafts import org.thoughtcrime.securesms.database.model.MessageRecord import org.thoughtcrime.securesms.loki.utilities.toPx import org.thoughtcrime.securesms.mms.GlideApp +import org.thoughtcrime.securesms.util.DateUtils +import java.util.* import kotlin.math.* class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDelegate, @@ -109,6 +111,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe scrollToBottomButton.setOnClickListener { conversationRecyclerView.smoothScrollToPosition(0) } updateUnreadCount() setUpTypingObserver() + updateSubtitle() } private fun setUpRecyclerView() { @@ -352,6 +355,24 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe unreadCountTextView.setTypeface(Typeface.DEFAULT, if (unreadCount < 100) Typeface.BOLD else Typeface.NORMAL) unreadCountIndicator.isVisible = (unreadCount != 0) } + + private fun updateSubtitle() { + muteIconImageView.isVisible = thread.isMuted + conversationSubtitleView.isVisible = true + if (thread.isMuted) { + conversationSubtitleView.text = getString(R.string.ConversationActivity_muted_until_date, DateUtils.getFormattedDateTime(thread.mutedUntil, "EEE, MMM d, yyyy HH:mm", Locale.getDefault())) + } else if (thread.isGroupRecipient) { + val openGroup = DatabaseFactory.getLokiThreadDatabase(this).getOpenGroupChat(threadID) + if (openGroup != null) { + val userCount = DatabaseFactory.getLokiAPIDatabase(this).getUserCount(openGroup.room, openGroup.server) ?: 0 + conversationSubtitleView.text = getString(R.string.ConversationActivity_member_count, userCount) + } else { + conversationSubtitleView.isVisible = false + } + } else { + conversationSubtitleView.isVisible = false + } + } // endregion // region Interaction diff --git a/app/src/main/res/layout/activity_conversation_v2_action_bar.xml b/app/src/main/res/layout/activity_conversation_v2_action_bar.xml index 4716171f50..294e75564c 100644 --- a/app/src/main/res/layout/activity_conversation_v2_action_bar.xml +++ b/app/src/main/res/layout/activity_conversation_v2_action_bar.xml @@ -1,8 +1,9 @@ - @@ -11,16 +12,57 @@ android:layout_width="@dimen/small_profile_picture_size" android:layout_height="@dimen/small_profile_picture_size" /> - + android:layout_marginTop="-2dp" + android:orientation="vertical"> + + + + + + + + + + + + \ No newline at end of file From ed5641df03ff6835a0190bf05113845f002dc899 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 24 Jun 2021 11:43:51 +1000 Subject: [PATCH 06/21] Fetch latest open group member count when opening a conversation --- .../conversation/v2/ConversationActivityV2.kt | 11 +++++++++++ 1 file changed, 11 insertions(+) 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 40c2ec1aa4..60e9862a3e 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 @@ -16,6 +16,7 @@ import androidx.loader.app.LoaderManager import androidx.loader.content.Loader import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView +import androidx.work.ListenableWorker import kotlinx.android.synthetic.main.activity_conversation_v2.* import kotlinx.android.synthetic.main.activity_conversation_v2.view.* import kotlinx.android.synthetic.main.activity_conversation_v2_action_bar.* @@ -25,7 +26,9 @@ import kotlinx.android.synthetic.main.view_input_bar.view.* 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 nl.komponents.kovenant.ui.successUi import org.session.libsession.messaging.mentions.MentionsManager +import org.session.libsession.messaging.open_groups.OpenGroupAPIV2 import org.session.libsession.utilities.recipients.Recipient import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.PassphraseRequiredActionBarActivity @@ -41,6 +44,8 @@ import org.thoughtcrime.securesms.database.DatabaseFactory import org.thoughtcrime.securesms.database.DraftDatabase import org.thoughtcrime.securesms.database.DraftDatabase.Drafts import org.thoughtcrime.securesms.database.model.MessageRecord +import org.thoughtcrime.securesms.loki.api.PublicChatInfoUpdateWorker +import org.thoughtcrime.securesms.loki.utilities.OpenGroupUtilities import org.thoughtcrime.securesms.loki.utilities.toPx import org.thoughtcrime.securesms.mms.GlideApp import org.thoughtcrime.securesms.util.DateUtils @@ -112,6 +117,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe updateUnreadCount() setUpTypingObserver() updateSubtitle() + getLatestOpenGroupInfoIfNeeded() } private fun setUpRecyclerView() { @@ -190,6 +196,11 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } } + private fun getLatestOpenGroupInfoIfNeeded() { + val openGroup = DatabaseFactory.getLokiThreadDatabase(this).getOpenGroupChat(threadID) ?: return + OpenGroupAPIV2.getMemberCount(openGroup.room, openGroup.server).successUi { updateSubtitle() } + } + override fun onPrepareOptionsMenu(menu: Menu): Boolean { ConversationMenuHelper.onPrepareOptionsMenu(menu, menuInflater, thread, this) { onOptionsItemSelected(it) } super.onPrepareOptionsMenu(menu) From 1dc7f7e9c02a80845dd972d67988dba8a8850fc5 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 24 Jun 2021 13:14:18 +1000 Subject: [PATCH 07/21] Make dialogs look better --- .../securesms/loki/dialogs/ClearAllDataDialog.kt | 3 +++ .../org/thoughtcrime/securesms/loki/dialogs/SeedDialog.kt | 3 +++ app/src/main/res/drawable/default_dialog_background.xml | 1 - .../main/res/drawable/default_dialog_background_inset.xml | 3 +-- app/src/main/res/layout/dialog_clear_all_data.xml | 6 ++---- app/src/main/res/layout/dialog_seed.xml | 5 +---- app/src/main/res/values/themes.xml | 5 +++++ 7 files changed, 15 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt index cb1bf22566..8f14447d30 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/ClearAllDataDialog.kt @@ -12,6 +12,7 @@ import network.loki.messenger.R import org.thoughtcrime.securesms.ApplicationContext import org.thoughtcrime.securesms.loki.protocol.MultiDeviceProtocol import org.session.libsession.utilities.KeyPairUtilities +import org.thoughtcrime.securesms.loki.utilities.UiModeUtilities class ClearAllDataDialog : DialogFragment() { @@ -23,6 +24,8 @@ class ClearAllDataDialog : DialogFragment() { builder.setView(contentView) val result = builder.create() result.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + val isLightMode = UiModeUtilities.isDayUiMode(requireContext()) + result.window?.setDimAmount(if (isLightMode) 0.1f else 0.75f) return result } diff --git a/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/SeedDialog.kt b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/SeedDialog.kt index 2bd9595b22..41509dc2a9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/SeedDialog.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/loki/dialogs/SeedDialog.kt @@ -17,6 +17,7 @@ import org.session.libsession.utilities.IdentityKeyUtil import org.thoughtcrime.securesms.loki.utilities.MnemonicUtilities import org.session.libsignal.crypto.MnemonicCodec import org.session.libsignal.utilities.hexEncodedPrivateKey +import org.thoughtcrime.securesms.loki.utilities.UiModeUtilities class SeedDialog : DialogFragment() { @@ -40,6 +41,8 @@ class SeedDialog : DialogFragment() { builder.setView(contentView) val result = builder.create() result.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT)) + val isLightMode = UiModeUtilities.isDayUiMode(requireContext()) + result.window?.setDimAmount(if (isLightMode) 0.1f else 0.75f) return result } diff --git a/app/src/main/res/drawable/default_dialog_background.xml b/app/src/main/res/drawable/default_dialog_background.xml index fff764ebd5..4cd206aca8 100644 --- a/app/src/main/res/drawable/default_dialog_background.xml +++ b/app/src/main/res/drawable/default_dialog_background.xml @@ -7,5 +7,4 @@ - \ No newline at end of file diff --git a/app/src/main/res/drawable/default_dialog_background_inset.xml b/app/src/main/res/drawable/default_dialog_background_inset.xml index b67cfb0b73..0ff315ebd3 100644 --- a/app/src/main/res/drawable/default_dialog_background_inset.xml +++ b/app/src/main/res/drawable/default_dialog_background_inset.xml @@ -2,6 +2,5 @@ + android:inset="@dimen/medium_spacing"> \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_clear_all_data.xml b/app/src/main/res/layout/dialog_clear_all_data.xml index a4c94c2e84..9d82d0bbad 100644 --- a/app/src/main/res/layout/dialog_clear_all_data.xml +++ b/app/src/main/res/layout/dialog_clear_all_data.xml @@ -6,10 +6,8 @@ android:background="@drawable/default_dialog_background_inset" android:gravity="center_horizontal" android:orientation="vertical" - android:paddingLeft="32dp" - android:paddingTop="@dimen/medium_spacing" - android:paddingRight="32dp" - android:paddingBottom="@dimen/medium_spacing"> + android:elevation="4dp" + android:padding="32dp"> + android:padding="32dp"> true + + From 7373918d3d8f2702d9fc5c826d6ad72417f65c89 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Thu, 24 Jun 2021 13:38:59 +1000 Subject: [PATCH 08/21] Add blocked dialog --- app/src/main/AndroidManifest.xml | 2 +- .../components/ConversationTypingView.java | 2 +- .../conversation/v2/ConversationActivityV2.kt | 3 + .../OpenGroupGuidelinesView.kt | 4 +- .../{ => components}/TypingIndicatorView.java | 2 +- .../TypingIndicatorViewContainer.kt | 2 +- .../conversation/v2/dialogs/BlockedDialog.kt | 38 +++++++++++++ .../conversation/v2/utilities/BaseDialog.kt | 26 +++++++++ .../OpenGroupGuidelinesActivity.kt | 2 +- .../loki/dialogs/ClearAllDataDialog.kt | 11 +--- .../securesms/loki/dialogs/SeedDialog.kt | 17 +----- .../res/layout/activity_conversation_v2.xml | 4 +- .../main/res/layout/conversation_activity.xml | 2 +- .../res/layout/conversation_typing_view.xml | 2 +- app/src/main/res/layout/dialog_blocked.xml | 56 +++++++++++++++++++ app/src/main/res/layout/view_conversation.xml | 2 +- .../view_conversation_typing_container.xml | 2 +- .../main/res/layout/view_typing_indicator.xml | 2 +- app/src/main/res/values/strings.xml | 6 +- 19 files changed, 149 insertions(+), 36 deletions(-) rename app/src/main/java/org/thoughtcrime/securesms/conversation/v2/{ => components}/OpenGroupGuidelinesView.kt (84%) rename app/src/main/java/org/thoughtcrime/securesms/conversation/v2/{ => components}/TypingIndicatorView.java (98%) rename app/src/main/java/org/thoughtcrime/securesms/conversation/v2/{ => components}/TypingIndicatorViewContainer.kt (93%) create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/dialogs/BlockedDialog.kt create mode 100644 app/src/main/java/org/thoughtcrime/securesms/conversation/v2/utilities/BaseDialog.kt rename app/src/main/java/org/thoughtcrime/securesms/{conversation/v2 => loki/activities}/OpenGroupGuidelinesActivity.kt (97%) create mode 100644 app/src/main/res/layout/dialog_blocked.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e61edbe7e0..32869dd1f1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -223,7 +223,7 @@ android:screenOrientation="portrait" android:theme="@style/Theme.Session.DayNight.FlatActionBar" /> - - - - diff --git a/app/src/main/res/layout/dialog_blocked.xml b/app/src/main/res/layout/dialog_blocked.xml new file mode 100644 index 0000000000..b66fa4fe98 --- /dev/null +++ b/app/src/main/res/layout/dialog_blocked.xml @@ -0,0 +1,56 @@ + + + + + + + + + +