diff --git a/briar-android/AndroidManifest.xml b/briar-android/AndroidManifest.xml index 0249275b5a3edb3e33b157dfb40c68f31d7e6b3c..55b48260eea15ef0f084dc9e92620edeea61abd3 100644 --- a/briar-android/AndroidManifest.xml +++ b/briar-android/AndroidManifest.xml @@ -133,7 +133,7 @@ </activity> <activity - android:name=".android.forum.ShareForumActivity" + android:name=".android.sharing.ShareActivity" android:label="@string/forums_share_toolbar_header" android:parentActivityName=".android.forum.ForumActivity"> <meta-data @@ -143,7 +143,7 @@ </activity> <activity - android:name=".android.forum.ForumSharingStatusActivity" + android:name=".android.sharing.SharingStatusActivity" android:label="@string/forum_sharing_status" android:parentActivityName=".android.forum.ForumActivity"> <meta-data diff --git a/briar-android/res/layout/activity_share_forum.xml b/briar-android/res/layout/activity_share_forum.xml index b91e96f00b0299104a5145334361b4b9d310df55..80f19387f68dfda0613074f4fdc19ee32ab4b8cc 100644 --- a/briar-android/res/layout/activity_share_forum.xml +++ b/briar-android/res/layout/activity_share_forum.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <FrameLayout - android:id="@+id/shareForumContainer" + android:id="@+id/shareContainer" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"/> \ No newline at end of file diff --git a/briar-android/res/layout/share_forum_message.xml b/briar-android/res/layout/fragment_share_message.xml similarity index 100% rename from briar-android/res/layout/share_forum_message.xml rename to briar-android/res/layout/fragment_share_message.xml diff --git a/briar-android/res/menu/blogs_blog_actions.xml b/briar-android/res/menu/blogs_blog_actions.xml new file mode 100644 index 0000000000000000000000000000000000000000..ef84cfb20134db9306e120149b792bae02d92f86 --- /dev/null +++ b/briar-android/res/menu/blogs_blog_actions.xml @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<menu + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + + <item + android:id="@+id/action_blog_share" + android:icon="@drawable/social_share_white" + android:title="@string/blogs_sharing_share" + app:showAsAction="ifRoom"/> + + <item + android:id="@+id/action_blog_sharing_status" + android:title="@string/forum_sharing_status" + app:showAsAction="never"/> + +</menu> \ No newline at end of file diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml index 0c9ce8a08f7e51e9a8df603227ffb27ab9f3c15b..164dea6ac2992ee768dd5ddaf1b1f5c65d3ff578 100644 --- a/briar-android/res/values/strings.xml +++ b/briar-android/res/values/strings.xml @@ -113,6 +113,7 @@ <string name="forum_share_button">Share Forum</string> <string name="forum_shared_snackbar">Forum shared with chosen contacts</string> <string name="forum_share_message">You may compose an optional invitation message that will be sent to the selected contacts.</string> + <string name="forum_share_error">There was an error sharing this forum.</string> <string name="forum_invitation_received">%1$s has shared the forum \"%2$s\" with you.</string> <string name="forum_invitation_sent">You have shared the forum \"%1$s\" with %2$s.</string> <string name="forum_show_invitations">Show Forum Invitations</string> @@ -304,6 +305,10 @@ <string name="blogs_delete_blog_cancel">Keep</string> <string name="blogs_blog_deleted">Blog Deleted</string> <string name="blogs_remove_blog">Remove Blog</string> + <string name="blogs_sharing_share">Share 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_snackbar">Blog shared with chosen contacts</string> <string name="blogs_blog_list">Blog List</string> <string name="blogs_available_blogs">Available Blogs</string> diff --git a/briar-android/src/org/briarproject/android/ActivityComponent.java b/briar-android/src/org/briarproject/android/ActivityComponent.java index 7d902e6b4a518be0ea6cb99b59e64f493d1ac2a9..8d4d85225e3aeae7d857fa2dd82956d72788c153 100644 --- a/briar-android/src/org/briarproject/android/ActivityComponent.java +++ b/briar-android/src/org/briarproject/android/ActivityComponent.java @@ -16,13 +16,13 @@ import org.briarproject.android.blogs.WriteBlogPostActivity; import org.briarproject.android.contact.ContactListFragment; import org.briarproject.android.contact.ConversationActivity; import org.briarproject.android.forum.ForumInvitationsActivity; -import org.briarproject.android.forum.ContactSelectorFragment; +import org.briarproject.android.sharing.ContactSelectorFragment; import org.briarproject.android.forum.CreateForumActivity; import org.briarproject.android.forum.ForumActivity; import org.briarproject.android.forum.ForumListFragment; -import org.briarproject.android.forum.ForumSharingStatusActivity; -import org.briarproject.android.forum.ShareForumActivity; -import org.briarproject.android.forum.ShareForumMessageFragment; +import org.briarproject.android.sharing.SharingStatusActivity; +import org.briarproject.android.sharing.ShareActivity; +import org.briarproject.android.sharing.ShareMessageFragment; import org.briarproject.android.identity.CreateIdentityActivity; import org.briarproject.android.introduction.ContactChooserFragment; import org.briarproject.android.introduction.IntroductionActivity; @@ -67,9 +67,9 @@ public interface ActivityComponent { void inject(CreateForumActivity activity); - void inject(ShareForumActivity activity); + void inject(ShareActivity activity); - void inject(ForumSharingStatusActivity activity); + void inject(SharingStatusActivity activity); void inject(ForumActivity activity); @@ -104,7 +104,7 @@ public interface ActivityComponent { void inject(ShowQrCodeFragment fragment); void inject(ContactChooserFragment fragment); void inject(ContactSelectorFragment fragment); - void inject(ShareForumMessageFragment fragment); + void inject(ShareMessageFragment fragment); void inject(IntroductionMessageFragment fragment); } diff --git a/briar-android/src/org/briarproject/android/AndroidComponent.java b/briar-android/src/org/briarproject/android/AndroidComponent.java index dbe923c953df5777e13358684bbdbc3808f6fc78..a5880d33686c970c759ea1f33008fd34e2c9b39d 100644 --- a/briar-android/src/org/briarproject/android/AndroidComponent.java +++ b/briar-android/src/org/briarproject/android/AndroidComponent.java @@ -8,6 +8,7 @@ import org.briarproject.android.api.ReferenceManager; import org.briarproject.android.report.BriarReportSender; import org.briarproject.api.blogs.BlogManager; import org.briarproject.api.blogs.BlogPostFactory; +import org.briarproject.api.blogs.BlogSharingManager; import org.briarproject.api.contact.ContactExchangeTask; import org.briarproject.api.contact.ContactManager; import org.briarproject.api.crypto.CryptoComponent; @@ -93,6 +94,8 @@ public interface AndroidComponent extends CoreEagerSingletons { ForumSharingManager forumSharingManager(); + BlogSharingManager blogSharingManager(); + ForumPostFactory forumPostFactory(); BlogManager blogManager(); diff --git a/briar-android/src/org/briarproject/android/blogs/BlogActivity.java b/briar-android/src/org/briarproject/android/blogs/BlogActivity.java index ceb80f61ad8a5225e2efdebd13ccf44ee8d282a9..866b191d96d38d6359aca975ae42196218f097df 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogActivity.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogActivity.java @@ -32,6 +32,7 @@ public class BlogActivity extends BriarActivity implements BlogPostListener, OnBlogPostClickListener, BaseFragmentListener { static final int REQUEST_WRITE_POST = 1; + static final int REQUEST_SHARE = 2; static final String BLOG_NAME = "briar.BLOG_NAME"; static final String IS_MY_BLOG = "briar.IS_MY_BLOG"; static final String IS_NEW_BLOG = "briar.IS_NEW_BLOG"; @@ -185,6 +186,7 @@ public class BlogActivity extends BriarActivity implements BlogPostListener, @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); // The BlogPostAddedEvent arrives when the controller is not listening, // so we need to manually reload the blog posts :( diff --git a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java index ec3762b5819aaf67c311a52346b104a6b85c8636..a6e46b3feff6e7a66fe679b966b165c2c8044b93 100644 --- a/briar-android/src/org/briarproject/android/blogs/BlogFragment.java +++ b/briar-android/src/org/briarproject/android/blogs/BlogFragment.java @@ -23,6 +23,8 @@ import org.briarproject.android.blogs.BlogController.BlogPostListener; import org.briarproject.android.blogs.BlogPostAdapter.OnBlogPostClickListener; import org.briarproject.android.controller.handler.UiResultHandler; import org.briarproject.android.fragment.BaseFragment; +import org.briarproject.android.sharing.ShareActivity; +import org.briarproject.android.sharing.SharingStatusActivity; import org.briarproject.android.util.BriarRecyclerView; import org.briarproject.api.sync.GroupId; @@ -30,6 +32,9 @@ import java.util.Collection; import javax.inject.Inject; +import static android.app.Activity.RESULT_OK; +import static android.content.Intent.FLAG_ACTIVITY_CLEAR_TOP; +import static android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP; import static android.support.design.widget.Snackbar.LENGTH_LONG; import static android.support.v4.app.ActivityOptionsCompat.makeCustomAnimation; import static android.widget.Toast.LENGTH_SHORT; @@ -37,7 +42,10 @@ import static org.briarproject.android.BriarActivity.GROUP_ID; import static org.briarproject.android.blogs.BlogActivity.BLOG_NAME; import static org.briarproject.android.blogs.BlogActivity.IS_MY_BLOG; import static org.briarproject.android.blogs.BlogActivity.IS_NEW_BLOG; +import static org.briarproject.android.blogs.BlogActivity.REQUEST_SHARE; import static org.briarproject.android.blogs.BlogActivity.REQUEST_WRITE_POST; +import static org.briarproject.android.sharing.ShareActivity.BLOG; +import static org.briarproject.android.sharing.ShareActivity.SHAREABLE; public class BlogFragment extends BaseFragment implements BlogPostListener { @@ -136,12 +144,18 @@ public class BlogFragment extends BaseFragment implements BlogPostListener { public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (myBlog) { inflater.inflate(R.menu.blogs_my_blog_actions, menu); + } else { + inflater.inflate(R.menu.blogs_blog_actions, menu); } super.onCreateOptionsMenu(menu, inflater); } @Override public boolean onOptionsItemSelected(final MenuItem item) { + ActivityOptionsCompat options = + makeCustomAnimation(getActivity(), + android.R.anim.slide_in_left, + android.R.anim.slide_out_right); switch (item.getItemId()) { case android.R.id.home: getActivity().onBackPressed(); @@ -151,18 +165,37 @@ public class BlogFragment extends BaseFragment implements BlogPostListener { new Intent(getActivity(), WriteBlogPostActivity.class); i.putExtra(GROUP_ID, groupId.getBytes()); i.putExtra(BLOG_NAME, blogName); - ActivityOptionsCompat options = - makeCustomAnimation(getActivity(), - android.R.anim.slide_in_left, - android.R.anim.slide_out_right); ActivityCompat.startActivityForResult(getActivity(), i, REQUEST_WRITE_POST, options.toBundle()); return true; + case R.id.action_blog_share: + Intent i2 = new Intent(getActivity(), ShareActivity.class); + i2.setFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP); + i2.putExtra(GROUP_ID, groupId.getBytes()); + i2.putExtra(SHAREABLE, BLOG); + startActivityForResult(i2, REQUEST_SHARE, options.toBundle()); + return true; + case R.id.action_blog_sharing_status: + Intent i3 = + new Intent(getActivity(), SharingStatusActivity.class); + i3.setFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP); + i3.putExtra(GROUP_ID, groupId.getBytes()); + startActivity(i3, options.toBundle()); + return true; default: return super.onOptionsItemSelected(item); } } + @Override + public void onActivityResult(int request, int result, Intent data) { + super.onActivityResult(request, result, data); + + if (request == REQUEST_SHARE && result == RESULT_OK) { + displaySnackbar(R.string.blogs_sharing_snackbar); + } + } + @Override public String getUniqueTag() { return TAG; @@ -202,6 +235,13 @@ public class BlogFragment extends BaseFragment implements BlogPostListener { loadData(true); } + private void displaySnackbar(int stringId) { + Snackbar snackbar = + Snackbar.make(list, stringId, Snackbar.LENGTH_SHORT); + snackbar.getView().setBackgroundResource(R.color.briar_primary); + snackbar.show(); + } + private void showDeleteDialog() { DialogInterface.OnClickListener okListener = new DialogInterface.OnClickListener() { diff --git a/briar-android/src/org/briarproject/android/forum/ForumActivity.java b/briar-android/src/org/briarproject/android/forum/ForumActivity.java index 02a78caccbc400c3b133887b3d56740ed6882594..383992a8e86cbbae40f5f8af761334a7dc0b097d 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java +++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java @@ -33,6 +33,8 @@ import org.briarproject.android.ActivityComponent; import org.briarproject.android.BriarActivity; import org.briarproject.android.api.AndroidNotificationManager; import org.briarproject.android.controller.handler.UiResultHandler; +import org.briarproject.android.sharing.ShareActivity; +import org.briarproject.android.sharing.SharingStatusActivity; import org.briarproject.android.util.AndroidUtils; import org.briarproject.android.util.BriarRecyclerView; import org.briarproject.android.util.TrustIndicatorView; @@ -57,6 +59,8 @@ import static android.view.View.GONE; import static android.view.View.INVISIBLE; import static android.view.View.VISIBLE; import static android.widget.Toast.LENGTH_SHORT; +import static org.briarproject.android.sharing.ShareActivity.FORUM; +import static org.briarproject.android.sharing.ShareActivity.SHAREABLE; public class ForumActivity extends BriarActivity implements ForumController.ForumPostListener { @@ -220,15 +224,16 @@ public class ForumActivity extends BriarActivity implements showTextInput(null); return true; case R.id.action_forum_share: - Intent i2 = new Intent(this, ShareForumActivity.class); + Intent i2 = new Intent(this, ShareActivity.class); i2.setFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP); i2.putExtra(GROUP_ID, groupId.getBytes()); + i2.putExtra(SHAREABLE, FORUM); ActivityCompat .startActivityForResult(this, i2, REQUEST_FORUM_SHARED, options.toBundle()); return true; case R.id.action_forum_sharing_status: - Intent i3 = new Intent(this, ForumSharingStatusActivity.class); + Intent i3 = new Intent(this, SharingStatusActivity.class); i3.setFlags(FLAG_ACTIVITY_CLEAR_TOP | FLAG_ACTIVITY_SINGLE_TOP); i3.putExtra(GROUP_ID, groupId.getBytes()); ActivityCompat.startActivity(this, i3, options.toBundle()); diff --git a/briar-android/src/org/briarproject/android/forum/ContactSelectorAdapter.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorAdapter.java similarity index 98% rename from briar-android/src/org/briarproject/android/forum/ContactSelectorAdapter.java rename to briar-android/src/org/briarproject/android/sharing/ContactSelectorAdapter.java index 9a2fe4590677cbde9595c7f58751e262ea297176..d940c48dc6e1754de87a8271dd5928b8f13dabfa 100644 --- a/briar-android/src/org/briarproject/android/forum/ContactSelectorAdapter.java +++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorAdapter.java @@ -1,4 +1,4 @@ -package org.briarproject.android.forum; +package org.briarproject.android.sharing; import android.content.Context; import android.graphics.Color; diff --git a/briar-android/src/org/briarproject/android/forum/ContactSelectorFragment.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java similarity index 83% rename from briar-android/src/org/briarproject/android/forum/ContactSelectorFragment.java rename to briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java index 99f1f41c6109fe9a6f7e14ea0c44e83ccfdaf6c5..6ace473db2d10a5406061ca0ee38ed66c8d05a12 100644 --- a/briar-android/src/org/briarproject/android/forum/ContactSelectorFragment.java +++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java @@ -1,4 +1,4 @@ -package org.briarproject.android.forum; +package org.briarproject.android.sharing; import android.content.Context; import android.os.Build; @@ -18,6 +18,7 @@ import org.briarproject.android.contact.BaseContactListAdapter; import org.briarproject.android.contact.ContactListItem; import org.briarproject.android.fragment.BaseFragment; 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,8 +38,11 @@ import javax.inject.Inject; import static java.util.logging.Level.INFO; import static java.util.logging.Level.WARNING; -import static org.briarproject.android.forum.ShareForumActivity.CONTACTS; -import static org.briarproject.android.forum.ShareForumActivity.getContactsFromIds; +import static org.briarproject.android.sharing.ShareActivity.BLOG; +import static org.briarproject.android.sharing.ShareActivity.CONTACTS; +import static org.briarproject.android.sharing.ShareActivity.FORUM; +import static org.briarproject.android.sharing.ShareActivity.SHAREABLE; +import static org.briarproject.android.sharing.ShareActivity.getContactsFromIds; import static org.briarproject.api.sharing.SharingConstants.GROUP_ID; public class ContactSelectorFragment extends BaseFragment implements @@ -49,7 +53,7 @@ public class ContactSelectorFragment extends BaseFragment implements private static final Logger LOG = Logger.getLogger(ContactSelectorFragment.class.getName()); - private ShareForumActivity shareForumActivity; + private ShareActivity shareActivity; private Menu menu; private BriarRecyclerView list; private ContactSelectorAdapter adapter; @@ -62,13 +66,18 @@ public class ContactSelectorFragment extends BaseFragment implements protected volatile IdentityManager identityManager; @Inject protected volatile ForumSharingManager forumSharingManager; + @Inject + volatile BlogSharingManager blogSharingManager; - protected volatile GroupId groupId; + private volatile GroupId groupId; + private volatile int shareable; - public static ContactSelectorFragment newInstance(GroupId groupId) { + public static ContactSelectorFragment newInstance(int shareable, + GroupId groupId) { Bundle args = new Bundle(); args.putByteArray(GROUP_ID, groupId.getBytes()); + args.putInt(SHAREABLE, shareable); ContactSelectorFragment fragment = new ContactSelectorFragment(); fragment.setArguments(args); return fragment; @@ -83,7 +92,7 @@ public class ContactSelectorFragment extends BaseFragment implements public void onAttach(Context context) { super.onAttach(context); try { - shareForumActivity = (ShareForumActivity) context; + shareActivity = (ShareActivity) context; } catch (ClassCastException e) { throw new InstantiationError( "This fragment is only meant to be attached to the ShareForumActivity"); @@ -97,6 +106,7 @@ public class ContactSelectorFragment extends BaseFragment implements setHasOptionsMenu(true); groupId = new GroupId(getArguments().getByteArray(GROUP_ID)); if (groupId == null) throw new IllegalStateException("No GroupId"); + shareable = getArguments().getInt(SHAREABLE); } @Override @@ -121,7 +131,7 @@ public class ContactSelectorFragment extends BaseFragment implements if (savedInstanceState != null) { ArrayList<Integer> intContacts = savedInstanceState.getIntegerArrayList(CONTACTS); - selectedContacts = ShareForumActivity.getContactsFromIntegers( + selectedContacts = ShareActivity.getContactsFromIntegers( intContacts); } @@ -160,11 +170,11 @@ public class ContactSelectorFragment extends BaseFragment implements // Handle presses on the action bar items switch (item.getItemId()) { case android.R.id.home: - shareForumActivity.onBackPressed(); + shareActivity.onBackPressed(); return true; case R.id.action_share_forum: selectedContacts = adapter.getSelectedContactIds(); - shareForumActivity.showMessageScreen(groupId, selectedContacts); + shareActivity.showMessageScreen(groupId, selectedContacts); return true; default: return super.onOptionsItemSelected(item); @@ -185,7 +195,7 @@ public class ContactSelectorFragment extends BaseFragment implements } private void loadContacts(final Collection<ContactId> selection) { - shareForumActivity.runOnDbThread(new Runnable() { + listener.runOnDbThread(new Runnable() { @Override public void run() { try { @@ -199,8 +209,14 @@ public class ContactSelectorFragment extends BaseFragment implements boolean selected = selection != null && selection.contains(c.getId()); // do we have already some sharing with that contact? - boolean disabled = - !forumSharingManager.canBeShared(groupId, c); + boolean disabled = true; + if (shareable == FORUM) { + disabled = !forumSharingManager + .canBeShared(groupId, c); + } else if (shareable == BLOG) { + disabled = !blogSharingManager + .canBeShared(groupId, c); + } contacts.add(new SelectableContactListItem(c, localAuthor, groupId, selected, disabled)); } @@ -218,7 +234,7 @@ public class ContactSelectorFragment extends BaseFragment implements } private void displayContacts(final List<ContactListItem> contacts) { - shareForumActivity.runOnUiThread(new Runnable() { + shareActivity.runOnUiThread(new Runnable() { @Override public void run() { if (!contacts.isEmpty()) adapter.addAll(contacts); diff --git a/briar-android/src/org/briarproject/android/forum/SelectableContactListItem.java b/briar-android/src/org/briarproject/android/sharing/SelectableContactListItem.java similarity index 95% rename from briar-android/src/org/briarproject/android/forum/SelectableContactListItem.java rename to briar-android/src/org/briarproject/android/sharing/SelectableContactListItem.java index fa5ad2284f0852d98ec3460f87c5018f72d8e06b..0d713fda2f4594b2f6c0be0b5dd4ea943a9655cc 100644 --- a/briar-android/src/org/briarproject/android/forum/SelectableContactListItem.java +++ b/briar-android/src/org/briarproject/android/sharing/SelectableContactListItem.java @@ -1,4 +1,4 @@ -package org.briarproject.android.forum; +package org.briarproject.android.sharing; import org.briarproject.android.contact.ContactListItem; import org.briarproject.android.contact.ConversationItem; diff --git a/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java similarity index 73% rename from briar-android/src/org/briarproject/android/forum/ShareForumActivity.java rename to briar-android/src/org/briarproject/android/sharing/ShareActivity.java index d789e854f69307e931b9202376bacdea20a75fcd..be0a6e8db65dc50312f43c55d48597e88dfc1773 100644 --- a/briar-android/src/org/briarproject/android/forum/ShareForumActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java @@ -1,4 +1,4 @@ -package org.briarproject.android.forum; +package org.briarproject.android.sharing; import android.content.Intent; import android.os.Bundle; @@ -15,11 +15,16 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -// TODO extend the BriarFragmentActivity ? -public class ShareForumActivity extends BriarActivity implements +public class ShareActivity extends BriarActivity implements BaseFragment.BaseFragmentListener { - public final static String CONTACTS = "contacts"; + public final static String SHAREABLE = "shareable"; + public final static int FORUM = 1; + public final static int BLOG = 2; + + final static String CONTACTS = "contacts"; + + private int shareable; @Override public void onCreate(Bundle savedInstanceState) { @@ -32,11 +37,14 @@ public class ShareForumActivity extends BriarActivity implements if (b == null) throw new IllegalStateException("No GroupId"); GroupId groupId = new GroupId(b); + shareable = i.getIntExtra(SHAREABLE, 0); + if (shareable == 0) throw new IllegalStateException("No Shareable"); + if (savedInstanceState == null) { ContactSelectorFragment contactSelectorFragment = - ContactSelectorFragment.newInstance(groupId); + ContactSelectorFragment.newInstance(shareable, groupId); getSupportFragmentManager().beginTransaction() - .add(R.id.shareForumContainer, contactSelectorFragment) + .add(R.id.shareContainer, contactSelectorFragment) .commit(); } } @@ -46,24 +54,24 @@ public class ShareForumActivity extends BriarActivity implements component.inject(this); } - public void showMessageScreen(GroupId groupId, + void showMessageScreen(GroupId groupId, Collection<ContactId> contacts) { - ShareForumMessageFragment messageFragment = - ShareForumMessageFragment.newInstance(groupId, contacts); + ShareMessageFragment messageFragment = + ShareMessageFragment.newInstance(shareable, groupId, contacts); getSupportFragmentManager().beginTransaction() .setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out, android.R.anim.slide_in_left, android.R.anim.slide_out_right) - .replace(R.id.shareForumContainer, messageFragment, + .replace(R.id.shareContainer, messageFragment, ContactSelectorFragment.TAG) .addToBackStack(null) .commit(); } - public static ArrayList<Integer> getContactsFromIds( + static ArrayList<Integer> getContactsFromIds( Collection<ContactId> contacts) { // transform ContactIds to Integers so they can be added to a bundle @@ -74,13 +82,13 @@ public class ShareForumActivity extends BriarActivity implements return intContacts; } - public void sharingSuccessful(View v) { + void sharingSuccessful(View v) { setResult(RESULT_OK); hideSoftKeyboard(v); supportFinishAfterTransition(); } - protected static Collection<ContactId> getContactsFromIntegers( + static Collection<ContactId> getContactsFromIntegers( ArrayList<Integer> intContacts) { // turn contact integers from a bundle back to ContactIds diff --git a/briar-android/src/org/briarproject/android/forum/ShareForumMessageFragment.java b/briar-android/src/org/briarproject/android/sharing/ShareMessageFragment.java similarity index 61% rename from briar-android/src/org/briarproject/android/forum/ShareForumMessageFragment.java rename to briar-android/src/org/briarproject/android/sharing/ShareMessageFragment.java index e8682a13695e96341100c14c9eb2e2d2e290218d..9e9fcac391b22d6815de505892f45cca9a6d57ed 100644 --- a/briar-android/src/org/briarproject/android/forum/ShareForumMessageFragment.java +++ b/briar-android/src/org/briarproject/android/sharing/ShareMessageFragment.java @@ -1,4 +1,4 @@ -package org.briarproject.android.forum; +package org.briarproject.android.sharing; import android.content.Context; import android.os.Bundle; @@ -14,6 +14,8 @@ import android.widget.Toast; import org.briarproject.R; import org.briarproject.android.ActivityComponent; import org.briarproject.android.fragment.BaseFragment; +import org.briarproject.api.blogs.BlogManager; +import org.briarproject.api.blogs.BlogSharingManager; import org.briarproject.api.contact.ContactId; import org.briarproject.api.db.DbException; import org.briarproject.api.forum.ForumSharingManager; @@ -27,31 +29,40 @@ import javax.inject.Inject; import static android.widget.Toast.LENGTH_SHORT; import static java.util.logging.Level.WARNING; -import static org.briarproject.android.forum.ShareForumActivity.CONTACTS; -import static org.briarproject.android.forum.ShareForumActivity.getContactsFromIds; +import static org.briarproject.android.sharing.ShareActivity.BLOG; +import static org.briarproject.android.sharing.ShareActivity.CONTACTS; +import static org.briarproject.android.sharing.ShareActivity.FORUM; +import static org.briarproject.android.sharing.ShareActivity.SHAREABLE; +import static org.briarproject.android.sharing.ShareActivity.getContactsFromIds; import static org.briarproject.api.sharing.SharingConstants.GROUP_ID; -public class ShareForumMessageFragment extends BaseFragment { +public class ShareMessageFragment extends BaseFragment { public final static String TAG = "IntroductionMessageFragment"; private static final Logger LOG = - Logger.getLogger(ShareForumMessageFragment.class.getName()); + Logger.getLogger(ShareMessageFragment.class.getName()); - private ShareForumActivity shareForumActivity; + private ShareActivity shareActivity; private ViewHolder ui; // Fields that are accessed from background threads must be volatile @Inject protected volatile ForumSharingManager forumSharingManager; + @Inject + protected volatile BlogSharingManager blogSharingManager; private volatile GroupId groupId; + private volatile int shareable; private volatile Collection<ContactId> contacts; - public static ShareForumMessageFragment newInstance(GroupId groupId, Collection<ContactId> contacts) { + public static ShareMessageFragment newInstance(int shareable, + GroupId groupId, Collection<ContactId> contacts) { + Bundle args = new Bundle(); args.putByteArray(GROUP_ID, groupId.getBytes()); + args.putInt(SHAREABLE, shareable); args.putIntegerArrayList(CONTACTS, getContactsFromIds(contacts)); - ShareForumMessageFragment fragment = new ShareForumMessageFragment(); + ShareMessageFragment fragment = new ShareMessageFragment(); fragment.setArguments(args); return fragment; } @@ -60,7 +71,7 @@ public class ShareForumMessageFragment extends BaseFragment { public void onAttach(Context context) { super.onAttach(context); try { - shareForumActivity = (ShareForumActivity) context; + shareActivity = (ShareActivity) context; } catch (ClassCastException e) { throw new InstantiationError( "This fragment is only meant to be attached to the ShareForumActivity"); @@ -71,17 +82,31 @@ public class ShareForumMessageFragment extends BaseFragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + // allow for home button to act as back button + setHasOptionsMenu(true); + + // get groupID, shareable type and contactIDs from fragment arguments + groupId = new GroupId(getArguments().getByteArray(GROUP_ID)); + shareable = getArguments().getInt(SHAREABLE); + ArrayList<Integer> intContacts = + getArguments().getIntegerArrayList(CONTACTS); + if (intContacts == null) throw new IllegalArgumentException(); + contacts = ShareActivity.getContactsFromIntegers(intContacts); + // change toolbar text - ActionBar actionBar = shareForumActivity.getSupportActionBar(); + ActionBar actionBar = shareActivity.getSupportActionBar(); if (actionBar != null) { - actionBar.setTitle(R.string.forum_share_button); + if (shareable == FORUM) { + actionBar.setTitle(R.string.forum_share_button); + } else if (shareable == BLOG) { + actionBar.setTitle(R.string.blogs_sharing_button); + } else { + throw new IllegalArgumentException("Invalid Shareable Type!"); + } } - // allow for home button to act as back button - setHasOptionsMenu(true); - // inflate view - View v = inflater.inflate(R.layout.share_forum_message, container, + View v = inflater.inflate(R.layout.fragment_share_message, container, false); ui = new ViewHolder(v); ui.button.setOnClickListener(new View.OnClickListener() { @@ -90,13 +115,9 @@ public class ShareForumMessageFragment extends BaseFragment { onButtonClick(); } }); - - // get groupID and contactIDs from fragment arguments - groupId = new GroupId(getArguments().getByteArray(GROUP_ID)); - ArrayList<Integer> intContacts = - getArguments().getIntegerArrayList(CONTACTS); - if (intContacts == null) throw new IllegalArgumentException(); - contacts = ShareForumActivity.getContactsFromIntegers(intContacts); + if (shareable == BLOG) { + ui.button.setText(getString(R.string.blogs_sharing_button)); + } return v; } @@ -105,7 +126,7 @@ public class ShareForumMessageFragment extends BaseFragment { public boolean onOptionsItemSelected(final MenuItem item) { switch (item.getItemId()) { case android.R.id.home: - shareForumActivity.onBackPressed(); + shareActivity.onBackPressed(); return true; default: return super.onOptionsItemSelected(item); @@ -122,7 +143,7 @@ public class ShareForumMessageFragment extends BaseFragment { component.inject(this); } - public void onButtonClick() { + private void onButtonClick() { // disable button to prevent accidental double invitations ui.button.setEnabled(false); @@ -130,17 +151,21 @@ public class ShareForumMessageFragment extends BaseFragment { shareForum(msg); // don't wait for the introduction to be made before finishing activity - shareForumActivity.sharingSuccessful(ui.message); + shareActivity.sharingSuccessful(ui.message); } private void shareForum(final String msg) { - shareForumActivity.runOnDbThread(new Runnable() { + listener.runOnDbThread(new Runnable() { @Override public void run() { try { for (ContactId c : contacts) { - forumSharingManager.sendInvitation(groupId, c, - msg); + if (shareable == FORUM) { + forumSharingManager.sendInvitation(groupId, c, + msg); + } else if (shareable == BLOG) { + blogSharingManager.sendInvitation(groupId, c, msg); + } } } catch (DbException e) { sharingError(); @@ -152,11 +177,12 @@ public class ShareForumMessageFragment extends BaseFragment { } private void sharingError() { - shareForumActivity.runOnUiThread(new Runnable() { + shareActivity.runOnUiThread(new Runnable() { @Override public void run() { - Toast.makeText(shareForumActivity, - R.string.introduction_error, LENGTH_SHORT).show(); + int res = R.string.forum_share_error; + if (shareable == BLOG) res = R.string.blogs_sharing_error; + Toast.makeText(shareActivity, res, LENGTH_SHORT).show(); } }); } diff --git a/briar-android/src/org/briarproject/android/forum/ForumSharingStatusActivity.java b/briar-android/src/org/briarproject/android/sharing/SharingStatusActivity.java similarity index 93% rename from briar-android/src/org/briarproject/android/forum/ForumSharingStatusActivity.java rename to briar-android/src/org/briarproject/android/sharing/SharingStatusActivity.java index 5da3d212c0f7262ae3b6fc7f196b19e0fd726ccc..b9c51cbe612fbecdcca240a50d0a8e142dbf65b8 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumSharingStatusActivity.java +++ b/briar-android/src/org/briarproject/android/sharing/SharingStatusActivity.java @@ -1,4 +1,4 @@ -package org.briarproject.android.forum; +package org.briarproject.android.sharing; import android.content.Intent; import android.os.Bundle; @@ -26,11 +26,11 @@ import javax.inject.Inject; import static java.util.logging.Level.WARNING; -public class ForumSharingStatusActivity extends BriarActivity { +public class SharingStatusActivity extends BriarActivity { private GroupId groupId; private BriarRecyclerView sharedByList, sharedWithList; - private ForumSharingStatusAdapter sharedByAdapter, sharedWithAdapter; + private SharingStatusAdapter sharedByAdapter, sharedWithAdapter; // Fields that are accessed from background threads must be volatile @Inject @@ -53,13 +53,13 @@ public class ForumSharingStatusActivity extends BriarActivity { groupId = new GroupId(b); sharedByList = (BriarRecyclerView) findViewById(R.id.sharedByView); - sharedByAdapter = new ForumSharingStatusAdapter(this); + sharedByAdapter = new SharingStatusAdapter(this); sharedByList.setLayoutManager(new LinearLayoutManager(this)); sharedByList.setAdapter(sharedByAdapter); sharedByList.setEmptyText(getString(R.string.nobody)); sharedWithList = (BriarRecyclerView) findViewById(R.id.sharedWithView); - sharedWithAdapter = new ForumSharingStatusAdapter(this); + sharedWithAdapter = new SharingStatusAdapter(this); sharedWithList.setLayoutManager(new LinearLayoutManager(this)); sharedWithList.setAdapter(sharedWithAdapter); sharedWithList.setEmptyText(getString(R.string.nobody)); diff --git a/briar-android/src/org/briarproject/android/forum/ForumSharingStatusAdapter.java b/briar-android/src/org/briarproject/android/sharing/SharingStatusAdapter.java similarity index 72% rename from briar-android/src/org/briarproject/android/forum/ForumSharingStatusAdapter.java rename to briar-android/src/org/briarproject/android/sharing/SharingStatusAdapter.java index 3d52480defda1ae9f1ec473e2a1aa69c623feb48..18f70fe78b7d4ae28b79b4daf4c1824a7f2fba6a 100644 --- a/briar-android/src/org/briarproject/android/forum/ForumSharingStatusAdapter.java +++ b/briar-android/src/org/briarproject/android/sharing/SharingStatusAdapter.java @@ -1,22 +1,18 @@ -package org.briarproject.android.forum; +package org.briarproject.android.sharing; import android.content.Context; -import android.support.v4.content.ContextCompat; -import android.text.format.DateUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ImageView; -import android.widget.TextView; import org.briarproject.R; import org.briarproject.android.contact.BaseContactListAdapter; import org.briarproject.android.contact.ContactListItem; -public class ForumSharingStatusAdapter +class SharingStatusAdapter extends BaseContactListAdapter<BaseContactListAdapter.BaseContactHolder> { - public ForumSharingStatusAdapter(Context context) { + SharingStatusAdapter(Context context) { super(context, null); } diff --git a/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java b/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java index 5632ea994025aecf57cb9ade100a0874764e8774..55066764147e2c49c6a9fce388bf4a3c243097ed 100644 --- a/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java +++ b/briar-core/src/org/briarproject/sharing/BlogSharingManagerImpl.java @@ -12,6 +12,7 @@ import org.briarproject.api.clients.ClientHelper; import org.briarproject.api.clients.MessageQueueManager; import org.briarproject.api.clients.PrivateGroupFactory; import org.briarproject.api.clients.SessionId; +import org.briarproject.api.contact.Contact; import org.briarproject.api.contact.ContactId; import org.briarproject.api.data.BdfDictionary; import org.briarproject.api.data.BdfList; @@ -47,6 +48,8 @@ class BlogSharingManagerImpl extends "bee438b5de0b3a685badc4e49d76e72d" + "21e01c4b569a775112756bdae267a028")); + private final BlogManager blogManager; + private final SFactory sFactory; private final IFactory iFactory; private final ISFactory isFactory; @@ -64,6 +67,7 @@ class BlogSharingManagerImpl extends super(db, messageQueueManager, clientHelper, metadataParser, metadataEncoder, random, privateGroupFactory, clock); + this.blogManager = blogManager; sFactory = new SFactory(authorFactory, blogFactory, blogManager); iFactory = new IFactory(); isFactory = new ISFactory(); @@ -77,6 +81,13 @@ class BlogSharingManagerImpl extends return CLIENT_ID; } + @Override + public boolean canBeShared(GroupId g, Contact c) throws DbException { + Blog b = blogManager.getPersonalBlog(c.getAuthor()); + if (b.getId().equals(g)) return false; + return super.canBeShared(g, c); + } + @Override protected BlogInvitationRequest createInvitationRequest(MessageId id, BlogInvitation msg, ContactId contactId, boolean available, diff --git a/briar-core/src/org/briarproject/sharing/SharingModule.java b/briar-core/src/org/briarproject/sharing/SharingModule.java index 3af07e12925533cfe19898dd00c22178bf23b2ab..a098fa1e143a5843fe097e456c3b622836616800 100644 --- a/briar-core/src/org/briarproject/sharing/SharingModule.java +++ b/briar-core/src/org/briarproject/sharing/SharingModule.java @@ -27,6 +27,8 @@ public class SharingModule { ForumSharingValidator forumSharingValidator; @Inject ForumSharingManager forumSharingManager; + @Inject + BlogSharingManager blogSharingManager; } @Provides