store last message received date in conversation
This commit is contained in:
parent
2b958e51df
commit
34558cc277
|
@ -43,6 +43,7 @@ public class Conversation extends AbstractEntity {
|
|||
public static final String ATTRIBUTE_NEXT_ENCRYPTION = "next_encryption";
|
||||
public static final String ATTRIBUTE_MUC_PASSWORD = "muc_password";
|
||||
public static final String ATTRIBUTE_MUTED_TILL = "muted_till";
|
||||
public static final String ATTRIBUTE_LAST_MESSAGE_RECEIVED = "last_message_received";
|
||||
|
||||
private String name;
|
||||
private String contactUuid;
|
||||
|
@ -470,6 +471,14 @@ public class Conversation extends AbstractEntity {
|
|||
}
|
||||
}
|
||||
|
||||
public void setLastMessageReceived(long value) {
|
||||
this.setAttribute(ATTRIBUTE_LAST_MESSAGE_RECEIVED, String.valueOf(value));
|
||||
}
|
||||
|
||||
public long getLastMessageReceived() {
|
||||
return getLongAttribute(ATTRIBUTE_LAST_MESSAGE_RECEIVED,0);
|
||||
}
|
||||
|
||||
public void setMutedTill(long value) {
|
||||
this.setAttribute(ATTRIBUTE_MUTED_TILL, String.valueOf(value));
|
||||
}
|
||||
|
|
|
@ -4,9 +4,12 @@ import android.util.Base64;
|
|||
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
|
||||
import eu.siacs.conversations.services.XmppConnectionService;
|
||||
|
||||
|
@ -23,6 +26,8 @@ public abstract class AbstractGenerator {
|
|||
public final String IDENTITY_NAME = "Conversations 0.9.3";
|
||||
public final String IDENTITY_TYPE = "phone";
|
||||
|
||||
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
|
||||
|
||||
protected XmppConnectionService mXmppConnectionService;
|
||||
|
||||
protected AbstractGenerator(XmppConnectionService service) {
|
||||
|
@ -46,4 +51,9 @@ public abstract class AbstractGenerator {
|
|||
byte[] sha1 = md.digest(s.toString().getBytes());
|
||||
return new String(Base64.encode(sha1, Base64.DEFAULT)).trim();
|
||||
}
|
||||
|
||||
public static String getTimestamp(long time) {
|
||||
DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
return DATE_FORMAT.format(time);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,40 +24,31 @@ 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;
|
||||
}
|
||||
String stamp = delay.getAttribute("stamp");
|
||||
if (stamp == 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();
|
||||
}
|
||||
}
|
||||
long time = parseTimestamp(stamp).getTime();
|
||||
return now < time ? now : time;
|
||||
} catch (ParseException e) {
|
||||
return now;
|
||||
}
|
||||
} else {
|
||||
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,
|
||||
|
@ -66,8 +57,7 @@ public abstract class AbstractParser {
|
|||
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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -32,20 +32,14 @@ import net.java.otr4j.session.SessionStatus;
|
|||
import org.openintents.openpgp.util.OpenPgpApi;
|
||||
import org.openintents.openpgp.util.OpenPgpServiceConnection;
|
||||
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.math.BigInteger;
|
||||
import java.security.SecureRandom;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.Date;
|
||||
import java.util.Hashtable;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.TimeZone;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import de.duenndns.ssl.MemorizingTrustManager;
|
||||
|
@ -1251,27 +1245,17 @@ public class XmppConnectionService extends Service {
|
|||
PresencePacket packet = new PresencePacket();
|
||||
packet.setFrom(conversation.getAccount().getJid());
|
||||
packet.setTo(joinJid);
|
||||
Element x = new Element("x");
|
||||
x.setAttribute("xmlns", "http://jabber.org/protocol/muc");
|
||||
Element x = packet.addChild("x","http://jabber.org/protocol/muc");
|
||||
if (conversation.getMucOptions().getPassword() != null) {
|
||||
Element password = x.addChild("password");
|
||||
password.setContent(conversation.getMucOptions().getPassword());
|
||||
x.addChild("password").setContent(conversation.getMucOptions().getPassword());
|
||||
}
|
||||
x.addChild("history").setAttribute("since",PresenceGenerator.getTimestamp(conversation.getLastMessageReceived()));
|
||||
String sig = account.getPgpSignature();
|
||||
if (sig != null) {
|
||||
packet.addChild("status").setContent("online");
|
||||
packet.addChild("x", "jabber:x:signed").setContent(sig);
|
||||
}
|
||||
if (conversation.getMessages().size() != 0) {
|
||||
final SimpleDateFormat mDateFormat = new SimpleDateFormat(
|
||||
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
|
||||
mDateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
|
||||
Date date = new Date(conversation.getLatestMessage()
|
||||
.getTimeSent() + 1000);
|
||||
x.addChild("history").setAttribute("since",
|
||||
mDateFormat.format(date));
|
||||
}
|
||||
packet.addChild(x);
|
||||
Log.d(Config.LOGTAG,packet.toString());
|
||||
sendPresencePacket(account, packet);
|
||||
if (!joinJid.equals(conversation.getContactJid())) {
|
||||
conversation.setContactJid(joinJid);
|
||||
|
|
Loading…
Reference in New Issue