aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/eu/siacs/conversations/parser')
-rw-r--r--src/main/java/eu/siacs/conversations/parser/AbstractParser.java56
-rw-r--r--src/main/java/eu/siacs/conversations/parser/MessageParser.java3
2 files changed, 25 insertions, 34 deletions
diff --git a/src/main/java/eu/siacs/conversations/parser/AbstractParser.java b/src/main/java/eu/siacs/conversations/parser/AbstractParser.java
index eedfca16..c80346b7 100644
--- a/src/main/java/eu/siacs/conversations/parser/AbstractParser.java
+++ b/src/main/java/eu/siacs/conversations/parser/AbstractParser.java
@@ -24,50 +24,40 @@ public abstract class AbstractParser {
protected long getTimestamp(Element packet) {
long now = System.currentTimeMillis();
- ArrayList<String> stamps = new ArrayList<>();
- for (Element child : packet.getChildren()) {
- if (child.getName().equals("delay")) {
- stamps.add(child.getAttribute("stamp").replace("Z", "+0000"));
- }
+ Element delay = packet.findChild("delay");
+ if (delay == null) {
+ return now;
}
- Collections.sort(stamps);
- if (stamps.size() >= 1) {
- try {
- String stamp = stamps.get(stamps.size() - 1);
- if (stamp.contains(".")) {
- Date date = new SimpleDateFormat(
- "yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US)
- .parse(stamp);
- if (now < date.getTime()) {
- return now;
- } else {
- return date.getTime();
- }
- } else {
- Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ",
- Locale.US).parse(stamp);
- if (now < date.getTime()) {
- return now;
- } else {
- return date.getTime();
- }
- }
- } catch (ParseException e) {
- return now;
- }
- } else {
+ String stamp = delay.getAttribute("stamp");
+ if (stamp == null) {
+ return now;
+ }
+ try {
+ long time = parseTimestamp(stamp).getTime();
+ return now < time ? now : time;
+ } catch (ParseException e) {
return now;
}
}
+ public static Date parseTimestamp(String timestamp) throws ParseException {
+ timestamp = timestamp.replace("Z", "+0000");
+ SimpleDateFormat dateFormat;
+ if (timestamp.contains(".")) {
+ dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
+ } else {
+ dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ",Locale.US);
+ }
+ return dateFormat.parse(timestamp);
+ }
+
protected void updateLastseen(final Element packet, final Account account,
final boolean presenceOverwrite) {
Jid from;
try {
from = Jid.fromString(packet.getAttribute("from")).toBareJid();
} catch (final InvalidJidException e) {
- // TODO: Handle this?
- from = null;
+ return;
}
String presence = from == null || from.isBareJid() ? "" : from.getResourcepart();
Contact contact = account.getRoster().getContact(from);
diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java
index 3ae82e48..fd9e1b6c 100644
--- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java
+++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java
@@ -14,7 +14,6 @@ import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xmpp.OnMessagePacketReceived;
-import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid;
import eu.siacs.conversations.xmpp.pep.Avatar;
import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
@@ -487,6 +486,8 @@ public class MessageParser extends AbstractParser implements
}
Conversation conversation = message.getConversation();
conversation.add(message);
+ conversation.setLastMessageReceived(System.currentTimeMillis());
+ mXmppConnectionService.updateConversation(conversation);
if (message.getStatus() == Message.STATUS_RECEIVED
&& conversation.getOtrSession() != null