diff --git a/app/src/main/java/eu/faircode/email/AdapterMessage.java b/app/src/main/java/eu/faircode/email/AdapterMessage.java index 1e384b4bc0..49e6b6d34e 100644 --- a/app/src/main/java/eu/faircode/email/AdapterMessage.java +++ b/app/src/main/java/eu/faircode/email/AdapterMessage.java @@ -8585,6 +8585,40 @@ public class AdapterMessage extends RecyclerView.Adapter list) { for (int i = 0; i < list.size(); i++) { TupleMessageEx message = list.get(i); @@ -8595,6 +8629,10 @@ public class AdapterMessage extends RecyclerView.Adapter 1 && + message.senders != null && message.senders.length == message.group_received.length && + message.recipients != null && message.recipients.length == message.group_received.length) + quickSort(message, 0, message.group_received.length - 1); } } diff --git a/app/src/main/java/eu/faircode/email/DB.java b/app/src/main/java/eu/faircode/email/DB.java index c5e7a0cb45..9926405b9f 100644 --- a/app/src/main/java/eu/faircode/email/DB.java +++ b/app/src/main/java/eu/faircode/email/DB.java @@ -3030,6 +3030,23 @@ public abstract class DB extends RoomDatabase { } public static class Converters { + @TypeConverter + public static long[] toLongArray(String value) { + if (TextUtils.isEmpty(value)) + return new long[0]; + else { + String[] received = TextUtils.split(value, ","); + long[] result = new long[received.length]; + for (int i = 0; i < result.length; i++) + try { + result[i] = Long.parseLong(received[i]); + } catch (NumberFormatException ex) { + Log.e(ex); + } + return result; + } + } + @TypeConverter public static String[] toStringArray(String value) { if (value == null) diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 22c85a6456..8a2e813ff8 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -53,6 +53,7 @@ public interface DaoMessage { ", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" + ", '[' || group_concat(message.`from`, ',') || ']' AS senders" + ", '[' || group_concat(message.`to`, ',') || ']' AS recipients" + + ", group_concat(message.received, ',') AS group_received" + ", COUNT(message.id) AS count" + ", SUM(1 - message.ui_seen) AS unseen" + ", SUM(1 - message.ui_flagged) AS unflagged" + @@ -77,7 +78,6 @@ public interface DaoMessage { " THEN message.received ELSE 0 END) AS dummy" + " FROM message" + - // group_concat " JOIN message AS mm ON mm.thread = message.thread" + " AND (NOT :found OR mm.ui_found) AND (NOT mm.ui_hide OR :debug)" + " JOIN folder AS ff ON ff.id = mm.folder" + @@ -114,8 +114,7 @@ public interface DaoMessage { " WHEN 'snoozed' = :sort THEN SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) = 0" + " ELSE 0" + " END" + - ", CASE WHEN :ascending THEN message.received ELSE -message.received END" + - ", mm.received") + ", CASE WHEN :ascending THEN message.received ELSE -message.received END") DataSource.Factory pagedUnified( String type, boolean threading, boolean group_category, @@ -133,6 +132,7 @@ public interface DaoMessage { ", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" + ", '[' || group_concat(message.`from`, ',') || ']' AS senders" + ", '[' || group_concat(message.`to`, ',') || ']' AS recipients" + + ", group_concat(message.received, ',') AS group_received" + ", COUNT(message.id) AS count" + ", SUM(1 - message.ui_seen) AS unseen" + ", SUM(1 - message.ui_flagged) AS unflagged" + @@ -156,7 +156,6 @@ public interface DaoMessage { " THEN message.received ELSE 0 END) AS dummy" + " FROM message" + - // group_concat " JOIN message AS mm ON mm.thread = message.thread" + " AND (NOT :found OR mm.ui_found) AND (NOT mm.ui_hide OR :debug)" + " AND message.folder = :folder" + @@ -189,8 +188,7 @@ public interface DaoMessage { " WHEN 'snoozed' = :sort THEN SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) = 0" + " ELSE 0" + " END" + - ", CASE WHEN :ascending THEN message.received ELSE -message.received END" + - ", mm.received") + ", CASE WHEN :ascending THEN message.received ELSE -message.received END") DataSource.Factory pagedFolder( long folder, boolean threading, String sort, boolean ascending, @@ -206,6 +204,7 @@ public interface DaoMessage { ", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" + ", message.`from` AS senders" + ", message.`to` AS recipients" + + ", message.received AS group_received" + ", 1 AS count" + ", CASE WHEN message.ui_seen THEN 0 ELSE 1 END AS unseen" + ", CASE WHEN message.ui_flagged THEN 0 ELSE 1 END AS unflagged" + @@ -512,6 +511,7 @@ public interface DaoMessage { ", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" + ", message.`from` AS senders" + ", message.`to` AS recipients" + + ", message.received AS group_received" + ", 1 AS count" + ", CASE WHEN message.ui_seen THEN 0 ELSE 1 END AS unseen" + ", CASE WHEN message.ui_flagged THEN 0 ELSE 1 END AS unflagged" + @@ -543,6 +543,7 @@ public interface DaoMessage { ", IFNULL(identity.display, identity.name) AS identityName, identity.email AS identityEmail, identity.color AS identityColor, identity.synchronize AS identitySynchronize" + ", message.`from` AS senders" + ", message.`to` AS recipients" + + ", message.received AS group_received" + ", 1 AS count" + ", 1 AS unseen" + ", 0 AS unflagged" + diff --git a/app/src/main/java/eu/faircode/email/TupleMessageEx.java b/app/src/main/java/eu/faircode/email/TupleMessageEx.java index 5f033de044..ee5965efbf 100644 --- a/app/src/main/java/eu/faircode/email/TupleMessageEx.java +++ b/app/src/main/java/eu/faircode/email/TupleMessageEx.java @@ -55,6 +55,7 @@ public class TupleMessageEx extends EntityMessage { public Boolean identitySynchronize; public Address[] senders; public Address[] recipients; + public long[] group_received; public int count; public int unseen; public int unflagged;