From 3da2792d1ac002e171714389a0eaa3478507cb09 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 3 Oct 2025 15:59:17 +0200 Subject: [PATCH] Collapsible composer attachments --- .../java/eu/faircode/email/EntityFolder.java | 1 + .../eu/faircode/email/FragmentCompose.java | 26 ++++++++++++++++--- app/src/main/res/layout/fragment_compose.xml | 15 ++++++++++- 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/EntityFolder.java b/app/src/main/java/eu/faircode/email/EntityFolder.java index e7dd0385c1..453c9e6664 100644 --- a/app/src/main/java/eu/faircode/email/EntityFolder.java +++ b/app/src/main/java/eu/faircode/email/EntityFolder.java @@ -219,6 +219,7 @@ public class EntityFolder extends EntityOrder implements Serializable { put("Bozze", new TypeScore(EntityFolder.DRAFTS, 100)); put("Szkice lokalne", new TypeScore(EntityFolder.DRAFTS, 100)); // Polish put("Wersje robocze", new TypeScore(EntityFolder.DRAFTS, 100)); // Polish + put("draftbox", new TypeScore(EntityFolder.DRAFTS, 50)); // mailo.com put("trash", new TypeScore(EntityFolder.TRASH, 100)); put("Deleted", new TypeScore(EntityFolder.TRASH, 100)); diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 9d6dfc16c7..db41e069ec 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -259,6 +259,7 @@ public class FragmentCompose extends FragmentBase { private EditText etSubject; private ImageButton ibCcBcc; private ImageButton ibRemoveAttachments; + private ImageButton ibExpanderAttachments; private RecyclerView rvAttachment; private TextView tvNoInternetAttachments; private TextView tvDsn; @@ -293,6 +294,7 @@ public class FragmentCompose extends FragmentBase { private Group grpReferenceHint; private ContentResolver resolver; + private TwoStateOwner ownerAttachment; private AdapterAttachment adapter; private MarkwonEditorTextWatcher markwonWatcher; @@ -420,6 +422,7 @@ public class FragmentCompose extends FragmentBase { etSubject = view.findViewById(R.id.etSubject); ibCcBcc = view.findViewById(R.id.ibCcBcc); ibRemoveAttachments = view.findViewById(R.id.ibRemoveAttachments); + ibExpanderAttachments = view.findViewById(R.id.ibExpanderAttachments); rvAttachment = view.findViewById(R.id.rvAttachment); tvNoInternetAttachments = view.findViewById(R.id.tvNoInternetAttachments); tvDsn = view.findViewById(R.id.tvDsn); @@ -1518,6 +1521,19 @@ public class FragmentCompose extends FragmentBase { } }); + ownerAttachment = new TwoStateOwner(getViewLifecycleOwner(), "attachments"); + ownerAttachment.start(); + ibExpanderAttachments.setVisibility(View.GONE); + ibExpanderAttachments.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + boolean hide_attachments = !Boolean.TRUE.equals(ibExpanderAttachments.getTag()); + ibExpanderAttachments.setTag(hide_attachments); + ibExpanderAttachments.setImageLevel(hide_attachments ? 1 /* more */ : 0 /* less */); + ownerAttachment.restart(); + } + }); + rvAttachment.setHasFixedSize(false); LinearLayoutManager llm = new LinearLayoutManager(getContext()); rvAttachment.setLayoutManager(llm); @@ -6681,14 +6697,16 @@ public class FragmentCompose extends FragmentBase { for (EntityAttachment attachment : last_attachments) map.put(attachment.id, attachment); - db.attachment().liveAttachments(data.draft.id).observe(getViewLifecycleOwner(), + db.attachment().liveAttachments(data.draft.id).observe(ownerAttachment, new Observer>() { @Override public void onChanged(@Nullable List attachments) { if (attachments == null) attachments = new ArrayList<>(); - List a = new ArrayList<>(attachments); + boolean hide_attachments = Boolean.TRUE.equals(ibExpanderAttachments.getTag()); + + List a = (hide_attachments ? new ArrayList<>() : new ArrayList<>(attachments)); rvAttachment.post(new Runnable() { @Override public void run() { @@ -6719,7 +6737,9 @@ public class FragmentCompose extends FragmentBase { } }); - ibRemoveAttachments.setVisibility(attachments.size() > 2 ? View.VISIBLE : View.GONE); + ibRemoveAttachments.setVisibility(attachments.size() > 2 && !hide_attachments ? View.VISIBLE : View.GONE); + ibExpanderAttachments.setVisibility(attachments.size() > 1 ? View.VISIBLE : View.GONE); + ibExpanderAttachments.setImageLevel(hide_attachments ? 1 /* more */ : 0 /* less */); grpAttachments.setVisibility(attachments.size() > 0 ? View.VISIBLE : View.GONE); boolean downloading = false; diff --git a/app/src/main/res/layout/fragment_compose.xml b/app/src/main/res/layout/fragment_compose.xml index 7a5f1dbcc6..69a97bbb9c 100644 --- a/app/src/main/res/layout/fragment_compose.xml +++ b/app/src/main/res/layout/fragment_compose.xml @@ -265,13 +265,26 @@ app:layout_constraintTop_toBottomOf="@+id/vSeparatorAttachments" app:srcCompat="@drawable/twotone_delete_24" /> + +