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 08219d4a5..5ce686a9b 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 @@ -63,6 +63,7 @@ import org.briarproject.briar.android.view.TextSendController; import org.briarproject.briar.android.view.TextSendController.SendState; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.attachment.AttachmentHeader; +import org.briarproject.briar.api.autodelete.event.ConversationMessagesDeletedEvent; import org.briarproject.briar.api.blog.BlogSharingManager; import org.briarproject.briar.api.client.ProtocolStateException; import org.briarproject.briar.api.client.SessionId; @@ -671,6 +672,13 @@ public class ConversationActivity extends BriarActivity LOG.info("Messages acked"); markMessages(m.getMessageIds(), true, true); } + } else if (e instanceof ConversationMessagesDeletedEvent) { + ConversationMessagesDeletedEvent m = + (ConversationMessagesDeletedEvent) e; + if (m.getContactId().equals(contactId)) { + LOG.info("Messages auto-deleted"); + onConversationMessagesDeleted(m.getMessageIds()); + } } else if (e instanceof ContactConnectedEvent) { ContactConnectedEvent c = (ContactConnectedEvent) e; if (c.getContactId().equals(contactId)) { @@ -718,6 +726,13 @@ public class ConversationActivity extends BriarActivity } } + @UiThread + private void onConversationMessagesDeleted( + Collection messageIds) { + adapter.incrementRevision(); + adapter.removeItems(messageIds); + } + @UiThread private void markMessages(Collection messageIds, boolean sent, boolean seen) { 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 84fddd084..2e8d81d82 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 @@ -13,10 +13,13 @@ import org.briarproject.briar.R; import org.briarproject.briar.android.util.BriarAdapter; import org.briarproject.briar.android.util.ItemReturningAdapter; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; import androidx.annotation.LayoutRes; import androidx.annotation.Nullable; +import androidx.annotation.UiThread; import androidx.recyclerview.selection.SelectionTracker; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView.RecycledViewPool; @@ -126,6 +129,22 @@ class ConversationAdapter items.endBatchedUpdates(); } + @UiThread + void removeItems(Collection messageIds) { + // Collect all items to be deleted first + // and then delete them in one batched update. + // Deleting them right away would cause issues + // due to changing list positions. + List toRemove = new ArrayList<>(messageIds.size()); + for (int i = 0; i < items.size(); i++) { + ConversationItem item = items.get(i); + if (messageIds.contains(item.getId())) toRemove.add(item); + } + items.beginBatchedUpdates(); + for (ConversationItem item : toRemove) items.remove(item); + items.endBatchedUpdates(); + } + private void updateTimersInBatch() { long lastTimerIncoming = NO_AUTO_DELETE_TIMER; long lastTimerOutgoing = NO_AUTO_DELETE_TIMER;