Modules list cached, implemented offline load and forceOverride-refresh

This commit is contained in:
Caesar2011
2018-07-04 18:35:05 +02:00
parent 376c132c9a
commit 0647048486
7 changed files with 109 additions and 24 deletions

View File

@@ -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();
}

View File

@@ -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<Modules> callback, final NetworkErrorCallback errorCallback) {
getModuleList(callback, errorCallback, false);
}
public void getModuleList(final NetworkCallback<Modules> 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<Modules> 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<Modules.Module> 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<Modules.Module> callback, final NetworkErrorCallback errorCallback) {
this.getModuleDetails(module, callback, errorCallback, false);
}
public void getModuleDetails(Modules.Module module, final NetworkCallback<Modules.Module> callback, final NetworkErrorCallback errorCallback, boolean forceOverride) {
AtomicInteger returns = new AtomicInteger(0);
AtomicReference<NetworkError> 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<Modules.Module> callback, final NetworkErrorCallback errorCallback) {
getAnnouncements(module, callback, errorCallback, false);
}
public void getAnnouncements(Modules.Module module, final NetworkCallback<Modules.Module> 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<Modules.Module> callback, final NetworkErrorCallback errorCallback) {
//log.d("In getAssignments");
getAssignments(module, callback, errorCallback, false);
}
public void getAssignments(Modules.Module module, final NetworkCallback<Modules.Module> 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<Modules.Module> callback, final NetworkErrorCallback errorCallback) {
getEvents(module, callback, errorCallback, false);
}
public void getEvents(Modules.Module module, final NetworkCallback<Modules.Module> 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<Modules.Module> callback, final NetworkErrorCallback errorCallback) {
//log.d("In getAssignments");
getGradebook(module, callback, errorCallback, false);
}
public void getGradebook(Modules.Module module, final NetworkCallback<Modules.Module> 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;

View File

@@ -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<Triplet<Integer, Modules.UpgradeModule, ArrayList<String>>>*/ implements Iterable<Modules.Module> {
public class Modules /*extends EventEmitter<Triplet<Integer, Modules.UpgradeModule, ArrayList<String>>>*/ implements Iterable<Modules.Module>, Serializable {
private final SortedList<Module> 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<Module>() {
@@ -183,6 +192,27 @@ public class Modules /*extends EventEmitter<Triplet<Integer, Modules.UpgradeModu
return this.list.get(index);
}
public static Modules load(Context context) throws IOException, ClassNotFoundException {
FileInputStream fis = context.openFileInput(FILE_NAME);
ObjectInputStream is = new ObjectInputStream(fis);
Modules modules = (Modules) is.readObject();
is.close();
fis.close();
return modules;
}
public void save(Context context) throws IOException {
FileOutputStream fos = context.openFileOutput(FILE_NAME, Context.MODE_PRIVATE);
ObjectOutputStream os = new ObjectOutputStream(fos);
os.writeObject(this);
os.close();
fos.close();
}
public void delete(Context context) {
context.deleteFile(FILE_NAME);
}
public class Module {
public final String semester;
public final HashSet<String> lvNumber;

View File

@@ -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<Event> {
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<Event> {
@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;
}
}