refresh synced contacts even if offline
This commit is contained in:
parent
2dee53587b
commit
3e1d01798c
|
@ -21,6 +21,7 @@ import java.util.Locale;
|
||||||
import eu.siacs.conversations.Config;
|
import eu.siacs.conversations.Config;
|
||||||
import eu.siacs.conversations.R;
|
import eu.siacs.conversations.R;
|
||||||
import eu.siacs.conversations.android.AbstractPhoneContact;
|
import eu.siacs.conversations.android.AbstractPhoneContact;
|
||||||
|
import eu.siacs.conversations.android.JabberIdContact;
|
||||||
import eu.siacs.conversations.android.PhoneNumberContact;
|
import eu.siacs.conversations.android.PhoneNumberContact;
|
||||||
import eu.siacs.conversations.utils.JidHelper;
|
import eu.siacs.conversations.utils.JidHelper;
|
||||||
import eu.siacs.conversations.utils.UIHelper;
|
import eu.siacs.conversations.utils.UIHelper;
|
||||||
|
@ -529,7 +530,7 @@ public class Contact implements ListItem, Blockable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static int getOption(Class<? extends AbstractPhoneContact> clazz) {
|
public static int getOption(Class<? extends AbstractPhoneContact> clazz) {
|
||||||
if (clazz == PhoneNumberContact.class) {
|
if (clazz == JabberIdContact.class) {
|
||||||
return Options.SYNCED_VIA_ADDRESSBOOK;
|
return Options.SYNCED_VIA_ADDRESSBOOK;
|
||||||
} else {
|
} else {
|
||||||
return Options.SYNCED_VIA_OTHER;
|
return Options.SYNCED_VIA_OTHER;
|
||||||
|
@ -546,6 +547,6 @@ public class Contact implements ListItem, Blockable {
|
||||||
public static final int DIRTY_PUSH = 6;
|
public static final int DIRTY_PUSH = 6;
|
||||||
public static final int DIRTY_DELETE = 7;
|
public static final int DIRTY_DELETE = 7;
|
||||||
private static final int SYNCED_VIA_ADDRESSBOOK = 8;
|
private static final int SYNCED_VIA_ADDRESSBOOK = 8;
|
||||||
private static final int SYNCED_VIA_OTHER = 9;
|
public static final int SYNCED_VIA_OTHER = 9;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -911,7 +911,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) {
|
if (contact.getOption(Contact.Options.IN_ROSTER) || contact.getAvatarFilename() != null || 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 + "=?";
|
||||||
|
|
|
@ -2,6 +2,7 @@ package eu.siacs.conversations.services;
|
||||||
|
|
||||||
|
|
||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
@ -15,6 +16,7 @@ import java.net.URL;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
@ -269,16 +271,39 @@ public class QuickConversationsService extends AbstractQuickConversationsService
|
||||||
public void considerSync() {
|
public void considerSync() {
|
||||||
Map<String, PhoneNumberContact> contacts = PhoneNumberContact.load(service);
|
Map<String, PhoneNumberContact> contacts = PhoneNumberContact.load(service);
|
||||||
for (Account account : service.getAccounts()) {
|
for (Account account : service.getAccounts()) {
|
||||||
considerSync(account, contacts);
|
refresh(account, contacts.values());
|
||||||
|
if (!considerSync(account, contacts)) {
|
||||||
|
service.syncRoster(account);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void considerSync(Account account, final Map<String, PhoneNumberContact> contacts) {
|
private void refresh(Account account, Collection<PhoneNumberContact> contacts) {
|
||||||
|
for(Contact contact : account.getRoster().getWithSystemAccounts(PhoneNumberContact.class)) {
|
||||||
|
final Uri uri = contact.getSystemAccount();
|
||||||
|
if (uri == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
PhoneNumberContact phoneNumberContact = findByUri(contacts, uri);
|
||||||
|
final boolean needsCacheClean;
|
||||||
|
if (phoneNumberContact != null) {
|
||||||
|
needsCacheClean = contact.setPhoneContact(phoneNumberContact);
|
||||||
|
} else {
|
||||||
|
needsCacheClean = contact.unsetPhoneContact(PhoneNumberContact.class);
|
||||||
|
Log.d(Config.LOGTAG,uri.toString()+" vanished from address book");
|
||||||
|
}
|
||||||
|
if (needsCacheClean) {
|
||||||
|
service.getAvatarService().clear(contact);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean considerSync(Account account, final Map<String, PhoneNumberContact> contacts) {
|
||||||
XmppConnection xmppConnection = account.getXmppConnection();
|
XmppConnection xmppConnection = account.getXmppConnection();
|
||||||
Jid syncServer = xmppConnection == null ? null : xmppConnection.findDiscoItemByFeature(Namespace.SYNCHRONIZATION);
|
Jid syncServer = xmppConnection == null ? null : xmppConnection.findDiscoItemByFeature(Namespace.SYNCHRONIZATION);
|
||||||
if (syncServer == null) {
|
if (syncServer == null) {
|
||||||
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": skipping sync. no sync server found");
|
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": skipping sync. no sync server found");
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": sending phone list to " + syncServer);
|
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": sending phone list to " + syncServer);
|
||||||
List<Element> entries = new ArrayList<>();
|
List<Element> entries = new ArrayList<>();
|
||||||
|
@ -315,7 +340,18 @@ public class QuickConversationsService extends AbstractQuickConversationsService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
service.syncRoster(account);
|
||||||
});
|
});
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static PhoneNumberContact findByUri(Collection<PhoneNumberContact> haystack, Uri needle) {
|
||||||
|
for(PhoneNumberContact contact : haystack) {
|
||||||
|
if (needle.equals(contact.getLookupUri())) {
|
||||||
|
return contact;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Entry {
|
public static class Entry {
|
||||||
|
|
Loading…
Reference in a new issue