aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRicky Wai <rickywai@google.com>2017-03-24 17:15:59 +0000
committerRicky Wai <rickywai@google.com>2017-03-24 17:36:35 +0000
commit40af6e611d9fe06031ee9748fbcc94a34f9de5da (patch)
tree3f535cd8190e7cdf91d73ca57a2ae06659ca1df8
parentbaad51814c3e4c720e507e87d401b8d6639cd06f (diff)
downloadContactsProvider-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.java16
-rw-r--r--src/com/android/providers/contacts/ContactsProvider2.java11
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[] {