From a9edf43df288a73dca28d2f2ed42d21ce8a14b3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCrten?= Date: Thu, 11 Mar 2021 09:52:39 +0100 Subject: [PATCH] Add ShardMessageHeader --- .../conversation/ConversationNoticeItem.java | 8 +++++ .../conversation/ConversationVisitor.java | 14 ++++++++ .../DistributedBackupActivity.java | 35 +++++++++--------- briar-android/src/main/res/values/strings.xml | 6 +++- .../ConversationMessageVisitor.java | 3 ++ .../api/socialbackup/ShardMessageHeader.java | 36 +++++++++++++++++++ .../messaging/MessagingControllerImpl.kt | 5 ++- 7 files changed, 88 insertions(+), 19 deletions(-) create mode 100644 briar-api/src/main/java/org/briarproject/briar/api/socialbackup/ShardMessageHeader.java 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..1c14e40a2 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 @@ -3,6 +3,7 @@ package org.briarproject.briar.android.conversation; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.briar.api.conversation.ConversationRequest; import org.briarproject.briar.api.conversation.ConversationResponse; +import org.briarproject.briar.api.socialbackup.ShardMessageHeader; import javax.annotation.Nullable; import javax.annotation.concurrent.NotThreadSafe; @@ -30,6 +31,13 @@ class ConversationNoticeItem extends ConversationItem { this.msgText = null; } + ConversationNoticeItem(@LayoutRes int layoutRes, String text, + ShardMessageHeader r) { + super(layoutRes, r); + this.text = text; + this.msgText = null; + } + @Nullable String getMsgText() { return msgText; 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..e83b63053 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 @@ -16,6 +16,7 @@ import org.briarproject.briar.api.introduction.IntroductionResponse; import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse; +import org.briarproject.briar.api.socialbackup.ShardMessageHeader; import java.util.List; @@ -292,6 +293,19 @@ class ConversationVisitor implements } } + @Override + public ConversationItem visitShardMessage(ShardMessageHeader r) { + if (r.isLocal()) { + String text = ctx.getString(R.string.social_backup_shard_sent); + return new ConversationNoticeItem( + R.layout.list_item_conversation_notice_out, text, r); + } else { + String text = ctx.getString(R.string.social_backup_shard_received); + return new ConversationNoticeItem( + R.layout.list_item_conversation_notice_in, text, r); + } + } + interface TextCache { @Nullable String getText(MessageId m); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DistributedBackupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DistributedBackupActivity.java index a061c5d4a..c3b2d7d28 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DistributedBackupActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/socialbackup/DistributedBackupActivity.java @@ -3,8 +3,6 @@ package org.briarproject.briar.android.socialbackup; import android.os.Bundle; import android.widget.Toast; -import androidx.fragment.app.FragmentTransaction; - import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DbException; @@ -14,7 +12,6 @@ import org.briarproject.briar.android.activity.BriarActivity; import org.briarproject.briar.android.contactselection.ContactSelectorListener; import org.briarproject.briar.android.fragment.BaseFragment; import org.briarproject.briar.api.socialbackup.BackupMetadata; -import org.briarproject.briar.api.socialbackup.Shard; import org.briarproject.briar.api.socialbackup.SocialBackupManager; import java.util.Collection; @@ -29,10 +26,10 @@ public class DistributedBackupActivity extends BriarActivity implements private Collection custodians; @Inject - public SocialBackupManager socialBackupManager; + public SocialBackupManager socialBackupManager; @Inject - public DatabaseComponent db; + public DatabaseComponent db; @Override public void injectActivity(ActivityComponent component) { @@ -43,19 +40,21 @@ public class DistributedBackupActivity extends BriarActivity implements public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_distributed_backup); - // TODO here we should check if we already have a backup + // TODO here we should check if we already have a backup try { db.transaction(false, txn -> { - BackupMetadata backupMetadata = socialBackupManager.getBackupMetadata(txn); - if (backupMetadata == null) { - CustodianSelectorFragment fragment = - CustodianSelectorFragment.newInstance(); - showInitialFragment(fragment); - } else { - ExistingBackupFragment fragment = ExistingBackupFragment.newInstance(backupMetadata); - showInitialFragment(fragment); - } + BackupMetadata backupMetadata = + socialBackupManager.getBackupMetadata(txn); + if (backupMetadata == null) { + CustodianSelectorFragment fragment = + CustodianSelectorFragment.newInstance(); + showInitialFragment(fragment); + } else { + ExistingBackupFragment fragment = + ExistingBackupFragment.newInstance(backupMetadata); + showInitialFragment(fragment); + } }); } catch (DbException e) { e.printStackTrace(); @@ -68,14 +67,16 @@ public class DistributedBackupActivity extends BriarActivity implements String.format("selected %d contacts", contacts.size()), Toast.LENGTH_SHORT).show(); custodians = contacts; - ThresholdSelectorFragment fragment = ThresholdSelectorFragment.newInstance(contacts.size()); + ThresholdSelectorFragment fragment = + ThresholdSelectorFragment.newInstance(contacts.size()); showNextFragment(fragment); } @Override public void thresholdDefined(int threshold) throws DbException { db.transaction(false, txn -> { - socialBackupManager.createBackup(txn, (List) custodians, threshold); + socialBackupManager + .createBackup(txn, (List) custodians, threshold); ShardsSentFragment fragment = new ShardsSentFragment(); showNextFragment(fragment); }); diff --git a/briar-android/src/main/res/values/strings.xml b/briar-android/src/main/res/values/strings.xml index 9db6d4ea0..d5b411d5a 100644 --- a/briar-android/src/main/res/values/strings.xml +++ b/briar-android/src/main/res/values/strings.xml @@ -706,10 +706,14 @@ \u25CF - \u25CB + \u25CB Social Backup Old Social Backup + + You have received a social backup shard. + You have sent a social backup shard. + diff --git a/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationMessageVisitor.java b/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationMessageVisitor.java index 4846088b6..962a66d14 100644 --- a/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationMessageVisitor.java +++ b/briar-api/src/main/java/org/briarproject/briar/api/conversation/ConversationMessageVisitor.java @@ -10,6 +10,7 @@ import org.briarproject.briar.api.introduction.IntroductionResponse; import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse; +import org.briarproject.briar.api.socialbackup.ShardMessageHeader; @NotNullByDefault public interface ConversationMessageVisitor { @@ -31,4 +32,6 @@ public interface ConversationMessageVisitor { T visitIntroductionRequest(IntroductionRequest r); T visitIntroductionResponse(IntroductionResponse r); + + T visitShardMessage(ShardMessageHeader r); } diff --git a/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/ShardMessageHeader.java b/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/ShardMessageHeader.java new file mode 100644 index 000000000..47c61b439 --- /dev/null +++ b/briar-api/src/main/java/org/briarproject/briar/api/socialbackup/ShardMessageHeader.java @@ -0,0 +1,36 @@ +package org.briarproject.briar.api.socialbackup; + +import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.sync.GroupId; +import org.briarproject.bramble.api.sync.MessageId; +import org.briarproject.briar.api.attachment.AttachmentHeader; +import org.briarproject.briar.api.conversation.ConversationMessageHeader; +import org.briarproject.briar.api.conversation.ConversationMessageVisitor; + +import java.util.List; + +import javax.annotation.concurrent.Immutable; + +@Immutable +@NotNullByDefault +public class ShardMessageHeader extends ConversationMessageHeader { + + private final List attachmentHeaders; + + public ShardMessageHeader(MessageId id, GroupId groupId, long timestamp, + boolean local, boolean read, boolean sent, boolean seen, + List headers) { + super(id, groupId, timestamp, local, read, sent, seen); + this.attachmentHeaders = headers; + } + + public List getAttachmentHeaders() { + return attachmentHeaders; + } + + @Override + public T accept(ConversationMessageVisitor v) { + return v.visitShardMessage(this); + } + +} diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt index c3bdb96ee..35331d3e1 100644 --- a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt +++ b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/MessagingControllerImpl.kt @@ -11,9 +11,9 @@ import org.briarproject.bramble.api.db.DatabaseExecutor import org.briarproject.bramble.api.db.NoSuchContactException import org.briarproject.bramble.api.event.Event import org.briarproject.bramble.api.event.EventListener +import org.briarproject.bramble.api.sync.MessageId import org.briarproject.bramble.api.sync.event.MessagesAckedEvent import org.briarproject.bramble.api.sync.event.MessagesSentEvent -import org.briarproject.bramble.api.sync.MessageId import org.briarproject.bramble.api.system.Clock import org.briarproject.bramble.util.StringUtils.utf8IsTooLong import org.briarproject.briar.api.blog.BlogInvitationRequest @@ -31,6 +31,7 @@ import org.briarproject.briar.api.messaging.PrivateMessageFactory import org.briarproject.briar.api.messaging.PrivateMessageHeader import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse +import org.briarproject.briar.api.socialbackup.ShardMessageHeader import org.briarproject.briar.headless.event.WebSocketController import org.briarproject.briar.headless.event.output import org.briarproject.briar.headless.getContactIdFromPathParam @@ -169,4 +170,6 @@ private class JsonVisitor( override fun visitIntroductionRequest(r: IntroductionRequest) = r.output(contactId) override fun visitIntroductionResponse(r: IntroductionResponse) = r.output(contactId) + + override fun visitShardMessage(r: ShardMessageHeader) = r.output(contactId) }