Send Intent when CallerInfoCache should be updated

The cache should be updated when:
- custom ringtone is set,
- send-to-voicemail is set,
- a contact is edited and the change is submitted
  (discard shouldn't cause cache update)
- contacts are joined, or separated

Bug: 1735194
Change-Id: Icd4fea5fd09cc3adcffc5364705ab40e92f4e6e4
diff --git a/src/com/android/contacts/ContactSaveService.java b/src/com/android/contacts/ContactSaveService.java
index 6de361d..3fbca54 100644
--- a/src/com/android/contacts/ContactSaveService.java
+++ b/src/com/android/contacts/ContactSaveService.java
@@ -21,6 +21,7 @@
 import com.android.contacts.model.EntityDelta;
 import com.android.contacts.model.EntityDeltaList;
 import com.android.contacts.model.EntityModifier;
+import com.android.contacts.util.CallerInfoCacheUtils;
 import com.google.android.collect.Lists;
 import com.google.android.collect.Sets;
 
@@ -177,11 +178,15 @@
 
     @Override
     protected void onHandleIntent(Intent intent) {
+        // Call an appropriate method. If we're sure it affects how incoming phone calls are
+        // handled, then notify the fact to in-call screen.
         String action = intent.getAction();
         if (ACTION_NEW_RAW_CONTACT.equals(action)) {
             createRawContact(intent);
+            CallerInfoCacheUtils.sendUpdateCallerInfoCacheIntent(this);
         } else if (ACTION_SAVE_CONTACT.equals(action)) {
             saveContact(intent);
+            CallerInfoCacheUtils.sendUpdateCallerInfoCacheIntent(this);
         } else if (ACTION_CREATE_GROUP.equals(action)) {
             createGroup(intent);
         } else if (ACTION_RENAME_GROUP.equals(action)) {
@@ -198,12 +203,16 @@
             clearPrimary(intent);
         } else if (ACTION_DELETE_CONTACT.equals(action)) {
             deleteContact(intent);
+            CallerInfoCacheUtils.sendUpdateCallerInfoCacheIntent(this);
         } else if (ACTION_JOIN_CONTACTS.equals(action)) {
             joinContacts(intent);
+            CallerInfoCacheUtils.sendUpdateCallerInfoCacheIntent(this);
         } else if (ACTION_SET_SEND_TO_VOICEMAIL.equals(action)) {
             setSendToVoicemail(intent);
+            CallerInfoCacheUtils.sendUpdateCallerInfoCacheIntent(this);
         } else if (ACTION_SET_RINGTONE.equals(action)) {
             setRingtone(intent);
+            CallerInfoCacheUtils.sendUpdateCallerInfoCacheIntent(this);
         }
     }
 
diff --git a/src/com/android/contacts/util/CallerInfoCacheUtils.java b/src/com/android/contacts/util/CallerInfoCacheUtils.java
new file mode 100644
index 0000000..9e53159
--- /dev/null
+++ b/src/com/android/contacts/util/CallerInfoCacheUtils.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.contacts.util;
+
+import android.content.Context;
+import android.content.Intent;
+
+/**
+ * Utilities for managing CallerInfoCache.
+ *
+ * The cache lives in Phone package and is used as fallback storage when database lookup is slower
+ * than expected. It remembers some information necessary for responding to incoming calls
+ * (e.g. custom ringtone settings, send-to-voicemail).
+ *
+ * Even though the cache will be updated periodically, Contacts app can request the cache update
+ * via broadcast Intent. This class provides that mechanism, and possibly other misc utilities
+ * for the update mechanism.
+ */
+public final class CallerInfoCacheUtils {
+    private static final String UPDATE_CALLER_INFO_CACHE =
+            "com.android.phone.UPDATE_CALLER_INFO_CACHE";
+
+    private CallerInfoCacheUtils() {
+    }
+
+    /**
+     * Sends an Intent, notifying CallerInfo cache should be updated.
+     *
+     * Note: CallerInfo is *not* part of public API, and no guarantee is available around its
+     * specific behavior. In practice this will only be used by Phone package, but may change
+     * in the future.
+     *
+     * See also CallerInfoCache in Phone package for more information.
+     */
+    public static void sendUpdateCallerInfoCacheIntent(Context context) {
+        context.sendBroadcast(new Intent(UPDATE_CALLER_INFO_CACHE));
+    }
+}
\ No newline at end of file