From df8d10b254d25f3dd7e88148c09214ba2f56197b Mon Sep 17 00:00:00 2001 From: M66B Date: Sun, 5 May 2019 13:58:15 +0200 Subject: [PATCH] Auto scroll up conversations --- .../java/eu/faircode/email/DaoMessage.java | 12 ++++++++++++ .../eu/faircode/email/FragmentMessages.java | 18 +++++++++++++++--- .../eu/faircode/email/TupleThreadStats.java | 7 +++++++ 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 app/src/main/java/eu/faircode/email/TupleThreadStats.java diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index f7a5f16939..54960fb691 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -151,6 +151,18 @@ public interface DaoMessage { ", CASE WHEN folder.type = '" + EntityFolder.ARCHIVE + "' THEN 1 ELSE 0 END") DataSource.Factory pagedThread(long account, String thread, Long id, boolean debug); + @Query("SELECT account.name AS accountName" + + ", COUNT(message.id) AS count" + + ", SUM(message.ui_seen) AS seen" + + " FROM message" + + " JOIN account ON account.id = message.account" + + " WHERE message.account = :account" + + " AND message.thread = :thread" + + " AND (:id IS NULL OR message.id = :id)" + + " AND NOT message.ui_hide" + + " GROUP BY account.id") + LiveData liveThreadStats(long account, String thread, Long id); + @Query("SELECT message.id FROM folder" + " JOIN message ON message.folder = folder.id" + " WHERE CASE WHEN :folder IS NULL THEN folder.unified ELSE folder.id = :folder END" + diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 2d7c0ac98f..d7d2160c6a 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -1772,10 +1772,22 @@ public class FragmentMessages extends FragmentBase { break; case THREAD: - db.account().liveAccount(account).observe(getViewLifecycleOwner(), new Observer() { + db.message().liveThreadStats(account, thread, null).observe(getViewLifecycleOwner(), new Observer() { + Integer lastUnseen = null; + @Override - public void onChanged(EntityAccount account) { - setSubtitle(getString(R.string.title_folder_thread, account == null ? "" : account.name)); + public void onChanged(TupleThreadStats stats) { + setSubtitle(getString(R.string.title_folder_thread, + stats == null || stats.accountName == null ? "" : stats.accountName)); + + if (stats != null && stats.count != null && stats.unseen != null) { + int unseen = stats.count - stats.unseen; + if (lastUnseen == null || lastUnseen != unseen) { + if (autoscroll && lastUnseen != null && lastUnseen < unseen) + loadMessages(true); + lastUnseen = unseen; + } + } } }); db.message().liveHidden(account, thread).observe(getViewLifecycleOwner(), new Observer>() { diff --git a/app/src/main/java/eu/faircode/email/TupleThreadStats.java b/app/src/main/java/eu/faircode/email/TupleThreadStats.java new file mode 100644 index 0000000000..442325a0ea --- /dev/null +++ b/app/src/main/java/eu/faircode/email/TupleThreadStats.java @@ -0,0 +1,7 @@ +package eu.faircode.email; + +public class TupleThreadStats { + String accountName; + Integer count; + Integer unseen; +}