mirror of
https://github.com/etesync/android
synced 2025-03-06 02:06:09 +00:00
Use contact hash codes only on Android 7+ (workaround)
vcard4android: don't hash CATEGORIES, more verbose logging
This commit is contained in:
parent
d707a1e643
commit
59f8305ba5
@ -14,6 +14,7 @@ import android.content.ContentUris;
|
|||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
@ -92,15 +93,22 @@ public class LocalAddressBook extends AndroidAddressBook implements LocalCollect
|
|||||||
* @return number of "really dirty" contacts
|
* @return number of "really dirty" contacts
|
||||||
*/
|
*/
|
||||||
public int verifyDirty() throws ContactsStorageException {
|
public int verifyDirty() throws ContactsStorageException {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
|
||||||
|
App.log.severe("verifyDirty() should not be called on Android <7");
|
||||||
|
|
||||||
int reallyDirty = 0;
|
int reallyDirty = 0;
|
||||||
for (LocalContact contact : getDirtyContacts()) {
|
for (LocalContact contact : getDirtyContacts()) {
|
||||||
try {
|
try {
|
||||||
if (contact.getLastHashCode() == contact.dataHashCode()) {
|
int lastHash = contact.getLastHashCode(),
|
||||||
|
currentHash = contact.dataHashCode();
|
||||||
|
if (lastHash == currentHash) {
|
||||||
// hash is code still the same, contact is not "really dirty" (only metadata been have changed)
|
// hash is code still the same, contact is not "really dirty" (only metadata been have changed)
|
||||||
App.log.log(Level.FINE, "Contact data hash has not changed, resetting dirty flag", contact);
|
App.log.log(Level.FINE, "Contact data hash has not changed, resetting dirty flag", contact);
|
||||||
contact.resetDirty();
|
contact.resetDirty();
|
||||||
} else
|
} else {
|
||||||
|
App.log.log(Level.FINE, "Contact data has changed from hash " + lastHash + " to " + currentHash, contact);
|
||||||
reallyDirty++;
|
reallyDirty++;
|
||||||
|
}
|
||||||
} catch(FileNotFoundException e) {
|
} catch(FileNotFoundException e) {
|
||||||
throw new ContactsStorageException("Couldn't calculate hash code", e);
|
throw new ContactsStorageException("Couldn't calculate hash code", e);
|
||||||
}
|
}
|
||||||
|
@ -12,6 +12,7 @@ import android.content.ContentProviderOperation;
|
|||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.provider.ContactsContract;
|
import android.provider.ContactsContract;
|
||||||
import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
|
import android.provider.ContactsContract.CommonDataKinds.GroupMembership;
|
||||||
@ -82,9 +83,12 @@ public class LocalContact extends AndroidContact implements LocalResource {
|
|||||||
values.put(COLUMN_ETAG, eTag);
|
values.put(COLUMN_ETAG, eTag);
|
||||||
values.put(ContactsContract.RawContacts.DIRTY, 0);
|
values.put(ContactsContract.RawContacts.DIRTY, 0);
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
// workaround for Android 7 which sets DIRTY flag when only meta-data is changed
|
||||||
int hashCode = dataHashCode();
|
int hashCode = dataHashCode();
|
||||||
values.put(COLUMN_HASHCODE, hashCode);
|
values.put(COLUMN_HASHCODE, hashCode);
|
||||||
App.log.finer("Clearing dirty flag with eTag = " + eTag + ", contact hash = " + hashCode);
|
App.log.finer("Clearing dirty flag with eTag = " + eTag + ", contact hash = " + hashCode);
|
||||||
|
}
|
||||||
|
|
||||||
addressBook.provider.update(rawContactSyncURI(), values, null, null);
|
addressBook.provider.update(rawContactSyncURI(), values, null, null);
|
||||||
|
|
||||||
@ -161,14 +165,24 @@ public class LocalContact extends AndroidContact implements LocalResource {
|
|||||||
@Override
|
@Override
|
||||||
public int update(Contact contact) throws ContactsStorageException {
|
public int update(Contact contact) throws ContactsStorageException {
|
||||||
int result = super.update(contact);
|
int result = super.update(contact);
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
// workaround for Android 7 which sets DIRTY flag when only meta-data is changed
|
||||||
updateHashCode();
|
updateHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Uri create() throws ContactsStorageException {
|
public Uri create() throws ContactsStorageException {
|
||||||
Uri uri = super.create();
|
Uri uri = super.create();
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
// workaround for Android 7 which sets DIRTY flag when only meta-data is changed
|
||||||
updateHashCode();
|
updateHashCode();
|
||||||
|
}
|
||||||
|
|
||||||
return uri;
|
return uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,11 +191,17 @@ public class LocalContact extends AndroidContact implements LocalResource {
|
|||||||
* @return hash code of contact data (including group memberships)
|
* @return hash code of contact data (including group memberships)
|
||||||
*/
|
*/
|
||||||
public int dataHashCode() throws FileNotFoundException, ContactsStorageException {
|
public int dataHashCode() throws FileNotFoundException, ContactsStorageException {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
|
||||||
|
App.log.severe("dataHashCode() should not be called on Android <7");
|
||||||
|
|
||||||
// groupMemberships is filled by getContact()
|
// groupMemberships is filled by getContact()
|
||||||
return getContact().hashCode() ^ groupMemberships.hashCode();
|
return getContact().hashCode() ^ groupMemberships.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void updateHashCode() throws ContactsStorageException {
|
protected void updateHashCode() throws ContactsStorageException {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
|
||||||
|
App.log.severe("updateHashCode() should not be called on Android <7");
|
||||||
|
|
||||||
ContentValues values = new ContentValues(1);
|
ContentValues values = new ContentValues(1);
|
||||||
try {
|
try {
|
||||||
int hashCode = dataHashCode();
|
int hashCode = dataHashCode();
|
||||||
@ -194,6 +214,9 @@ public class LocalContact extends AndroidContact implements LocalResource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int getLastHashCode() throws ContactsStorageException {
|
int getLastHashCode() throws ContactsStorageException {
|
||||||
|
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N)
|
||||||
|
App.log.severe("getLastHashCode() should not be called on Android <7");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@Cleanup Cursor c = addressBook.provider.query(rawContactSyncURI(), new String[] { COLUMN_HASHCODE }, null, null, null);
|
@Cleanup Cursor c = addressBook.provider.query(rawContactSyncURI(), new String[] { COLUMN_HASHCODE }, null, null, null);
|
||||||
if (c == null || !c.moveToNext() || c.isNull(0))
|
if (c == null || !c.moveToNext() || c.isNull(0))
|
||||||
|
@ -14,6 +14,7 @@ import android.content.ContentResolver;
|
|||||||
import android.content.ContentValues;
|
import android.content.ContentValues;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.SyncResult;
|
import android.content.SyncResult;
|
||||||
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.provider.ContactsContract;
|
import android.provider.ContactsContract;
|
||||||
|
|
||||||
@ -82,11 +83,14 @@ public class ContactsSyncManager extends SyncManager {
|
|||||||
LocalAddressBook localAddressBook = localAddressBook();
|
LocalAddressBook localAddressBook = localAddressBook();
|
||||||
localAddressBook.setURL(info.url);
|
localAddressBook.setURL(info.url);
|
||||||
|
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
|
// workaround for Android 7 which sets DIRTY flag when only meta-data is changed
|
||||||
int reallyDirty = localAddressBook.verifyDirty();
|
int reallyDirty = localAddressBook.verifyDirty();
|
||||||
if (extras.containsKey(ContentResolver.SYNC_EXTRAS_UPLOAD) && reallyDirty == 0) {
|
if (extras.containsKey(ContentResolver.SYNC_EXTRAS_UPLOAD) && reallyDirty == 0) {
|
||||||
App.log.info("This sync was called to upload dirty contacts, but no contact data have been changed");
|
App.log.info("This sync was called to upload dirty contacts, but no contact data have been changed");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// set up Contacts Provider Settings
|
// set up Contacts Provider Settings
|
||||||
ContentValues values = new ContentValues(2);
|
ContentValues values = new ContentValues(2);
|
||||||
|
Loading…
Reference in New Issue
Block a user