Tag carbon messages in parser, adapt session logic
Messages sent from another device of the own account are now explicitly tagged as carboned message. The session detection logic now uses this tag to find "session borders".
This commit is contained in:
parent
e10a6c5b87
commit
e6df4d81d2
|
@ -51,6 +51,7 @@ public class Message extends AbstractEntity {
|
||||||
public static final String ENCRYPTION = "encryption";
|
public static final String ENCRYPTION = "encryption";
|
||||||
public static final String STATUS = "status";
|
public static final String STATUS = "status";
|
||||||
public static final String TYPE = "type";
|
public static final String TYPE = "type";
|
||||||
|
public static final String CARBON = "carbon";
|
||||||
public static final String REMOTE_MSG_ID = "remoteMsgId";
|
public static final String REMOTE_MSG_ID = "remoteMsgId";
|
||||||
public static final String SERVER_MSG_ID = "serverMsgId";
|
public static final String SERVER_MSG_ID = "serverMsgId";
|
||||||
public static final String RELATIVE_FILE_PATH = "relativeFilePath";
|
public static final String RELATIVE_FILE_PATH = "relativeFilePath";
|
||||||
|
@ -68,6 +69,7 @@ public class Message extends AbstractEntity {
|
||||||
protected int encryption;
|
protected int encryption;
|
||||||
protected int status;
|
protected int status;
|
||||||
protected int type;
|
protected int type;
|
||||||
|
protected boolean carbon = false;
|
||||||
protected String relativeFilePath;
|
protected String relativeFilePath;
|
||||||
protected boolean read = true;
|
protected boolean read = true;
|
||||||
protected String remoteMsgId = null;
|
protected String remoteMsgId = null;
|
||||||
|
@ -85,8 +87,11 @@ public class Message extends AbstractEntity {
|
||||||
public Message(Conversation conversation, String body, int encryption) {
|
public Message(Conversation conversation, String body, int encryption) {
|
||||||
this(conversation, body, encryption, STATUS_UNSEND);
|
this(conversation, body, encryption, STATUS_UNSEND);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Message(Conversation conversation, String body, int encryption, int status) {
|
public Message(Conversation conversation, String body, int encryption, int status) {
|
||||||
|
this(conversation, body, encryption, status, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Message(Conversation conversation, String body, int encryption, int status, boolean carbon) {
|
||||||
this(java.util.UUID.randomUUID().toString(),
|
this(java.util.UUID.randomUUID().toString(),
|
||||||
conversation.getUuid(),
|
conversation.getUuid(),
|
||||||
conversation.getJid() == null ? null : conversation.getJid().toBareJid(),
|
conversation.getJid() == null ? null : conversation.getJid().toBareJid(),
|
||||||
|
@ -96,6 +101,7 @@ public class Message extends AbstractEntity {
|
||||||
encryption,
|
encryption,
|
||||||
status,
|
status,
|
||||||
TYPE_TEXT,
|
TYPE_TEXT,
|
||||||
|
false,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
|
@ -105,8 +111,9 @@ public class Message extends AbstractEntity {
|
||||||
|
|
||||||
private Message(final String uuid, final String conversationUUid, final Jid counterpart,
|
private Message(final String uuid, final String conversationUUid, final Jid counterpart,
|
||||||
final Jid trueCounterpart, final String body, final long timeSent,
|
final Jid trueCounterpart, final String body, final long timeSent,
|
||||||
final int encryption, final int status, final int type, final String remoteMsgId,
|
final int encryption, final int status, final int type, final boolean carbon,
|
||||||
final String relativeFilePath, final String serverMsgId, final String fingerprint) {
|
final String remoteMsgId, final String relativeFilePath,
|
||||||
|
final String serverMsgId, final String fingerprint) {
|
||||||
this.uuid = uuid;
|
this.uuid = uuid;
|
||||||
this.conversationUuid = conversationUUid;
|
this.conversationUuid = conversationUUid;
|
||||||
this.counterpart = counterpart;
|
this.counterpart = counterpart;
|
||||||
|
@ -116,6 +123,7 @@ public class Message extends AbstractEntity {
|
||||||
this.encryption = encryption;
|
this.encryption = encryption;
|
||||||
this.status = status;
|
this.status = status;
|
||||||
this.type = type;
|
this.type = type;
|
||||||
|
this.carbon = carbon;
|
||||||
this.remoteMsgId = remoteMsgId;
|
this.remoteMsgId = remoteMsgId;
|
||||||
this.relativeFilePath = relativeFilePath;
|
this.relativeFilePath = relativeFilePath;
|
||||||
this.serverMsgId = serverMsgId;
|
this.serverMsgId = serverMsgId;
|
||||||
|
@ -154,6 +162,7 @@ public class Message extends AbstractEntity {
|
||||||
cursor.getInt(cursor.getColumnIndex(ENCRYPTION)),
|
cursor.getInt(cursor.getColumnIndex(ENCRYPTION)),
|
||||||
cursor.getInt(cursor.getColumnIndex(STATUS)),
|
cursor.getInt(cursor.getColumnIndex(STATUS)),
|
||||||
cursor.getInt(cursor.getColumnIndex(TYPE)),
|
cursor.getInt(cursor.getColumnIndex(TYPE)),
|
||||||
|
cursor.getInt(cursor.getColumnIndex(CARBON))>0,
|
||||||
cursor.getString(cursor.getColumnIndex(REMOTE_MSG_ID)),
|
cursor.getString(cursor.getColumnIndex(REMOTE_MSG_ID)),
|
||||||
cursor.getString(cursor.getColumnIndex(RELATIVE_FILE_PATH)),
|
cursor.getString(cursor.getColumnIndex(RELATIVE_FILE_PATH)),
|
||||||
cursor.getString(cursor.getColumnIndex(SERVER_MSG_ID)),
|
cursor.getString(cursor.getColumnIndex(SERVER_MSG_ID)),
|
||||||
|
@ -188,6 +197,7 @@ public class Message extends AbstractEntity {
|
||||||
values.put(ENCRYPTION, encryption);
|
values.put(ENCRYPTION, encryption);
|
||||||
values.put(STATUS, status);
|
values.put(STATUS, status);
|
||||||
values.put(TYPE, type);
|
values.put(TYPE, type);
|
||||||
|
values.put(CARBON, carbon ? 1 : 0);
|
||||||
values.put(REMOTE_MSG_ID, remoteMsgId);
|
values.put(REMOTE_MSG_ID, remoteMsgId);
|
||||||
values.put(RELATIVE_FILE_PATH, relativeFilePath);
|
values.put(RELATIVE_FILE_PATH, relativeFilePath);
|
||||||
values.put(SERVER_MSG_ID, serverMsgId);
|
values.put(SERVER_MSG_ID, serverMsgId);
|
||||||
|
@ -312,6 +322,14 @@ public class Message extends AbstractEntity {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isCarbon() {
|
||||||
|
return carbon;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCarbon(boolean carbon) {
|
||||||
|
this.carbon = carbon;
|
||||||
|
}
|
||||||
|
|
||||||
public void setTrueCounterpart(Jid trueCounterpart) {
|
public void setTrueCounterpart(Jid trueCounterpart) {
|
||||||
this.trueCounterpart = trueCounterpart;
|
this.trueCounterpart = trueCounterpart;
|
||||||
}
|
}
|
||||||
|
|
|
@ -230,6 +230,7 @@ public class MessageParser extends AbstractParser implements
|
||||||
final MessagePacket packet;
|
final MessagePacket packet;
|
||||||
Long timestamp = null;
|
Long timestamp = null;
|
||||||
final boolean isForwarded;
|
final boolean isForwarded;
|
||||||
|
boolean isCarbon = false;
|
||||||
String serverMsgId = null;
|
String serverMsgId = null;
|
||||||
final Element fin = original.findChild("fin", "urn:xmpp:mam:0");
|
final Element fin = original.findChild("fin", "urn:xmpp:mam:0");
|
||||||
if (fin != null) {
|
if (fin != null) {
|
||||||
|
@ -260,7 +261,8 @@ public class MessageParser extends AbstractParser implements
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
timestamp = f != null ? f.second : null;
|
timestamp = f != null ? f.second : null;
|
||||||
isForwarded = f != null;
|
isCarbon = f != null;
|
||||||
|
isForwarded = isCarbon;
|
||||||
} else {
|
} else {
|
||||||
packet = original;
|
packet = original;
|
||||||
isForwarded = false;
|
isForwarded = false;
|
||||||
|
@ -346,6 +348,7 @@ public class MessageParser extends AbstractParser implements
|
||||||
message.setCounterpart(counterpart);
|
message.setCounterpart(counterpart);
|
||||||
message.setRemoteMsgId(remoteMsgId);
|
message.setRemoteMsgId(remoteMsgId);
|
||||||
message.setServerMsgId(serverMsgId);
|
message.setServerMsgId(serverMsgId);
|
||||||
|
message.setCarbon(isCarbon);
|
||||||
message.setTime(timestamp);
|
message.setTime(timestamp);
|
||||||
message.markable = packet.hasChild("markable", "urn:xmpp:chat-markers:0");
|
message.markable = packet.hasChild("markable", "urn:xmpp:chat-markers:0");
|
||||||
if (conversation.getMode() == Conversation.MODE_MULTI) {
|
if (conversation.getMode() == Conversation.MODE_MULTI) {
|
||||||
|
|
|
@ -41,7 +41,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
||||||
private static DatabaseBackend instance = null;
|
private static DatabaseBackend instance = null;
|
||||||
|
|
||||||
private static final String DATABASE_NAME = "history";
|
private static final String DATABASE_NAME = "history";
|
||||||
private static final int DATABASE_VERSION = 15;
|
private static final int DATABASE_VERSION = 16;
|
||||||
|
|
||||||
private static String CREATE_CONTATCS_STATEMENT = "create table "
|
private static String CREATE_CONTATCS_STATEMENT = "create table "
|
||||||
+ Contact.TABLENAME + "(" + Contact.ACCOUNT + " TEXT, "
|
+ Contact.TABLENAME + "(" + Contact.ACCOUNT + " TEXT, "
|
||||||
|
@ -295,6 +295,10 @@ public class DatabaseBackend extends SQLiteOpenHelper {
|
||||||
db.execSQL("ALTER TABLE " + Message.TABLENAME + " ADD COLUMN "
|
db.execSQL("ALTER TABLE " + Message.TABLENAME + " ADD COLUMN "
|
||||||
+ Message.FINGERPRINT + " TEXT");
|
+ Message.FINGERPRINT + " TEXT");
|
||||||
}
|
}
|
||||||
|
if (oldVersion < 16 && newVersion >= 16) {
|
||||||
|
db.execSQL("ALTER TABLE " + Message.TABLENAME + " ADD COLUMN "
|
||||||
|
+ Message.CARBON + " INTEGER");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static synchronized DatabaseBackend getInstance(Context context) {
|
public static synchronized DatabaseBackend getInstance(Context context) {
|
||||||
|
|
|
@ -567,7 +567,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
|
||||||
wasEncrypted = true;
|
wasEncrypted = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (iterator.getRemoteMsgId() == null && iterator.getType() == SENT) {
|
if (!iterator.isCarbon() && iterator.getType() == SENT) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -577,7 +577,7 @@ public class MessageAdapter extends ArrayAdapter<Message> {
|
||||||
willBeEncrypted = true;
|
willBeEncrypted = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (iterator.getRemoteMsgId() == null && iterator.getType() == SENT) {
|
if (!iterator.isCarbon() && iterator.getType() == SENT) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue