Add ShardMessageHeader

This commit is contained in:
Sebastian Kürten
2021-03-11 09:52:39 +01:00
parent b3292f86ab
commit a9edf43df2
7 changed files with 88 additions and 19 deletions

View File

@@ -3,6 +3,7 @@ package org.briarproject.briar.android.conversation;
import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
import org.briarproject.briar.api.conversation.ConversationRequest; import org.briarproject.briar.api.conversation.ConversationRequest;
import org.briarproject.briar.api.conversation.ConversationResponse; import org.briarproject.briar.api.conversation.ConversationResponse;
import org.briarproject.briar.api.socialbackup.ShardMessageHeader;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import javax.annotation.concurrent.NotThreadSafe; import javax.annotation.concurrent.NotThreadSafe;
@@ -30,6 +31,13 @@ class ConversationNoticeItem extends ConversationItem {
this.msgText = null; this.msgText = null;
} }
ConversationNoticeItem(@LayoutRes int layoutRes, String text,
ShardMessageHeader r) {
super(layoutRes, r);
this.text = text;
this.msgText = null;
}
@Nullable @Nullable
String getMsgText() { String getMsgText() {
return msgText; return msgText;

View File

@@ -16,6 +16,7 @@ import org.briarproject.briar.api.introduction.IntroductionResponse;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.messaging.PrivateMessageHeader;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse;
import org.briarproject.briar.api.socialbackup.ShardMessageHeader;
import java.util.List; 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 { interface TextCache {
@Nullable @Nullable
String getText(MessageId m); String getText(MessageId m);

View File

@@ -3,8 +3,6 @@ package org.briarproject.briar.android.socialbackup;
import android.os.Bundle; import android.os.Bundle;
import android.widget.Toast; import android.widget.Toast;
import androidx.fragment.app.FragmentTransaction;
import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.contact.ContactId;
import org.briarproject.bramble.api.db.DatabaseComponent; import org.briarproject.bramble.api.db.DatabaseComponent;
import org.briarproject.bramble.api.db.DbException; 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.contactselection.ContactSelectorListener;
import org.briarproject.briar.android.fragment.BaseFragment; import org.briarproject.briar.android.fragment.BaseFragment;
import org.briarproject.briar.api.socialbackup.BackupMetadata; import org.briarproject.briar.api.socialbackup.BackupMetadata;
import org.briarproject.briar.api.socialbackup.Shard;
import org.briarproject.briar.api.socialbackup.SocialBackupManager; import org.briarproject.briar.api.socialbackup.SocialBackupManager;
import java.util.Collection; import java.util.Collection;
@@ -29,10 +26,10 @@ public class DistributedBackupActivity extends BriarActivity implements
private Collection<ContactId> custodians; private Collection<ContactId> custodians;
@Inject @Inject
public SocialBackupManager socialBackupManager; public SocialBackupManager socialBackupManager;
@Inject @Inject
public DatabaseComponent db; public DatabaseComponent db;
@Override @Override
public void injectActivity(ActivityComponent component) { public void injectActivity(ActivityComponent component) {
@@ -43,19 +40,21 @@ public class DistributedBackupActivity extends BriarActivity implements
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_distributed_backup); 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 { try {
db.transaction(false, txn -> { db.transaction(false, txn -> {
BackupMetadata backupMetadata = socialBackupManager.getBackupMetadata(txn); BackupMetadata backupMetadata =
if (backupMetadata == null) { socialBackupManager.getBackupMetadata(txn);
CustodianSelectorFragment fragment = if (backupMetadata == null) {
CustodianSelectorFragment.newInstance(); CustodianSelectorFragment fragment =
showInitialFragment(fragment); CustodianSelectorFragment.newInstance();
} else { showInitialFragment(fragment);
ExistingBackupFragment fragment = ExistingBackupFragment.newInstance(backupMetadata); } else {
showInitialFragment(fragment); ExistingBackupFragment fragment =
} ExistingBackupFragment.newInstance(backupMetadata);
showInitialFragment(fragment);
}
}); });
} catch (DbException e) { } catch (DbException e) {
e.printStackTrace(); e.printStackTrace();
@@ -68,14 +67,16 @@ public class DistributedBackupActivity extends BriarActivity implements
String.format("selected %d contacts", contacts.size()), String.format("selected %d contacts", contacts.size()),
Toast.LENGTH_SHORT).show(); Toast.LENGTH_SHORT).show();
custodians = contacts; custodians = contacts;
ThresholdSelectorFragment fragment = ThresholdSelectorFragment.newInstance(contacts.size()); ThresholdSelectorFragment fragment =
ThresholdSelectorFragment.newInstance(contacts.size());
showNextFragment(fragment); showNextFragment(fragment);
} }
@Override @Override
public void thresholdDefined(int threshold) throws DbException { public void thresholdDefined(int threshold) throws DbException {
db.transaction(false, txn -> { db.transaction(false, txn -> {
socialBackupManager.createBackup(txn, (List<ContactId>) custodians, threshold); socialBackupManager
.createBackup(txn, (List<ContactId>) custodians, threshold);
ShardsSentFragment fragment = new ShardsSentFragment(); ShardsSentFragment fragment = new ShardsSentFragment();
showNextFragment(fragment); showNextFragment(fragment);
}); });

View File

@@ -706,10 +706,14 @@
<!-- Symbols for visualising threshold values for social backup --> <!-- Symbols for visualising threshold values for social backup -->
<string name="filled_bullet">\u25CF</string> <string name="filled_bullet">\u25CF</string>
<string name="linear_bullet">\u25CB</string> <string name="linear_bullet">\u25CB</string>
<!-- activity names --> <!-- activity names -->
<string name="activity_name_distributed_backup">Social Backup</string> <string name="activity_name_distributed_backup">Social Backup</string>
<string name="activity_name_old_distributed_backup">Old Social Backup</string> <string name="activity_name_old_distributed_backup">Old Social Backup</string>
<!-- conversation -->
<string name="social_backup_shard_received">You have received a social backup shard.</string>
<string name="social_backup_shard_sent">You have sent a social backup shard.</string>
</resources> </resources>

View File

@@ -10,6 +10,7 @@ import org.briarproject.briar.api.introduction.IntroductionResponse;
import org.briarproject.briar.api.messaging.PrivateMessageHeader; import org.briarproject.briar.api.messaging.PrivateMessageHeader;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest;
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse; import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse;
import org.briarproject.briar.api.socialbackup.ShardMessageHeader;
@NotNullByDefault @NotNullByDefault
public interface ConversationMessageVisitor<T> { public interface ConversationMessageVisitor<T> {
@@ -31,4 +32,6 @@ public interface ConversationMessageVisitor<T> {
T visitIntroductionRequest(IntroductionRequest r); T visitIntroductionRequest(IntroductionRequest r);
T visitIntroductionResponse(IntroductionResponse r); T visitIntroductionResponse(IntroductionResponse r);
T visitShardMessage(ShardMessageHeader r);
} }

View File

@@ -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<AttachmentHeader> attachmentHeaders;
public ShardMessageHeader(MessageId id, GroupId groupId, long timestamp,
boolean local, boolean read, boolean sent, boolean seen,
List<AttachmentHeader> headers) {
super(id, groupId, timestamp, local, read, sent, seen);
this.attachmentHeaders = headers;
}
public List<AttachmentHeader> getAttachmentHeaders() {
return attachmentHeaders;
}
@Override
public <T> T accept(ConversationMessageVisitor<T> v) {
return v.visitShardMessage(this);
}
}

View File

@@ -11,9 +11,9 @@ import org.briarproject.bramble.api.db.DatabaseExecutor
import org.briarproject.bramble.api.db.NoSuchContactException import org.briarproject.bramble.api.db.NoSuchContactException
import org.briarproject.bramble.api.event.Event import org.briarproject.bramble.api.event.Event
import org.briarproject.bramble.api.event.EventListener 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.MessagesAckedEvent
import org.briarproject.bramble.api.sync.event.MessagesSentEvent 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.api.system.Clock
import org.briarproject.bramble.util.StringUtils.utf8IsTooLong import org.briarproject.bramble.util.StringUtils.utf8IsTooLong
import org.briarproject.briar.api.blog.BlogInvitationRequest 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.messaging.PrivateMessageHeader
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest
import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse 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.WebSocketController
import org.briarproject.briar.headless.event.output import org.briarproject.briar.headless.event.output
import org.briarproject.briar.headless.getContactIdFromPathParam import org.briarproject.briar.headless.getContactIdFromPathParam
@@ -169,4 +170,6 @@ private class JsonVisitor(
override fun visitIntroductionRequest(r: IntroductionRequest) = r.output(contactId) override fun visitIntroductionRequest(r: IntroductionRequest) = r.output(contactId)
override fun visitIntroductionResponse(r: IntroductionResponse) = r.output(contactId) override fun visitIntroductionResponse(r: IntroductionResponse) = r.output(contactId)
override fun visitShardMessage(r: ShardMessageHeader) = r.output(contactId)
} }