diff --git a/briar-android/res/layout/list_item_forum_invitation_out.xml b/briar-android/res/layout/list_item_forum_invitation_out.xml deleted file mode 100644 index 9784a1391..000000000 --- a/briar-android/res/layout/list_item_forum_invitation_out.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/briar-android/res/layout/list_item_forum_invitation_in.xml b/briar-android/res/layout/list_item_shareable_invitation_in.xml similarity index 100% rename from briar-android/res/layout/list_item_forum_invitation_in.xml rename to briar-android/res/layout/list_item_shareable_invitation_in.xml diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index 164dea6ac..5a3f510b5 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -309,6 +309,13 @@ There was an error sharing this blog. Share Blog Blog shared with chosen contacts + You accepted the blog invitation from %s. + You declined the blog invitation from %s. + %s accepted the blog invitation. + %s declined the blog invitation. + %1$s has shared the personal blog of %2$s with you. + You have shared the personal blog of %1$s with %2$s. + Show Blog Invitations Blog List Available Blogs diff --git a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java index f8874fd71..dc53745b9 100644 --- a/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java +++ b/briar-android/src/org/briarproject/android/AndroidNotificationManagerImpl.java @@ -21,11 +21,12 @@ import org.briarproject.api.db.DbException; import org.briarproject.api.event.BlogPostAddedEvent; import org.briarproject.api.event.Event; import org.briarproject.api.event.EventListener; -import org.briarproject.api.event.ForumInvitationReceivedEvent; import org.briarproject.api.event.ForumPostReceivedEvent; import org.briarproject.api.event.IntroductionRequestReceivedEvent; import org.briarproject.api.event.IntroductionResponseReceivedEvent; 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.SettingsUpdatedEvent; import org.briarproject.api.lifecycle.Service; @@ -174,8 +175,11 @@ class AndroidNotificationManagerImpl implements AndroidNotificationManager, } else if (e instanceof IntroductionSucceededEvent) { Contact c = ((IntroductionSucceededEvent) e).getContact(); showIntroductionSucceededNotification(c); - } else if (e instanceof ForumInvitationReceivedEvent) { - ContactId c = ((ForumInvitationReceivedEvent) e).getContactId(); + } else if (e instanceof InvitationReceivedEvent) { + ContactId c = ((InvitationReceivedEvent) e).getContactId(); + showNotificationForPrivateConversation(c); + } else if (e instanceof InvitationResponseReceivedEvent) { + ContactId c = ((InvitationResponseReceivedEvent) e).getContactId(); showNotificationForPrivateConversation(c); } } diff --git a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java index 582097c25..c9df74031 100644 --- a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java +++ b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java @@ -20,6 +20,7 @@ import org.briarproject.android.ActivityComponent; import org.briarproject.android.fragment.BaseFragment; import org.briarproject.android.keyagreement.KeyAgreementActivity; import org.briarproject.android.util.BriarRecyclerView; +import org.briarproject.api.blogs.BlogSharingManager; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; 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.IntroductionRequestReceivedEvent; 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.forum.ForumInvitationRequest; import org.briarproject.api.forum.ForumInvitationResponse; @@ -91,6 +94,8 @@ public class ContactListFragment extends BaseFragment implements EventListener { protected volatile IntroductionManager introductionManager; @Inject protected volatile ForumSharingManager forumSharingManager; + @Inject + protected volatile BlogSharingManager blogSharingManager; public static ContactListFragment newInstance() { @@ -277,14 +282,14 @@ public class ContactListFragment extends BaseFragment implements EventListener { (IntroductionResponseReceivedEvent) e; IntroductionResponse ir = m.getIntroductionResponse(); updateItem(m.getContactId(), ConversationItem.from(ir)); - } else if (e instanceof ForumInvitationReceivedEvent) { - LOG.info("Forum Invitation received, reloading conversation..."); - ForumInvitationReceivedEvent m = (ForumInvitationReceivedEvent) e; + } else if (e instanceof InvitationReceivedEvent) { + LOG.info("Invitation received, reloading conversation..."); + InvitationReceivedEvent m = (InvitationReceivedEvent) e; reloadConversation(m.getContactId()); - } else if (e instanceof ForumInvitationResponseReceivedEvent) { - LOG.info("Forum Invitation Response received, reloading ..."); - ForumInvitationResponseReceivedEvent m = - (ForumInvitationResponseReceivedEvent) e; + } else if (e instanceof InvitationResponseReceivedEvent) { + LOG.info("Invitation Response received, reloading ..."); + InvitationResponseReceivedEvent m = + (InvitationResponseReceivedEvent) e; reloadConversation(m.getContactId()); } } @@ -406,6 +411,7 @@ public class ContactListFragment extends BaseFragment implements EventListener { now = System.currentTimeMillis(); Collection invitations = forumSharingManager.getInvitationMessages(id); + invitations.addAll(blogSharingManager.getInvitationMessages(id)); for (InvitationMessage i : invitations) { messages.add(ConversationItem.from(i)); } diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java index 58b2084d9..b1cd0292d 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java @@ -30,6 +30,7 @@ import org.briarproject.android.api.AndroidNotificationManager; import org.briarproject.android.introduction.IntroductionActivity; import org.briarproject.android.util.BriarRecyclerView; import org.briarproject.api.FormatException; +import org.briarproject.api.blogs.BlogSharingManager; import org.briarproject.api.clients.SessionId; import org.briarproject.api.contact.Contact; 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.EventBus; 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.IntroductionResponseReceivedEvent; +import org.briarproject.api.event.InvitationReceivedEvent; +import org.briarproject.api.event.InvitationResponseReceivedEvent; import org.briarproject.api.event.MessagesAckedEvent; import org.briarproject.api.event.MessagesSentEvent; 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.introduction.IntroductionManager; 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.plugins.ConnectionRegistry; 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.MessageId; import org.briarproject.util.StringUtils; @@ -128,6 +129,8 @@ public class ConversationActivity extends BriarActivity protected volatile IntroductionManager introductionManager; @Inject protected volatile ForumSharingManager forumSharingManager; + @Inject + protected volatile BlogSharingManager blogSharingManager; private volatile GroupId groupId = null; private volatile ContactId contactId = null; @@ -337,6 +340,8 @@ public class ConversationActivity extends BriarActivity Collection invitations = forumSharingManager .getInvitationMessages(contactId); + invitations.addAll(blogSharingManager + .getInvitationMessages(contactId)); long duration = System.currentTimeMillis() - now; if (LOG.isLoggable(INFO)) LOG.info("Loading headers took " + duration + " ms"); @@ -388,13 +393,13 @@ public class ConversationActivity extends BriarActivity items.add(item); } for (InvitationMessage i : invitations) { - if (i instanceof ForumInvitationRequest) { - ForumInvitationRequest r = - (ForumInvitationRequest) i; + if (i instanceof InvitationRequest) { + InvitationRequest r = + (InvitationRequest) i; items.add(ConversationItem.from(r)); - } else if (i instanceof ForumInvitationResponse) { - ForumInvitationResponse r = - (ForumInvitationResponse) i; + } else if (i instanceof InvitationResponse) { + InvitationResponse r = + (InvitationResponse) i; items.add(ConversationItem .from(ConversationActivity.this, contactName, r)); @@ -541,6 +546,7 @@ public class ConversationActivity extends BriarActivity IntroductionRequestReceivedEvent event = (IntroductionRequestReceivedEvent) e; if (event.getContactId().equals(contactId)) { + LOG.info("Introduction request received, adding..."); IntroductionRequest ir = event.getIntroductionRequest(); ConversationItem item = new ConversationIntroductionInItem(ir); addConversationItem(item); @@ -549,21 +555,24 @@ public class ConversationActivity extends BriarActivity IntroductionResponseReceivedEvent event = (IntroductionResponseReceivedEvent) e; if (event.getContactId().equals(contactId)) { + LOG.info("Introduction response received, adding..."); IntroductionResponse ir = event.getIntroductionResponse(); ConversationItem item = ConversationItem.from(this, contactName, ir); addConversationItem(item); } - } else if (e instanceof ForumInvitationReceivedEvent) { - ForumInvitationReceivedEvent event = - (ForumInvitationReceivedEvent) e; + } else if (e instanceof InvitationReceivedEvent) { + InvitationReceivedEvent event = + (InvitationReceivedEvent) e; if (event.getContactId().equals(contactId)) { + LOG.info("Invitation received, reloading..."); loadMessages(); } - } else if (e instanceof ForumInvitationResponseReceivedEvent) { - ForumInvitationResponseReceivedEvent event = - (ForumInvitationResponseReceivedEvent) e; + } else if (e instanceof InvitationResponseReceivedEvent) { + InvitationResponseReceivedEvent event = + (InvitationResponseReceivedEvent) e; if (event.getContactId().equals(contactId)) { + LOG.info("Invitation response received, reloading..."); loadMessages(); } } diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java index 15b905908..6741890c5 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java @@ -15,16 +15,22 @@ import android.widget.TextView; import org.briarproject.R; import org.briarproject.android.forum.ForumInvitationsActivity; import org.briarproject.android.util.AndroidUtils; +import org.briarproject.api.blogs.BlogInvitationRequest; import org.briarproject.api.clients.SessionId; import org.briarproject.api.forum.ForumInvitationRequest; import org.briarproject.api.introduction.IntroductionRequest; import org.briarproject.api.messaging.PrivateMessageHeader; +import org.briarproject.api.sharing.InvitationRequest; import org.briarproject.util.StringUtils; import java.util.List; import static android.support.v7.util.SortedList.INVALID_POSITION; 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_OUT; import static org.briarproject.android.contact.ConversationItem.INTRODUCTION_IN; @@ -46,13 +52,13 @@ class ConversationAdapter extends RecyclerView.Adapter { private IntroductionHandler intro; private String contactName; - public ConversationAdapter(Context context, + ConversationAdapter(Context context, IntroductionHandler introductionHandler) { ctx = context; intro = introductionHandler; } - public void setContactName(String contactName) { + void setContactName(String contactName) { this.contactName = contactName; notifyDataSetChanged(); } @@ -87,13 +93,15 @@ class ConversationAdapter extends RecyclerView.Adapter { v = LayoutInflater.from(viewGroup.getContext()).inflate( R.layout.list_item_notice_out, viewGroup, false); 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( - R.layout.list_item_forum_invitation_in, viewGroup, false); + R.layout.list_item_shareable_invitation_in, viewGroup, + false); 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( - R.layout.list_item_forum_invitation_out, viewGroup, false); + R.layout.list_item_introduction_out, viewGroup, false); return new InvitationHolder(v, type); } // incoming message (non-local) @@ -119,12 +127,12 @@ class ConversationAdapter extends RecyclerView.Adapter { bindNotice((NoticeHolder) ui, (ConversationNoticeOutItem) item); } else if (item instanceof ConversationNoticeInItem) { bindNotice((NoticeHolder) ui, (ConversationNoticeInItem) item); - } else if (item instanceof ConversationForumInvitationOutItem) { + } else if (item instanceof ConversationShareableInvitationOutItem) { bindInvitation((InvitationHolder) ui, - (ConversationForumInvitationOutItem) item); - } else if (item instanceof ConversationForumInvitationInItem) { + (ConversationShareableInvitationOutItem) item); + } else if (item instanceof ConversationShareableInvitationInItem) { bindInvitation((InvitationHolder) ui, - (ConversationForumInvitationInItem) item); + (ConversationShareableInvitationInItem) item); } else { throw new IllegalArgumentException("Unhandled Conversation Item"); } @@ -180,9 +188,9 @@ class ConversationAdapter extends RecyclerView.Adapter { String message = ir.getMessage(); if (StringUtils.isNullOrEmpty(message)) { - ui.messageLayout.setVisibility(View.GONE); + ui.messageLayout.setVisibility(GONE); } else { - ui.messageLayout.setVisibility(View.VISIBLE); + ui.messageLayout.setVisibility(VISIBLE); ui.message.body.setText(StringUtils.trim(message)); ui.message.date .setText(AndroidUtils.formatDate(ctx, item.getTime())); @@ -213,8 +221,8 @@ class ConversationAdapter extends RecyclerView.Adapter { ui.text.setText(ctx.getString( R.string.introduction_request_answered_received, contactName, ir.getName())); - ui.acceptButton.setVisibility(View.GONE); - ui.declineButton.setVisibility(View.GONE); + ui.acceptButton.setVisibility(GONE); + ui.declineButton.setVisibility(GONE); } // Incoming Introduction Request (Not Answered) else { @@ -230,12 +238,12 @@ class ConversationAdapter extends RecyclerView.Adapter { if (item.getIntroductionRequest().doesIntroduceOtherIdentity()) { // 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( R.string.introduction_request_for_our_identity_received, contactName, ir.getName())); } else { - ui.acceptButton.setVisibility(View.VISIBLE); + ui.acceptButton.setVisibility(VISIBLE); ui.acceptButton.setOnClickListener(new View.OnClickListener() { @Override 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() { @Override public void onClick(View v) { @@ -276,26 +284,38 @@ class ConversationAdapter extends RecyclerView.Adapter { } 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)) { - ui.messageLayout.setVisibility(View.GONE); + ui.messageLayout.setVisibility(GONE); } else { - ui.messageLayout.setVisibility(View.VISIBLE); + ui.messageLayout.setVisibility(VISIBLE); ui.message.body.setText(StringUtils.trim(message)); ui.message.date .setText(AndroidUtils.formatDate(ctx, item.getTime())); } // Outgoing Invitation - if (item instanceof ConversationForumInvitationOutItem) { - ui.text.setText(ctx.getString(R.string.forum_invitation_sent, - fim.getForumName(), contactName)); - ConversationForumInvitationOutItem i = - (ConversationForumInvitationOutItem) item; + if (item instanceof ConversationShareableInvitationOutItem) { + ui.text.setText(ctx.getString(sentRes, name, contactName)); + ConversationShareableInvitationOutItem i = + (ConversationShareableInvitationOutItem) item; if (i.isSeen()) { ui.status.setImageResource(R.drawable.message_delivered); ui.message.status.setImageResource( @@ -312,12 +332,12 @@ class ConversationAdapter extends RecyclerView.Adapter { } // Incoming Invitation else { - ui.text.setText(ctx.getString(R.string.forum_invitation_received, - contactName, fim.getForumName())); + ui.text.setText(ctx.getString(receivedRes, contactName, name)); - if (fim.isAvailable()) { - ui.showForumsButton.setVisibility(View.VISIBLE); - ui.showForumsButton + if (ir.isAvailable()) { + ui.showInvitationsButton.setText(ctx.getString(buttonRes)); + ui.showInvitationsButton.setVisibility(VISIBLE); + ui.showInvitationsButton .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -327,7 +347,7 @@ class ConversationAdapter extends RecyclerView.Adapter { } }); } else { - ui.showForumsButton.setVisibility(View.GONE); + ui.showInvitationsButton.setVisibility(GONE); } } ui.date.setText(AndroidUtils.formatDate(ctx, item.getTime())); @@ -345,7 +365,7 @@ class ConversationAdapter extends RecyclerView.Adapter { return items.get(position); } - public ConversationItem getLastItem() { + ConversationItem getLastItem() { if (items.size() > 0) { return items.get(items.size() - 1); } else { @@ -353,7 +373,7 @@ class ConversationAdapter extends RecyclerView.Adapter { } } - public SparseArray getIncomingMessages() { + SparseArray getIncomingMessages() { SparseArray messages = new SparseArray<>(); for (int i = 0; i < items.size(); i++) { @@ -365,7 +385,7 @@ class ConversationAdapter extends RecyclerView.Adapter { return messages; } - public SparseArray getOutgoingMessages() { + SparseArray getOutgoingMessages() { SparseArray messages = new SparseArray<>(); for (int i = 0; i < items.size(); i++) { @@ -377,7 +397,7 @@ class ConversationAdapter extends RecyclerView.Adapter { return messages; } - public SparseArray getPrivateMessages() { + SparseArray getPrivateMessages() { SparseArray messages = new SparseArray<>(); for (int i = 0; i < items.size(); i++) { @@ -408,7 +428,7 @@ class ConversationAdapter extends RecyclerView.Adapter { public TextView date; public ImageView status; - public MessageHolder(View v, int type) { + MessageHolder(View v, int type) { super(v); layout = (ViewGroup) v.findViewById(R.id.msgLayout); @@ -432,7 +452,7 @@ class ConversationAdapter extends RecyclerView.Adapter { private final TextView date; private final ImageView status; - public IntroductionHolder(View v, int type) { + IntroductionHolder(View v, int type) { super(v); messageLayout = v.findViewById(R.id.messageLayout); @@ -457,7 +477,7 @@ class ConversationAdapter extends RecyclerView.Adapter { private final TextView date; private final ImageView status; - public NoticeHolder(View v, int type) { + NoticeHolder(View v, int type) { super(v); text = (TextView) v.findViewById(R.id.noticeText); @@ -476,21 +496,21 @@ class ConversationAdapter extends RecyclerView.Adapter { private final View messageLayout; private final MessageHolder message; private final TextView text; - private final Button showForumsButton; + private final Button showInvitationsButton; private final TextView date; private final ImageView status; - public InvitationHolder(View v, int type) { + InvitationHolder(View v, int type) { super(v); messageLayout = v.findViewById(R.id.messageLayout); message = new MessageHolder(messageLayout, type == FORUM_INVITATION_IN ? MSG_IN : MSG_OUT); 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); - if (type == FORUM_INVITATION_OUT) { + if (type == FORUM_INVITATION_OUT || type == BLOG_INVITATION_OUT) { status = (ImageView) v.findViewById(R.id.introductionStatus); } else { status = null; @@ -543,7 +563,7 @@ class ConversationAdapter extends RecyclerView.Adapter { } } - public interface IntroductionHandler { + interface IntroductionHandler { void respondToIntroduction(SessionId sessionId, boolean accept); } } diff --git a/briar-android/src/org/briarproject/android/contact/ConversationForumInvitationInItem.java b/briar-android/src/org/briarproject/android/contact/ConversationForumInvitationInItem.java deleted file mode 100644 index bfa5da545..000000000 --- a/briar-android/src/org/briarproject/android/contact/ConversationForumInvitationInItem.java +++ /dev/null @@ -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; - } -} diff --git a/briar-android/src/org/briarproject/android/contact/ConversationForumInvitationItem.java b/briar-android/src/org/briarproject/android/contact/ConversationForumInvitationItem.java deleted file mode 100644 index 50c5c64d2..000000000 --- a/briar-android/src/org/briarproject/android/contact/ConversationForumInvitationItem.java +++ /dev/null @@ -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; - } -} diff --git a/briar-android/src/org/briarproject/android/contact/ConversationItem.java b/briar-android/src/org/briarproject/android/contact/ConversationItem.java index dbc81c25a..321cceab3 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationItem.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationItem.java @@ -3,13 +3,15 @@ package org.briarproject.android.contact; import android.content.Context; 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.introduction.IntroductionMessage; import org.briarproject.api.introduction.IntroductionRequest; import org.briarproject.api.introduction.IntroductionResponse; import org.briarproject.api.messaging.PrivateMessageHeader; import org.briarproject.api.sharing.InvitationMessage; +import org.briarproject.api.sharing.InvitationRequest; +import org.briarproject.api.sharing.InvitationResponse; import org.briarproject.api.sync.MessageId; // This class is not thread-safe @@ -25,6 +27,8 @@ public abstract class ConversationItem { final static int NOTICE_OUT = 6; final static int FORUM_INVITATION_IN = 7; 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 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()) { - return new ConversationForumInvitationOutItem(fim); + return new ConversationShareableInvitationOutItem(fim); } else { - return new ConversationForumInvitationInItem(fim); + return new ConversationShareableInvitationInItem(fim); } } 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) { 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, * Its purpose is only to provide data for the contact list. diff --git a/briar-android/src/org/briarproject/android/contact/ConversationShareableInvitationInItem.java b/briar-android/src/org/briarproject/android/contact/ConversationShareableInvitationInItem.java new file mode 100644 index 000000000..6e46b7b41 --- /dev/null +++ b/briar-android/src/org/briarproject/android/contact/ConversationShareableInvitationInItem.java @@ -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; + } +} diff --git a/briar-android/src/org/briarproject/android/contact/ConversationShareableInvitationItem.java b/briar-android/src/org/briarproject/android/contact/ConversationShareableInvitationItem.java new file mode 100644 index 000000000..a2e9b91cf --- /dev/null +++ b/briar-android/src/org/briarproject/android/contact/ConversationShareableInvitationItem.java @@ -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; + } +} diff --git a/briar-android/src/org/briarproject/android/contact/ConversationForumInvitationOutItem.java b/briar-android/src/org/briarproject/android/contact/ConversationShareableInvitationOutItem.java similarity index 52% rename from briar-android/src/org/briarproject/android/contact/ConversationForumInvitationOutItem.java rename to briar-android/src/org/briarproject/android/contact/ConversationShareableInvitationOutItem.java index 5551fa60c..426403ab3 100644 --- a/briar-android/src/org/briarproject/android/contact/ConversationForumInvitationOutItem.java +++ b/briar-android/src/org/briarproject/android/contact/ConversationShareableInvitationOutItem.java @@ -1,6 +1,8 @@ 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 needed and can not be replaced by an ConversationNoticeOutItem, @@ -9,21 +11,31 @@ import org.briarproject.api.forum.ForumInvitationRequest; *

* This class is not thread-safe */ -public class ConversationForumInvitationOutItem - extends ConversationForumInvitationItem +class ConversationShareableInvitationOutItem + extends ConversationShareableInvitationItem implements ConversationItem.OutgoingItem { + private final int type; private boolean sent, seen; - public ConversationForumInvitationOutItem(ForumInvitationRequest fim) { - super(fim); - this.sent = fim.isSent(); - this.seen = fim.isSeen(); + ConversationShareableInvitationOutItem(InvitationRequest ir) { + super(ir); + + 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 int getType() { - return FORUM_INVITATION_OUT; + return type; } @Override diff --git a/briar-api/src/org/briarproject/api/blogs/BlogInvitationRequest.java b/briar-api/src/org/briarproject/api/blogs/BlogInvitationRequest.java index 473955960..0f2970b25 100644 --- a/briar-api/src/org/briarproject/api/blogs/BlogInvitationRequest.java +++ b/briar-api/src/org/briarproject/api/blogs/BlogInvitationRequest.java @@ -8,20 +8,20 @@ import org.briarproject.api.sync.MessageId; public class BlogInvitationRequest extends InvitationRequest { - private final String blogTitle; + private final String blogAuthorName; 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 seen, boolean read) { super(id, sessionId, contactId, message, available, time, local, sent, seen, read); - this.blogTitle = blogTitle; + this.blogAuthorName = blogAuthorName; } - public String getBlogTitle() { - return blogTitle; + public String getBlogAuthorName() { + return blogAuthorName; } } diff --git a/briar-api/src/org/briarproject/api/blogs/BlogInvitationResponse.java b/briar-api/src/org/briarproject/api/blogs/BlogInvitationResponse.java new file mode 100644 index 000000000..e3e7cdf69 --- /dev/null +++ b/briar-api/src/org/briarproject/api/blogs/BlogInvitationResponse.java @@ -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); + } + +} diff --git a/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java b/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java index 59e06c712..4e21557f8 100644 --- a/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java +++ b/briar-api/src/org/briarproject/api/blogs/BlogSharingManager.java @@ -3,14 +3,14 @@ package org.briarproject.api.blogs; import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; +import org.briarproject.api.sharing.InvitationMessage; import org.briarproject.api.sharing.SharingManager; import org.briarproject.api.sync.ClientId; import org.briarproject.api.sync.GroupId; import java.util.Collection; -public interface BlogSharingManager - extends SharingManager { +public interface BlogSharingManager extends SharingManager { /** * 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 * identified by contactId. */ - Collection getInvitationMessages( + Collection getInvitationMessages( ContactId contactId) throws DbException; /** diff --git a/briar-api/src/org/briarproject/api/forum/ForumSharingManager.java b/briar-api/src/org/briarproject/api/forum/ForumSharingManager.java index 2ad3228dd..5f1f623c2 100644 --- a/briar-api/src/org/briarproject/api/forum/ForumSharingManager.java +++ b/briar-api/src/org/briarproject/api/forum/ForumSharingManager.java @@ -10,7 +10,7 @@ import org.briarproject.api.sync.GroupId; import java.util.Collection; -public interface ForumSharingManager extends SharingManager { +public interface ForumSharingManager extends SharingManager { /** Returns the unique ID of the forum sharing client. */ ClientId getClientId(); diff --git a/briar-api/src/org/briarproject/api/sharing/SharingManager.java b/briar-api/src/org/briarproject/api/sharing/SharingManager.java index 100ab5dc4..861edfc4c 100644 --- a/briar-api/src/org/briarproject/api/sharing/SharingManager.java +++ b/briar-api/src/org/briarproject/api/sharing/SharingManager.java @@ -8,7 +8,7 @@ import org.briarproject.api.sync.GroupId; import java.util.Collection; -public interface SharingManager { +public interface SharingManager { /** Returns the unique ID of the group sharing client. */ ClientId getClientId(); @@ -30,7 +30,7 @@ public interface SharingManager getInvitationMessages( + Collection getInvitationMessages( ContactId contactId) throws DbException; /** Returns all shareables to which the user has been invited. */ diff --git a/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java index 550667641..19f9eef34 100644 --- a/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java @@ -4,6 +4,7 @@ import org.briarproject.api.FormatException; import org.briarproject.api.blogs.Blog; import org.briarproject.api.blogs.BlogFactory; import org.briarproject.api.blogs.BlogInvitationRequest; +import org.briarproject.api.blogs.BlogInvitationResponse; import org.briarproject.api.blogs.BlogManager; import org.briarproject.api.blogs.BlogManager.RemoveBlogHook; 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.identity.Author; import org.briarproject.api.identity.AuthorFactory; +import org.briarproject.api.sharing.InvitationMessage; import org.briarproject.api.sync.ClientId; import org.briarproject.api.sync.GroupId; 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; class BlogSharingManagerImpl extends - SharingManagerImpl + SharingManagerImpl implements BlogSharingManager, RemoveBlogHook { static final ClientId CLIENT_ID = new ClientId(StringUtils.fromHexString( @@ -89,21 +91,21 @@ class BlogSharingManagerImpl extends } @Override - protected BlogInvitationRequest createInvitationRequest(MessageId id, + protected InvitationMessage createInvitationRequest(MessageId id, BlogInvitation msg, ContactId contactId, boolean available, long time, boolean local, boolean sent, boolean seen, boolean read) { return new BlogInvitationRequest(id, msg.getSessionId(), contactId, - msg.getBlogTitle(), msg.getMessage(), available, time, local, - sent, seen, read); + msg.getBlogAuthorName(), msg.getMessage(), available, time, + local, sent, seen, read); } @Override - protected BlogInvitationRequest createInvitationResponse(MessageId id, + protected InvitationMessage createInvitationResponse(MessageId id, SessionId sessionId, ContactId contactId, boolean accept, long time, boolean local, boolean sent, boolean seen, boolean read) { - // TODO implement when doing blog sharing - return null; + return new BlogInvitationResponse(id, sessionId, contactId, accept, + time, local, sent, seen, read); } @Override diff --git a/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java index 95f9f0ef5..eb0724001 100644 --- a/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/ForumSharingManagerImpl.java @@ -37,7 +37,7 @@ import static org.briarproject.api.forum.ForumConstants.FORUM_NAME; import static org.briarproject.api.forum.ForumConstants.FORUM_SALT; class ForumSharingManagerImpl extends - SharingManagerImpl + SharingManagerImpl implements ForumSharingManager, ForumManager.RemoveForumHook { static final ClientId CLIENT_ID = new ClientId(StringUtils.fromHexString( diff --git a/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java index ce34826ec..5f6fd4d41 100644 --- a/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/SharingManagerImpl.java @@ -83,9 +83,9 @@ import static org.briarproject.api.sharing.SharingMessage.BaseMessage; import static org.briarproject.api.sharing.SharingMessage.Invitation; import static org.briarproject.sharing.InviteeSessionState.State.AWAIT_LOCAL_RESPONSE; -abstract class SharingManagerImpl +abstract class SharingManagerImpl extends BdfIncomingMessageHook - implements SharingManager, Client, AddContactHook, + implements SharingManager, Client, AddContactHook, RemoveContactHook { private static final Logger LOG = @@ -117,11 +117,11 @@ abstract class SharingManagerImpl getInvitationMessages(ContactId contactId) + public Collection getInvitationMessages(ContactId contactId) throws DbException { Transaction txn = db.startTransaction(true); @@ -334,7 +334,8 @@ abstract class SharingManagerImpl list = new ArrayList(); + Collection list = + new ArrayList(); Map map = clientHelper .getMessageMetadataAsDictionary(txn, group.getId()); for (Map.Entry m : map.entrySet()) { @@ -362,7 +363,7 @@ abstract class SharingManagerImpl