diff --git a/briar-android/res/layout/author_view.xml b/briar-android/res/layout/author_view.xml
new file mode 100644
index 000000000..a3e473dc7
--- /dev/null
+++ b/briar-android/res/layout/author_view.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/briar-android/src/org/briarproject/android/forum/ForumActivity.java b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
index 7f725d40d..a67ebd12e 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumActivity.java
@@ -18,6 +18,7 @@ import org.briarproject.android.util.ElasticHorizontalSpace;
import org.briarproject.android.util.HorizontalBorder;
import org.briarproject.android.util.ListLoadingProgressBar;
import org.briarproject.api.android.AndroidNotificationManager;
+import org.briarproject.api.android.ReferenceManager;
import org.briarproject.api.db.DbException;
import org.briarproject.api.db.NoSuchMessageException;
import org.briarproject.api.db.NoSuchSubscriptionException;
@@ -70,6 +71,8 @@ public class ForumActivity extends BriarActivity implements EventListener,
private ListLoadingProgressBar loading = null;
private ImageButton composeButton = null, shareButton = null;
+ @Inject private ReferenceManager referenceManager;
+
// Fields that are accessed from background threads must be volatile
@Inject private volatile ForumManager forumManager;
@Inject private volatile EventBus eventBus;
@@ -366,7 +369,8 @@ public class ForumActivity extends BriarActivity implements EventListener,
i.putExtra("briar.FORUM_NAME", forum.getName());
i.putExtra("briar.MESSAGE_ID", header.getId().getBytes());
Author author = header.getAuthor();
- if (author != null) i.putExtra("briar.AUTHOR_NAME", author.getName());
+ if (author != null) i.putExtra("briar.AUTHOR_HANDLE",
+ referenceManager.putReference(author, Author.class));
i.putExtra("briar.AUTHOR_STATUS", header.getAuthorStatus().name());
i.putExtra("briar.CONTENT_TYPE", header.getContentType());
i.putExtra("briar.TIMESTAMP", header.getTimestamp());
diff --git a/briar-android/src/org/briarproject/android/forum/ForumAdapter.java b/briar-android/src/org/briarproject/android/forum/ForumAdapter.java
index ac1211447..30ff7d0bf 100644
--- a/briar-android/src/org/briarproject/android/forum/ForumAdapter.java
+++ b/briar-android/src/org/briarproject/android/forum/ForumAdapter.java
@@ -55,8 +55,7 @@ class ForumAdapter extends ArrayAdapter {
AuthorView authorView = new AuthorView(ctx);
authorView.setLayoutParams(WRAP_WRAP_1);
Author author = header.getAuthor();
- if (author == null) authorView.init(null, header.getAuthorStatus());
- else authorView.init(author.getName(), header.getAuthorStatus());
+ authorView.init(author, header.getAuthorStatus());
headerLayout.addView(authorView);
TextView date = new TextView(ctx);
diff --git a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
index 706cb31fe..5ffc8aaa8 100644
--- a/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
+++ b/briar-android/src/org/briarproject/android/forum/ReadForumPostActivity.java
@@ -17,6 +17,7 @@ import org.briarproject.android.util.AuthorView;
import org.briarproject.android.util.ElasticHorizontalSpace;
import org.briarproject.android.util.HorizontalBorder;
import org.briarproject.android.util.LayoutUtils;
+import org.briarproject.api.android.ReferenceManager;
import org.briarproject.api.db.DbException;
import org.briarproject.api.db.NoSuchMessageException;
import org.briarproject.api.forum.ForumManager;
@@ -56,6 +57,8 @@ implements OnClickListener {
private TextView content = null;
private int position = -1;
+ @Inject private ReferenceManager referenceManager;
+
// Fields that are accessed from background threads must be volatile
@Inject private volatile ForumManager forumManager;
private volatile MessageId messageId = null;
@@ -82,7 +85,9 @@ implements OnClickListener {
if (minTimestamp == -1) throw new IllegalStateException();
position = i.getIntExtra("briar.POSITION", -1);
if (position == -1) throw new IllegalStateException();
- String authorName = i.getStringExtra("briar.AUTHOR_NAME");
+ long authorHandle = i.getLongExtra("briar.AUTHOR_HANDLE", -1);
+ if (authorHandle == -1) throw new IllegalStateException();
+ Author author = referenceManager.removeReference(authorHandle, Author.class);
String s = i.getStringExtra("briar.AUTHOR_STATUS");
if (s == null) throw new IllegalStateException();
Author.Status authorStatus = Author.Status.valueOf(s);
@@ -102,10 +107,10 @@ implements OnClickListener {
header.setOrientation(HORIZONTAL);
header.setGravity(CENTER_VERTICAL);
- AuthorView author = new AuthorView(this);
- author.setLayoutParams(WRAP_WRAP_1);
- author.init(authorName, authorStatus);
- header.addView(author);
+ AuthorView authorView = new AuthorView(this);
+ authorView.setLayoutParams(WRAP_WRAP_1);
+ authorView.init(author, authorStatus);
+ header.addView(authorView);
int pad = LayoutUtils.getPadding(this);
diff --git a/briar-android/src/org/briarproject/android/util/AuthorView.java b/briar-android/src/org/briarproject/android/util/AuthorView.java
index 152a801b9..166e8d63b 100644
--- a/briar-android/src/org/briarproject/android/util/AuthorView.java
+++ b/briar-android/src/org/briarproject/android/util/AuthorView.java
@@ -1,42 +1,62 @@
package org.briarproject.android.util;
import android.content.Context;
+import android.util.AttributeSet;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.FrameLayout;
import android.widget.ImageView;
-import android.widget.RelativeLayout;
import android.widget.TextView;
import org.briarproject.R;
import org.briarproject.api.identity.Author;
-import static android.text.TextUtils.TruncateAt.END;
+import im.delight.android.identicons.IdenticonView;
-public class AuthorView extends RelativeLayout {
+public class AuthorView extends FrameLayout {
+
+ private IdenticonView identiconView;
+ private TextView nameView;
+ private ImageView statusView;
public AuthorView(Context ctx) {
super(ctx);
+
+ initViews();
}
- public void init(String name, Author.Status status) {
- Context ctx = getContext();
- int pad = LayoutUtils.getPadding(ctx);
+ public AuthorView(Context context, AttributeSet attrs) {
+ super(context, attrs);
- TextView nameView = new TextView(ctx);
- nameView.setId(1);
- nameView.setTextSize(18);
- nameView.setSingleLine();
- nameView.setEllipsize(END);
- nameView.setPadding(pad, pad, pad, pad);
- if (name == null) nameView.setText(R.string.anonymous);
- else nameView.setText(name);
- LayoutParams leftOf = CommonLayoutParams.relative();
- leftOf.addRule(ALIGN_PARENT_LEFT);
- leftOf.addRule(CENTER_VERTICAL);
- leftOf.addRule(LEFT_OF, 2);
- addView(nameView, leftOf);
+ initViews();
+ }
+
+ public AuthorView(Context context, AttributeSet attrs,
+ int defStyle) {
+ super(context, attrs, defStyle);
+
+ initViews();
+ }
+
+ private void initViews() {
+ if (isInEditMode())
+ return;
+
+ View v = LayoutInflater.from(getContext()).inflate(
+ R.layout.author_view, this, true);
+
+ identiconView = (IdenticonView) v.findViewById(R.id.identiconView);
+ nameView = (TextView) v.findViewById(R.id.nameView);
+ statusView = (ImageView) v.findViewById(R.id.statusView);
+ }
+
+ public void init(Author author, Author.Status status) {
+ if (author == null) nameView.setText(R.string.anonymous);
+ else {
+ identiconView.show(author.getId().getBytes());
+ nameView.setText(author.getName());
+ }
- ImageView statusView = new ImageView(ctx);
- statusView.setId(2);
- statusView.setPadding(0, pad, pad, pad);
switch(status) {
case ANONYMOUS:
statusView.setImageResource(R.drawable.identity_anonymous);
@@ -51,9 +71,5 @@ public class AuthorView extends RelativeLayout {
statusView.setImageResource(R.drawable.identity_verified);
break;
}
- LayoutParams right = CommonLayoutParams.relative();
- right.addRule(ALIGN_PARENT_RIGHT);
- right.addRule(CENTER_VERTICAL);
- addView(statusView, right);
}
}