From de0e9478c36c4da32a10d25399610ade650c8951 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 18 Apr 2022 23:57:46 +0200 Subject: [PATCH] Auto select identity for email --- .../java/eu/faircode/email/DaoContact.java | 6 ++ .../eu/faircode/email/FragmentCompose.java | 94 +++++++++++++++++++ 2 files changed, 100 insertions(+) diff --git a/app/src/main/java/eu/faircode/email/DaoContact.java b/app/src/main/java/eu/faircode/email/DaoContact.java index bf1a2a42e1..44fa269302 100644 --- a/app/src/main/java/eu/faircode/email/DaoContact.java +++ b/app/src/main/java/eu/faircode/email/DaoContact.java @@ -57,6 +57,12 @@ public interface DaoContact { @Query("SELECT * FROM contact WHERE id = :id") EntityContact getContact(long id); + @Query("SELECT DISTINCT identity FROM contact" + + " WHERE email = :email" + + " AND type IN (:types)" + + " AND NOT identity IS NULL") + List getIdentities(String email, List types); + @Query("SELECT *" + " FROM contact" + " WHERE account = :account" + diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 0dc4a98cbd..8acfd33a72 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -105,6 +105,7 @@ import android.widget.ImageView; import android.widget.MultiAutoCompleteTextView; import android.widget.RadioGroup; import android.widget.Spinner; +import android.widget.SpinnerAdapter; import android.widget.TextView; import android.widget.Toast; @@ -285,6 +286,7 @@ public class FragmentCompose extends FragmentBase { private long working = -1; private State state = State.NONE; + private boolean identity_selectable = false; private boolean show_images = false; private Integer last_plain_only = null; private List last_attachments = null; @@ -1219,6 +1221,33 @@ public class FragmentCompose extends FragmentBase { etCc.setAdapter(cadapter); etBcc.setAdapter(cadapter); + etTo.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView adapterView, View view, int position, long id) { + Cursor cursor = (Cursor) adapterView.getAdapter().getItem(position); + int colEmail = cursor.getColumnIndex("email"); + selectIdentityForEmail(colEmail < 0 ? null : cursor.getString(colEmail)); + } + }); + + etTo.addTextChangedListener(new TextWatcher() { + @Override + public void beforeTextChanged(CharSequence text, int start, int count, int after) { + // Do nothing + } + + @Override + public void onTextChanged(CharSequence text, int start, int before, int count) { + // Do nothing + } + + @Override + public void afterTextChanged(Editable text) { + if (TextUtils.isEmpty(text.toString().trim())) + identity_selectable = true; + } + }); + grpAddresses.setVisibility(cc_bcc ? View.VISIBLE : View.GONE); ibRemoveAttachments.setVisibility(View.GONE); @@ -1248,6 +1277,64 @@ public class FragmentCompose extends FragmentBase { return view; } + private void selectIdentityForEmail(String email) { + if (!identity_selectable) + return; + if (TextUtils.isEmpty(email)) + return; + + Bundle args = new Bundle(); + args.putString("email", email); + + new SimpleTask() { + @Override + protected Long onExecute(Context context, Bundle args) throws Throwable { + String email = args.getString("email"); + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + boolean suggest_sent = prefs.getBoolean("suggest_sent", true); + boolean suggest_received = prefs.getBoolean("suggest_received", false); + + List types = new ArrayList<>(); + if (suggest_sent) + types.add(EntityContact.TYPE_TO); + if (suggest_received) + types.add(EntityContact.TYPE_FROM); + + if (types.size() == 0) + return null; + + DB db = DB.getInstance(context); + List identities = db.contact().getIdentities(email, types); + if (identities != null && identities.size() == 1) + return identities.get(0); + + return null; + } + + @Override + protected void onExecuted(Bundle args, Long identity) { + if (identity == null) + return; + + SpinnerAdapter adapter = spIdentity.getAdapter(); + for (int pos = 0; pos < adapter.getCount(); pos++) { + EntityIdentity item = (EntityIdentity) adapter.getItem(pos); + if (item.id.equals(identity)) { + spIdentity.setSelection(pos); + identity_selectable = false; + break; + } + } + } + + @Override + protected void onException(Bundle args, Throwable ex) { + Log.unexpectedError(getParentFragmentManager(), ex); + } + }.execute(FragmentCompose.this, args, "compose:contact"); + } + private void onReferenceEdit() { PopupMenuLifecycle popupMenu = new PopupMenuLifecycle(getContext(), getViewLifecycleOwner(), ibReferenceEdit); @@ -2650,6 +2737,8 @@ public class FragmentCompose extends FragmentBase { String email = MessageHelper.sanitizeEmail(cursor.getString(colEmail)); String name = cursor.getString(colName); + args.putString("email", email); + try { db.beginTransaction(); @@ -2697,6 +2786,9 @@ public class FragmentCompose extends FragmentBase { @Override protected void onExecuted(Bundle args, EntityMessage draft) { + if (requestCode == REQUEST_CONTACT_TO) + selectIdentityForEmail(args.getString("email")); + if (draft != null) { etTo.setText(MessageHelper.formatAddressesCompose(draft.to)); etCc.setText(MessageHelper.formatAddressesCompose(draft.cc)); @@ -5220,6 +5312,8 @@ public class FragmentCompose extends FragmentBase { } } + identity_selectable = (data.draft.to == null || data.draft.to.length == 0); + etExtra.setText(data.draft.extra); etTo.setText(MessageHelper.formatAddressesCompose(data.draft.to)); etCc.setText(MessageHelper.formatAddressesCompose(data.draft.cc));