From 1653778df8496aec020e877c3ff6ad4923e87fd3 Mon Sep 17 00:00:00 2001 From: Fredrik Roubert Date: Sun, 1 Nov 2020 18:25:29 +0100 Subject: [PATCH] Add support for CommonDataKinds.Nickname synchronization. There is no corresponding attribute in the default objectClass inetOrgPerson, so the default mapping is left blank, but there are corresponding attributes in many other commonly used objectClass'es, eg. attribute eduPersonNickname in objectClass eduPerson. --- .../android/ldapsync/client/Contact.java | 10 +++++++++ .../ldapsync/platform/ContactManager.java | 6 +++++ .../ldapsync/platform/ContactMerger.java | 22 +++++++++++++++++++ app/src/main/res/values-de/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/preference_resources.xml | 4 ++++ 6 files changed, 44 insertions(+) diff --git a/app/src/main/java/de/wikilab/android/ldapsync/client/Contact.java b/app/src/main/java/de/wikilab/android/ldapsync/client/Contact.java index a5c5162..26501b4 100644 --- a/app/src/main/java/de/wikilab/android/ldapsync/client/Contact.java +++ b/app/src/main/java/de/wikilab/android/ldapsync/client/Contact.java @@ -35,6 +35,7 @@ public class Contact { private String dn = ""; private String firstName = ""; private String lastName = ""; + private String nickname = ""; private String cellWorkPhone = ""; private String workPhone = ""; private String homePhone = ""; @@ -62,10 +63,18 @@ public String getLastName() { return lastName; } + public String getNickname() { + return nickname; + } + public void setLastName(String lastName) { this.lastName = lastName; } + public void setNickname(String nickname) { + this.nickname = nickname; + } + public void setCellWorkPhone(String cellWorkPhone) { this.cellWorkPhone = cellWorkPhone; } @@ -132,6 +141,7 @@ public static Contact valueOf(ReadOnlyEntry user, SharedPreferences preferences) if (getAttributevalue(user, preferences, "last_name") == null || getAttributevalue(user, preferences, "first_name") == null) { return null; } + c.setNickname(getAttributevalue(user, preferences, "nickname")); c.setWorkPhone(getAttributevalue(user, preferences, "office_phone")); c.setCellWorkPhone(getAttributevalue(user, preferences, "cell_phone")); c.setHomePhone(getAttributevalue(user, preferences, "home_phone")); diff --git a/app/src/main/java/de/wikilab/android/ldapsync/platform/ContactManager.java b/app/src/main/java/de/wikilab/android/ldapsync/platform/ContactManager.java index f51cd2a..128d230 100644 --- a/app/src/main/java/de/wikilab/android/ldapsync/platform/ContactManager.java +++ b/app/src/main/java/de/wikilab/android/ldapsync/platform/ContactManager.java @@ -41,6 +41,7 @@ import android.provider.ContactsContract.RawContacts; import android.provider.ContactsContract.Settings; import android.provider.ContactsContract.CommonDataKinds.Email; +import android.provider.ContactsContract.CommonDataKinds.Nickname; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.Photo; import android.provider.ContactsContract.CommonDataKinds.StructuredName; @@ -117,6 +118,8 @@ private void mapCursorToContact(final Cursor c, Contact existingContact) { //existingContact.setDisplayName(c.getString(c.getColumnIndex(Data.DATA1))); existingContact.setFirstName(c.getString(c.getColumnIndex(Data.DATA2))); existingContact.setLastName(c.getString(c.getColumnIndex(Data.DATA3))); + } else if (mimetype.equals(Nickname.CONTENT_ITEM_TYPE)) { + existingContact.setNickname(c.getString(c.getColumnIndex(Data.DATA1))); } else if (mimetype.equals(Email.CONTENT_ITEM_TYPE)) { int type = c.getInt(c.getColumnIndex(Data.DATA2)); if (type == Email.TYPE_WORK) { @@ -212,6 +215,8 @@ private void updateContact(ContentResolver resolver, long rawContactId, Contact if (mimetype.equals(StructuredName.CONTENT_ITEM_TYPE)) { existingContact.setFirstName(c.getString(c.getColumnIndex(Data.DATA2))); existingContact.setLastName(c.getString(c.getColumnIndex(Data.DATA3))); + } else if (mimetype.equals(Nickname.CONTENT_ITEM_TYPE)) { + existingContact.setNickname(c.getString(c.getColumnIndex(Data.DATA1))); } else if (mimetype.equals(Email.CONTENT_ITEM_TYPE)) { int type = c.getInt(c.getColumnIndex(Data.DATA2)); if (type == Email.TYPE_WORK) { @@ -335,6 +340,7 @@ private void addContact(ContentResolver resolver, String accountName, Contact co private void prepareFields(long rawContactId, Contact newC, Contact existingC, ArrayList ops, boolean isNew) { ContactMerger contactMerger = new ContactMerger(rawContactId, newC, existingC, ops, l); contactMerger.updateName(); + contactMerger.updateNickname(); contactMerger.updateMail(Email.TYPE_WORK); contactMerger.updatePhone(Phone.TYPE_WORK_MOBILE); diff --git a/app/src/main/java/de/wikilab/android/ldapsync/platform/ContactMerger.java b/app/src/main/java/de/wikilab/android/ldapsync/platform/ContactMerger.java index 482b3b8..5fe24af 100644 --- a/app/src/main/java/de/wikilab/android/ldapsync/platform/ContactMerger.java +++ b/app/src/main/java/de/wikilab/android/ldapsync/platform/ContactMerger.java @@ -26,6 +26,7 @@ import android.provider.ContactsContract; import android.provider.ContactsContract.Data; import android.provider.ContactsContract.CommonDataKinds.Email; +import android.provider.ContactsContract.CommonDataKinds.Nickname; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.CommonDataKinds.Photo; import android.provider.ContactsContract.CommonDataKinds.StructuredName; @@ -77,6 +78,27 @@ public void updateName() { } } + public void updateNickname() { + String selection = Data.RAW_CONTACT_ID + "=? AND " + Nickname.MIMETYPE + "=?"; + if (TextUtils.isEmpty(newC.getNickname()) && !TextUtils.isEmpty(existingC.getNickname())) { + l.d("Delete nickname (" + existingC.getNickname() + ")"); + ops.add(ContentProviderOperation.newDelete(addCallerIsSyncAdapterFlag(Data.CONTENT_URI)).withSelection(selection, + new String[] { rawContactId + "", Nickname.CONTENT_ITEM_TYPE }).build()); + } else if (!TextUtils.isEmpty(newC.getNickname()) && TextUtils.isEmpty(existingC.getNickname())) { + l.d("Add nickname (" + newC.getNickname() + ")"); + ContentValues cv = new ContentValues(); + cv.put(Nickname.NAME, newC.getNickname()); + cv.put(Nickname.MIMETYPE, Nickname.CONTENT_ITEM_TYPE); + Builder insertOp = createInsert(rawContactId, cv); + ops.add(insertOp.build()); + } else if (!TextUtils.isEmpty(newC.getNickname()) && !newC.getNickname().equals(existingC.getNickname())) { + l.d("Update nickname (" + existingC.getNickname() + " => " + newC.getNickname() + ")"); + Builder updateOp = ContentProviderOperation.newUpdate(addCallerIsSyncAdapterFlag(Data.CONTENT_URI)).withSelection(selection, + new String[] { rawContactId + "", Nickname.CONTENT_ITEM_TYPE }).withValue(Nickname.NAME, newC.getNickname()); + ops.add(updateOp.build()); + } + } + private Builder createInsert(long rawContactId, ContentValues cv) { Builder insertOp = ContentProviderOperation.newInsert(addCallerIsSyncAdapterFlag(Data.CONTENT_URI)).withValues(cv); if (rawContactId == -1) { diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9febc50..0202a1b 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -38,6 +38,7 @@ LDAP Zuordnungen Vorname Nachname + Spitzname Geschäftsnummer Mobilnummer Heimnummer diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 158a451..4046b1a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -38,6 +38,7 @@ LDAP Mappings First Name Last Name + Nickname Office Phone Cell Phone Home Phone diff --git a/app/src/main/res/xml/preference_resources.xml b/app/src/main/res/xml/preference_resources.xml index fea19fa..8028b10 100644 --- a/app/src/main/res/xml/preference_resources.xml +++ b/app/src/main/res/xml/preference_resources.xml @@ -25,6 +25,10 @@ android:defaultValue="sn" android:key="last_name" android:title="Last Name"/> +