mirror of
https://github.com/moparisthebest/open-keychain
synced 2025-02-17 07:30:14 -05:00
ContactHelper cleanup
This commit is contained in:
parent
ff42dfc9db
commit
46944198e4
@ -33,6 +33,7 @@ public final class Constants {
|
|||||||
|
|
||||||
public static final String ACCOUNT_NAME = "OpenKeychain";
|
public static final String ACCOUNT_NAME = "OpenKeychain";
|
||||||
public static final String ACCOUNT_TYPE = PACKAGE_NAME + ".account";
|
public static final String ACCOUNT_TYPE = PACKAGE_NAME + ".account";
|
||||||
|
public static final String CUSTOM_CONTACT_DATA_MIME_TYPE = "vnd.android.cursor.item/vnd.org.sufficientlysecure.keychain.key";
|
||||||
|
|
||||||
// as defined in http://tools.ietf.org/html/rfc3156, section 7
|
// as defined in http://tools.ietf.org/html/rfc3156, section 7
|
||||||
public static final String NFC_MIME = "application/pgp-keys";
|
public static final String NFC_MIME = "application/pgp-keys";
|
||||||
@ -49,8 +50,6 @@ public final class Constants {
|
|||||||
public static final String INTENT_PREFIX = PACKAGE_NAME + ".action.";
|
public static final String INTENT_PREFIX = PACKAGE_NAME + ".action.";
|
||||||
public static final String EXTRA_PREFIX = PACKAGE_NAME + ".";
|
public static final String EXTRA_PREFIX = PACKAGE_NAME + ".";
|
||||||
|
|
||||||
public static final String CUSTOM_CONTACT_DATA_MIME_TYPE = "vnd.android.cursor.item/vnd.org.sufficientlysecure.keychain.key";
|
|
||||||
|
|
||||||
public static final int TEMPFILE_TTL = 24 * 60 * 60 * 1000; // 1 day
|
public static final int TEMPFILE_TTL = 24 * 60 * 60 * 1000; // 1 day
|
||||||
|
|
||||||
public static final String SAFESLINGER_SERVER = "safeslinger-openpgp.appspot.com";
|
public static final String SAFESLINGER_SERVER = "safeslinger-openpgp.appspot.com";
|
||||||
|
@ -49,17 +49,6 @@ import java.util.Set;
|
|||||||
|
|
||||||
public class ContactHelper {
|
public class ContactHelper {
|
||||||
|
|
||||||
public static final String[] KEYS_TO_CONTACT_PROJECTION = new String[]{
|
|
||||||
KeychainContract.KeyRings.MASTER_KEY_ID,
|
|
||||||
KeychainContract.KeyRings.USER_ID,
|
|
||||||
KeychainContract.KeyRings.IS_EXPIRED,
|
|
||||||
KeychainContract.KeyRings.IS_REVOKED};
|
|
||||||
|
|
||||||
public static final int INDEX_MASTER_KEY_ID = 0;
|
|
||||||
public static final int INDEX_USER_ID = 1;
|
|
||||||
public static final int INDEX_IS_EXPIRED = 2;
|
|
||||||
public static final int INDEX_IS_REVOKED = 3;
|
|
||||||
|
|
||||||
private static final Map<Long, Bitmap> photoCache = new HashMap<>();
|
private static final Map<Long, Bitmap> photoCache = new HashMap<>();
|
||||||
|
|
||||||
public static List<String> getPossibleUserEmails(Context context) {
|
public static List<String> getPossibleUserEmails(Context context) {
|
||||||
@ -261,12 +250,12 @@ public class ContactHelper {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (!photoCache.containsKey(masterKeyId)) {
|
if (!photoCache.containsKey(masterKeyId)) {
|
||||||
photoCache.put(masterKeyId, loadPhotoFromFingerprint(contentResolver, masterKeyId));
|
photoCache.put(masterKeyId, loadPhotoFromMasterKeyId(contentResolver, masterKeyId));
|
||||||
}
|
}
|
||||||
return photoCache.get(masterKeyId);
|
return photoCache.get(masterKeyId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Bitmap loadPhotoFromFingerprint(ContentResolver contentResolver, long masterKeyId) {
|
private static Bitmap loadPhotoFromMasterKeyId(ContentResolver contentResolver, long masterKeyId) {
|
||||||
if (masterKeyId == -1) {
|
if (masterKeyId == -1) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -288,6 +277,17 @@ public class ContactHelper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static final String[] KEYS_TO_CONTACT_PROJECTION = new String[]{
|
||||||
|
KeychainContract.KeyRings.MASTER_KEY_ID,
|
||||||
|
KeychainContract.KeyRings.USER_ID,
|
||||||
|
KeychainContract.KeyRings.IS_EXPIRED,
|
||||||
|
KeychainContract.KeyRings.IS_REVOKED};
|
||||||
|
|
||||||
|
public static final int INDEX_MASTER_KEY_ID = 0;
|
||||||
|
public static final int INDEX_USER_ID = 1;
|
||||||
|
public static final int INDEX_IS_EXPIRED = 2;
|
||||||
|
public static final int INDEX_IS_REVOKED = 3;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write/Update the current OpenKeychain keys to the contact db
|
* Write/Update the current OpenKeychain keys to the contact db
|
||||||
*/
|
*/
|
||||||
@ -295,7 +295,7 @@ public class ContactHelper {
|
|||||||
ContentResolver resolver = context.getContentResolver();
|
ContentResolver resolver = context.getContentResolver();
|
||||||
Set<Long> deletedKeys = getRawContactMasterKeyIds(resolver);
|
Set<Long> deletedKeys = getRawContactMasterKeyIds(resolver);
|
||||||
|
|
||||||
debugDeleteRawContacts(resolver);
|
// debugDeleteRawContacts(resolver);
|
||||||
|
|
||||||
// ContentProviderClient client = resolver.acquireContentProviderClient(ContactsContract.AUTHORITY_URI);
|
// ContentProviderClient client = resolver.acquireContentProviderClient(ContactsContract.AUTHORITY_URI);
|
||||||
// ContentValues values = new ContentValues();
|
// ContentValues values = new ContentValues();
|
||||||
@ -315,7 +315,7 @@ public class ContactHelper {
|
|||||||
if (cursor != null) {
|
if (cursor != null) {
|
||||||
while (cursor.moveToNext()) {
|
while (cursor.moveToNext()) {
|
||||||
long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID);
|
long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID);
|
||||||
String[] primaryUserId = KeyRing.splitUserId(cursor.getString(INDEX_USER_ID));
|
String[] userIdSplit = KeyRing.splitUserId(cursor.getString(INDEX_USER_ID));
|
||||||
String keyIdShort = KeyFormattingUtils.convertKeyIdToHexShort(cursor.getLong(INDEX_MASTER_KEY_ID));
|
String keyIdShort = KeyFormattingUtils.convertKeyIdToHexShort(cursor.getLong(INDEX_MASTER_KEY_ID));
|
||||||
boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0;
|
boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0;
|
||||||
boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0;
|
boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0;
|
||||||
@ -326,21 +326,17 @@ public class ContactHelper {
|
|||||||
|
|
||||||
// get raw contact to this master key id
|
// get raw contact to this master key id
|
||||||
long rawContactId = findRawContactId(resolver, masterKeyId);
|
long rawContactId = findRawContactId(resolver, masterKeyId);
|
||||||
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
|
Log.d(Constants.TAG, "rawContactId: " + rawContactId);
|
||||||
|
|
||||||
Log.d(Constants.TAG, "raw contact id: " + rawContactId);
|
ArrayList<ContentProviderOperation> ops = new ArrayList<>();
|
||||||
|
|
||||||
// Do not store expired or revoked keys in contact db - and remove them if they already exist
|
// Do not store expired or revoked keys in contact db - and remove them if they already exist
|
||||||
if (isExpired || isRevoked) {
|
if (isExpired || isRevoked) {
|
||||||
Log.d(Constants.TAG, "Expired or revoked: Deleting " + rawContactId);
|
Log.d(Constants.TAG, "Expired or revoked: Deleting " + rawContactId);
|
||||||
if (rawContactId != -1) {
|
if (rawContactId != -1) {
|
||||||
resolver.delete(ContactsContract.RawContacts.CONTENT_URI,
|
deleteRawContactById(resolver, rawContactId);
|
||||||
ContactsContract.RawContacts._ID + "=?",
|
|
||||||
new String[]{
|
|
||||||
Long.toString(rawContactId)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
} else if (primaryUserId[0] != null) {
|
} else if (userIdSplit[0] != null) {
|
||||||
|
|
||||||
// Create a new rawcontact with corresponding key if it does not exist yet
|
// Create a new rawcontact with corresponding key if it does not exist yet
|
||||||
if (rawContactId == -1) {
|
if (rawContactId == -1) {
|
||||||
@ -352,7 +348,7 @@ public class ContactHelper {
|
|||||||
|
|
||||||
// We always update the display name (which is derived from primary user id)
|
// We always update the display name (which is derived from primary user id)
|
||||||
// and email addresses from user id
|
// and email addresses from user id
|
||||||
writeContactDisplayName(ops, rawContactId, primaryUserId[0]);
|
writeContactDisplayName(ops, rawContactId, userIdSplit[0]);
|
||||||
writeContactEmail(ops, resolver, rawContactId, masterKeyId);
|
writeContactEmail(ops, resolver, rawContactId, masterKeyId);
|
||||||
try {
|
try {
|
||||||
resolver.applyBatch(ContactsContract.AUTHORITY, ops);
|
resolver.applyBatch(ContactsContract.AUTHORITY, ops);
|
||||||
@ -366,18 +362,14 @@ public class ContactHelper {
|
|||||||
|
|
||||||
// Delete master key ids that are no longer present in OK
|
// Delete master key ids that are no longer present in OK
|
||||||
for (Long masterKeyId : deletedKeys) {
|
for (Long masterKeyId : deletedKeys) {
|
||||||
Log.d(Constants.TAG, "Delete raw contact with fingerprint " + masterKeyId);
|
Log.d(Constants.TAG, "Delete raw contact with masterKeyId " + masterKeyId);
|
||||||
resolver.delete(ContactsContract.RawContacts.CONTENT_URI,
|
deleteRawContactByMasterKeyId(resolver, masterKeyId);
|
||||||
ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + ContactsContract.RawContacts.SOURCE_ID + "=?",
|
|
||||||
new String[]{
|
|
||||||
Constants.ACCOUNT_TYPE, Long.toString(masterKeyId)
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete all raw contacts associated to OpenKeychain.
|
* Delete all raw contacts associated to OpenKeychain.
|
||||||
*
|
* <p/>
|
||||||
* TODO: Does this work?
|
* TODO: Does this work?
|
||||||
*/
|
*/
|
||||||
private static int debugDeleteRawContacts(ContentResolver resolver) {
|
private static int debugDeleteRawContacts(ContentResolver resolver) {
|
||||||
@ -389,6 +381,22 @@ public class ContactHelper {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static int deleteRawContactById(ContentResolver resolver, long rawContactId) {
|
||||||
|
return resolver.delete(ContactsContract.RawContacts.CONTENT_URI,
|
||||||
|
ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + ContactsContract.RawContacts._ID + "=?",
|
||||||
|
new String[]{
|
||||||
|
Constants.ACCOUNT_TYPE, Long.toString(rawContactId)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int deleteRawContactByMasterKeyId(ContentResolver resolver, long masterKeyId) {
|
||||||
|
return resolver.delete(ContactsContract.RawContacts.CONTENT_URI,
|
||||||
|
ContactsContract.RawContacts.ACCOUNT_TYPE + "=? AND " + ContactsContract.RawContacts.SOURCE_ID + "=?",
|
||||||
|
new String[]{
|
||||||
|
Constants.ACCOUNT_TYPE, Long.toString(masterKeyId)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @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
|
||||||
*/
|
*/
|
||||||
@ -437,7 +445,7 @@ public class ContactHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a empty raw contact with a given fingerprint
|
* Creates a empty raw contact with a given masterKeyId
|
||||||
*/
|
*/
|
||||||
private static void insertContact(ArrayList<ContentProviderOperation> ops, Context context, long masterKeyId) {
|
private static void insertContact(ArrayList<ContentProviderOperation> ops, Context context, long masterKeyId) {
|
||||||
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
|
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
|
||||||
|
Loading…
Reference in New Issue
Block a user