From d24fb17cb28d08b1fb9f8d17fc3007dcd29b6265 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 18 Nov 2019 10:14:37 +0100 Subject: [PATCH] Fixed/simplified widget update --- .../java/eu/faircode/email/DaoMessage.java | 23 ++++++----- .../eu/faircode/email/ServiceSynchronize.java | 29 ++++---------- .../eu/faircode/email/TupleMessageWidget.java | 21 ---------- .../email/TupleMessageWidgetCount.java | 39 +++++++++++++++++++ .../WidgetUnifiedRemoteViewsFactory.java | 8 +--- 5 files changed, 60 insertions(+), 60 deletions(-) create mode 100644 app/src/main/java/eu/faircode/email/TupleMessageWidgetCount.java diff --git a/app/src/main/java/eu/faircode/email/DaoMessage.java b/app/src/main/java/eu/faircode/email/DaoMessage.java index 2712620115..3d0c8454f0 100644 --- a/app/src/main/java/eu/faircode/email/DaoMessage.java +++ b/app/src/main/java/eu/faircode/email/DaoMessage.java @@ -332,8 +332,16 @@ public interface DaoMessage { " ORDER BY message.received") LiveData> liveUnseenNotify(); - String widget_unified = "SELECT message.*" + - ", account.name AS accountName, folder.unified AS folderUnified" + + @Query("SELECT COUNT(*) AS total" + + ", SUM(ui_seen) AS seen" + + ", SUM(ui_flagged) AS flagged" + + " FROM message" + + " WHERE NOT ui_hide" + + " AND message.ui_snoozed IS NULL") + LiveData liveWidgetUnified(); + + @Query("SELECT message.*" + + ", account.name AS accountName" + ", SUM(1 - message.ui_seen) AS unseen" + ", COUNT(message.id) - SUM(message.ui_flagged) AS unflagged" + ", MAX(message.received) AS dummy" + @@ -341,6 +349,7 @@ public interface DaoMessage { " JOIN account ON account.id = message.account" + " JOIN folder ON folder.id = message.folder" + " WHERE account.`synchronize`" + + " AND ((:folder IS NULL AND folder.unified) OR folder.id = :folder)" + " AND NOT message.ui_hide" + " AND message.ui_snoozed IS NULL" + " AND (NOT :unseen OR NOT message.ui_seen)" + @@ -348,15 +357,9 @@ public interface DaoMessage { " GROUP BY account.id" + ", CASE WHEN message.thread IS NULL OR NOT :threading THEN message.id ELSE message.thread END" + " ORDER BY message.received DESC" + - " LIMIT 100"; - - @Query(widget_unified) + " LIMIT 100") @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) - LiveData> liveWidgetUnified(boolean threading, boolean unseen, boolean flagged); - - @Query(widget_unified) - @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH) - List getWidgetUnified(boolean threading, boolean unseen, boolean flagged); + List getWidgetUnified(Long folder, boolean threading, boolean unseen, boolean flagged); @Query("SELECT uid FROM message" + " WHERE folder = :folder" + diff --git a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java index 4c37d27b8f..62cdac8976 100644 --- a/app/src/main/java/eu/faircode/email/ServiceSynchronize.java +++ b/app/src/main/java/eu/faircode/email/ServiceSynchronize.java @@ -247,31 +247,16 @@ public class ServiceSynchronize extends ServiceBase { } }); - db.message().liveWidgetUnified(false, false, false).observe(this, new Observer>() { - private List last = null; + db.message().liveWidgetUnified().observe(this, new Observer() { + private TupleMessageWidgetCount last = null; @Override - public void onChanged(List messages) { - if (messages == null) - messages = new ArrayList<>(); - - boolean changed = false; - if (last != null && last.size() == messages.size()) { - for (int i = 0; i < last.size(); i++) { - TupleMessageWidget m1 = last.get(i); - TupleMessageWidget m2 = messages.get(i); - if (!m1.equals(m2)) { - changed = true; - break; - } - } - } else - changed = true; - - last = messages; - - if (changed) + public void onChanged(TupleMessageWidgetCount current) { + Log.i("Widget total=" + current.total + " seen=" + current.seen + " flagged=" + current.flagged); + if (last == null || !last.equals(current)) WidgetUnified.update(ServiceSynchronize.this); + + last = current; } }); } diff --git a/app/src/main/java/eu/faircode/email/TupleMessageWidget.java b/app/src/main/java/eu/faircode/email/TupleMessageWidget.java index 4fe9af61c4..72e11ded92 100644 --- a/app/src/main/java/eu/faircode/email/TupleMessageWidget.java +++ b/app/src/main/java/eu/faircode/email/TupleMessageWidget.java @@ -19,29 +19,8 @@ package eu.faircode.email; Copyright 2018-2019 by Marcel Bokhorst (M66B) */ -import java.util.Objects; - public class TupleMessageWidget extends EntityMessage { public String accountName; - public boolean folderUnified; public int unseen; public int unflagged; - - @Override - public boolean equals(Object obj) { - if (obj instanceof TupleMessageWidget) { - TupleMessageWidget other = (TupleMessageWidget) obj; - return (this.id.equals(other.id) && - this.account.equals(other.account) && - Objects.equals(this.accountName, other.accountName) && - this.folder.equals(other.folder) && - this.folderUnified == other.folderUnified && - MessageHelper.equal(this.from, other.from) && - this.received.equals(other.received) && - Objects.equals(this.subject, other.subject) && - this.unseen == other.unseen && - this.unflagged == other.unflagged); - } - return false; - } } diff --git a/app/src/main/java/eu/faircode/email/TupleMessageWidgetCount.java b/app/src/main/java/eu/faircode/email/TupleMessageWidgetCount.java new file mode 100644 index 0000000000..7e29e9f396 --- /dev/null +++ b/app/src/main/java/eu/faircode/email/TupleMessageWidgetCount.java @@ -0,0 +1,39 @@ +package eu.faircode.email; + +/* + This file is part of FairEmail. + + FairEmail is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + FairEmail is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FairEmail. If not, see . + + Copyright 2018-2019 by Marcel Bokhorst (M66B) +*/ + +import androidx.annotation.Nullable; + +public class TupleMessageWidgetCount { + public int total; + public int seen; + public int flagged; + + @Override + public boolean equals(@Nullable Object obj) { + if (obj instanceof TupleMessageWidgetCount) { + TupleMessageWidgetCount other = (TupleMessageWidgetCount) obj; + return (this.total == other.total && + this.seen == other.seen && + this.flagged == other.flagged); + } else + return false; + } +} diff --git a/app/src/main/java/eu/faircode/email/WidgetUnifiedRemoteViewsFactory.java b/app/src/main/java/eu/faircode/email/WidgetUnifiedRemoteViewsFactory.java index 604b94edd1..a1c44bf231 100644 --- a/app/src/main/java/eu/faircode/email/WidgetUnifiedRemoteViewsFactory.java +++ b/app/src/main/java/eu/faircode/email/WidgetUnifiedRemoteViewsFactory.java @@ -80,14 +80,8 @@ public class WidgetUnifiedRemoteViewsFactory implements RemoteViewsService.Remot colorWidgetForeground = ContextCompat.getColor(context, R.color.colorWidgetForeground); colorWidgetRead = ContextCompat.getColor(context, R.color.colorWidgetRead); - messages.clear(); - DB db = DB.getInstance(context); - List wmessages = db.message().getWidgetUnified(threading, unseen, flagged); - for (TupleMessageWidget wmessage : wmessages) - if ((account < 0 || wmessage.account == account) && - (folder < 0 ? wmessage.folderUnified : wmessage.folder == folder)) - messages.add(wmessage); + messages = db.message().getWidgetUnified(folder < 0 ? null : folder, threading, unseen, flagged); } @Override