Simplified and fixed aggregation on structured name.

Removed all of the over-engineered treatment of first name only,
last name only and similar use cases.

Now there are just three types of name matches:

1. Exact match
2. Variant match: first/last name flipped, Jeff/Jeffrey
3. Collation key match: this can be used for approximate matching
diff --git a/src/com/android/providers/contacts/ContactAggregator.java b/src/com/android/providers/contacts/ContactAggregator.java
index 1a0a0a0..a5a2aa9 100644
--- a/src/com/android/providers/contacts/ContactAggregator.java
+++ b/src/com/android/providers/contacts/ContactAggregator.java
@@ -569,39 +569,27 @@
                 return;
             }
 
-            addMatchCandidatesFamilyNameOnly(familyName, candidates);
+            addMatchCandidatesSingleName(familyName, candidates);
         } else if (TextUtils.isEmpty(familyName)) {
-            addMatchCandidatesGivenNameOnly(givenName, candidates);
+            addMatchCandidatesSingleName(givenName, candidates);
         } else {
             addMatchCandidatesFullName(givenName, familyName, mode, candidates);
         }
     }
 
-    private void addMatchCandidatesGivenNameOnly(String givenName,
-            MatchCandidateList candidates) {
-        String givenNameN = NameNormalizer.normalize(givenName);
-        candidates.add(givenNameN, NameLookupType.GIVEN_NAME_ONLY);
-
-        String[] clusters = mOpenHelper.getCommonNicknameClusters(givenNameN);
-        if (clusters != null) {
-            for (int i = 0; i < clusters.length; i++) {
-                candidates.add(clusters[i], NameLookupType.GIVEN_NAME_ONLY_AS_NICKNAME);
-            }
-        }
-    }
-
-    private void addMatchCandidatesFamilyNameOnly(String familyName,
-            MatchCandidateList candidates) {
-        String familyNameN = NameNormalizer.normalize(familyName);
-        candidates.add(familyNameN, NameLookupType.FAMILY_NAME_ONLY);
+    private void addMatchCandidatesSingleName(String name, MatchCandidateList candidates) {
+        String nameN = NameNormalizer.normalize(name);
+        candidates.add(nameN, NameLookupType.NAME_EXACT);
 
         // Take care of first and last names swapped
-        String[] clusters = mOpenHelper.getCommonNicknameClusters(familyNameN);
+        String[] clusters = mOpenHelper.getCommonNicknameClusters(nameN);
         if (clusters != null) {
             for (int i = 0; i < clusters.length; i++) {
-                candidates.add(clusters[i], NameLookupType.FAMILY_NAME_ONLY_AS_NICKNAME);
+                candidates.add(clusters[i], NameLookupType.NAME_VARIANT);
             }
         }
+
+        candidates.add(nameN, NameLookupType.NAME_COLLATION_KEY);
     }
 
     private void addMatchCandidatesFullName(String givenName, String familyName, int mode,
@@ -610,40 +598,22 @@
         final String[] givenNameNicknames = mOpenHelper.getCommonNicknameClusters(givenNameN);
         final String familyNameN = NameNormalizer.normalize(familyName);
         final String[] familyNameNicknames = mOpenHelper.getCommonNicknameClusters(familyNameN);
-        candidates.add(givenNameN + "." + familyNameN, NameLookupType.FULL_NAME);
+        candidates.add(givenNameN + "." + familyNameN, NameLookupType.NAME_EXACT);
         if (givenNameNicknames != null) {
             for (int i = 0; i < givenNameNicknames.length; i++) {
                 candidates.add(givenNameNicknames[i] + "." + familyNameN,
-                        NameLookupType.FULL_NAME_WITH_NICKNAME);
+                        NameLookupType.NAME_VARIANT);
             }
         }
-        candidates.add(familyNameN + "." + givenNameN, NameLookupType.FULL_NAME_REVERSE);
+        candidates.add(familyNameN + "." + givenNameN, NameLookupType.NAME_VARIANT);
         if (familyNameNicknames != null) {
             for (int i = 0; i < familyNameNicknames.length; i++) {
                 candidates.add(familyNameNicknames[i] + "." + givenNameN,
-                        NameLookupType.FULL_NAME_WITH_NICKNAME_REVERSE);
+                        NameLookupType.NAME_VARIANT);
             }
         }
-        candidates.add(givenNameN + familyNameN, NameLookupType.FULL_NAME_CONCATENATED);
-        candidates.add(familyNameN + givenNameN, NameLookupType.FULL_NAME_REVERSE_CONCATENATED);
-
-        if (mode == MODE_AGGREGATION || mode == MODE_SUGGESTIONS) {
-            candidates.add(givenNameN, NameLookupType.GIVEN_NAME_ONLY);
-            if (givenNameNicknames != null) {
-                for (int i = 0; i < givenNameNicknames.length; i++) {
-                    candidates.add(givenNameNicknames[i],
-                            NameLookupType.GIVEN_NAME_ONLY_AS_NICKNAME);
-                }
-            }
-
-            candidates.add(familyNameN, NameLookupType.FAMILY_NAME_ONLY);
-            if (familyNameNicknames != null) {
-                for (int i = 0; i < familyNameNicknames.length; i++) {
-                    candidates.add(familyNameNicknames[i],
-                            NameLookupType.FAMILY_NAME_ONLY_AS_NICKNAME);
-                }
-            }
-        }
+        candidates.add(givenNameN + familyNameN, NameLookupType.NAME_COLLATION_KEY);
+        candidates.add(familyNameN + givenNameN, NameLookupType.NAME_COLLATION_KEY);
     }
 
     /**
diff --git a/src/com/android/providers/contacts/ContactMatcher.java b/src/com/android/providers/contacts/ContactMatcher.java
index 6ab98dd..15c5c43 100644
--- a/src/com/android/providers/contacts/ContactMatcher.java
+++ b/src/com/android/providers/contacts/ContactMatcher.java
@@ -91,90 +91,29 @@
      * scores than direct matches.
      */
     static {
-        setScoreRange(NameLookupType.FULL_NAME,
-                NameLookupType.FULL_NAME, 99, 99);
-        setScoreRange(NameLookupType.FULL_NAME,
-                NameLookupType.FULL_NAME_REVERSE, 90, 90);
+        setScoreRange(NameLookupType.NAME_EXACT,
+                NameLookupType.NAME_EXACT, 99, 99);
+        setScoreRange(NameLookupType.NAME_VARIANT,
+                NameLookupType.NAME_VARIANT, 90, 90);
+        setScoreRange(NameLookupType.NAME_COLLATION_KEY,
+                NameLookupType.NAME_COLLATION_KEY, 40, 80);
 
-        setScoreRange(NameLookupType.FULL_NAME_REVERSE,
-                NameLookupType.FULL_NAME, 90, 90);
-        setScoreRange(NameLookupType.FULL_NAME_REVERSE,
-                NameLookupType.FULL_NAME_REVERSE, 99, 99);
-
-        setScoreRange(NameLookupType.FULL_NAME_CONCATENATED,
-                NameLookupType.FULL_NAME_CONCATENATED, 40, 80);
-        setScoreRange(NameLookupType.FULL_NAME_CONCATENATED,
-                NameLookupType.FULL_NAME_REVERSE_CONCATENATED, 30, 70);
-        setScoreRange(NameLookupType.FULL_NAME_CONCATENATED,
+        setScoreRange(NameLookupType.NAME_COLLATION_KEY,
                 NameLookupType.EMAIL_BASED_NICKNAME, 30, 60);
-        setScoreRange(NameLookupType.FULL_NAME_CONCATENATED,
+        setScoreRange(NameLookupType.NAME_COLLATION_KEY,
                 NameLookupType.NICKNAME, 30, 60);
 
-        setScoreRange(NameLookupType.FULL_NAME_REVERSE_CONCATENATED,
-                NameLookupType.FULL_NAME_CONCATENATED, 30, 70);
-        setScoreRange(NameLookupType.FULL_NAME_REVERSE_CONCATENATED,
-                NameLookupType.FULL_NAME_REVERSE_CONCATENATED, 40, 80);
-
-        setScoreRange(NameLookupType.FULL_NAME_WITH_NICKNAME,
-                NameLookupType.FULL_NAME_WITH_NICKNAME, 75, 75);
-        setScoreRange(NameLookupType.FULL_NAME_WITH_NICKNAME_REVERSE,
-                NameLookupType.FULL_NAME_WITH_NICKNAME_REVERSE, 73, 73);
-
-        setScoreRange(NameLookupType.FAMILY_NAME_ONLY,
-                NameLookupType.FAMILY_NAME_ONLY, 45, 75);
-        setScoreRange(NameLookupType.FAMILY_NAME_ONLY,
-                NameLookupType.FULL_NAME_CONCATENATED, 32, 72);
-        setScoreRange(NameLookupType.FAMILY_NAME_ONLY,
-                NameLookupType.FULL_NAME_REVERSE_CONCATENATED, 30, 70);
-        setScoreRange(NameLookupType.FAMILY_NAME_ONLY,
-                NameLookupType.EMAIL_BASED_NICKNAME, 30, 60);
-        setScoreRange(NameLookupType.FAMILY_NAME_ONLY,
-                NameLookupType.NICKNAME, 30, 60);
-
-        setScoreRange(NameLookupType.FAMILY_NAME_ONLY_AS_NICKNAME,
-                NameLookupType.FAMILY_NAME_ONLY_AS_NICKNAME, 71, 71);
-        setScoreRange(NameLookupType.FAMILY_NAME_ONLY_AS_NICKNAME,
-                NameLookupType.GIVEN_NAME_ONLY_AS_NICKNAME, 70, 70);
-
-        setScoreRange(NameLookupType.GIVEN_NAME_ONLY,
-                NameLookupType.GIVEN_NAME_ONLY, 40, 70);
-        setScoreRange(NameLookupType.GIVEN_NAME_ONLY,
-                NameLookupType.FULL_NAME_CONCATENATED, 32, 72);
-        setScoreRange(NameLookupType.GIVEN_NAME_ONLY,
-                NameLookupType.FULL_NAME_REVERSE_CONCATENATED, 30, 70);
-        setScoreRange(NameLookupType.GIVEN_NAME_ONLY,
-                NameLookupType.EMAIL_BASED_NICKNAME, 30, 60);
-        setScoreRange(NameLookupType.GIVEN_NAME_ONLY,
-                NameLookupType.NICKNAME, 30, 60);
-
-        setScoreRange(NameLookupType.GIVEN_NAME_ONLY_AS_NICKNAME,
-                NameLookupType.GIVEN_NAME_ONLY_AS_NICKNAME, 73, 73);
-        setScoreRange(NameLookupType.GIVEN_NAME_ONLY_AS_NICKNAME,
-                NameLookupType.FAMILY_NAME_ONLY_AS_NICKNAME, 70, 70);
-
         setScoreRange(NameLookupType.EMAIL_BASED_NICKNAME,
                 NameLookupType.EMAIL_BASED_NICKNAME, 30, 60);
         setScoreRange(NameLookupType.EMAIL_BASED_NICKNAME,
-                NameLookupType.GIVEN_NAME_ONLY, 30, 60);
-        setScoreRange(NameLookupType.EMAIL_BASED_NICKNAME,
-                NameLookupType.FAMILY_NAME_ONLY, 30, 60);
-        setScoreRange(NameLookupType.EMAIL_BASED_NICKNAME,
-                NameLookupType.FULL_NAME_CONCATENATED, 30, 60);
-        setScoreRange(NameLookupType.EMAIL_BASED_NICKNAME,
-                NameLookupType.FULL_NAME_REVERSE_CONCATENATED, 30, 60);
+                NameLookupType.NAME_COLLATION_KEY, 30, 60);
         setScoreRange(NameLookupType.EMAIL_BASED_NICKNAME,
                 NameLookupType.NICKNAME, 30, 60);
 
         setScoreRange(NameLookupType.NICKNAME,
                 NameLookupType.NICKNAME, 30, 60);
         setScoreRange(NameLookupType.NICKNAME,
-                NameLookupType.GIVEN_NAME_ONLY, 30, 60);
-        setScoreRange(NameLookupType.NICKNAME,
-                NameLookupType.FAMILY_NAME_ONLY, 30, 60);
-        setScoreRange(NameLookupType.NICKNAME,
-                NameLookupType.FULL_NAME_CONCATENATED, 30, 60);
-        setScoreRange(NameLookupType.NICKNAME,
-                NameLookupType.FULL_NAME_REVERSE_CONCATENATED, 30, 60);
+                NameLookupType.NAME_COLLATION_KEY, 30, 60);
         setScoreRange(NameLookupType.NICKNAME,
                 NameLookupType.EMAIL_BASED_NICKNAME, 30, 60);
     }
diff --git a/src/com/android/providers/contacts/OpenHelper.java b/src/com/android/providers/contacts/OpenHelper.java
index 05cf678..09935b1 100644
--- a/src/com/android/providers/contacts/OpenHelper.java
+++ b/src/com/android/providers/contacts/OpenHelper.java
@@ -59,7 +59,7 @@
 /* package */ class OpenHelper extends SQLiteOpenHelper {
     private static final String TAG = "OpenHelper";
 
-    private static final int DATABASE_VERSION = 65;
+    private static final int DATABASE_VERSION = 66;
     private static final String DATABASE_NAME = "contacts2.db";
     private static final String DATABASE_PRESENCE = "presence_db";
 
@@ -342,25 +342,19 @@
     }
 
     public final static class NameLookupType {
-        public static final int FULL_NAME = 0;
-        public static final int FULL_NAME_CONCATENATED = 1;
-        public static final int FULL_NAME_REVERSE = 2;
-        public static final int FULL_NAME_REVERSE_CONCATENATED = 3;
-        public static final int FULL_NAME_WITH_NICKNAME = 4;
-        public static final int FULL_NAME_WITH_NICKNAME_REVERSE = 5;
-        public static final int GIVEN_NAME_ONLY = 6;
-        public static final int GIVEN_NAME_ONLY_AS_NICKNAME = 7;
-        public static final int FAMILY_NAME_ONLY = 8;
-        public static final int FAMILY_NAME_ONLY_AS_NICKNAME = 9;
-        public static final int NICKNAME = 10;
-        public static final int EMAIL_BASED_NICKNAME = 11;
+        public static final int NAME_EXACT = 0;
+        public static final int NAME_VARIANT = 1;
+        public static final int NAME_COLLATION_KEY = 2;
+        public static final int NICKNAME = 3;
+        public static final int EMAIL_BASED_NICKNAME = 4;
 
         // This is the highest name lookup type code plus one
-        public static final int TYPE_COUNT = 12;
+        public static final int TYPE_COUNT = 5;
 
         public static boolean isBasedOnStructuredName(int nameLookupType) {
-            return nameLookupType != NameLookupType.EMAIL_BASED_NICKNAME
-                    && nameLookupType != NameLookupType.NICKNAME;
+            return nameLookupType == NameLookupType.NAME_EXACT
+                    || nameLookupType == NameLookupType.NAME_VARIANT
+                    || nameLookupType == NameLookupType.NAME_COLLATION_KEY;
         }
     }