aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/de/pixart/messenger/entities/Conversation.java
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2018-04-08 21:40:15 +0200
committerChristian Schneppe <christian@pix-art.de>2018-04-08 21:52:12 +0200
commitb8718ac71c572cb7d9fecc2c1c149b563ef1c354 (patch)
tree58fdcd0195b2a6e96c5327476e6dc14679d661df /src/main/java/de/pixart/messenger/entities/Conversation.java
parent8d2ae354e79345bf837fe68c831ab2dc1f9d74ea (diff)
show message draft in conversation overview
Diffstat (limited to 'src/main/java/de/pixart/messenger/entities/Conversation.java')
-rw-r--r--src/main/java/de/pixart/messenger/entities/Conversation.java213
1 files changed, 121 insertions, 92 deletions
diff --git a/src/main/java/de/pixart/messenger/entities/Conversation.java b/src/main/java/de/pixart/messenger/entities/Conversation.java
index 3f66f93b6..8e8d2a28a 100644
--- a/src/main/java/de/pixart/messenger/entities/Conversation.java
+++ b/src/main/java/de/pixart/messenger/entities/Conversation.java
@@ -3,6 +3,8 @@ package de.pixart.messenger.entities;
import android.content.ContentValues;
import android.database.Cursor;
import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
import net.java.otr4j.OtrException;
import net.java.otr4j.crypto.OtrCryptoException;
@@ -26,7 +28,6 @@ import java.util.concurrent.atomic.AtomicBoolean;
import de.pixart.messenger.Config;
import de.pixart.messenger.crypto.PgpDecryptionService;
import de.pixart.messenger.crypto.axolotl.AxolotlService;
-import de.pixart.messenger.services.XmppConnectionService;
import de.pixart.messenger.xmpp.chatstate.ChatState;
import de.pixart.messenger.xmpp.mam.MamReference;
import rocks.xmpp.addr.Jid;
@@ -50,14 +51,17 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
public static final String MODE = "mode";
public static final String ATTRIBUTES = "attributes";
- private static final String ATTRIBUTE_NEXT_ENCRYPTION = "next_encryption";
- static final String ATTRIBUTE_MUC_PASSWORD = "muc_password";
public static final String ATTRIBUTE_MUTED_TILL = "muted_till";
public static final String ATTRIBUTE_ALWAYS_NOTIFY = "always_notify";
- private static final String ATTRIBUTE_CRYPTO_TARGETS = "crypto_targets";
public static final String ATTRIBUTE_LAST_CLEAR_HISTORY = "last_clear_history";
- public static final String ATTRIBUTE_NEXT_MESSAGE = "next_message";
-
+ static final String ATTRIBUTE_MUC_PASSWORD = "muc_password";
+ private static final String ATTRIBUTE_NEXT_MESSAGE = "next_message";
+ private static final String ATTRIBUTE_NEXT_MESSAGE_TIMESTAMP = "next_message_timestamp";
+ private static final String ATTRIBUTE_CRYPTO_TARGETS = "crypto_targets";
+ private static final String ATTRIBUTE_NEXT_ENCRYPTION = "next_encryption";
+ protected final ArrayList<Message> messages = new ArrayList<>();
+ public AtomicBoolean messagesLoaded = new AtomicBoolean(true);
+ protected Account account = null;
private String draftMessage;
private String name;
private String contactUuid;
@@ -66,32 +70,64 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
private int status;
private long created;
private int mode;
-
private JSONObject attributes = new JSONObject();
-
private Jid nextCounterpart;
-
- protected final ArrayList<Message> messages = new ArrayList<>();
- protected Account account = null;
-
private transient SessionImpl otrSession;
-
private transient String otrFingerprint = null;
private Smp mSmp = new Smp();
-
private transient MucOptions mucOptions = null;
-
private byte[] symmetricKey;
-
private boolean messagesLeftOnServer = true;
private ChatState mOutgoingChatState = Config.DEFAULT_CHATSTATE;
private ChatState mIncomingChatState = Config.DEFAULT_CHATSTATE;
private String mLastReceivedOtrMessageId = null;
private String mFirstMamReference = null;
private Message correctingMessage;
- public AtomicBoolean messagesLoaded = new AtomicBoolean(true);
- XmppConnectionService mXmppConnectionService;
+ public Conversation(final String name, final Account account, final Jid contactJid,
+ final int mode) {
+ this(java.util.UUID.randomUUID().toString(), name, null, account
+ .getUuid(), contactJid, System.currentTimeMillis(),
+ STATUS_AVAILABLE, mode, "");
+ this.account = account;
+ }
+
+ public Conversation(final String uuid, final String name, final String contactUuid,
+ final String accountUuid, final Jid contactJid, final long created, final int status,
+ final int mode, final String attributes) {
+ this.uuid = uuid;
+ this.name = name;
+ this.contactUuid = contactUuid;
+ this.accountUuid = accountUuid;
+ this.contactJid = contactJid;
+ this.created = created;
+ this.status = status;
+ this.mode = mode;
+ try {
+ this.attributes = new JSONObject(attributes == null ? "" : attributes);
+ } catch (JSONException e) {
+ this.attributes = new JSONObject();
+ }
+ }
+
+ public static Conversation fromCursor(Cursor cursor) {
+ Jid jid;
+ try {
+ jid = Jid.of(cursor.getString(cursor.getColumnIndex(CONTACTJID)));
+ } catch (final IllegalArgumentException e) {
+ // Borked DB..
+ jid = null;
+ }
+ return new Conversation(cursor.getString(cursor.getColumnIndex(UUID)),
+ cursor.getString(cursor.getColumnIndex(NAME)),
+ cursor.getString(cursor.getColumnIndex(CONTACT)),
+ cursor.getString(cursor.getColumnIndex(ACCOUNT)),
+ jid,
+ cursor.getLong(cursor.getColumnIndex(CREATED)),
+ cursor.getInt(cursor.getColumnIndex(STATUS)),
+ cursor.getInt(cursor.getColumnIndex(MODE)),
+ cursor.getString(cursor.getColumnIndex(ATTRIBUTES)));
+ }
public boolean hasMessagesLeftOnServer() {
return messagesLeftOnServer;
@@ -101,7 +137,6 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
this.messagesLeftOnServer = value;
}
-
public Message getFirstUnreadMessage() {
Message first = null;
synchronized (this.messages) {
@@ -361,19 +396,19 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
}
}
- public void setFirstMamReference(String reference) {
- this.mFirstMamReference = reference;
- }
-
public String getFirstMamReference() {
return this.mFirstMamReference;
}
+ public void setFirstMamReference(String reference) {
+ this.mFirstMamReference = reference;
+ }
+
public void setLastClearHistory(long time, String reference) {
if (reference != null) {
setAttribute(ATTRIBUTE_LAST_CLEAR_HISTORY, String.valueOf(time) + ":" + reference);
} else {
- setAttribute(ATTRIBUTE_LAST_CLEAR_HISTORY, String.valueOf(time));
+ setAttribute(ATTRIBUTE_LAST_CLEAR_HISTORY, time);
}
}
@@ -408,14 +443,16 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
@Override
public int compareTo(@NonNull Conversation another) {
- final Message left = getLatestMessage();
- final Message right = another.getLatestMessage();
- if (left.getTimeSent() > right.getTimeSent()) {
- return -1;
- } else if (left.getTimeSent() < right.getTimeSent()) {
- return 1;
+ return Long.compare(another.getSortableTime(), getSortableTime());
+ }
+
+ private long getSortableTime() {
+ Draft draft = getDraft();
+ long messageTime = getLatestMessage().getTimeSent();
+ if (draft == null) {
+ return messageTime;
} else {
- return 0;
+ return Math.max(messageTime, draft.getTimestamp());
}
}
@@ -427,36 +464,6 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
this.draftMessage = draftMessage;
}
- public interface OnMessageFound {
- void onMessageFound(final Message message);
- }
-
- public Conversation(final String name, final Account account, final Jid contactJid,
- final int mode) {
- this(java.util.UUID.randomUUID().toString(), name, null, account
- .getUuid(), contactJid, System.currentTimeMillis(),
- STATUS_AVAILABLE, mode, "");
- this.account = account;
- }
-
- public Conversation(final String uuid, final String name, final String contactUuid,
- final String accountUuid, final Jid contactJid, final long created, final int status,
- final int mode, final String attributes) {
- this.uuid = uuid;
- this.name = name;
- this.contactUuid = contactUuid;
- this.accountUuid = accountUuid;
- this.contactJid = contactJid;
- this.created = created;
- this.status = status;
- this.mode = mode;
- try {
- this.attributes = new JSONObject(attributes == null ? "" : attributes);
- } catch (JSONException e) {
- this.attributes = new JSONObject();
- }
- }
-
public boolean isRead() {
return (this.messages.size() == 0) || this.messages.get(this.messages.size() - 1).isRead();
}
@@ -555,14 +562,14 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
return this.account;
}
- public Contact getContact() {
- return this.account.getRoster().getContact(this.contactJid);
- }
-
public void setAccount(final Account account) {
this.account = account;
}
+ public Contact getContact() {
+ return this.account.getRoster().getContact(this.contactJid);
+ }
+
@Override
public Jid getJid() {
return this.contactJid;
@@ -572,6 +579,10 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
return this.status;
}
+ public void setStatus(int status) {
+ this.status = status;
+ }
+
public long getCreated() {
return this.created;
}
@@ -590,29 +601,6 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
return values;
}
- public static Conversation fromCursor(Cursor cursor) {
- Jid jid;
- try {
- jid = Jid.of(cursor.getString(cursor.getColumnIndex(CONTACTJID)));
- } catch (final IllegalArgumentException e) {
- // Borked DB..
- jid = null;
- }
- return new Conversation(cursor.getString(cursor.getColumnIndex(UUID)),
- cursor.getString(cursor.getColumnIndex(NAME)),
- cursor.getString(cursor.getColumnIndex(CONTACT)),
- cursor.getString(cursor.getColumnIndex(ACCOUNT)),
- jid,
- cursor.getLong(cursor.getColumnIndex(CREATED)),
- cursor.getInt(cursor.getColumnIndex(STATUS)),
- cursor.getInt(cursor.getColumnIndex(MODE)),
- cursor.getString(cursor.getColumnIndex(ATTRIBUTES)));
- }
-
- public void setStatus(int status) {
- this.status = status;
- }
-
public int getMode() {
return this.mode;
}
@@ -751,14 +739,14 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
this.contactJid = jid;
}
- public void setNextCounterpart(Jid jid) {
- this.nextCounterpart = jid;
- }
-
public Jid getNextCounterpart() {
return this.nextCounterpart;
}
+ public void setNextCounterpart(Jid jid) {
+ this.nextCounterpart = jid;
+ }
+
public int getNextEncryption() {
final int defaultEncryption;
AxolotlService axolotlService = account.getAxolotlService();
@@ -792,9 +780,24 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
return smp().status == Smp.STATUS_CONTACT_REQUESTED;
}
+ public @Nullable
+ Draft getDraft() {
+ long timestamp = getLongAttribute(ATTRIBUTE_NEXT_MESSAGE_TIMESTAMP, 0);
+ if (timestamp > getLatestMessage().getTimeSent()) {
+ String message = getAttribute(ATTRIBUTE_NEXT_MESSAGE);
+ if (!TextUtils.isEmpty(message) && timestamp != 0) {
+ return new Draft(message, timestamp);
+ }
+ }
+ return null;
+ }
+
public boolean setNextMessage(String message) {
boolean changed = !getNextMessage().equals(message);
this.setAttribute(ATTRIBUTE_NEXT_MESSAGE, message);
+ if (changed) {
+ this.setAttribute(ATTRIBUTE_NEXT_MESSAGE_TIMESTAMP, TextUtils.isEmpty(message) ? 0 : System.currentTimeMillis());
+ }
return changed;
}
@@ -875,6 +878,10 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
return mode == MODE_SINGLE || getBooleanAttribute(ATTRIBUTE_ALWAYS_NOTIFY, Config.ALWAYS_NOTIFY_BY_DEFAULT || isPrivateAndNonAnonymous());
}
+ private boolean setAttribute(String key, long value) {
+ return setAttribute(key, Long.toString(value));
+ }
+
public boolean setAttribute(String key, String value) {
synchronized (this.attributes) {
try {
@@ -1076,6 +1083,28 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
&& sentMessagesCount() == 0;
}
+ public interface OnMessageFound {
+ void onMessageFound(final Message message);
+ }
+
+ public static class Draft {
+ private final String message;
+ private final long timestamp;
+
+ private Draft(String message, long timestamp) {
+ this.message = message;
+ this.timestamp = timestamp;
+ }
+
+ public long getTimestamp() {
+ return timestamp;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+ }
+
public class Smp {
public static final int STATUS_NONE = 0;
public static final int STATUS_CONTACT_REQUESTED = 1;