diff options
Diffstat (limited to 'OpenKeychain/src/main/java')
| -rw-r--r-- | OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java | 9 | ||||
| -rw-r--r-- | OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java | 105 | 
2 files changed, 87 insertions, 27 deletions
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 68da3b58c..18f1ef8a7 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/ui/ViewKeyFragment.java @@ -121,6 +121,7 @@ public class ViewKeyFragment extends LoaderFragment implements      /**       * Checks if a system contact exists for given masterKeyId, and if it does, sets name, picture       * and onClickListener for the linked system contact's layout +     * In the case of a secret key, "me" contact details are loaded       *       * @param masterKeyId       */ @@ -131,10 +132,10 @@ public class ViewKeyFragment extends LoaderFragment implements          long contactId;          String contactName = null; -        if(mIsSecret) { +        if (mIsSecret) {//all secret keys are linked to "me" profile in contacts              contactId = ContactHelper.getMainProfileContactId(resolver);              List<String> mainProfileNames = ContactHelper.getMainProfileContactName(context); -            if(mainProfileNames!=null) contactName = mainProfileNames.get(0); +            if (mainProfileNames != null) contactName = mainProfileNames.get(0);          } else {              contactId = ContactHelper.findContactId(resolver, masterKeyId); @@ -145,10 +146,10 @@ public class ViewKeyFragment extends LoaderFragment implements              mSystemContactName.setText(contactName);              Bitmap picture; -            if(mIsSecret) { +            if (mIsSecret) {                  picture = ContactHelper.loadMainProfilePhoto(resolver, false);              } else { -                picture = ContactHelper.loadPhotoByMasterKeyId(resolver,masterKeyId,false); +                picture = ContactHelper.loadPhotoByMasterKeyId(resolver, masterKeyId, false);              }              if (picture != null) mSystemContactPicture.setImageBitmap(picture); 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 cb6c39188..c07d7a36b 100644 --- a/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java +++ b/OpenKeychain/src/main/java/org/sufficientlysecure/keychain/util/ContactHelper.java @@ -214,6 +214,13 @@ public class ContactHelper {          return new ArrayList<>(names);      } +    /** +     * returns the CONTACT_ID of the main ("me") contact +     * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html +     * +     * @param resolver +     * @return +     */      public static long getMainProfileContactId(ContentResolver resolver) {          Cursor profileCursor = resolver.query(                  ContactsContract.Profile.CONTENT_URI, @@ -229,6 +236,14 @@ public class ContactHelper {          return profileCursor.getLong(0);      } +    /** +     * loads the profile picture of the main ("me") contact +     * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html +     * +     * @param contentResolver +     * @param highRes         true for large image if present, false for thumbnail +     * @return bitmap of loaded photo +     */      public static Bitmap loadMainProfilePhoto(ContentResolver contentResolver, boolean highRes) {          try {              long mainProfileContactId = getMainProfileContactId(contentResolver); @@ -496,6 +511,12 @@ public class ContactHelper {          }      } +    /** +     * Links all keys with secrets to the main ("me") contact +     * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html +     * +     * @param context +     */      public static void writeKeysToMainProfileContact(Context context) {          ContentResolver resolver = context.getContentResolver();          Set<Long> keysToDelete = getMainProfileMasterKeyIds(resolver); @@ -509,22 +530,28 @@ public class ContactHelper {          if (cursor != null) {              while (cursor.moveToNext()) {                  long masterKeyId = cursor.getLong(INDEX_MASTER_KEY_ID); +                boolean isExpired = cursor.getInt(INDEX_IS_EXPIRED) != 0; +                boolean isRevoked = cursor.getInt(INDEX_IS_REVOKED) > 0; -                boolean existsInMainProfile = keysToDelete.remove(masterKeyId); -                if (!existsInMainProfile) { -                    long rawContactId = -1;//new raw contact +                if (!isExpired && !isRevoked) { +                    // if expired or revoked will not be removed from keysToDelete or inserted +                    // into main profile ("me" contact) +                    boolean existsInMainProfile = keysToDelete.remove(masterKeyId); +                    if (!existsInMainProfile) { +                        long rawContactId = -1;//new raw contact -                    String keyIdShort = KeyFormattingUtils.convertKeyIdToHexShort(masterKeyId); -                    Log.d(Constants.TAG, "masterKeyId with secret " + masterKeyId); +                        String keyIdShort = KeyFormattingUtils.convertKeyIdToHexShort(masterKeyId); +                        Log.d(Constants.TAG, "masterKeyId with secret " + masterKeyId); -                    ArrayList<ContentProviderOperation> ops = new ArrayList<>(); -                    insertMainProfileRawContact(ops, masterKeyId); -                    writeContactKey(ops, context, rawContactId, masterKeyId, keyIdShort); +                        ArrayList<ContentProviderOperation> ops = new ArrayList<>(); +                        insertMainProfileRawContact(ops, masterKeyId); +                        writeContactKey(ops, context, rawContactId, masterKeyId, keyIdShort); -                    try { -                        resolver.applyBatch(ContactsContract.AUTHORITY, ops); -                    } catch (Exception e) { -                        Log.w(Constants.TAG, e); +                        try { +                            resolver.applyBatch(ContactsContract.AUTHORITY, ops); +                        } catch (Exception e) { +                            Log.w(Constants.TAG, e); +                        }                      }                  }              } @@ -538,6 +565,7 @@ public class ContactHelper {      /**       * Inserts a raw contact into the table defined by ContactsContract.Profile +     * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html       *       * @param ops       * @param masterKeyId @@ -552,7 +580,8 @@ public class ContactHelper {      }      /** -     * deletes a raw contact from the profile table +     * deletes a raw contact from the main profile table ("me" contact) +     * http://developer.android.com/reference/android/provider/ContactsContract.Profile.html       *       * @param resolver       * @param masterKeyId @@ -560,8 +589,8 @@ public class ContactHelper {       */      private static int deleteMainProfileRawContactByMasterKeyId(ContentResolver resolver,                                                                  long masterKeyId) { -        //allows us to actually wipe the RawContact from the device, otherwise would be just flagged -        //for deletion +        // 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(); @@ -574,25 +603,47 @@ public class ContactHelper {      }      /** -     * Delete all raw contacts associated to OpenKeychain. +     * Delete all raw contacts associated to OpenKeychain, including those from "me" contact +     * defined by ContactsContract.Profile +     * +     * @return number of rows deleted       */      private static int debugDeleteRawContacts(ContentResolver resolver) { -        //allows us to actually wipe the RawContact from the device, otherwise would be just flagged -        //for deletion +        // 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();          Log.d(Constants.TAG, "Deleting all raw contacts associated to OK..."); -        return resolver.delete(deleteUri, +        int delete = resolver.delete(deleteUri, +                ContactsContract.RawContacts.ACCOUNT_TYPE + "=?", +                new String[]{ +                        Constants.ACCOUNT_TYPE +                }); + +        Uri mainProfileDeleteUri = ContactsContract.Profile.CONTENT_RAW_CONTACTS_URI.buildUpon() +                .appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(); + +        delete += resolver.delete(mainProfileDeleteUri,                  ContactsContract.RawContacts.ACCOUNT_TYPE + "=?",                  new String[]{                          Constants.ACCOUNT_TYPE                  }); + +        return delete;      } +    /** +     * Deletes raw contacts from ContactsContract.RawContacts based on rawContactId. Does not +     * delete contacts from the "me" contact defined in ContactsContract.Profile +     * +     * @param resolver +     * @param rawContactId +     * @return number of rows deleted +     */      private static int deleteRawContactById(ContentResolver resolver, long rawContactId) { -        //allows us to actually wipe the RawContact from the device, otherwise would be just flagged -        //for deletion +        // 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(); @@ -604,9 +655,17 @@ public class ContactHelper {                  });      } +    /** +     * Deletes raw contacts from ContactsContract.RawContacts based on masterKeyId. Does not +     * delete contacts from the "me" contact defined in ContactsContract.Profile +     * +     * @param resolver +     * @param masterKeyId +     * @return number of rows deleted +     */      private static int deleteRawContactByMasterKeyId(ContentResolver resolver, long masterKeyId) { -        //allows us to actually wipe the RawContact from the device, otherwise would be just flagged -        //for deletion +        // 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();  | 
