diff options
author | desperateCoder <echotodevnull@gmail.com> | 2020-12-20 15:34:48 +0300 |
---|---|---|
committer | desperateCoder <echotodevnull@gmail.com> | 2020-12-20 15:34:48 +0300 |
commit | 5dafd60cb72f55087cb454af3e7ec3ea57943aa3 (patch) | |
tree | 179ca6d11ddd6e1d9db3b0309924db8c09dbf513 /app/src/main/java/it/niedermann | |
parent | 518b6467e47f6cecd0978a6b672868617084661e (diff) |
#597 filter widget: added ability to filter by Project
Diffstat (limited to 'app/src/main/java/it/niedermann')
6 files changed, 202 insertions, 8 deletions
diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java index ae1c7d916..81aa8cd80 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/internal/FilterInformation.java @@ -10,6 +10,7 @@ import java.util.List; import it.niedermann.nextcloud.deck.model.Label; import it.niedermann.nextcloud.deck.model.User; import it.niedermann.nextcloud.deck.model.enums.EDueType; +import it.niedermann.nextcloud.deck.model.ocs.projects.OcsProject; public class FilterInformation implements Serializable { @@ -21,11 +22,14 @@ public class FilterInformation implements Serializable { private EDueType dueType = EDueType.NO_FILTER; private boolean noAssignedLabel = false; private boolean noAssignedUser = false; + private boolean noAssignedProject = false; @NonNull private List<User> users = new ArrayList<>(); @NonNull private List<Label> labels = new ArrayList<>(); @NonNull + private List<OcsProject> projects = new ArrayList<>(); + @NonNull private EArchiveStatus archiveStatus = EArchiveStatus.NON_ARCHIVED; public FilterInformation() { @@ -41,6 +45,8 @@ public class FilterInformation implements Serializable { this.noAssignedUser = filterInformation.isNoAssignedUser(); this.noAssignedLabel = filterInformation.isNoAssignedLabel(); this.archiveStatus = filterInformation.getArchiveStatus(); + this.noAssignedProject = filterInformation.isNoAssignedProject(); + this.projects = filterInformation.getProjects(); } } @@ -103,6 +109,27 @@ public class FilterInformation implements Serializable { this.users = users; } + public boolean isNoAssignedProject() { + return noAssignedProject; + } + + public void setNoAssignedProject(boolean noAssignedProject) { + this.noAssignedProject = noAssignedProject; + } + + public void setLabels(@NonNull List<Label> labels) { + this.labels = labels; + } + + @NonNull + public List<OcsProject> getProjects() { + return projects; + } + + public void setProjects(@NonNull List<OcsProject> projects) { + this.projects = projects; + } + @NonNull public EArchiveStatus getArchiveStatus() { return archiveStatus; @@ -130,8 +157,10 @@ public class FilterInformation implements Serializable { } return filterInformation.getDueType() != EDueType.NO_FILTER || filterInformation.getUsers().size() > 0 + || filterInformation.getProjects().size() > 0 || filterInformation.getLabels().size() > 0 || filterInformation.noAssignedUser + || filterInformation.noAssignedProject || filterInformation.noAssignedLabel; } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java index e6e30eb23..caf4e5dd1 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetAccount.java @@ -37,6 +37,16 @@ public class FilterWidgetAccount { private Long filterWidgetId; private Long accountId; private boolean includeNoUser = true; + private boolean includeNoProject = true; + + @Ignore + private List<FilterWidgetBoard> boards = new ArrayList<>(); + + @Ignore + private List<FilterWidgetUser> users = new ArrayList<>(); + + @Ignore + private List<FilterWidgetProject> projects = new ArrayList<>(); public FilterWidgetAccount() { // Default constructor @@ -48,12 +58,6 @@ public class FilterWidgetAccount { this.setIncludeNoUser(includeNoUser); } - @Ignore - private List<FilterWidgetBoard> boards = new ArrayList<>(); - - @Ignore - private List<FilterWidgetUser> users = new ArrayList<>(); - public void setBoards(List<FilterWidgetBoard> boards) { this.boards = boards; } @@ -107,6 +111,22 @@ public class FilterWidgetAccount { this.includeNoUser = includeNoUser; } + public boolean isIncludeNoProject() { + return includeNoProject; + } + + public void setIncludeNoProject(boolean includeNoProject) { + this.includeNoProject = includeNoProject; + } + + public List<FilterWidgetProject> getProjects() { + return projects; + } + + public void setProjects(List<FilterWidgetProject> projects) { + this.projects = projects; + } + @Override public boolean equals(Object o) { if (this == o) return true; @@ -115,13 +135,15 @@ public class FilterWidgetAccount { FilterWidgetAccount that = (FilterWidgetAccount) o; if (includeNoUser != that.includeNoUser) return false; + if (includeNoProject != that.includeNoProject) return false; if (id != null ? !id.equals(that.id) : that.id != null) return false; if (filterWidgetId != null ? !filterWidgetId.equals(that.filterWidgetId) : that.filterWidgetId != null) return false; if (accountId != null ? !accountId.equals(that.accountId) : that.accountId != null) return false; if (boards != null ? !boards.equals(that.boards) : that.boards != null) return false; - return users != null ? users.equals(that.users) : that.users == null; + if (users != null ? !users.equals(that.users) : that.users != null) return false; + return projects != null ? projects.equals(that.projects) : that.projects == null; } @Override @@ -130,8 +152,10 @@ public class FilterWidgetAccount { result = 31 * result + (filterWidgetId != null ? filterWidgetId.hashCode() : 0); result = 31 * result + (accountId != null ? accountId.hashCode() : 0); result = 31 * result + (includeNoUser ? 1 : 0); + result = 31 * result + (includeNoProject ? 1 : 0); result = 31 * result + (boards != null ? boards.hashCode() : 0); result = 31 * result + (users != null ? users.hashCode() : 0); + result = 31 * result + (projects != null ? projects.hashCode() : 0); return result; } } diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetProject.java b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetProject.java new file mode 100644 index 000000000..7ed3f956c --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/model/widget/filter/FilterWidgetProject.java @@ -0,0 +1,89 @@ +package it.niedermann.nextcloud.deck.model.widget.filter; + +import androidx.room.Entity; +import androidx.room.ForeignKey; +import androidx.room.Ignore; +import androidx.room.Index; +import androidx.room.PrimaryKey; + +import it.niedermann.nextcloud.deck.model.ocs.projects.OcsProject; + +@Entity( + indices = { + @Index(value = "filterAccountId", name = "idx_FilterWidgetProject_filterAccountId"), + @Index(value = "projectId", name = "idx_FilterWidgetProject_projectId") + }, + foreignKeys = { + @ForeignKey( + entity = OcsProject.class, + parentColumns = "localId", + childColumns = "projectId", onDelete = ForeignKey.CASCADE + ), + @ForeignKey( + entity = FilterWidgetAccount.class, + parentColumns = "id", + childColumns = "filterAccountId", onDelete = ForeignKey.CASCADE + ) + } +) +public class FilterWidgetProject { + + @PrimaryKey(autoGenerate = true) + private Long id; + private Long filterAccountId; + private Long projectId; + + public FilterWidgetProject() { + // Default constructor + } + + @Ignore + public FilterWidgetProject(Long projectId) { + this.projectId = projectId; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getFilterAccountId() { + return filterAccountId; + } + + public void setFilterAccountId(Long filterAccountId) { + this.filterAccountId = filterAccountId; + } + + public Long getProjectId() { + return projectId; + } + + public void setProjectId(Long projectId) { + this.projectId = projectId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + FilterWidgetProject that = (FilterWidgetProject) o; + + if (id != null ? !id.equals(that.id) : that.id != null) return false; + if (filterAccountId != null ? !filterAccountId.equals(that.filterAccountId) : that.filterAccountId != null) + return false; + return projectId != null ? projectId.equals(that.projectId) : that.projectId == null; + } + + @Override + public int hashCode() { + int result = id != null ? id.hashCode() : 0; + result = 31 * result + (filterAccountId != null ? filterAccountId.hashCode() : 0); + result = 31 * result + (projectId != null ? projectId.hashCode() : 0); + return result; + } +} diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java index a1bad0c26..6be24bacc 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DataBaseAdapter.java @@ -57,6 +57,7 @@ import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidget; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetAccount; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetBoard; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetLabel; +import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetProject; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetSort; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetStack; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetUser; @@ -280,6 +281,19 @@ public class DataBaseAdapter { query.append("and not exists(select 1 from joincardwithuser j where c.localId = cardId and j.status<>3) "); } + if (!filter.getProjects().isEmpty()) { + query.append("and (exists(select 1 from joincardwithproject j where c.localId = cardId and projectId in ("); + fillSqlWithEntityListValues(query, args, filter.getProjects()); + query.append(") and j.status<>3) "); + if (filter.isNoAssignedProject()) { + query.append("or not exists(select 1 from joincardwithproject j where c.localId = cardId and j.status<>3)) "); + } else { + query.append(") "); + } + } else if (filter.isNoAssignedProject()) { + query.append("and not exists(select 1 from joincardwithproject j where c.localId = cardId and j.status<>3) "); + } + if (filter.getDueType() != EDueType.NO_FILTER) { switch (filter.getDueType()) { case NO_DUE: @@ -1144,6 +1158,10 @@ public class DataBaseAdapter { user.setFilterAccountId(accountId); db.getFilterWidgetUserDao().insert(user); } + for (FilterWidgetProject project : account.getProjects()) { + project.setFilterAccountId(accountId); + db.getFilterWidgetProjectDao().insert(project); + } for (FilterWidgetBoard board : account.getBoards()) { board.setFilterAccountId(accountId); long boardId = db.getFilterWidgetBoardDao().insert(board); @@ -1184,6 +1202,7 @@ public class DataBaseAdapter { for (FilterWidgetAccount account : filterWidget.getAccounts()) { account.setBoards(db.getFilterWidgetBoardDao().getFilterWidgetBoardsByFilterWidgetAccountIdDirectly(account.getId())); account.setUsers(db.getFilterWidgetUserDao().getFilterWidgetUsersByFilterWidgetAccountIdDirectly(account.getId())); + account.setProjects(db.getFilterWidgetProjectDao().getFilterWidgetProjectsByFilterWidgetAccountIdDirectly(account.getId())); for (FilterWidgetBoard board : account.getBoards()) { board.setLabels(db.getFilterWidgetLabelDao().getFilterWidgetLabelsByFilterWidgetBoardIdDirectly(board.getId())); board.setStacks(db.getFilterWidgetStackDao().getFilterWidgetStacksByFilterWidgetBoardIdDirectly(board.getId())); @@ -1225,6 +1244,16 @@ public class DataBaseAdapter { } } filter.setUsers(users); + filter.setNoAssignedProject(account.isIncludeNoProject()); + List<OcsProject> projects = new ArrayList<>(); + if (!account.getProjects().isEmpty()) { + for (FilterWidgetProject project : account.getProjects()) { + OcsProject u = new OcsProject(); + u.setLocalId(project.getProjectId()); + projects.add(u); + } + } + filter.setProjects(projects); if (!account.getBoards().isEmpty()) { for (FilterWidgetBoard board : account.getBoards()) { filter.setNoAssignedLabel(board.isIncludeNoLabel()); diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java index 859a4718f..874568734 100644 --- a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/DeckDatabase.java @@ -47,6 +47,7 @@ import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidget; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetAccount; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetBoard; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetLabel; +import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetProject; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetSort; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetStack; import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetUser; @@ -82,6 +83,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.fil import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetBoardDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetLabelDao; +import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetProjectDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetSortDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetStackDao; import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter.FilterWidgetUserDao; @@ -119,6 +121,7 @@ import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.fil FilterWidgetStack.class, FilterWidgetLabel.class, FilterWidgetUser.class, + FilterWidgetProject.class, FilterWidgetSort.class, }, exportSchema = false, @@ -433,12 +436,13 @@ public abstract class DeckDatabase extends RoomDatabase { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("CREATE TABLE `FilterWidget` (`id` INTEGER PRIMARY KEY NOT NULL, `title` TEXT, `dueType` INTEGER, `widgetType` INTEGER NOT NULL)"); - database.execSQL("CREATE TABLE `FilterWidgetAccount` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterWidgetId` INTEGER, `accountId` INTEGER, `includeNoUser` INTEGER NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterWidgetId`) REFERENCES `FilterWidget`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )"); + database.execSQL("CREATE TABLE `FilterWidgetAccount` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterWidgetId` INTEGER, `accountId` INTEGER, `includeNoUser` INTEGER NOT NULL, `includeNoProject` INTEGER NOT NULL, FOREIGN KEY(`accountId`) REFERENCES `Account`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterWidgetId`) REFERENCES `FilterWidget`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )"); database.execSQL("CREATE TABLE `FilterWidgetBoard` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterAccountId` INTEGER, `boardId` INTEGER, `includeNoLabel` INTEGER NOT NULL, FOREIGN KEY(`boardId`) REFERENCES `Board`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterAccountId`) REFERENCES `FilterWidgetAccount`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )"); database.execSQL("CREATE TABLE `FilterWidgetLabel` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterBoardId` INTEGER, `labelId` INTEGER, FOREIGN KEY(`labelId`) REFERENCES `Label`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterBoardId`) REFERENCES `FilterWidgetBoard`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )"); database.execSQL("CREATE TABLE `FilterWidgetSort` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterWidgetId` INTEGER, `direction` INTEGER NOT NULL, `criteria` INTEGER NOT NULL, `ruleOrder` INTEGER NOT NULL, FOREIGN KEY(`filterWidgetId`) REFERENCES `FilterWidget`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )"); database.execSQL("CREATE TABLE `FilterWidgetStack` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterBoardId` INTEGER, `stackId` INTEGER, FOREIGN KEY(`stackId`) REFERENCES `Stack`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterBoardId`) REFERENCES `FilterWidgetBoard`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )"); database.execSQL("CREATE TABLE `FilterWidgetUser` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterAccountId` INTEGER, `userId` INTEGER, FOREIGN KEY(`userId`) REFERENCES `User`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterAccountId`) REFERENCES `FilterWidgetAccount`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )"); + database.execSQL("CREATE TABLE `FilterWidgetProject` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `filterAccountId` INTEGER, `projectId` INTEGER, FOREIGN KEY(`projectId`) REFERENCES `OcsProject`(`localId`) ON UPDATE NO ACTION ON DELETE CASCADE , FOREIGN KEY(`filterAccountId`) REFERENCES `FilterWidgetAccount`(`id`) ON UPDATE NO ACTION ON DELETE CASCADE )"); database.execSQL("CREATE INDEX `index_FilterWidgetAccount_filterWidgetId` ON `FilterWidgetAccount` (`filterWidgetId`)"); database.execSQL("CREATE INDEX `idx_FilterWidgetAccount_accountId` ON `FilterWidgetAccount` (`accountId`)"); database.execSQL("CREATE INDEX `idx_FilterWidgetBoard_boardId` ON `FilterWidgetBoard` (`boardId`)"); @@ -450,6 +454,8 @@ public abstract class DeckDatabase extends RoomDatabase { database.execSQL("CREATE INDEX `idx_FilterWidgetStack_stackId` ON `FilterWidgetStack` (`stackId`)"); database.execSQL("CREATE INDEX `idx_FilterWidgetUser_filterAccountId` ON `FilterWidgetUser` (`filterAccountId`)"); database.execSQL("CREATE INDEX `idx_FilterWidgetUser_userId` ON `FilterWidgetUser` (`userId`)"); + database.execSQL("CREATE INDEX `idx_FilterWidgetProject_filterAccountId` ON `FilterWidgetProject` (`filterAccountId`)"); + database.execSQL("CREATE INDEX `idx_FilterWidgetProject_projectId` ON `FilterWidgetProject` (`projectId`)"); database.execSQL("CREATE INDEX `unique_idx_FilterWidgetSort_filterWidgetId_criteria` ON `FilterWidgetSort` (`filterWidgetId`, `criteria`)"); database.execSQL("CREATE INDEX `unique_idx_FilterWidgetSort_filterWidgetId_ruleOrder` ON `FilterWidgetSort` (`filterWidgetId`, `ruleOrder`)"); @@ -599,6 +605,8 @@ public abstract class DeckDatabase extends RoomDatabase { public abstract FilterWidgetUserDao getFilterWidgetUserDao(); + public abstract FilterWidgetProjectDao getFilterWidgetProjectDao(); + public abstract FilterWidgetSortDao getFilterWidgetSortDao(); }
\ No newline at end of file diff --git a/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/widgets/filter/FilterWidgetProjectDao.java b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/widgets/filter/FilterWidgetProjectDao.java new file mode 100644 index 000000000..4e49684e3 --- /dev/null +++ b/app/src/main/java/it/niedermann/nextcloud/deck/persistence/sync/adapters/db/dao/widgets/filter/FilterWidgetProjectDao.java @@ -0,0 +1,15 @@ +package it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.widgets.filter; + +import androidx.room.Dao; +import androidx.room.Query; + +import java.util.List; + +import it.niedermann.nextcloud.deck.model.widget.filter.FilterWidgetProject; +import it.niedermann.nextcloud.deck.persistence.sync.adapters.db.dao.GenericDao; + +@Dao +public interface FilterWidgetProjectDao extends GenericDao<FilterWidgetProject> { + @Query("SELECT * FROM FilterWidgetProject where filterAccountId = :filterWidgetAccountId") + List<FilterWidgetProject> getFilterWidgetProjectsByFilterWidgetAccountIdDirectly(Long filterWidgetAccountId); +} |