From ead60643be5b8b75c129f8cba96c6c17568b8ece Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Wed, 3 Jul 2019 14:41:04 -0500 Subject: [PATCH] Fetch tags and lists with counts --- .../astrid/gtasks/GtasksFilterExposer.java | 29 +++++----- .../todoroo/astrid/tags/TagFilterExposer.java | 22 +++----- .../com/todoroo/astrid/tags/TagService.java | 4 -- .../org/tasks/caldav/CaldavFilterExposer.java | 19 ++++--- .../main/java/org/tasks/data/CaldavDao.java | 14 ++++- .../org/tasks/data/GoogleTaskListDao.java | 11 ++++ .../main/java/org/tasks/data/TagDataDao.java | 11 ++++ .../java/org/tasks/filters/CaldavFilters.java | 55 +++++++++++++++++++ .../org/tasks/filters/FilterProvider.java | 37 +++++++------ .../org/tasks/filters/GoogleTaskFilters.java | 55 +++++++++++++++++++ .../java/org/tasks/filters/TagFilters.java | 43 +++++++++++++++ 11 files changed, 239 insertions(+), 61 deletions(-) create mode 100644 app/src/main/java/org/tasks/filters/CaldavFilters.java create mode 100644 app/src/main/java/org/tasks/filters/GoogleTaskFilters.java create mode 100644 app/src/main/java/org/tasks/filters/TagFilters.java diff --git a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java index 33efca1a5..98af7025e 100644 --- a/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java +++ b/app/src/main/java/com/todoroo/astrid/gtasks/GtasksFilterExposer.java @@ -6,17 +6,17 @@ package com.todoroo.astrid.gtasks; -import static com.google.common.collect.Lists.newArrayList; -import static com.google.common.collect.Lists.transform; - -import androidx.core.util.Pair; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.GtasksFilter; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import javax.inject.Inject; import org.tasks.data.GoogleTaskAccount; import org.tasks.data.GoogleTaskList; import org.tasks.data.GoogleTaskListDao; +import org.tasks.filters.GoogleTaskFilters; import org.tasks.sync.SyncAdapters; /** @@ -40,26 +40,25 @@ public class GtasksFilterExposer { this.googleTaskListDao = googleTaskListDao; } - public List>> getFilters() { - List>> listFilters = newArrayList(); - for (GoogleTaskAccount account : googleTaskListDao.getAccounts()) { - List lists = googleTaskListDao.getLists(account.getAccount()); - listFilters.add(new Pair<>(account, transform(lists, GtasksFilter::new))); + public Map> getFilters() { + List googleTaskFilters = googleTaskListDao.getGoogleTaskFilters(); + LinkedHashMap> filters = new LinkedHashMap<>(); + for (GoogleTaskFilters filter : googleTaskFilters) { + if (!filters.containsKey(filter.googleTaskAccount)) { + filters.put(filter.googleTaskAccount, new ArrayList<>()); + } + filters.get(filter.googleTaskAccount).add(new GtasksFilter(filter.googleTaskList)); } - return listFilters; + return filters; } public Filter getFilter(long id) { if (syncAdapters.isGoogleTaskSyncEnabled()) { GoogleTaskList list = gtasksListService.getList(id); if (list != null) { - return filterFromList(list); + return new GtasksFilter(list); } } return null; } - - private Filter filterFromList(GoogleTaskList list) { - return new GtasksFilter(list); - } } diff --git a/app/src/main/java/com/todoroo/astrid/tags/TagFilterExposer.java b/app/src/main/java/com/todoroo/astrid/tags/TagFilterExposer.java index e5acb129f..148f2dfbe 100644 --- a/app/src/main/java/com/todoroo/astrid/tags/TagFilterExposer.java +++ b/app/src/main/java/com/todoroo/astrid/tags/TagFilterExposer.java @@ -6,13 +6,16 @@ package com.todoroo.astrid.tags; +import static com.google.common.collect.Lists.transform; + import com.google.common.base.Strings; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.TagFilter; -import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import org.tasks.data.TagData; +import org.tasks.data.TagDataDao; +import org.tasks.filters.TagFilters; /** * Exposes filters based on tags @@ -22,9 +25,11 @@ import org.tasks.data.TagData; public class TagFilterExposer { private final TagService tagService; + private final TagDataDao tagDataDao; @Inject - public TagFilterExposer(TagService tagService) { + public TagFilterExposer(TagDataDao tagDataDao, TagService tagService) { + this.tagDataDao = tagDataDao; this.tagService = tagService; } @@ -37,21 +42,10 @@ public class TagFilterExposer { } public List getFilters() { - return filterFromTags(tagService.getTagList()); + return transform(tagDataDao.getTagFilters(), TagFilters::toTagFilter); } public Filter getFilterByUuid(String uuid) { return filterFromTag(tagService.tagFromUUID(uuid)); } - - private List filterFromTags(List tags) { - List filters = new ArrayList<>(); - for (TagData tag : tags) { - Filter f = filterFromTag(tag); - if (f != null) { - filters.add(f); - } - } - return filters; - } } diff --git a/app/src/main/java/com/todoroo/astrid/tags/TagService.java b/app/src/main/java/com/todoroo/astrid/tags/TagService.java index 2ad305380..d7bd5f4a2 100644 --- a/app/src/main/java/com/todoroo/astrid/tags/TagService.java +++ b/app/src/main/java/com/todoroo/astrid/tags/TagService.java @@ -70,10 +70,6 @@ public final class TagService { return tagList; } - public TagData getTagByUuid(String uuid) { - return tagDataDao.getByUuid(uuid); - } - /** * If a tag already exists in the database that case insensitively matches the given tag, return * that. Otherwise, return the argument diff --git a/app/src/main/java/org/tasks/caldav/CaldavFilterExposer.java b/app/src/main/java/org/tasks/caldav/CaldavFilterExposer.java index 8ba4afed6..7cb743acc 100644 --- a/app/src/main/java/org/tasks/caldav/CaldavFilterExposer.java +++ b/app/src/main/java/org/tasks/caldav/CaldavFilterExposer.java @@ -1,16 +1,16 @@ package org.tasks.caldav; -import static com.google.common.collect.Lists.transform; - -import androidx.core.util.Pair; import com.todoroo.astrid.api.CaldavFilter; import com.todoroo.astrid.api.Filter; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import javax.inject.Inject; import org.tasks.data.CaldavAccount; import org.tasks.data.CaldavCalendar; import org.tasks.data.CaldavDao; +import org.tasks.filters.CaldavFilters; import org.tasks.sync.SyncAdapters; public class CaldavFilterExposer { @@ -24,11 +24,14 @@ public class CaldavFilterExposer { this.syncAdapters = syncAdapters; } - public List>> getFilters() { - List>> filters = new ArrayList<>(); - for (CaldavAccount account : caldavDao.getAccounts()) { - List calendars = caldavDao.getCalendarsByAccount(account.getUuid()); - filters.add(new Pair<>(account, transform(calendars, CaldavFilter::new))); + public Map> getFilters() { + List caldavFilters = caldavDao.getCaldavFilters(); + LinkedHashMap> filters = new LinkedHashMap<>(); + for (CaldavFilters filter : caldavFilters) { + if (!filters.containsKey(filter.caldavAccount)) { + filters.put(filter.caldavAccount, new ArrayList<>()); + } + filters.get(filter.caldavAccount).add(new CaldavFilter(filter.caldavCalendar)); } return filters; } diff --git a/app/src/main/java/org/tasks/data/CaldavDao.java b/app/src/main/java/org/tasks/data/CaldavDao.java index 223261658..b96ba12ed 100644 --- a/app/src/main/java/org/tasks/data/CaldavDao.java +++ b/app/src/main/java/org/tasks/data/CaldavDao.java @@ -8,6 +8,7 @@ import androidx.room.Query; import androidx.room.Update; import io.reactivex.Single; import java.util.List; +import org.tasks.filters.CaldavFilters; @Dao public interface CaldavDao { @@ -66,9 +67,6 @@ public interface CaldavDao { @Query("SELECT * FROM caldav_lists ORDER BY cdl_name COLLATE NOCASE") List getCalendars(); - @Query("SELECT * FROM caldav_lists WHERE cdl_account = :account ORDER BY cdl_name COLLATE NOCASE") - List getCalendarsByAccount(String account); - @Query("SELECT * FROM caldav_lists WHERE cdl_uuid = :uuid LIMIT 1") CaldavCalendar getCalendar(String uuid); @@ -93,4 +91,14 @@ public interface CaldavDao { @Query("SELECT DISTINCT cd_calendar FROM caldav_tasks WHERE cd_deleted = 0 AND cd_task IN (:tasks)") List getCalendars(List tasks); + + @Query( + "SELECT caldav_lists.*, caldav_accounts.*, COUNT(tasks._id) AS count" + + " FROM caldav_lists" + + " LEFT JOIN caldav_accounts ON caldav_lists.cdl_account = caldav_accounts.cda_uuid" + + " LEFT JOIN caldav_tasks ON caldav_tasks.cd_calendar = caldav_lists.cdl_uuid" + + " LEFT JOIN tasks ON caldav_tasks.cd_task = tasks._id AND tasks.deleted = 0 AND tasks.completed = 0 AND tasks.hideUntil = 0" + + " GROUP BY caldav_lists.cdl_uuid" + + " ORDER BY caldav_accounts.cda_name COLLATE NOCASE, caldav_lists.cdl_name COLLATE NOCASE") + List getCaldavFilters(); } diff --git a/app/src/main/java/org/tasks/data/GoogleTaskListDao.java b/app/src/main/java/org/tasks/data/GoogleTaskListDao.java index fd60122f1..39e91ec81 100644 --- a/app/src/main/java/org/tasks/data/GoogleTaskListDao.java +++ b/app/src/main/java/org/tasks/data/GoogleTaskListDao.java @@ -8,6 +8,7 @@ import androidx.room.Query; import androidx.room.Update; import io.reactivex.Single; import java.util.List; +import org.tasks.filters.GoogleTaskFilters; @Dao public abstract class GoogleTaskListDao { @@ -54,4 +55,14 @@ public abstract class GoogleTaskListDao { @Update public abstract void update(GoogleTaskAccount account); + + @Query( + "SELECT google_task_lists.*, google_task_accounts.*, COUNT(tasks._id) AS count" + + " FROM google_task_lists" + + " LEFT JOIN google_task_accounts ON google_task_lists.gtl_account = google_task_accounts.gta_account" + + " LEFT JOIN google_tasks ON google_tasks.gt_list_id = google_task_lists.gtl_remote_id" + + " LEFT JOIN tasks ON google_tasks.gt_task = tasks._id AND tasks.deleted = 0 AND tasks.completed = 0 AND tasks.hideUntil = 0" + + " GROUP BY google_task_lists.gtl_remote_id" + + " ORDER BY google_task_lists.gtl_account COLLATE NOCASE, google_task_lists.gtl_title COLLATE NOCASE") + public abstract List getGoogleTaskFilters(); } diff --git a/app/src/main/java/org/tasks/data/TagDataDao.java b/app/src/main/java/org/tasks/data/TagDataDao.java index 60c224265..b836d9d77 100644 --- a/app/src/main/java/org/tasks/data/TagDataDao.java +++ b/app/src/main/java/org/tasks/data/TagDataDao.java @@ -8,6 +8,7 @@ import androidx.room.Update; import com.todoroo.astrid.data.Task; import com.todoroo.astrid.helper.UUIDHelper; import java.util.List; +import org.tasks.filters.TagFilters; @Dao public abstract class TagDataDao { @@ -45,4 +46,14 @@ public abstract class TagDataDao { } tag.setId(insert(tag)); } + + @Query( + "SELECT tagdata.*, COUNT(tasks._id) AS count" + + " FROM tagdata" + + " LEFT JOIN tags ON tags.tag_uid = tagdata.remoteId" + + " LEFT JOIN tasks ON tags.task = tasks._id AND tasks.deleted = 0 AND tasks.completed = 0 AND tasks.hideUntil = 0" + + " WHERE tagdata.name IS NOT NULL AND tagdata.name != ''" + + " GROUP BY tagdata.remoteId" + + " ORDER BY tagdata.name COLLATE NOCASE") + public abstract List getTagFilters(); } diff --git a/app/src/main/java/org/tasks/filters/CaldavFilters.java b/app/src/main/java/org/tasks/filters/CaldavFilters.java new file mode 100644 index 000000000..a60816bf8 --- /dev/null +++ b/app/src/main/java/org/tasks/filters/CaldavFilters.java @@ -0,0 +1,55 @@ +package org.tasks.filters; + +import androidx.room.Embedded; +import org.tasks.data.CaldavAccount; +import org.tasks.data.CaldavCalendar; + +public class CaldavFilters { + @Embedded public CaldavCalendar caldavCalendar; + @Embedded public CaldavAccount caldavAccount; + public int count; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + CaldavFilters that = (CaldavFilters) o; + + if (count != that.count) { + return false; + } + if (caldavCalendar != null + ? !caldavCalendar.equals(that.caldavCalendar) + : that.caldavCalendar != null) { + return false; + } + return caldavAccount != null + ? caldavAccount.equals(that.caldavAccount) + : that.caldavAccount == null; + } + + @Override + public int hashCode() { + int result = caldavCalendar != null ? caldavCalendar.hashCode() : 0; + result = 31 * result + (caldavAccount != null ? caldavAccount.hashCode() : 0); + result = 31 * result + count; + return result; + } + + @Override + public String toString() { + return "CaldavFilters{" + + "caldavCalendar=" + + caldavCalendar + + ", caldavAccount=" + + caldavAccount + + ", count=" + + count + + '}'; + } +} diff --git a/app/src/main/java/org/tasks/filters/FilterProvider.java b/app/src/main/java/org/tasks/filters/FilterProvider.java index 34c28c3c5..cb06b04ab 100644 --- a/app/src/main/java/org/tasks/filters/FilterProvider.java +++ b/app/src/main/java/org/tasks/filters/FilterProvider.java @@ -11,7 +11,6 @@ import static org.tasks.caldav.CaldavCalendarSettingsActivity.EXTRA_CALDAV_ACCOU import android.content.Context; import android.content.Intent; import android.net.Uri; -import androidx.core.util.Pair; import com.google.common.collect.ImmutableList; import com.todoroo.astrid.api.Filter; import com.todoroo.astrid.api.FilterListItem; @@ -23,6 +22,9 @@ import com.todoroo.astrid.tags.TagFilterExposer; import com.todoroo.astrid.timers.TimerFilterExposer; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; import javax.inject.Inject; import org.tasks.BuildConfig; import org.tasks.R; @@ -78,17 +80,18 @@ public class FilterProvider { item.icon = R.drawable.ic_outline_cloud_off_24px; items.add(item); - for (Pair> filters : getGoogleTaskFilters()) { - GoogleTaskAccount account = filters.first; + for (Map.Entry> filters : getGoogleTaskFilters()) { + GoogleTaskAccount account = filters.getKey(); items.addAll( getSubmenu( - account.getAccount(), !isNullOrEmpty(account.getError()), filters.second, true)); + account.getAccount(), !isNullOrEmpty(account.getError()), filters.getValue(), true)); } - for (Pair> filters : getCaldavFilters()) { - CaldavAccount account = filters.first; + for (Map.Entry> filters : getCaldavFilters()) { + CaldavAccount account = filters.getKey(); items.addAll( - getSubmenu(account.getName(), !isNullOrEmpty(account.getError()), filters.second, true)); + getSubmenu( + account.getName(), !isNullOrEmpty(account.getError()), filters.getValue(), true)); } return items; @@ -123,13 +126,13 @@ public class FilterProvider { NavigationDrawerFragment.REQUEST_NEW_LIST)); } - for (Pair> filters : getGoogleTaskFilters()) { - GoogleTaskAccount account = filters.first; + for (Map.Entry> filters : getGoogleTaskFilters()) { + GoogleTaskAccount account = filters.getKey(); items.addAll( getSubmenu( account.getAccount(), !isNullOrEmpty(account.getError()), - filters.second, + filters.getValue(), !navigationDrawer)); if (navigationDrawer) { @@ -143,13 +146,13 @@ public class FilterProvider { } } - for (Pair> filters : getCaldavFilters()) { - CaldavAccount account = filters.first; + for (Map.Entry> filters : getCaldavFilters()) { + CaldavAccount account = filters.getKey(); items.addAll( getSubmenu( account.getName(), !isNullOrEmpty(account.getError()), - filters.second, + filters.getValue(), !navigationDrawer)); if (navigationDrawer) { @@ -202,12 +205,12 @@ public class FilterProvider { return filters; } - private List>> getGoogleTaskFilters() { - return gtasksFilterExposer.getFilters(); + private Set>> getGoogleTaskFilters() { + return gtasksFilterExposer.getFilters().entrySet(); } - private List>> getCaldavFilters() { - return caldavFilterExposer.getFilters(); + private Set>> getCaldavFilters() { + return caldavFilterExposer.getFilters().entrySet(); } private List getSubmenu(int title, List filters) { diff --git a/app/src/main/java/org/tasks/filters/GoogleTaskFilters.java b/app/src/main/java/org/tasks/filters/GoogleTaskFilters.java new file mode 100644 index 000000000..a0f95ff3d --- /dev/null +++ b/app/src/main/java/org/tasks/filters/GoogleTaskFilters.java @@ -0,0 +1,55 @@ +package org.tasks.filters; + +import androidx.room.Embedded; +import org.tasks.data.GoogleTaskAccount; +import org.tasks.data.GoogleTaskList; + +public class GoogleTaskFilters { + @Embedded public GoogleTaskList googleTaskList; + @Embedded public GoogleTaskAccount googleTaskAccount; + public int count; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + GoogleTaskFilters that = (GoogleTaskFilters) o; + + if (count != that.count) { + return false; + } + if (googleTaskList != null + ? !googleTaskList.equals(that.googleTaskList) + : that.googleTaskList != null) { + return false; + } + return googleTaskAccount != null + ? googleTaskAccount.equals(that.googleTaskAccount) + : that.googleTaskAccount == null; + } + + @Override + public int hashCode() { + int result = googleTaskList != null ? googleTaskList.hashCode() : 0; + result = 31 * result + (googleTaskAccount != null ? googleTaskAccount.hashCode() : 0); + result = 31 * result + count; + return result; + } + + @Override + public String toString() { + return "GoogleTaskFilters{" + + "googleTaskList=" + + googleTaskList + + ", googleTaskAccount=" + + googleTaskAccount + + ", count=" + + count + + '}'; + } +} diff --git a/app/src/main/java/org/tasks/filters/TagFilters.java b/app/src/main/java/org/tasks/filters/TagFilters.java new file mode 100644 index 000000000..af9111c45 --- /dev/null +++ b/app/src/main/java/org/tasks/filters/TagFilters.java @@ -0,0 +1,43 @@ +package org.tasks.filters; + +import androidx.room.Embedded; +import com.todoroo.astrid.api.TagFilter; +import org.tasks.data.TagData; + +public class TagFilters { + @Embedded public TagData tagData; + public int count; + + public TagFilter toTagFilter() { + return new TagFilter(tagData); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof TagFilters)) { + return false; + } + + TagFilters that = (TagFilters) o; + + if (count != that.count) { + return false; + } + return tagData != null ? tagData.equals(that.tagData) : that.tagData == null; + } + + @Override + public int hashCode() { + int result = tagData != null ? tagData.hashCode() : 0; + result = 31 * result + count; + return result; + } + + @Override + public String toString() { + return "TagFilters{" + "tagData=" + tagData + ", count=" + count + '}'; + } +}