Set missing score for contacts

We borrow the formula from GMSCore to set the score for the contacts.
Right now it is calculated based on:
Base_score(1) + # of addtionalNames + # of contactPoints

Bug: b/228444665
Test: ContactsIndexerTests
Change-Id: I56184094279875ed963f163dd1b43fbc33beecfe
diff --git a/service/java/com/android/server/appsearch/contactsindexer/PersonBuilderHelper.java b/service/java/com/android/server/appsearch/contactsindexer/PersonBuilderHelper.java
index 50bdd2f..0cddb53 100644
--- a/service/java/com/android/server/appsearch/contactsindexer/PersonBuilderHelper.java
+++ b/service/java/com/android/server/appsearch/contactsindexer/PersonBuilderHelper.java
@@ -47,6 +47,7 @@
 public final class PersonBuilderHelper {
     static final String TAG = "PersonBuilderHelper";
     static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
+    static final int BASE_SCORE = 1;
 
     // We want to store id separately even if we do have it set in the builder, since we
     // can't get its value out of the builder, which will be used to fetch fingerprints.
@@ -80,12 +81,19 @@
             mBuilder.addContactPoint(builder.build());
         }
         // Set the fingerprint and creationTimestamp to 0 to calculate the actual fingerprint.
+        mBuilder.setScore(0);
         mBuilder.setFingerprint(EMPTY_BYTE_ARRAY);
         mBuilder.setCreationTimestampMillis(0);
         // Build a person for generating the fingerprint.
         Person contactForFingerPrint = mBuilder.build();
         try {
             byte[] fingerprint = generateFingerprintMD5(contactForFingerPrint);
+            // This is an "a priori" document score that doesn't take any usage into account.
+            // Hence, the heuristic that's used to assign the document score is to add the
+            // presence or count of all the salient properties of the contact.
+            int score = BASE_SCORE + contactForFingerPrint.getContactPoints().length
+                    + contactForFingerPrint.getAdditionalNames().length;
+            mBuilder.setScore(score);
             mBuilder.setFingerprint(fingerprint);
             mBuilder.setCreationTimestampMillis(mCreationTimestampMillis);
         } catch (NoSuchAlgorithmException e) {
diff --git a/service/java/com/android/server/appsearch/contactsindexer/appsearchtypes/Person.java b/service/java/com/android/server/appsearch/contactsindexer/appsearchtypes/Person.java
index 42e4f31..2c77da5 100644
--- a/service/java/com/android/server/appsearch/contactsindexer/appsearchtypes/Person.java
+++ b/service/java/com/android/server/appsearch/contactsindexer/appsearchtypes/Person.java
@@ -405,7 +405,6 @@
             setPropertyLong(PERSON_PROPERTY_ADDITIONAL_NAME_TYPES, primitiveNameTypes);
             setPropertyString(PERSON_PROPERTY_ADDITIONAL_NAMES,
                     mAdditionalNames.toArray(new String[0]));
-
             setPropertyString(PERSON_PROPERTY_AFFILIATIONS,
                     mAffiliations.toArray(new String[0]));
             setPropertyString(PERSON_PROPERTY_RELATIONS,
diff --git a/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/PersonBuilderHelperTest.java b/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/PersonBuilderHelperTest.java
index de2da3c..e004175 100644
--- a/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/PersonBuilderHelperTest.java
+++ b/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/PersonBuilderHelperTest.java
@@ -240,4 +240,42 @@
 
         assertThat(person.getFingerprint()).isNotEqualTo(person2.getFingerprint());
     }
+
+    @Test
+    public void testScore_setCorrectly() {
+        String namespace = "namespace";
+        String id = "id";
+        String name = "name";
+        List<String> additionalNames = Arrays.asList("name1", "name2");
+        Person.Builder personBuilder = new Person.Builder(namespace, id, name)
+                .addAdditionalName(Person.TYPE_NICKNAME, additionalNames.get(0))
+                .addAdditionalName(Person.TYPE_PHONETIC_NAME, additionalNames.get(1));
+        ContactPoint contact1 = new ContactPoint.Builder(namespace, id + "1", "Home")
+                .addAddress("addr1")
+                .addPhone("phone1")
+                .addEmail("email1")
+                .addAppId("appId1")
+                .build();
+        ContactPoint contact2 = new ContactPoint.Builder(namespace, id + "2", "Work")
+                .addAddress("addr2")
+                .addPhone("phone2")
+                .addEmail("email2")
+                .addAppId("appId2")
+                .build();
+        ContactPoint contact3 = new ContactPoint.Builder(namespace, id + "3", "Other")
+                .addAddress("addr3")
+                .addPhone("phone3")
+                .addEmail("email3")
+                .addAppId("appId3")
+                .build();
+        personBuilder.addContactPoint(contact1)
+                .addContactPoint(contact2)
+                .addContactPoint(contact3);
+
+        Person person = new PersonBuilderHelper(id, personBuilder).setCreationTimestampMillis(
+                0).setCreationTimestampMillis(0).buildPerson();
+
+        // Score should be set as base(1) + # of contactPoints + # of additionalNames.
+        assertThat(person.getScore()).isEqualTo(6);
+    }
 }
diff --git a/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/appsearchtypes/PersonTest.java b/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/appsearchtypes/PersonTest.java
index 2f9859b..70c8082 100644
--- a/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/appsearchtypes/PersonTest.java
+++ b/testing/contactsindexertests/src/com/android/server/appsearch/contactsindexer/appsearchtypes/PersonTest.java
@@ -32,6 +32,7 @@
         long creationTimestamp = 12345L;
         String namespace = "namespace";
         String id = "id";
+        int score = 3;
         String name = "name";
         String givenName = "givenName";
         String middleName = "middleName";
@@ -57,6 +58,12 @@
                 .addEmail("email2")
                 .addAppId("appId2")
                 .build();
+        ContactPoint contact3 = new ContactPoint.Builder(namespace, id + "3", "Other")
+                .addAddress("addr3")
+                .addPhone("phone3")
+                .addEmail("email3")
+                .addAppId("appId3")
+                .build();
         List<String> additionalNames = ImmutableList.of("nickname", "phoneticName");
         @Person.NameType
         List<Long> additionalNameTypes = ImmutableList.of((long) Person.TYPE_NICKNAME,
@@ -64,6 +71,7 @@
 
         Person person = new Person.Builder(namespace, id, name)
                 .setCreationTimestampMillis(creationTimestamp)
+                .setScore(score)
                 .setGivenName(givenName)
                 .setMiddleName(middleName)
                 .setFamilyName(lastName)
@@ -83,9 +91,11 @@
                 .setFingerprint(fingerprint)
                 .addContactPoint(contact1)
                 .addContactPoint(contact2)
+                .addContactPoint(contact3)
                 .build();
 
         assertThat(person.getCreationTimestampMillis()).isEqualTo(creationTimestamp);
+        assertThat(person.getScore()).isEqualTo(score);
         assertThat(person.getNamespace()).isEqualTo(namespace);
         assertThat(person.getId()).isEqualTo(id);
         assertThat(person.getName()).isEqualTo(name);
@@ -102,6 +112,7 @@
         assertThat(person.getAdditionalNameTypes()).asList().isEqualTo(additionalNameTypes);
         assertThat(person.getAffiliations()).asList().isEqualTo(affiliations);
         assertThat(person.getRelations()).asList().isEqualTo(relations);
-        assertThat(person.getContactPoints()).asList().containsExactly(contact1, contact2);
+        assertThat(person.getContactPoints()).asList().containsExactly(contact1, contact2,
+                contact3);
     }
 }
\ No newline at end of file