keep reference to previous and next message in message

iNPUTmice created

Change summary

src/eu/siacs/conversations/entities/Conversation.java |  4 
src/eu/siacs/conversations/entities/Message.java      | 36 +++++++++---
src/eu/siacs/conversations/xmpp/XmppConnection.java   |  1 
3 files changed, 28 insertions(+), 13 deletions(-)

Detailed changes

src/eu/siacs/conversations/entities/Conversation.java 🔗

@@ -57,8 +57,8 @@ public class Conversation extends AbstractEntity {
 
 	private String nextPresence;
 
-	private transient ArrayList<Message> messages = new ArrayList<Message>();
-	private transient Account account = null;
+	protected ArrayList<Message> messages = new ArrayList<Message>();
+	protected Account account = null;
 
 	private transient SessionImpl otrSession;
 

src/eu/siacs/conversations/entities/Message.java 🔗

@@ -62,6 +62,9 @@ public class Message extends AbstractEntity {
 	protected Downloadable downloadable = null;
 	public boolean markable = false;
 
+	private Message mNextMessage = null;
+	private Message mPreviousMessage = null;
+
 	private Message() {
 
 	}
@@ -293,21 +296,34 @@ public class Message extends AbstractEntity {
 	}
 
 	public Message next() {
-		int index = this.conversation.getMessages().indexOf(this);
-		if (index < 0 || index >= this.conversation.getMessages().size() - 1) {
-			return null;
-		} else {
-			return this.conversation.getMessages().get(index + 1);
+		if (this.mNextMessage == null) {
+			synchronized (this.conversation.messages) {
+				int index = this.conversation.messages.indexOf(this);
+				if (index < 0
+						|| index >= this.conversation.getMessages().size() - 1) {
+					this.mNextMessage = null;
+				} else {
+					this.mNextMessage = this.conversation.messages
+							.get(index + 1);
+				}
+			}
 		}
+		return this.mNextMessage;
 	}
 
 	public Message prev() {
-		int index = this.conversation.getMessages().indexOf(this);
-		if (index <= 0 || index > this.conversation.getMessages().size()) {
-			return null;
-		} else {
-			return this.conversation.getMessages().get(index - 1);
+		if (this.mPreviousMessage == null) {
+			synchronized (this.conversation.messages) {
+				int index = this.conversation.messages.indexOf(this);
+				if (index <= 0 || index > this.conversation.messages.size()) {
+					this.mPreviousMessage = null;
+				} else {
+					this.mPreviousMessage = this.conversation.messages
+							.get(index - 1);
+				}
+			}
 		}
+		return this.mPreviousMessage;
 	}
 
 	public boolean mergable(Message message) {

src/eu/siacs/conversations/xmpp/XmppConnection.java 🔗

@@ -40,7 +40,6 @@ import android.util.SparseArray;
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.entities.Account;
 import eu.siacs.conversations.services.XmppConnectionService;
-import eu.siacs.conversations.ui.StartConversationActivity;
 import eu.siacs.conversations.utils.CryptoHelper;
 import eu.siacs.conversations.utils.DNSHelper;
 import eu.siacs.conversations.utils.zlib.ZLibOutputStream;