From 07194fb664e9b67056b6c1103eb6f237166ab850 Mon Sep 17 00:00:00 2001 From: M66B Date: Fri, 24 Aug 2018 18:06:44 +0000 Subject: [PATCH] Show sender/subject/time in new messages notification --- .../java/eu/faircode/email/DaoAccount.java | 7 ---- .../java/eu/faircode/email/DaoMessage.java | 15 ++++++-- .../eu/faircode/email/ServiceSynchronize.java | 37 +++++++++++++++---- .../eu/faircode/email/TupleAccountStats.java | 1 - 4 files changed, 41 insertions(+), 19 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/DaoAccount.java b/app/src/main/java/eu/faircode/email/DaoAccount.java index db152ef7..1557404f 100644 --- a/app/src/main/java/eu/faircode/email/DaoAccount.java +++ b/app/src/main/java/eu/faircode/email/DaoAccount.java @@ -57,13 +57,6 @@ public interface DaoAccount { " JOIN account ON account.id = message.account" + " WHERE synchronize) AS operations" + ", (SELECT COUNT(message.id) FROM message" + - " JOIN account ON account.id = message.account" + - " JOIN folder ON folder.id = message.folder" + - " WHERE account.`synchronize`" + - " AND NOT message.ui_seen AND NOT message.ui_hide" + - " AND (account.seen_until IS NULL OR message.stored > account.seen_until)" + - " AND folder.type = '" + EntityFolder.INBOX + "') AS unseen" + - ", (SELECT COUNT(message.id) FROM message" + " JOIN folder ON folder.id = message.folder" + " JOIN operation ON operation.message = message.id AND operation.name = '" + EntityOperation.SEND + "'" + " WHERE NOT message.ui_seen" + diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 0868c94c..b7ba86c1 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -35,15 +35,14 @@ public interface DaoMessage { // all bare columns in the result set take values from the input row which also contains the minimum or maximum." // https://www.sqlite.org/lang_select.html - @Query("SELECT message.*, maccount.name AS accountName, folder.name as folderName, folder.type as folderType" + + @Query("SELECT message.*, account.name AS accountName, folder.name as folderName, folder.type as folderType" + ", COUNT(message.id) as count" + ", SUM(CASE WHEN message.ui_seen THEN 0 ELSE 1 END) as unseen" + ", (SELECT COUNT(a.id) FROM attachment a WHERE a.message = message.id) AS attachments" + ", MAX(CASE WHEN folder.type = '" + EntityFolder.INBOX + "' THEN message.id ELSE 0 END) as dummy" + " FROM message" + - " LEFT JOIN account maccount ON maccount.id = message.account" + + " JOIN account ON account.id = message.account" + " JOIN folder ON folder.id = message.folder" + - " JOIN account ON account.id = folder.account" + " WHERE account.`synchronize`" + " AND (NOT message.ui_hide OR :debug)" + " GROUP BY CASE WHEN message.thread IS NULL THEN message.id ELSE message.thread END" + @@ -118,6 +117,16 @@ public interface DaoMessage { " WHERE message.id = :id") LiveData liveMessage(long id); + @Query("SELECT message.* FROM message" + + " JOIN account ON account.id = message.account" + + " JOIN folder ON folder.id = message.folder" + + " WHERE account.`synchronize`" + + " AND folder.type = '" + EntityFolder.INBOX + "'" + + " AND NOT message.ui_seen AND NOT message.ui_hide" + + " AND (account.seen_until IS NULL OR message.stored > account.seen_until)" + + " ORDER BY message.received") + LiveData> liveUnseenUnified(); + @Query("SELECT uid FROM message WHERE folder = :folder AND received >= :received AND NOT uid IS NULL") List getUids(long folder, long received); diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 8a8f0dfa..258ab76e 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -59,6 +59,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.SocketTimeoutException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -141,24 +143,32 @@ public class ServiceSynchronize extends LifecycleService { // builder.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED); cm.registerNetworkCallback(builder.build(), serviceManager); - DB.getInstance(this).account().liveStats().observe(this, new Observer() { - private int prev_unseen = -1; + DB db = DB.getInstance(this); + db.account().liveStats().observe(this, new Observer() { @Override public void onChanged(@Nullable TupleAccountStats stats) { NotificationManager nm = getSystemService(NotificationManager.class); nm.notify(NOTIFICATION_SYNCHRONIZE, getNotificationService(stats.accounts, stats.operations, stats.unsent).build()); + } + }); + + db.message().liveUnseenUnified().observe(this, new Observer>() { + private int prev_unseen = -1; - if (stats.unseen > 0) { - if (stats.unseen > prev_unseen) { + @Override + public void onChanged(List messages) { + NotificationManager nm = getSystemService(NotificationManager.class); + if (messages.size() > 0) { + if (messages.size() > prev_unseen) { nm.cancel(NOTIFICATION_UNSEEN); - nm.notify(NOTIFICATION_UNSEEN, getNotificationUnseen(stats.unseen).build()); + nm.notify(NOTIFICATION_UNSEEN, getNotificationUnseen(messages).build()); } } else nm.cancel(NOTIFICATION_UNSEEN); - prev_unseen = stats.unseen; + prev_unseen = messages.size(); } }); } @@ -257,7 +267,7 @@ public class ServiceSynchronize extends LifecycleService { return builder; } - private Notification.Builder getNotificationUnseen(int unseen) { + private Notification.Builder getNotificationUnseen(List messages) { // Build pending intent Intent intent = new Intent(this, ActivityView.class); intent.setAction("unseen"); @@ -271,6 +281,16 @@ public class ServiceSynchronize extends LifecycleService { Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); + DateFormat df = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.SHORT, SimpleDateFormat.SHORT); + StringBuilder sb = new StringBuilder(); + for (EntityMessage message : messages) { + sb.append(MessageHelper.getFormattedAddresses(message.from, false)); + if (!TextUtils.isEmpty(message.subject)) + sb.append(": ").append(message.subject); + sb.append(" ").append(df.format(new Date(message.sent))); + sb.append("\n"); + } + // Build notification Notification.Builder builder; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) @@ -280,8 +300,9 @@ public class ServiceSynchronize extends LifecycleService { builder .setSmallIcon(R.drawable.baseline_mail_24) - .setContentTitle(getResources().getQuantityString(R.plurals.title_notification_unseen, unseen, unseen)) + .setContentTitle(getResources().getQuantityString(R.plurals.title_notification_unseen, messages.size(), messages.size())) .setContentIntent(pi) + .setStyle(new Notification.BigTextStyle().bigText(sb.toString())) .setSound(uri) .setShowWhen(false) .setPriority(Notification.PRIORITY_DEFAULT) diff --git a/app/src/main/java/eu/faircode/email/TupleAccountStats.java b/app/src/main/java/eu/faircode/email/TupleAccountStats.java index d114daa5..4864d2d6 100644 --- a/app/src/main/java/eu/faircode/email/TupleAccountStats.java +++ b/app/src/main/java/eu/faircode/email/TupleAccountStats.java @@ -22,6 +22,5 @@ package eu.faircode.email; public class TupleAccountStats { public Integer accounts; public Integer operations; - public Integer unseen; public Integer unsent; }