parse all delayed tags. use min date

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/parser/AbstractParser.java | 26 +-
src/main/java/eu/siacs/conversations/parser/PresenceParser.java |  8 
2 files changed, 22 insertions(+), 12 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/parser/AbstractParser.java 🔗

@@ -22,18 +22,26 @@ public abstract class AbstractParser {
 	}
 
 	public static Long parseTimestamp(Element element, Long d) {
-		Element delay = element.findChild("delay","urn:xmpp:delay");
-		if (delay != null) {
-			String stamp = delay.getAttribute("stamp");
-			if (stamp != null) {
-				try {
-					return AbstractParser.parseTimestamp(delay.getAttribute("stamp"));
-				} catch (ParseException e) {
-					return d;
+		long min = Long.MAX_VALUE;
+		boolean returnDefault = true;
+		for(Element child : element.getChildren()) {
+			if ("delay".equals(child.getName()) && "urn:xmpp:delay".equals(child.getNamespace())) {
+				String stamp = child.getAttribute("stamp");
+				if (stamp != null) {
+					try {
+						min = Math.min(min,AbstractParser.parseTimestamp(stamp));
+						returnDefault = false;
+					} catch (ParseException e) {
+						//ignore
+					}
 				}
 			}
 		}
-		return d;
+		if (returnDefault) {
+			return d;
+		} else {
+			return min;
+		}
 	}
 
 	public static long parseTimestamp(Element element) {

src/main/java/eu/siacs/conversations/parser/PresenceParser.java 🔗

@@ -215,12 +215,14 @@ public class PresenceParser extends AbstractParser implements
 
 			final Element idle = packet.findChild("idle", Namespace.IDLE);
 			if (idle != null) {
-				contact.flagInactive();
-				final String since = idle.getAttribute("since");
 				try {
+					final String since = idle.getAttribute("since");
 					contact.setLastseen(AbstractParser.parseTimestamp(since));
+					contact.flagInactive();
 				} catch (NullPointerException | ParseException e) {
-					contact.setLastseen(System.currentTimeMillis());
+					if (contact.setLastseen(AbstractParser.parseTimestamp(packet))) {
+						contact.flagActive();
+					}
 				}
 			} else {
 				if (contact.setLastseen(AbstractParser.parseTimestamp(packet))) {