From 40af6e611d9fe06031ee9748fbcc94a34f9de5da Mon Sep 17 00:00:00 2001 From: Ricky Wai Date: Fri, 24 Mar 2017 17:15:59 +0000 Subject: 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 --- .../providers/contacts/ContactDirectoryManager.java | 16 ++++++++++++++++ .../android/providers/contacts/ContactsProvider2.java | 11 +++++++++++ 2 files changed, 27 insertions(+) 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[] { -- cgit v1.2.3