From 5c55c1a166e9639e0d018846e185f9aae137a523 Mon Sep 17 00:00:00 2001 From: Wiktor Kwapisiewicz Date: Thu, 6 Sep 2018 10:36:21 +0200 Subject: [PATCH] Fix saving XMPP URIs in phone Contact Book Previously XMPP URIs were saved as non functional e-mails in Android built-in Contact Book. This change saves them as a special IM field that is used directly by other applications (e.g. Conversations). --- .../keychain/util/ContactHelper.java | 29 ++++++++++++++----- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java index 64f26fe7f..e5f67ba15 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java @@ -41,6 +41,7 @@ import android.net.Uri; import android.os.Build; import android.provider.ContactsContract; import android.provider.ContactsContract.CommonDataKinds.Email; +import android.provider.ContactsContract.CommonDataKinds.Im; import android.provider.ContactsContract.Data; import android.support.v4.content.ContextCompat; import android.util.Patterns; @@ -785,17 +786,29 @@ public class ContactHelper { */ private void writeContactEmail(ArrayList ops, long rawContactId, long masterKeyId) { - ContentProviderOperation deleteOp = selectByRawContactAndItemType( + ContentProviderOperation deleteEmailOp = selectByRawContactAndItemType( ContentProviderOperation.newDelete(Data.CONTENT_URI), rawContactId, Email.CONTENT_ITEM_TYPE).build(); - ops.add(deleteOp); + ops.add(deleteEmailOp); + + ContentProviderOperation deleteJabberOp = selectByRawContactAndItemType( + ContentProviderOperation.newDelete(Data.CONTENT_URI), rawContactId, Im.CONTENT_ITEM_TYPE).build(); + ops.add(deleteJabberOp); for (UserId userId : keyRepository.getUserIds(masterKeyId)) { - ContentProviderOperation insertOp = - referenceRawContact(ContentProviderOperation.newInsert(Data.CONTENT_URI), rawContactId) - .withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) - .withValue(Email.DATA, userId.email()) - .build(); - ops.add(insertOp); + if (userId.email() != null) { + ContentProviderOperation.Builder builder = referenceRawContact( + ContentProviderOperation.newInsert(Data.CONTENT_URI), rawContactId); + + if (userId.email().startsWith("xmpp:")) { + builder = builder.withValue(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE) + .withValue(Im.PROTOCOL, Im.PROTOCOL_JABBER) + .withValue(Im.DATA, userId.email().substring(5)); + } else { + builder = builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) + .withValue(Email.DATA, userId.email()); + } + ops.add(builder.build()); + } } }