persist presence name (pep, nick in subscribe) to DB. fixes #3856

This commit is contained in:
Daniel Gultsch 2020-08-31 09:03:54 +02:00
parent 35af8894d2
commit 3dcb36a417
4 changed files with 20 additions and 5 deletions

View File

@ -33,6 +33,7 @@ public class Contact implements ListItem, Blockable {
public static final String SYSTEMNAME = "systemname"; public static final String SYSTEMNAME = "systemname";
public static final String SERVERNAME = "servername"; public static final String SERVERNAME = "servername";
public static final String PRESENCE_NAME = "presence_name";
public static final String JID = "jid"; public static final String JID = "jid";
public static final String OPTIONS = "options"; public static final String OPTIONS = "options";
public static final String SYSTEMACCOUNT = "systemaccount"; public static final String SYSTEMACCOUNT = "systemaccount";
@ -62,13 +63,14 @@ public class Contact implements ListItem, Blockable {
private long mLastseen = 0; private long mLastseen = 0;
private String mLastPresence = null; private String mLastPresence = null;
public Contact(final String account, final String systemName, final String serverName, public Contact(final String account, final String systemName, final String serverName, final String presenceName,
final Jid jid, final int subscription, final String photoUri, final Jid jid, final int subscription, final String photoUri,
final Uri systemAccount, final String keys, final String avatar, final long lastseen, final Uri systemAccount, final String keys, final String avatar, final long lastseen,
final String presence, final String groups) { final String presence, final String groups) {
this.accountUuid = account; this.accountUuid = account;
this.systemName = systemName; this.systemName = systemName;
this.serverName = serverName; this.serverName = serverName;
this.presenceName = presenceName;
this.jid = jid; this.jid = jid;
this.subscription = subscription; this.subscription = subscription;
this.photoUri = photoUri; this.photoUri = photoUri;
@ -116,6 +118,7 @@ public class Contact implements ListItem, Blockable {
return new Contact(cursor.getString(cursor.getColumnIndex(ACCOUNT)), return new Contact(cursor.getString(cursor.getColumnIndex(ACCOUNT)),
cursor.getString(cursor.getColumnIndex(SYSTEMNAME)), cursor.getString(cursor.getColumnIndex(SYSTEMNAME)),
cursor.getString(cursor.getColumnIndex(SERVERNAME)), cursor.getString(cursor.getColumnIndex(SERVERNAME)),
cursor.getString(cursor.getColumnIndex(PRESENCE_NAME)),
jid, jid,
cursor.getInt(cursor.getColumnIndex(OPTIONS)), cursor.getInt(cursor.getColumnIndex(OPTIONS)),
cursor.getString(cursor.getColumnIndex(PHOTOURI)), cursor.getString(cursor.getColumnIndex(PHOTOURI)),
@ -213,6 +216,7 @@ public class Contact implements ListItem, Blockable {
values.put(ACCOUNT, accountUuid); values.put(ACCOUNT, accountUuid);
values.put(SYSTEMNAME, systemName); values.put(SYSTEMNAME, systemName);
values.put(SERVERNAME, serverName); values.put(SERVERNAME, serverName);
values.put(PRESENCE_NAME, presenceName);
values.put(JID, jid.toString()); values.put(JID, jid.toString());
values.put(OPTIONS, subscription); values.put(OPTIONS, subscription);
values.put(SYSTEMACCOUNT, systemAccount != null ? systemAccount.toString() : null); values.put(SYSTEMACCOUNT, systemAccount != null ? systemAccount.toString() : null);
@ -554,6 +558,10 @@ public class Contact implements ListItem, Blockable {
return UIHelper.getColorForName(jid != null ? jid.asBareJid().toString() : getDisplayName()); return UIHelper.getColorForName(jid != null ? jid.asBareJid().toString() : getDisplayName());
} }
public boolean hasAvatarOrPresenceName() {
return (avatar != null && avatar.getFilename() != null) || presenceName != null;
}
public final class Options { public final class Options {
public static final int TO = 0; public static final int TO = 0;
public static final int FROM = 1; public static final int FROM = 1;

View File

@ -300,6 +300,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
} else { } else {
Contact contact = account.getRoster().getContact(user); Contact contact = account.getRoster().getContact(user);
if (contact.setPresenceName(nick)) { if (contact.setPresenceName(nick)) {
mXmppConnectionService.syncRoster(account);
mXmppConnectionService.getAvatarService().clear(contact); mXmppConnectionService.getAvatarService().clear(contact);
} }
} }
@ -1011,8 +1012,9 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
final String nick = packet.findChildContent("nick", Namespace.NICK); final String nick = packet.findChildContent("nick", Namespace.NICK);
if (nick != null && InvalidJid.hasValidFrom(original)) { if (nick != null && InvalidJid.hasValidFrom(original)) {
Contact contact = account.getRoster().getContact(from); final Contact contact = account.getRoster().getContact(from);
if (contact.setPresenceName(nick)) { if (contact.setPresenceName(nick)) {
mXmppConnectionService.syncRoster(account);
mXmppConnectionService.getAvatarService().clear(contact); mXmppConnectionService.getAvatarService().clear(contact);
} }
} }

View File

@ -337,6 +337,7 @@ public class PresenceParser extends AbstractParser implements
mXmppConnectionService.onContactStatusChanged.onContactStatusChanged(contact, false); mXmppConnectionService.onContactStatusChanged.onContactStatusChanged(contact, false);
} else if (type.equals("subscribe")) { } else if (type.equals("subscribe")) {
if (contact.setPresenceName(packet.findChildContent("nick", Namespace.NICK))) { if (contact.setPresenceName(packet.findChildContent("nick", Namespace.NICK))) {
mXmppConnectionService.syncRoster(account);
mXmppConnectionService.getAvatarService().clear(contact); mXmppConnectionService.getAvatarService().clear(contact);
} }
if (contact.getOption(Contact.Options.PREEMPTIVE_GRANT)) { if (contact.getOption(Contact.Options.PREEMPTIVE_GRANT)) {

View File

@ -63,11 +63,12 @@ import eu.siacs.conversations.xmpp.Jid;
public class DatabaseBackend extends SQLiteOpenHelper { public class DatabaseBackend extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "history"; private static final String DATABASE_NAME = "history";
private static final int DATABASE_VERSION = 46; private static final int DATABASE_VERSION = 47;
private static DatabaseBackend instance = null; private static DatabaseBackend instance = null;
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, "
+ Contact.SERVERNAME + " TEXT, " + Contact.SYSTEMNAME + " TEXT," + Contact.SERVERNAME + " TEXT, " + Contact.SYSTEMNAME + " TEXT,"
+ Contact.PRESENCE_NAME + " TEXT,"
+ Contact.JID + " TEXT," + Contact.KEYS + " TEXT," + Contact.JID + " TEXT," + Contact.KEYS + " TEXT,"
+ Contact.PHOTOURI + " TEXT," + Contact.OPTIONS + " NUMBER," + Contact.PHOTOURI + " TEXT," + Contact.OPTIONS + " NUMBER,"
+ Contact.SYSTEMACCOUNT + " NUMBER, " + Contact.AVATAR + " TEXT, " + Contact.SYSTEMACCOUNT + " NUMBER, " + Contact.AVATAR + " TEXT, "
@ -555,6 +556,9 @@ public class DatabaseBackend extends SQLiteOpenHelper {
final long diff = SystemClock.elapsedRealtime() - start; final long diff = SystemClock.elapsedRealtime() - start;
Log.d(Config.LOGTAG,"deleted old edit information in "+diff+"ms"); Log.d(Config.LOGTAG,"deleted old edit information in "+diff+"ms");
} }
if (oldVersion < 47 && newVersion >= 47) {
db.execSQL("ALTER TABLE " + Contact.TABLENAME + " ADD COLUMN " + Contact.PRESENCE_NAME + " TEXT");
}
} }
private void canonicalizeJids(SQLiteDatabase db) { private void canonicalizeJids(SQLiteDatabase db) {
@ -573,7 +577,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
continue; continue;
} }
String updateArgs[] = { final String[] updateArgs = {
newJid, newJid,
cursor.getString(cursor.getColumnIndex(Conversation.UUID)), cursor.getString(cursor.getColumnIndex(Conversation.UUID)),
}; };
@ -1011,7 +1015,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
final SQLiteDatabase db = this.getWritableDatabase(); final SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction(); db.beginTransaction();
for (Contact contact : roster.getContacts()) { for (Contact contact : roster.getContacts()) {
if (contact.getOption(Contact.Options.IN_ROSTER) || contact.getAvatarFilename() != null || contact.getOption(Contact.Options.SYNCED_VIA_OTHER)) { if (contact.getOption(Contact.Options.IN_ROSTER) || contact.hasAvatarOrPresenceName() || contact.getOption(Contact.Options.SYNCED_VIA_OTHER)) {
db.insert(Contact.TABLENAME, null, contact.getContentValues()); db.insert(Contact.TABLENAME, null, contact.getContentValues());
} else { } else {
String where = Contact.ACCOUNT + "=? AND " + Contact.JID + "=?"; String where = Contact.ACCOUNT + "=? AND " + Contact.JID + "=?";