Merge "Schedule re-scan contacts directory provider if directory is force updated"
diff --git a/src/com/android/providers/contacts/ContactDirectoryManager.java b/src/com/android/providers/contacts/ContactDirectoryManager.java
index cb6dc4a..33e541d 100644
--- a/src/com/android/providers/contacts/ContactDirectoryManager.java
+++ b/src/com/android/providers/contacts/ContactDirectoryManager.java
@@ -104,6 +104,8 @@
     private final Context mContext;
     private final PackageManager mPackageManager;
 
+    private volatile boolean mDirectoriesForceUpdated = false;
+
     public ContactDirectoryManager(ContactsProvider2 contactsProvider) {
         mContactsProvider = contactsProvider;
         mContext = contactsProvider.getContext();
@@ -114,6 +116,10 @@
         return (ContactsDatabaseHelper) mContactsProvider.getDatabaseHelper();
     }
 
+    public void setDirectoriesForceUpdated(boolean updated) {
+        mDirectoriesForceUpdated = updated;
+    }
+
     /**
      * Scans through existing directories to see if the cached resource IDs still
      * match their original resource names.  If not - plays it safe by refreshing all directories.
@@ -230,6 +236,9 @@
             Log.d(TAG, "scanAllPackagesIfNeeded()");
         }
         final long start = SystemClock.elapsedRealtime();
+        // Reset directory updated flag to false. If it's changed to true
+        // then we need to rescan directories.
+        mDirectoriesForceUpdated = false;
         final int count = scanAllPackages();
         getDbHelper().setProperty(DbProperties.DIRECTORY_SCAN_COMPLETE, "1");
         final long end = SystemClock.elapsedRealtime();
@@ -238,6 +247,13 @@
         // Announce the change to listeners of the contacts authority
         mContactsProvider.notifyChange(/* syncToNetwork =*/false,
                 /* syncToMetadataNetwork =*/false);
+
+        // We schedule a rescan if update(DIRECTORIES) is called while we're scanning all packages.
+        if (mDirectoriesForceUpdated) {
+            mDirectoriesForceUpdated = false;
+            mContactsProvider.scheduleRescanDirectories();
+        }
+
         return count;
     }
 
diff --git a/src/com/android/providers/contacts/ContactsProvider2.java b/src/com/android/providers/contacts/ContactsProvider2.java
index 72edc08..0d2dd9e 100644
--- a/src/com/android/providers/contacts/ContactsProvider2.java
+++ b/src/com/android/providers/contacts/ContactsProvider2.java
@@ -252,6 +252,7 @@
     private static final int BACKGROUND_TASK_CHANGE_LOCALE = 9;
     private static final int BACKGROUND_TASK_CLEANUP_PHOTOS = 10;
     private static final int BACKGROUND_TASK_CLEAN_DELETE_LOG = 11;
+    private static final int BACKGROUND_TASK_RESCAN_DIRECTORY = 12;
 
     protected static final int STATUS_NORMAL = 0;
     protected static final int STATUS_UPGRADING = 1;
@@ -1779,6 +1780,11 @@
                 break;
             }
 
+            case BACKGROUND_TASK_RESCAN_DIRECTORY: {
+                updateDirectoriesInBackground(true);
+                break;
+            }
+
             case BACKGROUND_TASK_UPDATE_LOCALE: {
                 updateLocaleInBackground();
                 break;
@@ -4233,6 +4239,7 @@
             }
 
             case DIRECTORIES: {
+                mContactDirectoryManager.setDirectoriesForceUpdated(true);
                 scanPackagesByUid(Binder.getCallingUid());
                 count = 1;
                 break;
@@ -4936,6 +4943,10 @@
         scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_ACCOUNTS);
     }
 
+    public void scheduleRescanDirectories() {
+        scheduleBackgroundTask(BACKGROUND_TASK_RESCAN_DIRECTORY);
+    }
+
     interface RawContactsBackupQuery {
         String TABLE = Tables.RAW_CONTACTS;
         String[] COLUMNS = new String[] {