Show blog invitation requests and responses in private conversation

This commit is contained in:
Torsten Grote
2016-08-02 11:38:01 -03:00
parent 2f7d188a07
commit a552d1b6a6
21 changed files with 298 additions and 218 deletions

View File

@@ -1,57 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<include
android:id="@+id/messageLayout"
layout="@layout/list_item_msg_out"/>
<RelativeLayout
android:id="@+id/introductionLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|end"
android:background="@drawable/notice_out"
android:layout_marginLeft="@dimen/message_bubble_margin_non_tail"
android:layout_marginRight="@dimen/message_bubble_margin_tail">
<TextView
android:id="@+id/introductionText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textIsSelectable="true"
android:textSize="@dimen/text_size_medium"
android:textStyle="italic"
android:textColor="@color/briar_text_secondary"
tools:text="@string/introduction_request_received"/>
<TextView
android:id="@+id/introductionTime"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/message_bubble_timestamp_margin"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/introductionText"
android:textColor="@color/private_message_date"
android:textSize="@dimen/text_size_tiny"
tools:text="Dec 24, 13:37"/>
<ImageView
android:id="@+id/introductionStatus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@+id/introductionTime"
android:layout_toRightOf="@+id/introductionTime"
android:layout_alignBottom="@+id/introductionTime"
android:layout_marginLeft="@dimen/margin_medium"
tools:ignore="ContentDescription"
tools:src="@drawable/message_delivered"/>
</RelativeLayout>
</LinearLayout>

View File

@@ -309,6 +309,13 @@
<string name="blogs_sharing_error">There was an error sharing this blog.</string> <string name="blogs_sharing_error">There was an error sharing this blog.</string>
<string name="blogs_sharing_button">Share Blog</string> <string name="blogs_sharing_button">Share Blog</string>
<string name="blogs_sharing_snackbar">Blog shared with chosen contacts</string> <string name="blogs_sharing_snackbar">Blog shared with chosen contacts</string>
<string name="blogs_sharing_response_accepted_sent">You accepted the blog invitation from %s.</string>
<string name="blogs_sharing_response_declined_sent">You declined the blog invitation from %s.</string>
<string name="blogs_sharing_response_accepted_received">%s accepted the blog invitation.</string>
<string name="blogs_sharing_response_declined_received">%s declined the blog invitation.</string>
<string name="blogs_sharing_invitation_received">%1$s has shared the personal blog of %2$s with you.</string>
<string name="blogs_sharing_invitation_sent">You have shared the personal blog of %1$s with %2$s.</string>
<string name="blogs_sharing_show_invitations">Show Blog Invitations</string>
<string name="blogs_blog_list">Blog List</string> <string name="blogs_blog_list">Blog List</string>
<string name="blogs_available_blogs">Available Blogs</string> <string name="blogs_available_blogs">Available Blogs</string>

View File

@@ -21,11 +21,12 @@ import org.briarproject.api.db.DbException;
import org.briarproject.api.event.BlogPostAddedEvent; import org.briarproject.api.event.BlogPostAddedEvent;
import org.briarproject.api.event.Event; import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventListener; import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.ForumInvitationReceivedEvent;
import org.briarproject.api.event.ForumPostReceivedEvent; import org.briarproject.api.event.ForumPostReceivedEvent;
import org.briarproject.api.event.IntroductionRequestReceivedEvent; import org.briarproject.api.event.IntroductionRequestReceivedEvent;
import org.briarproject.api.event.IntroductionResponseReceivedEvent; import org.briarproject.api.event.IntroductionResponseReceivedEvent;
import org.briarproject.api.event.IntroductionSucceededEvent; import org.briarproject.api.event.IntroductionSucceededEvent;
import org.briarproject.api.event.InvitationReceivedEvent;
import org.briarproject.api.event.InvitationResponseReceivedEvent;
import org.briarproject.api.event.PrivateMessageReceivedEvent; import org.briarproject.api.event.PrivateMessageReceivedEvent;
import org.briarproject.api.event.SettingsUpdatedEvent; import org.briarproject.api.event.SettingsUpdatedEvent;
import org.briarproject.api.lifecycle.Service; import org.briarproject.api.lifecycle.Service;
@@ -174,8 +175,11 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager,
} else if (e instanceof IntroductionSucceededEvent) { } else if (e instanceof IntroductionSucceededEvent) {
Contact c = ((IntroductionSucceededEvent) e).getContact(); Contact c = ((IntroductionSucceededEvent) e).getContact();
showIntroductionSucceededNotification(c); showIntroductionSucceededNotification(c);
} else if (e instanceof ForumInvitationReceivedEvent) { } else if (e instanceof InvitationReceivedEvent) {
ContactId c = ((ForumInvitationReceivedEvent) e).getContactId(); ContactId c = ((InvitationReceivedEvent) e).getContactId();
showNotificationForPrivateConversation(c);
} else if (e instanceof InvitationResponseReceivedEvent) {
ContactId c = ((InvitationResponseReceivedEvent) e).getContactId();
showNotificationForPrivateConversation(c); showNotificationForPrivateConversation(c);
} }
} }

View File

@@ -20,6 +20,7 @@ import org.briarproject.android.ActivityComponent;
import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.android.keyagreement.KeyAgreementActivity; import org.briarproject.android.keyagreement.KeyAgreementActivity;
import org.briarproject.android.util.BriarRecyclerView; import org.briarproject.android.util.BriarRecyclerView;
import org.briarproject.api.blogs.BlogSharingManager;
import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.Contact;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.contact.ContactManager; import org.briarproject.api.contact.ContactManager;
@@ -37,6 +38,8 @@ import org.briarproject.api.event.ForumInvitationReceivedEvent;
import org.briarproject.api.event.ForumInvitationResponseReceivedEvent; import org.briarproject.api.event.ForumInvitationResponseReceivedEvent;
import org.briarproject.api.event.IntroductionRequestReceivedEvent; import org.briarproject.api.event.IntroductionRequestReceivedEvent;
import org.briarproject.api.event.IntroductionResponseReceivedEvent; import org.briarproject.api.event.IntroductionResponseReceivedEvent;
import org.briarproject.api.event.InvitationReceivedEvent;
import org.briarproject.api.event.InvitationResponseReceivedEvent;
import org.briarproject.api.event.PrivateMessageReceivedEvent; import org.briarproject.api.event.PrivateMessageReceivedEvent;
import org.briarproject.api.forum.ForumInvitationRequest; import org.briarproject.api.forum.ForumInvitationRequest;
import org.briarproject.api.forum.ForumInvitationResponse; import org.briarproject.api.forum.ForumInvitationResponse;
@@ -91,6 +94,8 @@ public class ContactListFragment extends BaseFragment implements EventListener {
protected volatile IntroductionManager introductionManager; protected volatile IntroductionManager introductionManager;
@Inject @Inject
protected volatile ForumSharingManager forumSharingManager; protected volatile ForumSharingManager forumSharingManager;
@Inject
protected volatile BlogSharingManager blogSharingManager;
public static ContactListFragment newInstance() { public static ContactListFragment newInstance() {
@@ -277,14 +282,14 @@ public class ContactListFragment extends BaseFragment implements EventListener {
(IntroductionResponseReceivedEvent) e; (IntroductionResponseReceivedEvent) e;
IntroductionResponse ir = m.getIntroductionResponse(); IntroductionResponse ir = m.getIntroductionResponse();
updateItem(m.getContactId(), ConversationItem.from(ir)); updateItem(m.getContactId(), ConversationItem.from(ir));
} else if (e instanceof ForumInvitationReceivedEvent) { } else if (e instanceof InvitationReceivedEvent) {
LOG.info("Forum Invitation received, reloading conversation..."); LOG.info("Invitation received, reloading conversation...");
ForumInvitationReceivedEvent m = (ForumInvitationReceivedEvent) e; InvitationReceivedEvent m = (InvitationReceivedEvent) e;
reloadConversation(m.getContactId()); reloadConversation(m.getContactId());
} else if (e instanceof ForumInvitationResponseReceivedEvent) { } else if (e instanceof InvitationResponseReceivedEvent) {
LOG.info("Forum Invitation Response received, reloading ..."); LOG.info("Invitation Response received, reloading ...");
ForumInvitationResponseReceivedEvent m = InvitationResponseReceivedEvent m =
(ForumInvitationResponseReceivedEvent) e; (InvitationResponseReceivedEvent) e;
reloadConversation(m.getContactId()); reloadConversation(m.getContactId());
} }
} }
@@ -406,6 +411,7 @@ public class ContactListFragment extends BaseFragment implements EventListener {
now = System.currentTimeMillis(); now = System.currentTimeMillis();
Collection<InvitationMessage> invitations = Collection<InvitationMessage> invitations =
forumSharingManager.getInvitationMessages(id); forumSharingManager.getInvitationMessages(id);
invitations.addAll(blogSharingManager.getInvitationMessages(id));
for (InvitationMessage i : invitations) { for (InvitationMessage i : invitations) {
messages.add(ConversationItem.from(i)); messages.add(ConversationItem.from(i));
} }

View File

@@ -30,6 +30,7 @@ import org.briarproject.android.api.AndroidNotificationManager;
import org.briarproject.android.introduction.IntroductionActivity; import org.briarproject.android.introduction.IntroductionActivity;
import org.briarproject.android.util.BriarRecyclerView; import org.briarproject.android.util.BriarRecyclerView;
import org.briarproject.api.FormatException; import org.briarproject.api.FormatException;
import org.briarproject.api.blogs.BlogSharingManager;
import org.briarproject.api.clients.SessionId; import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.Contact;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
@@ -44,15 +45,13 @@ import org.briarproject.api.event.ContactRemovedEvent;
import org.briarproject.api.event.Event; import org.briarproject.api.event.Event;
import org.briarproject.api.event.EventBus; import org.briarproject.api.event.EventBus;
import org.briarproject.api.event.EventListener; import org.briarproject.api.event.EventListener;
import org.briarproject.api.event.ForumInvitationReceivedEvent;
import org.briarproject.api.event.ForumInvitationResponseReceivedEvent;
import org.briarproject.api.event.IntroductionRequestReceivedEvent; import org.briarproject.api.event.IntroductionRequestReceivedEvent;
import org.briarproject.api.event.IntroductionResponseReceivedEvent; import org.briarproject.api.event.IntroductionResponseReceivedEvent;
import org.briarproject.api.event.InvitationReceivedEvent;
import org.briarproject.api.event.InvitationResponseReceivedEvent;
import org.briarproject.api.event.MessagesAckedEvent; import org.briarproject.api.event.MessagesAckedEvent;
import org.briarproject.api.event.MessagesSentEvent; import org.briarproject.api.event.MessagesSentEvent;
import org.briarproject.api.event.PrivateMessageReceivedEvent; import org.briarproject.api.event.PrivateMessageReceivedEvent;
import org.briarproject.api.forum.ForumInvitationRequest;
import org.briarproject.api.forum.ForumInvitationResponse;
import org.briarproject.api.forum.ForumSharingManager; import org.briarproject.api.forum.ForumSharingManager;
import org.briarproject.api.introduction.IntroductionManager; import org.briarproject.api.introduction.IntroductionManager;
import org.briarproject.api.introduction.IntroductionMessage; import org.briarproject.api.introduction.IntroductionMessage;
@@ -64,6 +63,8 @@ import org.briarproject.api.messaging.PrivateMessageFactory;
import org.briarproject.api.messaging.PrivateMessageHeader; import org.briarproject.api.messaging.PrivateMessageHeader;
import org.briarproject.api.plugins.ConnectionRegistry; import org.briarproject.api.plugins.ConnectionRegistry;
import org.briarproject.api.sharing.InvitationMessage; import org.briarproject.api.sharing.InvitationMessage;
import org.briarproject.api.sharing.InvitationRequest;
import org.briarproject.api.sharing.InvitationResponse;
import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageId;
import org.briarproject.util.StringUtils; import org.briarproject.util.StringUtils;
@@ -128,6 +129,8 @@ public class ConversationActivity extends BriarActivity
protected volatile IntroductionManager introductionManager; protected volatile IntroductionManager introductionManager;
@Inject @Inject
protected volatile ForumSharingManager forumSharingManager; protected volatile ForumSharingManager forumSharingManager;
@Inject
protected volatile BlogSharingManager blogSharingManager;
private volatile GroupId groupId = null; private volatile GroupId groupId = null;
private volatile ContactId contactId = null; private volatile ContactId contactId = null;
@@ -337,6 +340,8 @@ public class ConversationActivity extends BriarActivity
Collection<InvitationMessage> invitations = Collection<InvitationMessage> invitations =
forumSharingManager forumSharingManager
.getInvitationMessages(contactId); .getInvitationMessages(contactId);
invitations.addAll(blogSharingManager
.getInvitationMessages(contactId));
long duration = System.currentTimeMillis() - now; long duration = System.currentTimeMillis() - now;
if (LOG.isLoggable(INFO)) if (LOG.isLoggable(INFO))
LOG.info("Loading headers took " + duration + " ms"); LOG.info("Loading headers took " + duration + " ms");
@@ -388,13 +393,13 @@ public class ConversationActivity extends BriarActivity
items.add(item); items.add(item);
} }
for (InvitationMessage i : invitations) { for (InvitationMessage i : invitations) {
if (i instanceof ForumInvitationRequest) { if (i instanceof InvitationRequest) {
ForumInvitationRequest r = InvitationRequest r =
(ForumInvitationRequest) i; (InvitationRequest) i;
items.add(ConversationItem.from(r)); items.add(ConversationItem.from(r));
} else if (i instanceof ForumInvitationResponse) { } else if (i instanceof InvitationResponse) {
ForumInvitationResponse r = InvitationResponse r =
(ForumInvitationResponse) i; (InvitationResponse) i;
items.add(ConversationItem items.add(ConversationItem
.from(ConversationActivity.this, .from(ConversationActivity.this,
contactName, r)); contactName, r));
@@ -541,6 +546,7 @@ public class ConversationActivity extends BriarActivity
IntroductionRequestReceivedEvent event = IntroductionRequestReceivedEvent event =
(IntroductionRequestReceivedEvent) e; (IntroductionRequestReceivedEvent) e;
if (event.getContactId().equals(contactId)) { if (event.getContactId().equals(contactId)) {
LOG.info("Introduction request received, adding...");
IntroductionRequest ir = event.getIntroductionRequest(); IntroductionRequest ir = event.getIntroductionRequest();
ConversationItem item = new ConversationIntroductionInItem(ir); ConversationItem item = new ConversationIntroductionInItem(ir);
addConversationItem(item); addConversationItem(item);
@@ -549,21 +555,24 @@ public class ConversationActivity extends BriarActivity
IntroductionResponseReceivedEvent event = IntroductionResponseReceivedEvent event =
(IntroductionResponseReceivedEvent) e; (IntroductionResponseReceivedEvent) e;
if (event.getContactId().equals(contactId)) { if (event.getContactId().equals(contactId)) {
LOG.info("Introduction response received, adding...");
IntroductionResponse ir = event.getIntroductionResponse(); IntroductionResponse ir = event.getIntroductionResponse();
ConversationItem item = ConversationItem item =
ConversationItem.from(this, contactName, ir); ConversationItem.from(this, contactName, ir);
addConversationItem(item); addConversationItem(item);
} }
} else if (e instanceof ForumInvitationReceivedEvent) { } else if (e instanceof InvitationReceivedEvent) {
ForumInvitationReceivedEvent event = InvitationReceivedEvent event =
(ForumInvitationReceivedEvent) e; (InvitationReceivedEvent) e;
if (event.getContactId().equals(contactId)) { if (event.getContactId().equals(contactId)) {
LOG.info("Invitation received, reloading...");
loadMessages(); loadMessages();
} }
} else if (e instanceof ForumInvitationResponseReceivedEvent) { } else if (e instanceof InvitationResponseReceivedEvent) {
ForumInvitationResponseReceivedEvent event = InvitationResponseReceivedEvent event =
(ForumInvitationResponseReceivedEvent) e; (InvitationResponseReceivedEvent) e;
if (event.getContactId().equals(contactId)) { if (event.getContactId().equals(contactId)) {
LOG.info("Invitation response received, reloading...");
loadMessages(); loadMessages();
} }
} }

View File

@@ -15,16 +15,22 @@ import android.widget.TextView;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.android.forum.ForumInvitationsActivity; import org.briarproject.android.forum.ForumInvitationsActivity;
import org.briarproject.android.util.AndroidUtils; import org.briarproject.android.util.AndroidUtils;
import org.briarproject.api.blogs.BlogInvitationRequest;
import org.briarproject.api.clients.SessionId; import org.briarproject.api.clients.SessionId;
import org.briarproject.api.forum.ForumInvitationRequest; import org.briarproject.api.forum.ForumInvitationRequest;
import org.briarproject.api.introduction.IntroductionRequest; import org.briarproject.api.introduction.IntroductionRequest;
import org.briarproject.api.messaging.PrivateMessageHeader; import org.briarproject.api.messaging.PrivateMessageHeader;
import org.briarproject.api.sharing.InvitationRequest;
import org.briarproject.util.StringUtils; import org.briarproject.util.StringUtils;
import java.util.List; import java.util.List;
import static android.support.v7.util.SortedList.INVALID_POSITION; import static android.support.v7.util.SortedList.INVALID_POSITION;
import static android.support.v7.widget.RecyclerView.ViewHolder; import static android.support.v7.widget.RecyclerView.ViewHolder;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
import static org.briarproject.android.contact.ConversationItem.BLOG_INVITATION_IN;
import static org.briarproject.android.contact.ConversationItem.BLOG_INVITATION_OUT;
import static org.briarproject.android.contact.ConversationItem.FORUM_INVITATION_IN; import static org.briarproject.android.contact.ConversationItem.FORUM_INVITATION_IN;
import static org.briarproject.android.contact.ConversationItem.FORUM_INVITATION_OUT; import static org.briarproject.android.contact.ConversationItem.FORUM_INVITATION_OUT;
import static org.briarproject.android.contact.ConversationItem.INTRODUCTION_IN; import static org.briarproject.android.contact.ConversationItem.INTRODUCTION_IN;
@@ -46,13 +52,13 @@ class ConversationAdapter extends RecyclerView.Adapter {
private IntroductionHandler intro; private IntroductionHandler intro;
private String contactName; private String contactName;
public ConversationAdapter(Context context, ConversationAdapter(Context context,
IntroductionHandler introductionHandler) { IntroductionHandler introductionHandler) {
ctx = context; ctx = context;
intro = introductionHandler; intro = introductionHandler;
} }
public void setContactName(String contactName) { void setContactName(String contactName) {
this.contactName = contactName; this.contactName = contactName;
notifyDataSetChanged(); notifyDataSetChanged();
} }
@@ -87,13 +93,15 @@ class ConversationAdapter extends RecyclerView.Adapter {
v = LayoutInflater.from(viewGroup.getContext()).inflate( v = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.list_item_notice_out, viewGroup, false); R.layout.list_item_notice_out, viewGroup, false);
return new NoticeHolder(v, type); return new NoticeHolder(v, type);
} else if (type == FORUM_INVITATION_IN) { } else if (type == FORUM_INVITATION_IN || type == BLOG_INVITATION_IN) {
v = LayoutInflater.from(viewGroup.getContext()).inflate( v = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.list_item_forum_invitation_in, viewGroup, false); R.layout.list_item_shareable_invitation_in, viewGroup,
false);
return new InvitationHolder(v, type); return new InvitationHolder(v, type);
} else if (type == FORUM_INVITATION_OUT) { } else if (type == FORUM_INVITATION_OUT ||
type == BLOG_INVITATION_OUT) {
v = LayoutInflater.from(viewGroup.getContext()).inflate( v = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.list_item_forum_invitation_out, viewGroup, false); R.layout.list_item_introduction_out, viewGroup, false);
return new InvitationHolder(v, type); return new InvitationHolder(v, type);
} }
// incoming message (non-local) // incoming message (non-local)
@@ -119,12 +127,12 @@ class ConversationAdapter extends RecyclerView.Adapter {
bindNotice((NoticeHolder) ui, (ConversationNoticeOutItem) item); bindNotice((NoticeHolder) ui, (ConversationNoticeOutItem) item);
} else if (item instanceof ConversationNoticeInItem) { } else if (item instanceof ConversationNoticeInItem) {
bindNotice((NoticeHolder) ui, (ConversationNoticeInItem) item); bindNotice((NoticeHolder) ui, (ConversationNoticeInItem) item);
} else if (item instanceof ConversationForumInvitationOutItem) { } else if (item instanceof ConversationShareableInvitationOutItem) {
bindInvitation((InvitationHolder) ui, bindInvitation((InvitationHolder) ui,
(ConversationForumInvitationOutItem) item); (ConversationShareableInvitationOutItem) item);
} else if (item instanceof ConversationForumInvitationInItem) { } else if (item instanceof ConversationShareableInvitationInItem) {
bindInvitation((InvitationHolder) ui, bindInvitation((InvitationHolder) ui,
(ConversationForumInvitationInItem) item); (ConversationShareableInvitationInItem) item);
} else { } else {
throw new IllegalArgumentException("Unhandled Conversation Item"); throw new IllegalArgumentException("Unhandled Conversation Item");
} }
@@ -180,9 +188,9 @@ class ConversationAdapter extends RecyclerView.Adapter {
String message = ir.getMessage(); String message = ir.getMessage();
if (StringUtils.isNullOrEmpty(message)) { if (StringUtils.isNullOrEmpty(message)) {
ui.messageLayout.setVisibility(View.GONE); ui.messageLayout.setVisibility(GONE);
} else { } else {
ui.messageLayout.setVisibility(View.VISIBLE); ui.messageLayout.setVisibility(VISIBLE);
ui.message.body.setText(StringUtils.trim(message)); ui.message.body.setText(StringUtils.trim(message));
ui.message.date ui.message.date
.setText(AndroidUtils.formatDate(ctx, item.getTime())); .setText(AndroidUtils.formatDate(ctx, item.getTime()));
@@ -213,8 +221,8 @@ class ConversationAdapter extends RecyclerView.Adapter {
ui.text.setText(ctx.getString( ui.text.setText(ctx.getString(
R.string.introduction_request_answered_received, R.string.introduction_request_answered_received,
contactName, ir.getName())); contactName, ir.getName()));
ui.acceptButton.setVisibility(View.GONE); ui.acceptButton.setVisibility(GONE);
ui.declineButton.setVisibility(View.GONE); ui.declineButton.setVisibility(GONE);
} }
// Incoming Introduction Request (Not Answered) // Incoming Introduction Request (Not Answered)
else { else {
@@ -230,12 +238,12 @@ class ConversationAdapter extends RecyclerView.Adapter {
if (item.getIntroductionRequest().doesIntroduceOtherIdentity()) { if (item.getIntroductionRequest().doesIntroduceOtherIdentity()) {
// don't allow accept when one of our identities is introduced // don't allow accept when one of our identities is introduced
ui.acceptButton.setVisibility(View.GONE); ui.acceptButton.setVisibility(GONE);
ui.text.setText(ctx.getString( ui.text.setText(ctx.getString(
R.string.introduction_request_for_our_identity_received, R.string.introduction_request_for_our_identity_received,
contactName, ir.getName())); contactName, ir.getName()));
} else { } else {
ui.acceptButton.setVisibility(View.VISIBLE); ui.acceptButton.setVisibility(VISIBLE);
ui.acceptButton.setOnClickListener(new View.OnClickListener() { ui.acceptButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@@ -245,7 +253,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
} }
}); });
} }
ui.declineButton.setVisibility(View.VISIBLE); ui.declineButton.setVisibility(VISIBLE);
ui.declineButton.setOnClickListener(new View.OnClickListener() { ui.declineButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@@ -276,26 +284,38 @@ class ConversationAdapter extends RecyclerView.Adapter {
} }
private void bindInvitation(InvitationHolder ui, private void bindInvitation(InvitationHolder ui,
final ConversationForumInvitationItem item) { final ConversationShareableInvitationItem item) {
ForumInvitationRequest fim = item.getForumInvitationMessage(); InvitationRequest ir = item.getInvitationRequest();
String name = "";
int receivedRes = 0, sentRes = 0, buttonRes = 0;
if (ir instanceof ForumInvitationRequest) {
name = ((ForumInvitationRequest) ir).getForumName();
receivedRes = R.string.forum_invitation_received;
sentRes = R.string.forum_invitation_sent;
buttonRes = R.string.forum_show_invitations;
} else if (ir instanceof BlogInvitationRequest) {
name = ((BlogInvitationRequest) ir).getBlogAuthorName();
receivedRes = R.string.blogs_sharing_invitation_received;
sentRes = R.string.blogs_sharing_invitation_sent;
buttonRes = R.string.blogs_sharing_show_invitations;
}
String message = fim.getMessage(); String message = ir.getMessage();
if (StringUtils.isNullOrEmpty(message)) { if (StringUtils.isNullOrEmpty(message)) {
ui.messageLayout.setVisibility(View.GONE); ui.messageLayout.setVisibility(GONE);
} else { } else {
ui.messageLayout.setVisibility(View.VISIBLE); ui.messageLayout.setVisibility(VISIBLE);
ui.message.body.setText(StringUtils.trim(message)); ui.message.body.setText(StringUtils.trim(message));
ui.message.date ui.message.date
.setText(AndroidUtils.formatDate(ctx, item.getTime())); .setText(AndroidUtils.formatDate(ctx, item.getTime()));
} }
// Outgoing Invitation // Outgoing Invitation
if (item instanceof ConversationForumInvitationOutItem) { if (item instanceof ConversationShareableInvitationOutItem) {
ui.text.setText(ctx.getString(R.string.forum_invitation_sent, ui.text.setText(ctx.getString(sentRes, name, contactName));
fim.getForumName(), contactName)); ConversationShareableInvitationOutItem i =
ConversationForumInvitationOutItem i = (ConversationShareableInvitationOutItem) item;
(ConversationForumInvitationOutItem) item;
if (i.isSeen()) { if (i.isSeen()) {
ui.status.setImageResource(R.drawable.message_delivered); ui.status.setImageResource(R.drawable.message_delivered);
ui.message.status.setImageResource( ui.message.status.setImageResource(
@@ -312,12 +332,12 @@ class ConversationAdapter extends RecyclerView.Adapter {
} }
// Incoming Invitation // Incoming Invitation
else { else {
ui.text.setText(ctx.getString(R.string.forum_invitation_received, ui.text.setText(ctx.getString(receivedRes, contactName, name));
contactName, fim.getForumName()));
if (fim.isAvailable()) { if (ir.isAvailable()) {
ui.showForumsButton.setVisibility(View.VISIBLE); ui.showInvitationsButton.setText(ctx.getString(buttonRes));
ui.showForumsButton ui.showInvitationsButton.setVisibility(VISIBLE);
ui.showInvitationsButton
.setOnClickListener(new View.OnClickListener() { .setOnClickListener(new View.OnClickListener() {
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@@ -327,7 +347,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
} }
}); });
} else { } else {
ui.showForumsButton.setVisibility(View.GONE); ui.showInvitationsButton.setVisibility(GONE);
} }
} }
ui.date.setText(AndroidUtils.formatDate(ctx, item.getTime())); ui.date.setText(AndroidUtils.formatDate(ctx, item.getTime()));
@@ -345,7 +365,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
return items.get(position); return items.get(position);
} }
public ConversationItem getLastItem() { ConversationItem getLastItem() {
if (items.size() > 0) { if (items.size() > 0) {
return items.get(items.size() - 1); return items.get(items.size() - 1);
} else { } else {
@@ -353,7 +373,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
} }
} }
public SparseArray<IncomingItem> getIncomingMessages() { SparseArray<IncomingItem> getIncomingMessages() {
SparseArray<IncomingItem> messages = new SparseArray<>(); SparseArray<IncomingItem> messages = new SparseArray<>();
for (int i = 0; i < items.size(); i++) { for (int i = 0; i < items.size(); i++) {
@@ -365,7 +385,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
return messages; return messages;
} }
public SparseArray<OutgoingItem> getOutgoingMessages() { SparseArray<OutgoingItem> getOutgoingMessages() {
SparseArray<OutgoingItem> messages = new SparseArray<>(); SparseArray<OutgoingItem> messages = new SparseArray<>();
for (int i = 0; i < items.size(); i++) { for (int i = 0; i < items.size(); i++) {
@@ -377,7 +397,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
return messages; return messages;
} }
public SparseArray<ConversationMessageItem> getPrivateMessages() { SparseArray<ConversationMessageItem> getPrivateMessages() {
SparseArray<ConversationMessageItem> messages = new SparseArray<>(); SparseArray<ConversationMessageItem> messages = new SparseArray<>();
for (int i = 0; i < items.size(); i++) { for (int i = 0; i < items.size(); i++) {
@@ -408,7 +428,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
public TextView date; public TextView date;
public ImageView status; public ImageView status;
public MessageHolder(View v, int type) { MessageHolder(View v, int type) {
super(v); super(v);
layout = (ViewGroup) v.findViewById(R.id.msgLayout); layout = (ViewGroup) v.findViewById(R.id.msgLayout);
@@ -432,7 +452,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
private final TextView date; private final TextView date;
private final ImageView status; private final ImageView status;
public IntroductionHolder(View v, int type) { IntroductionHolder(View v, int type) {
super(v); super(v);
messageLayout = v.findViewById(R.id.messageLayout); messageLayout = v.findViewById(R.id.messageLayout);
@@ -457,7 +477,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
private final TextView date; private final TextView date;
private final ImageView status; private final ImageView status;
public NoticeHolder(View v, int type) { NoticeHolder(View v, int type) {
super(v); super(v);
text = (TextView) v.findViewById(R.id.noticeText); text = (TextView) v.findViewById(R.id.noticeText);
@@ -476,21 +496,21 @@ class ConversationAdapter extends RecyclerView.Adapter {
private final View messageLayout; private final View messageLayout;
private final MessageHolder message; private final MessageHolder message;
private final TextView text; private final TextView text;
private final Button showForumsButton; private final Button showInvitationsButton;
private final TextView date; private final TextView date;
private final ImageView status; private final ImageView status;
public InvitationHolder(View v, int type) { InvitationHolder(View v, int type) {
super(v); super(v);
messageLayout = v.findViewById(R.id.messageLayout); messageLayout = v.findViewById(R.id.messageLayout);
message = new MessageHolder(messageLayout, message = new MessageHolder(messageLayout,
type == FORUM_INVITATION_IN ? MSG_IN : MSG_OUT); type == FORUM_INVITATION_IN ? MSG_IN : MSG_OUT);
text = (TextView) v.findViewById(R.id.introductionText); text = (TextView) v.findViewById(R.id.introductionText);
showForumsButton = (Button) v.findViewById(R.id.showForumsButton); showInvitationsButton = (Button) v.findViewById(R.id.showForumsButton);
date = (TextView) v.findViewById(R.id.introductionTime); date = (TextView) v.findViewById(R.id.introductionTime);
if (type == FORUM_INVITATION_OUT) { if (type == FORUM_INVITATION_OUT || type == BLOG_INVITATION_OUT) {
status = (ImageView) v.findViewById(R.id.introductionStatus); status = (ImageView) v.findViewById(R.id.introductionStatus);
} else { } else {
status = null; status = null;
@@ -543,7 +563,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
} }
} }
public interface IntroductionHandler { interface IntroductionHandler {
void respondToIntroduction(SessionId sessionId, boolean accept); void respondToIntroduction(SessionId sessionId, boolean accept);
} }
} }

View File

@@ -1,32 +0,0 @@
package org.briarproject.android.contact;
import org.briarproject.api.forum.ForumInvitationRequest;
// This class is not thread-safe
public class ConversationForumInvitationInItem
extends ConversationForumInvitationItem
implements ConversationItem.IncomingItem {
private boolean read;
public ConversationForumInvitationInItem(ForumInvitationRequest fim) {
super(fim);
this.read = fim.isRead();
}
@Override
int getType() {
return FORUM_INVITATION_IN;
}
@Override
public boolean isRead() {
return read;
}
@Override
public void setRead(boolean read) {
this.read = read;
}
}

View File

@@ -1,18 +0,0 @@
package org.briarproject.android.contact;
import org.briarproject.api.forum.ForumInvitationRequest;
abstract class ConversationForumInvitationItem extends ConversationItem {
private final ForumInvitationRequest fim;
public ConversationForumInvitationItem(ForumInvitationRequest fim) {
super(fim.getId(), fim.getTimestamp());
this.fim = fim;
}
public ForumInvitationRequest getForumInvitationMessage() {
return fim;
}
}

View File

@@ -3,13 +3,15 @@ package org.briarproject.android.contact;
import android.content.Context; import android.content.Context;
import org.briarproject.R; import org.briarproject.R;
import org.briarproject.api.forum.ForumInvitationRequest; import org.briarproject.api.blogs.BlogInvitationResponse;
import org.briarproject.api.forum.ForumInvitationResponse; import org.briarproject.api.forum.ForumInvitationResponse;
import org.briarproject.api.introduction.IntroductionMessage; import org.briarproject.api.introduction.IntroductionMessage;
import org.briarproject.api.introduction.IntroductionRequest; import org.briarproject.api.introduction.IntroductionRequest;
import org.briarproject.api.introduction.IntroductionResponse; import org.briarproject.api.introduction.IntroductionResponse;
import org.briarproject.api.messaging.PrivateMessageHeader; import org.briarproject.api.messaging.PrivateMessageHeader;
import org.briarproject.api.sharing.InvitationMessage; import org.briarproject.api.sharing.InvitationMessage;
import org.briarproject.api.sharing.InvitationRequest;
import org.briarproject.api.sharing.InvitationResponse;
import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageId;
// This class is not thread-safe // This class is not thread-safe
@@ -25,6 +27,8 @@ public abstract class ConversationItem {
final static int NOTICE_OUT = 6; final static int NOTICE_OUT = 6;
final static int FORUM_INVITATION_IN = 7; final static int FORUM_INVITATION_IN = 7;
final static int FORUM_INVITATION_OUT = 8; final static int FORUM_INVITATION_OUT = 8;
final static int BLOG_INVITATION_IN = 9;
final static int BLOG_INVITATION_OUT = 10;
private MessageId id; private MessageId id;
private long time; private long time;
@@ -97,15 +101,27 @@ public abstract class ConversationItem {
} }
} }
public static ConversationItem from(ForumInvitationRequest fim) { public static ConversationItem from(InvitationRequest fim) {
if (fim.isLocal()) { if (fim.isLocal()) {
return new ConversationForumInvitationOutItem(fim); return new ConversationShareableInvitationOutItem(fim);
} else { } else {
return new ConversationForumInvitationInItem(fim); return new ConversationShareableInvitationInItem(fim);
} }
} }
public static ConversationItem from(Context ctx, String contactName, public static ConversationItem from(Context ctx, String contactName,
InvitationResponse ir) {
if (ir instanceof ForumInvitationResponse) {
return from(ctx, contactName, (ForumInvitationResponse) ir);
} else if (ir instanceof BlogInvitationResponse) {
return from(ctx, contactName, (BlogInvitationResponse) ir);
} else {
throw new IllegalArgumentException("Unknown Invitation Response.");
}
}
private static ConversationItem from(Context ctx, String contactName,
ForumInvitationResponse fir) { ForumInvitationResponse fir) {
if (fir.isLocal()) { if (fir.isLocal()) {
@@ -137,6 +153,38 @@ public abstract class ConversationItem {
} }
} }
private static ConversationItem from(Context ctx, String contactName,
BlogInvitationResponse fir) {
if (fir.isLocal()) {
String text;
if (fir.wasAccepted()) {
text = ctx.getString(
R.string.blogs_sharing_response_accepted_sent,
contactName);
} else {
text = ctx.getString(
R.string.blogs_sharing_response_declined_sent,
contactName);
}
return new ConversationNoticeOutItem(fir.getId(), text,
fir.getTimestamp(), fir.isSent(), fir.isSeen());
} else {
String text;
if (fir.wasAccepted()) {
text = ctx.getString(
R.string.blogs_sharing_response_accepted_received,
contactName);
} else {
text = ctx.getString(
R.string.blogs_sharing_response_declined_received,
contactName);
}
return new ConversationNoticeInItem(fir.getId(), text,
fir.getTimestamp(), fir.isRead());
}
}
/** /**
* This method should not be used to get user-facing objects, * This method should not be used to get user-facing objects,
* Its purpose is only to provide data for the contact list. * Its purpose is only to provide data for the contact list.

View File

@@ -0,0 +1,43 @@
package org.briarproject.android.contact;
import org.briarproject.api.blogs.BlogInvitationRequest;
import org.briarproject.api.forum.ForumInvitationRequest;
import org.briarproject.api.sharing.InvitationRequest;
// This class is not thread-safe
class ConversationShareableInvitationInItem
extends ConversationShareableInvitationItem
implements ConversationItem.IncomingItem {
private final int type;
private boolean read;
ConversationShareableInvitationInItem(InvitationRequest ir) {
super(ir);
if (ir instanceof ForumInvitationRequest) {
this.type = FORUM_INVITATION_IN;
} else if (ir instanceof BlogInvitationRequest) {
this.type = BLOG_INVITATION_IN;
} else {
throw new IllegalArgumentException("Unknown Invitation Type.");
}
this.read = ir.isRead();
}
@Override
int getType() {
return type;
}
@Override
public boolean isRead() {
return read;
}
@Override
public void setRead(boolean read) {
this.read = read;
}
}

View File

@@ -0,0 +1,18 @@
package org.briarproject.android.contact;
import org.briarproject.api.sharing.InvitationRequest;
abstract class ConversationShareableInvitationItem extends ConversationItem {
private final InvitationRequest fim;
ConversationShareableInvitationItem(InvitationRequest fim) {
super(fim.getId(), fim.getTimestamp());
this.fim = fim;
}
InvitationRequest getInvitationRequest() {
return fim;
}
}

View File

@@ -1,6 +1,8 @@
package org.briarproject.android.contact; package org.briarproject.android.contact;
import org.briarproject.api.blogs.BlogInvitationRequest;
import org.briarproject.api.forum.ForumInvitationRequest; import org.briarproject.api.forum.ForumInvitationRequest;
import org.briarproject.api.sharing.InvitationRequest;
/** /**
* This class is needed and can not be replaced by an ConversationNoticeOutItem, * This class is needed and can not be replaced by an ConversationNoticeOutItem,
@@ -9,21 +11,31 @@ import org.briarproject.api.forum.ForumInvitationRequest;
* <p/> * <p/>
* This class is not thread-safe * This class is not thread-safe
*/ */
public class ConversationForumInvitationOutItem class ConversationShareableInvitationOutItem
extends ConversationForumInvitationItem extends ConversationShareableInvitationItem
implements ConversationItem.OutgoingItem { implements ConversationItem.OutgoingItem {
private final int type;
private boolean sent, seen; private boolean sent, seen;
public ConversationForumInvitationOutItem(ForumInvitationRequest fim) { ConversationShareableInvitationOutItem(InvitationRequest ir) {
super(fim); super(ir);
this.sent = fim.isSent();
this.seen = fim.isSeen(); if (ir instanceof ForumInvitationRequest) {
this.type = FORUM_INVITATION_OUT;
} else if (ir instanceof BlogInvitationRequest) {
this.type = BLOG_INVITATION_OUT;
} else {
throw new IllegalArgumentException("Unknown Invitation Type.");
}
this.sent = ir.isSent();
this.seen = ir.isSeen();
} }
@Override @Override
int getType() { int getType() {
return FORUM_INVITATION_OUT; return type;
} }
@Override @Override

View File

@@ -8,20 +8,20 @@ import org.briarproject.api.sync.MessageId;
public class BlogInvitationRequest extends InvitationRequest { public class BlogInvitationRequest extends InvitationRequest {
private final String blogTitle; private final String blogAuthorName;
public BlogInvitationRequest(MessageId id, SessionId sessionId, public BlogInvitationRequest(MessageId id, SessionId sessionId,
ContactId contactId, String blogTitle, String message, ContactId contactId, String blogAuthorName, String message,
boolean available, long time, boolean local, boolean sent, boolean available, long time, boolean local, boolean sent,
boolean seen, boolean read) { boolean seen, boolean read) {
super(id, sessionId, contactId, message, available, time, local, sent, super(id, sessionId, contactId, message, available, time, local, sent,
seen, read); seen, read);
this.blogTitle = blogTitle; this.blogAuthorName = blogAuthorName;
} }
public String getBlogTitle() { public String getBlogAuthorName() {
return blogTitle; return blogAuthorName;
} }
} }

View File

@@ -0,0 +1,17 @@
package org.briarproject.api.blogs;
import org.briarproject.api.clients.SessionId;
import org.briarproject.api.contact.ContactId;
import org.briarproject.api.sharing.InvitationResponse;
import org.briarproject.api.sync.MessageId;
public class BlogInvitationResponse extends InvitationResponse {
public BlogInvitationResponse(MessageId id, SessionId sessionId,
ContactId contactId, boolean accept, long time, boolean local,
boolean sent, boolean seen, boolean read) {
super(id, sessionId, contactId, accept, time, local, sent, seen, read);
}
}

View File

@@ -3,14 +3,14 @@ package org.briarproject.api.blogs;
import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.Contact;
import org.briarproject.api.contact.ContactId; import org.briarproject.api.contact.ContactId;
import org.briarproject.api.db.DbException; import org.briarproject.api.db.DbException;
import org.briarproject.api.sharing.InvitationMessage;
import org.briarproject.api.sharing.SharingManager; import org.briarproject.api.sharing.SharingManager;
import org.briarproject.api.sync.ClientId; import org.briarproject.api.sync.ClientId;
import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.GroupId;
import java.util.Collection; import java.util.Collection;
public interface BlogSharingManager public interface BlogSharingManager extends SharingManager<Blog> {
extends SharingManager<Blog, BlogInvitationRequest> {
/** /**
* Returns the unique ID of the blog sharing client. * Returns the unique ID of the blog sharing client.
@@ -34,7 +34,7 @@ public interface BlogSharingManager
* Returns all blogs sharing messages sent by the Contact * Returns all blogs sharing messages sent by the Contact
* identified by contactId. * identified by contactId.
*/ */
Collection<BlogInvitationRequest> getInvitationMessages( Collection<InvitationMessage> getInvitationMessages(
ContactId contactId) throws DbException; ContactId contactId) throws DbException;
/** /**

View File

@@ -10,7 +10,7 @@ import org.briarproject.api.sync.GroupId;
import java.util.Collection; import java.util.Collection;
public interface ForumSharingManager extends SharingManager<Forum, InvitationMessage> { public interface ForumSharingManager extends SharingManager<Forum> {
/** Returns the unique ID of the forum sharing client. */ /** Returns the unique ID of the forum sharing client. */
ClientId getClientId(); ClientId getClientId();

View File

@@ -8,7 +8,7 @@ import org.briarproject.api.sync.GroupId;
import java.util.Collection; import java.util.Collection;
public interface SharingManager<S extends Shareable, IM extends InvitationMessage> { public interface SharingManager<S extends Shareable> {
/** Returns the unique ID of the group sharing client. */ /** Returns the unique ID of the group sharing client. */
ClientId getClientId(); ClientId getClientId();
@@ -30,7 +30,7 @@ public interface SharingManager<S extends Shareable, IM extends InvitationMessag
* Returns all group sharing messages sent by the Contact * Returns all group sharing messages sent by the Contact
* identified by contactId. * identified by contactId.
*/ */
Collection<IM> getInvitationMessages( Collection<InvitationMessage> getInvitationMessages(
ContactId contactId) throws DbException; ContactId contactId) throws DbException;
/** Returns all shareables to which the user has been invited. */ /** Returns all shareables to which the user has been invited. */

View File

@@ -4,6 +4,7 @@ import org.briarproject.api.FormatException;
import org.briarproject.api.blogs.Blog; import org.briarproject.api.blogs.Blog;
import org.briarproject.api.blogs.BlogFactory; import org.briarproject.api.blogs.BlogFactory;
import org.briarproject.api.blogs.BlogInvitationRequest; import org.briarproject.api.blogs.BlogInvitationRequest;
import org.briarproject.api.blogs.BlogInvitationResponse;
import org.briarproject.api.blogs.BlogManager; import org.briarproject.api.blogs.BlogManager;
import org.briarproject.api.blogs.BlogManager.RemoveBlogHook; import org.briarproject.api.blogs.BlogManager.RemoveBlogHook;
import org.briarproject.api.blogs.BlogSharingManager; import org.briarproject.api.blogs.BlogSharingManager;
@@ -25,6 +26,7 @@ import org.briarproject.api.event.BlogInvitationReceivedEvent;
import org.briarproject.api.event.BlogInvitationResponseReceivedEvent; import org.briarproject.api.event.BlogInvitationResponseReceivedEvent;
import org.briarproject.api.identity.Author; import org.briarproject.api.identity.Author;
import org.briarproject.api.identity.AuthorFactory; import org.briarproject.api.identity.AuthorFactory;
import org.briarproject.api.sharing.InvitationMessage;
import org.briarproject.api.sync.ClientId; import org.briarproject.api.sync.ClientId;
import org.briarproject.api.sync.GroupId; import org.briarproject.api.sync.GroupId;
import org.briarproject.api.sync.MessageId; import org.briarproject.api.sync.MessageId;
@@ -41,7 +43,7 @@ import static org.briarproject.api.blogs.BlogConstants.BLOG_PUBLIC_KEY;
import static org.briarproject.api.blogs.BlogConstants.BLOG_TITLE; import static org.briarproject.api.blogs.BlogConstants.BLOG_TITLE;
class BlogSharingManagerImpl extends class BlogSharingManagerImpl extends
SharingManagerImpl<Blog, BlogInvitation, BlogInvitationRequest, BlogInviteeSessionState, BlogSharerSessionState, BlogInvitationReceivedEvent, BlogInvitationResponseReceivedEvent> SharingManagerImpl<Blog, BlogInvitation, BlogInviteeSessionState, BlogSharerSessionState, BlogInvitationReceivedEvent, BlogInvitationResponseReceivedEvent>
implements BlogSharingManager, RemoveBlogHook { implements BlogSharingManager, RemoveBlogHook {
static final ClientId CLIENT_ID = new ClientId(StringUtils.fromHexString( static final ClientId CLIENT_ID = new ClientId(StringUtils.fromHexString(
@@ -89,21 +91,21 @@ class BlogSharingManagerImpl extends
} }
@Override @Override
protected BlogInvitationRequest createInvitationRequest(MessageId id, protected InvitationMessage createInvitationRequest(MessageId id,
BlogInvitation msg, ContactId contactId, boolean available, BlogInvitation msg, ContactId contactId, boolean available,
long time, boolean local, boolean sent, boolean seen, long time, boolean local, boolean sent, boolean seen,
boolean read) { boolean read) {
return new BlogInvitationRequest(id, msg.getSessionId(), contactId, return new BlogInvitationRequest(id, msg.getSessionId(), contactId,
msg.getBlogTitle(), msg.getMessage(), available, time, local, msg.getBlogAuthorName(), msg.getMessage(), available, time,
sent, seen, read); local, sent, seen, read);
} }
@Override @Override
protected BlogInvitationRequest createInvitationResponse(MessageId id, protected InvitationMessage createInvitationResponse(MessageId id,
SessionId sessionId, ContactId contactId, boolean accept, long time, SessionId sessionId, ContactId contactId, boolean accept, long time,
boolean local, boolean sent, boolean seen, boolean read) { boolean local, boolean sent, boolean seen, boolean read) {
// TODO implement when doing blog sharing return new BlogInvitationResponse(id, sessionId, contactId, accept,
return null; time, local, sent, seen, read);
} }
@Override @Override

View File

@@ -37,7 +37,7 @@ import static org.briarproject.api.forum.ForumConstants.FORUM_NAME;
import static org.briarproject.api.forum.ForumConstants.FORUM_SALT; import static org.briarproject.api.forum.ForumConstants.FORUM_SALT;
class ForumSharingManagerImpl extends class ForumSharingManagerImpl extends
SharingManagerImpl<Forum, ForumInvitation, InvitationMessage, ForumInviteeSessionState, ForumSharerSessionState, ForumInvitationReceivedEvent, ForumInvitationResponseReceivedEvent> SharingManagerImpl<Forum, ForumInvitation, ForumInviteeSessionState, ForumSharerSessionState, ForumInvitationReceivedEvent, ForumInvitationResponseReceivedEvent>
implements ForumSharingManager, ForumManager.RemoveForumHook { implements ForumSharingManager, ForumManager.RemoveForumHook {
static final ClientId CLIENT_ID = new ClientId(StringUtils.fromHexString( static final ClientId CLIENT_ID = new ClientId(StringUtils.fromHexString(

View File

@@ -83,9 +83,9 @@ import static org.briarproject.api.sharing.SharingMessage.BaseMessage;
import static org.briarproject.api.sharing.SharingMessage.Invitation; import static org.briarproject.api.sharing.SharingMessage.Invitation;
import static org.briarproject.sharing.InviteeSessionState.State.AWAIT_LOCAL_RESPONSE; import static org.briarproject.sharing.InviteeSessionState.State.AWAIT_LOCAL_RESPONSE;
abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IM extends InvitationMessage, IS extends InviteeSessionState, SS extends SharerSessionState, IR extends InvitationReceivedEvent, IRR extends InvitationResponseReceivedEvent> abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IS extends InviteeSessionState, SS extends SharerSessionState, IR extends InvitationReceivedEvent, IRR extends InvitationResponseReceivedEvent>
extends BdfIncomingMessageHook extends BdfIncomingMessageHook
implements SharingManager<S, IM>, Client, AddContactHook, implements SharingManager<S>, Client, AddContactHook,
RemoveContactHook { RemoveContactHook {
private static final Logger LOG = private static final Logger LOG =
@@ -117,11 +117,11 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IM
public abstract ClientId getClientId(); public abstract ClientId getClientId();
protected abstract IM createInvitationRequest(MessageId id, I msg, protected abstract InvitationMessage createInvitationRequest(MessageId id, I msg,
ContactId contactId, boolean available, long time, boolean local, ContactId contactId, boolean available, long time, boolean local,
boolean sent, boolean seen, boolean read); boolean sent, boolean seen, boolean read);
protected abstract IM createInvitationResponse(MessageId id, protected abstract InvitationMessage createInvitationResponse(MessageId id,
SessionId sessionId, ContactId contactId, boolean accept, long time, SessionId sessionId, ContactId contactId, boolean accept, long time,
boolean local, boolean sent, boolean seen, boolean read); boolean local, boolean sent, boolean seen, boolean read);
@@ -326,7 +326,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IM
} }
@Override @Override
public Collection<IM> getInvitationMessages(ContactId contactId) public Collection<InvitationMessage> getInvitationMessages(ContactId contactId)
throws DbException { throws DbException {
Transaction txn = db.startTransaction(true); Transaction txn = db.startTransaction(true);
@@ -334,7 +334,8 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IM
Contact contact = db.getContact(txn, contactId); Contact contact = db.getContact(txn, contactId);
Group group = getContactGroup(contact); Group group = getContactGroup(contact);
Collection<IM> list = new ArrayList<IM>(); Collection<InvitationMessage> list =
new ArrayList<InvitationMessage>();
Map<MessageId, BdfDictionary> map = clientHelper Map<MessageId, BdfDictionary> map = clientHelper
.getMessageMetadataAsDictionary(txn, group.getId()); .getMessageMetadataAsDictionary(txn, group.getId());
for (Map.Entry<MessageId, BdfDictionary> m : map.entrySet()) { for (Map.Entry<MessageId, BdfDictionary> m : map.entrySet()) {
@@ -362,7 +363,7 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IM
available = ((InviteeSessionState) s).getState() == available = ((InviteeSessionState) s).getState() ==
AWAIT_LOCAL_RESPONSE; AWAIT_LOCAL_RESPONSE;
} }
IM im = createInvitationRequest(m.getKey(), msg, InvitationMessage im = createInvitationRequest(m.getKey(), msg,
contactId, available, time, local, contactId, available, time, local,
status.isSent(), status.isSeen(), read); status.isSent(), status.isSeen(), read);
list.add(im); list.add(im);
@@ -373,9 +374,9 @@ abstract class SharingManagerImpl<S extends Shareable, I extends Invitation, IM
BaseMessage msg = BaseMessage BaseMessage msg = BaseMessage
.from(getIFactory(), group.getId(), d); .from(getIFactory(), group.getId(), d);
SessionId sessionId = msg.getSessionId(); SessionId sessionId = msg.getSessionId();
IM im = createInvitationResponse(m.getKey(), sessionId, InvitationMessage im = createInvitationResponse(
contactId, accept, time, local, m.getKey(), sessionId, contactId, accept, time,
status.isSent(), status.isSeen(), read); local, status.isSent(), status.isSeen(), read);
list.add(im); list.add(im);
} }
else { else {