AbstractParser.java

 1package eu.siacs.conversations.parser;
 2
 3import java.text.ParseException;
 4import java.text.SimpleDateFormat;
 5import java.util.ArrayList;
 6import java.util.Collections;
 7import java.util.Date;
 8import java.util.Locale;
 9
10import eu.siacs.conversations.entities.Account;
11import eu.siacs.conversations.entities.Contact;
12import eu.siacs.conversations.services.XmppConnectionService;
13import eu.siacs.conversations.xml.Element;
14
15public abstract class AbstractParser {
16	
17	protected XmppConnectionService mXmppConnectionService;
18
19	protected AbstractParser(XmppConnectionService service) {
20		this.mXmppConnectionService = service;
21	}
22	
23	protected long getTimestamp(Element packet) {
24		long now = System.currentTimeMillis();
25		ArrayList<String> stamps = new ArrayList<String>();
26		for(Element child : packet.getChildren()) {
27			if (child.getName().equals("delay")) {
28				stamps.add(child.getAttribute("stamp").replace("Z", "+0000"));
29			}
30		}
31		Collections.sort(stamps);
32		if (stamps.size() >= 1) {
33			try {
34				String stamp = stamps.get(stamps.size() - 1);
35				if (stamp.contains(".")) {
36					Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ",Locale.US)
37					.parse(stamp);
38					if (now<date.getTime()) {
39						return now;
40					} else {
41						return date.getTime();
42					}
43				} else {
44					Date date = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ",Locale.US)
45							.parse(stamp);
46					if (now<date.getTime()) {
47						return now;
48					} else {
49						return date.getTime();
50					}
51				}
52			} catch (ParseException e) {
53				return now;
54			}
55		} else {
56			return now;
57		}
58	}
59	
60	protected void updateLastseen(Element packet, Account account, boolean presenceOverwrite) {
61		String[] fromParts = packet.getAttribute("from").split("/");
62		String from = fromParts[0];
63		String presence = null;
64		if (fromParts.length >= 2) {
65			presence = fromParts[1];
66		}
67		Contact contact = account.getRoster().getContact(from);
68		long timestamp = getTimestamp(packet);
69		if (timestamp >= contact.lastseen.time) {
70			contact.lastseen.time = timestamp;
71			if ((presence!=null)&&(presenceOverwrite)) {
72				contact.lastseen.presence = presence;
73			}
74		}
75	}
76}