diff --git a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java index e0d4f31cc..b8db5726f 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/AppModule.java @@ -86,7 +86,7 @@ import static org.briarproject.briar.android.TestingConstants.IS_DEBUG_BUILD; ContactListModule.class, IntroductionModule.class, // below need to be within same scope as ViewModelProvider.Factory - BlogModule.BindsModule.class, + BlogModule.class, ForumModule.class, GroupListModule.class, GroupConversationModule.class, diff --git a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java index 3b1e91ef9..e0f0ce09b 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/activity/ActivityComponent.java @@ -11,7 +11,6 @@ import org.briarproject.briar.android.account.SetupActivity; import org.briarproject.briar.android.account.UnlockActivity; import org.briarproject.briar.android.blog.BlogActivity; import org.briarproject.briar.android.blog.BlogFragment; -import org.briarproject.briar.android.blog.BlogModule; import org.briarproject.briar.android.blog.BlogPostFragment; import org.briarproject.briar.android.blog.FeedFragment; import org.briarproject.briar.android.blog.FeedPostFragment; @@ -85,7 +84,6 @@ import dagger.Component; @ActivityScope @Component(modules = { ActivityModule.class, - BlogModule.class, CreateGroupModule.class, GroupInvitationModule.class, GroupMemberModule.class, diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogActivity.java index bbe9b6961..be7b9b9ba 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogActivity.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogActivity.java @@ -18,6 +18,8 @@ import javax.inject.Inject; import androidx.appcompat.widget.Toolbar; import androidx.lifecycle.ViewModelProvider; +import static java.util.Objects.requireNonNull; + @MethodsNotNullByDefault @ParametersNotNullByDefault public class BlogActivity extends BriarActivity @@ -25,8 +27,6 @@ public class BlogActivity extends BriarActivity @Inject ViewModelProvider.Factory viewModelFactory; - @Inject - BlogController blogController; private BlogViewModel viewModel; @@ -43,28 +43,36 @@ public class BlogActivity extends BriarActivity // GroupId from Intent Intent i = getIntent(); - byte[] b = i.getByteArrayExtra(GROUP_ID); - if (b == null) throw new IllegalStateException("No group ID in intent"); - GroupId groupId = new GroupId(b); - blogController.setGroupId(groupId); + GroupId groupId = + new GroupId(requireNonNull(i.getByteArrayExtra(GROUP_ID))); viewModel.setGroupId(groupId); setContentView(R.layout.activity_fragment_container_toolbar); Toolbar toolbar = setUpCustomToolbar(false); // Open Sharing Status on Toolbar click - if (toolbar != null) { - toolbar.setOnClickListener(v -> { - Intent i1 = new Intent(BlogActivity.this, - BlogSharingStatusActivity.class); - i1.putExtra(GROUP_ID, groupId.getBytes()); - startActivity(i1); - }); - } + toolbar.setOnClickListener(v -> { + Intent i1 = new Intent(BlogActivity.this, + BlogSharingStatusActivity.class); + i1.putExtra(GROUP_ID, groupId.getBytes()); + startActivity(i1); + }); + + viewModel.getBlog().observe(this, blog -> + setTitle(blog.getBlog().getAuthor().getName()) + ); + viewModel.getSharingInfo().observe(this, info -> + setToolbarSubTitle(info.total, info.online) + ); if (state == null) { showInitialFragment(BlogFragment.newInstance(groupId)); } } + private void setToolbarSubTitle(int total, int online) { + requireNonNull(getSupportActionBar()) + .setSubtitle(getString(R.string.shared_with, total, online)); + } + } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogController.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogController.java deleted file mode 100644 index 5ce9df167..000000000 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogController.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.briarproject.briar.android.blog; - -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; -import org.briarproject.briar.android.controller.handler.ResultExceptionHandler; - -import java.util.Collection; - -@NotNullByDefault -public interface BlogController { - - void setGroupId(GroupId g); - - void loadSharingContacts( - ResultExceptionHandler, DbException> handler); - -} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogControllerImpl.java deleted file mode 100644 index 10f59ab8b..000000000 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogControllerImpl.java +++ /dev/null @@ -1,101 +0,0 @@ -package org.briarproject.briar.android.blog; - -import android.app.Activity; - -import org.briarproject.bramble.api.contact.Contact; -import org.briarproject.bramble.api.contact.ContactId; -import org.briarproject.bramble.api.db.DatabaseExecutor; -import org.briarproject.bramble.api.db.DbException; -import org.briarproject.bramble.api.event.Event; -import org.briarproject.bramble.api.event.EventBus; -import org.briarproject.bramble.api.event.EventListener; -import org.briarproject.bramble.api.identity.IdentityManager; -import org.briarproject.bramble.api.lifecycle.LifecycleManager; -import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; -import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; -import org.briarproject.bramble.api.sync.GroupId; -import org.briarproject.briar.android.controller.ActivityLifecycleController; -import org.briarproject.briar.android.controller.handler.ResultExceptionHandler; -import org.briarproject.briar.api.android.AndroidNotificationManager; -import org.briarproject.briar.api.blog.BlogManager; -import org.briarproject.briar.api.blog.BlogSharingManager; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.concurrent.Executor; -import java.util.logging.Logger; - -import javax.inject.Inject; - -import static java.util.logging.Level.WARNING; -import static org.briarproject.bramble.util.LogUtils.logException; - -@MethodsNotNullByDefault -@ParametersNotNullByDefault -class BlogControllerImpl extends BaseControllerImpl - implements ActivityLifecycleController, BlogController, EventListener { - - private static final Logger LOG = - Logger.getLogger(BlogControllerImpl.class.getName()); - - private final BlogSharingManager blogSharingManager; - - private volatile GroupId groupId = null; - - @Inject - BlogControllerImpl(@DatabaseExecutor Executor dbExecutor, - LifecycleManager lifecycleManager, EventBus eventBus, - AndroidNotificationManager notificationManager, - IdentityManager identityManager, BlogManager blogManager, - BlogSharingManager blogSharingManager) { - super(dbExecutor, lifecycleManager, eventBus, notificationManager, - identityManager, blogManager); - this.blogSharingManager = blogSharingManager; - } - - @Override - public void onActivityCreate(Activity activity) { - } - - @Override - public void onActivityStart() { - } - - @Override - public void onActivityStop() { - } - - @Override - public void onActivityDestroy() { - } - - @Override - public void setGroupId(GroupId g) { - groupId = g; - } - - @Override - public void eventOccurred(Event e) { - - } - - @Override - public void loadSharingContacts( - ResultExceptionHandler, DbException> handler) { - if (groupId == null) throw new IllegalStateException(); - runOnDbThread(() -> { - try { - Collection contacts = - blogSharingManager.getSharedWith(groupId); - Collection contactIds = - new ArrayList<>(contacts.size()); - for (Contact c : contacts) contactIds.add(c.getId()); - handler.onResult(contactIds); - } catch (DbException e) { - logException(LOG, WARNING, e); - handler.onException(e); - } - }); - } - -} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java index 2ab3bfc12..c8f27d41e 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogFragment.java @@ -11,17 +11,11 @@ import android.view.View; import android.view.ViewGroup; import android.widget.Toast; -import org.briarproject.bramble.api.contact.ContactId; -import org.briarproject.bramble.api.db.DbException; -import org.briarproject.bramble.api.identity.Author; import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.briar.R; import org.briarproject.briar.android.activity.ActivityComponent; -import org.briarproject.briar.android.activity.BriarActivity; -import org.briarproject.briar.android.controller.SharingController; -import org.briarproject.briar.android.controller.handler.UiResultExceptionHandler; import org.briarproject.briar.android.fragment.BaseFragment; import org.briarproject.briar.android.sharing.BlogSharingStatusActivity; import org.briarproject.briar.android.sharing.ShareBlogActivity; @@ -29,14 +23,12 @@ import org.briarproject.briar.android.util.BriarSnackbarBuilder; import org.briarproject.briar.android.view.BriarRecyclerView; import org.briarproject.briar.android.widget.LinkDialogFragment; -import java.util.Collection; import java.util.List; import javax.inject.Inject; import androidx.annotation.Nullable; import androidx.annotation.UiThread; -import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.AlertDialog; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; @@ -49,22 +41,17 @@ import static com.google.android.material.snackbar.Snackbar.LENGTH_LONG; import static org.briarproject.briar.android.activity.BriarActivity.GROUP_ID; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_SHARE_BLOG; import static org.briarproject.briar.android.activity.RequestCodes.REQUEST_WRITE_BLOG_POST; -import static org.briarproject.briar.android.controller.SharingController.SharingListener; @UiThread @MethodsNotNullByDefault @ParametersNotNullByDefault public class BlogFragment extends BaseFragment - implements SharingListener, OnBlogPostClickListener { + implements OnBlogPostClickListener { private final static String TAG = BlogFragment.class.getName(); @Inject ViewModelProvider.Factory viewModelFactory; - @Inject - BlogController blogController; - @Inject - SharingController sharingController; @Nullable private Parcelable layoutManagerState; @@ -89,7 +76,6 @@ public class BlogFragment extends BaseFragment component.inject(this); viewModel = new ViewModelProvider(requireActivity(), viewModelFactory) .get(BlogViewModel.class); - sharingController.setSharingListener(this); } @Nullable @@ -132,8 +118,6 @@ public class BlogFragment extends BaseFragment super.onStart(); viewModel.blockNotifications(); viewModel.clearBlogPostNotifications(); - sharingController.onStart(); - loadSharedContacts(); list.startPeriodicUpdate(); } @@ -141,16 +125,9 @@ public class BlogFragment extends BaseFragment public void onStop() { super.onStop(); viewModel.unblockNotifications(); - sharingController.onStop(); list.stopPeriodicUpdate(); } - @Override - public void onDestroy() { - super.onDestroy(); - sharingController.unsetSharingListener(this); - } - @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); @@ -166,7 +143,6 @@ public class BlogFragment extends BaseFragment MenuItem writeButton = menu.findItem(R.id.action_write_blog_post); MenuItem deleteButton = menu.findItem(R.id.action_blog_delete); viewModel.getBlog().observe(getViewLifecycleOwner(), blog -> { - setToolbarTitle(blog.getBlog().getAuthor()); if (blog.isOurs()) writeButton.setVisible(true); if (blog.canBeRemoved()) deleteButton.setEnabled(true); }); @@ -265,42 +241,6 @@ public class BlogFragment extends BaseFragment f.show(getParentFragmentManager(), f.getUniqueTag()); } - private void setToolbarTitle(Author a) { - requireActivity().setTitle(a.getName()); - } - - private void loadSharedContacts() { - blogController.loadSharingContacts( - new UiResultExceptionHandler, - DbException>(this) { - @Override - public void onResultUi(Collection contacts) { - sharingController.addAll(contacts); - int online = sharingController.getOnlineCount(); - setToolbarSubTitle(contacts.size(), online); - } - - @Override - public void onExceptionUi(DbException exception) { - handleException(exception); - } - }); - } - - @Override - public void onSharingInfoUpdated(int total, int online) { - setToolbarSubTitle(total, online); - } - - private void setToolbarSubTitle(int total, int online) { - ActionBar actionBar = - ((BriarActivity) requireActivity()).getSupportActionBar(); - if (actionBar != null) { - actionBar.setSubtitle( - getString(R.string.shared_with, total, online)); - } - } - private void displaySnackbar(int stringId, boolean scroll) { BriarSnackbarBuilder sb = new BriarSnackbarBuilder(); if (scroll) { diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogModule.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogModule.java index a6cf55036..5eafcb2eb 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogModule.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogModule.java @@ -1,46 +1,23 @@ package org.briarproject.briar.android.blog; -import org.briarproject.briar.android.activity.ActivityScope; -import org.briarproject.briar.android.activity.BaseActivity; -import org.briarproject.briar.android.controller.SharingController; -import org.briarproject.briar.android.controller.SharingControllerImpl; import org.briarproject.briar.android.viewmodel.ViewModelKey; import androidx.lifecycle.ViewModel; import dagger.Binds; import dagger.Module; -import dagger.Provides; import dagger.multibindings.IntoMap; @Module -public class BlogModule { +public interface BlogModule { - @Module - public abstract static class BindsModule { - @Binds - @IntoMap - @ViewModelKey(FeedViewModel.class) - abstract ViewModel bindFeedViewModel(FeedViewModel feedViewModel); + @Binds + @IntoMap + @ViewModelKey(FeedViewModel.class) + abstract ViewModel bindFeedViewModel(FeedViewModel feedViewModel); - @Binds - @IntoMap - @ViewModelKey(BlogViewModel.class) - abstract ViewModel bindBlogViewModel(BlogViewModel blogViewModel); - } - - @ActivityScope - @Provides - BlogController provideBlogController(BaseActivity activity, - BlogControllerImpl blogController) { - activity.addLifecycleController(blogController); - return blogController; - } - - @ActivityScope - @Provides - SharingController provideSharingController( - SharingControllerImpl sharingController) { - return sharingController; - } + @Binds + @IntoMap + @ViewModelKey(BlogViewModel.class) + abstract ViewModel bindBlogViewModel(BlogViewModel blogViewModel); } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostFragment.java index 7e201577c..114e73fe8 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostFragment.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostFragment.java @@ -25,8 +25,6 @@ public class BlogPostFragment extends BasePostFragment { @Inject ViewModelProvider.Factory viewModelFactory; - @Inject - BlogController blogController; private BlogViewModel viewModel; diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogViewModel.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogViewModel.java index 0d8e6d5c0..88e84e905 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogViewModel.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogViewModel.java @@ -2,6 +2,8 @@ package org.briarproject.briar.android.blog; import android.app.Application; +import org.briarproject.bramble.api.contact.Contact; +import org.briarproject.bramble.api.contact.ContactId; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.TransactionManager; @@ -10,20 +12,26 @@ import org.briarproject.bramble.api.event.EventBus; import org.briarproject.bramble.api.identity.IdentityManager; import org.briarproject.bramble.api.identity.LocalAuthor; import org.briarproject.bramble.api.lifecycle.LifecycleManager; -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; +import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault; +import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault; import org.briarproject.bramble.api.sync.GroupId; import org.briarproject.bramble.api.sync.MessageId; import org.briarproject.bramble.api.sync.event.GroupRemovedEvent; import org.briarproject.bramble.api.system.AndroidExecutor; +import org.briarproject.briar.android.sharing.SharingController; +import org.briarproject.briar.android.sharing.SharingController.SharingInfo; import org.briarproject.briar.android.viewmodel.LiveResult; import org.briarproject.briar.api.android.AndroidNotificationManager; import org.briarproject.briar.api.blog.Blog; import org.briarproject.briar.api.blog.BlogInvitationResponse; import org.briarproject.briar.api.blog.BlogManager; +import org.briarproject.briar.api.blog.BlogSharingManager; import org.briarproject.briar.api.blog.event.BlogInvitationResponseReceivedEvent; import org.briarproject.briar.api.blog.event.BlogPostAddedEvent; import org.briarproject.briar.api.sharing.event.ContactLeftShareableEvent; +import java.util.ArrayList; +import java.util.Collection; import java.util.concurrent.Executor; import java.util.logging.Logger; @@ -38,13 +46,16 @@ import static org.briarproject.bramble.util.LogUtils.logDuration; import static org.briarproject.bramble.util.LogUtils.logException; import static org.briarproject.bramble.util.LogUtils.now; -@NotNullByDefault +@MethodsNotNullByDefault +@ParametersNotNullByDefault class BlogViewModel extends BaseViewModel { private static final Logger LOG = getLogger(BlogViewModel.class.getName()); - // implicitly non-null - private volatile GroupId groupId = null; + private final BlogSharingManager blogSharingManager; + private final SharingController sharingController; + + private volatile GroupId groupId; private final MutableLiveData blog = new MutableLiveData<>(); private final MutableLiveData blogRemoved = @@ -59,9 +70,13 @@ class BlogViewModel extends BaseViewModel { EventBus eventBus, IdentityManager identityManager, AndroidNotificationManager notificationManager, - BlogManager blogManager) { + BlogManager blogManager, + BlogSharingManager blogSharingManager, + SharingController sharingController) { super(application, dbExecutor, lifecycleManager, db, androidExecutor, eventBus, identityManager, notificationManager, blogManager); + this.blogSharingManager = blogSharingManager; + this.sharingController = sharingController; } @Override @@ -78,17 +93,13 @@ class BlogViewModel extends BaseViewModel { BlogInvitationResponse r = b.getMessageHeader(); if (r.getShareableId().equals(groupId) && r.wasAccepted()) { LOG.info("Blog invitation accepted"); - // TODO -// onBlogInvitationAccepted(b.getContactId()); -// sharingController.add(c); + sharingController.add(b.getContactId()); } } else if (e instanceof ContactLeftShareableEvent) { ContactLeftShareableEvent s = (ContactLeftShareableEvent) e; if (s.getGroupId().equals(groupId)) { LOG.info("Blog left by contact"); - // TODO -// onBlogLeft(s.getContactId()); -// sharingController.remove(c); + sharingController.remove(s.getContactId()); } } else if (e instanceof GroupRemovedEvent) { GroupRemovedEvent g = (GroupRemovedEvent) e; @@ -106,6 +117,7 @@ class BlogViewModel extends BaseViewModel { this.groupId = groupId; loadBlog(groupId); loadBlogPosts(groupId); + loadSharingContacts(groupId); } private void loadBlog(GroupId groupId) { @@ -140,6 +152,21 @@ class BlogViewModel extends BaseViewModel { loadList(txn -> loadBlogPosts(txn, groupId), this::updateBlogPosts); } + private void loadSharingContacts(GroupId groupId) { + runOnDbThread(() -> { + try { + Collection contacts = + blogSharingManager.getSharedWith(groupId); + Collection contactIds = + new ArrayList<>(contacts.size()); + for (Contact c : contacts) contactIds.add(c.getId()); + sharingController.addAll(contactIds); + } catch (DbException e) { + logException(LOG, WARNING, e); + } + }); + } + void deleteBlog() { runOnDbThread(() -> { try { @@ -165,4 +192,7 @@ class BlogViewModel extends BaseViewModel { return blogRemoved; } + LiveData getSharingInfo() { + return sharingController.getSharingInfo(); + } } diff --git a/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingController.java b/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingController.java deleted file mode 100644 index 3ebe7024f..000000000 --- a/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingController.java +++ /dev/null @@ -1,77 +0,0 @@ -package org.briarproject.briar.android.controller; - -import org.briarproject.bramble.api.contact.ContactId; -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; - -import java.util.Collection; - -import androidx.annotation.UiThread; - -@Deprecated -@NotNullByDefault -public interface SharingController { - - /** - * Sets the listener that is called when contacts go on or offline. - */ - @UiThread - void setSharingListener(SharingListener listener); - - /** - * Unsets the listener. - */ - @UiThread - void unsetSharingListener(SharingListener listener); - - /** - * Call this when your lifecycle starts, - * so the listener will be called when information changes. - */ - @UiThread - void onStart(); - - /** - * Call this when your lifecycle stops, - * so that the controller knows it can stops listening to events. - */ - @UiThread - void onStop(); - - /** - * Adds one contact to be tracked. - */ - @UiThread - void add(ContactId c); - - /** - * Adds a collection of contacts to be tracked. - */ - @UiThread - void addAll(Collection contacts); - - /** - * Call this when the contact identified by c is no longer sharing - * the given group identified by GroupId g. - */ - @UiThread - void remove(ContactId c); - - /** - * Returns the number of online contacts. - */ - @UiThread - int getOnlineCount(); - - /** - * Returns the total number of contacts that have been added. - */ - @UiThread - int getTotalCount(); - - interface SharingListener { - - @UiThread - void onSharingInfoUpdated(int total, int online); - } - -} diff --git a/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java deleted file mode 100644 index b49eb6aa8..000000000 --- a/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.briarproject.briar.android.controller; - -import org.briarproject.bramble.api.connection.ConnectionRegistry; -import org.briarproject.bramble.api.contact.ContactId; -import org.briarproject.bramble.api.event.Event; -import org.briarproject.bramble.api.event.EventBus; -import org.briarproject.bramble.api.event.EventListener; -import org.briarproject.bramble.api.nullsafety.NotNullByDefault; -import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent; -import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Set; - -import javax.annotation.Nullable; -import javax.inject.Inject; - -import androidx.annotation.UiThread; - -@Deprecated -@NotNullByDefault -public class SharingControllerImpl implements SharingController, EventListener { - - private final EventBus eventBus; - private final ConnectionRegistry connectionRegistry; - - // UI thread - private final Set contacts = new HashSet<>(); - - // UI thread - @Nullable - private SharingListener listener; - - @Inject - SharingControllerImpl(EventBus eventBus, - ConnectionRegistry connectionRegistry) { - this.eventBus = eventBus; - this.connectionRegistry = connectionRegistry; - } - - @Override - public void setSharingListener(SharingListener listener) { - this.listener = listener; - } - - @Override - public void unsetSharingListener(SharingListener listener) { - if (this.listener == listener) this.listener = null; - } - - @Override - public void onStart() { - eventBus.addListener(this); - } - - @Override - public void onStop() { - eventBus.removeListener(this); - } - - @Override - public void eventOccurred(Event e) { - if (e instanceof ContactConnectedEvent) { - setConnected(((ContactConnectedEvent) e).getContactId()); - } else if (e instanceof ContactDisconnectedEvent) { - setConnected(((ContactDisconnectedEvent) e).getContactId()); - } - } - - @UiThread - private void setConnected(ContactId c) { - if (listener == null) throw new IllegalStateException(); - if (contacts.contains(c)) { - int online = getOnlineCount(); - listener.onSharingInfoUpdated(contacts.size(), online); - } - } - - @Override - public void addAll(Collection c) { - contacts.addAll(c); - } - - @Override - public void add(ContactId c) { - contacts.add(c); - } - - @Override - public void remove(ContactId c) { - contacts.remove(c); - } - - @Override - public int getOnlineCount() { - int online = 0; - for (ContactId c : contacts) { - if (connectionRegistry.isConnected(c)) online++; - } - return online; - } - - @Override - public int getTotalCount() { - return contacts.size(); - } - -}