From f7340caec4a3058f1cf4b2213070c3c6eba95db4 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Tue, 12 Apr 2016 12:25:58 -0300
Subject: [PATCH] restructure conversation item classes

---
 .../android/contact/ContactListFragment.java  |  3 +-
 .../android/contact/ConversationActivity.java |  3 +-
 .../android/contact/ConversationAdapter.java  |  8 ++--
 .../ConversationIntroductionInItem.java       | 23 ++--------
 .../contact/ConversationIntroductionItem.java | 29 ++++++++++++
 .../ConversationIntroductionOutItem.java      |  3 +-
 .../android/contact/ConversationItem.java     |  9 ++++
 .../contact/ConversationMessageInItem.java    | 32 +++++++++++++
 .../contact/ConversationMessageItem.java      | 45 +------------------
 .../contact/ConversationMessageOutItem.java   | 43 ++++++++++++++++++
 .../introduction/ContactChooserFragment.java  |  5 +--
 11 files changed, 127 insertions(+), 76 deletions(-)
 create mode 100644 briar-android/src/org/briarproject/android/contact/ConversationIntroductionItem.java
 create mode 100644 briar-android/src/org/briarproject/android/contact/ConversationMessageInItem.java
 create mode 100644 briar-android/src/org/briarproject/android/contact/ConversationMessageOutItem.java

diff --git a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
index f71a93a477..0556310213 100644
--- a/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
+++ b/briar-android/src/org/briarproject/android/contact/ContactListFragment.java
@@ -6,7 +6,6 @@ import android.os.Bundle;
 import android.support.annotation.Nullable;
 import android.support.design.widget.FloatingActionButton;
 import android.support.v4.app.ActivityOptionsCompat;
-import android.support.v7.app.AppCompatActivity;
 import android.support.v7.widget.LinearLayoutManager;
 import android.view.LayoutInflater;
 import android.view.View;
@@ -297,7 +296,7 @@ public class ContactListFragment extends BaseEventFragment {
 		Collection<PrivateMessageHeader> headers =
 				messagingManager.getMessageHeaders(id);
 		for (PrivateMessageHeader h : headers) {
-			messages.add(new ConversationMessageItem(h));
+			messages.add(ConversationItem.from(h));
 		}
 		long duration = System.currentTimeMillis() - now;
 		if (LOG.isLoggable(INFO))
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
index 5e97e2130e..ae09f0a416 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationActivity.java
@@ -304,7 +304,8 @@ public class ConversationActivity extends BriarActivity
 				} else {
 					for (PrivateMessageHeader h : headers) {
 						ConversationMessageItem item =
-								new ConversationMessageItem(h);
+								(ConversationMessageItem) ConversationItem
+										.from(h);
 						byte[] body = bodyCache.get(h.getId());
 						if (body == null) loadMessageBody(h);
 						else item.setBody(body);
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
index de62800d13..e4c2977889 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationAdapter.java
@@ -163,10 +163,10 @@ class ConversationAdapter extends RecyclerView.Adapter {
 
 		PrivateMessageHeader header = item.getHeader();
 
-		if (item.getType() == MSG_OUT) {
-			if (item.isSeen()) {
+		if (item instanceof ConversationItem.OutgoingItem) {
+			if (((OutgoingItem) item).isSeen()) {
 				ui.status.setImageResource(R.drawable.message_delivered_white);
-			} else if (item.isSent()) {
+			} else if (((OutgoingItem) item).isSent()) {
 				ui.status.setImageResource(R.drawable.message_sent_white);
 			} else {
 				ui.status.setImageResource(R.drawable.message_stored_white);
@@ -204,7 +204,7 @@ class ConversationAdapter extends RecyclerView.Adapter {
 	}
 
 	private void bindIntroduction(IntroductionHolder ui,
-			final ConversationIntroductionInItem item, final int position) {
+			final ConversationIntroductionItem item, final int position) {
 
 		final IntroductionRequest ir = item.getIntroductionRequest();
 
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationIntroductionInItem.java b/briar-android/src/org/briarproject/android/contact/ConversationIntroductionInItem.java
index 939f808792..fb891d0a1b 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationIntroductionInItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationIntroductionInItem.java
@@ -3,17 +3,14 @@ package org.briarproject.android.contact;
 import org.briarproject.api.introduction.IntroductionRequest;
 import org.briarproject.api.sync.MessageId;
 
-public class ConversationIntroductionInItem extends ConversationItem implements
-		ConversationItem.IncomingItem {
+public class ConversationIntroductionInItem extends ConversationIntroductionItem
+		implements ConversationItem.IncomingItem {
 
-	private IntroductionRequest ir;
-	private boolean answered, read;
+	private boolean read;
 
 	public ConversationIntroductionInItem(IntroductionRequest ir) {
-		super(ir.getMessageId(), ir.getTime());
+		super(ir);
 
-		this.ir = ir;
-		this.answered = ir.wasAnswered();
 		this.read = ir.isRead();
 	}
 
@@ -22,18 +19,6 @@ public class ConversationIntroductionInItem extends ConversationItem implements
 		return INTRODUCTION_IN;
 	}
 
-	public IntroductionRequest getIntroductionRequest() {
-		return ir;
-	}
-
-	public boolean wasAnswered() {
-		return answered;
-	}
-
-	public void setAnswered(boolean answered) {
-		this.answered = answered;
-	}
-
 	@Override
 	public boolean isRead() {
 		return read;
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationIntroductionItem.java b/briar-android/src/org/briarproject/android/contact/ConversationIntroductionItem.java
new file mode 100644
index 0000000000..e955ea3a47
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/contact/ConversationIntroductionItem.java
@@ -0,0 +1,29 @@
+package org.briarproject.android.contact;
+
+import org.briarproject.api.introduction.IntroductionRequest;
+
+abstract class ConversationIntroductionItem extends ConversationItem {
+
+	private IntroductionRequest ir;
+	private boolean answered;
+
+	public ConversationIntroductionItem(IntroductionRequest ir) {
+		super(ir.getMessageId(), ir.getTime());
+
+		this.ir = ir;
+		this.answered = ir.wasAnswered();
+	}
+
+	public IntroductionRequest getIntroductionRequest() {
+		return ir;
+	}
+
+	public boolean wasAnswered() {
+		return answered;
+	}
+
+	public void setAnswered(boolean answered) {
+		this.answered = answered;
+	}
+
+}
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationIntroductionOutItem.java b/briar-android/src/org/briarproject/android/contact/ConversationIntroductionOutItem.java
index 37f32a83d9..a2aba398f9 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationIntroductionOutItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationIntroductionOutItem.java
@@ -1,7 +1,6 @@
 package org.briarproject.android.contact;
 
 import org.briarproject.api.introduction.IntroductionRequest;
-import org.briarproject.api.sync.MessageId;
 
 /**
  * This class is needed and can not be replaced by an ConversationNoticeOutItem,
@@ -9,7 +8,7 @@ import org.briarproject.api.sync.MessageId;
  * to be displayed as a regular private message.
  */
 public class ConversationIntroductionOutItem
-		extends ConversationIntroductionInItem
+		extends ConversationIntroductionItem
 		implements ConversationItem.OutgoingItem {
 
 	private boolean sent, seen;
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationItem.java b/briar-android/src/org/briarproject/android/contact/ConversationItem.java
index ad037996c4..2c1492a8c3 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationItem.java
@@ -6,11 +6,13 @@ import org.briarproject.R;
 import org.briarproject.api.introduction.IntroductionMessage;
 import org.briarproject.api.introduction.IntroductionRequest;
 import org.briarproject.api.introduction.IntroductionResponse;
+import org.briarproject.api.messaging.PrivateMessageHeader;
 import org.briarproject.api.sync.MessageId;
 
 // This class is not thread-safe
 public abstract class ConversationItem {
 
+	// this is needed for RecyclerView adapter which requires an int type
 	final static int MSG_IN = 0;
 	final static int MSG_IN_UNREAD = 1;
 	final static int MSG_OUT = 2;
@@ -37,6 +39,13 @@ public abstract class ConversationItem {
 		return time;
 	}
 
+	public static ConversationItem from(PrivateMessageHeader h) {
+		if (h.isLocal())
+			return new ConversationMessageOutItem(h);
+		else
+			return new ConversationMessageInItem(h);
+	}
+
 	public static ConversationItem from(IntroductionRequest ir) {
 		if (ir.isLocal()) {
 			return new ConversationIntroductionOutItem(ir);
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationMessageInItem.java b/briar-android/src/org/briarproject/android/contact/ConversationMessageInItem.java
new file mode 100644
index 0000000000..c24f86a128
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/contact/ConversationMessageInItem.java
@@ -0,0 +1,32 @@
+package org.briarproject.android.contact;
+
+import org.briarproject.api.messaging.PrivateMessageHeader;
+
+// This class is not thread-safe
+public class ConversationMessageInItem extends ConversationMessageItem
+		implements ConversationItem.IncomingItem {
+
+	private boolean read;
+
+	public ConversationMessageInItem(PrivateMessageHeader header) {
+		super(header);
+
+		read = header.isRead();
+	}
+
+	@Override
+	int getType() {
+		return MSG_IN;
+	}
+
+	@Override
+	public boolean isRead() {
+		return read;
+	}
+
+	@Override
+	public void setRead(boolean read) {
+		this.read = read;
+	}
+
+}
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationMessageItem.java b/briar-android/src/org/briarproject/android/contact/ConversationMessageItem.java
index 38e5afab0c..db780efbca 100644
--- a/briar-android/src/org/briarproject/android/contact/ConversationMessageItem.java
+++ b/briar-android/src/org/briarproject/android/contact/ConversationMessageItem.java
@@ -1,31 +1,18 @@
 package org.briarproject.android.contact;
 
 import org.briarproject.api.messaging.PrivateMessageHeader;
-import org.briarproject.api.sync.MessageId;
 
 // This class is not thread-safe
-public class ConversationMessageItem extends ConversationItem implements
-		ConversationItem.OutgoingItem, ConversationItem.IncomingItem {
+abstract class ConversationMessageItem extends ConversationItem {
 
 	private final PrivateMessageHeader header;
 	private byte[] body;
-	private boolean sent, seen, read;
 
 	public ConversationMessageItem(PrivateMessageHeader header) {
 		super(header.getId(), header.getTimestamp());
 
 		this.header = header;
 		body = null;
-		sent = header.isSent();
-		seen = header.isSeen();
-		read = header.isRead();
-	}
-
-	@Override
-	int getType() {
-		if (getHeader().isLocal()) return MSG_OUT;
-		if (getHeader().isRead()) return MSG_IN;
-		return MSG_IN_UNREAD;
 	}
 
 	PrivateMessageHeader getHeader() {
@@ -40,34 +27,4 @@ public class ConversationMessageItem extends ConversationItem implements
 		this.body = body;
 	}
 
-	@Override
-	public boolean isSent() {
-		return sent;
-	}
-
-	@Override
-	public void setSent(boolean sent) {
-		this.sent = sent;
-	}
-
-	@Override
-	public boolean isSeen() {
-		return seen;
-	}
-
-	@Override
-	public void setSeen(boolean seen) {
-		this.seen = seen;
-	}
-
-	@Override
-	public boolean isRead() {
-		return read;
-	}
-
-	@Override
-	public void setRead(boolean read) {
-		this.read = read;
-	}
-
 }
diff --git a/briar-android/src/org/briarproject/android/contact/ConversationMessageOutItem.java b/briar-android/src/org/briarproject/android/contact/ConversationMessageOutItem.java
new file mode 100644
index 0000000000..cfdf871afb
--- /dev/null
+++ b/briar-android/src/org/briarproject/android/contact/ConversationMessageOutItem.java
@@ -0,0 +1,43 @@
+package org.briarproject.android.contact;
+
+import org.briarproject.api.messaging.PrivateMessageHeader;
+
+// This class is not thread-safe
+public class ConversationMessageOutItem extends ConversationMessageItem
+		implements ConversationItem.OutgoingItem {
+
+	private boolean sent, seen;
+
+	public ConversationMessageOutItem(PrivateMessageHeader header) {
+		super(header);
+
+		sent = header.isSent();
+		seen = header.isSeen();
+	}
+
+	@Override
+	int getType() {
+		return MSG_OUT;
+	}
+
+	@Override
+	public boolean isSent() {
+		return sent;
+	}
+
+	@Override
+	public void setSent(boolean sent) {
+		this.sent = sent;
+	}
+
+	@Override
+	public boolean isSeen() {
+		return seen;
+	}
+
+	@Override
+	public void setSeen(boolean seen) {
+		this.seen = seen;
+	}
+
+}
diff --git a/briar-android/src/org/briarproject/android/introduction/ContactChooserFragment.java b/briar-android/src/org/briarproject/android/introduction/ContactChooserFragment.java
index 4fcdbdd555..ec5c276797 100644
--- a/briar-android/src/org/briarproject/android/introduction/ContactChooserFragment.java
+++ b/briar-android/src/org/briarproject/android/introduction/ContactChooserFragment.java
@@ -6,19 +6,16 @@ import android.os.Build;
 import android.os.Bundle;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.LinearLayoutManager;
-import android.transition.ChangeBounds;
 import android.transition.Fade;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
-import android.widget.Toast;
 
 import org.briarproject.R;
 import org.briarproject.android.AndroidComponent;
 import org.briarproject.android.contact.ContactListAdapter;
 import org.briarproject.android.contact.ContactListItem;
 import org.briarproject.android.contact.ConversationItem;
-import org.briarproject.android.contact.ConversationMessageItem;
 import org.briarproject.android.fragment.BaseFragment;
 import org.briarproject.android.util.BriarRecyclerView;
 import org.briarproject.api.contact.Contact;
@@ -218,7 +215,7 @@ public class ContactChooserFragment extends BaseFragment {
 		Collection<PrivateMessageHeader> headers =
 				messagingManager.getMessageHeaders(id);
 		for (PrivateMessageHeader h : headers) {
-			messages.add(new ConversationMessageItem(h));
+			messages.add(ConversationItem.from(h));
 		}
 		long duration = System.currentTimeMillis() - now;
 		if (LOG.isLoggable(INFO))
-- 
GitLab