diff --git a/app/src/main/java/eu/faircode/email/EditTextMultiAutoComplete.java b/app/src/main/java/eu/faircode/email/EditTextMultiAutoComplete.java index a4c1d5a0a2..3dc6442497 100644 --- a/app/src/main/java/eu/faircode/email/EditTextMultiAutoComplete.java +++ b/app/src/main/java/eu/faircode/email/EditTextMultiAutoComplete.java @@ -56,7 +56,11 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ExecutorService; +import javax.mail.Address; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; @@ -66,6 +70,9 @@ public class EditTextMultiAutoComplete extends AppCompatMultiAutoCompleteTextVie private int colorAccent; private ContextThemeWrapper ctx; private Tokenizer tokenizer; + private Map encryption = new ConcurrentHashMap<>(); + + private static ExecutorService executor = Helper.getBackgroundExecutor(1, "chips"); public EditTextMultiAutoComplete(@NonNull Context context) { super(context); @@ -245,8 +252,8 @@ public class EditTextMultiAutoComplete extends AppCompatMultiAutoCompleteTextVie int s = edit.getSpanStart(span); int e = edit.getSpanEnd(span); if (s == start && e == i + 1) { - found = true; - if (!(focus && overlap(start, i, selStart, selEnd))) + found = !span.needsUpdate(); + if (found && !(focus && overlap(start, i, selStart, selEnd))) tbd.remove(span); break; } @@ -309,12 +316,40 @@ public class EditTextMultiAutoComplete extends AppCompatMultiAutoCompleteTextVie } cd.setText(text); cd.setChipBackgroundColor(ColorStateList.valueOf(colorAccent)); - cd.setMaxWidth(getWidth()); - cd.setBounds(0, 0, cd.getIntrinsicWidth(), cd.getIntrinsicHeight()); ClipImageSpan is = new ClipImageSpan(cd); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) is.setContentDescription(email); + + Boolean has = encryption.get(email); + if (has == null) { + final List
recipient = Arrays.asList(new Address[]{parsed[0]}); + executor.submit(new Runnable() { + @Override + public void run() { + try { + boolean has = + PgpHelper.hasPgpKey(context, recipient) || + SmimeHelper.hasSmimeKey(context, recipient); + encryption.put(email, has); + if (has) { + is.invalidate(); + post(update); + } + } catch (Throwable ex) { + Log.w(ex); + } + } + }); + } else if (has) { + cd.setTextEndPadding(dp3); + cd.setCloseIcon(context.getDrawable(R.drawable.twotone_lock_24)); + cd.setCloseIconVisible(true); + } + + cd.setMaxWidth(getWidth()); + cd.setBounds(0, 0, cd.getIntrinsicWidth(), cd.getIntrinsicHeight()); + edit.setSpan(is, start, i + 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); if (kar == ',' && @@ -346,8 +381,18 @@ public class EditTextMultiAutoComplete extends AppCompatMultiAutoCompleteTextVie } private static class ClipImageSpan extends ImageSpan { + private boolean update; + public ClipImageSpan(@NonNull Drawable drawable) { super(drawable, DynamicDrawableSpan.ALIGN_BOTTOM); } + + void invalidate() { + update = true; + } + + boolean needsUpdate() { + return update; + } } } \ No newline at end of file diff --git a/app/src/main/java/eu/faircode/email/PgpHelper.java b/app/src/main/java/eu/faircode/email/PgpHelper.java index 99f6b0a789..66c50e1528 100644 --- a/app/src/main/java/eu/faircode/email/PgpHelper.java +++ b/app/src/main/java/eu/faircode/email/PgpHelper.java @@ -67,6 +67,10 @@ public class PgpHelper { } } + static boolean hasPgpKey(Context context, List
recipients) { + return hasPgpKey(context, recipients, CONNECT_TIMEOUT); + } + static boolean hasPgpKey(Context context, List
recipients, long timeout) { if (recipients == null || recipients.size() == 0) return false;