Handle notifications for apps on sd

Change-Id: I91b631ec9377b996b40594c4930243b868fa1ac6
diff --git a/src/com/android/contacts/model/Sources.java b/src/com/android/contacts/model/Sources.java
index c786752..be3f17d 100644
--- a/src/com/android/contacts/model/Sources.java
+++ b/src/com/android/contacts/model/Sources.java
@@ -95,6 +95,10 @@
         filter.addAction(Intent.ACTION_PACKAGE_CHANGED);
         filter.addDataScheme("package");
         mApplicationContext.registerReceiver(this, filter);
+        IntentFilter sdFilter = new IntentFilter();
+        sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE);
+        sdFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);
+        mApplicationContext.registerReceiver(this, sdFilter);
 
         // Request updates when locale is changed so that the order of each field will
         // be able to be changed on the locale change.
@@ -123,15 +127,29 @@
 
         if (Intent.ACTION_PACKAGE_REMOVED.equals(action)
                 || Intent.ACTION_PACKAGE_ADDED.equals(action)
-                || Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
-            final String packageName = intent.getData().getSchemeSpecificPart();
-            final boolean knownPackage = mKnownPackages.contains(packageName);
-            if (knownPackage) {
-                // Invalidate cache of existing source
-                invalidateCache(packageName);
+                || Intent.ACTION_PACKAGE_CHANGED.equals(action) ||
+                Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action) ||
+                Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
+            String[] pkgList = null;
+            // Handle applications on sdcard.
+            if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action) ||
+                    Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
+                pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
             } else {
-                // Unknown source, so reload from scratch
-                queryAccounts();
+                final String packageName = intent.getData().getSchemeSpecificPart();
+                pkgList = new String[] { packageName };
+            }
+            if (pkgList != null) {
+                for (String packageName : pkgList) {
+                    final boolean knownPackage = mKnownPackages.contains(packageName);
+                    if (knownPackage) {
+                        // Invalidate cache of existing source
+                        invalidateCache(packageName);
+                    } else {
+                        // Unknown source, so reload from scratch
+                        queryAccounts();
+                    }
+                }
             }
         } else if (Intent.ACTION_LOCALE_CHANGED.equals(action)) {
             invalidateAllCache();