fixed sync on key import, 'me' linked contact crash

This commit is contained in:
Adithya Abraham Philip 2015-05-08 19:05:21 +05:30
parent 64a85721cb
commit 797cd28997
3 changed files with 52 additions and 1 deletions

View File

@ -376,6 +376,8 @@ public class ImportExportOperation extends BaseOperation {
log.add(LogType.MSG_IMPORT_ERROR, 1); log.add(LogType.MSG_IMPORT_ERROR, 1);
} }
ContactSyncAdapterService.requestSync();
return new ImportKeyResult(resultType, log, newKeys, updatedKeys, badKeys, secret, return new ImportKeyResult(resultType, log, newKeys, updatedKeys, badKeys, secret,
importedMasterKeyIdsArray); importedMasterKeyIdsArray);
} }

View File

@ -133,6 +133,8 @@ public class ViewKeyFragment extends LoaderFragment implements
* @param contactId * @param contactId
*/ */
private void loadLinkedSystemContact(final long contactId) { private void loadLinkedSystemContact(final long contactId) {
// contact doesn't exist, stop
if(contactId == -1) return;
final Context context = mSystemContactName.getContext(); final Context context = mSystemContactName.getContext();
final ContentResolver resolver = context.getContentResolver(); final ContentResolver resolver = context.getContentResolver();

View File

@ -446,6 +446,13 @@ public class ContactHelper {
writeKeysToMainProfileContact(context, resolver); writeKeysToMainProfileContact(context, resolver);
writeKeysToNormalContacts(context, resolver);
}
private static void writeKeysToNormalContacts(Context context, ContentResolver resolver) {
// delete raw contacts flagged for deletion by user so they can be reinserted
deleteFlaggedNormalRawContacts(resolver);
Set<Long> deletedKeys = getRawContactMasterKeyIds(resolver); Set<Long> deletedKeys = getRawContactMasterKeyIds(resolver);
// Load all public Keys from OK // Load all public Keys from OK
@ -519,6 +526,9 @@ public class ContactHelper {
* @param context * @param context
*/ */
public static void writeKeysToMainProfileContact(Context context, ContentResolver resolver) { public static void writeKeysToMainProfileContact(Context context, ContentResolver resolver) {
// deletes contacts hidden by the user so they can be reinserted if necessary
deleteFlaggedMainProfileRawContacts(resolver);
Set<Long> keysToDelete = getMainProfileMasterKeyIds(resolver); Set<Long> keysToDelete = getMainProfileMasterKeyIds(resolver);
// get all keys which have associated secret keys // get all keys which have associated secret keys
@ -585,7 +595,7 @@ public class ContactHelper {
* *
* @param resolver * @param resolver
* @param masterKeyId * @param masterKeyId
* @return * @return number of rows deleted
*/ */
private static int deleteMainProfileRawContactByMasterKeyId(ContentResolver resolver, private static int deleteMainProfileRawContactByMasterKeyId(ContentResolver resolver,
long masterKeyId) { long masterKeyId) {
@ -602,6 +612,28 @@ public class ContactHelper {
}); });
} }
/**
* deletes all raw contact entries in the "me" contact flagged for deletion ('hidden'),
* presumably by the user
*
* @param resolver
* @return number of raw contacts deleted
*/
private static int deleteFlaggedMainProfileRawContacts(ContentResolver resolver) {
// CALLER_IS_SYNCADAPTER allows us to actually wipe the RawContact from the device, otherwise
// would be just flagged for deletion
Uri deleteUri = ContactsContract.Profile.CONTENT_RAW_CONTACTS_URI.buildUpon().
appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build();
return resolver.delete(deleteUri,
ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " +
ContactsContract.RawContacts.DELETED + "=?",
new String[]{
Constants.ACCOUNT_TYPE,
"1"
});
}
/** /**
* Delete all raw contacts associated to OpenKeychain, including those from "me" contact * Delete all raw contacts associated to OpenKeychain, including those from "me" contact
* defined by ContactsContract.Profile * defined by ContactsContract.Profile
@ -677,6 +709,21 @@ public class ContactHelper {
}); });
} }
private static int deleteFlaggedNormalRawContacts(ContentResolver resolver) {
// CALLER_IS_SYNCADAPTER allows us to actually wipe the RawContact from the device, otherwise
// would be just flagged for deletion
Uri deleteUri = ContactsContract.RawContacts.CONTENT_URI.buildUpon().
appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build();
return resolver.delete(deleteUri,
ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " +
ContactsContract.RawContacts.DELETED + "=?",
new String[]{
Constants.ACCOUNT_TYPE,
"1"
});
}
/** /**
* @return a set of all key master key ids currently present in the contact db * @return a set of all key master key ids currently present in the contact db
*/ */