aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZheng Fu <zhengfu@google.com>2015-07-07 15:25:28 -0700
committerZheng Fu <zhengfu@google.com>2015-07-07 15:25:28 -0700
commit5ca831dc33dfa16821647e14e377c484df823c80 (patch)
treed8d94b41d182c37a5b20be3dc4653385af405080
parent1d48d5a992c32d37bc9535686d96569680639cfa (diff)
downloadContactsProvider-5ca831dc33dfa16821647e14e377c484df823c80.tar.gz
Fix bug in aggregation suggestions in new contacts aggregator.
New contact aggregator is using rawContactsMatcher, which is keyed by rawContactId instead of contactId. So we need to remove bestMatches with duplicate contactId for calculating the aggregation suggestions. Bug:22224442 Change-Id: I9e77400a5b09ec28d5bc120706cd4dfe2e296d56
-rw-r--r--src/com/android/providers/contacts/aggregation/AbstractContactAggregator.java12
-rw-r--r--tests/src/com/android/providers/contacts/aggregation/ContactAggregator2Test.java13
2 files changed, 20 insertions, 5 deletions
diff --git a/src/com/android/providers/contacts/aggregation/AbstractContactAggregator.java b/src/com/android/providers/contacts/aggregation/AbstractContactAggregator.java
index 0caa861f..cfbad32b 100644
--- a/src/com/android/providers/contacts/aggregation/AbstractContactAggregator.java
+++ b/src/com/android/providers/contacts/aggregation/AbstractContactAggregator.java
@@ -1928,7 +1928,17 @@ public abstract class AbstractContactAggregator {
db.beginTransaction();
try {
List<MatchScore> bestMatches = findMatchingContacts(db, contactId, parameters);
- return queryMatchingContacts(qb, db, projection, bestMatches, maxSuggestions, filter);
+ List<MatchScore> bestMatchesWithoutDuplicateContactIds = new ArrayList<>();
+ Set<Long> contactIds = new HashSet<>();
+ for (MatchScore bestMatch : bestMatches) {
+ long cid = bestMatch.getContactId();
+ if (!contactIds.contains(cid)) {
+ bestMatchesWithoutDuplicateContactIds.add(bestMatch);
+ contactIds.add(cid);
+ }
+ }
+ return queryMatchingContacts(qb, db, projection, bestMatchesWithoutDuplicateContactIds,
+ maxSuggestions, filter);
} finally {
db.endTransaction();
}
diff --git a/tests/src/com/android/providers/contacts/aggregation/ContactAggregator2Test.java b/tests/src/com/android/providers/contacts/aggregation/ContactAggregator2Test.java
index 53e63cb0..ac64cacf 100644
--- a/tests/src/com/android/providers/contacts/aggregation/ContactAggregator2Test.java
+++ b/tests/src/com/android/providers/contacts/aggregation/ContactAggregator2Test.java
@@ -916,14 +916,15 @@ public class ContactAggregator2Test extends BaseContactsProvider2Test {
}
public void testAggregationSuggestionsBasedOnName() {
+ // Exact name match contact with two raw contacts
long rawContactId1 = RawContactUtil.createRawContact(mResolver);
DataUtil.insertStructuredName(mResolver, rawContactId1, "Duane", null);
+ insertPhoneNumber(rawContactId1, "(888)555-1236");
- // Exact name match
+ // Exact name match contact with two raw contacts
long rawContactId2 = RawContactUtil.createRawContact(mResolver);
DataUtil.insertStructuredName(mResolver, rawContactId2, "Duane", null);
- setAggregationException(AggregationExceptions.TYPE_KEEP_SEPARATE,
- rawContactId1, rawContactId2);
+ insertPhoneNumber(rawContactId2, "(888)555-1236");
// Edit distance == 0.84
long rawContactId3 = RawContactUtil.createRawContact(mResolver);
@@ -933,11 +934,15 @@ public class ContactAggregator2Test extends BaseContactsProvider2Test {
long rawContactId4 = RawContactUtil.createRawContact(mResolver);
DataUtil.insertStructuredName(mResolver, rawContactId4, "Donny", null);
+ long rawContactId5 = RawContactUtil.createRawContact(mResolver);
+ DataUtil.insertStructuredName(mResolver, rawContactId5, "Duane", null);
+
long contactId1 = queryContactId(rawContactId1);
long contactId2 = queryContactId(rawContactId2);
long contactId3 = queryContactId(rawContactId3);
- assertSuggestions(contactId1, contactId2, contactId3);
+ assertEquals(contactId1, contactId2);
+ assertSuggestions(queryContactId(rawContactId5), contactId1, contactId3);
}
public void testAggregationSuggestionsBasedOnPhoneNumber() {