From 4e159bbb1f0e56dc60ebf4ef46fa093a28129be5 Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Wed, 7 Dec 2016 12:07:29 -0200 Subject: [PATCH] Add sharing info to ForumActivity action bar subtitle --- .../briar/android/forum/ForumActivity.java | 28 +++++- .../briar/android/forum/ForumController.java | 8 ++ .../android/forum/ForumControllerImpl.java | 90 ++++++++++++++++--- .../conversation/GroupControllerImpl.java | 7 ++ .../android/threaded/ThreadListActivity.java | 52 ++++++++++- .../threaded/ThreadListController.java | 7 ++ 6 files changed, 179 insertions(+), 13 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java index ad961043d4..bf079bbf08 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumActivity.java @@ -13,14 +13,17 @@ import android.support.v7.widget.LinearLayoutManager; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; +import android.view.View; import android.widget.Toast; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; import org.briarproject.briar.android.controller.handler.UiResultExceptionHandler; +import org.briarproject.briar.android.forum.ForumController.ForumListener; import org.briarproject.briar.android.sharing.ForumSharingStatusActivity; import org.briarproject.briar.android.sharing.ShareForumActivity; import org.briarproject.briar.android.threaded.ThreadItemAdapter; @@ -41,7 +44,8 @@ import static org.briarproject.briar.api.forum.ForumConstants.MAX_FORUM_POST_BOD @MethodsNotNullByDefault @ParametersNotNullByDefault public class ForumActivity extends - ThreadListActivity<Forum, ThreadItemAdapter<ForumItem>, ForumItem, ForumPostHeader> { + ThreadListActivity<Forum, ThreadItemAdapter<ForumItem>, ForumItem, ForumPostHeader> + implements ForumListener { private static final int REQUEST_FORUM_SHARED = 3; @@ -66,6 +70,21 @@ public class ForumActivity extends String groupName = i.getStringExtra(GROUP_NAME); if (groupName != null) setTitle(groupName); else loadNamedGroup(); + + // Open Sharing Status on ActionBar click + View actionBar = findViewById(R.id.action_bar); + if (actionBar != null) { + actionBar.setOnClickListener( + new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent i = new Intent(ForumActivity.this, + ForumSharingStatusActivity.class); + i.putExtra(GROUP_ID, groupId.getBytes()); + startActivity(i); + } + }); + } } @Override @@ -183,4 +202,11 @@ public class ForumActivity extends }); } + @Override + public void onForumLeft(ContactId c) { + sharingController.remove(c); + setToolbarSubTitle(sharingController.getTotalCount(), + sharingController.getOnlineCount()); + } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumController.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumController.java index 8b99ab1741..3d800e241f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumController.java @@ -1,5 +1,8 @@ package org.briarproject.briar.android.forum; +import android.support.annotation.UiThread; + +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.briar.android.threaded.ThreadListController; import org.briarproject.briar.api.forum.Forum; @@ -9,4 +12,9 @@ import org.briarproject.briar.api.forum.ForumPostHeader; interface ForumController extends ThreadListController<Forum, ForumItem, ForumPostHeader> { + interface ForumListener extends ThreadListListener<ForumPostHeader> { + @UiThread + void onForumLeft(ContactId c); + } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumControllerImpl.java index 3b9f91f617..b8df259551 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumControllerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/forum/ForumControllerImpl.java @@ -1,5 +1,7 @@ package org.briarproject.briar.android.forum; +import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.crypto.CryptoExecutor; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; @@ -12,16 +14,21 @@ import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.system.Clock; import org.briarproject.briar.android.controller.handler.ResultExceptionHandler; -import org.briarproject.briar.android.threaded.ThreadListController.ThreadListListener; +import org.briarproject.briar.android.forum.ForumController.ForumListener; import org.briarproject.briar.android.threaded.ThreadListControllerImpl; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.client.MessageTracker.GroupCount; import org.briarproject.briar.api.forum.Forum; +import org.briarproject.briar.api.forum.ForumInvitationResponse; import org.briarproject.briar.api.forum.ForumManager; import org.briarproject.briar.api.forum.ForumPost; import org.briarproject.briar.api.forum.ForumPostHeader; +import org.briarproject.briar.api.forum.ForumSharingManager; +import org.briarproject.briar.api.forum.event.ForumInvitationResponseReceivedEvent; import org.briarproject.briar.api.forum.event.ForumPostReceivedEvent; +import org.briarproject.briar.api.sharing.event.ShareableLeftEvent; +import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -34,23 +41,26 @@ import static java.util.logging.Level.WARNING; @NotNullByDefault class ForumControllerImpl extends - ThreadListControllerImpl<Forum, ForumItem, ForumPostHeader, ForumPost, ThreadListListener<ForumPostHeader>> + ThreadListControllerImpl<Forum, ForumItem, ForumPostHeader, ForumPost, ForumListener> implements ForumController { private static final Logger LOG = Logger.getLogger(ForumControllerImpl.class.getName()); private final ForumManager forumManager; + private final ForumSharingManager forumSharingManager; @Inject ForumControllerImpl(@DatabaseExecutor Executor dbExecutor, LifecycleManager lifecycleManager, IdentityManager identityManager, @CryptoExecutor Executor cryptoExecutor, - ForumManager forumManager, EventBus eventBus, - Clock clock, AndroidNotificationManager notificationManager) { + ForumManager forumManager, ForumSharingManager forumSharingManager, + EventBus eventBus, Clock clock, + AndroidNotificationManager notificationManager) { super(dbExecutor, lifecycleManager, identityManager, cryptoExecutor, eventBus, clock, notificationManager); this.forumManager = forumManager; + this.forumSharingManager = forumSharingManager; } @Override @@ -67,13 +77,22 @@ class ForumControllerImpl extends ForumPostReceivedEvent pe = (ForumPostReceivedEvent) e; if (pe.getGroupId().equals(getGroupId())) { LOG.info("Forum post received, adding..."); - final ForumPostHeader fph = pe.getForumPostHeader(); - listener.runOnUiThreadUnlessDestroyed(new Runnable() { - @Override - public void run() { - listener.onHeaderReceived(fph); - } - }); + onForumPostHeaderReceived(pe.getForumPostHeader()); + } + } else if (e instanceof ForumInvitationResponseReceivedEvent) { + ForumInvitationResponseReceivedEvent f = + (ForumInvitationResponseReceivedEvent) e; + ForumInvitationResponse r = + (ForumInvitationResponse) f.getResponse(); + if (r.getGroupId().equals(getGroupId()) && r.wasAccepted()) { + LOG.info("Forum invitation was accepted"); + onForumInvitationAccepted(r.getContactId()); + } + } else if (e instanceof ShareableLeftEvent) { + ShareableLeftEvent s = (ShareableLeftEvent) e; + if (s.getGroupId().equals(getGroupId())) { + LOG.info("Forum left by contact"); + onForumLeft(s.getContactId()); } } } @@ -98,6 +117,28 @@ class ForumControllerImpl extends forumManager.setReadFlag(getGroupId(), id, true); } + @Override + public void loadSharingContacts( + final ResultExceptionHandler<Collection<ContactId>, DbException> handler) { + runOnDbThread(new Runnable() { + @Override + public void run() { + try { + Collection<Contact> contacts = + forumSharingManager.getSharedWith(getGroupId()); + Collection<ContactId> contactIds = + new ArrayList<>(contacts.size()); + for (Contact c : contacts) contactIds.add(c.getId()); + handler.onResult(contactIds); + } catch (DbException e) { + if (LOG.isLoggable(WARNING)) + LOG.log(WARNING, e.toString(), e); + handler.onException(e); + } + } + }); + } + @Override public void createAndStoreMessage(final String body, @Nullable final ForumItem parentItem, @@ -153,4 +194,31 @@ class ForumControllerImpl extends return new ForumItem(header, body); } + private void onForumPostHeaderReceived(final ForumPostHeader h) { + listener.runOnUiThreadUnlessDestroyed(new Runnable() { + @Override + public void run() { + listener.onHeaderReceived(h); + } + }); + } + + private void onForumInvitationAccepted(final ContactId c) { + listener.runOnUiThreadUnlessDestroyed(new Runnable() { + @Override + public void run() { + listener.onInvitationAccepted(c); + } + }); + } + + private void onForumLeft(final ContactId c) { + listener.runOnUiThreadUnlessDestroyed(new Runnable() { + @Override + public void run() { + listener.onForumLeft(c); + } + }); + } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java index 431c66a59b..a34e0365ea 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/privategroup/conversation/GroupControllerImpl.java @@ -1,5 +1,6 @@ package org.briarproject.briar.android.privategroup.conversation; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.crypto.CryptoExecutor; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; @@ -134,6 +135,12 @@ class GroupControllerImpl extends privateGroupManager.setReadFlag(getGroupId(), id, true); } + @Override + public void loadSharingContacts( + ResultExceptionHandler<Collection<ContactId>, DbException> handler) { + // TODO + } + @Override public void createAndStoreMessage(final String body, @Nullable final GroupMessageItem parentItem, diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java index 2c2d20793f..b1d937dda5 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListActivity.java @@ -8,10 +8,12 @@ import android.support.annotation.StringRes; import android.support.annotation.UiThread; import android.support.design.widget.Snackbar; import android.support.v4.content.ContextCompat; +import android.support.v7.app.ActionBar; import android.support.v7.widget.LinearLayoutManager; import android.view.MenuItem; import android.view.View; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; @@ -20,6 +22,8 @@ import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.util.StringUtils; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.BriarActivity; +import org.briarproject.briar.android.controller.SharingController; +import org.briarproject.briar.android.controller.SharingController.SharingListener; import org.briarproject.briar.android.controller.handler.UiResultExceptionHandler; import org.briarproject.briar.android.threaded.ThreadItemAdapter.ThreadItemListener; import org.briarproject.briar.android.threaded.ThreadListController.ThreadListListener; @@ -33,6 +37,7 @@ import java.util.Collection; import java.util.logging.Logger; import javax.annotation.Nullable; +import javax.inject.Inject; import static android.support.design.widget.Snackbar.make; import static android.view.View.GONE; @@ -42,7 +47,7 @@ import static android.view.View.VISIBLE; @ParametersNotNullByDefault public abstract class ThreadListActivity<G extends NamedGroup, A extends ThreadItemAdapter<I>, I extends ThreadItem, H extends PostHeader> extends BriarActivity - implements ThreadListListener<H>, TextInputListener, + implements ThreadListListener<H>, TextInputListener, SharingListener, ThreadItemListener<I> { protected static final String KEY_INPUT_VISIBILITY = "inputVisibility"; @@ -58,6 +63,8 @@ public abstract class ThreadListActivity<G extends NamedGroup, A extends ThreadI private MessageId replyId; protected abstract ThreadListController<G, I, H> getController(); + @Inject + protected SharingController sharingController; @CallSuper @Override @@ -88,6 +95,8 @@ public abstract class ThreadListActivity<G extends NamedGroup, A extends ThreadI } loadItems(); + sharingController.setSharingListener(this); + loadSharingContacts(); } @LayoutRes @@ -144,10 +153,30 @@ public abstract class ThreadListActivity<G extends NamedGroup, A extends ThreadI }); } + protected void loadSharingContacts() { + getController().loadSharingContacts( + new UiResultExceptionHandler<Collection<ContactId>, DbException>( + this) { + @Override + public void onResultUi(Collection<ContactId> contacts) { + sharingController.addAll(contacts); + int online = sharingController.getOnlineCount(); + setToolbarSubTitle(contacts.size(), online); + } + + @Override + public void onExceptionUi(DbException e) { + // TODO Proper error handling + finish(); + } + }); + } + @CallSuper @Override public void onStart() { super.onStart(); + sharingController.onStart(); list.startPeriodicUpdate(); } @@ -155,6 +184,7 @@ public abstract class ThreadListActivity<G extends NamedGroup, A extends ThreadI @Override public void onStop() { super.onStop(); + sharingController.onStop(); list.stopPeriodicUpdate(); } @@ -210,6 +240,26 @@ public abstract class ThreadListActivity<G extends NamedGroup, A extends ThreadI showTextInput(item); } + @Override + public void onSharingInfoUpdated(int total, int online) { + setToolbarSubTitle(total, online); + } + + @Override + public void onInvitationAccepted(ContactId c) { + sharingController.add(c); + setToolbarSubTitle(sharingController.getTotalCount(), + sharingController.getOnlineCount()); + } + + protected void setToolbarSubTitle(int total, int online) { + ActionBar actionBar = getSupportActionBar(); + if (actionBar != null) { + actionBar.setSubtitle( + getString(R.string.shared_with, total, online)); + } + } + protected void displaySnackbarShort(@StringRes int stringId) { Snackbar snackbar = make(list, stringId, Snackbar.LENGTH_SHORT); snackbar.getView().setBackgroundResource(R.color.briar_primary); diff --git a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListController.java b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListController.java index 942a61d680..caebd1ec65 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/threaded/ThreadListController.java @@ -2,6 +2,7 @@ package org.briarproject.briar.android.threaded; import android.support.annotation.UiThread; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.nullsafety.NotNullByDefault; import org.briarproject.bramble.api.sync.GroupId; @@ -24,6 +25,9 @@ public interface ThreadListController<G extends NamedGroup, I extends ThreadItem void loadNamedGroup(ResultExceptionHandler<G, DbException> handler); + void loadSharingContacts( + ResultExceptionHandler<Collection<ContactId>, DbException> handler); + void loadItem(H header, ResultExceptionHandler<I, DbException> handler); void loadItems(ResultExceptionHandler<Collection<I>, DbException> handler); @@ -43,6 +47,9 @@ public interface ThreadListController<G extends NamedGroup, I extends ThreadItem @UiThread void onGroupRemoved(); + + @UiThread + void onInvitationAccepted(ContactId c); } } -- GitLab