Skip to content

Commit

Permalink
Add unread mention badging to conversation list.
Browse files Browse the repository at this point in the history
  • Loading branch information
cody-signal authored and alex-signal committed Oct 25, 2022
1 parent ea9bf0c commit 341b8ef
Show file tree
Hide file tree
Showing 15 changed files with 195 additions and 128 deletions.
Expand Up @@ -36,7 +36,7 @@ public ConversationScrollToView(@NonNull Context context, @Nullable AttributeSet
unreadCount = findViewById(R.id.conversation_scroll_to_count);
scrollButton = findViewById(R.id.conversation_scroll_to_button);

if (attrs != null) {
if (attrs != null && !isInEditMode()) {
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ConversationScrollToView);
int srcId = array.getResourceId(R.styleable.ConversationScrollToView_cstv_scroll_button_src, 0);

Expand Down
Expand Up @@ -18,7 +18,7 @@ open class SimpleEmojiTextView @JvmOverloads constructor(
private val sizeChangeDebouncer: ThrottledDebouncer = ThrottledDebouncer(200)

init {
isEmojiCompatEnabled = SignalStore.settings().isPreferSystemEmoji
isEmojiCompatEnabled = isInEditMode || SignalStore.settings().isPreferSystemEmoji
}

override fun setText(text: CharSequence?, type: BufferType?) {
Expand Down
Expand Up @@ -357,9 +357,9 @@ public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,

giphyMp4ProjectionRecycler = initializeGiphyMp4();

this.groupViewModel = new ViewModelProvider(getParentFragment(), new ConversationGroupViewModel.Factory()).get(ConversationGroupViewModel.class);
this.groupViewModel = new ViewModelProvider(getParentFragment(), (ViewModelProvider.Factory) new ConversationGroupViewModel.Factory()).get(ConversationGroupViewModel.class);
this.messageCountsViewModel = new ViewModelProvider(getParentFragment()).get(MessageCountsViewModel.class);
this.conversationViewModel = new ViewModelProvider(getParentFragment(), new ConversationViewModel.Factory()).get(ConversationViewModel.class);
this.conversationViewModel = new ViewModelProvider(getParentFragment(), (ViewModelProvider.Factory) new ConversationViewModel.Factory()).get(ConversationViewModel.class);

disposables.add(conversationViewModel.getChatColors().subscribe(chatColors -> {
recyclerViewColorizer.setChatColors(chatColors);
Expand Down
Expand Up @@ -124,7 +124,7 @@ protected void reverseArchiveThreads(Set<Long> threadIds) {

@SuppressLint("StaticFieldLeak")
@Override
protected void onItemSwiped(long threadId, int unreadCount) {
protected void onItemSwiped(long threadId, int unreadCount, int unreadSelfMentionsCount) {
archiveDecoration.onArchiveStarted();
itemAnimator.enable();

Expand Down
Expand Up @@ -40,7 +40,6 @@
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

Expand Down Expand Up @@ -76,6 +75,7 @@
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;
import org.signal.core.util.DimensionUnit;
import org.signal.core.util.Stopwatch;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.concurrent.SimpleTask;
import org.signal.core.util.logging.Log;
Expand Down Expand Up @@ -156,7 +156,6 @@
import org.thoughtcrime.securesms.util.SignalProxyUtil;
import org.thoughtcrime.securesms.util.SnapToTopDataObserver;
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
import org.signal.core.util.Stopwatch;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
Expand Down Expand Up @@ -1394,7 +1393,7 @@ protected void reverseArchiveThreads(Set<Long> threadIds) {
}

@SuppressLint("StaticFieldLeak")
protected void onItemSwiped(long threadId, int unreadCount) {
protected void onItemSwiped(long threadId, int unreadCount, int unreadSelfMentionsCount) {
archiveDecoration.onArchiveStarted();
itemAnimator.enable();

Expand Down Expand Up @@ -1434,7 +1433,7 @@ protected void reverseAction(@Nullable Long parameter) {
threadDatabase.restorePins(pinnedThreadIds);

if (unreadCount > 0) {
threadDatabase.incrementUnread(threadId, unreadCount);
threadDatabase.incrementUnread(threadId, unreadCount, unreadSelfMentionsCount);
ApplicationDependencies.getMessageNotifier().updateNotification(context);
}

Expand Down Expand Up @@ -1558,10 +1557,9 @@ public long getAnimationDuration(@NonNull RecyclerView recyclerView, int animati
}

private void onTrueSwipe(RecyclerView.ViewHolder viewHolder) {
final long threadId = ((ConversationListItem) viewHolder.itemView).getThreadId();
final int unreadCount = ((ConversationListItem) viewHolder.itemView).getUnreadCount();
ThreadRecord thread = ((ConversationListItem) viewHolder.itemView).getThread();

onItemSwiped(threadId, unreadCount);
onItemSwiped(thread.getThreadId(), thread.getUnreadCount(), thread.getUnreadSelfMentionsCount());
}

@Override
Expand Down
Expand Up @@ -117,6 +117,7 @@ public final class ConversationListItem extends ConstraintLayout implements Bind
private View checkContainer;
private View uncheckedView;
private View checkedView;
private View unreadMentions;
private int thumbSize;
private GlideLiveDataTarget thumbTarget;

Expand Down Expand Up @@ -149,6 +150,7 @@ protected void onFinishInflate() {
this.checkContainer = findViewById(R.id.conversation_list_item_check_container);
this.uncheckedView = findViewById(R.id.conversation_list_item_unchecked);
this.checkedView = findViewById(R.id.conversation_list_item_checked);
this.unreadMentions = findViewById(R.id.conversation_list_item_unread_mentions_indicator);
this.thumbSize = (int) DimensionUnit.SP.toPixels(16f);
this.thumbTarget = new GlideLiveDataTarget(thumbSize, thumbSize);

Expand Down Expand Up @@ -277,6 +279,7 @@ public void bindContact(@NonNull LifecycleOwner lifecycleOwner,
dateView.setText("");
archivedView.setVisibility(GONE);
unreadIndicator.setVisibility(GONE);
unreadMentions.setVisibility(GONE);
deliveryStatusIndicator.setNone();
alertView.setNone();

Expand Down Expand Up @@ -304,6 +307,7 @@ public void bindMessage(@NonNull LifecycleOwner lifecycleOwner,
dateView.setText(DateUtils.getBriefRelativeTimeSpanString(getContext(), locale, messageResult.getReceivedTimestampMs()));
archivedView.setVisibility(GONE);
unreadIndicator.setVisibility(GONE);
unreadMentions.setVisibility(GONE);
deliveryStatusIndicator.setNone();
alertView.setNone();

Expand Down Expand Up @@ -464,11 +468,19 @@ private void setStatusIcons(ThreadRecord thread) {
private void setUnreadIndicator(ThreadRecord thread) {
if (thread.isRead()) {
unreadIndicator.setVisibility(View.GONE);
unreadMentions.setVisibility(View.GONE);
return;
}

if (thread.getUnreadSelfMentionsCount() > 0) {
unreadMentions.setVisibility(View.VISIBLE);
unreadIndicator.setVisibility(thread.getUnreadCount() == 1 ? View.GONE : View.VISIBLE);
} else {
unreadMentions.setVisibility(View.GONE);
unreadIndicator.setVisibility(View.VISIBLE);
}

unreadIndicator.setText(unreadCount > 0 ? String.valueOf(unreadCount) : " ");
unreadIndicator.setVisibility(View.VISIBLE);
}

private void onRecipientChanged(@NonNull Recipient recipient) {
Expand Down
Expand Up @@ -1988,7 +1988,8 @@ private Optional<InsertResult> insertMessageInbox(IncomingMediaMessage retrieved

boolean isNotStoryGroupReply = retrieved.getParentStoryId() == null || !retrieved.getParentStoryId().isGroupReply();
if (!Types.isExpirationTimerUpdate(mailbox) && !retrieved.getStoryType().isStory() && isNotStoryGroupReply) {
SignalDatabase.threads().incrementUnread(threadId, 1);
boolean incrementUnreadMentions = !retrieved.getMentions().isEmpty() && retrieved.getMentions().stream().anyMatch(m -> m.getRecipientId().equals(Recipient.self().getId()));
SignalDatabase.threads().incrementUnread(threadId, 1, incrementUnreadMentions ? 1 : 0);
SignalDatabase.threads().update(threadId, true);
}

Expand Down Expand Up @@ -2098,7 +2099,7 @@ public void markIncomingNotificationReceived(long threadId) {
notifyConversationListeners(threadId);

if (org.thoughtcrime.securesms.util.Util.isDefaultSmsProvider(context)) {
SignalDatabase.threads().incrementUnread(threadId, 1);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}

SignalDatabase.threads().update(threadId, true);
Expand Down
Expand Up @@ -741,7 +741,7 @@ public void insertOrUpdateGroupCall(@NonNull RecipientId groupRecipientId,

db.insert(TABLE_NAME, null, values);

SignalDatabase.threads().incrementUnread(threadId, 1);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}

SignalDatabase.threads().update(threadId, true);
Expand Down Expand Up @@ -818,7 +818,7 @@ public void insertOrUpdateGroupCall(@NonNull RecipientId groupRecipientId,

db.insert(TABLE_NAME, null, values);

SignalDatabase.threads().incrementUnread(threadId, 1);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}

SignalDatabase.threads().update(threadId, true);
Expand Down Expand Up @@ -890,7 +890,7 @@ public boolean updatePreviousGroupCall(long threadId, @Nullable String peekGroup
long messageId = db.insert(TABLE_NAME, null, values);

if (unread) {
SignalDatabase.threads().incrementUnread(threadId, 1);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}

SignalDatabase.threads().update(threadId, true);
Expand Down Expand Up @@ -1278,7 +1278,7 @@ public Optional<InsertResult> insertMessageInbox(IncomingTextMessage message, lo
long messageId = db.insert(TABLE_NAME, null, values);

if (unread) {
SignalDatabase.threads().incrementUnread(threadId, 1);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
}

if (!silent) {
Expand Down Expand Up @@ -1324,7 +1324,7 @@ public Optional<InsertResult> insertMessageInbox(IncomingTextMessage message) {

long messageId = db.insert(TABLE_NAME, null, values);

SignalDatabase.threads().incrementUnread(threadId, 1);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
SignalDatabase.threads().update(threadId, true);

notifyConversationListeners(threadId);
Expand All @@ -1348,7 +1348,7 @@ public void insertBadDecryptMessage(@NonNull RecipientId recipientId, int sender

databaseHelper.getSignalWritableDatabase().insert(TABLE_NAME, null, values);

SignalDatabase.threads().incrementUnread(threadId, 1);
SignalDatabase.threads().incrementUnread(threadId, 1, 0);
SignalDatabase.threads().update(threadId, true);

notifyConversationListeners(threadId);
Expand Down

0 comments on commit 341b8ef

Please sign in to comment.