diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 9d01b2a50a..22d366e596 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -186,6 +186,8 @@ public class FragmentCompose extends FragmentBase { private boolean style = true; private boolean encrypt = false; private OpenPgpServiceConnection pgpService; + private long[] pgpKeyIds; + private long pgpSignKeyId; static final int REDUCED_IMAGE_SIZE = 1440; // pixels static final int REDUCED_IMAGE_QUALITY = 90; // percent @@ -1103,9 +1105,9 @@ public class FragmentCompose extends FragmentBase { for (int i = 0; i < ato.length; i++) tos[i] = ato[i].getAddress(); - Intent intent = new Intent(OpenPgpApi.ACTION_GET_SIGN_KEY_ID); + Intent intent = new Intent(OpenPgpApi.ACTION_GET_KEY_IDS); intent.putExtra(OpenPgpApi.EXTRA_USER_IDS, tos); - encrypt(intent); + doPgp(intent); } catch (Throwable ex) { if (ex instanceof IllegalArgumentException) Snackbar.make(view, ex.getMessage(), Snackbar.LENGTH_LONG).show(); @@ -1130,7 +1132,7 @@ public class FragmentCompose extends FragmentBase { } } - private void encrypt(Intent data) { + private void doPgp(Intent data) { final Bundle args = new Bundle(); args.putLong("id", working); args.putParcelable("data", data); @@ -1146,11 +1148,13 @@ public class FragmentCompose extends FragmentBase { // Get data EntityMessage message = db.message().getMessage(id); + if (message == null) + throw new MessageRemovedException(); List attachments = db.attachment().getAttachments(id); for (EntityAttachment attachment : new ArrayList<>(attachments)) if (attachment.encryption != null) { - if (OpenPgpApi.ACTION_GET_SIGN_KEY_ID.equals(data.getAction())) + if (OpenPgpApi.ACTION_GET_KEY_IDS.equals(data.getAction())) db.attachment().deleteAttachment(attachment.id); attachments.remove(attachment); } @@ -1189,7 +1193,8 @@ public class FragmentCompose extends FragmentBase { switch (resultCode) { case OpenPgpApi.RESULT_CODE_SUCCESS: // Attach encrypted data / signature - if (!OpenPgpApi.ACTION_GET_SIGN_KEY_ID.equals(data.getAction())) + if (OpenPgpApi.ACTION_SIGN_AND_ENCRYPT.equals(data.getAction()) || + OpenPgpApi.ACTION_DETACHED_SIGN.equals(data.getAction())) try { db.beginTransaction(); @@ -1220,15 +1225,25 @@ public class FragmentCompose extends FragmentBase { db.endTransaction(); } - if (OpenPgpApi.ACTION_GET_SIGN_KEY_ID.equals(data.getAction())) { + if (OpenPgpApi.ACTION_GET_KEY_IDS.equals(data.getAction())) { + pgpKeyIds = result.getLongArrayExtra(OpenPgpApi.EXTRA_KEY_IDS); + + // Encrypt message + Intent intent = new Intent(OpenPgpApi.ACTION_GET_SIGN_KEY_ID); + return intent; + } else if (OpenPgpApi.ACTION_GET_SIGN_KEY_ID.equals(data.getAction())) { + pgpSignKeyId = result.getLongExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, -1); + // Encrypt message Intent intent = new Intent(OpenPgpApi.ACTION_SIGN_AND_ENCRYPT); - intent.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, data.getLongExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, -1)); + intent.putExtra(OpenPgpApi.EXTRA_KEY_IDS, pgpKeyIds); + intent.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, pgpSignKeyId); + intent.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); return intent; } else if (OpenPgpApi.ACTION_SIGN_AND_ENCRYPT.equals(data.getAction())) { // Sign message Intent intent = new Intent(OpenPgpApi.ACTION_DETACHED_SIGN); - intent.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, data.getLongExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, -1)); + intent.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, pgpSignKeyId); return intent; } else { // send message @@ -1240,7 +1255,10 @@ public class FragmentCompose extends FragmentBase { case OpenPgpApi.RESULT_CODE_ERROR: OpenPgpError error = result.getParcelableExtra(OpenPgpApi.RESULT_ERROR); - throw new IllegalArgumentException(error.getMessage()); + if (error == null) + throw new IllegalArgumentException("Unknown error"); + else + throw new IllegalArgumentException(error.getMessage()); default: throw new IllegalArgumentException("Unknown result code=" + resultCode); @@ -1253,7 +1271,7 @@ public class FragmentCompose extends FragmentBase { onAction(R.id.action_send); else if (result instanceof Intent) { Intent intent = (Intent) result; - encrypt(intent); + doPgp(intent); } else if (result instanceof PendingIntent) try { PendingIntent pi = (PendingIntent) result; @@ -1306,19 +1324,7 @@ public class FragmentCompose extends FragmentBase { if (data != null) { if (BuildConfig.BETA_RELEASE) Log.logExtras(data); - - String action = data.getAction(); - if (OpenPgpApi.ACTION_GET_SIGN_KEY_ID.equals(action)) - action = OpenPgpApi.ACTION_SIGN_AND_ENCRYPT; - - Intent intent = new Intent(action); - if (data.hasExtra(OpenPgpApi.EXTRA_USER_IDS)) - intent.putExtra(OpenPgpApi.EXTRA_USER_IDS, data.getStringArrayExtra(OpenPgpApi.EXTRA_USER_IDS)); - if (data.hasExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID)) - intent.putExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, data.getLongExtra(OpenPgpApi.EXTRA_SIGN_KEY_ID, -1)); - if (OpenPgpApi.ACTION_SIGN_AND_ENCRYPT.equals(action)) - intent.putExtra(OpenPgpApi.EXTRA_REQUEST_ASCII_ARMOR, true); - encrypt(intent); + doPgp(data); } } else { if (data != null)