Made UI hide boolean again

This commit is contained in:
M66B 2019-09-27 18:25:55 +02:00
parent 51780f3d15
commit a1d49dba54
14 changed files with 1921 additions and 49 deletions

File diff suppressed because it is too large Load Diff

View File

@ -813,7 +813,7 @@ public class AdapterMessage extends RecyclerView.Adapter<AdapterMessage.ViewHold
if (debug) {
String text = "error=" + error +
"\nuid=" + message.uid + " id=" + message.id + " " + DTF.format(new Date(message.received)) +
"\n" + (message.ui_hide == 0 ? "" : "HIDDEN ") +
"\n" + (message.ui_hide ? "HIDDEN " : "") +
"seen=" + message.seen + "/" + message.ui_seen +
" unseen=" + message.unseen +
" ignored=" + message.ui_ignored +

View File

@ -123,7 +123,6 @@ class Core {
private static final int SYNC_BATCH_SIZE = 20;
private static final int DOWNLOAD_BATCH_SIZE = 20;
private static final long YIELD_DURATION = 200L; // milliseconds
private static final long MIN_HIDE = 60 * 1000L; // milliseconds
static void processOperations(
Context context,
@ -353,7 +352,7 @@ class Core {
// Delete temporary copy in target folder
if (newid != null) {
db.message().deleteMessage(newid);
db.message().setMessageUiHide(message.id, 0L);
db.message().setMessageUiHide(message.id, false);
}
}
@ -1306,7 +1305,7 @@ class Core {
message.ui_seen = false;
message.ui_answered = false;
message.ui_flagged = false;
message.ui_hide = 0L;
message.ui_hide = false;
message.ui_found = false;
message.ui_ignored = false;
message.ui_browsed = false;
@ -1691,7 +1690,7 @@ class Core {
Log.i(folder.name + " sent orphans=" + orphans.size());
for (EntityMessage orphan : orphans) {
Log.i(folder.name + " adding orphan id=" + orphan.id);
if (orphan.content && orphan.ui_hide == 0L)
if (orphan.content && !orphan.ui_hide)
EntityOperation.queue(context, orphan, EntityOperation.ADD);
}
} else {
@ -1921,7 +1920,7 @@ class Core {
message.ui_seen = seen;
message.ui_answered = answered;
message.ui_flagged = flagged;
message.ui_hide = 0L;
message.ui_hide = false;
message.ui_found = false;
message.ui_ignored = seen;
message.ui_browsed = browsed;
@ -2067,10 +2066,10 @@ class Core {
" keywords=" + TextUtils.join(" ", keywords));
}
if (message.ui_hide != 0 && message.ui_hide + MIN_HIDE < new Date().getTime() &&
if (message.ui_hide &&
db.operation().getOperationCount(folder.id, message.id) == 0) {
update = true;
message.ui_hide = 0L;
message.ui_hide = false;
Log.i(folder.name + " updated id=" + message.id + " uid=" + message.uid + " unhide");
}
@ -2405,7 +2404,7 @@ class Core {
}
}
if (!(message.ui_seen || message.ui_ignored || message.ui_hide != 0)) {
if (!(message.ui_seen || message.ui_ignored || message.ui_hide)) {
// This assumes the messages are properly ordered
if (groupMessages.get(group).size() < MAX_NOTIFICATION_COUNT)
groupMessages.get(group).add(message);

View File

@ -58,7 +58,7 @@ import io.requery.android.database.sqlite.RequerySQLiteOpenHelperFactory;
// https://developer.android.com/topic/libraries/architecture/room.html
@Database(
version = 103,
version = 104,
entities = {
EntityIdentity.class,
EntityAccount.class,
@ -1027,6 +1027,13 @@ public abstract class DB extends RoomDatabase {
db.execSQL("UPDATE `account` SET browse = 1 WHERE pop = 1");
}
})
.addMigrations(new Migration(103, 104) {
@Override
public void migrate(@NonNull SupportSQLiteDatabase db) {
Log.i("DB migration from version " + startVersion + " to " + endVersion);
db.execSQL("UPDATE `message` SET ui_hide = 1 WHERE ui_hide <> 0");
}
})
.build();
}

View File

@ -53,7 +53,7 @@ public interface DaoAccount {
" AND folder.type <> '" + EntityFolder.DRAFTS + "'" +
" AND folder.type <> '" + EntityFolder.OUTBOX + "'" +
" AND NOT ui_seen" +
" AND ui_hide = 0) AS unseen" +
" AND NOT ui_hide) AS unseen" +
", (SELECT COUNT(identity.id)" +
" FROM identity" +
" WHERE identity.account = account.id" +

View File

@ -40,7 +40,7 @@ public interface DaoFolder {
", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" +
", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" +
", COUNT(DISTINCT CASE WHEN message.content = 1 AND NOT message.ui_hide THEN message.id ELSE NULL END) AS content" +
", COUNT(DISTINCT CASE WHEN message.ui_seen = 0 AND NOT message.ui_hide THEN message.id ELSE NULL END) AS unseen" +
", COUNT(DISTINCT CASE WHEN NOT message.ui_seen AND NOT message.ui_hide THEN message.id ELSE NULL END) AS unseen" +
", COUNT(DISTINCT CASE WHEN operation.state = 'executing' THEN operation.id ELSE NULL END) AS executing" +
" FROM folder" +
" LEFT JOIN account ON account.id = folder.account" +
@ -77,7 +77,7 @@ public interface DaoFolder {
", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" +
", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" +
", COUNT(DISTINCT CASE WHEN message.content = 1 AND NOT message.ui_hide THEN message.id ELSE NULL END) AS content" +
", COUNT(DISTINCT CASE WHEN message.ui_seen = 0 AND NOT message.ui_hide THEN message.id ELSE NULL END) AS unseen" +
", COUNT(DISTINCT CASE WHEN NOT message.ui_seen AND NOT message.ui_hide THEN message.id ELSE NULL END) AS unseen" +
", COUNT(DISTINCT CASE WHEN operation.state = 'executing' THEN operation.id ELSE NULL END) AS executing" +
" FROM folder" +
" LEFT JOIN account ON account.id = folder.account" +
@ -97,7 +97,7 @@ public interface DaoFolder {
", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" +
", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" +
", COUNT(DISTINCT CASE WHEN message.content = 1 AND NOT message.ui_hide THEN message.id ELSE NULL END) AS content" +
", COUNT(DISTINCT CASE WHEN message.ui_seen = 0 AND NOT message.ui_hide THEN message.id ELSE NULL END) AS unseen" +
", COUNT(DISTINCT CASE WHEN NOT message.ui_seen AND NOT message.ui_hide THEN message.id ELSE NULL END) AS unseen" +
", COUNT(DISTINCT CASE WHEN operation.state = 'executing' THEN operation.id ELSE NULL END) AS executing" +
" FROM folder" +
" JOIN account ON account.id = folder.account" +
@ -111,13 +111,13 @@ public interface DaoFolder {
@Query("SELECT folder.*" +
", account.`order` AS accountOrder, account.name AS accountName, account.color AS accountColor" +
", SUM(CASE WHEN message.ui_seen = 0 THEN 1 ELSE 0 END) AS unseen" +
", SUM(CASE WHEN NOT message.ui_seen THEN 1 ELSE 0 END) AS unseen" +
", SUM(CASE WHEN message.ui_snoozed IS NULL THEN 0 ELSE 1 END) AS snoozed" +
", (SELECT COUNT(operation.id) FROM operation WHERE operation.folder = folder.id) AS operations" +
", (SELECT COUNT(operation.id) FROM operation WHERE operation.folder = folder.id AND operation.state = 'executing') AS executing" +
" FROM folder" +
" LEFT JOIN account ON account.id = folder.account" +
" LEFT JOIN message ON message.folder = folder.id AND message.ui_hide = 0" +
" LEFT JOIN message ON message.folder = folder.id AND NOT message.ui_hide" +
" WHERE account.id IS NULL" +
" OR (account.`synchronize` AND folder.navigation)" +
" GROUP BY folder.id")
@ -134,7 +134,7 @@ public interface DaoFolder {
", COUNT(DISTINCT CASE WHEN rule.enabled THEN rule.id ELSE NULL END) rules" +
", COUNT(DISTINCT CASE WHEN message.ui_hide THEN NULL ELSE message.id END) AS messages" +
", COUNT(DISTINCT CASE WHEN message.content = 1 AND NOT message.ui_hide THEN message.id ELSE NULL END) AS content" +
", COUNT(DISTINCT CASE WHEN message.ui_seen = 0 AND NOT message.ui_hide THEN message.id ELSE NULL END) AS unseen" +
", COUNT(DISTINCT CASE WHEN NOT message.ui_seen AND NOT message.ui_hide THEN message.id ELSE NULL END) AS unseen" +
", COUNT(DISTINCT CASE WHEN operation.state = 'executing' THEN operation.id ELSE NULL END) AS executing" +
" FROM folder" +
" LEFT JOIN account ON account.id = folder.account" +
@ -154,7 +154,7 @@ public interface DaoFolder {
List<EntityFolder> getSystemFolders(long account);
@Query("SELECT folder.type," +
" SUM(CASE WHEN NOT message.ui_seen AND message.ui_hide = 0 THEN 1 ELSE 0 END) AS unseen" +
" SUM(CASE WHEN NOT message.ui_seen AND NOT message.ui_hide THEN 1 ELSE 0 END) AS unseen" +
" FROM folder" +
" JOIN account ON account.id = folder.account" +
" LEFT JOIN message ON message.folder = folder.id" +

View File

@ -62,7 +62,7 @@ public interface DaoMessage {
" LEFT JOIN identity ON identity.id = message.identity" +
" JOIN folder ON folder.id = message.folder" +
" WHERE account.`synchronize`" +
" AND (message.ui_hide = 0 OR :debug)" +
" AND (NOT message.ui_hide OR :debug)" +
" AND (NOT :found OR ui_found = :found)" +
" GROUP BY account.id, CASE WHEN message.thread IS NULL OR NOT :threading THEN message.id ELSE message.thread END" +
" HAVING (:found OR" +
@ -107,7 +107,7 @@ public interface DaoMessage {
" JOIN folder ON folder.id = message.folder" +
" JOIN folder AS f ON f.id = :folder" +
" WHERE (message.account = f.account OR " + is_outbox + ")" +
" AND (message.ui_hide = 0 OR :debug)" +
" AND (NOT message.ui_hide OR :debug)" +
" AND (NOT :found OR ui_found = :found)" +
" GROUP BY CASE WHEN message.thread IS NULL OR NOT :threading THEN message.id ELSE message.thread END" +
" HAVING SUM(CASE WHEN folder.id = :folder THEN 1 ELSE 0 END) > 0" +
@ -149,7 +149,7 @@ public interface DaoMessage {
" WHERE message.account = :account" +
" AND message.thread = :thread" +
" AND (:id IS NULL OR message.id = :id)" +
" AND (message.ui_hide = 0 OR :debug)" +
" AND (NOT message.ui_hide OR :debug)" +
" ORDER BY CASE WHEN :ascending THEN message.received ELSE -message.received END" +
", CASE WHEN folder.type = '" + EntityFolder.ARCHIVE + "' THEN 1 ELSE 0 END")
DataSource.Factory<Integer, TupleMessageEx> pagedThread(long account, String thread, Long id, boolean ascending, boolean debug);
@ -162,7 +162,7 @@ public interface DaoMessage {
" WHERE message.account = :account" +
" AND message.thread = :thread" +
" AND (:id IS NULL OR message.id = :id)" +
" AND message.ui_hide = 0" +
" AND NOT message.ui_hide" +
" GROUP BY account.id")
LiveData<TupleThreadStats> liveThreadStats(long account, String thread, Long id);
@ -170,13 +170,13 @@ public interface DaoMessage {
" JOIN message ON message.folder = folder.id" +
" WHERE ((:folder IS NULL AND :type IS NULL AND folder.unified)" +
" OR folder.type = :type OR folder.id = :folder)" +
" AND ui_hide <> 0")
" AND ui_hide")
LiveData<List<Long>> liveHiddenFolder(Long folder, String type);
@Query("SELECT id FROM message" +
" WHERE account = :account" +
" AND thread = :thread" +
" AND ui_hide <> 0")
" AND ui_hide")
LiveData<List<Long>> liveHiddenThread(long account, String thread);
@Query("SELECT *" +
@ -193,14 +193,14 @@ public interface DaoMessage {
@Query("SELECT id" +
" FROM message" +
" WHERE folder = :folder" +
" AND ui_hide = 0" +
" AND NOT ui_hide" +
" ORDER BY message.received DESC")
List<Long> getMessageByFolder(long folder);
@Query("SELECT id" +
" FROM message" +
" WHERE (:folder IS NULL OR folder = :folder)" +
" AND ui_hide = 0" +
" AND NOT ui_hide" +
" ORDER BY message.received DESC")
List<Long> getMessageIdsByFolder(Long folder);
@ -217,7 +217,7 @@ public interface DaoMessage {
" AND (:id IS NULL OR message.id = :id)" +
" AND (:folder IS NULL OR message.folder = :folder)" +
" AND NOT uid IS NULL" +
" AND ui_hide = 0")
" AND NOT ui_hide")
List<EntityMessage> getMessagesByThread(long account, String thread, Long id, Long folder);
@Query("SELECT * FROM message" +
@ -254,7 +254,7 @@ public interface DaoMessage {
" JOIN folder ON folder.id = message.folder" +
" WHERE account.`synchronize`" +
" AND folder.notify" +
" AND NOT (message.ui_seen OR message.ui_hide <> 0)";
" AND NOT (message.ui_seen OR message.ui_hide)";
@Query(widget)
LiveData<TupleMessageStats> liveUnseenWidget();
@ -280,7 +280,7 @@ public interface DaoMessage {
" WHERE account.`synchronize`" +
" AND folder.notify" +
" AND (account.created IS NULL OR message.received > account.created)" +
" AND (notifying <> 0 OR NOT (message.ui_seen OR message.ui_hide <> 0))" +
" AND (notifying <> 0 OR NOT (message.ui_seen OR message.ui_hide))" +
" ORDER BY message.received")
LiveData<List<TupleMessageEx>> liveUnseenNotify();
@ -293,7 +293,7 @@ public interface DaoMessage {
" JOIN folder ON folder.id = message.folder" +
" WHERE account.`synchronize`" +
" AND folder.unified" +
" AND message.ui_hide = 0" +
" AND NOT message.ui_hide" +
" AND message.ui_snoozed IS NULL" +
" AND (NOT :unseen OR NOT message.ui_seen)" +
" AND (NOT :flagged OR message.ui_flagged)" +
@ -387,7 +387,7 @@ public interface DaoMessage {
int setMessageUiAnswered(long id, boolean ui_answered);
@Query("UPDATE message SET ui_hide = :ui_hide WHERE id = :id")
int setMessageUiHide(long id, long ui_hide);
int setMessageUiHide(long id, Boolean ui_hide);
@Query("UPDATE message SET ui_ignored = :ui_ignored WHERE id = :id")
int setMessageUiIgnored(long id, boolean ui_ignored);

View File

@ -143,7 +143,7 @@ public class EntityMessage implements Serializable {
@NonNull
public Boolean ui_flagged = false;
@NonNull
public Long ui_hide = 0L;
public Boolean ui_hide = false;
@NonNull
public Boolean ui_found = false;
@NonNull

View File

@ -146,7 +146,7 @@ public class EntityOperation {
if (!EntityFolder.ARCHIVE.equals(source.type) ||
EntityFolder.TRASH.equals(target.type) || EntityFolder.JUNK.equals(target.type))
db.message().setMessageUiHide(message.id, new Date().getTime());
db.message().setMessageUiHide(message.id, true);
if (message.ui_snoozed != null &&
(EntityFolder.ARCHIVE.equals(target.type) || EntityFolder.TRASH.equals(target.type))) {
@ -168,7 +168,7 @@ public class EntityOperation {
int notifying = message.notifying;
boolean seen = message.seen;
boolean ui_seen = message.ui_seen;
Long ui_hide = message.ui_hide;
Boolean ui_hide = message.ui_hide;
boolean ui_browsed = message.ui_browsed;
String error = message.error;
@ -182,7 +182,7 @@ public class EntityOperation {
message.seen = true;
message.ui_seen = true;
}
message.ui_hide = 0L;
message.ui_hide = false;
message.ui_browsed = false;
message.error = null;
message.id = db.message().insertMessage(message);
@ -222,7 +222,7 @@ public class EntityOperation {
name = RAW;
} else if (DELETE.equals(name))
db.message().setMessageUiHide(message.id, Long.MAX_VALUE);
db.message().setMessageUiHide(message.id, true);
} catch (JSONException ex) {
Log.e(ex);

View File

@ -2158,7 +2158,7 @@ public class FragmentCompose extends FragmentBase {
throw new IllegalStateException(getString(R.string.title_no_identities));
data.draft = db.message().getMessage(id);
if (data.draft == null || data.draft.ui_hide != 0) {
if (data.draft == null || data.draft.ui_hide) {
// New draft
if ("edit".equals(action))
throw new MessageRemovedException("Draft for edit was deleted hide=" + (data.draft != null));
@ -2615,7 +2615,7 @@ public class FragmentCompose extends FragmentBase {
@Override
public void onChanged(EntityMessage draft) {
// Draft was deleted
if (draft == null || draft.ui_hide != 0)
if (draft == null || draft.ui_hide)
finish();
else {
Log.i("Draft content=" + draft.content);
@ -2708,7 +2708,7 @@ public class FragmentCompose extends FragmentBase {
EntityIdentity identity = db.identity().getIdentity(iid);
// Draft deleted by server
if (draft == null || draft.ui_hide != 0)
if (draft == null || draft.ui_hide)
throw new MessageRemovedException("Draft for action was deleted hide=" + (draft != null));
Log.i("Load action id=" + draft.id + " action=" + getActionName(action));
@ -2737,7 +2737,7 @@ public class FragmentCompose extends FragmentBase {
Long uid = draft.uid;
String msgid = draft.msgid;
boolean content = draft.content;
long ui_hide = draft.ui_hide;
Boolean ui_hide = draft.ui_hide;
// To prevent violating constraints
draft.uid = null;
@ -2749,7 +2749,7 @@ public class FragmentCompose extends FragmentBase {
draft.uid = uid;
draft.msgid = msgid;
draft.content = false;
draft.ui_hide = new Date().getTime();
draft.ui_hide = true;
draft.id = db.message().insertMessage(draft);
EntityOperation.queue(context, draft, EntityOperation.DELETE);
@ -3014,7 +3014,7 @@ public class FragmentCompose extends FragmentBase {
draft.id = null;
draft.folder = db.folder().getOutbox().id;
draft.uid = null;
draft.ui_hide = 0L;
draft.ui_hide = false;
draft.id = db.message().insertMessage(draft);
Helper.writeText(draft.getFile(context), body);
if (refDraftFile.exists()) {

View File

@ -1649,7 +1649,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
message.account, message.thread, threading && thread ? null : id, message.folder);
for (EntityMessage threaded : messages) {
result.add(new MessageTarget(threaded, account, target));
db.message().setMessageUiHide(threaded.id, new Date().getTime());
db.message().setMessageUiHide(threaded.id, true);
// Prevent new message notification on undo
db.message().setMessageUiIgnored(threaded.id, true);
}
@ -3434,7 +3434,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
ArrayList<MessageTarget> result = args.getParcelableArrayList("result");
for (MessageTarget target : result) {
Log.i("Move undo id=" + target.id);
db.message().setMessageUiHide(target.id, 0L);
db.message().setMessageUiHide(target.id, false);
}
db.setTransactionSuccessful();
@ -3478,7 +3478,7 @@ public class FragmentMessages extends FragmentBase implements SharedPreferences.
for (MessageTarget target : result) {
EntityMessage message = db.message().getMessage(target.id);
if (message == null || message.ui_hide == 0)
if (message == null || !message.ui_hide)
continue;
Log.i("Move id=" + id + " target=" + target.folder.name);

View File

@ -144,7 +144,7 @@ public class FragmentOperations extends FragmentBase {
for (EntityOperation op : ops) {
Log.w("Deleting operation=" + op.id + " error=" + op.error);
if (op.message != null)
db.message().setMessageUiHide(op.message, 0L);
db.message().setMessageUiHide(op.message, false);
db.operation().deleteOperation(op.id);
}
return null;

View File

@ -374,7 +374,7 @@ public class ServiceSend extends ServiceBase {
message.received = new Date().getTime();
message.seen = true;
message.ui_seen = true;
message.ui_hide = Long.MAX_VALUE;
message.ui_hide = true;
message.error = null;
message.id = db.message().insertMessage(message);
@ -420,7 +420,7 @@ public class ServiceSend extends ServiceBase {
parts.getWarnings(message.warning));
db.message().setMessageSent(sid, time);
db.message().setMessageUiHide(sid, 0L);
db.message().setMessageUiHide(sid, false);
// Check for sent orphans
EntityMessage orphan = db.message().getMessage(sid);

View File

@ -48,7 +48,7 @@ public class ServiceTileUnseen extends TileService {
int unseen = 0;
for (TupleMessageEx message : messages)
if (!message.ui_seen && !message.ui_ignored && message.ui_hide == 0)
if (!message.ui_seen && !message.ui_ignored && !message.ui_hide)
unseen++;
Log.i("Update tile unseen=" + unseen);