aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdithya Abraham Philip <adithyaphilip@gmail.com>2015-05-08 19:05:21 +0530
committerAdithya Abraham Philip <adithyaphilip@gmail.com>2015-05-08 19:05:21 +0530
commit797cd289978055d48cfb0f7a39d94d123c0a30a9 (patch)
tree75b29ef2730498a9bae76d87f886b5dcf278e4ac
parent64a85721cbc7c0ec952c9631ef089b0a239b824c (diff)
downloadopen-keychain-797cd289978055d48cfb0f7a39d94d123c0a30a9.tar.gz
open-keychain-797cd289978055d48cfb0f7a39d94d123c0a30a9.tar.bz2
open-keychain-797cd289978055d48cfb0f7a39d94d123c0a30a9.zip
fixed sync on key import, 'me' linked contact crash
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java2
-rw-r--r--OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java49
3 files changed, 52 insertions, 1 deletions
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
index b48a1da91..86cfc21a3 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/operations/ImportExportOperation.java
@@ -376,6 +376,8 @@ public class ImportExportOperation extends BaseOperation {
log.add(LogType.MSG_IMPORT_ERROR, 1);
}
+ ContactSyncAdapterService.requestSync();
+
return new ImportKeyResult(resultType, log, newKeys, updatedKeys, badKeys, secret,
importedMasterKeyIdsArray);
}
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
index 1e02ca450..b92163b59 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java
@@ -133,6 +133,8 @@ public class ViewKeyFragment extends LoaderFragment implements
* @param contactId
*/
private void loadLinkedSystemContact(final long contactId) {
+ // contact doesn't exist, stop
+ if(contactId == -1) return;
final Context context = mSystemContactName.getContext();
final ContentResolver resolver = context.getContentResolver();
diff --git a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
index 609288bf1..e1efd5abc 100644
--- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
+++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java
@@ -446,6 +446,13 @@ public class ContactHelper {
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);
// Load all public Keys from OK
@@ -519,6 +526,9 @@ public class ContactHelper {
* @param context
*/
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);
// get all keys which have associated secret keys
@@ -585,7 +595,7 @@ public class ContactHelper {
*
* @param resolver
* @param masterKeyId
- * @return
+ * @return number of rows deleted
*/
private static int deleteMainProfileRawContactByMasterKeyId(ContentResolver resolver,
long masterKeyId) {
@@ -603,6 +613,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
* 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
*/