From 414a5775bcdd3bac2bb1f0a0cb852fa0bcdd85f6 Mon Sep 17 00:00:00 2001 From: moezbhatti Date: Thu, 31 Oct 2019 01:19:47 -0400 Subject: [PATCH] Filter out duplicate phone number entries that come from multiple contacts providers Closes #1285 --- .../moez/QKSMS/mapper/CursorToContactImpl.kt | 15 ++++++++------ .../moez/QKSMS/migration/QkRealmMigration.kt | 3 +++ .../QKSMS/repository/SyncRepositoryImpl.kt | 20 +++++++++++++++++-- .../java/com/moez/QKSMS/model/PhoneNumber.kt | 1 + 4 files changed, 31 insertions(+), 8 deletions(-) diff --git a/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt b/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt index 072e777e..62f1602d 100644 --- a/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/mapper/CursorToContactImpl.kt @@ -35,6 +35,7 @@ class CursorToContactImpl @Inject constructor( val URI = Phone.CONTENT_URI val PROJECTION = arrayOf( Phone.LOOKUP_KEY, + Phone.ACCOUNT_TYPE_AND_DATA_SET, Phone.NUMBER, Phone.TYPE, Phone.LABEL, @@ -44,18 +45,20 @@ class CursorToContactImpl @Inject constructor( ) const val COLUMN_LOOKUP_KEY = 0 - const val COLUMN_NUMBER = 1 - const val COLUMN_TYPE = 2 - const val COLUMN_LABEL = 3 - const val COLUMN_DISPLAY_NAME = 4 - const val COLUMN_STARRED = 5 - const val CONTACT_LAST_UPDATED = 6 + const val COLUMN_ACCOUNT_TYPE = 1 + const val COLUMN_NUMBER = 2 + const val COLUMN_TYPE = 3 + const val COLUMN_LABEL = 4 + const val COLUMN_DISPLAY_NAME = 5 + const val COLUMN_STARRED = 6 + const val CONTACT_LAST_UPDATED = 7 } override fun map(from: Cursor) = Contact().apply { lookupKey = from.getString(COLUMN_LOOKUP_KEY) name = from.getString(COLUMN_DISPLAY_NAME) ?: "" numbers.add(PhoneNumber( + accountType = from.getString(COLUMN_ACCOUNT_TYPE), address = from.getString(COLUMN_NUMBER) ?: "", type = Phone.getTypeLabel(context.resources, from.getInt(COLUMN_TYPE), from.getString(COLUMN_LABEL)).toString() diff --git a/data/src/main/java/com/moez/QKSMS/migration/QkRealmMigration.kt b/data/src/main/java/com/moez/QKSMS/migration/QkRealmMigration.kt index 1461fa9b..2cf98f1f 100644 --- a/data/src/main/java/com/moez/QKSMS/migration/QkRealmMigration.kt +++ b/data/src/main/java/com/moez/QKSMS/migration/QkRealmMigration.kt @@ -127,6 +127,9 @@ class QkRealmMigration : RealmMigration { realm.schema.get("Contact") ?.addField("starred", Boolean::class.java, FieldAttribute.REQUIRED) + realm.schema.get("PhoneNumber") + ?.addField("accountType", String::class.java, FieldAttribute.REQUIRED) + version++ } diff --git a/data/src/main/java/com/moez/QKSMS/repository/SyncRepositoryImpl.kt b/data/src/main/java/com/moez/QKSMS/repository/SyncRepositoryImpl.kt index 679f592d..77bd2f9e 100644 --- a/data/src/main/java/com/moez/QKSMS/repository/SyncRepositoryImpl.kt +++ b/data/src/main/java/com/moez/QKSMS/repository/SyncRepositoryImpl.kt @@ -37,6 +37,7 @@ import com.moez.QKSMS.model.ContactGroup import com.moez.QKSMS.model.Conversation import com.moez.QKSMS.model.Message import com.moez.QKSMS.model.MmsPart +import com.moez.QKSMS.model.PhoneNumber import com.moez.QKSMS.model.Recipient import com.moez.QKSMS.model.SyncLog import com.moez.QKSMS.util.PhoneNumberUtils @@ -289,10 +290,25 @@ class SyncRepositoryImpl @Inject constructor( ?.map { cursor -> cursorToContact.map(cursor) } ?.groupBy { contact -> contact.lookupKey } ?.map { contacts -> - val allNumbers = contacts.value.map { it.numbers }.flatten() + // Sometimes, contacts providers on the phone will create duplicate phone number entries. This + // commonly happens with Whatsapp. Let's try to detect these duplicate entries and filter them out + val uniqueNumbers = mutableListOf() + contacts.value + .flatMap { it.numbers } + .sortedBy { it.accountType } + .forEach { number -> + val duplicate = uniqueNumbers.any { other -> + number.accountType != other.accountType + && phoneNumberUtils.compare(number.address, other.address) + } + if (!duplicate) { + uniqueNumbers += number + } + } + contacts.value.first().apply { numbers.clear() - numbers.addAll(allNumbers) + numbers.addAll(uniqueNumbers) } } ?: listOf() } diff --git a/domain/src/main/java/com/moez/QKSMS/model/PhoneNumber.kt b/domain/src/main/java/com/moez/QKSMS/model/PhoneNumber.kt index 070fb130..db02b9ef 100644 --- a/domain/src/main/java/com/moez/QKSMS/model/PhoneNumber.kt +++ b/domain/src/main/java/com/moez/QKSMS/model/PhoneNumber.kt @@ -21,6 +21,7 @@ package com.moez.QKSMS.model import io.realm.RealmObject open class PhoneNumber( + var accountType: String = "", var address: String = "", var type: String = "" ) : RealmObject() \ No newline at end of file