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 00000000..55a69c7d Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_people_black_18.png differ 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 00000000..b00625c8 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_people_black_24.png differ 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 00000000..3bf8fe3a Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_people_black_36.png differ 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 00000000..b8e313f1 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_people_black_48.png differ 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 00000000..68974bd2 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_people_white_18.png differ 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 00000000..26691bec Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_people_white_24.png differ 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 00000000..ce0a8383 Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_people_white_36.png differ 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 00000000..6695583f Binary files /dev/null and b/app/src/main/res/drawable-hdpi/baseline_people_white_48.png differ diff --git a/app/src/main/res/drawable-mdpi/baseline_people_black_18.png b/app/src/main/res/drawable-mdpi/baseline_people_black_18.png new file mode 100755 index 00000000..7d9d79e5 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_people_black_18.png differ 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 00000000..51b043bc Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_people_black_24.png differ diff --git a/app/src/main/res/drawable-mdpi/baseline_people_black_36.png b/app/src/main/res/drawable-mdpi/baseline_people_black_36.png new file mode 100755 index 00000000..b00625c8 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_people_black_36.png differ 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 00000000..43ef39f0 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_people_black_48.png differ 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 00000000..5b033b32 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_people_white_18.png differ diff --git a/app/src/main/res/drawable-mdpi/baseline_people_white_24.png b/app/src/main/res/drawable-mdpi/baseline_people_white_24.png new file mode 100755 index 00000000..c2526975 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_people_white_24.png differ diff --git a/app/src/main/res/drawable-mdpi/baseline_people_white_36.png b/app/src/main/res/drawable-mdpi/baseline_people_white_36.png new file mode 100755 index 00000000..26691bec Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_people_white_36.png differ 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 00000000..93f23280 Binary files /dev/null and b/app/src/main/res/drawable-mdpi/baseline_people_white_48.png differ 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 00000000..b00625c8 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_people_black_18.png differ 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 00000000..43ef39f0 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_people_black_24.png differ 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 00000000..b8e313f1 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_people_black_36.png differ 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 00000000..9890f289 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_people_black_48.png differ 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 00000000..26691bec Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_people_white_18.png differ 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 00000000..93f23280 Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_people_white_24.png differ 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 00000000..6695583f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_people_white_36.png differ diff --git a/app/src/main/res/drawable-xhdpi/baseline_people_white_48.png b/app/src/main/res/drawable-xhdpi/baseline_people_white_48.png new file mode 100755 index 00000000..594db41f Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/baseline_people_white_48.png differ 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 00000000..3bf8fe3a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_people_black_18.png differ 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 00000000..b8e313f1 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_people_black_24.png differ 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 00000000..63166851 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_people_black_36.png differ diff --git a/app/src/main/res/drawable-xxhdpi/baseline_people_black_48.png b/app/src/main/res/drawable-xxhdpi/baseline_people_black_48.png new file mode 100755 index 00000000..5f542168 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_people_black_48.png differ diff --git a/app/src/main/res/drawable-xxhdpi/baseline_people_white_18.png b/app/src/main/res/drawable-xxhdpi/baseline_people_white_18.png new file mode 100755 index 00000000..ce0a8383 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_people_white_18.png differ 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 00000000..6695583f Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_people_white_24.png differ diff --git a/app/src/main/res/drawable-xxhdpi/baseline_people_white_36.png b/app/src/main/res/drawable-xxhdpi/baseline_people_white_36.png new file mode 100755 index 00000000..c9e864c7 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_people_white_36.png differ diff --git a/app/src/main/res/drawable-xxhdpi/baseline_people_white_48.png b/app/src/main/res/drawable-xxhdpi/baseline_people_white_48.png new file mode 100755 index 00000000..20850636 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/baseline_people_white_48.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_people_black_18.png b/app/src/main/res/drawable-xxxhdpi/baseline_people_black_18.png new file mode 100755 index 00000000..b8e313f1 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_people_black_18.png differ 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 00000000..9890f289 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_people_black_24.png differ 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 00000000..5f542168 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_people_black_36.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_people_black_48.png b/app/src/main/res/drawable-xxxhdpi/baseline_people_black_48.png new file mode 100755 index 00000000..0f73c58b Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_people_black_48.png differ 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 00000000..6695583f Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_people_white_18.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_people_white_24.png b/app/src/main/res/drawable-xxxhdpi/baseline_people_white_24.png new file mode 100755 index 00000000..594db41f Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_people_white_24.png differ 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 00000000..20850636 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_people_white_36.png differ diff --git a/app/src/main/res/drawable-xxxhdpi/baseline_people_white_48.png b/app/src/main/res/drawable-xxxhdpi/baseline_people_white_48.png new file mode 100755 index 00000000..8e899991 Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/baseline_people_white_48.png differ 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