From 774f9b3f365fa9b5944c8c6f28775b38d861bce2 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 3 Aug 2018 07:39:43 +0000 Subject: [PATCH] Added cc/bcc --- .../eu/faircode/email/ActivityCompose.java | 4 +- .../eu/faircode/email/AdapterMessage.java | 10 +- .../eu/faircode/email/FragmentCompose.java | 112 ++++++++++++-- .../eu/faircode/email/FragmentMessage.java | 44 +++++- .../java/eu/faircode/email/MessageHelper.java | 44 ++++-- .../eu/faircode/email/ServiceSynchronize.java | 8 +- .../baseline_people_black_18.png | Bin 0 -> 247 bytes .../baseline_people_black_24.png | Bin 0 -> 260 bytes .../baseline_people_black_36.png | Bin 0 -> 355 bytes .../baseline_people_black_48.png | Bin 0 -> 430 bytes .../baseline_people_white_18.png | Bin 0 -> 249 bytes .../baseline_people_white_24.png | Bin 0 -> 260 bytes .../baseline_people_white_36.png | Bin 0 -> 353 bytes .../baseline_people_white_48.png | Bin 0 -> 425 bytes .../baseline_people_black_18.png | Bin 0 -> 156 bytes .../baseline_people_black_24.png | Bin 0 -> 184 bytes .../baseline_people_black_36.png | Bin 0 -> 260 bytes .../baseline_people_black_48.png | Bin 0 -> 317 bytes .../baseline_people_white_18.png | Bin 0 -> 159 bytes .../baseline_people_white_24.png | Bin 0 -> 187 bytes .../baseline_people_white_36.png | Bin 0 -> 260 bytes .../baseline_people_white_48.png | Bin 0 -> 313 bytes .../baseline_people_black_18.png | Bin 0 -> 260 bytes .../baseline_people_black_24.png | Bin 0 -> 317 bytes .../baseline_people_black_36.png | Bin 0 -> 430 bytes .../baseline_people_black_48.png | Bin 0 -> 567 bytes .../baseline_people_white_18.png | Bin 0 -> 260 bytes .../baseline_people_white_24.png | Bin 0 -> 313 bytes .../baseline_people_white_36.png | Bin 0 -> 425 bytes .../baseline_people_white_48.png | Bin 0 -> 554 bytes .../baseline_people_black_18.png | Bin 0 -> 355 bytes .../baseline_people_black_24.png | Bin 0 -> 430 bytes .../baseline_people_black_36.png | Bin 0 -> 637 bytes .../baseline_people_black_48.png | Bin 0 -> 838 bytes .../baseline_people_white_18.png | Bin 0 -> 353 bytes .../baseline_people_white_24.png | Bin 0 -> 425 bytes .../baseline_people_white_36.png | Bin 0 -> 632 bytes .../baseline_people_white_48.png | Bin 0 -> 827 bytes .../baseline_people_black_18.png | Bin 0 -> 430 bytes .../baseline_people_black_24.png | Bin 0 -> 567 bytes .../baseline_people_black_36.png | Bin 0 -> 838 bytes .../baseline_people_black_48.png | Bin 0 -> 1093 bytes .../baseline_people_white_18.png | Bin 0 -> 425 bytes .../baseline_people_white_24.png | Bin 0 -> 554 bytes .../baseline_people_white_36.png | Bin 0 -> 827 bytes .../baseline_people_white_48.png | Bin 0 -> 1076 bytes .../main/res/drawable/baseline_people_24.xml | 10 ++ app/src/main/res/layout/fragment_compose.xml | 69 ++++++++- app/src/main/res/layout/fragment_message.xml | 146 +++++++++++++++++- app/src/main/res/layout/item_message.xml | 57 ++++++- app/src/main/res/layout/message_header.xml | 63 -------- app/src/main/res/menu/menu_cc.xml | 10 ++ app/src/main/res/values/strings.xml | 2 + 53 files changed, 453 insertions(+), 126 deletions(-) create mode 100755 app/src/main/res/drawable-hdpi/baseline_people_black_18.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_people_black_24.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_people_black_36.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_people_black_48.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_people_white_18.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_people_white_24.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_people_white_36.png create mode 100755 app/src/main/res/drawable-hdpi/baseline_people_white_48.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_people_black_18.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_people_black_24.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_people_black_36.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_people_black_48.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_people_white_18.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_people_white_24.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_people_white_36.png create mode 100755 app/src/main/res/drawable-mdpi/baseline_people_white_48.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_people_black_18.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_people_black_24.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_people_black_36.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_people_black_48.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_people_white_18.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_people_white_24.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_people_white_36.png create mode 100755 app/src/main/res/drawable-xhdpi/baseline_people_white_48.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_people_black_18.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_people_black_24.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_people_black_36.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_people_black_48.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_people_white_18.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_people_white_24.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_people_white_36.png create mode 100755 app/src/main/res/drawable-xxhdpi/baseline_people_white_48.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_people_black_18.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_people_black_24.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_people_black_36.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_people_black_48.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_people_white_18.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_people_white_24.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_people_white_36.png create mode 100755 app/src/main/res/drawable-xxxhdpi/baseline_people_white_48.png create mode 100755 app/src/main/res/drawable/baseline_people_24.xml delete mode 100644 app/src/main/res/layout/message_header.xml create mode 100644 app/src/main/res/menu/menu_cc.xml diff --git a/app/src/main/java/eu/faircode/email/ActivityCompose.java b/app/src/main/java/eu/faircode/email/ActivityCompose.java index 261f69af..82f30169 100644 --- a/app/src/main/java/eu/faircode/email/ActivityCompose.java +++ b/app/src/main/java/eu/faircode/email/ActivityCompose.java @@ -28,7 +28,9 @@ public class ActivityCompose extends ActivityBase implements FragmentManager.OnB static final int LOADER_COMPOSE_PUT = 2; static final int LOADER_COMPOSE_DELETE = 3; - static final int REQUEST_CONTACT = 1; + static final int REQUEST_CONTACT_TO = 1; + static final int REQUEST_CONTACT_CC = 2; + static final int REQUEST_CONTACT_BCC = 3; @Override protected void onCreate(Bundle savedInstanceState) { diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 6f04e246..57ed99d3 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -56,7 +56,7 @@ public class AdapterMessage extends RecyclerView.Adapter 0); int visibility = (unseen ? Typeface.BOLD : Typeface.NORMAL); - holder.tvAddress.setTypeface(null, visibility); + holder.tvFrom.setTypeface(null, visibility); holder.tvTime.setTypeface(null, visibility); holder.tvSubject.setTypeface(null, visibility); holder.tvCount.setTypeface(null, visibility); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 956c3f17..bd27fc87 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -40,6 +40,8 @@ import android.text.TextUtils; import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -69,13 +71,18 @@ public class FragmentCompose extends Fragment { private long rid = -1; private Spinner spFrom; - private ImageView ivIdentyAdd; + private ImageView ivIdentityAdd; private EditText etTo; - private ImageView ivContactAdd; + private ImageView ivToAdd; + private EditText etCc; + private ImageView ivCcAdd; + private EditText etBcc; + private ImageView ivBccAdd; private EditText etSubject; private EditText etBody; private BottomNavigationView bottom_navigation; private ProgressBar pbWait; + private Group grpCc; private Group grpReady; @Override @@ -90,20 +97,26 @@ public class FragmentCompose extends Fragment { // Get controls spFrom = view.findViewById(R.id.spFrom); - ivIdentyAdd = view.findViewById(R.id.ivIdentyAdd); + ivIdentityAdd = view.findViewById(R.id.ivIdentityAdd); etTo = view.findViewById(R.id.etTo); - ivContactAdd = view.findViewById(R.id.ivContactAdd); + ivToAdd = view.findViewById(R.id.ivToAdd); + etCc = view.findViewById(R.id.etCc); + ivCcAdd = view.findViewById(R.id.ivCcAdd); + etBcc = view.findViewById(R.id.etBcc); + ivBccAdd = view.findViewById(R.id.ivBccAdd); etSubject = view.findViewById(R.id.etSubject); etBody = view.findViewById(R.id.etBody); bottom_navigation = view.findViewById(R.id.bottom_navigation); pbWait = view.findViewById(R.id.pbWait); + grpCc = view.findViewById(R.id.grpCc); grpReady = view.findViewById(R.id.grpReady); + grpCc.setVisibility(View.GONE); etBody.setMovementMethod(LinkMovementMethod.getInstance()); // Wire controls - ivIdentyAdd.setOnClickListener(new View.OnClickListener() { + ivIdentityAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Bundle args = new Bundle(); @@ -116,11 +129,27 @@ public class FragmentCompose extends Fragment { } }); - ivContactAdd.setOnClickListener(new View.OnClickListener() { + ivToAdd.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); - startActivityForResult(intent, ActivityCompose.REQUEST_CONTACT); + startActivityForResult(intent, ActivityCompose.REQUEST_CONTACT_TO); + } + }); + + ivCcAdd.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); + startActivityForResult(intent, ActivityCompose.REQUEST_CONTACT_CC); + } + }); + + ivBccAdd.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.CommonDataKinds.Email.CONTENT_URI); + startActivityForResult(intent, ActivityCompose.REQUEST_CONTACT_BCC); } }); @@ -145,6 +174,8 @@ public class FragmentCompose extends Fragment { } }); + setHasOptionsMenu(true); + // Initialize grpReady.setVisibility(View.GONE); pbWait.setVisibility(View.VISIBLE); @@ -185,9 +216,30 @@ public class FragmentCompose extends Fragment { ((AppCompatActivity) getActivity()).getSupportActionBar().setSubtitle(R.string.title_compose); } + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.menu_cc, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_cc: + onMenuCc(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private void onMenuCc() { + grpCc.setVisibility(grpCc.getVisibility() == View.GONE ? View.VISIBLE : View.GONE); + } + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { - if (requestCode == ActivityCompose.REQUEST_CONTACT && resultCode == RESULT_OK) { + if (resultCode == RESULT_OK) { Cursor cursor = null; try { cursor = getContext().getContentResolver().query(data.getData(), @@ -202,12 +254,26 @@ public class FragmentCompose extends Fragment { String email = cursor.getString(colEmail); String name = cursor.getString(colName); + String text = null; + if (requestCode == ActivityCompose.REQUEST_CONTACT_TO) + text = etTo.getText().toString(); + else if (requestCode == ActivityCompose.REQUEST_CONTACT_CC) + text = etCc.getText().toString(); + else if (requestCode == ActivityCompose.REQUEST_CONTACT_BCC) + text = etBcc.getText().toString(); + InternetAddress address = new InternetAddress(email, name); - StringBuilder sb = new StringBuilder(etTo.getText().toString()); + StringBuilder sb = new StringBuilder(text); if (sb.length() > 0) sb.append("; "); sb.append(address.toString()); - etTo.setText(sb.toString()); + + if (requestCode == ActivityCompose.REQUEST_CONTACT_TO) + etTo.setText(sb.toString()); + else if (requestCode == ActivityCompose.REQUEST_CONTACT_CC) + etCc.setText(sb.toString()); + else if (requestCode == ActivityCompose.REQUEST_CONTACT_BCC) + etBcc.setText(sb.toString()); } } catch (Throwable ex) { Log.e(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex)); @@ -236,6 +302,8 @@ public class FragmentCompose extends Fragment { args.putString("thread", FragmentCompose.this.thread); args.putLong("rid", FragmentCompose.this.rid); args.putString("to", etTo.getText().toString()); + args.putString("cc", etCc.getText().toString()); + args.putString("bcc", etBcc.getText().toString()); args.putString("subject", etSubject.getText().toString()); args.putString("body", etBody.getText().toString()); args.putBoolean("send", send); @@ -270,6 +338,8 @@ public class FragmentCompose extends Fragment { result.putLong("iid", msg.identity); if (msg.replying != null) result.putLong("rid", msg.replying); + result.putString("cc", msg.cc); + result.putString("bcc", msg.bcc); result.putString("thread", msg.thread); result.putString("subject", msg.subject); result.putString("body", msg.body); @@ -339,6 +409,8 @@ public class FragmentCompose extends Fragment { String thread = result.getString("thread"); String from = result.getString("from"); String to = result.getString("to"); + String cc = result.getString("cc"); + String bcc = result.getString("bcc"); String subject = result.getString("subject"); String body = result.getString("body"); String action = result.getString("action"); @@ -363,9 +435,11 @@ public class FragmentCompose extends Fragment { // Prevent changed fields from being overwritten once = true; + etCc.setText(TextUtils.join(", ", MessageHelper.decodeAddresses(cc))); + etBcc.setText(TextUtils.join(", ", MessageHelper.decodeAddresses(bcc))); + if (action == null) { - if (to != null) - etTo.setText(TextUtils.join(", ", MessageHelper.decodeAddresses(to))); + etTo.setText(TextUtils.join(", ", MessageHelper.decodeAddresses(to))); etSubject.setText(subject); if (body != null) etBody.setText(Html.fromHtml(HtmlHelper.sanitize(getContext(), body, false))); @@ -480,11 +554,15 @@ public class FragmentCompose extends Fragment { long rid = args.getLong("rid", -1); String thread = args.getString("thread"); String to = args.getString("to"); + String cc = args.getString("cc"); + String bcc = args.getString("bcc"); String body = args.getString("body"); String subject = args.getString("subject"); Address afrom = (ident == null ? null : new InternetAddress(ident.email, ident.name)); Address ato[] = (TextUtils.isEmpty(to) ? null : InternetAddress.parse(to)); + Address acc[] = (TextUtils.isEmpty(cc) ? null : InternetAddress.parse(cc)); + Address abcc[] = (TextUtils.isEmpty(bcc) ? null : InternetAddress.parse(bcc)); // Build draft boolean update = (draft != null); @@ -495,8 +573,10 @@ public class FragmentCompose extends Fragment { draft.identity = (ident == null ? null : ident.id); draft.replying = (rid < 0 ? null : rid); draft.thread = thread; - draft.from = (afrom == null ? null : MessageHelper.encodeAddresses(new Address[]{afrom})); - draft.to = (ato == null ? null : MessageHelper.encodeAddresses(ato)); + draft.from = MessageHelper.encodeAddresses(new Address[]{afrom}); + draft.to = MessageHelper.encodeAddresses(ato); + draft.cc = MessageHelper.encodeAddresses(acc); + draft.bcc = MessageHelper.encodeAddresses(abcc); draft.subject = subject; draft.body = "
" + body.replaceAll("\\r?\\n", "
") + "
"; draft.received = new Date().getTime(); @@ -514,7 +594,7 @@ public class FragmentCompose extends Fragment { if (send) { if (draft.identity == null) throw new MessagingException(getContext().getString(R.string.title_from_missing)); - if (draft.to == null) + if (draft.to == null && draft.cc == null && draft.bcc == null) throw new MessagingException(getContext().getString(R.string.title_to_missing)); // Get outbox @@ -536,6 +616,8 @@ public class FragmentCompose extends Fragment { out.thread = draft.thread; out.from = draft.from; out.to = draft.to; + out.cc = draft.cc; + out.bcc = draft.bcc; out.subject = draft.subject; out.body = draft.body; out.received = draft.received; diff --git a/app/src/main/java/eu/faircode/email/FragmentMessage.java b/app/src/main/java/eu/faircode/email/FragmentMessage.java index 8f790dce..919cb0f7 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessage.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessage.java @@ -37,6 +37,8 @@ import android.text.Html; import android.text.method.LinkMovementMethod; import android.util.Log; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -53,12 +55,16 @@ import java.util.concurrent.Executors; public class FragmentMessage extends Fragment { private TextView tvTime; private TextView tvFrom; + private TextView tvTo; + private TextView tvCc; + private TextView tvBcc; private TextView tvSubject; private TextView tvCount; private BottomNavigationView top_navigation; private TextView tvBody; private BottomNavigationView bottom_navigation; private ProgressBar pbWait; + private Group grpCc; private Group grpReady; private LiveData liveFolder; @@ -77,7 +83,10 @@ public class FragmentMessage extends Fragment { final long id = args.getLong("id"); // Get controls - tvFrom = view.findViewById(R.id.tvAddress); + tvFrom = view.findViewById(R.id.tvFrom); + tvTo = view.findViewById(R.id.tvTo); + tvCc = view.findViewById(R.id.tvCc); + tvBcc = view.findViewById(R.id.tvBcc); tvTime = view.findViewById(R.id.tvTime); tvSubject = view.findViewById(R.id.tvSubject); tvCount = view.findViewById(R.id.tvCount); @@ -85,12 +94,10 @@ public class FragmentMessage extends Fragment { tvBody = view.findViewById(R.id.tvBody); bottom_navigation = view.findViewById(R.id.bottom_navigation); pbWait = view.findViewById(R.id.pbWait); + grpCc = view.findViewById(R.id.grpCc); grpReady = view.findViewById(R.id.grpReady); - tvTime.setTextIsSelectable(true); - tvFrom.setTextIsSelectable(true); - tvSubject.setTextIsSelectable(true); - tvBody.setTextIsSelectable(true); + setHasOptionsMenu(true); tvBody.setMovementMethod(LinkMovementMethod.getInstance()); // Wire controls @@ -141,6 +148,7 @@ public class FragmentMessage extends Fragment { }); // Initialize + grpCc.setVisibility(View.GONE); grpReady.setVisibility(View.GONE); pbWait.setVisibility(View.VISIBLE); @@ -161,7 +169,10 @@ public class FragmentMessage extends Fragment { if (FragmentMessage.this.isVisible()) getFragmentManager().popBackStack(); } else { - tvFrom.setText(message.from == null ? null : MessageHelper.getFormattedAddresses(message.from)); + tvFrom.setText(MessageHelper.getFormattedAddresses(message.from)); + tvTo.setText(MessageHelper.getFormattedAddresses(message.to)); + tvCc.setText(MessageHelper.getFormattedAddresses(message.cc)); + tvBcc.setText(MessageHelper.getFormattedAddresses(message.bcc)); tvTime.setText(message.sent == null ? null : df.format(new Date(message.sent))); tvSubject.setText(message.subject); tvCount.setText(Integer.toString(message.count)); @@ -203,6 +214,27 @@ public class FragmentMessage extends Fragment { liveFolder.removeObservers(this); } + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.menu_cc, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.menu_cc: + onMenuCc(); + return true; + default: + return super.onOptionsItemSelected(item); + } + } + + private void onMenuCc() { + grpCc.setVisibility(grpCc.getVisibility() == View.GONE ? View.VISIBLE : View.GONE); + } + Observer folderObserver = new Observer() { @Override public void onChanged(@Nullable TupleFolderEx folder) { diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index 69ab09a0..3a39d6f5 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -90,7 +90,10 @@ public class MessageHelper { imessage.setRecipients(Message.RecipientType.TO, MessageHelper.decodeAddresses(message.to)); if (message.cc != null) - imessage.setRecipients(Message.RecipientType.CC, MessageHelper.decodeAddresses(message.to)); + imessage.setRecipients(Message.RecipientType.CC, MessageHelper.decodeAddresses(message.cc)); + + if (message.bcc != null) + imessage.setRecipients(Message.RecipientType.BCC, MessageHelper.decodeAddresses(message.bcc)); if (message.subject != null) imessage.setSubject(message.subject); @@ -153,11 +156,17 @@ public class MessageHelper { return encodeAddresses(imessage.getRecipients(Message.RecipientType.CC)); } + String getBcc() throws MessagingException, JSONException { + return encodeAddresses(imessage.getRecipients(Message.RecipientType.BCC)); + } + String getReply() throws MessagingException, JSONException { return encodeAddresses(imessage.getReplyTo()); } static String encodeAddresses(Address[] addresses) throws JSONException { + if (addresses == null) + return null; JSONArray jaddresses = new JSONArray(); if (addresses != null) for (Address address : addresses) @@ -175,23 +184,24 @@ public class MessageHelper { } static Address[] decodeAddresses(String json) { + if (json == null) + return new Address[0]; List
result = new ArrayList<>(); - if (json != null) - try { - JSONArray jaddresses = new JSONArray(json); - for (int i = 0; i < jaddresses.length(); i++) { - JSONObject jaddress = (JSONObject) jaddresses.get(i); - if (jaddress.has("personal")) - result.add(new InternetAddress( - jaddress.getString("address"), - jaddress.getString("personal"))); - else - result.add(new InternetAddress( - jaddress.getString("address"))); - } - } catch (Throwable ex) { - Log.e(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex)); + try { + JSONArray jaddresses = new JSONArray(json); + for (int i = 0; i < jaddresses.length(); i++) { + JSONObject jaddress = (JSONObject) jaddresses.get(i); + if (jaddress.has("personal")) + result.add(new InternetAddress( + jaddress.getString("address"), + jaddress.getString("personal"))); + else + result.add(new InternetAddress( + jaddress.getString("address"))); } + } catch (Throwable ex) { + Log.e(Helper.TAG, ex + "\n" + Log.getStackTraceString(ex)); + } return result.toArray(new Address[0]); } @@ -200,6 +210,8 @@ public class MessageHelper { } static String getFormattedAddresses(String json) { + if (json == null) + return null; try { List addresses = new ArrayList<>(); for (Address address : decodeAddresses(json)) diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 7aa9b513..f3828e4c 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -639,7 +639,7 @@ public class ServiceSynchronize extends LifecycleService { try { itransport.connect(ident.host, ident.port, ident.user, ident.password); - Address[] to = imessage.getRecipients(Message.RecipientType.TO); + Address[] to = imessage.getAllRecipients(); itransport.sendMessage(imessage, to); Log.i(Helper.TAG, "Sent via " + ident.host + "/" + ident.user + " to " + TextUtils.join(", ", to)); @@ -680,14 +680,14 @@ public class ServiceSynchronize extends LifecycleService { names.add(folder.name); Log.i(Helper.TAG, "Local folder count=" + names.size()); - Folder[] ifolders = istore.getDefaultFolder().list("*"); + Folder[] ifolders = istore.getDefaultFolder().list("*"); // TODO: is the pattern correct? Log.i(Helper.TAG, "Remote folder count=" + ifolders.length); for (Folder ifolder : ifolders) { String[] attrs = ((IMAPFolder) ifolder).getAttributes(); boolean candidate = true; for (String attr : attrs) { - if ("\\Noselect".equals(attr)) { + if ("\\Noselect".equals(attr)) { // TODO: is this attribute correct? candidate = false; break; } @@ -844,7 +844,7 @@ public class ServiceSynchronize extends LifecycleService { message.from = helper.getFrom(); message.to = helper.getTo(); message.cc = helper.getCc(); - message.bcc = null; + message.bcc = helper.getBcc(); message.reply = helper.getReply(); message.subject = imessage.getSubject(); message.body = helper.getHtml(); diff --git a/app/src/main/res/drawable-hdpi/baseline_people_black_18.png b/app/src/main/res/drawable-hdpi/baseline_people_black_18.png new file mode 100755 index 0000000000000000000000000000000000000000..55a69c7d1a1d03fd9676db2f675e9c8a7839af76 GIT binary patch literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^(jd&i0wmS%+S~(D`#fD7Ln;{Gb{ldy1~Rz%+pDHb zvYnlBK4C&a!lbJ@hBd#FHl^S9{bu`n)r`8%gFap_Cw}=gTe~DWM4f)Rtx` literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_people_black_24.png b/app/src/main/res/drawable-hdpi/baseline_people_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..b00625c8e09cf3a69b27b9ac76bfa2c0c2151cef GIT binary patch literal 260 zcmV+f0sH=mP)Io!~uj6+HIV`MI6B?BpTgzq>5}_ zy3!;@oW(Rrb&Q@_ApTgAij1B)A^td#Dj7W^pUpb`g^T`8E_VgzWgBw=sf$Sf0000< KMNUMnLSTY`q-_-d literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_people_black_36.png b/app/src/main/res/drawable-hdpi/baseline_people_black_36.png new file mode 100755 index 0000000000000000000000000000000000000000..3bf8fe3a9ee91fee874112b049eb7d72efef7988 GIT binary patch literal 355 zcmV-p0i6DcP)`07yZ-!2qK-sBIU3ZD3R|31Cr!f3U-G z9FG6)4E#SofUkQvu7i>>#+Zy7W(dNJoGjjuM;f(5riiyG4ML4rqgUY-2{xb-G=pfP zc8NrGg|8iNP#YqV75GN+2DKj~vW22iSj0c1Xi8t>NYRx4K@^Qbl{X~VkgB3lIbw`> z8*{8{^v~7%>M6P<(>G?zb~z=dv)VOh>=1LpUC=1(bIv0Le@L)j3Ldy%4_`(<+9WmU zu|yJE(xVADRbG-!phnj_D1Bg;8qNXVsm9l0f+#nkh0{(qPMuE#{XVGU?q!~8oF`<> zJ>&FKjq`=9xjD{#s&S;moKB+I;9+*y<{4v*G5>)wj-G7jhI0S_002ovPDHLkV1h~l Bmkj^_ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_people_black_48.png b/app/src/main/res/drawable-hdpi/baseline_people_black_48.png new file mode 100755 index 0000000000000000000000000000000000000000..b8e313f11ec29b69c12bed0b75e7d47f4290f216 GIT binary patch literal 430 zcmV;f0a5;mP)K0umAy+2vMN~!BjvM1cb0}5C|~(0!33ARNrKS447dWR0f4$*|d={$O-VO zYkQr}HN*M+0UquF?u(mN&N=6t+o4FEK7HyG*|zr-F}K$hIuK-aQgo$<(VoBauDody4@QSx4Vne5pR5@6}$A$eQ}z z;tq-IM&DcPB9U$Ddz%Mj%qsfcYC-WU(DVlDBYu`$)-8Sd&yN*LZ@0sx;=!fpr;T%N zmK+5tRB19q5Qa3VQl>zTSw=gF^hz`Ab4?40ti=@vWJ!WkzDM>dOPte36#L|YC6bPH zeNu)z4dkC|kSD`$w~9Vto*H6Yjd=pd@}%kmHt8Vt(P5JSjx>FcV}PWz0Xc#U@2Vbv zIeJKn>oG@grtEfR&Rs94GVoDD3gZv;rX!4wM&N=6P Y0B#4O^JV`03;+NC07*qoM6N<$f>+DJkN^Mx literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_people_white_18.png b/app/src/main/res/drawable-hdpi/baseline_people_white_18.png new file mode 100755 index 0000000000000000000000000000000000000000..68974bd21fbc05662e8778994368e57bb5ac576a GIT binary patch literal 249 zcmVKCO9`1|&nDS37$g{&WHn0+?2E~seK*y0-N>(WvT0}LKqM<`nS1Sr~TnXGMYDGn#3jhy> zdeI3f223dF<-hQ#(qP1l8kw-x!(t=Pm>qXMo@{7{L7P{!gjjGxw|T-G8K z>|(ITw8QaNOZ?00000NkvXXu0mjfG~;F% literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_people_white_24.png b/app/src/main/res/drawable-hdpi/baseline_people_white_24.png new file mode 100755 index 0000000000000000000000000000000000000000..26691bec827eed8b9fbbe5e5b9b903b8990999ff GIT binary patch literal 260 zcmV+f0sH=mP) zF_zfdvE)Eb&XJ|qe-Rco4jvv3_VX>+XkEq%mm3wjiYqRwdNIT|bRARnlt@Z;%+zkg z-PCKW$!U|bR@<$)E1c=#QXjzB6$-j2)OKv{3LQ!7&p*`b{hbG%8)r2idh+}L0000< KMNUMnLSTXndu`PK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_people_white_36.png b/app/src/main/res/drawable-hdpi/baseline_people_white_36.png new file mode 100755 index 0000000000000000000000000000000000000000..ce0a8383a6058b35e29139dfef448aeda6afecca GIT binary patch literal 353 zcmV-n0iOPeP)-W$^tDz@NkCJI5IvV~nB66)6BIeVTGZUud-0XGzhLwhPb}8a-+}6Pi#9nu**f zagOA|70^R&w3s4ETmduWMvE^bnW9-A8InxVR376@*HmASc%wy~7eZ6&ibjJ2<`m62 z)Hk~C>J@;LYnqB?BMjRd(`Vq%B`0i&-4Qp)O&q(Na!GoIIAbSRk+Ims&|ySQ zOwNc-@xAdBYXUSFlC!RyAr0rT$7if5pvwZS1zqRSi#HxE-YMga*56!KvBu+pvL2ns zIM#T4P}a(M+{PM@3Y^Cv)_7E4ml

G5_WlyN7M*r~|qF00000NkvXXu0mjfdTW)5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-hdpi/baseline_people_white_48.png b/app/src/main/res/drawable-hdpi/baseline_people_white_48.png new file mode 100755 index 0000000000000000000000000000000000000000..6695583fe3cc6852e1d59c1004dbdc9d618f7310 GIT binary patch literal 425 zcmV;a0apHrP)^nbBa7A8VnfFphV8l+p$5Nzv`?RdJDGb5#^mtd#}bS z9VY3JwDxM$n5JUwmDokHZRypxLsGW%YCIu%F!Xv1k#r5c9-m0MhF*_nBrQX)$1Rd; zL$AjUlAOLb;ht%##$J!4{3+1)CZy>RrAOM{$9aCN+j|4@T*wEP+&kyy9?N7YQl&6ln5a zO$saoA>8Qt5E9g}s*?!KT;x&iBaxv?9J*vea}Ra>53&r2%aCm7F?d7n!&sqDocgQ; zzc|(PW0WzF{!ls4^<%scx7X0Yrs~ItAE7r*#_Sdv^M!mNUuf@>RIaB}u literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_people_black_24.png b/app/src/main/res/drawable-mdpi/baseline_people_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..51b043bca45166b4b8201517a797ad566bfc9d0b GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+idQTU}kP619ry1D}6^I=F=s!bt zx$#>r*#wrY(jsLou~{0@0zFLnCq8^{QF!y4S^nPUuVsB|lg$dF)a|TQ{i@cmZ$ILB zxvIc_PDvd9t|OUiZ?5tE)1K9PP^0DIg1~0y#DJH&i*76mU#Q>HJ>h*pmJO7YY i!T7dA`)zX8nV&pA@5bKP{5?RYFnGH9xvXIo!~uj6+HIV`MI6B?BpTgzq>5}_ zy3!;@oW(Rrb&Q@_ApTgAij1B)A^td#Dj7W^pUpb`g^T`8E_VgzWgBw=sf$Sf0000< KMNUMnLSTY`q-_-d literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_people_black_48.png b/app/src/main/res/drawable-mdpi/baseline_people_black_48.png new file mode 100755 index 0000000000000000000000000000000000000000..43ef39f0b3789618ec76f0e9750f8f972b38bd0f GIT binary patch literal 317 zcmV-D0mA-?P)R3k* z)~O}(x^7El6}h)nQq2AeKIV}}o5g2$WvfIyR%Ul)TSPoIYj>j=UYbwtemt2kkDXrh-*1l<;W z)RRYuhYC1*)C~cO8Pt)coIm0UY>|OijgkI7 P00000NkvXXu0mjfLcWG> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_people_white_18.png b/app/src/main/res/drawable-mdpi/baseline_people_white_18.png new file mode 100755 index 0000000000000000000000000000000000000000..5b033b329ed8cefa866bec7288fdf09a7ffe0e6d GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|m(mY)pLn;`rp4cep;2`0W==#D{ za{5YVPN%A%rWrDfvnsyj& zZo0Kq>;p$uSwMyN3}4<;EG*8A`8Np91DY2n_f%EK6_zxh`G2_ zHu1=v7yoWkbmv4CUEH-cx? zF_zfdvE)Eb&XJ|qe-Rco4jvv3_VX>+XkEq%mm3wjiYqRwdNIT|bRARnlt@Z;%+zkg z-PCKW$!U|bR@<$)E1c=#QXjzB6$-j2)OKv{3LQ!7&p*`b{hbG%8)r2idh+}L0000< KMNUMnLSTXndu`PK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-mdpi/baseline_people_white_48.png b/app/src/main/res/drawable-mdpi/baseline_people_white_48.png new file mode 100755 index 0000000000000000000000000000000000000000..93f23280cfa6b2d3c4bd40d4162c165999be0525 GIT binary patch literal 313 zcmV-90mlA`P)uc|!O1F%tWwd?k%L@YBi=(a^-b&B4D={9k7jk%0zJlwd5&W}z_WR}u^!;lJRh+h zU?e?|?xnBjA==A6@=>e@sCzQ2s~+tEw)9NvX~uhqhPE6GbTk6}|EO58>&%r`00Y-f z?OD!#ux~uulPo!OV{AS~ZXH<4ChYi1^l55Zh9ZVqQ-8yGs!v#VkGMMIEgG&+`Wcs(}SjsZ_oJVz)}TpYPoV00000 LNkvXXu0mjf6+(i- literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_people_black_18.png b/app/src/main/res/drawable-xhdpi/baseline_people_black_18.png new file mode 100755 index 0000000000000000000000000000000000000000..b00625c8e09cf3a69b27b9ac76bfa2c0c2151cef GIT binary patch literal 260 zcmV+f0sH=mP)Io!~uj6+HIV`MI6B?BpTgzq>5}_ zy3!;@oW(Rrb&Q@_ApTgAij1B)A^td#Dj7W^pUpb`g^T`8E_VgzWgBw=sf$Sf0000< KMNUMnLSTY`q-_-d literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_people_black_24.png b/app/src/main/res/drawable-xhdpi/baseline_people_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..43ef39f0b3789618ec76f0e9750f8f972b38bd0f GIT binary patch literal 317 zcmV-D0mA-?P)R3k* z)~O}(x^7El6}h)nQq2AeKIV}}o5g2$WvfIyR%Ul)TSPoIYj>j=UYbwtemt2kkDXrh-*1l<;W z)RRYuhYC1*)C~cO8Pt)coIm0UY>|OijgkI7 P00000NkvXXu0mjfLcWG> literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_people_black_36.png b/app/src/main/res/drawable-xhdpi/baseline_people_black_36.png new file mode 100755 index 0000000000000000000000000000000000000000..b8e313f11ec29b69c12bed0b75e7d47f4290f216 GIT binary patch literal 430 zcmV;f0a5;mP)K0umAy+2vMN~!BjvM1cb0}5C|~(0!33ARNrKS447dWR0f4$*|d={$O-VO zYkQr}HN*M+0UquF?u(mN&N=6t+o4FEK7HyG*|zr-F}K$hIuK-aQgo$<(VoBauDody4@QSx4Vne5pR5@6}$A$eQ}z z;tq-IM&DcPB9U$Ddz%Mj%qsfcYC-WU(DVlDBYu`$)-8Sd&yN*LZ@0sx;=!fpr;T%N zmK+5tRB19q5Qa3VQl>zTSw=gF^hz`Ab4?40ti=@vWJ!WkzDM>dOPte36#L|YC6bPH zeNu)z4dkC|kSD`$w~9Vto*H6Yjd=pd@}%kmHt8Vt(P5JSjx>FcV}PWz0Xc#U@2Vbv zIeJKn>oG@grtEfR&Rs94GVoDD3gZv;rX!4wM&N=6P Y0B#4O^JV`03;+NC07*qoM6N<$f>+DJkN^Mx literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_people_black_48.png b/app/src/main/res/drawable-xhdpi/baseline_people_black_48.png new file mode 100755 index 0000000000000000000000000000000000000000..9890f2897837a378d28d2d5b5b5760ef844841a1 GIT binary patch literal 567 zcmV-70?7S|P) zYF0)t#u#IaF~%5UOe9qp!hUY^o_E}4FGHvlYp>FPbrc~AM&tc>pJ-jmvVKtk*t)z!ThTab|3tnNK%goIuxwbi|IlaUA;sqURS zf<)MEb?@9gB*HGMd*?nN5%yHwJNF)muqV!YwfjhfT~YVW9aa7jDto;t%725(UaxVa z7os}q-h-`3$Zb;hUer;(8PoRYbw>hMMmu%y(WJnKAFb{^>z(x@VP}2sUwy@gaz*b} z<%F+A_A!)7>fSqJj4>vMTt={(?VRTs@_o-Z!**6Pf;@5vrzcOs_j=8l$tfODgaoXR zN1S99%?Q$o55c`&9t*jOL?72!NG{p5;$2{`P>FfmMU=bCJSve%8;TTt7S&nFN5s)S zvXbhg*I&_ReCAh>k2qdFD>6Kjdv$%XzPv#^?G1fNRhxWGpJ)`~d1FbnSkWgK8xZ?C zp(;f#PUwfkwEiU9uIzy-ypHXF*Hj_VXk`z~MPl4s617nFz@=CZxJ;s2${xs%^?-a5 zRZ#YT#5?ul+W~ff9bgC80d~MYeLy*9j4{R-V~jDzd;*J92YqZOSa|>d002ovPDHLk FV1hb&2yXxY literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_people_white_18.png b/app/src/main/res/drawable-xhdpi/baseline_people_white_18.png new file mode 100755 index 0000000000000000000000000000000000000000..26691bec827eed8b9fbbe5e5b9b903b8990999ff GIT binary patch literal 260 zcmV+f0sH=mP) zF_zfdvE)Eb&XJ|qe-Rco4jvv3_VX>+XkEq%mm3wjiYqRwdNIT|bRARnlt@Z;%+zkg z-PCKW$!U|bR@<$)E1c=#QXjzB6$-j2)OKv{3LQ!7&p*`b{hbG%8)r2idh+}L0000< KMNUMnLSTXndu`PK literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_people_white_24.png b/app/src/main/res/drawable-xhdpi/baseline_people_white_24.png new file mode 100755 index 0000000000000000000000000000000000000000..93f23280cfa6b2d3c4bd40d4162c165999be0525 GIT binary patch literal 313 zcmV-90mlA`P)uc|!O1F%tWwd?k%L@YBi=(a^-b&B4D={9k7jk%0zJlwd5&W}z_WR}u^!;lJRh+h zU?e?|?xnBjA==A6@=>e@sCzQ2s~+tEw)9NvX~uhqhPE6GbTk6}|EO58>&%r`00Y-f z?OD!#ux~uulPo!OV{AS~ZXH<4ChYi1^l55Zh9ZVqQ-8yGs!v#VkGMMIEgG&+`Wcs(}SjsZ_oJVz)}TpYPoV00000 LNkvXXu0mjf6+(i- literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xhdpi/baseline_people_white_36.png b/app/src/main/res/drawable-xhdpi/baseline_people_white_36.png new file mode 100755 index 0000000000000000000000000000000000000000..6695583fe3cc6852e1d59c1004dbdc9d618f7310 GIT binary patch literal 425 zcmV;a0apHrP)^nbBa7A8VnfFphV8l+p$5Nzv`?RdJDGb5#^mtd#}bS z9VY3JwDxM$n5JUwmDokHZRypxLsGW%YCIu%F!Xv1k#r5c9-m0MhF*_nBrQX)$1Rd; zL$AjUlAOLb;ht%##$J!4{3+1)CZy>RrAOM{$9aCN+j|4@T*wEP+&kyy9?N7YQl&6ln5a zO$saoA>8Qt5E9g}s*?!KT;x&iBaxv?9J*vea}Ra>53&r2%aCm7F?d7n!&sqDocgQ; zzc|(PW0WzF{!ls4^<%scx7X0Yrs~ItAE7r*#_Sdv^M!mNUufeGS{%h^n zWRS@SRDMYAM=PJA%;c4V=T ztAO1#7Lu8ifmXb;_6Ag99(O6PyUe3fQVQCTm%cZkIxG2z%12g~_LoI}V;@H)R*;Qa zHY-YglI%6~arEU4Kg%2XmU!`zZRpF!C{zr0U@SKGC1Wghf)%Jro?r#~@vHPt0&F+; zA*%42U*$Dbg6X5peTcdIN^^thEzEt0OQ;!cV5nv8LuB(SWe3wMnEMdFSb69B0tUW- sFCgFx_yTIaz<`F1W;Owh5Bw6OaK4?07*qoM6N<$f*=3}KL7v# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_people_black_18.png b/app/src/main/res/drawable-xxhdpi/baseline_people_black_18.png new file mode 100755 index 0000000000000000000000000000000000000000..3bf8fe3a9ee91fee874112b049eb7d72efef7988 GIT binary patch literal 355 zcmV-p0i6DcP)`07yZ-!2qK-sBIU3ZD3R|31Cr!f3U-G z9FG6)4E#SofUkQvu7i>>#+Zy7W(dNJoGjjuM;f(5riiyG4ML4rqgUY-2{xb-G=pfP zc8NrGg|8iNP#YqV75GN+2DKj~vW22iSj0c1Xi8t>NYRx4K@^Qbl{X~VkgB3lIbw`> z8*{8{^v~7%>M6P<(>G?zb~z=dv)VOh>=1LpUC=1(bIv0Le@L)j3Ldy%4_`(<+9WmU zu|yJE(xVADRbG-!phnj_D1Bg;8qNXVsm9l0f+#nkh0{(qPMuE#{XVGU?q!~8oF`<> zJ>&FKjq`=9xjD{#s&S;moKB+I;9+*y<{4v*G5>)wj-G7jhI0S_002ovPDHLkV1h~l Bmkj^_ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_people_black_24.png b/app/src/main/res/drawable-xxhdpi/baseline_people_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..b8e313f11ec29b69c12bed0b75e7d47f4290f216 GIT binary patch literal 430 zcmV;f0a5;mP)K0umAy+2vMN~!BjvM1cb0}5C|~(0!33ARNrKS447dWR0f4$*|d={$O-VO zYkQr}HN*M+0UquF?u(mN&N=6t+o4FEK7HyG*|zr-F}K$hIuK-aQgo$<(VoBauDody4@QSx4Vne5pR5@6}$A$eQ}z z;tq-IM&DcPB9U$Ddz%Mj%qsfcYC-WU(DVlDBYu`$)-8Sd&yN*LZ@0sx;=!fpr;T%N zmK+5tRB19q5Qa3VQl>zTSw=gF^hz`Ab4?40ti=@vWJ!WkzDM>dOPte36#L|YC6bPH zeNu)z4dkC|kSD`$w~9Vto*H6Yjd=pd@}%kmHt8Vt(P5JSjx>FcV}PWz0Xc#U@2Vbv zIeJKn>oG@grtEfR&Rs94GVoDD3gZv;rX!4wM&N=6P Y0B#4O^JV`03;+NC07*qoM6N<$f>+DJkN^Mx literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_people_black_36.png b/app/src/main/res/drawable-xxhdpi/baseline_people_black_36.png new file mode 100755 index 0000000000000000000000000000000000000000..631668516c1dbf8744dabc127bd1a2e2d22153e9 GIT binary patch literal 637 zcmeAS@N?(olHy`uVBq!ia0vp^IUvlz0wh)Q=esd5Fu8cTIEGX(zP-uZ6B{Vv_AvDJ zwq*6KqF1@HZui|iX1e&+w%pr=cQ?q*i%S2sp?FjK@88L5o_yp=?lC+j0VO=smr9MQogjI2;)H@%e<_9SxxHd-Whk~60`b?6|2v%$H@G45nZ(Mpu4C0{iv8Z(e5U%Rb^|p7BpQ| zoOJ6@-!4y!gUbX?iX^(P{WctT`4n;Q;#WrX2&IWCC#`qgd(2Y3 z{z~8n7WEs#OZ%D*-~4($*{kf&?&e`V89Yc8wfr8h4* z?_Hdrq<2j1b$LmN_+6{arEqFIY}^OFt{> z7MW9^c_&FO_oR1;tEKe4i7OB4+CUwB zB}EroPg}IcF5uqTB&YjRwy|o?am{x&TYv7~_^8i8UZ~*IZ=d@d^}**4Sxxjku=KK8 zhrO}madUy`ebP=*M?HAn|G4$@f8#0dg|?Zw+;4w$eUzDguG-JA=CPCYKEWM4H#ll| zfvjX8tFR^%$eIphdDk3uvbLM<`1vW!>6K8D}Pt!jWHv~`sa0*j_@ho8*Cpp1(mNJ$K6!7nd!KV!53=(6f>BW2geNUe- z14**UeB{yhmzl0eit9uchrX)y>D(NqS!F^zOnBS<=%Jgo11_rH^{YbtRUwRznI==toPpzPZVWehhZ&n_GkE$6U9*xig4zn%-(T`8v`sQ+S7E$gPS?&9N#v;lMbnTn_22t(}`@XN~x&tluzPT6l zN22z9U-gkRSIeRAAR}XtG&aLl^=Ti>p`u4K%G0j2AyqkYEkYrM>G#A(BMiR3CP`wB(rk2tSCMM-9$ zaX*gVIf(d=1N=c^g*l<@2bPbaNQgFwd?eDys2|63Y(_%1O*~J0g*j%>kK-8*A|c#C zo*}+22K|^GVILCG?c)*R`O>(5RVEf9A>INq#r^UFrv0mGAR%83;u&h(2eNPg3HkPu zh1lvC_kkY}!oMGg?Nj4E&=Vp2>qTr&8ux*P2;tvCVk>Ff2Tme{eZAOQdX01)*5bvpu`pddklZb5-W$^tDz@NkCJI5IvV~nB66)6BIeVTGZUud-0XGzhLwhPb}8a-+}6Pi#9nu**f zagOA|70^R&w3s4ETmduWMvE^bnW9-A8InxVR376@*HmASc%wy~7eZ6&ibjJ2<`m62 z)Hk~C>J@;LYnqB?BMjRd(`Vq%B`0i&-4Qp)O&q(Na!GoIIAbSRk+Ims&|ySQ zOwNc-@xAdBYXUSFlC!RyAr0rT$7if5pvwZS1zqRSi#HxE-YMga*56!KvBu+pvL2ns zIM#T4P}a(M+{PM@3Y^Cv)_7E4ml

G5_WlyN7M*r~|qF00000NkvXXu0mjfdTW)5 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/baseline_people_white_24.png b/app/src/main/res/drawable-xxhdpi/baseline_people_white_24.png new file mode 100755 index 0000000000000000000000000000000000000000..6695583fe3cc6852e1d59c1004dbdc9d618f7310 GIT binary patch literal 425 zcmV;a0apHrP)^nbBa7A8VnfFphV8l+p$5Nzv`?RdJDGb5#^mtd#}bS z9VY3JwDxM$n5JUwmDokHZRypxLsGW%YCIu%F!Xv1k#r5c9-m0MhF*_nBrQX)$1Rd; zL$AjUlAOLb;ht%##$J!4{3+1)CZy>RrAOM{$9aCN+j|4@T*wEP+&kyy9?N7YQl&6ln5a zO$saoA>8Qt5E9g}s*?!KT;x&iBaxv?9J*vea}Ra>53&r2%aCm7F?d7n!&sqDocgQ; zzc|(PW0WzF{!ls4^<%scx7X0Yrs~ItAE7r*#_Sdv^M!mNUuf-{Bow_0&U_y^4XV#T$>(Z*3FAbj)UhIc6s*7ujWGX{S&j@`ew z>E5TMjJ%u8WgSu6b%FS#k1#UG_{L?k?6>VNcCI^~tclJmBTjsx0Om|MQkPl+*7kq6)k4 zXDgNT`wEE8bOJSn7@Bh) z;>b_vK9EJbFOJ=qSfSk)Mtw|`*X)a96Q-7E_Jxs@kC=Kx9Id`M+TesHT77ZM!U?05 z`tsO{6P7CV<#7%t>{sf`;~h@8snnOpQ=D*BsV|SyIAOO^UmhEA!a}9KJjUaMkxG4e zG{y;4mHP6C%X>_{Af|j@4eK$rSg|jUI+!XU-&e&>Osr7u%cFq#Em8TtDh3j&J_`Nt zBP#0%#d4j#0upi7{K1}lUlB>zMlg1eP@%7h7|bG2(}}Lx_r_n`jH)c+t^WZh#lAk0 z(U}e3N910AACc=!k}&r@9*@W4@pwEQkH_O74h3jRe`c_gb3EpEk2%M7X3(Fe6d;ae zgo>OI=*u8Abs5M;t`m$KtYZ-MND=Z)k0(ZbdBmbJBRPesQ;eiCF|8nxnah%W17xHv zOL&2kp0kv8WUzuj3ie6#4Um|&>_pNo+L9oM;fVvz_6?Ag8N4POUNemxRzOJ09rM01 zim{aN`p8m>S^=OG@67uKD9lQ^wD9|) zfmb4Zdn95xZnA_#mJbXO=-VS7S8PDY2YGmm8$BkEWs7N!^!+0X4{)mo zWU*{eQ?~yd(Kw8o9U_|TH-9AA|Bha`T`$W9%jNpt5rap#-9utn|3yE!{&zGW5;U;A zMK0umAy+2vMN~!BjvM1cb0}5C|~(0!33ARNrKS447dWR0f4$*|d={$O-VO zYkQr}HN*M+0UquF?u(mN&N=6t+o4FEK7HyG*|zr-F}K$hIuK-aQgo$<(VoBauDody4@QSx4Vne5pR5@6}$A$eQ}z z;tq-IM&DcPB9U$Ddz%Mj%qsfcYC-WU(DVlDBYu`$)-8Sd&yN*LZ@0sx;=!fpr;T%N zmK+5tRB19q5Qa3VQl>zTSw=gF^hz`Ab4?40ti=@vWJ!WkzDM>dOPte36#L|YC6bPH zeNu)z4dkC|kSD`$w~9Vto*H6Yjd=pd@}%kmHt8Vt(P5JSjx>FcV}PWz0Xc#U@2Vbv zIeJKn>oG@grtEfR&Rs94GVoDD3gZv;rX!4wM&N=6P Y0B#4O^JV`03;+NC07*qoM6N<$f>+DJkN^Mx literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_people_black_24.png b/app/src/main/res/drawable-xxxhdpi/baseline_people_black_24.png new file mode 100755 index 0000000000000000000000000000000000000000..9890f2897837a378d28d2d5b5b5760ef844841a1 GIT binary patch literal 567 zcmV-70?7S|P) zYF0)t#u#IaF~%5UOe9qp!hUY^o_E}4FGHvlYp>FPbrc~AM&tc>pJ-jmvVKtk*t)z!ThTab|3tnNK%goIuxwbi|IlaUA;sqURS zf<)MEb?@9gB*HGMd*?nN5%yHwJNF)muqV!YwfjhfT~YVW9aa7jDto;t%725(UaxVa z7os}q-h-`3$Zb;hUer;(8PoRYbw>hMMmu%y(WJnKAFb{^>z(x@VP}2sUwy@gaz*b} z<%F+A_A!)7>fSqJj4>vMTt={(?VRTs@_o-Z!**6Pf;@5vrzcOs_j=8l$tfODgaoXR zN1S99%?Q$o55c`&9t*jOL?72!NG{p5;$2{`P>FfmMU=bCJSve%8;TTt7S&nFN5s)S zvXbhg*I&_ReCAh>k2qdFD>6Kjdv$%XzPv#^?G1fNRhxWGpJ)`~d1FbnSkWgK8xZ?C zp(;f#PUwfkwEiU9uIzy-ypHXF*Hj_VXk`z~MPl4s617nFz@=CZxJ;s2${xs%^?-a5 zRZ#YT#5?ul+W~ff9bgC80d~MYeLy*9j4{R-V~jDzd;*J92YqZOSa|>d002ovPDHLk FV1hb&2yXxY literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_people_black_36.png b/app/src/main/res/drawable-xxxhdpi/baseline_people_black_36.png new file mode 100755 index 0000000000000000000000000000000000000000..5f542168c7066094755f04228374136b50558441 GIT binary patch literal 838 zcmV-M1G)T(P)~`sa0*j_@ho8*Cpp1(mNJ$K6!7nd!KV!53=(6f>BW2geNUe- z14**UeB{yhmzl0eit9uchrX)y>D(NqS!F^zOnBS<=%Jgo11_rH^{YbtRUwRznI==toPpzPZVWehhZ&n_GkE$6U9*xig4zn%-(T`8v`sQ+S7E$gPS?&9N#v;lMbnTn_22t(}`@XN~x&tluzPT6l zN22z9U-gkRSIeRAAR}XtG&aLl^=Ti>p`u4K%G0j2AyqkYEkYrM>G#A(BMiR3CP`wB(rk2tSCMM-9$ zaX*gVIf(d=1N=c^g*l<@2bPbaNQgFwd?eDys2|63Y(_%1O*~J0g*j%>kK-8*A|c#C zo*}+22K|^GVILCG?c)*R`O>(5RVEf9A>INq#r^UFrv0mGAR%83;u&h(2eNPg3HkPu zh1lvC_kkY}!oMGg?Nj4E&=Vp2>qTr&8ux*P2;tvCVk>Ff2Tme{eZAOQdX01)*5bvpu`pddklZb51$OH%PCR;Jm+m6r^#yj(?f0**dSb+u7Yo1?S$YR%~F;20@emx+DXng!|s2-zw*rCt~)t>)4$u6i=N&nmLn;C;Df*D%r+w{ZDSFc`q;1@}=lx7AwnWZ#>Zzahh07fjx|jR!%U82h!D%0! zT{t#<-#zac&9*PxdtYZPp8MK4e!cj!jQZ*e)3bXmZwIZqeDAuo zbn%YGK)RZ!K?7@ z_1Pmbc^Eckl0bdDPx@$#u0En{}5*-TUs4f9B%9PYc(V zFa9B~^k`pP^Wu6=zhy!9zaKvRsJ^TFchzibOR-D9063ofs5$V~zBrp%E4C|hA89Y% zT5Id)`KIEB;IDo2*NMeX2>AYWM@)^Y$KC6XuZYD=nQ@l$*S`N{DNDZ0TCr=ryKcF0 zY*Ap;h423ZSs(A5DrNuspZ%J}^3#JBzHiTc{nbYA8Pm3p+t-V`28y7fE3<4ZroOJ6 zmj80b$MXk8eU>QS|73E#SgQJhR5;(G>|4h3MBn|c>XkXJyT{);Es-@(?QP}!Xv=AC zlS*y9W4?X$y3zgmXOClqQuM(DyT?`Emb9e2Im(fFf9Ba8J?m$-S>6)a_pr!p+0&@Y z&ezHp%)4AMxA6wsErojzOkQPls#SUX=3Mzy=wF(q+Kr%pkAkvT-Z%B^J7%}%u#C^1 zn|n_06Injfv8j$JYv-JK5nb1MwO1@GkT&+brGMz!o>MtGt+P*N=eRB`OYK_`-{Lke znRD7B-Dj0j8fPR=)%`oQW7f(U?6VJRyy-o_mRw};ynxIJ9FwMFuq~+I^kYk zXn)u`LZQ07W{&pT^a>g7jQ)wyrp2j$dBT$$-)0s44!ClD11I-}1KS#WPdw!av_C8# z(eS%BMk_+;MY;tycS-tWZ}md?hO&qS+3tGlyMG_hi#Tw*^^Km$_r~WN8@@B$l+}C3 zd_S4-ef6f>zIWJvB{8noznQD`j+uL7!}bYpULC1Dz%>8Y*Z7-qvckYDtHAO4{w;~3 r9G3$O%=07@8W`Cma1)3u4rT?IZ_PCJ%3RzK3gUXY`njxgN@xNA=Tr_& literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_people_white_18.png b/app/src/main/res/drawable-xxxhdpi/baseline_people_white_18.png new file mode 100755 index 0000000000000000000000000000000000000000..6695583fe3cc6852e1d59c1004dbdc9d618f7310 GIT binary patch literal 425 zcmV;a0apHrP)^nbBa7A8VnfFphV8l+p$5Nzv`?RdJDGb5#^mtd#}bS z9VY3JwDxM$n5JUwmDokHZRypxLsGW%YCIu%F!Xv1k#r5c9-m0MhF*_nBrQX)$1Rd; zL$AjUlAOLb;ht%##$J!4{3+1)CZy>RrAOM{$9aCN+j|4@T*wEP+&kyy9?N7YQl&6ln5a zO$saoA>8Qt5E9g}s*?!KT;x&iBaxv?9J*vea}Ra>53&r2%aCm7F?d7n!&sqDocgQ; zzc|(PW0WzF{!ls4^<%scx7X0Yrs~ItAE7r*#_Sdv^M!mNUufeGS{%h^n zWRS@SRDMYAM=PJA%;c4V=T ztAO1#7Lu8ifmXb;_6Ag99(O6PyUe3fQVQCTm%cZkIxG2z%12g~_LoI}V;@H)R*;Qa zHY-YglI%6~arEU4Kg%2XmU!`zZRpF!C{zr0U@SKGC1Wghf)%Jro?r#~@vHPt0&F+; zA*%42U*$Dbg6X5peTcdIN^^thEzEt0OQ;!cV5nv8LuB(SWe3wMnEMdFSb69B0tUW- sFCgFx_yTIaz<`F1W;Owh5Bw6OaK4?07*qoM6N<$f*=3}KL7v# literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_people_white_36.png b/app/src/main/res/drawable-xxxhdpi/baseline_people_white_36.png new file mode 100755 index 0000000000000000000000000000000000000000..20850636b33fc0c11553a8a4b2fce36420bab75e GIT binary patch literal 827 zcmV-B1H}A^P)Tjsx0Om|MQkPl+*7kq6)k4 zXDgNT`wEE8bOJSn7@Bh) z;>b_vK9EJbFOJ=qSfSk)Mtw|`*X)a96Q-7E_Jxs@kC=Kx9Id`M+TesHT77ZM!U?05 z`tsO{6P7CV<#7%t>{sf`;~h@8snnOpQ=D*BsV|SyIAOO^UmhEA!a}9KJjUaMkxG4e zG{y;4mHP6C%X>_{Af|j@4eK$rSg|jUI+!XU-&e&>Osr7u%cFq#Em8TtDh3j&J_`Nt zBP#0%#d4j#0upi7{K1}lUlB>zMlg1eP@%7h7|bG2(}}Lx_r_n`jH)c+t^WZh#lAk0 z(U}e3N910AACc=!k}&r@9*@W4@pwEQkH_O74h3jRe`c_gb3EpEk2%M7X3(Fe6d;ae zgo>OI=*u8Abs5M;t`m$KtYZ-MND=Z)k0(ZbdBmbJBRPesQ;eiCF|8nxnah%W17xHv zOL&2kp0kv8WUzuj3ie6#4Um|&>_pNo+L9oM;fVvz_6?Ag8N4POUNemxRzOJ09rM01 zim{aN`p8m>S^=OG@67uKD9lQ^wD9|) zfmb4Zdn95xZnA_#mJbXO=-VS7S8PDY2YGmm8$BkEWs7N!^!+0X4{)mo zWU*{eQ?~yd(Kw8o9U_|TH-9AA|Bha`T`$W9%jNpt5rap#-9utn|3yE!{&zGW5;U;A zMV}OboQE}Ha(e{VM~$wC{F)_^Zy!I_bJM zho0_ncNg1yOUddZ-}KGJXKERz6w5Z>n6xj(JF=#h@yf$GHHNy!JEm(j*4eB$eAq`- zI=G?%$lizXM(~H)r(_YmwnjAY9q_y=o(+&x5_3ZDgAH=4~U4F;?KwjtX zio4@zT-}?n#Pv-opl3~_hX>Sh^D09lyzJhMmz)-?@3-Dqw9+A7{_Bk9){|4bzkK~@CN@vxVV*Q>oZ|59mG%0hl=$fB- zz9LNG%hiDSmv^+E&pfWP$#n9!nsa;Sc-4xFY~Orj!TM$;zDH&Ik_8giBpBQ;v}O-_ z()2*VjpfDbMC)~r)0ZWta_uj$jb^{8@QvfDxI^r@$F*!h8qGf%KCgKE$$`1*#`m*< zXHB=HXqqN!>h74P)f|~{!Tf+?%^{hrTRC=51Evd08J*ad-;lL#xw_Y`LgrAt?3}YI zr}r_IJ&R3SoT2u97bl#p$bUhFj0SV!0_BkL-JY)b+@#r00(6zxRp1 z?FhAge(?9VTK;c}X}>Fu{qy?0kA1!HW^14seeCv|a9Kou-OI0|O%y3x|LLgmFa(%7BR=ax{q5 Zkjms|UvC$zk)#OXdb;|#taD0e0sv{o@HYSe literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/baseline_people_24.xml b/app/src/main/res/drawable/baseline_people_24.xml new file mode 100755 index 00000000..1845bbf2 --- /dev/null +++ b/app/src/main/res/drawable/baseline_people_24.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/layout/fragment_compose.xml b/app/src/main/res/layout/fragment_compose.xml index 73bdfc03..7dbab182 100644 --- a/app/src/main/res/layout/fragment_compose.xml +++ b/app/src/main/res/layout/fragment_compose.xml @@ -14,11 +14,13 @@ app:layout_constraintTop_toTopOf="parent" /> @@ -31,21 +33,72 @@ android:inputType="textEmailAddress" android:maxLines="1" android:textAppearance="@style/TextAppearance.AppCompat.Medium" - app:layout_constraintEnd_toStartOf="@+id/ivContactAdd" + app:layout_constraintEnd_toStartOf="@+id/ivToAdd" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@+id/spFrom" /> + + + + + + + + + app:layout_constraintTop_toBottomOf="@+id/etBcc" /> + + + app:constraint_referenced_ids="spFrom,ivIdentityAdd,etTo,etSubject,vSeparator,scroll,bottom_navigation" /> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_message.xml b/app/src/main/res/layout/fragment_message.xml index 56623d6a..d72036d8 100644 --- a/app/src/main/res/layout/fragment_message.xml +++ b/app/src/main/res/layout/fragment_message.xml @@ -7,14 +7,139 @@ android:orientation="vertical" tools:context=".ActivityView"> - + + + + + + + + + + + + + + + + + + + + + android:textAppearance="@style/TextAppearance.AppCompat.Small" + android:textIsSelectable="true" /> + + + app:constraint_referenced_ids="tvFrom,tvTime,tvSubject,tvCount,top_navigation,scroll,bottom_navigation" /> diff --git a/app/src/main/res/layout/item_message.xml b/app/src/main/res/layout/item_message.xml index 436aafdc..1e7b6d6a 100644 --- a/app/src/main/res/layout/item_message.xml +++ b/app/src/main/res/layout/item_message.xml @@ -5,11 +5,60 @@ android:layout_height="wrap_content" android:layout_marginBottom="6dp"> - + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/message_header.xml b/app/src/main/res/layout/message_header.xml deleted file mode 100644 index d6232b4d..00000000 --- a/app/src/main/res/layout/message_header.xml +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/menu/menu_cc.xml b/app/src/main/res/menu/menu_cc.xml new file mode 100644 index 00000000..3135586f --- /dev/null +++ b/app/src/main/res/menu/menu_cc.xml @@ -0,0 +1,10 @@ + +

+ + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 8a60b704..9fec3fb6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -99,6 +99,8 @@ Compose From: To: + CC: + BCC: Subject: Your message Save