From c186e855337c43ef5163b136f570d8c3afcbba4f Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Wed, 4 Jul 2018 18:35:05 +0200 Subject: [PATCH] Modules list cached, implemented offline load and forceOverride-refresh --- .idea/misc.xml | 2 +- .idea/modules.xml | 2 +- .idea/vcs.xml | 1 + .../de/sebse/fuplanner/services/KVV/KVV.java | 4 + .../fuplanner/services/KVV/KVVModuleList.java | 87 +++++++++++++++---- .../fuplanner/services/KVV/types/Modules.java | 32 ++++++- .../de/sebse/fuplanner/tools/EventList.java | 5 +- 7 files changed, 109 insertions(+), 24 deletions(-) diff --git a/.idea/misc.xml b/.idea/misc.xml index a8cce1b..4e024a8 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -25,5 +25,5 @@ - + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 62306f1..bee9e70 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,7 @@ - + diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 35eb1dd..8306744 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,5 +2,6 @@ + \ No newline at end of file diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java index 648bdcc..6b4335a 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java @@ -38,6 +38,10 @@ public class KVV { public void logout() { lastToken = null; + KVVModuleList modules = (KVVModuleList) addons.get("modules"); + if (modules != null) { + modules.deleteModules(this.context); + } addons.clear(); } 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 54f1f86..741accc 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 @@ -8,6 +8,7 @@ import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.concurrent.atomic.AtomicInteger; @@ -42,9 +43,36 @@ public class KVVModuleList extends HTTPService { KVVModuleList(Context context, LoginToken token) { super(context); this.token = token; + try { + this.moduleList = Modules.load(context); + } catch (IOException e) { + e.printStackTrace(); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } } public void getModuleList(final NetworkCallback callback, final NetworkErrorCallback errorCallback) { + getModuleList(callback, errorCallback, false); + } + + public void getModuleList(final NetworkCallback callback, final NetworkErrorCallback errorCallback, boolean forceOverride) { + queueModuleDetails.add("list", () -> { + if (this.moduleList != null && !forceOverride) { + callback.onResponse(this.moduleList); + queueModuleDetails.next("list"); + return; + } + this.getModuleListUpgrade(success -> { + this.moduleList = success; + callback.onResponse(this.moduleList); + queueModuleDetails.next("list"); + }, errorCallback); + }); + } + + public void getModuleListUpgrade(final NetworkCallback callback, final NetworkErrorCallback errorCallback) { + log.d("Module List refreshed"); get("https://kvv.imp.fu-berlin.de/direct/site.json", token.getCookies(), response -> { String body = response.getParsed(); if (body == null) { @@ -82,11 +110,20 @@ public class KVVModuleList extends HTTPService { errorCallback.onError(new NetworkError(101103, 403, "Cannot parse module list!")); return; } - moduleList = modules; - callback.onResponse(moduleList); + callback.onResponse(modules); }, error -> errorCallback.onError(new NetworkError(101104, error.networkResponse.statusCode, "Cannot get module list!"))); } + public void deleteModules(Context context) { + if (this.moduleList != null) + this.moduleList.delete(context); + } + + public void saveModules(Context context) throws IOException { + if (this.moduleList != null) + this.moduleList.save(context); + } + public void getModule(int index, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { this.getModuleList(success -> callback.onResponse(success.get(index)), errorCallback); } @@ -95,7 +132,12 @@ public class KVVModuleList extends HTTPService { + public void getModuleDetails(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { + this.getModuleDetails(module, callback, errorCallback, false); + } + + public void getModuleDetails(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback, boolean forceOverride) { AtomicInteger returns = new AtomicInteger(0); AtomicReference lastError = new AtomicReference<>(null); final int items = 4; @@ -116,10 +158,10 @@ public class KVVModuleList extends HTTPService { } }; Runnable[] methods = { // UPDATE VARIABLE items ABOVE - () -> this.getAssignments(module, successCb, errorCb), - () -> this.getEvents(module, successCb, errorCb), - () -> this.getAnnouncements(module, successCb, errorCb), - () -> this.getGradebook(module, successCb, errorCb) + () -> this.getAssignments(module, successCb, errorCb, forceOverride), + () -> this.getEvents(module, successCb, errorCb, forceOverride), + () -> this.getAnnouncements(module, successCb, errorCb, forceOverride), + () -> this.getGradebook(module, successCb, errorCb, forceOverride) }; //noinspection ConstantConditions if (methods.length != items) throw new AssertionError(); @@ -131,11 +173,13 @@ public class KVVModuleList extends HTTPService { - - public void getAnnouncements(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { + getAnnouncements(module, callback, errorCallback, false); + } + + public void getAnnouncements(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback, boolean forceOverride) { queueModuleDetails.add(module.getID(), () -> { - if (module.announcements != null) { + if (module.announcements != null && !forceOverride) { callback.onResponse(module); queueModuleDetails.next(module.getID()); return; @@ -183,12 +227,13 @@ public class KVVModuleList extends HTTPService { - - public void getAssignments(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { - //log.d("In getAssignments"); + getAssignments(module, callback, errorCallback, false); + } + + public void getAssignments(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback, boolean forceOverride) { queueModuleDetails.add(module.getID(), () -> { - if (module.assignments != null) { + if (module.assignments != null && !forceOverride) { callback.onResponse(module); queueModuleDetails.next(module.getID()); return; @@ -250,10 +295,13 @@ public class KVVModuleList extends HTTPService { - public void getEvents(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { + getEvents(module, callback, errorCallback, false); + } + + public void getEvents(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback, boolean forceOverride) { queueModuleDetails.add(module.getID(), () -> { - if (module.events != null) { + if (module.events != null && !forceOverride) { callback.onResponse(module); queueModuleDetails.next(module.getID()); return; @@ -300,10 +348,15 @@ public class KVVModuleList extends HTTPService { + + public void getGradebook(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { - //log.d("In getAssignments"); + getGradebook(module, callback, errorCallback, false); + } + + public void getGradebook(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback, boolean forceOverride) { queueModuleDetails.add(module.getID(), () -> { - if (module.gradebook != null) { + if (module.gradebook != null && !forceOverride) { callback.onResponse(module); queueModuleDetails.next(module.getID()); return; 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 74cdf42..afba01f 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 @@ -1,8 +1,16 @@ package de.sebse.fuplanner.services.KVV.types; +import android.content.Context; import android.support.annotation.NonNull; import android.support.v7.util.SortedList; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; @@ -16,10 +24,11 @@ import de.sebse.fuplanner.tools.logging.Logger; * Created by sebastian on 29.10.17. */ -public class Modules /*extends EventEmitter>>*/ implements Iterable { +public class Modules /*extends EventEmitter>>*/ implements Iterable, Serializable { private final SortedList list; private String latestSemester = null; private Logger log = new Logger(this); + private static final String FILE_NAME = "ModuleListSaving"; public Modules() { this.list = new SortedList<>(Module.class, new SortedList.Callback() { @@ -183,6 +192,27 @@ public class Modules /*extends EventEmitter lvNumber; 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 239b509..c233f0a 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/EventList.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/EventList.java @@ -6,11 +6,10 @@ import java.util.Collections; import java.util.Iterator; import de.sebse.fuplanner.services.KVV.types.Event; -import de.sebse.fuplanner.tools.logging.Logger; public class EventList extends ArrayList { private int split = 0; - private Logger log = new Logger(this); + public Event getPast(int index) { if (split < 0) sort(); @@ -79,10 +78,8 @@ public class EventList extends ArrayList { @Override public Event next() { if (hasNext()) { - log.d("Event hasnext", hasNext()); return EventList.this.get(i[0]++); } else { - log.d("Event null", hasNext()); return null; } }