diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java index a25460cd4..2766501a8 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationActivity.java @@ -47,7 +47,6 @@ import org.briarproject.bramble.api.plugin.ConnectionRegistry; import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent; import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent; import org.briarproject.bramble.api.settings.SettingsManager; -import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.event.MessagesAckedEvent; import org.briarproject.bramble.api.sync.event.MessagesSentEvent; @@ -256,6 +255,9 @@ public class ConversationActivity extends BriarActivity list.setLayoutManager(layoutManager); list.setAdapter(adapter); list.setEmptyText(getString(R.string.no_private_messages)); + ConversationScrollListener scrollListener = + new ConversationScrollListener(adapter, viewModel); + list.getRecyclerView().addOnScrollListener(scrollListener); textInputView = findViewById(R.id.text_input_container); if (FEATURE_FLAG_IMAGE_ATTACHMENTS) { @@ -787,23 +789,6 @@ public class ConversationActivity extends BriarActivity .show(); } - @Override - public void onItemVisible(ConversationItem item) { - if (!item.isRead()) markMessageRead(item.getGroupId(), item.getId()); - } - - private void markMessageRead(GroupId g, MessageId m) { - runOnDbThread(() -> { - try { - long start = now(); - messagingManager.setReadFlag(g, m, true); - logDuration(LOG, "Marking read", start); - } catch (DbException e) { - logException(LOG, WARNING, e); - } - }); - } - @UiThread @Override public void respondToRequest(ConversationRequestItem item, boolean accept) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationAdapter.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationAdapter.java index 0194a2d7f..b9fa34812 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationAdapter.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationAdapter.java @@ -14,12 +14,14 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.briar.R; import org.briarproject.briar.android.util.BriarAdapter; +import org.briarproject.briar.android.util.ItemReturningAdapter; import javax.annotation.Nullable; @NotNullByDefault class ConversationAdapter - extends BriarAdapter { + extends BriarAdapter + implements ItemReturningAdapter { private ConversationListener listener; private final RecycledViewPool imageViewPool; @@ -69,7 +71,6 @@ class ConversationAdapter public void onBindViewHolder(ConversationItemViewHolder ui, int position) { ConversationItem item = items.get(position); ui.bind(item); - listener.onItemVisible(item); } @Override diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItem.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItem.java index 5ab0ee33c..5fb4c5b4b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItem.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItem.java @@ -69,6 +69,10 @@ abstract class ConversationItem { return read; } + void markRead() { + read = true; + } + /** * Only useful for outgoing messages. */ diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationListener.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationListener.java index 9c8db9538..d7c445fae 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationListener.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationListener.java @@ -9,8 +9,6 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; @NotNullByDefault interface ConversationListener { - void onItemVisible(ConversationItem item); - void respondToRequest(ConversationRequestItem item, boolean accept); void openRequestedShareable(ConversationRequestItem item); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationScrollListener.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationScrollListener.java new file mode 100644 index 000000000..300a8ed3b --- /dev/null +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationScrollListener.java @@ -0,0 +1,26 @@ +package org.briarproject.briar.android.conversation; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.briar.android.view.BriarRecyclerViewScrollListener; + +@NotNullByDefault +class ConversationScrollListener extends + BriarRecyclerViewScrollListener { + + private final ConversationViewModel viewModel; + + protected ConversationScrollListener(ConversationAdapter adapter, + ConversationViewModel viewModel) { + super(adapter); + this.viewModel = viewModel; + } + + @Override + protected void onNewItemVisible(ConversationItem item) { + if (!item.isRead()) { + viewModel.markMessageRead(item.getGroupId(), item.getId()); + item.markRead(); + } + } + +} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java index 5f93fcd14..c9b3a1cd7 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationViewModel.java @@ -26,6 +26,7 @@ import org.briarproject.bramble.api.settings.Settings; import org.briarproject.bramble.api.settings.SettingsManager; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.Message; +import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.briar.android.util.UiUtils; import org.briarproject.briar.api.messaging.Attachment; import org.briarproject.briar.api.messaging.AttachmentHeader; @@ -150,6 +151,18 @@ public class ConversationViewModel extends AndroidViewModel { }); } + void markMessageRead(GroupId g, MessageId m) { + dbExecutor.execute(() -> { + try { + long start = now(); + messagingManager.setReadFlag(g, m, true); + logDuration(LOG, "Marking read", start); + } catch (DbException e) { + logException(LOG, WARNING, e); + } + }); + } + void setContactAlias(String alias) { dbExecutor.execute(() -> { try {