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

2
.idea/misc.xml generated
View File

@@ -25,5 +25,5 @@
</value> </value>
</option> </option>
</component> </component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" /> <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8 (2)" project-jdk-type="JavaSDK" />
</project> </project>

2
.idea/modules.xml generated
View File

@@ -2,7 +2,7 @@
<project version="4"> <project version="4">
<component name="ProjectModuleManager"> <component name="ProjectModuleManager">
<modules> <modules>
<module fileurl="file://$PROJECT_DIR$/FUPlanner.iml" filepath="$PROJECT_DIR$/FUPlanner.iml" /> <module fileurl="file://$PROJECT_DIR$/.idea/FUPlanner.iml" filepath="$PROJECT_DIR$/.idea/FUPlanner.iml" />
<module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" /> <module fileurl="file://$PROJECT_DIR$/app/app.iml" filepath="$PROJECT_DIR$/app/app.iml" />
</modules> </modules>
</component> </component>

1
.idea/vcs.xml generated
View File

@@ -2,5 +2,6 @@
<project version="4"> <project version="4">
<component name="VcsDirectoryMappings"> <component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" /> <mapping directory="" vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component> </component>
</project> </project>

View File

@@ -38,6 +38,10 @@ public class KVV {
public void logout() { public void logout() {
lastToken = null; lastToken = null;
KVVModuleList modules = (KVVModuleList) addons.get("modules");
if (modules != null) {
modules.deleteModules(this.context);
}
addons.clear(); addons.clear();
} }

View File

@@ -8,6 +8,7 @@ import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@@ -42,9 +43,36 @@ public class KVVModuleList extends HTTPService {
KVVModuleList(Context context, LoginToken token) { KVVModuleList(Context context, LoginToken token) {
super(context); super(context);
this.token = token; 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) { 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 -> { get("https://kvv.imp.fu-berlin.de/direct/site.json", token.getCookies(), response -> {
String body = response.getParsed(); String body = response.getParsed();
if (body == null) { if (body == null) {
@@ -82,11 +110,20 @@ public class KVVModuleList extends HTTPService {
errorCallback.onError(new NetworkError(101103, 403, "Cannot parse module list!")); errorCallback.onError(new NetworkError(101103, 403, "Cannot parse module list!"));
return; return;
} }
moduleList = modules; callback.onResponse(modules);
callback.onResponse(moduleList);
}, error -> errorCallback.onError(new NetworkError(101104, error.networkResponse.statusCode, "Cannot get module list!"))); }, 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) { public void getModule(int index, final NetworkCallback<Modules.Module> callback, final NetworkErrorCallback errorCallback) {
this.getModuleList(success -> callback.onResponse(success.get(index)), 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) { 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); AtomicInteger returns = new AtomicInteger(0);
AtomicReference<NetworkError> lastError = new AtomicReference<>(null); AtomicReference<NetworkError> lastError = new AtomicReference<>(null);
final int items = 4; final int items = 4;
@@ -116,10 +158,10 @@ public class KVVModuleList extends HTTPService {
} }
}; };
Runnable[] methods = { // UPDATE VARIABLE items ABOVE Runnable[] methods = { // UPDATE VARIABLE items ABOVE
() -> this.getAssignments(module, successCb, errorCb), () -> this.getAssignments(module, successCb, errorCb, forceOverride),
() -> this.getEvents(module, successCb, errorCb), () -> this.getEvents(module, successCb, errorCb, forceOverride),
() -> this.getAnnouncements(module, successCb, errorCb), () -> this.getAnnouncements(module, successCb, errorCb, forceOverride),
() -> this.getGradebook(module, successCb, errorCb) () -> this.getGradebook(module, successCb, errorCb, forceOverride)
}; };
//noinspection ConstantConditions //noinspection ConstantConditions
if (methods.length != items) throw new AssertionError(); 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) { 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(), () -> { queueModuleDetails.add(module.getID(), () -> {
if (module.announcements != null) { if (module.announcements != null && !forceOverride) {
callback.onResponse(module); callback.onResponse(module);
queueModuleDetails.next(module.getID()); queueModuleDetails.next(module.getID());
return; return;
@@ -183,12 +227,13 @@ public class KVVModuleList extends HTTPService {
public void getAssignments(Modules.Module module, final NetworkCallback<Modules.Module> callback, final NetworkErrorCallback errorCallback) { 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(), () -> { queueModuleDetails.add(module.getID(), () -> {
if (module.assignments != null) { if (module.assignments != null && !forceOverride) {
callback.onResponse(module); callback.onResponse(module);
queueModuleDetails.next(module.getID()); queueModuleDetails.next(module.getID());
return; return;
@@ -250,10 +295,13 @@ public class KVVModuleList extends HTTPService {
public void getEvents(Modules.Module module, final NetworkCallback<Modules.Module> callback, final NetworkErrorCallback errorCallback) { 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(), () -> { queueModuleDetails.add(module.getID(), () -> {
if (module.events != null) { if (module.events != null && !forceOverride) {
callback.onResponse(module); callback.onResponse(module);
queueModuleDetails.next(module.getID()); queueModuleDetails.next(module.getID());
return; return;
@@ -300,10 +348,15 @@ public class KVVModuleList extends HTTPService {
public void getGradebook(Modules.Module module, final NetworkCallback<Modules.Module> callback, final NetworkErrorCallback errorCallback) { 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(), () -> { queueModuleDetails.add(module.getID(), () -> {
if (module.gradebook != null) { if (module.gradebook != null && !forceOverride) {
callback.onResponse(module); callback.onResponse(module);
queueModuleDetails.next(module.getID()); queueModuleDetails.next(module.getID());
return; return;

View File

@@ -1,8 +1,16 @@
package de.sebse.fuplanner.services.KVV.types; package de.sebse.fuplanner.services.KVV.types;
import android.content.Context;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.v7.util.SortedList; 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.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
@@ -16,10 +24,11 @@ import de.sebse.fuplanner.tools.logging.Logger;
* Created by sebastian on 29.10.17. * 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 final SortedList<Module> list;
private String latestSemester = null; private String latestSemester = null;
private Logger log = new Logger(this); private Logger log = new Logger(this);
private static final String FILE_NAME = "ModuleListSaving";
public Modules() { public Modules() {
this.list = new SortedList<>(Module.class, new SortedList.Callback<Module>() { 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); 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 class Module {
public final String semester; public final String semester;
public final HashSet<String> lvNumber; public final HashSet<String> lvNumber;

View File

@@ -6,11 +6,10 @@ import java.util.Collections;
import java.util.Iterator; import java.util.Iterator;
import de.sebse.fuplanner.services.KVV.types.Event; import de.sebse.fuplanner.services.KVV.types.Event;
import de.sebse.fuplanner.tools.logging.Logger;
public class EventList extends ArrayList<Event> { public class EventList extends ArrayList<Event> {
private int split = 0; private int split = 0;
private Logger log = new Logger(this);
public Event getPast(int index) { public Event getPast(int index) {
if (split < 0) if (split < 0)
sort(); sort();
@@ -79,10 +78,8 @@ public class EventList extends ArrayList<Event> {
@Override @Override
public Event next() { public Event next() {
if (hasNext()) { if (hasNext()) {
log.d("Event hasnext", hasNext());
return EventList.this.get(i[0]++); return EventList.this.get(i[0]++);
} else { } else {
log.d("Event null", hasNext());
return null; return null;
} }
} }