diff --git a/briar-android/res/layout/list_item_contact.xml b/briar-android/res/layout/list_item_contact.xml
index 624434e9a..732cb2109 100644
--- a/briar-android/res/layout/list_item_contact.xml
+++ b/briar-android/res/layout/list_item_contact.xml
@@ -1,7 +1,6 @@
+ android:paddingTop="@dimen/listitem_horizontal_margin">
-
-
Your introduction has been sent.
There was an error making the introduction.
Error when responding to introduction
- Warning: Different Identities
- You are trying to introduce two contacts that you have added with different identities. This might reveal that both identities are yours.
Introduce
You have asked to introduce %1$s to %2$s.
%1$s has asked to introduce you to %2$s. Do you want to add %2$s to your contact list?
diff --git a/briar-android/src/org/briarproject/android/contact/BaseContactListAdapter.java b/briar-android/src/org/briarproject/android/contact/BaseContactListAdapter.java
index cd01ad1a4..78af58b5b 100644
--- a/briar-android/src/org/briarproject/android/contact/BaseContactListAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/BaseContactListAdapter.java
@@ -2,129 +2,61 @@ package org.briarproject.android.contact;
import android.content.Context;
import android.support.annotation.Nullable;
-import android.support.v4.view.ViewCompat;
-import android.support.v7.widget.RecyclerView;
import android.view.View;
-import android.view.ViewGroup;
-import android.widget.ImageView;
-import android.widget.TextView;
-import org.briarproject.R;
import org.briarproject.android.util.BriarAdapter;
import org.briarproject.api.contact.ContactId;
-import org.briarproject.api.identity.Author;
-import org.briarproject.util.StringUtils;
-
-import im.delight.android.identicons.IdenticonDrawable;
import static android.support.v7.util.SortedList.INVALID_POSITION;
-public abstract class BaseContactListAdapter
- extends BriarAdapter {
+public abstract class BaseContactListAdapter>
+ extends BriarAdapter {
@Nullable
- protected final OnItemClickListener listener;
+ protected final OnContactClickListener listener;
- public BaseContactListAdapter(Context ctx,
- @Nullable OnItemClickListener listener) {
- super(ctx, ContactListItem.class);
+ public BaseContactListAdapter(Context ctx, Class c,
+ @Nullable OnContactClickListener listener) {
+ super(ctx, c);
this.listener = listener;
}
@Override
public void onBindViewHolder(final VH ui, int position) {
- final ContactListItem item = getItemAt(position);
- if (item == null) return;
-
- Author author = item.getContact().getAuthor();
- ui.avatar.setImageDrawable(
- new IdenticonDrawable(author.getId().getBytes()));
- String contactName = author.getName();
- ui.name.setText(contactName);
-
- ui.layout.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- if (listener != null) listener.onItemClick(ui.avatar, item);
- }
- });
-
- ViewCompat.setTransitionName(ui.avatar, "avatar" +
- StringUtils.toHexString(item.getGroupId().getBytes()));
+ I item = items.get(position);
+ ui.bind(item, listener);
}
@Override
- public int compare(ContactListItem c1, ContactListItem c2) {
- return compareByName(c1, c2);
+ public int compare(I c1, I c2) {
+ return c1.getContact().getAuthor().getName()
+ .compareTo(c2.getContact().getAuthor().getName());
}
@Override
- public boolean areItemsTheSame(ContactListItem c1, ContactListItem c2) {
+ public boolean areItemsTheSame(I c1, I c2) {
return c1.getContact().getId().equals(c2.getContact().getId());
}
@Override
- public boolean areContentsTheSame(ContactListItem c1, ContactListItem c2) {
+ public boolean areContentsTheSame(I c1, I c2) {
// check for all properties that influence visual
// representation of contact
- if (c1.isConnected() != c2.isConnected()) {
- return false;
- }
- if (c1.getUnreadCount() != c2.getUnreadCount()) {
- return false;
- }
- if (c1.getTimestamp() != c2.getTimestamp()) {
- return false;
- }
- return true;
+ return c1.isConnected() == c2.isConnected();
}
int findItemPosition(ContactId c) {
int count = getItemCount();
for (int i = 0; i < count; i++) {
- ContactListItem item = getItemAt(i);
+ I item = getItemAt(i);
if (item != null && item.getContact().getId().equals(c))
return i;
}
return INVALID_POSITION; // Not found
}
- public static class BaseContactHolder extends RecyclerView.ViewHolder {
-
- public final ViewGroup layout;
- public final ImageView avatar;
- public final TextView name;
-
- public BaseContactHolder(View v) {
- super(v);
-
- layout = (ViewGroup) v;
- avatar = (ImageView) v.findViewById(R.id.avatarView);
- name = (TextView) v.findViewById(R.id.nameView);
- }
- }
-
- protected int compareByName(ContactListItem c1, ContactListItem c2) {
- int authorCompare = c1.getLocalAuthor().getName()
- .compareTo(c2.getLocalAuthor().getName());
- if (authorCompare == 0) {
- // if names are equal, compare by time instead
- return compareByTime(c1, c2);
- } else {
- return authorCompare;
- }
- }
-
- protected int compareByTime(ContactListItem c1, ContactListItem c2) {
- long time1 = c1.getTimestamp();
- long time2 = c2.getTimestamp();
- if (time1 < time2) return 1;
- if (time1 > time2) return -1;
- return 0;
- }
-
- public interface OnItemClickListener {
- void onItemClick(View view, ContactListItem item);
+ public interface OnContactClickListener {
+ void onItemClick(View view, I item);
}
}
diff --git a/briar-android/src/org/briarproject/android/contact/ContactItem.java b/briar-android/src/org/briarproject/android/contact/ContactItem.java
new file mode 100644
index 000000000..9e92c8983
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/contact/ContactItem.java
@@ -0,0 +1,32 @@
+package org.briarproject.android.contact;
+
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.nullsafety.NotNullByDefault;
+
+import javax.annotation.concurrent.NotThreadSafe;
+
+@NotThreadSafe
+@NotNullByDefault
+public class ContactItem {
+
+ private final Contact contact;
+ private boolean connected;
+
+ public ContactItem(Contact contact, boolean connected) {
+ this.contact = contact;
+ this.connected = connected;
+ }
+
+ public Contact getContact() {
+ return contact;
+ }
+
+ boolean isConnected() {
+ return connected;
+ }
+
+ void setConnected(boolean connected) {
+ this.connected = connected;
+ }
+
+}
diff --git a/briar-android/src/org/briarproject/android/contact/ContactItemViewHolder.java b/briar-android/src/org/briarproject/android/contact/ContactItemViewHolder.java
new file mode 100644
index 000000000..46a81762b
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/contact/ContactItemViewHolder.java
@@ -0,0 +1,51 @@
+package org.briarproject.android.contact;
+
+import android.support.annotation.UiThread;
+import android.support.v7.widget.RecyclerView;
+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.OnContactClickListener;
+import org.briarproject.api.identity.Author;
+import org.briarproject.api.nullsafety.NotNullByDefault;
+import org.jetbrains.annotations.Nullable;
+
+import im.delight.android.identicons.IdenticonDrawable;
+
+@UiThread
+@NotNullByDefault
+public class ContactItemViewHolder
+ extends RecyclerView.ViewHolder {
+
+ protected final ViewGroup layout;
+ protected final ImageView avatar;
+ protected final TextView name;
+
+ public ContactItemViewHolder(View v) {
+ super(v);
+
+ layout = (ViewGroup) v;
+ avatar = (ImageView) v.findViewById(R.id.avatarView);
+ name = (TextView) v.findViewById(R.id.nameView);
+ }
+
+ protected void bind(final I item,
+ @Nullable final OnContactClickListener listener) {
+ Author author = item.getContact().getAuthor();
+ avatar.setImageDrawable(
+ new IdenticonDrawable(author.getId().getBytes()));
+ String contactName = author.getName();
+ name.setText(contactName);
+
+ layout.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (listener != null) listener.onItemClick(avatar, item);
+ }
+ });
+ }
+
+}
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java b/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java
index a2cf8012d..ae6c45b9a 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListAdapter.java
@@ -1,87 +1,49 @@
package org.briarproject.android.contact;
import android.content.Context;
-import android.support.v4.view.ViewCompat;
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.util.AndroidUtils;
-import org.briarproject.util.StringUtils;
-public class ContactListAdapter
- extends BaseContactListAdapter {
+public class ContactListAdapter extends
+ BaseContactListAdapter {
- public ContactListAdapter(Context context, OnItemClickListener listener) {
- super(context, listener);
+ public ContactListAdapter(Context context,
+ OnContactClickListener listener) {
+ super(context, ContactListItem.class, listener);
}
@Override
- public ContactHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
+ public ContactListItemViewHolder onCreateViewHolder(ViewGroup viewGroup,
+ int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.list_item_contact, viewGroup, false);
- return new ContactHolder(v);
+ return new ContactListItemViewHolder(v);
}
@Override
- public void onBindViewHolder(ContactHolder ui, int position) {
- super.onBindViewHolder(ui, position);
-
- ContactListItem item = getItemAt(position);
- if (item == null) return;
-
- // unread count
- int unread = item.getUnreadCount();
- if (unread > 0) {
- ui.unread.setText(String.valueOf(unread));
- ui.unread.setVisibility(View.VISIBLE);
- } else {
- ui.unread.setVisibility(View.INVISIBLE);
+ public boolean areContentsTheSame(ContactListItem c1, ContactListItem c2) {
+ // check for all properties that influence visual
+ // representation of contact
+ if (c1.getUnreadCount() != c2.getUnreadCount()) {
+ return false;
}
-
- // date of last message
- if (item.isEmpty()) {
- ui.date.setText(R.string.date_no_private_messages);
- } else {
- long timestamp = item.getTimestamp();
- ui.date.setText(AndroidUtils.formatDate(ctx, timestamp));
- }
-
- // online/offline
- if (item.isConnected()) {
- ui.bulb.setImageResource(R.drawable.contact_connected);
- } else {
- ui.bulb.setImageResource(R.drawable.contact_disconnected);
- }
-
- ViewCompat.setTransitionName(ui.bulb,
- "bulb" + StringUtils.toHexString(item.getGroupId().getBytes()));
- }
-
- protected static class ContactHolder
- extends BaseContactListAdapter.BaseContactHolder {
-
- public final ImageView bulb;
- private final TextView unread;
- public final TextView date;
- public final TextView identity;
-
- private ContactHolder(View v) {
- super(v);
-
- bulb = (ImageView) v.findViewById(R.id.bulbView);
- unread = (TextView) v.findViewById(R.id.unreadCountView);
- date = (TextView) v.findViewById(R.id.dateView);
- identity = (TextView) v.findViewById(R.id.identityView);
+ if (c1.getTimestamp() != c2.getTimestamp()) {
+ return false;
}
+ return super.areContentsTheSame(c1, c2);
}
@Override
public int compare(ContactListItem c1, ContactListItem c2) {
- return compareByTime(c1, c2);
+ long time1 = c1.getTimestamp();
+ long time2 = c2.getTimestamp();
+ if (time1 < time2) return 1;
+ if (time1 > time2) return -1;
+ return 0;
}
+
}
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
index 9f5d23971..2d2a098b3 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
@@ -7,7 +7,6 @@ import android.support.annotation.Nullable;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.util.Pair;
-import android.support.v4.view.ViewCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.view.LayoutInflater;
import android.view.Menu;
@@ -19,6 +18,7 @@ import android.view.ViewGroup;
import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
import org.briarproject.android.api.AndroidNotificationManager;
+import org.briarproject.android.contact.BaseContactListAdapter.OnContactClickListener;
import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.android.keyagreement.KeyAgreementActivity;
import org.briarproject.android.view.BriarRecyclerView;
@@ -41,8 +41,6 @@ import org.briarproject.api.event.IntroductionResponseReceivedEvent;
import org.briarproject.api.event.InvitationRequestReceivedEvent;
import org.briarproject.api.event.InvitationResponseReceivedEvent;
import org.briarproject.api.event.PrivateMessageReceivedEvent;
-import org.briarproject.api.identity.IdentityManager;
-import org.briarproject.api.identity.LocalAuthor;
import org.briarproject.api.introduction.IntroductionRequest;
import org.briarproject.api.introduction.IntroductionResponse;
import org.briarproject.api.messaging.ConversationManager;
@@ -59,6 +57,7 @@ import java.util.logging.Logger;
import javax.inject.Inject;
import static android.support.v4.app.ActivityOptionsCompat.makeSceneTransitionAnimation;
+import static android.support.v4.view.ViewCompat.getTransitionName;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.WARNING;
import static org.briarproject.android.BriarActivity.GROUP_ID;
@@ -82,8 +81,6 @@ public class ContactListFragment extends BaseFragment implements EventListener {
@Inject
volatile ContactManager contactManager;
@Inject
- volatile IdentityManager identityManager;
- @Inject
volatile ConversationManager conversationManager;
public static ContactListFragment newInstance() {
@@ -108,12 +105,10 @@ public class ContactListFragment extends BaseFragment implements EventListener {
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
- View contentView =
- inflater.inflate(R.layout.list, container,
- false);
+ View contentView = inflater.inflate(R.layout.list, container, false);
- BaseContactListAdapter.OnItemClickListener onItemClickListener =
- new ContactListAdapter.OnItemClickListener() {
+ OnContactClickListener onContactClickListener =
+ new OnContactClickListener() {
@Override
public void onItemClick(View view, ContactListItem item) {
GroupId groupId = item.getGroupId();
@@ -123,17 +118,17 @@ public class ContactListFragment extends BaseFragment implements EventListener {
// work-around for android bug #224270
if (Build.VERSION.SDK_INT >= 23) {
- ContactListAdapter.ContactHolder holder =
- (ContactListAdapter.ContactHolder) list
+ ContactListItemViewHolder holder =
+ (ContactListItemViewHolder) list
.getRecyclerView()
.findViewHolderForAdapterPosition(
adapter.findItemPosition(
item));
Pair avatar =
- Pair.create((View) holder.avatar, ViewCompat
- .getTransitionName(holder.avatar));
+ Pair.create((View) holder.avatar,
+ getTransitionName(holder.avatar));
Pair bulb =
- Pair.create((View) holder.bulb, ViewCompat.
+ Pair.create((View) holder.bulb,
getTransitionName(holder.bulb));
ActivityOptionsCompat options =
makeSceneTransitionAnimation(getActivity(),
@@ -145,8 +140,7 @@ public class ContactListFragment extends BaseFragment implements EventListener {
}
}
};
-
- adapter = new ContactListAdapter(getContext(), onItemClickListener);
+ adapter = new ContactListAdapter(getContext(), onContactClickListener);
list = (BriarRecyclerView) contentView.findViewById(R.id.list);
list.setLayoutManager(new LinearLayoutManager(getContext()));
list.setAdapter(adapter);
@@ -212,10 +206,8 @@ public class ContactListFragment extends BaseFragment implements EventListener {
conversationManager.getGroupCount(id);
boolean connected =
connectionRegistry.isConnected(c.getId());
- LocalAuthor localAuthor = identityManager
- .getLocalAuthor(c.getLocalAuthorId());
- contacts.add(new ContactListItem(c, localAuthor,
- connected, groupId, count));
+ contacts.add(new ContactListItem(c, connected,
+ groupId, count));
} catch (NoSuchContactException e) {
// Continue
}
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListItem.java b/briar-android/src/org/briarproject/android/contact/ContactListItem.java
index e9c9e568b..19808d982 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListItem.java
@@ -2,63 +2,40 @@ package org.briarproject.android.contact;
import org.briarproject.api.clients.MessageTracker.GroupCount;
import org.briarproject.api.contact.Contact;
-import org.briarproject.api.identity.LocalAuthor;
+import org.briarproject.api.nullsafety.NotNullByDefault;
import org.briarproject.api.sync.GroupId;
-import org.jetbrains.annotations.NotNull;
import javax.annotation.concurrent.NotThreadSafe;
@NotThreadSafe
-public class ContactListItem {
+@NotNullByDefault
+public class ContactListItem extends ContactItem {
- private final Contact contact;
- private final LocalAuthor localAuthor;
private final GroupId groupId;
- private boolean connected, empty;
+ private boolean empty;
private long timestamp;
private int unread;
- public ContactListItem(@NotNull Contact contact,
- @NotNull LocalAuthor localAuthor, boolean connected,
- @NotNull GroupId groupId, @NotNull GroupCount count) {
- this.contact = contact;
- this.localAuthor = localAuthor;
+ public ContactListItem(Contact contact, boolean connected, GroupId groupId,
+ GroupCount count) {
+ super(contact, connected);
this.groupId = groupId;
- this.connected = connected;
this.empty = count.getMsgCount() == 0;
this.unread = count.getUnreadCount();
this.timestamp = count.getLatestMsgTime();
}
void addMessage(ConversationItem message) {
- empty = empty && message == null;
- if (message != null) {
- if (message.getTime() > timestamp) timestamp = message.getTime();
- if (!message.isRead())
- unread++;
- }
- }
-
- public Contact getContact() {
- return contact;
- }
-
- public LocalAuthor getLocalAuthor() {
- return localAuthor;
+ empty = false;
+ if (message.getTime() > timestamp) timestamp = message.getTime();
+ if (!message.isRead())
+ unread++;
}
GroupId getGroupId() {
return groupId;
}
- boolean isConnected() {
- return connected;
- }
-
- void setConnected(boolean connected) {
- this.connected = connected;
- }
-
boolean isEmpty() {
return empty;
}
@@ -70,4 +47,5 @@ public class ContactListItem {
int getUnreadCount() {
return unread;
}
-}
\ No newline at end of file
+
+}
diff --git a/briar-android/src/org/briarproject/android/contact/ContactListItemViewHolder.java b/briar-android/src/org/briarproject/android/contact/ContactListItemViewHolder.java
new file mode 100644
index 000000000..6e4652618
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/contact/ContactListItemViewHolder.java
@@ -0,0 +1,74 @@
+package org.briarproject.android.contact;
+
+import android.support.annotation.UiThread;
+import android.view.View;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+import org.briarproject.R;
+import org.briarproject.android.contact.BaseContactListAdapter.OnContactClickListener;
+import org.briarproject.api.nullsafety.NotNullByDefault;
+import org.briarproject.api.sync.GroupId;
+import org.jetbrains.annotations.Nullable;
+
+import static android.support.v4.view.ViewCompat.setTransitionName;
+import static org.briarproject.android.util.AndroidUtils.formatDate;
+import static org.briarproject.util.StringUtils.toHexString;
+
+@UiThread
+@NotNullByDefault
+class ContactListItemViewHolder extends ContactItemViewHolder {
+
+ protected final ImageView bulb;
+ private final TextView unread;
+ private final TextView date;
+
+ public ContactListItemViewHolder(View v) {
+ super(v);
+ bulb = (ImageView) v.findViewById(R.id.bulbView);
+ unread = (TextView) v.findViewById(R.id.unreadCountView);
+ date = (TextView) v.findViewById(R.id.dateView);
+ }
+
+ @Override
+ protected void bind(ContactListItem item, @Nullable
+ OnContactClickListener listener) {
+ super.bind(item, listener);
+
+ // unread count
+ int unreadCount = item.getUnreadCount();
+ if (unreadCount > 0) {
+ unread.setText(String.valueOf(unreadCount));
+ unread.setVisibility(View.VISIBLE);
+ } else {
+ unread.setVisibility(View.INVISIBLE);
+ }
+
+ // date of last message
+ if (item.isEmpty()) {
+ date.setText(R.string.date_no_private_messages);
+ } else {
+ long timestamp = item.getTimestamp();
+ date.setText(formatDate(date.getContext(), timestamp));
+ }
+
+ // online/offline
+ if (item.isConnected()) {
+ bulb.setImageResource(R.drawable.contact_connected);
+ } else {
+ bulb.setImageResource(R.drawable.contact_disconnected);
+ }
+
+ setTransitionName(avatar, getAvatarTransitionName(item.getGroupId()));
+ setTransitionName(bulb, getBulbTransitionName(item.getGroupId()));
+ }
+
+ private String getAvatarTransitionName(GroupId g) {
+ return "avatar" + toHexString(g.getBytes());
+ }
+
+ private String getBulbTransitionName(GroupId g) {
+ return "bulb" + toHexString(g.getBytes());
+ }
+
+}
diff --git a/briar-android/src/org/briarproject/android/introduction/ContactChooserAdapter.java b/briar-android/src/org/briarproject/android/introduction/ContactChooserAdapter.java
deleted file mode 100644
index e291302b8..000000000
--- a/briar-android/src/org/briarproject/android/introduction/ContactChooserAdapter.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.briarproject.android.introduction;
-
-import android.content.Context;
-import android.support.annotation.UiThread;
-import android.view.View;
-
-import org.briarproject.android.contact.ContactListAdapter;
-import org.briarproject.android.contact.ContactListItem;
-import org.briarproject.api.identity.AuthorId;
-
-@UiThread
-class ContactChooserAdapter extends ContactListAdapter {
-
- private AuthorId localAuthorId;
-
- ContactChooserAdapter(Context context, OnItemClickListener listener) {
- super(context, listener);
- }
-
- @Override
- public void onBindViewHolder(final ContactHolder ui, final int position) {
- super.onBindViewHolder(ui, position);
-
- final ContactListItem item = getItemAt(position);
- if (item == null) return;
-
- ui.name.setText(item.getContact().getAuthor().getName());
-
- ui.identity.setText(item.getLocalAuthor().getName());
- ui.identity.setVisibility(View.VISIBLE);
-
- if (!item.getLocalAuthor().getId().equals(localAuthorId)) {
- grayOutItem(ui);
- }
- }
-
- @Override
- public int compare(ContactListItem c1, ContactListItem c2) {
- return compareByName(c1, c2);
- }
-
- /**
- * Set the identity from whose perspective the contact shall be chosen.
- * Contacts that belong to a different author will be shown grayed out,
- * but are still clickable.
- *
- * @param authorId The ID of the local Author
- */
- void setLocalAuthor(AuthorId authorId) {
- localAuthorId = authorId;
- notifyDataSetChanged();
- }
-
- private void grayOutItem(final ContactHolder ui) {
- float alpha = 0.25f;
- ui.bulb.setAlpha(alpha);
- ui.avatar.setAlpha(alpha);
- ui.name.setAlpha(alpha);
- ui.date.setAlpha(alpha);
- ui.identity.setAlpha(alpha);
- }
-
-}
diff --git a/briar-android/src/org/briarproject/android/introduction/ContactChooserFragment.java b/briar-android/src/org/briarproject/android/introduction/ContactChooserFragment.java
index 888cc61e7..4e939d2b2 100644
--- a/briar-android/src/org/briarproject/android/introduction/ContactChooserFragment.java
+++ b/briar-android/src/org/briarproject/android/introduction/ContactChooserFragment.java
@@ -1,10 +1,8 @@
package org.briarproject.android.introduction;
import android.content.Context;
-import android.content.DialogInterface;
import android.os.Build;
import android.os.Bundle;
-import android.support.v7.app.AlertDialog;
import android.support.v7.widget.LinearLayoutManager;
import android.transition.Fade;
import android.view.LayoutInflater;
@@ -13,6 +11,7 @@ import android.view.ViewGroup;
import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
+import org.briarproject.android.contact.BaseContactListAdapter.OnContactClickListener;
import org.briarproject.android.contact.ContactListAdapter;
import org.briarproject.android.contact.ContactListItem;
import org.briarproject.android.fragment.BaseFragment;
@@ -22,9 +21,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.identity.AuthorId;
-import org.briarproject.api.identity.IdentityManager;
-import org.briarproject.api.identity.LocalAuthor;
import org.briarproject.api.messaging.ConversationManager;
import org.briarproject.api.plugins.ConnectionRegistry;
import org.briarproject.api.sync.GroupId;
@@ -44,7 +40,7 @@ public class ContactChooserFragment extends BaseFragment {
private IntroductionActivity introductionActivity;
private BriarRecyclerView list;
- private ContactChooserAdapter adapter;
+ private ContactListAdapter adapter;
private ContactId contactId;
// Fields that are accessed from background threads must be volatile
@@ -52,8 +48,6 @@ public class ContactChooserFragment extends BaseFragment {
@Inject
volatile ContactManager contactManager;
@Inject
- volatile IdentityManager identityManager;
- @Inject
volatile ConversationManager conversationManager;
@Inject
volatile ConnectionRegistry connectionRegistry;
@@ -83,22 +77,16 @@ public class ContactChooserFragment extends BaseFragment {
setExitTransition(new Fade());
}
- ContactListAdapter.OnItemClickListener onItemClickListener =
- new ContactListAdapter.OnItemClickListener() {
+ OnContactClickListener onContactClickListener =
+ new OnContactClickListener() {
@Override
public void onItemClick(View view, ContactListItem item) {
if (c1 == null) throw new IllegalStateException();
Contact c2 = item.getContact();
- if (!c1.getLocalAuthorId()
- .equals(c2.getLocalAuthorId())) {
- warnAboutDifferentIdentities(view, c1, c2);
- } else {
- introductionActivity.showMessageScreen(view, c1,
- c2);
- }
+ introductionActivity.showMessageScreen(view, c1, c2);
}
};
- adapter = new ContactChooserAdapter(getActivity(), onItemClickListener);
+ adapter = new ContactListAdapter(getActivity(), onContactClickListener);
list = (BriarRecyclerView) contentView.findViewById(R.id.list);
list.setLayoutManager(new LinearLayoutManager(getActivity()));
@@ -139,8 +127,6 @@ public class ContactChooserFragment extends BaseFragment {
public void run() {
try {
List contacts = new ArrayList<>();
- AuthorId localAuthorId =
- identityManager.getLocalAuthor().getId();
for (Contact c : contactManager.getActiveContacts()) {
if (c.getId().equals(contactId)) {
c1 = c;
@@ -152,13 +138,11 @@ public class ContactChooserFragment extends BaseFragment {
conversationManager.getGroupCount(id);
boolean connected =
connectionRegistry.isConnected(c.getId());
- LocalAuthor localAuthor = identityManager
- .getLocalAuthor(c.getLocalAuthorId());
- contacts.add(new ContactListItem(c, localAuthor,
- connected, groupId, count));
+ contacts.add(new ContactListItem(c, connected,
+ groupId, count));
}
}
- displayContacts(localAuthorId, contacts);
+ displayContacts(contacts);
} catch (DbException e) {
if (LOG.isLoggable(WARNING))
LOG.log(WARNING, e.toString(), e);
@@ -167,37 +151,14 @@ public class ContactChooserFragment extends BaseFragment {
});
}
- private void displayContacts(final AuthorId localAuthorId,
- final List contacts) {
+ private void displayContacts(final List contacts) {
introductionActivity.runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
- adapter.setLocalAuthor(localAuthorId);
if (contacts.isEmpty()) list.showData();
else adapter.addAll(contacts);
}
});
}
- private void warnAboutDifferentIdentities(final View view, final Contact c1,
- final Contact c2) {
-
- DialogInterface.OnClickListener okListener =
- new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- introductionActivity.showMessageScreen(view, c1, c2);
- }
- };
- AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(),
- R.style.BriarDialogTheme);
- builder.setTitle(getString(
- R.string.introduction_warn_different_identities_title));
- builder.setMessage(getString(
- R.string.introduction_warn_different_identities_text));
- builder.setPositiveButton(R.string.dialog_button_introduce, okListener);
- builder.setNegativeButton(android.R.string.cancel, null);
- builder.show();
- }
-
}
diff --git a/briar-android/src/org/briarproject/android/introduction/IntroductionActivity.java b/briar-android/src/org/briarproject/android/introduction/IntroductionActivity.java
index aeada3f1d..8e9d5c389 100644
--- a/briar-android/src/org/briarproject/android/introduction/IntroductionActivity.java
+++ b/briar-android/src/org/briarproject/android/introduction/IntroductionActivity.java
@@ -13,12 +13,12 @@ import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
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;
-// TODO extend the BriarFragmentActivity ?
-public class IntroductionActivity extends BriarActivity implements
- BaseFragment.BaseFragmentListener {
+public class IntroductionActivity extends BriarActivity
+ implements BaseFragmentListener {
public static final String CONTACT_ID = "briar.CONTACT_ID";
diff --git a/briar-android/src/org/briarproject/android/sharing/ContactSelectorAdapter.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorAdapter.java
index 0d4d68912..9573c6398 100644
--- a/briar-android/src/org/briarproject/android/sharing/ContactSelectorAdapter.java
+++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorAdapter.java
@@ -4,8 +4,6 @@ import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.widget.CheckBox;
-import android.widget.TextView;
import org.briarproject.R;
import org.briarproject.android.contact.BaseContactListAdapter;
@@ -14,16 +12,12 @@ import org.briarproject.api.contact.ContactId;
import java.util.ArrayList;
import java.util.Collection;
-import static android.view.View.GONE;
-import static android.view.View.VISIBLE;
-
-class ContactSelectorAdapter
- extends BaseContactListAdapter {
+class ContactSelectorAdapter extends
+ BaseContactListAdapter {
ContactSelectorAdapter(Context context,
- OnItemClickListener listener) {
-
- super(context, listener);
+ OnContactClickListener listener) {
+ super(context, SelectableContactItem.class, listener);
}
@Override
@@ -31,66 +25,17 @@ class ContactSelectorAdapter
int i) {
View v = LayoutInflater.from(ctx).inflate(
R.layout.list_item_selectable_contact, viewGroup, false);
-
return new SelectableContactHolder(v);
}
- @Override
- public void onBindViewHolder(SelectableContactHolder ui, int position) {
- super.onBindViewHolder(ui, position);
-
- SelectableContactListItem item =
- (SelectableContactListItem) getItemAt(position);
- if (item == null) return;
-
- if (item.isSelected()) {
- ui.checkBox.setChecked(true);
- } else {
- ui.checkBox.setChecked(false);
- }
-
- if (item.isDisabled()) {
- // we share this forum already with that contact
- ui.layout.setEnabled(false);
- ui.shared.setVisibility(VISIBLE);
- grayOutItem(ui, true);
- } else {
- ui.layout.setEnabled(true);
- ui.shared.setVisibility(GONE);
- grayOutItem(ui, false);
- }
- }
-
Collection getSelectedContactIds() {
Collection selected = new ArrayList<>();
for (int i = 0; i < items.size(); i++) {
- SelectableContactListItem item =
- (SelectableContactListItem) items.get(i);
+ SelectableContactItem item = items.get(i);
if (item.isSelected()) selected.add(item.getContact().getId());
}
-
return selected;
}
- static class SelectableContactHolder
- extends BaseContactListAdapter.BaseContactHolder {
-
- private final CheckBox checkBox;
- private final TextView shared;
-
- private SelectableContactHolder(View v) {
- super(v);
-
- checkBox = (CheckBox) v.findViewById(R.id.checkBox);
- shared = (TextView) v.findViewById(R.id.infoView);
- }
- }
-
- private void grayOutItem(SelectableContactHolder ui, boolean gray) {
- float alpha = gray ? 0.25f : 1f;
- ui.avatar.setAlpha(alpha);
- ui.name.setAlpha(alpha);
- ui.checkBox.setAlpha(alpha);
- }
}
diff --git a/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java b/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java
index 03e4da397..cc8f46230 100644
--- a/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java
+++ b/briar-android/src/org/briarproject/android/sharing/ContactSelectorFragment.java
@@ -15,16 +15,14 @@ import android.view.ViewGroup;
import org.briarproject.R;
import org.briarproject.android.ActivityComponent;
-import org.briarproject.android.contact.BaseContactListAdapter;
-import org.briarproject.android.contact.ContactListItem;
+import org.briarproject.android.contact.BaseContactListAdapter.OnContactClickListener;
import org.briarproject.android.fragment.BaseFragment;
import org.briarproject.android.view.BriarRecyclerView;
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.identity.IdentityManager;
-import org.briarproject.api.identity.LocalAuthor;
+import org.briarproject.api.plugins.ConnectionRegistry;
import org.briarproject.api.sync.GroupId;
import java.util.ArrayList;
@@ -41,8 +39,8 @@ import static org.briarproject.android.sharing.ShareActivity.getContactsFromIds;
import static org.briarproject.android.sharing.ShareActivity.getContactsFromIntegers;
import static org.briarproject.api.sharing.SharingConstants.GROUP_ID;
-public class ContactSelectorFragment extends BaseFragment implements
- BaseContactListAdapter.OnItemClickListener {
+public class ContactSelectorFragment extends BaseFragment
+ implements OnContactClickListener {
public static final String TAG = ContactSelectorFragment.class.getName();
private static final Logger LOG = Logger.getLogger(TAG);
@@ -56,7 +54,7 @@ public class ContactSelectorFragment extends BaseFragment implements
@Inject
volatile ContactManager contactManager;
@Inject
- volatile IdentityManager identityManager;
+ volatile ConnectionRegistry connectionRegistry;
private volatile GroupId groupId;
private volatile ContactSelectorListener listener;
@@ -115,7 +113,6 @@ public class ContactSelectorFragment extends BaseFragment implements
selectedContacts = getContactsFromIntegers(intContacts);
}
}
-
return contentView;
}
@@ -170,8 +167,8 @@ public class ContactSelectorFragment extends BaseFragment implements
}
@Override
- public void onItemClick(View view, ContactListItem item) {
- ((SelectableContactListItem) item).toggleSelected();
+ public void onItemClick(View view, SelectableContactItem item) {
+ item.toggleSelected();
adapter.notifyItemChanged(adapter.findItemPosition(item), item);
updateMenuItem();
@@ -183,18 +180,19 @@ public class ContactSelectorFragment extends BaseFragment implements
public void run() {
try {
long now = System.currentTimeMillis();
- List contacts = new ArrayList<>();
-
+ List contacts =
+ new ArrayList<>();
for (Contact c : contactManager.getActiveContacts()) {
- LocalAuthor localAuthor = identityManager
- .getLocalAuthor(c.getLocalAuthorId());
+ // is this contact online?
+ boolean connected =
+ connectionRegistry.isConnected(c.getId());
// was this contact already selected?
boolean selected = selection != null &&
selection.contains(c.getId());
// do we have already some sharing with that contact?
boolean disabled = listener.isDisabled(groupId, c);
- contacts.add(new SelectableContactListItem(c,
- localAuthor, groupId, selected, disabled));
+ contacts.add(new SelectableContactItem(c, connected,
+ selected, disabled));
}
long duration = System.currentTimeMillis() - now;
if (LOG.isLoggable(INFO))
@@ -208,7 +206,8 @@ public class ContactSelectorFragment extends BaseFragment implements
});
}
- private void displayContacts(final List contacts) {
+ private void displayContacts(
+ final List contacts) {
listener.runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
diff --git a/briar-android/src/org/briarproject/android/sharing/SelectableContactHolder.java b/briar-android/src/org/briarproject/android/sharing/SelectableContactHolder.java
new file mode 100644
index 000000000..9f0eddfe8
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/sharing/SelectableContactHolder.java
@@ -0,0 +1,61 @@
+package org.briarproject.android.sharing;
+
+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 android.view.View.GONE;
+import static android.view.View.VISIBLE;
+
+@UiThread
+@NotNullByDefault
+class SelectableContactHolder
+ extends ContactItemViewHolder {
+
+ private final CheckBox checkBox;
+ private final TextView shared;
+
+ SelectableContactHolder(View v) {
+ super(v);
+ checkBox = (CheckBox) v.findViewById(R.id.checkBox);
+ shared = (TextView) v.findViewById(R.id.infoView);
+ }
+
+ @Override
+ protected void bind(SelectableContactItem item, @Nullable
+ OnContactClickListener 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);
+ } else {
+ layout.setEnabled(true);
+ shared.setVisibility(GONE);
+ grayOutItem(false);
+ }
+ }
+
+ 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/sharing/SelectableContactItem.java b/briar-android/src/org/briarproject/android/sharing/SelectableContactItem.java
new file mode 100644
index 000000000..8bd5edf93
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/sharing/SelectableContactItem.java
@@ -0,0 +1,34 @@
+package org.briarproject.android.sharing;
+
+import org.briarproject.android.contact.ContactItem;
+import org.briarproject.api.contact.Contact;
+import org.briarproject.api.nullsafety.NotNullByDefault;
+
+import javax.annotation.concurrent.NotThreadSafe;
+
+@NotThreadSafe
+@NotNullByDefault
+public class SelectableContactItem extends ContactItem {
+
+ private boolean selected, disabled;
+
+ public SelectableContactItem(Contact contact, boolean connected,
+ boolean selected, boolean disabled) {
+ super(contact, connected);
+ this.selected = selected;
+ this.disabled = disabled;
+ }
+
+ public boolean isSelected() {
+ return selected;
+ }
+
+ public void toggleSelected() {
+ selected = !selected;
+ }
+
+ public boolean isDisabled() {
+ return disabled;
+ }
+
+}
diff --git a/briar-android/src/org/briarproject/android/sharing/SelectableContactListItem.java b/briar-android/src/org/briarproject/android/sharing/SelectableContactListItem.java
deleted file mode 100644
index 8e76d39e7..000000000
--- a/briar-android/src/org/briarproject/android/sharing/SelectableContactListItem.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.briarproject.android.sharing;
-
-import android.support.annotation.UiThread;
-
-import org.briarproject.android.contact.ContactListItem;
-import org.briarproject.api.clients.MessageTracker.GroupCount;
-import org.briarproject.api.contact.Contact;
-import org.briarproject.api.identity.LocalAuthor;
-import org.briarproject.api.sync.GroupId;
-
-// This class is NOT thread-safe
-public class SelectableContactListItem extends ContactListItem {
-
- private boolean selected, disabled;
-
- public SelectableContactListItem(Contact contact, LocalAuthor localAuthor,
- GroupId groupId, boolean selected, boolean disabled) {
-
- super(contact, localAuthor, false, groupId, new GroupCount(0, 0, 0));
-
- this.selected = selected;
- this.disabled = disabled;
- }
-
- public void setSelected(boolean selected) {
- this.selected = selected;
- }
-
- public boolean isSelected() {
- return selected;
- }
-
- public void toggleSelected() {
- selected = !selected;
- }
-
- public boolean isDisabled() {
- return disabled;
- }
-}
diff --git a/briar-android/src/org/briarproject/android/sharing/SharingStatusActivity.java b/briar-android/src/org/briarproject/android/sharing/SharingStatusActivity.java
index 377b10d71..f1a7bda25 100644
--- a/briar-android/src/org/briarproject/android/sharing/SharingStatusActivity.java
+++ b/briar-android/src/org/briarproject/android/sharing/SharingStatusActivity.java
@@ -7,13 +7,11 @@ import android.view.MenuItem;
import org.briarproject.R;
import org.briarproject.android.BriarActivity;
-import org.briarproject.android.contact.ContactListItem;
+import org.briarproject.android.contact.ContactItem;
import org.briarproject.android.view.BriarRecyclerView;
-import org.briarproject.api.clients.MessageTracker.GroupCount;
import org.briarproject.api.contact.Contact;
import org.briarproject.api.db.DbException;
-import org.briarproject.api.identity.IdentityManager;
-import org.briarproject.api.identity.LocalAuthor;
+import org.briarproject.api.plugins.ConnectionRegistry;
import org.briarproject.api.sync.GroupId;
import java.util.ArrayList;
@@ -36,7 +34,7 @@ abstract class SharingStatusActivity extends BriarActivity {
// Fields that are accessed from background threads must be volatile
@Inject
- volatile IdentityManager identityManager;
+ volatile ConnectionRegistry connectionRegistry;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -109,13 +107,11 @@ abstract class SharingStatusActivity extends BriarActivity {
@Override
public void run() {
try {
- List contactItems = new ArrayList<>();
+ List contactItems = new ArrayList<>();
for (Contact c : getSharedBy()) {
- LocalAuthor localAuthor = identityManager
- .getLocalAuthor(c.getLocalAuthorId());
- ContactListItem item =
- new ContactListItem(c, localAuthor, false,
- groupId, new GroupCount(0, 0, 0));
+ boolean isConnected =
+ connectionRegistry.isConnected(c.getId());
+ ContactItem item = new ContactItem(c, isConnected);
contactItems.add(item);
}
displaySharedBy(contactItems);
@@ -127,7 +123,7 @@ abstract class SharingStatusActivity extends BriarActivity {
});
}
- private void displaySharedBy(final List contacts) {
+ private void displaySharedBy(final List contacts) {
runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
@@ -142,13 +138,11 @@ abstract class SharingStatusActivity extends BriarActivity {
@Override
public void run() {
try {
- List contactItems = new ArrayList<>();
+ List contactItems = new ArrayList<>();
for (Contact c : getSharedWith()) {
- LocalAuthor localAuthor = identityManager
- .getLocalAuthor(c.getLocalAuthorId());
- ContactListItem item =
- new ContactListItem(c, localAuthor, false,
- groupId, new GroupCount(0, 0, 0));
+ boolean isConnected =
+ connectionRegistry.isConnected(c.getId());
+ ContactItem item = new ContactItem(c, isConnected);
contactItems.add(item);
}
displaySharedWith(contactItems);
@@ -160,7 +154,7 @@ abstract class SharingStatusActivity extends BriarActivity {
});
}
- private void displaySharedWith(final List contacts) {
+ private void displaySharedWith(final List contacts) {
runOnUiThreadUnlessDestroyed(new Runnable() {
@Override
public void run() {
diff --git a/briar-android/src/org/briarproject/android/sharing/SharingStatusAdapter.java b/briar-android/src/org/briarproject/android/sharing/SharingStatusAdapter.java
index 5f7dd803d..539d9f81f 100644
--- a/briar-android/src/org/briarproject/android/sharing/SharingStatusAdapter.java
+++ b/briar-android/src/org/briarproject/android/sharing/SharingStatusAdapter.java
@@ -7,20 +7,22 @@ import android.view.ViewGroup;
import org.briarproject.R;
import org.briarproject.android.contact.BaseContactListAdapter;
+import org.briarproject.android.contact.ContactItem;
+import org.briarproject.android.contact.ContactItemViewHolder;
-class SharingStatusAdapter
- extends BaseContactListAdapter {
+class SharingStatusAdapter extends
+ BaseContactListAdapter> {
SharingStatusAdapter(Context context) {
- super(context, null);
+ super(context, ContactItem.class, null);
}
@Override
- public BaseContactHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
+ public ContactItemViewHolder onCreateViewHolder(
+ ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(
R.layout.list_item_contact_small, viewGroup, false);
-
- return new BaseContactHolder(v);
+ return new ContactItemViewHolder<>(v);
}
}