diff options
Diffstat (limited to 'app/src/main/java/it/niedermann/nextcloud/deck/database')
4 files changed, 57 insertions, 14 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java index 5d3b28950..a95ab7a8c 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/database/DataBaseAdapter.java @@ -60,6 +60,7 @@ import it.niedermann.nextcloud.deck.model.Stack; import it.niedermann.nextcloud.deck.model.User; import it.niedermann.nextcloud.deck.model.appwidgets.StackWidgetModel; import it.niedermann.nextcloud.deck.model.enums.DBStatus; +import it.niedermann.nextcloud.deck.model.enums.EDoneType; import it.niedermann.nextcloud.deck.model.enums.EDueType; import it.niedermann.nextcloud.deck.model.full.FullBoard; import it.niedermann.nextcloud.deck.model.full.FullCard; @@ -259,9 +260,9 @@ public class DataBaseAdapter { public LiveData<List<FullCard>> getFullCardsForStack(long accountId, long localStackId, @Nullable FilterInformation filter) { return new ReactiveLiveData<>( - filter == null - ? db.getCardDao().getFullCardsForStack(accountId, localStackId) - : db.getCardDao().getFilteredFullCardsForStack(getQueryForFilter(filter, accountId, localStackId))) + FilterInformation.hasActiveFilter(filter) + ? db.getCardDao().getFilteredFullCardsForStack(getQueryForFilter(filter, accountId, localStackId)) + : db.getCardDao().getFullCardsForStack(accountId, localStackId)) .tap(this::filterRelationsForCard, executor) .distinctUntilChanged(); @@ -284,9 +285,9 @@ public class DataBaseAdapter { @WorkerThread public List<FullCard> getFullCardsForStackDirectly(long accountId, long localStackId, @Nullable FilterInformation filter) { - return filter == null - ? db.getCardDao().getFullCardsForStackDirectly(accountId, localStackId) - : db.getCardDao().getFilteredFullCardsForStackDirectly(getQueryForFilter(filter, accountId, localStackId)); + return FilterInformation.hasActiveFilter(filter) + ? db.getCardDao().getFilteredFullCardsForStackDirectly(getQueryForFilter(filter, accountId, localStackId)) + : db.getCardDao().getFullCardsForStackDirectly(accountId, localStackId); } @AnyThread @@ -351,24 +352,38 @@ public class DataBaseAdapter { if (filter.getDueType() != EDueType.NO_FILTER) { switch (filter.getDueType()) { case NO_DUE: - query.append("and c.dueDate is null"); + query.append("and c.dueDate is null "); break; case OVERDUE: - query.append("and datetime(c.duedate/1000, 'unixepoch', 'localtime') <= datetime('now', 'localtime')"); + query.append("and datetime(c.duedate/1000, 'unixepoch', 'localtime') <= datetime('now', 'localtime') "); break; case TODAY: - query.append("and datetime(c.duedate/1000, 'unixepoch', 'localtime') between datetime('now', 'localtime') and datetime('now', '+24 hour', 'localtime')"); + query.append("and datetime(c.duedate/1000, 'unixepoch', 'localtime') between datetime('now', 'localtime') and datetime('now', '+24 hour', 'localtime') "); break; case WEEK: - query.append("and datetime(c.duedate/1000, 'unixepoch', 'localtime') between datetime('now', 'localtime') and datetime('now', '+7 day', 'localtime')"); + query.append("and datetime(c.duedate/1000, 'unixepoch', 'localtime') between datetime('now', 'localtime') and datetime('now', '+7 day', 'localtime') "); break; case MONTH: - query.append("and datetime(c.duedate/1000, 'unixepoch', 'localtime') between datetime('now', 'localtime') and datetime('now', '+30 day', 'localtime')"); + query.append("and datetime(c.duedate/1000, 'unixepoch', 'localtime') between datetime('now', 'localtime') and datetime('now', '+30 day', 'localtime') "); break; default: - throw new IllegalArgumentException("You need to add your new EDueType value\"" + filter.getDueType() + "\" here!"); + throw new IllegalArgumentException("You need to add your new " + EDueType.class.getSimpleName() + " value\"" + filter.getDueType() + "\" here!"); } } + + if (filter.getDoneType() != EDoneType.NO_FILTER) { + switch (filter.getDoneType()) { + case DONE: + query.append("and (c.done is not null and c.done != 0) "); + break; + case UNDONE: + query.append("and (c.done is null or c.done = 0) "); + break; + default: + throw new IllegalArgumentException("You need to add your new " + EDoneType.class.getSimpleName() + " value\"" + filter.getDueType() + "\" here!"); + } + } + if (!TextUtils.isEmpty(filter.getFilterText())) { query.append(" and (c.description like ? or c.title like ?) "); String filterText = "%" + filter.getFilterText() + "%"; diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/database/DeckDatabase.java b/app/src/main/java/it/niedermann/nextcloud/deck/database/DeckDatabase.java index b71abece1..a41379e8d 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/database/DeckDatabase.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/database/DeckDatabase.java @@ -65,6 +65,7 @@ import it.niedermann.nextcloud.deck.database.migration.Migration_28_29; import it.niedermann.nextcloud.deck.database.migration.Migration_29_30; import it.niedermann.nextcloud.deck.database.migration.Migration_30_31; import it.niedermann.nextcloud.deck.database.migration.Migration_31_32; +import it.niedermann.nextcloud.deck.database.migration.Migration_32_33; import it.niedermann.nextcloud.deck.database.migration.Migration_8_9; import it.niedermann.nextcloud.deck.database.migration.Migration_9_10; import it.niedermann.nextcloud.deck.model.AccessControl; @@ -135,7 +136,7 @@ import it.niedermann.nextcloud.deck.remote.api.LastSyncUtil; FilterWidgetSort.class, }, exportSchema = false, - version = 32 + version = 33 ) @TypeConverters({DateTypeConverter.class, EnumConverter.class}) public abstract class DeckDatabase extends RoomDatabase { @@ -188,6 +189,7 @@ public abstract class DeckDatabase extends RoomDatabase { .addMigrations(new Migration_29_30(context)) .addMigrations(new Migration_30_31()) .addMigrations(new Migration_31_32(context)) + .addMigrations(new Migration_32_33()) .fallbackToDestructiveMigration() .addCallback(ON_CREATE_CALLBACK) .build(); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/database/dao/CardDao.java b/app/src/main/java/it/niedermann/nextcloud/deck/database/dao/CardDao.java index 5d25f943f..0f067381e 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/database/dao/CardDao.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/database/dao/CardDao.java @@ -23,7 +23,8 @@ public interface CardDao extends GenericDao<Card> { "and (c.deletedAt is null or c.deletedAt = 0) " + "and (s.deletedAt is null or s.deletedAt = 0) " + "and (b.deletedAt is null or b.deletedAt = 0) " + - // FUll Logic: (hasDueDate AND isIn_PRIVATE_Board) OR (isInSharedBoard AND (assignedToMe OR (hasDueDate AND noAssignees))) + "and (c.done is null or c.done = 0) " + + // Full Logic: (hasDueDate AND isIn_PRIVATE_Board) OR (isInSharedBoard AND (assignedToMe OR (hasDueDate AND noAssignees))) "and (" + "(c.dueDate is not null AND NOT exists(select 1 from AccessControl ac where ac.boardId = b.localId and ac.status <> 3))" + //(hasDueDate AND isInPrivateBoard) "OR (" + diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/database/migration/Migration_32_33.java b/app/src/main/java/it/niedermann/nextcloud/deck/database/migration/Migration_32_33.java new file mode 100644 index 000000000..d6938dda6 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/database/migration/Migration_32_33.java @@ -0,0 +1,25 @@ +package it.niedermann.nextcloud.deck.database.migration; + +import androidx.annotation.NonNull; +import androidx.room.migration.Migration; +import androidx.sqlite.db.SupportSQLiteDatabase; + +/** + * Adds support for marking a card as done: https://github.com/stefan-niedermann/nextcloud-deck/issues/1556 + */ +public class Migration_32_33 extends Migration { + + public Migration_32_33() { + super(32, 33); + } + + @Override + public void migrate(@NonNull SupportSQLiteDatabase database) { + database.execSQL("ALTER TABLE `Card` add column done INTEGER"); + // Reset ETags: Refetch all cards to support Done state which did not change ETags + database.execSQL("UPDATE `Account` SET `boardsEtag` = NULL"); + database.execSQL("UPDATE `Board` SET `etag` = NULL"); + database.execSQL("UPDATE `Stack` SET `etag` = NULL"); + database.execSQL("UPDATE `Card` SET `etag` = NULL"); + } +} |