From 7201761f24b8479beb82389e434f7b7d4d4e259b Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Tue, 6 Dec 2022 23:02:18 -0500 Subject: [PATCH] Add contact groups to system tags --- .../android/PhoneNumberContact.java | 58 ++++++++++++++++++- .../services/QuickConversationsService.java | 2 +- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/cheogram/java/eu/siacs/conversations/android/PhoneNumberContact.java b/src/cheogram/java/eu/siacs/conversations/android/PhoneNumberContact.java index 3a3216c27..e9af90924 100644 --- a/src/cheogram/java/eu/siacs/conversations/android/PhoneNumberContact.java +++ b/src/cheogram/java/eu/siacs/conversations/android/PhoneNumberContact.java @@ -10,7 +10,10 @@ import android.provider.ContactsContract; import android.util.Log; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.HashMultimap; +import com.google.common.collect.Multimap; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -24,6 +27,7 @@ public class PhoneNumberContact extends AbstractPhoneContact { private final String phoneNumber; private final String typeLabel; + private final Collection groups; public String getPhoneNumber() { return phoneNumber; @@ -33,7 +37,17 @@ public class PhoneNumberContact extends AbstractPhoneContact { return typeLabel; } - private PhoneNumberContact(Context context, Cursor cursor) throws IllegalArgumentException { + public Collection getTags() { + Collection tags = new ArrayList(groups); + tags.add(typeLabel); + return tags; + } + + public Collection getGroups() { + return groups; + } + + private PhoneNumberContact(Context context, Cursor cursor, Collection groups) throws IllegalArgumentException { super(cursor); try { this.phoneNumber = PhoneNumberUtilWrapper.normalize(context, cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))); @@ -42,6 +56,7 @@ public class PhoneNumberContact extends AbstractPhoneContact { cursor.getInt(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE)), cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL)) ).toString(); + this.groups = groups; } catch (NumberParseException | NullPointerException e) { throw new IllegalArgumentException(e); } @@ -51,7 +66,44 @@ public class PhoneNumberContact extends AbstractPhoneContact { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context.checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) { return ImmutableMap.of(); } - final String[] PROJECTION = new String[]{ContactsContract.Data._ID, + + final HashMap groupTitles = new HashMap<>(); + try (final Cursor groups = context.getContentResolver().query( + ContactsContract.Groups.CONTENT_URI, + new String[]{ + ContactsContract.Groups._ID, + ContactsContract.Groups.TITLE + }, null, null, null + )) { + while (groups != null && groups.moveToNext()) { + groupTitles.put(groups.getString(0), groups.getString(1)); + } + } catch (final Exception e) { + return ImmutableMap.of(); + } + + final Multimap contactGroupMap = HashMultimap.create(); + try(final Cursor contactGroups = context.getContentResolver().query( + ContactsContract.Data.CONTENT_URI, + new String[]{ + ContactsContract.Data.CONTACT_ID, + ContactsContract.CommonDataKinds.GroupMembership.GROUP_ROW_ID + }, + ContactsContract.Data.MIMETYPE + "=?", + new String[]{ContactsContract.CommonDataKinds.GroupMembership.CONTENT_ITEM_TYPE}, + null + )) { + while (contactGroups != null && contactGroups.moveToNext()) { + final String groupTitle = groupTitles.get(contactGroups.getString(1)); + if (groupTitle != null) contactGroupMap.put(contactGroups.getString(0), groupTitle); + } + } catch (final Exception e) { + return ImmutableMap.of(); + } + + final String[] PROJECTION = new String[]{ + ContactsContract.Data._ID, + ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME, ContactsContract.Data.PHOTO_URI, ContactsContract.Data.LOOKUP_KEY, @@ -62,7 +114,7 @@ public class PhoneNumberContact extends AbstractPhoneContact { try (final Cursor cursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, PROJECTION, null, null, null)){ while (cursor != null && cursor.moveToNext()) { try { - final PhoneNumberContact contact = new PhoneNumberContact(context, cursor); + final PhoneNumberContact contact = new PhoneNumberContact(context, cursor, contactGroupMap.get(cursor.getString(1))); final PhoneNumberContact preexisting = contacts.get(contact.getPhoneNumber()); if (preexisting == null || preexisting.rating() < contact.rating()) { contacts.put(contact.getPhoneNumber(), contact); diff --git a/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java b/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java index 9c72ceff1..a20751571 100644 --- a/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java +++ b/src/cheogram/java/eu/siacs/conversations/services/QuickConversationsService.java @@ -136,7 +136,7 @@ public class QuickConversationsService extends AbstractQuickConversationsService final Jid jid = Jid.ofLocalAndDomain(phoneContact.getPhoneNumber(), gateway); final Contact contact = account.getRoster().getContact(jid); boolean needsCacheClean = contact.setPhoneContact(phoneContact); - needsCacheClean |= contact.setSystemTags(Collections.singleton(phoneContact.getTypeLabel())); + needsCacheClean |= contact.setSystemTags(phoneContact.getTags()); if (needsCacheClean) { service.getAvatarService().clear(contact); } -- 2.38.5