From ada58327d77c22099add56a47aa1583064b720b5 Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Thu, 5 Jul 2018 00:20:37 +0200 Subject: [PATCH] Serialization working, Auto-save and load --- .../de/sebse/fuplanner/services/KVV/KVV.java | 62 +++++++++---------- .../fuplanner/services/KVV/KVVModuleList.java | 1 - .../services/KVV/types/Announcement.java | 4 +- .../services/KVV/types/Assignment.java | 3 +- .../fuplanner/services/KVV/types/Event.java | 3 +- .../services/KVV/types/Gradebook.java | 4 +- .../services/KVV/types/Lecturer.java | 3 +- .../services/KVV/types/LoginToken.java | 1 + .../fuplanner/services/KVV/types/Modules.java | 49 ++------------- .../fuplanner/tools/SortedModuleList.java | 37 +++++++++++ 10 files changed, 85 insertions(+), 82 deletions(-) create mode 100644 app/src/main/java/de/sebse/fuplanner/tools/SortedModuleList.java 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 ec2e618..c484196 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 @@ -1,9 +1,11 @@ package de.sebse.fuplanner.services.KVV; +import android.arch.core.util.Function; import android.content.Context; import android.support.annotation.NonNull; import android.util.Pair; +import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -66,14 +68,7 @@ public class KVV { } public void getModuleDetails(Modules.Module module, final NetworkCallback> callback, final NetworkErrorCallback error, boolean forceRefresh) { - this.getLastToken(token -> { - KVVModuleList modules = (KVVModuleList) addons.get("modules"); - if (modules == null) { - modules = new KVVModuleList(KVV.this.context, token); - addons.put("modules", modules); - } - modules.getModuleDetails(module, callback, error, forceRefresh); - }); + getModulePart(modules -> modules.getModuleDetails(module, saveOnCallback(modules, callback), error, forceRefresh)); } public void getModuleAnnouncements(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error) { @@ -81,14 +76,7 @@ public class KVV { } public void getModuleAnnouncements(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { - this.getLastToken(token -> { - KVVModuleList modules = (KVVModuleList) addons.get("modules"); - if (modules == null) { - modules = new KVVModuleList(KVV.this.context, token); - addons.put("modules", modules); - } - modules.getAnnouncements(module, callback, error, forceRefresh); - }); + getModulePart(modules -> modules.getAnnouncements(module, saveOnCallback(modules, callback), error, forceRefresh)); } public void getModuleAssignments(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error) { @@ -96,14 +84,7 @@ public class KVV { } public void getModuleAssignments(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { - this.getLastToken(token -> { - KVVModuleList modules = (KVVModuleList) addons.get("modules"); - if (modules == null) { - modules = new KVVModuleList(KVV.this.context, token); - addons.put("modules", modules); - } - modules.getAssignments(module, callback, error, forceRefresh); - }); + getModulePart(modules -> modules.getAssignments(module, saveOnCallback(modules, callback), error, forceRefresh)); } public void getModuleEvents(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error) { @@ -111,14 +92,7 @@ public class KVV { } public void getModuleEvents(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { - this.getLastToken(token -> { - KVVModuleList modules = (KVVModuleList) addons.get("modules"); - if (modules == null) { - modules = new KVVModuleList(KVV.this.context, token); - addons.put("modules", modules); - } - modules.getEvents(module, callback, error, forceRefresh); - }); + getModulePart(modules -> modules.getEvents(module, saveOnCallback(modules, callback), error, forceRefresh)); } public void getModuleGradebook(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error) { @@ -126,16 +100,38 @@ public class KVV { } public void getModuleGradebook(Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { + getModulePart(modules -> modules.getGradebook(module, saveOnCallback(modules, callback), error, forceRefresh)); + } + + + + private void getModulePart(ModListFunction func) { this.getLastToken(token -> { KVVModuleList modules = (KVVModuleList) addons.get("modules"); if (modules == null) { modules = new KVVModuleList(KVV.this.context, token); addons.put("modules", modules); } - modules.getGradebook(module, callback, error, forceRefresh); + func.apply(modules); }); } + private NetworkCallback saveOnCallback(KVVModuleList modules, NetworkCallback callback){ + return (success -> { + try { + modules.saveModules(this.context); + } catch (IOException e) { + e.printStackTrace(); + } + callback.onResponse(success); + }); + } + + @FunctionalInterface + interface ModListFunction { + void apply(KVVModuleList mod); + } + private void getLastToken(LastTokenCallback lastTokenCallback) { if (this.isUpdating) { this.updatingList.add(lastTokenCallback); 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 0eb7488..aa3a10d 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 @@ -38,7 +38,6 @@ import de.sebse.fuplanner.tools.network.NetworkErrorCallback; public class KVVModuleList extends HTTPService { private final LoginToken token; private Modules moduleList; - //private AsyncQueue, NetworkErrorCallback> queueUpgradeModule = new AsyncQueue<>(); private AsyncQueue queueModuleDetails = new AsyncQueue(); KVVModuleList(Context context, LoginToken token) { diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Announcement.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Announcement.java index bdf2d4e..961fd31 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Announcement.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Announcement.java @@ -1,6 +1,8 @@ package de.sebse.fuplanner.services.KVV.types; -public class Announcement { +import java.io.Serializable; + +public class Announcement implements Serializable { private final String id; private final String title; private final String body; diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Assignment.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Assignment.java index b9b288a..7203516 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Assignment.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Assignment.java @@ -1,10 +1,11 @@ package de.sebse.fuplanner.services.KVV.types; +import java.io.Serializable; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.Date; -public class Assignment { +public class Assignment implements Serializable { private final String id; private final String title; private final long dueTime; diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java index c4db484..727dec4 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Event.java @@ -1,8 +1,9 @@ package de.sebse.fuplanner.services.KVV.types; +import java.io.Serializable; import java.util.Date; -public class Event { +public class Event implements Serializable { private final String id; private final String type; private final String title; diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Gradebook.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Gradebook.java index 06f8c43..1f4f094 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Gradebook.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Gradebook.java @@ -1,6 +1,8 @@ package de.sebse.fuplanner.services.KVV.types; -public class Gradebook { +import java.io.Serializable; + +public class Gradebook implements Serializable { private final String itemName; private final String grade; private final double maxPoints; diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Lecturer.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Lecturer.java index 6e090cb..8131094 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Lecturer.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Lecturer.java @@ -1,9 +1,10 @@ package de.sebse.fuplanner.services.KVV.types; +import java.io.Serializable; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class Lecturer { +public class Lecturer implements Serializable { private final String firstname; private final String surname; private final String mail; diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java index fcb6e32..d69a654 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/LoginToken.java @@ -1,5 +1,6 @@ package de.sebse.fuplanner.services.KVV.types; +import java.io.Serializable; import java.util.HashMap; /** 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 afba01f..baf3f64 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 @@ -18,58 +18,21 @@ import java.util.Iterator; import de.sebse.fuplanner.tools.Compare; import de.sebse.fuplanner.tools.EventList; import de.sebse.fuplanner.tools.Regex; +import de.sebse.fuplanner.tools.SortedModuleList; import de.sebse.fuplanner.tools.logging.Logger; /** * Created by sebastian on 29.10.17. */ -public class Modules /*extends EventEmitter>>*/ implements Iterable, Serializable { - private final SortedList list; +public class Modules implements Iterable, Serializable { + private final SortedModuleList list; private String latestSemester = null; - private Logger log = new Logger(this); + private transient Logger log = new Logger(this); private static final String FILE_NAME = "ModuleListSaving"; public Modules() { - this.list = new SortedList<>(Module.class, new SortedList.Callback() { - @Override - public int compare(Module o1, Module o2) { - int semester = o1.semester.compareTo(o2.semester); - if (semester != 0) - return semester; - return o1.title.compareToIgnoreCase(o2.title); - } - - @Override - public void onChanged(int position, int count) { - - } - - @Override - public boolean areContentsTheSame(Module oldItem, Module newItem) { - return compare(oldItem, newItem) == 0; - } - - @Override - public boolean areItemsTheSame(Module item1, Module item2) { - return item1.ID.equals(item2.ID); - } - - @Override - public void onInserted(int position, int count) { - - } - - @Override - public void onRemoved(int position, int count) { - - } - - @Override - public void onMoved(int fromPosition, int toPosition) { - - } - }); + this.list = new SortedModuleList(); } public Module addModule(String semester, HashSet lvNumber, String title, HashSet lecturer, String type, String description, String ID) { @@ -213,7 +176,7 @@ public class Modules /*extends EventEmitter lvNumber; public final String title; diff --git a/app/src/main/java/de/sebse/fuplanner/tools/SortedModuleList.java b/app/src/main/java/de/sebse/fuplanner/tools/SortedModuleList.java new file mode 100644 index 0000000..8f5d4bf --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/tools/SortedModuleList.java @@ -0,0 +1,37 @@ +package de.sebse.fuplanner.tools; + +import java.io.Serializable; +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +import de.sebse.fuplanner.services.KVV.types.Modules; + +public class SortedModuleList extends AbstractList implements Serializable { + + private ArrayList internalList = new ArrayList(); + + // Note that add(E e) in AbstractList is calling this one + @Override + public void add(int position, Modules.Module e) { + internalList.add(e); + Collections.sort(internalList, (o1, o2) -> { + int semester = o1.semester.compareTo(o2.semester); + if (semester != 0) + return semester; + return o1.title.compareToIgnoreCase(o2.title); + }); + } + + @Override + public Modules.Module get(int i) { + return internalList.get(i); + } + + @Override + public int size() { + return internalList.size(); + } + +}