diff --git a/app/src/main/java/eu/faircode/email/AdapterFolder.java b/app/src/main/java/eu/faircode/email/AdapterFolder.java index 20679aba59..2cc7bf528f 100644 --- a/app/src/main/java/eu/faircode/email/AdapterFolder.java +++ b/app/src/main/java/eu/faircode/email/AdapterFolder.java @@ -50,9 +50,11 @@ import java.util.Locale; import androidx.annotation.NonNull; import androidx.appcompat.widget.PopupMenu; import androidx.lifecycle.LifecycleOwner; +import androidx.lifecycle.Observer; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import androidx.preference.PreferenceManager; import androidx.recyclerview.widget.DiffUtil; +import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.ListUpdateCallback; import androidx.recyclerview.widget.RecyclerView; @@ -70,12 +72,14 @@ public class AdapterFolder extends RecyclerView.Adapter all = new ArrayList<>(); private List filtered = new ArrayList<>(); + private List collapsed = new ArrayList<>(); private static NumberFormat nf = NumberFormat.getNumberInstance(); public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { private View view; private View vwColor; + private ImageView ivExpander; private View vwLevel; private ImageView ivState; private ImageView ivNotify; @@ -88,6 +92,10 @@ public class AdapterFolder extends RecyclerView.Adapter 0 ? View.VISIBLE : View.INVISIBLE); + if (account > 0) { ViewGroup.LayoutParams lp = vwLevel.getLayoutParams(); lp.width = (EntityFolder.USER.equals(folder.type) ? folder.level : 0) * dp12; @@ -231,6 +254,21 @@ public class AdapterFolder extends RecyclerView.Adapter 0) { + DB db = DB.getInstance(context); + cowner.start(); + db.folder().liveFolders(folder.account, folder.id).observe(cowner, new Observer>() { + @Override + public void onChanged(List folders) { + childs.set(account, true, folders); + } + }); + } else + childs.set(account, true, new ArrayList()); } @Override @@ -243,11 +281,26 @@ public class AdapterFolder extends RecyclerView.Adapter> liveFolders(Long account); + LiveData> liveFolders(Long account, Long parent); @Query("SELECT folder.*" + ", account.name AS accountName, account.color AS accountColor, account.state AS accountState" + ", COUNT(message.id) AS messages" + ", SUM(CASE WHEN message.content = 1 THEN 1 ELSE 0 END) AS content" + ", SUM(CASE WHEN message.ui_seen = 0 THEN 1 ELSE 0 END) AS unseen" + + ", (SELECT COUNT(child.id) FROM folder child WHERE child.parent = folder.id) AS childs" + " FROM folder" + " JOIN account ON account.id = folder.account" + " LEFT JOIN message ON message.folder = folder.id AND NOT message.ui_hide" + @@ -91,6 +97,7 @@ public interface DaoFolder { ", COUNT(message.id) AS messages" + ", SUM(CASE WHEN message.content = 1 THEN 1 ELSE 0 END) AS content" + ", SUM(CASE WHEN message.ui_seen = 0 THEN 1 ELSE 0 END) AS unseen" + + ", (SELECT COUNT(child.id) FROM folder child WHERE child.parent = folder.id) AS childs" + " FROM folder" + " LEFT JOIN account ON account.id = folder.account" + " LEFT JOIN message ON message.folder = folder.id AND NOT message.ui_hide" + diff --git a/app/src/main/java/eu/faircode/email/FragmentFolders.java b/app/src/main/java/eu/faircode/email/FragmentFolders.java index ab59bd51e3..a7e0e2fbea 100644 --- a/app/src/main/java/eu/faircode/email/FragmentFolders.java +++ b/app/src/main/java/eu/faircode/email/FragmentFolders.java @@ -239,7 +239,7 @@ public class FragmentFolders extends FragmentBase { }); // Observe folders - db.folder().liveFolders(account < 0 ? null : account).observe(getViewLifecycleOwner(), new Observer>() { + db.folder().liveFolders(account < 0 ? null : account, null).observe(getViewLifecycleOwner(), new Observer>() { @Override public void onChanged(@Nullable List folders) { if (folders == null) { diff --git a/app/src/main/java/eu/faircode/email/TupleFolderEx.java b/app/src/main/java/eu/faircode/email/TupleFolderEx.java index eef5b2641c..9165387a02 100644 --- a/app/src/main/java/eu/faircode/email/TupleFolderEx.java +++ b/app/src/main/java/eu/faircode/email/TupleFolderEx.java @@ -28,6 +28,7 @@ public class TupleFolderEx extends EntityFolder { public int messages; public int content; public int unseen; + public int childs; @Override public boolean equals(Object obj) { @@ -39,7 +40,8 @@ public class TupleFolderEx extends EntityFolder { Objects.equals(this.accountState, other.accountState) && this.messages == other.messages && this.content == other.content && - this.unseen == other.unseen); + this.unseen == other.unseen && + this.childs == other.childs); } else return false; } diff --git a/app/src/main/res/layout/item_folder.xml b/app/src/main/res/layout/item_folder.xml index 9fb240cffe..4729e9928c 100644 --- a/app/src/main/res/layout/item_folder.xml +++ b/app/src/main/res/layout/item_folder.xml @@ -20,6 +20,20 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + \ No newline at end of file