From 10bab8dc8c76dadd495e82ce69a17799c5622385 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Sat, 5 Dec 2020 09:52:08 -0300 Subject: [PATCH 1/2] Show timer change notices in private conversations --- .../conversation/ConversationAdapter.java | 82 +++++++++++++------ .../conversation/ConversationItem.java | 50 ++++++++++- .../ConversationItemViewHolder.java | 44 +++++++++- .../conversation/ConversationMessageItem.java | 5 +- .../conversation/ConversationNoticeItem.java | 9 +- .../conversation/ConversationRequestItem.java | 8 +- .../conversation/ConversationVisitor.java | 53 ++++++++---- .../list_item_conversation_msg_image.xml | 2 + .../list_item_conversation_msg_image_text.xml | 2 + .../layout/list_item_conversation_msg_in.xml | 17 ++-- .../list_item_conversation_msg_in_content.xml | 2 + .../layout/list_item_conversation_msg_out.xml | 10 ++- .../list_item_conversation_notice_in.xml | 9 +- .../list_item_conversation_notice_out.xml | 6 +- .../layout/list_item_conversation_request.xml | 6 +- .../list_item_conversation_top_notice_in.xml | 19 +++++ .../list_item_conversation_top_notice_out.xml | 21 +++++ briar-android/src/main/res/values/strings.xml | 8 ++ 18 files changed, 283 insertions(+), 70 deletions(-) create mode 100644 briar-android/src/main/res/layout/list_item_conversation_top_notice_in.xml create mode 100644 briar-android/src/main/res/layout/list_item_conversation_top_notice_out.xml 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 1e7065df7..662ea2729 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,6 +13,8 @@ import org.briarproject.briar.R; import org.briarproject.briar.android.util.BriarAdapter; import org.briarproject.briar.android.util.ItemReturningAdapter; +import java.util.Collection; + import androidx.annotation.LayoutRes; import androidx.annotation.Nullable; import androidx.recyclerview.selection.SelectionTracker; @@ -20,13 +22,14 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView.RecycledViewPool; import static androidx.recyclerview.widget.RecyclerView.NO_POSITION; +import static org.briarproject.briar.api.autodelete.AutoDeleteConstants.NO_AUTO_DELETE_TIMER; @NotNullByDefault class ConversationAdapter extends BriarAdapter implements ItemReturningAdapter { - private ConversationListener listener; + private final ConversationListener listener; private final RecycledViewPool imageViewPool; private final ImageItemDecoration imageItemDecoration; @Nullable @@ -65,22 +68,20 @@ class ConversationAdapter @LayoutRes int type) { View v = LayoutInflater.from(viewGroup.getContext()).inflate( type, viewGroup, false); - switch (type) { - case R.layout.list_item_conversation_msg_in: - return new ConversationMessageViewHolder(v, listener, true, - imageViewPool, imageItemDecoration); - case R.layout.list_item_conversation_msg_out: - return new ConversationMessageViewHolder(v, listener, false, - imageViewPool, imageItemDecoration); - case R.layout.list_item_conversation_notice_in: - return new ConversationNoticeViewHolder(v, listener, true); - case R.layout.list_item_conversation_notice_out: - return new ConversationNoticeViewHolder(v, listener, false); - case R.layout.list_item_conversation_request: - return new ConversationRequestViewHolder(v, listener, true); - default: - throw new IllegalArgumentException("Unknown ConversationItem"); + if (type == R.layout.list_item_conversation_msg_in) { + return new ConversationMessageViewHolder(v, listener, true, + imageViewPool, imageItemDecoration); + } else if (type == R.layout.list_item_conversation_msg_out) { + return new ConversationMessageViewHolder(v, listener, false, + imageViewPool, imageItemDecoration); + } else if (type == R.layout.list_item_conversation_notice_in) { + return new ConversationNoticeViewHolder(v, listener, true); + } else if (type == R.layout.list_item_conversation_notice_out) { + return new ConversationNoticeViewHolder(v, listener, false); + } else if (type == R.layout.list_item_conversation_request) { + return new ConversationRequestViewHolder(v, listener, true); } + throw new IllegalArgumentException("Unknown ConversationItem"); } @Override @@ -107,22 +108,53 @@ class ConversationAdapter return c1.equals(c2); } - void setSelectionTracker(SelectionTracker tracker) { - this.tracker = tracker; + @Override + public void add(ConversationItem item) { + items.beginBatchedUpdates(); + items.add(item); + updateTimersInBatch(true); + items.endBatchedUpdates(); } - @Nullable - ConversationItem getLastItem() { - if (items.size() > 0) { - return items.get(items.size() - 1); - } else { - return null; + @Override + public void addAll(Collection itemsToAdd) { + items.beginBatchedUpdates(); + items.addAll(itemsToAdd); + updateTimersInBatch(false); + items.endBatchedUpdates(); + } + + private void updateTimersInBatch(boolean updateItems) { + long lastTimerIncoming = NO_AUTO_DELETE_TIMER; + long lastTimerOutgoing = NO_AUTO_DELETE_TIMER; + for (int i = 0; i < items.size(); i++) { + ConversationItem c = items.get(i); + boolean itemChanged; + boolean timerChanged; + boolean timerMirrored; + if (c.isIncoming()) { + timerChanged = lastTimerIncoming != c.getAutoDeleteTimer(); + timerMirrored = timerChanged && + lastTimerOutgoing == c.getAutoDeleteTimer(); + lastTimerIncoming = c.getAutoDeleteTimer(); + } else { + timerChanged = lastTimerOutgoing != c.getAutoDeleteTimer(); + timerMirrored = timerChanged && + lastTimerIncoming == c.getAutoDeleteTimer(); + lastTimerOutgoing = c.getAutoDeleteTimer(); + } + itemChanged = c.setTimerNoticeVisible(timerChanged); + itemChanged |= c.setTimerMirrored(timerMirrored); + if (itemChanged && updateItems) items.updateItemAt(i, c); } } + void setSelectionTracker(SelectionTracker tracker) { + this.tracker = tracker; + } + SparseArray getOutgoingMessages() { SparseArray messages = new SparseArray<>(); - for (int i = 0; i < items.size(); i++) { ConversationItem item = items.get(i); if (!item.isIncoming()) { 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 470a5fd2c..2802892ce 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 @@ -9,6 +9,7 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.NotThreadSafe; import androidx.annotation.LayoutRes; +import androidx.lifecycle.LiveData; import static org.briarproject.bramble.util.StringUtils.toHexString; @@ -24,9 +25,11 @@ abstract class ConversationItem { private final GroupId groupId; private final long time, autoDeleteTimer; private final boolean isIncoming; - private boolean read, sent, seen; + private final LiveData contactName; + private boolean read, sent, seen, showTimerNotice, timerMirrored; - ConversationItem(@LayoutRes int layoutRes, ConversationMessageHeader h) { + ConversationItem(@LayoutRes int layoutRes, ConversationMessageHeader h, + LiveData contactName) { this.layoutRes = layoutRes; this.text = null; this.id = h.getId(); @@ -37,6 +40,9 @@ abstract class ConversationItem { this.sent = h.isSent(); this.seen = h.isSeen(); this.isIncoming = !h.isLocal(); + this.contactName = contactName; + this.showTimerNotice = false; + this.timerMirrored = false; } @LayoutRes @@ -116,4 +122,44 @@ abstract class ConversationItem { return isIncoming; } + public LiveData getContactName() { + return contactName; + } + + /** + * Set this to true when {@link #getAutoDeleteTimer()} has changed + * since the last message from the same peer. + * + * @return true if the value was set, false if it was already set. + */ + boolean setTimerNoticeVisible(boolean visible) { + if (this.showTimerNotice != visible) { + this.showTimerNotice = visible; + return true; + } + return false; + } + + boolean isTimerNoticeVisible() { + return showTimerNotice; + } + + /** + * Set this to true when {@link #getAutoDeleteTimer()} has changed + * to the same timer of the last message + * from the other peer in this conversation. + * + * @return true if the value was set, false if it was already set. + */ + public boolean setTimerMirrored(boolean timerMirrored) { + if (this.timerMirrored != timerMirrored) { + this.timerMirrored = timerMirrored; + return true; + } + return false; + } + + public boolean wasTimerMirrored() { + return timerMirrored; + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java index 7e9cd582d..c0d552e3f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java @@ -1,5 +1,6 @@ package org.briarproject.briar.android.conversation; +import android.content.Context; import android.view.View; import android.widget.TextView; @@ -27,7 +28,7 @@ abstract class ConversationItemViewHolder extends ViewHolder { protected final ConstraintLayout layout; @Nullable private final OutItemViewHolder outViewHolder; - private final TextView text; + private final TextView topNotice, text; protected final TextView time; private final View bomb; @Nullable @@ -39,6 +40,7 @@ abstract class ConversationItemViewHolder extends ViewHolder { this.listener = listener; this.outViewHolder = isIncoming ? null : new OutItemViewHolder(v); root = v; + topNotice = v.findViewById(R.id.topNotice); layout = v.findViewById(R.id.layout); text = v.findViewById(R.id.text); time = v.findViewById(R.id.time); @@ -50,6 +52,8 @@ abstract class ConversationItemViewHolder extends ViewHolder { itemKey = item.getKey(); root.setActivated(selected); + setTopNotice(item); + if (item.getText() != null) { text.setText(trim(item.getText())); } @@ -72,4 +76,42 @@ abstract class ConversationItemViewHolder extends ViewHolder { return itemKey; } + private void setTopNotice(ConversationItem item) { + if (item.isTimerNoticeVisible()) { + Context ctx = itemView.getContext(); + topNotice.setVisibility(VISIBLE); + boolean enabled = item.getAutoDeleteTimer() != NO_AUTO_DELETE_TIMER; + String text; + if (item.isIncoming()) { + String name = item.getContactName().getValue(); + if (item.wasTimerMirrored()) { + int strRes = enabled ? + R.string.auto_delete_msg_contact_enabled_mirrored : + R.string.auto_delete_msg_contact_disabled_mirrored; + text = ctx.getString(strRes, name); + } else { + int strRes = enabled ? + R.string.auto_delete_msg_contact_enabled : + R.string.auto_delete_msg_contact_disabled; + text = ctx.getString(strRes, name, name); + } + } else { + int strRes; + if (item.wasTimerMirrored()) { + strRes = enabled ? + R.string.auto_delete_msg_you_enabled_mirrored : + R.string.auto_delete_msg_you_disabled_mirrored; + } else { + strRes = enabled ? + R.string.auto_delete_msg_you_enabled : + R.string.auto_delete_msg_you_disabled; + } + text = ctx.getString(strRes); + } + topNotice.setText(text); + } else { + topNotice.setVisibility(GONE); + } + } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationMessageItem.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationMessageItem.java index 8fc50d299..b9185c1ce 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationMessageItem.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationMessageItem.java @@ -10,6 +10,7 @@ import javax.annotation.concurrent.NotThreadSafe; import androidx.annotation.LayoutRes; import androidx.annotation.UiThread; +import androidx.lifecycle.LiveData; @NotThreadSafe @NotNullByDefault @@ -18,8 +19,8 @@ class ConversationMessageItem extends ConversationItem { private final List attachments; ConversationMessageItem(@LayoutRes int layoutRes, PrivateMessageHeader h, - List attachments) { - super(layoutRes, h); + LiveData contactName, List attachments) { + super(layoutRes, h, contactName); this.attachments = attachments; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationNoticeItem.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationNoticeItem.java index 0694a0762..50400017a 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationNoticeItem.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationNoticeItem.java @@ -8,6 +8,7 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.NotThreadSafe; import androidx.annotation.LayoutRes; +import androidx.lifecycle.LiveData; @NotThreadSafe @NotNullByDefault @@ -17,15 +18,15 @@ class ConversationNoticeItem extends ConversationItem { private final String msgText; ConversationNoticeItem(@LayoutRes int layoutRes, String text, - ConversationRequest r) { - super(layoutRes, r); + LiveData contactName, ConversationRequest r) { + super(layoutRes, r, contactName); this.text = text; this.msgText = r.getText(); } ConversationNoticeItem(@LayoutRes int layoutRes, String text, - ConversationResponse r) { - super(layoutRes, r); + LiveData contactName, ConversationResponse r) { + super(layoutRes, r, contactName); this.text = text; this.msgText = null; } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationRequestItem.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationRequestItem.java index 71984db65..5f7027d63 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationRequestItem.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationRequestItem.java @@ -11,6 +11,7 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.NotThreadSafe; import androidx.annotation.LayoutRes; +import androidx.lifecycle.LiveData; @NotThreadSafe @NotNullByDefault @@ -26,14 +27,15 @@ class ConversationRequestItem extends ConversationNoticeItem { private boolean answered; ConversationRequestItem(@LayoutRes int layoutRes, String text, - RequestType type, ConversationRequest r) { - super(layoutRes, text, r); + LiveData contactName, RequestType type, + ConversationRequest r) { + super(layoutRes, text, contactName, r); this.requestType = type; this.sessionId = r.getSessionId(); this.answered = r.wasAnswered(); if (r instanceof InvitationRequest) { this.requestedGroupId = ((Shareable) r.getNameable()).getId(); - this.canBeOpened = ((InvitationRequest) r).canBeOpened(); + this.canBeOpened = ((InvitationRequest) r).canBeOpened(); } else { this.requestedGroupId = null; this.canBeOpened = false; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationVisitor.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationVisitor.java index 46468c030..756c8535e 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationVisitor.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationVisitor.java @@ -60,10 +60,12 @@ class ConversationVisitor implements } if (h.isLocal()) { item = new ConversationMessageItem( - R.layout.list_item_conversation_msg_out, h, attachments); + R.layout.list_item_conversation_msg_out, h, contactName, + attachments); } else { item = new ConversationMessageItem( - R.layout.list_item_conversation_msg_in, h, attachments); + R.layout.list_item_conversation_msg_in, h, contactName, + attachments); } if (h.hasText()) { String text = textCache.getText(h.getId()); @@ -79,13 +81,15 @@ class ConversationVisitor implements String text = ctx.getString(R.string.blogs_sharing_invitation_sent, r.getName(), contactName.getValue()); return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_out, text, r); + R.layout.list_item_conversation_notice_out, text, + contactName, r); } else { String text = ctx.getString( R.string.blogs_sharing_invitation_received, contactName.getValue(), r.getName()); return new ConversationRequestItem( - R.layout.list_item_conversation_request, text, BLOG, r); + R.layout.list_item_conversation_request, text, contactName, + BLOG, r); } } @@ -104,7 +108,8 @@ class ConversationVisitor implements contactName.getValue()); } return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_out, text, r); + R.layout.list_item_conversation_notice_out, text, + contactName, r); } else { String text; if (r.wasAccepted()) { @@ -117,7 +122,8 @@ class ConversationVisitor implements contactName.getValue()); } return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_in, text, r); + R.layout.list_item_conversation_notice_in, text, + contactName, r); } } @@ -128,13 +134,15 @@ class ConversationVisitor implements String text = ctx.getString(R.string.forum_invitation_sent, r.getName(), contactName.getValue()); return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_out, text, r); + R.layout.list_item_conversation_notice_out, text, + contactName, r); } else { String text = ctx.getString( R.string.forum_invitation_received, contactName.getValue(), r.getName()); return new ConversationRequestItem( - R.layout.list_item_conversation_request, text, FORUM, r); + R.layout.list_item_conversation_request, text, contactName, + FORUM, r); } } @@ -153,7 +161,8 @@ class ConversationVisitor implements contactName.getValue()); } return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_out, text, r); + R.layout.list_item_conversation_notice_out, text, + contactName, r); } else { String text; if (r.wasAccepted()) { @@ -166,7 +175,8 @@ class ConversationVisitor implements contactName.getValue()); } return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_in, text, r); + R.layout.list_item_conversation_notice_in, text, + contactName, r); } } @@ -178,13 +188,15 @@ class ConversationVisitor implements R.string.groups_invitations_invitation_sent, contactName.getValue(), r.getName()); return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_out, text, r); + R.layout.list_item_conversation_notice_out, text, + contactName, r); } else { String text = ctx.getString( R.string.groups_invitations_invitation_received, contactName.getValue(), r.getName()); return new ConversationRequestItem( - R.layout.list_item_conversation_request, text, GROUP, r); + R.layout.list_item_conversation_request, text, contactName, + GROUP, r); } } @@ -203,7 +215,8 @@ class ConversationVisitor implements contactName.getValue()); } return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_out, text, r); + R.layout.list_item_conversation_notice_out, text, + contactName, r); } else { String text; if (r.wasAccepted()) { @@ -216,7 +229,8 @@ class ConversationVisitor implements contactName.getValue()); } return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_in, text, r); + R.layout.list_item_conversation_notice_in, text, + contactName, r); } } @@ -227,7 +241,8 @@ class ConversationVisitor implements String text = ctx.getString(R.string.introduction_request_sent, contactName.getValue(), name); return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_out, text, r); + R.layout.list_item_conversation_notice_out, text, + contactName, r); } else { String text; if (r.wasAnswered()) { @@ -243,7 +258,7 @@ class ConversationVisitor implements contactName.getValue(), name); } return new ConversationRequestItem( - R.layout.list_item_conversation_request, text, + R.layout.list_item_conversation_request, text, contactName, INTRODUCTION, r); } } @@ -268,7 +283,8 @@ class ConversationVisitor implements introducedAuthor); } return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_out, text, r); + R.layout.list_item_conversation_notice_out, text, + contactName, r); } else { String text; if (r.wasAccepted()) { @@ -288,7 +304,8 @@ class ConversationVisitor implements introducedAuthor); } return new ConversationNoticeItem( - R.layout.list_item_conversation_notice_in, text, r); + R.layout.list_item_conversation_notice_in, text, + contactName, r); } } diff --git a/briar-android/src/main/res/layout/list_item_conversation_msg_image.xml b/briar-android/src/main/res/layout/list_item_conversation_msg_image.xml index 93f197983..bb85bc7b5 100644 --- a/briar-android/src/main/res/layout/list_item_conversation_msg_image.xml +++ b/briar-android/src/main/res/layout/list_item_conversation_msg_image.xml @@ -1,4 +1,6 @@ + + + + - + android:background="@drawable/list_item_background_selectable" + android:orientation="vertical"> + + + - + diff --git a/briar-android/src/main/res/layout/list_item_conversation_msg_in_content.xml b/briar-android/src/main/res/layout/list_item_conversation_msg_in_content.xml index eb1397747..398f6507b 100644 --- a/briar-android/src/main/res/layout/list_item_conversation_msg_in_content.xml +++ b/briar-android/src/main/res/layout/list_item_conversation_msg_in_content.xml @@ -1,4 +1,6 @@ + + - + android:background="@drawable/list_item_background_selectable" + android:orientation="vertical" + android:paddingTop="@dimen/message_bubble_margin"> + + - \ No newline at end of file + \ No newline at end of file diff --git a/briar-android/src/main/res/layout/list_item_conversation_notice_in.xml b/briar-android/src/main/res/layout/list_item_conversation_notice_in.xml index 65c201417..829c0e1ba 100644 --- a/briar-android/src/main/res/layout/list_item_conversation_notice_in.xml +++ b/briar-android/src/main/res/layout/list_item_conversation_notice_in.xml @@ -5,8 +5,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/list_item_background_selectable" - android:orientation="vertical" - android:paddingTop="@dimen/message_bubble_margin"> + android:orientation="vertical"> + + + tools:text="Short message" + tools:visibility="visible" /> + + + tools:text="This is a long long long message that spans over several lines.\n\nIt ends here." + tools:visibility="visible" /> + android:orientation="vertical"> + + + diff --git a/briar-android/src/main/res/layout/list_item_conversation_top_notice_out.xml b/briar-android/src/main/res/layout/list_item_conversation_top_notice_out.xml new file mode 100644 index 000000000..38935f5fd --- /dev/null +++ b/briar-android/src/main/res/layout/list_item_conversation_top_notice_out.xml @@ -0,0 +1,21 @@ + + diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index f7c72e850..dbea13498 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -166,6 +166,14 @@ Contact name Change Disappearing messages + You turned on disappearing messages. Your messages will disappear after 7 days. + You turned off disappearing messages. Your messages will not disappear. + Your messages will disappear after 7 days. + Your messages will not disappear. + %1$s turned on disappearing messages. %2$s\'s messages will disappear after 7 days. + %1$s turned off disappearing messages. %2$s\'s messages will not disappear. + %1$s\'s messages will disappear after 7 days. + %1$s\'s messages will not disappear. Delete all messages Confirm Message Deletion Are you sure that you want to delete all messages? -- GitLab From cc25a69a4210759f6592b27150c65f1155d355f2 Mon Sep 17 00:00:00 2001 From: Torsten Grote Date: Tue, 15 Dec 2020 14:29:37 -0300 Subject: [PATCH 2/2] Remove mirrored timer texts as we can't detect reliably if a timer setting was mirrored or manually changed. Also remove item update optimization from adapter as this can cause issues when items already exist. --- .../conversation/ConversationAdapter.java | 16 ++++------- .../conversation/ConversationItem.java | 22 +-------------- .../ConversationItemViewHolder.java | 28 +++++-------------- briar-android/src/main/res/values/strings.xml | 12 +++----- 4 files changed, 18 insertions(+), 60 deletions(-) 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 662ea2729..84fddd084 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 @@ -112,40 +112,36 @@ class ConversationAdapter public void add(ConversationItem item) { items.beginBatchedUpdates(); items.add(item); - updateTimersInBatch(true); + updateTimersInBatch(); items.endBatchedUpdates(); } @Override public void addAll(Collection itemsToAdd) { items.beginBatchedUpdates(); + // there can be items already in the adapter + // SortedList takes care of duplicates and detecting changed items items.addAll(itemsToAdd); - updateTimersInBatch(false); + updateTimersInBatch(); items.endBatchedUpdates(); } - private void updateTimersInBatch(boolean updateItems) { + private void updateTimersInBatch() { long lastTimerIncoming = NO_AUTO_DELETE_TIMER; long lastTimerOutgoing = NO_AUTO_DELETE_TIMER; for (int i = 0; i < items.size(); i++) { ConversationItem c = items.get(i); boolean itemChanged; boolean timerChanged; - boolean timerMirrored; if (c.isIncoming()) { timerChanged = lastTimerIncoming != c.getAutoDeleteTimer(); - timerMirrored = timerChanged && - lastTimerOutgoing == c.getAutoDeleteTimer(); lastTimerIncoming = c.getAutoDeleteTimer(); } else { timerChanged = lastTimerOutgoing != c.getAutoDeleteTimer(); - timerMirrored = timerChanged && - lastTimerIncoming == c.getAutoDeleteTimer(); lastTimerOutgoing = c.getAutoDeleteTimer(); } itemChanged = c.setTimerNoticeVisible(timerChanged); - itemChanged |= c.setTimerMirrored(timerMirrored); - if (itemChanged && updateItems) items.updateItemAt(i, c); + if (itemChanged) items.updateItemAt(i, c); } } 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 2802892ce..c3d96e462 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 @@ -26,7 +26,7 @@ abstract class ConversationItem { private final long time, autoDeleteTimer; private final boolean isIncoming; private final LiveData contactName; - private boolean read, sent, seen, showTimerNotice, timerMirrored; + private boolean read, sent, seen, showTimerNotice; ConversationItem(@LayoutRes int layoutRes, ConversationMessageHeader h, LiveData contactName) { @@ -42,7 +42,6 @@ abstract class ConversationItem { this.isIncoming = !h.isLocal(); this.contactName = contactName; this.showTimerNotice = false; - this.timerMirrored = false; } @LayoutRes @@ -143,23 +142,4 @@ abstract class ConversationItem { boolean isTimerNoticeVisible() { return showTimerNotice; } - - /** - * Set this to true when {@link #getAutoDeleteTimer()} has changed - * to the same timer of the last message - * from the other peer in this conversation. - * - * @return true if the value was set, false if it was already set. - */ - public boolean setTimerMirrored(boolean timerMirrored) { - if (this.timerMirrored != timerMirrored) { - this.timerMirrored = timerMirrored; - return true; - } - return false; - } - - public boolean wasTimerMirrored() { - return timerMirrored; - } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java index c0d552e3f..8c3dc790d 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/ConversationItemViewHolder.java @@ -84,28 +84,14 @@ abstract class ConversationItemViewHolder extends ViewHolder { String text; if (item.isIncoming()) { String name = item.getContactName().getValue(); - if (item.wasTimerMirrored()) { - int strRes = enabled ? - R.string.auto_delete_msg_contact_enabled_mirrored : - R.string.auto_delete_msg_contact_disabled_mirrored; - text = ctx.getString(strRes, name); - } else { - int strRes = enabled ? - R.string.auto_delete_msg_contact_enabled : - R.string.auto_delete_msg_contact_disabled; - text = ctx.getString(strRes, name, name); - } + int strRes = enabled ? + R.string.auto_delete_msg_contact_enabled : + R.string.auto_delete_msg_contact_disabled; + text = ctx.getString(strRes, name); } else { - int strRes; - if (item.wasTimerMirrored()) { - strRes = enabled ? - R.string.auto_delete_msg_you_enabled_mirrored : - R.string.auto_delete_msg_you_disabled_mirrored; - } else { - strRes = enabled ? - R.string.auto_delete_msg_you_enabled : - R.string.auto_delete_msg_you_disabled; - } + int strRes = enabled ? + R.string.auto_delete_msg_you_enabled : + R.string.auto_delete_msg_you_disabled; text = ctx.getString(strRes); } topNotice.setText(text); diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index dbea13498..3cef1a96f 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -166,14 +166,10 @@ Contact name Change Disappearing messages - You turned on disappearing messages. Your messages will disappear after 7 days. - You turned off disappearing messages. Your messages will not disappear. - Your messages will disappear after 7 days. - Your messages will not disappear. - %1$s turned on disappearing messages. %2$s\'s messages will disappear after 7 days. - %1$s turned off disappearing messages. %2$s\'s messages will not disappear. - %1$s\'s messages will disappear after 7 days. - %1$s\'s messages will not disappear. + Your messages will disappear after 7 days. + Your messages will not disappear. + %1$s\'s messages will disappear after 7 days. + %1$s\'s messages will not disappear. Delete all messages Confirm Message Deletion Are you sure that you want to delete all messages? -- GitLab