From 684a510738ff84aeca56d0c08a783b6ab373fb6a Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Fri, 6 Jul 2018 00:15:45 +0200 Subject: [PATCH] Sorted assignments --- .../fuplanner/services/KVV/KVVModuleList.java | 5 +- .../fuplanner/services/KVV/types/Modules.java | 3 +- .../sebse/fuplanner/tools/AssignmentList.java | 19 +++ .../sebse/fuplanner/tools/DateSortedList.java | 108 ++++++++++++++++++ .../de/sebse/fuplanner/tools/EventList.java | 85 +------------- 5 files changed, 136 insertions(+), 84 deletions(-) create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/AssignmentList.java create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/DateSortedList.java diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java index 7a3a377..c2aece0 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java @@ -23,6 +23,7 @@ import de.sebse.fuplanner.services.KVV.types.Gradebook; import de.sebse.fuplanner.services.KVV.types.Lecturer; import de.sebse.fuplanner.services.KVV.types.LoginToken; import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.tools.AssignmentList; import de.sebse.fuplanner.tools.AsyncQueue; import de.sebse.fuplanner.tools.EventList; import de.sebse.fuplanner.tools.Regex; @@ -243,14 +244,14 @@ public class KVVModuleList extends HTTPService { }); } - private void getAssignmentsUpgrade(String ID, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) { + private void getAssignmentsUpgrade(String ID, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { get(String.format("https://kvv.imp.fu-berlin.de/direct/assignment/site/%s.json", ID), token.getCookies(), response ->{ String body = response.getParsed(); if (body == null) { errorCallback.onError(new NetworkError(101301, 403, "No assignments retrieved!")); return; } - ArrayList assignments = new ArrayList<>(); + AssignmentList assignments = new AssignmentList(); try { JSONObject json = new JSONObject(body); JSONArray sites = json.getJSONArray("assignment_collection"); diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java index ee6ec2c..7db9dcb 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; +import de.sebse.fuplanner.tools.AssignmentList; import de.sebse.fuplanner.tools.Compare; import de.sebse.fuplanner.tools.EventList; import de.sebse.fuplanner.tools.Regex; @@ -189,7 +190,7 @@ public class Modules implements Iterable, Serializable { public final String description; private final String ID; public ArrayList announcements; - public ArrayList assignments; + public AssignmentList assignments; public EventList events; public ArrayList gradebook; diff --git a/app/src/main/java/de/sebse/fuplanner/tools/AssignmentList.java b/app/src/main/java/de/sebse/fuplanner/tools/AssignmentList.java new file mode 100644 index 0000000..82292ac --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/AssignmentList.java @@ -0,0 +1,19 @@ +package de.sebse.fuplanner.tools; + +import de.sebse.fuplanner.services.KVV.types.Assignment; +import de.sebse.fuplanner.tools.logging.Logger; + +public class AssignmentList extends DateSortedList { + + @Override + long getDateByItem(Assignment item) { + Logger log = new Logger(this); + log.d(item.getTitle(), Conversion.getModifiedDateTime(item.getDueDate())); + return item.getDueDate(); + } + + @Override + public boolean reversed() { + return true; + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/tools/DateSortedList.java b/app/src/main/java/de/sebse/fuplanner/tools/DateSortedList.java new file mode 100644 index 0000000..2b5d020 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/DateSortedList.java @@ -0,0 +1,108 @@ +package de.sebse.fuplanner.tools; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collections; +import java.util.Iterator; + +import de.sebse.fuplanner.services.KVV.types.Event; + +public abstract class DateSortedList extends ArrayList { + private int split = -1; + + public T getPast(int index) { + if (split < 0) + sort(); + if (index >= split) + throw new ArrayIndexOutOfBoundsException(String.format("Index %d out of bounds! Only %d past events found!", index, split)); + if (reversed()) + index = sizePast() - index - 1; + return this.get(index); + } + + public T getUpcoming(int index) { + if (split < 0) + sort(); + index += split; + if (index >= this.size()) + throw new ArrayIndexOutOfBoundsException(String.format("Index %d out of bounds! Only %d upcoming events found!", index-split, this.size()-split)); + if (reversed()) + index = sizeUpcoming() - index - 1; + return this.get(index); + } + + @Override + public T get(int index) { + if (split < 0) + sort(); + if (reversed()) + index = size() - index - 1; + return super.get(index); + } + + public int sizePast() { + if (split < 0) + sort(); + return split; + } + + public int sizeUpcoming() { + if (split < 0) + sort(); + return this.size()-split; + } + + public boolean add(T event) { + split = -1; + return super.add(event); + } + + public void sort() { + + Collections.sort(this, ((e1, e2) -> Long.compare(getDateByItem(e1), getDateByItem(e2)))); + long now = System.currentTimeMillis(); + split = 0; + for (T event: this) { + if (getDateByItem(event) < now) + split++; + else + break; + } + } + + public Iterator getEventsOfMonth(int year, int month) { + if (split < 0) + sort(); + final int[] i = {0}; + Calendar minC = Calendar.getInstance(); + minC.set(year, month-1, 1, 0, 0); + Calendar maxC = Calendar.getInstance(); + maxC.set(year, month, 1, 0, 0); + for (; i[0] < this.size(); i[0]++) { + if (getDateByItem(this.get(i[0])) > minC.getTimeInMillis()) { + break; + } + } + return new Iterator() { + @Override + public boolean hasNext() { + return i[0] < DateSortedList.this.size() && getDateByItem(DateSortedList.this.get(i[0])) < maxC.getTimeInMillis(); + } + + @Override + public T next() { + if (hasNext()) { + return DateSortedList.this.get(i[0]++); + } else { + return null; + } + } + }; + } + + public boolean reversed() { + return false; + } + + abstract long getDateByItem(T item); +} diff --git a/app/src/main/java/de/sebse/fuplanner/tools/EventList.java b/app/src/main/java/de/sebse/fuplanner/tools/EventList.java index c233f0a..b7aabd2 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/EventList.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/EventList.java @@ -1,88 +1,11 @@ package de.sebse.fuplanner.tools; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collections; -import java.util.Iterator; - import de.sebse.fuplanner.services.KVV.types.Event; -public class EventList extends ArrayList { - private int split = 0; +public class EventList extends DateSortedList { - public Event getPast(int index) { - if (split < 0) - sort(); - if (index >= split) - throw new ArrayIndexOutOfBoundsException(String.format("Index %d out of bounds! Only %d past events found!", index, split)); - return this.get(index); - } - - public Event getUpcoming(int index) { - if (split < 0) - sort(); - index += split; - if (index >= this.size()) - throw new ArrayIndexOutOfBoundsException(String.format("Index %d out of bounds! Only %d upcoming events found!", index-split, this.size()-split)); - return this.get(index); - } - - public int sizePast() { - if (split < 0) - sort(); - return split; - } - - public int sizeUpcoming() { - if (split < 0) - sort(); - return this.size()-split; - } - - public boolean add(Event event) { - split = -1; - return super.add(event); - } - - public void sort() { - Collections.sort(this, ((e1, e2) -> Long.compare(e1.getEndDate(), e2.getEndDate()))); - long now = System.currentTimeMillis(); - split = 0; - for (Event event : this) { - if (event.getEndDate() < now) - split++; - else - break; - } - } - - public Iterator getEventsOfMonth(int year, int month) { - if (split < 0) - sort(); - final int[] i = {0}; - Calendar minC = Calendar.getInstance(); - minC.set(year, month-1, 1, 0, 0); - Calendar maxC = Calendar.getInstance(); - maxC.set(year, month, 1, 0, 0); - for (; i[0] < this.size(); i[0]++) { - if (this.get(i[0]).getEndDate() > minC.getTimeInMillis()) { - break; - } - } - return new Iterator() { - @Override - public boolean hasNext() { - return i[0] < EventList.this.size() && EventList.this.get(i[0]).getEndDate() < maxC.getTimeInMillis(); - } - - @Override - public Event next() { - if (hasNext()) { - return EventList.this.get(i[0]++); - } else { - return null; - } - } - }; + @Override + long getDateByItem(Event item) { + return item.getEndDate(); } }