diff options
Diffstat (limited to 'src/com/android/dialer/dialpad/SmartDialLoaderTask.java')
-rw-r--r-- | src/com/android/dialer/dialpad/SmartDialLoaderTask.java | 95 |
1 files changed, 16 insertions, 79 deletions
diff --git a/src/com/android/dialer/dialpad/SmartDialLoaderTask.java b/src/com/android/dialer/dialpad/SmartDialLoaderTask.java index d584c1793..71cbfa27d 100644 --- a/src/com/android/dialer/dialpad/SmartDialLoaderTask.java +++ b/src/com/android/dialer/dialpad/SmartDialLoaderTask.java @@ -18,24 +18,21 @@ package com.android.dialer.dialpad; import static com.android.dialer.dialpad.SmartDialController.LOG_TAG; +import android.content.Context; import android.os.AsyncTask; import android.provider.ContactsContract; import android.provider.ContactsContract.Contacts; import android.telephony.PhoneNumberUtils; -import android.util.Log; import com.android.contacts.common.preference.ContactsPreferences; import com.android.contacts.common.util.StopWatch; -import com.android.dialer.dialpad.SmartDialCache.ContactNumber; +import com.android.dialer.database.DialerDatabaseHelper; +import com.android.dialer.database.DialerDatabaseHelper.ContactNumber; -import com.google.common.base.Objects; import com.google.common.collect.Lists; import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; import java.util.List; -import java.util.Set; /** * This task searches through the provided cache to return the top 3 contacts(ranked by confidence) @@ -50,28 +47,20 @@ public class SmartDialLoaderTask extends AsyncTask<String, Integer, List<SmartDi static private final boolean DEBUG = false; - private static final int MAX_ENTRIES = 3; - - private final SmartDialCache mContactsCache; - private final SmartDialLoaderCallback mCallback; + private final DialerDatabaseHelper mDialerDatabaseHelper; + private final String mQuery; - /** - * See {@link ContactsPreferences#getDisplayOrder()}. - * {@link ContactsContract.Preferences#DISPLAY_ORDER_PRIMARY} (first name first) - * {@link ContactsContract.Preferences#DISPLAY_ORDER_ALTERNATIVE} (last name first) - */ private final SmartDialNameMatcher mNameMatcher; - public SmartDialLoaderTask(SmartDialLoaderCallback callback, String query, - SmartDialCache cache) { + public SmartDialLoaderTask(SmartDialLoaderCallback callback, String query, Context context) { this.mCallback = callback; - this.mContactsCache = cache; - this.mNameMatcher = new SmartDialNameMatcher(PhoneNumberUtils.normalizeNumber(query), - cache.getMap()); + mDialerDatabaseHelper = DialerDatabaseHelper.getInstance(context); this.mQuery = query; + this.mNameMatcher = new SmartDialNameMatcher(PhoneNumberUtils.normalizeNumber(query), + SmartDialPrefix.getMap()); } @Override @@ -87,85 +76,33 @@ public class SmartDialLoaderTask extends AsyncTask<String, Integer, List<SmartDi } /** - * Loads all visible contacts with phone numbers and check if their display names match the - * query. Return at most {@link #MAX_ENTRIES} {@link SmartDialEntry}'s for the matching - * contacts. + * Loads top visible contacts with phone numbers and check if their display names match the + * query. */ private ArrayList<SmartDialEntry> getContactMatches() { - final SmartDialTrie trie = mContactsCache.getContacts(); - final boolean matchNanp = mContactsCache.getUserInNanpRegion(); - - if (DEBUG) { - Log.d(LOG_TAG, "Size of cache: " + trie.size()); - } - final StopWatch stopWatch = DEBUG ? StopWatch.start("Start Match") : null; - final ArrayList<ContactNumber> allMatches = trie.getAllWithPrefix(mNameMatcher.getQuery()); + + final ArrayList<ContactNumber> allMatches = mDialerDatabaseHelper.getLooseMatches(mQuery, + mNameMatcher); if (DEBUG) { stopWatch.lap("Find matches"); } - // Sort matches in order of ascending contact affinity (lower is better) - Collections.sort(allMatches, new SmartDialCache.ContactAffinityComparator()); - if (DEBUG) { - stopWatch.lap("Sort"); - } - final Set<ContactMatch> duplicates = new HashSet<ContactMatch>(); + final ArrayList<SmartDialEntry> candidates = Lists.newArrayList(); for (ContactNumber contact : allMatches) { - final ContactMatch contactMatch = new ContactMatch(contact.lookupKey, contact.id); - // Don't add multiple contact numbers from the same contact into suggestions if - // there are multiple matches. Instead, just keep the highest priority number - // instead. - if (duplicates.contains(contactMatch)) { - continue; - } - duplicates.add(contactMatch); final boolean matches = mNameMatcher.matches(contact.displayName); - candidates.add(new SmartDialEntry( contact.displayName, Contacts.getLookupUri(contact.id, contact.lookupKey), contact.phoneNumber, mNameMatcher.getMatchPositions(), - mNameMatcher.matchesNumber(contact.phoneNumber, - mNameMatcher.getQuery(), matchNanp) + mNameMatcher.matchesNumber(contact.phoneNumber, mNameMatcher.getQuery()) )); - if (candidates.size() >= MAX_ENTRIES) { - break; - } } if (DEBUG) { stopWatch.stopAndLog(LOG_TAG + " Match Complete", 0); } return candidates; } - - private class ContactMatch { - public final String lookupKey; - public final long id; - - public ContactMatch(String lookupKey, long id) { - this.lookupKey = lookupKey; - this.id = id; - } - - @Override - public int hashCode() { - return Objects.hashCode(lookupKey, id); - } - - @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object instanceof ContactMatch) { - ContactMatch that = (ContactMatch) object; - return Objects.equal(this.lookupKey, that.lookupKey) - && Objects.equal(this.id, that.id); - } - return false; - } - } } |