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
@@ -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) {
@@ -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))) {