From bd1f3fc2bd38d6d9574b5b2454fd593de74eb346 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Thu, 13 Oct 2016 10:04:00 -0300
Subject: [PATCH] Make ContactSelectorFragment reusable

---
 ...ions.xml => contact_selection_actions.xml} |  4 +--
 briar-android/res/values-de/strings.xml       |  2 +-
 briar-android/res/values-es/strings.xml       |  2 +-
 briar-android/res/values-it/strings.xml       |  2 +-
 briar-android/res/values-pt-rBR/strings.xml   |  2 +-
 briar-android/res/values/strings.xml          |  2 +-
 .../sharing/ContactSelectorFragment.java      | 25 ++++++++-----------
 .../sharing/ContactSelectorListener.java      | 25 +++++++++++++++++++
 .../android/sharing/ShareActivity.java        | 14 ++++++++---
 .../android/sharing/ShareBlogActivity.java    |  2 +-
 .../android/sharing/ShareForumActivity.java   |  2 +-
 11 files changed, 55 insertions(+), 27 deletions(-)
 rename briar-android/res/menu/{forum_share_actions.xml => contact_selection_actions.xml} (73%)
 create mode 100644 briar-android/src/org/briarproject/android/sharing/ContactSelectorListener.java

diff --git a/briar-android/res/menu/forum_share_actions.xml b/briar-android/res/menu/contact_selection_actions.xml
similarity index 73%
rename from briar-android/res/menu/forum_share_actions.xml
rename to briar-android/res/menu/contact_selection_actions.xml
index a3d6c15477..fbef25059b 100644
--- a/briar-android/res/menu/forum_share_actions.xml
+++ b/briar-android/res/menu/contact_selection_actions.xml
@@ -4,9 +4,9 @@
 	xmlns:app="http://schemas.android.com/apk/res-auto">
 
 	<item
-		android:id="@+id/action_share_forum"
+		android:id="@+id/action_contacts_selected"
 		android:icon="@drawable/ic_check_white"
-		android:title="@string/forum_share_action"
+		android:title="@string/contacts_selected"
 		app:showAsAction="always"/>
 
 </menu>
\ No newline at end of file
diff --git a/briar-android/res/values-de/strings.xml b/briar-android/res/values-de/strings.xml
index 2967f16b19..e3f4537551 100644
--- a/briar-android/res/values-de/strings.xml
+++ b/briar-android/res/values-de/strings.xml
@@ -171,7 +171,7 @@
   <string name="forum_left_toast">Forum wurde verlassen</string>
   <!--Forum Sharing-->
   <string name="forum_share_button">Forum teilen</string>
-  <string name="forum_share_action">Teile dieses Forum mit den gewählten Kontakten</string>
+  <string name="contacts_selected">Teile dieses Forum mit den gewählten Kontakten</string>
   <string name="activity_share_toolbar_header">Kontakte auswählen</string>
   <string name="no_contacts_selector">Du scheinst hier neu zu sein und noch keine Kontakte zu haben.\n\nBitte komm zurück, wenn du deinen ersten Kontakt hinzugefügt hast.</string>
   <string name="forum_shared_snackbar">Forum mit gewählten Kontakten geteilt</string>
diff --git a/briar-android/res/values-es/strings.xml b/briar-android/res/values-es/strings.xml
index 521fbd9f86..63135b3bf9 100644
--- a/briar-android/res/values-es/strings.xml
+++ b/briar-android/res/values-es/strings.xml
@@ -159,7 +159,7 @@
   <string name="forum_left_toast">Foro abandonado</string>
   <!--Forum Sharing-->
   <string name="forum_share_button">Compartir foro</string>
-  <string name="forum_share_action">Compartir este foro con los contactos seleccionados</string>
+  <string name="contacts_selected">Compartir este foro con los contactos seleccionados</string>
   <string name="activity_share_toolbar_header">Elige contactos</string>
   <string name="no_contacts_selector">Parece que eres nuevo aquí y no tienes contactos aún.\n\nPor favor, vuelve cuando hayas añadido tu primer contacto.</string>
   <string name="forum_shared_snackbar">Foro compartido con los contactos seleccionados</string>
diff --git a/briar-android/res/values-it/strings.xml b/briar-android/res/values-it/strings.xml
index 28a764499d..e7b7a678f8 100644
--- a/briar-android/res/values-it/strings.xml
+++ b/briar-android/res/values-it/strings.xml
@@ -136,7 +136,7 @@
   <string name="forum_left_toast">Forum lasciato</string>
   <!--Forum Sharing-->
   <string name="forum_share_button">Condividi Forum</string>
-  <string name="forum_share_action">Condividi questo forum con i contatti scelti</string>
+  <string name="contacts_selected">Condividi questo forum con i contatti scelti</string>
   <string name="activity_share_toolbar_header">Scegli Contatti</string>
   <string name="forum_shared_snackbar">Forum condiviso con i contatti scelti</string>
   <string name="forum_share_error">C\'è stato un errore nella condivisione di questo forum.</string>
diff --git a/briar-android/res/values-pt-rBR/strings.xml b/briar-android/res/values-pt-rBR/strings.xml
index 4fd4eb8c7b..75d4cc14b4 100644
--- a/briar-android/res/values-pt-rBR/strings.xml
+++ b/briar-android/res/values-pt-rBR/strings.xml
@@ -171,7 +171,7 @@ Se sentido sozinho aqui? Compartilhe esse fórum com seus contatos!</string>
   <string name="forum_left_toast">Saiu do fórum</string>
   <!--Forum Sharing-->
   <string name="forum_share_button">Compartilhar fórum</string>
-  <string name="forum_share_action">Compartilhar este fórum com os contatos escolhidos</string>
+  <string name="contacts_selected">Compartilhar este fórum com os contatos escolhidos</string>
   <string name="activity_share_toolbar_header">Escolher contatos</string>
   <string name="no_contacts_selector">Parece que você é novo aqui e não tem nenhum contato ainda.
 Por favor volte aqui depois de adicionar um contato.</string>
diff --git a/briar-android/res/values/strings.xml b/briar-android/res/values/strings.xml
index b1652f5fb7..004c001290 100644
--- a/briar-android/res/values/strings.xml
+++ b/briar-android/res/values/strings.xml
@@ -195,7 +195,7 @@
 
 	<!-- Forum Sharing -->
 	<string name="forum_share_button">Share Forum</string>
-	<string name="forum_share_action">Share this forum with chosen contacts</string>
+	<string name="contacts_selected">Contacts selected</string>
 	<string name="activity_share_toolbar_header">Choose Contacts</string>
 	<string name="no_contacts_selector">It seems that you are new here and have no contacts yet.\n\nPlease come back here after you added your first contact.</string>
 	<string name="forum_shared_snackbar">Forum shared with chosen contacts</string>
diff --git a/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java
index 82db75adf1..b496bcdebb 100644
--- a/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java
+++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java
@@ -23,7 +23,6 @@ import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.contact.ContactManager;
 import org.briarproject.api.db.DbException;
-import org.briarproject.api.forum.ForumSharingManager;
 import org.briarproject.api.identity.IdentityManager;
 import org.briarproject.api.identity.LocalAuthor;
 import org.briarproject.api.sync.GroupId;
@@ -48,7 +47,6 @@ public class ContactSelectorFragment extends BaseFragment implements
 	public static final String TAG = ContactSelectorFragment.class.getName();
 	private static final Logger LOG = Logger.getLogger(TAG);
 
-	private ShareActivity shareActivity;
 	private Menu menu;
 	private BriarRecyclerView list;
 	private ContactSelectorAdapter adapter;
@@ -59,13 +57,11 @@ public class ContactSelectorFragment extends BaseFragment implements
 	volatile ContactManager contactManager;
 	@Inject
 	volatile IdentityManager identityManager;
-	@Inject
-	volatile ForumSharingManager forumSharingManager;
 
 	private volatile GroupId groupId;
+	private volatile ContactSelectorListener listener;
 
 	public static ContactSelectorFragment newInstance(GroupId groupId) {
-
 		Bundle args = new Bundle();
 		args.putByteArray(GROUP_ID, groupId.getBytes());
 		ContactSelectorFragment fragment = new ContactSelectorFragment();
@@ -81,7 +77,7 @@ public class ContactSelectorFragment extends BaseFragment implements
 	@Override
 	public void onAttach(Context context) {
 		super.onAttach(context);
-		shareActivity = (ShareActivity) context;
+		listener = (ContactSelectorListener) context;
 	}
 
 	@Override
@@ -139,6 +135,7 @@ public class ContactSelectorFragment extends BaseFragment implements
 
 	@Override
 	public void onSaveInstanceState(Bundle outState) {
+		super.onSaveInstanceState(outState);
 		if (adapter != null) {
 			selectedContacts = adapter.getSelectedContactIds();
 			outState.putIntegerArrayList(CONTACTS,
@@ -148,7 +145,7 @@ public class ContactSelectorFragment extends BaseFragment implements
 
 	@Override
 	public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
-		inflater.inflate(R.menu.forum_share_actions, menu);
+		inflater.inflate(R.menu.contact_selection_actions, menu);
 		super.onCreateOptionsMenu(menu, inflater);
 		this.menu = menu;
 		// hide sharing action initially, if no contact is selected
@@ -160,11 +157,11 @@ public class ContactSelectorFragment extends BaseFragment implements
 		// Handle presses on the action bar items
 		switch (item.getItemId()) {
 			case android.R.id.home:
-				shareActivity.onBackPressed();
+				listener.onBackPressed();
 				return true;
-			case R.id.action_share_forum:
+			case R.id.action_contacts_selected:
 				selectedContacts = adapter.getSelectedContactIds();
-				shareActivity.showMessageScreen(groupId, selectedContacts);
+				listener.contactsSelected(groupId, selectedContacts);
 				return true;
 			default:
 				return super.onOptionsItemSelected(item);
@@ -185,7 +182,7 @@ public class ContactSelectorFragment extends BaseFragment implements
 	}
 
 	private void loadContacts(@Nullable final Collection<ContactId> selection) {
-		shareActivity.runOnDbThread(new Runnable() {
+		listener.runOnDbThread(new Runnable() {
 			@Override
 			public void run() {
 				try {
@@ -199,7 +196,7 @@ 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 = shareActivity.isDisabled(groupId, c);
+						boolean disabled = listener.isDisabled(groupId, c);
 						contacts.add(new SelectableContactListItem(c,
 								localAuthor, groupId, selected, disabled));
 					}
@@ -216,7 +213,7 @@ public class ContactSelectorFragment extends BaseFragment implements
 	}
 
 	private void displayContacts(final List<ContactListItem> contacts) {
-		shareActivity.runOnUiThreadUnlessDestroyed(new Runnable() {
+		listener.runOnUiThreadUnlessDestroyed(new Runnable() {
 			@Override
 			public void run() {
 				if (contacts.isEmpty()) list.showData();
@@ -228,7 +225,7 @@ public class ContactSelectorFragment extends BaseFragment implements
 
 	private void updateMenuItem() {
 		if (menu == null) return;
-		MenuItem item = menu.findItem(R.id.action_share_forum);
+		MenuItem item = menu.findItem(R.id.action_contacts_selected);
 		if (item == null) return;
 
 		selectedContacts = adapter.getSelectedContactIds();
diff --git a/briar-android/src/org/briarproject/android/sharing/ContactSelectorListener.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorListener.java
new file mode 100644
index 0000000000..e1805594af
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorListener.java
@@ -0,0 +1,25 @@
+package org.briarproject.android.sharing;
+
+import android.support.annotation.UiThread;
+
+import org.briarproject.android.DestroyableContext;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.contact.ContactId;
+import org.briarproject.api.db.DbException;
+import org.briarproject.api.sync.GroupId;
+
+import java.util.Collection;
+
+public interface ContactSelectorListener extends DestroyableContext {
+
+	void runOnDbThread(Runnable runnable);
+
+	boolean isDisabled(GroupId groupId, Contact c) throws DbException;
+
+	@UiThread
+	void contactsSelected(GroupId groupId, Collection<ContactId> contacts);
+
+	@UiThread
+	void onBackPressed();
+
+}
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
index d79a7ed2ee..abef634fe2 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
@@ -6,7 +6,7 @@ import android.view.View;
 
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
-import org.briarproject.android.fragment.BaseFragment;
+import org.briarproject.android.fragment.BaseFragment.BaseFragmentListener;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
 import org.briarproject.api.db.DbException;
@@ -17,7 +17,7 @@ import java.util.Collection;
 import java.util.List;
 
 public abstract class ShareActivity extends BriarActivity implements
-		BaseFragment.BaseFragmentListener {
+		BaseFragmentListener, ContactSelectorListener {
 
 	final static String CONTACTS = "contacts";
 
@@ -44,9 +44,15 @@ public abstract class ShareActivity extends BriarActivity implements
 	abstract ShareMessageFragment getMessageFragment(GroupId groupId,
 			Collection<ContactId> contacts);
 
-	abstract boolean isDisabled(GroupId groupId, Contact c) throws DbException;
+	/**
+	 * This must only be called from a DbThread
+	 */
+	public abstract boolean isDisabled(GroupId groupId, Contact c)
+			throws DbException;
 
-	void showMessageScreen(GroupId groupId, Collection<ContactId> contacts) {
+	@Override
+	public void contactsSelected(GroupId groupId,
+			Collection<ContactId> contacts) {
 		ShareMessageFragment messageFragment =
 				getMessageFragment(groupId, contacts);
 
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java
index 696ea14522..b102453e59 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogActivity.java
@@ -29,7 +29,7 @@ public class ShareBlogActivity extends ShareActivity {
 	/**
 	 * This must only be called from a DbThread
 	 */
-	boolean isDisabled(GroupId groupId, Contact c) throws DbException {
+	public boolean isDisabled(GroupId groupId, Contact c) throws DbException {
 		return !blogSharingManager.canBeShared(groupId, c);
 	}
 }
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java
index 51a5d5a22a..1f76535371 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareForumActivity.java
@@ -28,7 +28,7 @@ public class ShareForumActivity extends ShareActivity {
 	/**
 	 * This must only be called from a DbThread
 	 */
-	boolean isDisabled(GroupId groupId, Contact c) throws DbException {
+	public boolean isDisabled(GroupId groupId, Contact c) throws DbException {
 		return !forumSharingManager.canBeShared(groupId, c);
 	}
 }
-- 
GitLab