From 68f0e91f32ff4ec4730e7d1220d982102aa1cbcc Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Fri, 11 Nov 2016 13:23:11 -0200
Subject: [PATCH] Prepare UI for revealing contacts

This changes the visibility of some methods, removes unnecessary
abstractions and fixes static import of GroupId constant.
---
 .../android/contact/ConversationActivity.java |  7 ++-
 .../BaseContactSelectorAdapter.java           |  4 +-
 .../BaseContactSelectorFragment.java          | 15 +++--
 .../BaseSelectableContactHolder.java          | 58 +++++++++++++++++++
 .../ContactSelectorActivity.java              | 18 +++++-
 .../ContactSelectorControllerImpl.java        | 21 +++----
 .../ContactSelectorFragment.java              | 19 ++----
 .../ContactSelectorListener.java              |  3 +-
 .../SelectableContactHolder.java              | 34 ++---------
 .../SelectableContactItem.java                |  2 +-
 .../creation/BaseGroupInviteActivity.java     |  4 +-
 .../creation/CreateGroupActivity.java         |  1 -
 .../creation/CreateGroupControllerImpl.java   | 16 +----
 .../creation/GroupInviteActivity.java         |  1 -
 .../creation/GroupInviteFragment.java         |  5 +-
 .../android/sharing/ShareActivity.java        |  3 +-
 .../sharing/ShareBlogControllerImpl.java      | 16 +----
 .../android/sharing/ShareBlogFragment.java    |  2 +-
 .../sharing/ShareForumControllerImpl.java     | 16 +----
 .../android/sharing/ShareForumFragment.java   |  2 +-
 .../android/util/AndroidUtils.java            |  1 +
 21 files changed, 122 insertions(+), 126 deletions(-)
 create mode 100644 briar-android/src/org/briarproject/android/contactselection/BaseSelectableContactHolder.java

diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index c8eb36da9d..41e8c08fb6 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -36,6 +36,7 @@ import org.briarproject.android.view.TextInputView;
 import org.briarproject.android.view.TextInputView.TextInputListener;
 import org.briarproject.api.FormatException;
 import org.briarproject.api.blogs.BlogSharingManager;
+import org.briarproject.api.clients.ProtocolStateException;
 import org.briarproject.api.clients.SessionId;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
@@ -898,7 +899,11 @@ public class ConversationActivity extends BriarActivity
 	@DatabaseExecutor
 	private void respondToGroupRequest(SessionId id, boolean accept)
 			throws DbException {
-		groupInvitationManager.respondToInvitation(contactId, id, accept);
+		try {
+			groupInvitationManager.respondToInvitation(contactId, id, accept);
+		} catch (ProtocolStateException e) {
+			// this action is no longer possible
+		}
 	}
 
 	private void introductionResponseError() {
diff --git a/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorAdapter.java b/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorAdapter.java
index ae3af6cd7d..c9e287b867 100644
--- a/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorAdapter.java
+++ b/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorAdapter.java
@@ -14,12 +14,12 @@ import java.util.Collection;
 public abstract class BaseContactSelectorAdapter<I extends SelectableContactItem, H extends ContactItemViewHolder<I>>
 		extends BaseContactListAdapter<I, H> {
 
-	BaseContactSelectorAdapter(Context context, Class<I> c,
+	public BaseContactSelectorAdapter(Context context, Class<I> c,
 			OnContactClickListener<I> listener) {
 		super(context, c, listener);
 	}
 
-	Collection<ContactId> getSelectedContactIds() {
+	public Collection<ContactId> getSelectedContactIds() {
 		Collection<ContactId> selected = new ArrayList<>();
 
 		for (int i = 0; i < items.size(); i++) {
diff --git a/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorFragment.java b/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorFragment.java
index 7d093b82ad..fc1f400f29 100644
--- a/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorFragment.java
+++ b/briar-android/src/org/briarproject/android/contactselection/BaseContactSelectorFragment.java
@@ -26,28 +26,28 @@ import org.briarproject.api.sync.GroupId;
 import java.util.ArrayList;
 import java.util.Collection;
 
+import static org.briarproject.android.BriarActivity.GROUP_ID;
 import static org.briarproject.android.contactselection.ContactSelectorActivity.CONTACTS;
 import static org.briarproject.android.contactselection.ContactSelectorActivity.getContactsFromIds;
 import static org.briarproject.android.contactselection.ContactSelectorActivity.getContactsFromIntegers;
-import static org.briarproject.api.sharing.SharingConstants.GROUP_ID;
 
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
-public abstract class BaseContactSelectorFragment<I extends SelectableContactItem, H extends ContactItemViewHolder<I>>
+public abstract class BaseContactSelectorFragment<I extends SelectableContactItem, A extends BaseContactSelectorAdapter<I, ? extends ContactItemViewHolder<I>>>
 		extends BaseFragment
 		implements OnContactClickListener<I> {
 
 	protected BriarRecyclerView list;
-	protected BaseContactSelectorAdapter<I, H> adapter;
+	protected A adapter;
 	protected Collection<ContactId> selectedContacts = new ArrayList<>();
-	protected ContactSelectorListener<I> listener;
+	protected ContactSelectorListener listener;
 
 	private GroupId groupId;
 
 	@Override
 	public void onAttach(Context context) {
 		super.onAttach(context);
-		listener = (ContactSelectorListener<I>) context;
+		listener = (ContactSelectorListener) context;
 	}
 
 	@Override
@@ -75,6 +75,8 @@ public abstract class BaseContactSelectorFragment<I extends SelectableContactIte
 		list = (BriarRecyclerView) contentView.findViewById(R.id.list);
 		list.setLayoutManager(new LinearLayoutManager(getActivity()));
 		list.setEmptyText(getString(R.string.no_contacts_selector));
+		adapter = getAdapter(getContext(), this);
+		list.setAdapter(adapter);
 
 		// restore selected contacts if available
 		if (savedInstanceState != null) {
@@ -87,6 +89,9 @@ public abstract class BaseContactSelectorFragment<I extends SelectableContactIte
 		return contentView;
 	}
 
+	protected abstract A getAdapter(Context context,
+			OnContactClickListener<I> listener);
+
 	@Override
 	public void onStart() {
 		super.onStart();
diff --git a/briar-android/src/org/briarproject/android/contactselection/BaseSelectableContactHolder.java b/briar-android/src/org/briarproject/android/contactselection/BaseSelectableContactHolder.java
new file mode 100644
index 0000000000..d0b57f1328
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/contactselection/BaseSelectableContactHolder.java
@@ -0,0 +1,58 @@
+package org.briarproject.android.contactselection;
+
+import android.support.annotation.UiThread;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+import org.briarproject.R;
+import org.briarproject.android.contact.BaseContactListAdapter.OnContactClickListener;
+import org.briarproject.android.contact.ContactItemViewHolder;
+import org.briarproject.api.nullsafety.NotNullByDefault;
+import org.jetbrains.annotations.Nullable;
+
+import static org.briarproject.android.util.AndroidUtils.GREY_OUT;
+
+@UiThread
+@NotNullByDefault
+public class BaseSelectableContactHolder<I extends SelectableContactItem>
+		extends ContactItemViewHolder<I> {
+
+	private final CheckBox checkBox;
+	protected final TextView info;
+
+	public BaseSelectableContactHolder(View v) {
+		super(v);
+		checkBox = (CheckBox) v.findViewById(R.id.checkBox);
+		info = (TextView) v.findViewById(R.id.infoView);
+	}
+
+	@Override
+	protected void bind(I item, @Nullable
+			OnContactClickListener<I> listener) {
+		super.bind(item, listener);
+
+		if (item.isSelected()) {
+			checkBox.setChecked(true);
+		} else {
+			checkBox.setChecked(false);
+		}
+
+		if (item.isDisabled()) {
+			layout.setEnabled(false);
+			grayOutItem(true);
+		} else {
+			layout.setEnabled(true);
+			grayOutItem(false);
+		}
+	}
+
+	protected void grayOutItem(boolean gray) {
+		float alpha = gray ? GREY_OUT : 1f;
+		avatar.setAlpha(alpha);
+		name.setAlpha(alpha);
+		checkBox.setAlpha(alpha);
+		info.setAlpha(alpha);
+	}
+
+}
diff --git a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorActivity.java b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorActivity.java
index 48ce9aaf56..d61545f96e 100644
--- a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorActivity.java
+++ b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorActivity.java
@@ -1,9 +1,12 @@
 package org.briarproject.android.contactselection;
 
+import android.os.Build;
 import android.os.Bundle;
 import android.support.annotation.CallSuper;
+import android.support.annotation.LayoutRes;
 import android.support.annotation.Nullable;
 import android.support.annotation.UiThread;
+import android.transition.Fade;
 
 import org.briarproject.R;
 import org.briarproject.android.BriarActivity;
@@ -19,9 +22,9 @@ import java.util.List;
 
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
-public abstract class ContactSelectorActivity<I extends SelectableContactItem>
+public abstract class ContactSelectorActivity
 		extends BriarActivity
-		implements BaseFragmentListener, ContactSelectorListener<I> {
+		implements BaseFragmentListener, ContactSelectorListener {
 
 	final static String CONTACTS = "contacts";
 
@@ -33,7 +36,11 @@ public abstract class ContactSelectorActivity<I extends SelectableContactItem>
 	public void onCreate(@Nullable Bundle bundle) {
 		super.onCreate(bundle);
 
-		setContentView(R.layout.activity_fragment_container);
+		setContentView(getLayout());
+
+		if (Build.VERSION.SDK_INT >= 21) {
+			getWindow().setExitTransition(new Fade());
+		}
 
 		if (bundle != null) {
 			// restore group ID if it was saved
@@ -48,6 +55,11 @@ public abstract class ContactSelectorActivity<I extends SelectableContactItem>
 		}
 	}
 
+	@LayoutRes
+	protected int getLayout() {
+		return R.layout.activity_fragment_container;
+	}
+
 	@Override
 	public void onSaveInstanceState(Bundle outState) {
 		super.onSaveInstanceState(outState);
diff --git a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorControllerImpl.java b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorControllerImpl.java
index e9f45bf718..aa198e35fe 100644
--- a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorControllerImpl.java
@@ -22,9 +22,9 @@ import static java.util.logging.Level.WARNING;
 
 @Immutable
 @NotNullByDefault
-public abstract class ContactSelectorControllerImpl<I extends SelectableContactItem>
+public abstract class ContactSelectorControllerImpl
 		extends DbControllerImpl
-		implements ContactSelectorController<I> {
+		implements ContactSelectorController<SelectableContactItem> {
 
 	private static final Logger LOG =
 			Logger.getLogger(ContactSelectorControllerImpl.class.getName());
@@ -40,19 +40,20 @@ public abstract class ContactSelectorControllerImpl<I extends SelectableContactI
 	@Override
 	public void loadContacts(final GroupId g,
 			final Collection<ContactId> selection,
-			final ResultExceptionHandler<Collection<I>, DbException> handler) {
+			final ResultExceptionHandler<Collection<SelectableContactItem>, DbException> handler) {
 		runOnDbThread(new Runnable() {
 			@Override
 			public void run() {
 				try {
-					Collection<I> contacts = new ArrayList<>();
+					Collection<SelectableContactItem> contacts =
+							new ArrayList<>();
 					for (Contact c : contactManager.getActiveContacts()) {
 						// was this contact already selected?
-						boolean selected =
-								isSelected(c, selection.contains(c.getId()));
+						boolean selected = selection.contains(c.getId());
 						// can this contact be selected?
 						boolean disabled = isDisabled(g, c);
-						contacts.add(getItem(c, selected, disabled));
+						contacts.add(new SelectableContactItem(c, selected,
+								disabled));
 					}
 					handler.onResult(contacts);
 				} catch (DbException e) {
@@ -64,14 +65,8 @@ public abstract class ContactSelectorControllerImpl<I extends SelectableContactI
 		});
 	}
 
-	@DatabaseExecutor
-	protected abstract boolean isSelected(Contact c, boolean wasSelected)
-			throws DbException;
-
 	@DatabaseExecutor
 	protected abstract boolean isDisabled(GroupId g, Contact c)
 			throws DbException;
 
-	protected abstract I getItem(Contact c, boolean selected, boolean disabled);
-
 }
diff --git a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorFragment.java b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorFragment.java
index 7da47a25da..0e24b157d0 100644
--- a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorFragment.java
+++ b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorFragment.java
@@ -1,23 +1,19 @@
 package org.briarproject.android.contactselection;
 
-import android.os.Bundle;
-import android.view.LayoutInflater;
+import android.content.Context;
 import android.view.Menu;
 import android.view.MenuInflater;
 import android.view.MenuItem;
-import android.view.View;
-import android.view.ViewGroup;
 
 import org.briarproject.R;
 import org.briarproject.android.contact.BaseContactListAdapter.OnContactClickListener;
 import org.briarproject.api.nullsafety.MethodsNotNullByDefault;
 import org.briarproject.api.nullsafety.ParametersNotNullByDefault;
-import org.jetbrains.annotations.Nullable;
 
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
 public abstract class ContactSelectorFragment extends
-		BaseContactSelectorFragment<SelectableContactItem, SelectableContactHolder>
+		BaseContactSelectorFragment<SelectableContactItem, ContactSelectorAdapter>
 		implements OnContactClickListener<SelectableContactItem> {
 
 	public static final String TAG = ContactSelectorFragment.class.getName();
@@ -25,14 +21,9 @@ public abstract class ContactSelectorFragment extends
 	private Menu menu;
 
 	@Override
-	public View onCreateView(LayoutInflater inflater,
-			@Nullable ViewGroup container,
-			@Nullable Bundle savedInstanceState) {
-		View contentView =
-				super.onCreateView(inflater, container, savedInstanceState);
-		adapter = new ContactSelectorAdapter(getActivity(), this);
-		list.setAdapter(adapter);
-		return contentView;
+	protected ContactSelectorAdapter getAdapter(Context context,
+			OnContactClickListener<SelectableContactItem> listener) {
+		return new ContactSelectorAdapter(context, listener);
 	}
 
 	@Override
diff --git a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorListener.java b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorListener.java
index 93f91dbc77..b844c35f64 100644
--- a/briar-android/src/org/briarproject/android/contactselection/ContactSelectorListener.java
+++ b/briar-android/src/org/briarproject/android/contactselection/ContactSelectorListener.java
@@ -9,8 +9,7 @@ import org.briarproject.api.nullsafety.NotNullByDefault;
 import java.util.Collection;
 
 @NotNullByDefault
-interface ContactSelectorListener<I extends SelectableContactItem>
-		extends DestroyableContext {
+public interface ContactSelectorListener extends DestroyableContext {
 
 	@UiThread
 	void contactsSelected(Collection<ContactId> contacts);
diff --git a/briar-android/src/org/briarproject/android/contactselection/SelectableContactHolder.java b/briar-android/src/org/briarproject/android/contactselection/SelectableContactHolder.java
index 47173b51a8..0ab5ecc4d6 100644
--- a/briar-android/src/org/briarproject/android/contactselection/SelectableContactHolder.java
+++ b/briar-android/src/org/briarproject/android/contactselection/SelectableContactHolder.java
@@ -2,12 +2,9 @@ package org.briarproject.android.contactselection;
 
 import android.support.annotation.UiThread;
 import android.view.View;
-import android.widget.CheckBox;
-import android.widget.TextView;
 
-import org.briarproject.R;
+import org.briarproject.android.contact.BaseContactListAdapter;
 import org.briarproject.android.contact.BaseContactListAdapter.OnContactClickListener;
-import org.briarproject.android.contact.ContactItemViewHolder;
 import org.briarproject.api.nullsafety.NotNullByDefault;
 import org.jetbrains.annotations.Nullable;
 
@@ -17,15 +14,10 @@ import static android.view.View.VISIBLE;
 @UiThread
 @NotNullByDefault
 public class SelectableContactHolder
-		extends ContactItemViewHolder<SelectableContactItem> {
-
-	private final CheckBox checkBox;
-	private final TextView shared;
+		extends BaseSelectableContactHolder<SelectableContactItem> {
 
 	SelectableContactHolder(View v) {
 		super(v);
-		checkBox = (CheckBox) v.findViewById(R.id.checkBox);
-		shared = (TextView) v.findViewById(R.id.infoView);
 	}
 
 	@Override
@@ -33,29 +25,11 @@ public class SelectableContactHolder
 			OnContactClickListener<SelectableContactItem> listener) {
 		super.bind(item, listener);
 
-		if (item.isSelected()) {
-			checkBox.setChecked(true);
-		} else {
-			checkBox.setChecked(false);
-		}
-
 		if (item.isDisabled()) {
-			// we share this forum already with that contact
-			layout.setEnabled(false);
-			shared.setVisibility(VISIBLE);
-			grayOutItem(true);
+			info.setVisibility(VISIBLE);
 		} else {
-			layout.setEnabled(true);
-			shared.setVisibility(GONE);
-			grayOutItem(false);
+			info.setVisibility(GONE);
 		}
 	}
 
-	private void grayOutItem(boolean gray) {
-		float alpha = gray ? 0.25f : 1f;
-		avatar.setAlpha(alpha);
-		name.setAlpha(alpha);
-		checkBox.setAlpha(alpha);
-	}
-
 }
diff --git a/briar-android/src/org/briarproject/android/contactselection/SelectableContactItem.java b/briar-android/src/org/briarproject/android/contactselection/SelectableContactItem.java
index 23ed9e0ec1..b11da75a10 100644
--- a/briar-android/src/org/briarproject/android/contactselection/SelectableContactItem.java
+++ b/briar-android/src/org/briarproject/android/contactselection/SelectableContactItem.java
@@ -27,7 +27,7 @@ public class SelectableContactItem extends ContactItem {
 		selected = !selected;
 	}
 
-	boolean isDisabled() {
+	public boolean isDisabled() {
 		return disabled;
 	}
 
diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/BaseGroupInviteActivity.java b/briar-android/src/org/briarproject/android/privategroup/creation/BaseGroupInviteActivity.java
index 44573e49ae..2f7125331b 100644
--- a/briar-android/src/org/briarproject/android/privategroup/creation/BaseGroupInviteActivity.java
+++ b/briar-android/src/org/briarproject/android/privategroup/creation/BaseGroupInviteActivity.java
@@ -2,7 +2,6 @@ package org.briarproject.android.privategroup.creation;
 
 import org.briarproject.R;
 import org.briarproject.android.contactselection.ContactSelectorActivity;
-import org.briarproject.android.contactselection.SelectableContactItem;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.android.sharing.BaseMessageFragment.MessageFragmentListener;
 import org.briarproject.api.contact.ContactId;
@@ -20,8 +19,7 @@ import static org.briarproject.api.privategroup.PrivateGroupConstants.MAX_GROUP_
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
 public abstract class BaseGroupInviteActivity
-		extends ContactSelectorActivity<SelectableContactItem>
-		implements MessageFragmentListener {
+		extends ContactSelectorActivity implements MessageFragmentListener {
 
 	@Inject
 	CreateGroupController controller;
diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupActivity.java b/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupActivity.java
index c1cffdde04..461989c81c 100644
--- a/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupActivity.java
+++ b/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupActivity.java
@@ -7,7 +7,6 @@ import android.support.v4.app.ActivityOptionsCompat;
 
 import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
-import org.briarproject.android.contactselection.ContactSelectorFragment;
 import org.briarproject.android.controller.handler.UiResultExceptionHandler;
 import org.briarproject.android.privategroup.conversation.GroupActivity;
 import org.briarproject.android.sharing.BaseMessageFragment.MessageFragmentListener;
diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java b/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java
index 42a514e96e..d63e3e128e 100644
--- a/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/privategroup/creation/CreateGroupControllerImpl.java
@@ -1,7 +1,6 @@
 package org.briarproject.android.privategroup.creation;
 
 import org.briarproject.android.contactselection.ContactSelectorControllerImpl;
-import org.briarproject.android.contactselection.SelectableContactItem;
 import org.briarproject.android.controller.handler.ResultExceptionHandler;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
@@ -37,8 +36,7 @@ import static java.util.logging.Level.WARNING;
 
 @Immutable
 @NotNullByDefault
-public class CreateGroupControllerImpl
-		extends ContactSelectorControllerImpl<SelectableContactItem>
+public class CreateGroupControllerImpl extends ContactSelectorControllerImpl
 		implements CreateGroupController {
 
 	private static final Logger LOG =
@@ -130,23 +128,11 @@ public class CreateGroupControllerImpl
 		});
 	}
 
-	@Override
-	protected boolean isSelected(Contact c, boolean wasSelected)
-			throws DbException {
-		return wasSelected;
-	}
-
 	@Override
 	protected boolean isDisabled(GroupId g, Contact c) throws DbException {
 		return !groupInvitationManager.isInvitationAllowed(c, g);
 	}
 
-	@Override
-	protected SelectableContactItem getItem(Contact c, boolean selected,
-			boolean disabled) {
-		return new SelectableContactItem(c, selected, disabled);
-	}
-
 	@Override
 	public void sendInvitation(final GroupId g,
 			final Collection<ContactId> contactIds, final String message,
diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteActivity.java b/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteActivity.java
index c9614f9cf6..71ce496677 100644
--- a/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteActivity.java
+++ b/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteActivity.java
@@ -5,7 +5,6 @@ import android.os.Bundle;
 
 import org.briarproject.R;
 import org.briarproject.android.ActivityComponent;
-import org.briarproject.android.contactselection.ContactSelectorFragment;
 import org.briarproject.android.sharing.BaseMessageFragment.MessageFragmentListener;
 import org.briarproject.api.sync.GroupId;
 
diff --git a/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteFragment.java b/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteFragment.java
index 7d97d5fd62..6e8eab6092 100644
--- a/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteFragment.java
+++ b/briar-android/src/org/briarproject/android/privategroup/creation/GroupInviteFragment.java
@@ -1,8 +1,11 @@
 package org.briarproject.android.privategroup.creation;
 
+import android.content.Context;
 import android.os.Bundle;
 
 import org.briarproject.android.ActivityComponent;
+import org.briarproject.android.contact.BaseContactListAdapter;
+import org.briarproject.android.contactselection.ContactSelectorAdapter;
 import org.briarproject.android.contactselection.ContactSelectorController;
 import org.briarproject.android.contactselection.ContactSelectorFragment;
 import org.briarproject.android.contactselection.SelectableContactItem;
@@ -12,7 +15,7 @@ import org.briarproject.api.sync.GroupId;
 
 import javax.inject.Inject;
 
-import static org.briarproject.api.sharing.SharingConstants.GROUP_ID;
+import static org.briarproject.android.BriarActivity.GROUP_ID;
 
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
index 8f72fcb83a..8940714226 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareActivity.java
@@ -20,8 +20,7 @@ import java.util.Collection;
 
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
-public abstract class ShareActivity
-		extends ContactSelectorActivity<SelectableContactItem>
+public abstract class ShareActivity extends ContactSelectorActivity
 		implements MessageFragmentListener {
 
 	@Override
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareBlogControllerImpl.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogControllerImpl.java
index ae0512f6e6..a2f9be5b39 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareBlogControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogControllerImpl.java
@@ -1,7 +1,6 @@
 package org.briarproject.android.sharing;
 
 import org.briarproject.android.contactselection.ContactSelectorControllerImpl;
-import org.briarproject.android.contactselection.SelectableContactItem;
 import org.briarproject.android.controller.handler.ExceptionHandler;
 import org.briarproject.api.blogs.BlogSharingManager;
 import org.briarproject.api.contact.Contact;
@@ -26,8 +25,7 @@ import static java.util.logging.Level.WARNING;
 
 @Immutable
 @NotNullByDefault
-public class ShareBlogControllerImpl
-		extends ContactSelectorControllerImpl<SelectableContactItem>
+public class ShareBlogControllerImpl extends ContactSelectorControllerImpl
 		implements ShareBlogController {
 
 	private final static Logger LOG =
@@ -45,23 +43,11 @@ public class ShareBlogControllerImpl
 		this.blogSharingManager = blogSharingManager;
 	}
 
-	@Override
-	protected boolean isSelected(Contact c, boolean wasSelected)
-			throws DbException {
-		return wasSelected;
-	}
-
 	@Override
 	protected boolean isDisabled(GroupId g, Contact c) throws DbException {
 		return !blogSharingManager.canBeShared(g, c);
 	}
 
-	@Override
-	protected SelectableContactItem getItem(Contact c, boolean selected,
-			boolean disabled) {
-		return new SelectableContactItem(c, selected, disabled);
-	}
-
 	@Override
 	public void share(final GroupId g, final Collection<ContactId> contacts,
 			final String msg,
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareBlogFragment.java b/briar-android/src/org/briarproject/android/sharing/ShareBlogFragment.java
index f575643f20..f055b4fb63 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareBlogFragment.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareBlogFragment.java
@@ -12,7 +12,7 @@ import org.briarproject.api.sync.GroupId;
 
 import javax.inject.Inject;
 
-import static org.briarproject.api.sharing.SharingConstants.GROUP_ID;
+import static org.briarproject.android.BriarActivity.GROUP_ID;
 
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareForumControllerImpl.java b/briar-android/src/org/briarproject/android/sharing/ShareForumControllerImpl.java
index a4500709fd..b59f0a5585 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareForumControllerImpl.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareForumControllerImpl.java
@@ -1,7 +1,6 @@
 package org.briarproject.android.sharing;
 
 import org.briarproject.android.contactselection.ContactSelectorControllerImpl;
-import org.briarproject.android.contactselection.SelectableContactItem;
 import org.briarproject.android.controller.handler.ExceptionHandler;
 import org.briarproject.api.contact.Contact;
 import org.briarproject.api.contact.ContactId;
@@ -26,8 +25,7 @@ import static java.util.logging.Level.WARNING;
 
 @Immutable
 @NotNullByDefault
-public class ShareForumControllerImpl
-		extends ContactSelectorControllerImpl<SelectableContactItem>
+public class ShareForumControllerImpl extends ContactSelectorControllerImpl
 		implements ShareForumController {
 
 	private final static Logger LOG =
@@ -45,23 +43,11 @@ public class ShareForumControllerImpl
 		this.forumSharingManager = forumSharingManager;
 	}
 
-	@Override
-	protected boolean isSelected(Contact c, boolean wasSelected)
-			throws DbException {
-		return wasSelected;
-	}
-
 	@Override
 	protected boolean isDisabled(GroupId g, Contact c) throws DbException {
 		return !forumSharingManager.canBeShared(g, c);
 	}
 
-	@Override
-	protected SelectableContactItem getItem(Contact c, boolean selected,
-			boolean disabled) {
-		return new SelectableContactItem(c, selected, disabled);
-	}
-
 	@Override
 	public void share(final GroupId g, final Collection<ContactId> contacts,
 			final String msg,
diff --git a/briar-android/src/org/briarproject/android/sharing/ShareForumFragment.java b/briar-android/src/org/briarproject/android/sharing/ShareForumFragment.java
index 4133e5ed71..9ed8c9e58c 100644
--- a/briar-android/src/org/briarproject/android/sharing/ShareForumFragment.java
+++ b/briar-android/src/org/briarproject/android/sharing/ShareForumFragment.java
@@ -12,7 +12,7 @@ import org.briarproject.api.sync.GroupId;
 
 import javax.inject.Inject;
 
-import static org.briarproject.api.sharing.SharingConstants.GROUP_ID;
+import static org.briarproject.android.BriarActivity.GROUP_ID;
 
 @MethodsNotNullByDefault
 @ParametersNotNullByDefault
diff --git a/briar-android/src/org/briarproject/android/util/AndroidUtils.java b/briar-android/src/org/briarproject/android/util/AndroidUtils.java
index 9bcd96e206..5fed2f5a2e 100644
--- a/briar-android/src/org/briarproject/android/util/AndroidUtils.java
+++ b/briar-android/src/org/briarproject/android/util/AndroidUtils.java
@@ -47,6 +47,7 @@ public class AndroidUtils {
 
 	public static final long MIN_RESOLUTION = MINUTE_IN_MILLIS;
 	public static final int TEASER_LENGTH = 320;
+	public static final float GREY_OUT = 0.5f;
 
 	// Fake Bluetooth address returned by BluetoothAdapter on API 23 and later
 	private static final String FAKE_BLUETOOTH_ADDRESS = "02:00:00:00:00:00";
-- 
GitLab