diff options
author | Ricky Wai <rickywai@google.com> | 2017-03-24 17:15:59 +0000 |
---|---|---|
committer | Ricky Wai <rickywai@google.com> | 2017-03-24 17:36:35 +0000 |
commit | 40af6e611d9fe06031ee9748fbcc94a34f9de5da (patch) | |
tree | 3f535cd8190e7cdf91d73ca57a2ae06659ca1df8 | |
parent | baad51814c3e4c720e507e87d401b8d6639cd06f (diff) | |
download | ContactsProvider-40af6e611d9fe06031ee9748fbcc94a34f9de5da.tar.gz |
Schedule re-scan contacts directory provider if directory is force updated
Test: CTS should pass as usual, hope it can deflake some directory tests
Bug: 36371719
Change-Id: I477d7f90f48aac90ad4f88471f107a5a4986e7f6
-rw-r--r-- | src/com/android/providers/contacts/ContactDirectoryManager.java | 16 | ||||
-rw-r--r-- | src/com/android/providers/contacts/ContactsProvider2.java | 11 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/com/android/providers/contacts/ContactDirectoryManager.java b/src/com/android/providers/contacts/ContactDirectoryManager.java index cb6dc4a1..33e541d3 100644 --- a/src/com/android/providers/contacts/ContactDirectoryManager.java +++ b/src/com/android/providers/contacts/ContactDirectoryManager.java @@ -104,6 +104,8 @@ public class ContactDirectoryManager { 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 @@ public class ContactDirectoryManager { 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 @@ public class ContactDirectoryManager { 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 @@ public class ContactDirectoryManager { // 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 66580797..f2cc13b6 100644 --- a/src/com/android/providers/contacts/ContactsProvider2.java +++ b/src/com/android/providers/contacts/ContactsProvider2.java @@ -252,6 +252,7 @@ public class ContactsProvider2 extends AbstractContactsProvider 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 @@ public class ContactsProvider2 extends AbstractContactsProvider break; } + case BACKGROUND_TASK_RESCAN_DIRECTORY: { + updateDirectoriesInBackground(true); + break; + } + case BACKGROUND_TASK_UPDATE_LOCALE: { updateLocaleInBackground(); break; @@ -4233,6 +4239,7 @@ public class ContactsProvider2 extends AbstractContactsProvider } case DIRECTORIES: { + mContactDirectoryManager.setDirectoriesForceUpdated(true); scanPackagesByUid(Binder.getCallingUid()); count = 1; break; @@ -4936,6 +4943,10 @@ public class ContactsProvider2 extends AbstractContactsProvider scheduleBackgroundTask(BACKGROUND_TASK_UPDATE_ACCOUNTS); } + public void scheduleRescanDirectories() { + scheduleBackgroundTask(BACKGROUND_TASK_RESCAN_DIRECTORY); + } + interface RawContactsBackupQuery { String TABLE = Tables.RAW_CONTACTS; String[] COLUMNS = new String[] { |