Updated ModDetails: Overview, Assignments, Announcements (not runnable)

This commit is contained in:
Caesar2011
2018-11-08 00:22:31 +01:00
parent e46a184f35
commit 57ce9ffa26
16 changed files with 285 additions and 121 deletions

View File

@@ -180,6 +180,7 @@ public class MainActivity extends AppCompatActivity
break; break;
case R.id.nav_logout: case R.id.nav_logout:
getNewKVV().account().logout(true); getNewKVV().account().logout(true);
getNewKVV().modules().list().delete();
this.getGoogleAuth().getLoginState(credentials -> { this.getGoogleAuth().getLoginState(credentials -> {
if (credentials != null) { if (credentials != null) {
this.getGoogleAuth().deleteLoginState(credentials.getUsername(), credentials.getPassword()); this.getGoogleAuth().deleteLoginState(credentials.getUsername(), credentials.getPassword());

View File

@@ -17,8 +17,8 @@ import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R; import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.Download; import de.sebse.fuplanner.services.KVV.Download;
import de.sebse.fuplanner.services.KVV.types.Announcement; import de.sebse.fuplanner.services.NewKVV.types.Announcement;
import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.services.NewKVV.types.Modules;
import de.sebse.fuplanner.tools.Regex; import de.sebse.fuplanner.tools.Regex;
import de.sebse.fuplanner.tools.UtilsDate; import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.logging.Logger;
@@ -76,12 +76,10 @@ class ModDetailAnnounceAdapter extends RecyclerView.Adapter<CustomViewHolder> {
tag.id = i; tag.id = i;
tag.layoutColor = ContextCompat.getColor(holder.mView.getContext(), R.color.colorFUBlue); tag.layoutColor = ContextCompat.getColor(holder.mView.getContext(), R.color.colorFUBlue);
holder.mTagGroup.addTag(tag); holder.mTagGroup.addTag(tag);
log.d(notes.get(i));
} }
holder.mTagGroup.setOnTagClickListener((tag, i) -> { holder.mTagGroup.setOnTagClickListener((tag, i) -> {
String s = notes.get(i); String s = notes.get(i);
if (s != null) { if (s != null) {
log.d("Download", s);
String name = urlToName(s, i, holder.mView.getResources()); String name = urlToName(s, i, holder.mView.getResources());
requestInterface.request(name, s); requestInterface.request(name, s);
} }

View File

@@ -6,17 +6,16 @@ import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ExpandableListView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R; import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.Download; import de.sebse.fuplanner.services.KVV.Download;
import de.sebse.fuplanner.services.KVV.KVV; import de.sebse.fuplanner.services.NewKVV.types.Modules;
import de.sebse.fuplanner.services.KVV.types.Modules;
import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.MainActivityListener;
import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.logging.Logger;
@@ -33,7 +32,7 @@ public class ModDetailAnnounceFragment extends Fragment implements Download.OnDo
private ModDetailAnnounceAdapter adapter; private ModDetailAnnounceAdapter adapter;
private SwipeRefreshLayout swipeLayout; private SwipeRefreshLayout swipeLayout;
private Download download; private Download download;
private MainActivityListener context; @Nullable private MainActivityListener mListener;
public ModDetailAnnounceFragment() { public ModDetailAnnounceFragment() {
@@ -83,49 +82,45 @@ public class ModDetailAnnounceFragment extends Fragment implements Download.OnDo
} }
private void refresh(boolean forceRefresh) { private void refresh(boolean forceRefresh) {
if (getActivity() != null) { if (mListener == null)
KVV kvv = ((MainActivity) getActivity()).getKVV(); return;
kvv.getModule(mItemPos, (Modules.Module module) -> { mListener.getNewKVV().modules().announcements().recv(mItemPos, success -> {
adapter.setModule(module); adapter.setModule(success);
kvv.getModuleAnnouncements(module, success1 -> { swipeLayout.setRefreshing(false);
adapter.setModule(); }, error -> {
swipeLayout.setRefreshing(false); swipeLayout.setRefreshing(false);
}, error -> { log.e(error);
swipeLayout.setRefreshing(false); }, forceRefresh);
log.e(error);
}, forceRefresh);
}, error -> {
swipeLayout.setRefreshing(false);
log.e(error);
}, forceRefresh);
}
} }
@Override @Override
public void request(String title, String url) { public void request(String title, String url) {
context.getKVV().getModule(mItemPos, (Modules.Module module) -> { if (mListener == null)
if (module == null) return;
return; mListener.getNewKVV().modules().list().find(mItemPos, (Modules.Module module) -> {
String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-"); String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-");
folderName += "/Assignment"; folderName += "/Assignment";
getDownload().openDownloadDialog(title, url, folderName); getDownload().openDownloadDialog(title, url, folderName);
}, log::e, false); }, log::e);
} }
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
if (context instanceof MainActivityListener) { if (context instanceof MainActivityListener) {
this.context = ((MainActivityListener) context); this.mListener = ((MainActivityListener) context);
this.context.addRequestPermissionsResultListener(getDownload().getRequestPermissionsResultListener(), "ModDetailAnnounceFragment"); this.mListener.addRequestPermissionsResultListener(getDownload().getRequestPermissionsResultListener(), "ModDetailAnnounceFragment");
} else } else
throw new RuntimeException(context.toString() + " must implement ModDetailAnnounceFragment"); throw new RuntimeException(context.toString() + " must implement MainActivityListener");
} }
@Override @Override
public void onDetach() { public void onDetach() {
super.onDetach(); super.onDetach();
this.context.removeRequestPermissionsResultListener("ModDetailResourceFragment"); if (this.mListener != null) {
this.mListener.removeRequestPermissionsResultListener("ModDetailAnnounceFragment");
this.mListener = null;
}
} }
Download getDownload() { Download getDownload() {

View File

@@ -17,8 +17,8 @@ import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R; import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.Download; import de.sebse.fuplanner.services.KVV.Download;
import de.sebse.fuplanner.services.KVV.types.Assignment; import de.sebse.fuplanner.services.NewKVV.types.Assignment;
import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.services.NewKVV.types.Modules;
import de.sebse.fuplanner.tools.Regex; import de.sebse.fuplanner.tools.Regex;
import de.sebse.fuplanner.tools.UtilsDate; import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.logging.Logger;
@@ -76,12 +76,10 @@ class ModDetailAssignmentAdapter extends RecyclerView.Adapter<CustomViewHolder>
tag.id = i; tag.id = i;
tag.layoutColor = ContextCompat.getColor(holder.mView.getContext(), R.color.colorFUBlue); tag.layoutColor = ContextCompat.getColor(holder.mView.getContext(), R.color.colorFUBlue);
holder.mTagGroup.addTag(tag); holder.mTagGroup.addTag(tag);
log.d(notes.get(i));
} }
holder.mTagGroup.setOnTagClickListener((tag, i) -> { holder.mTagGroup.setOnTagClickListener((tag, i) -> {
String s = notes.get(i); String s = notes.get(i);
if (s != null) { if (s != null) {
log.d("Download", s);
String name = urlToName(s, i, holder.mView.getResources()); String name = urlToName(s, i, holder.mView.getResources());
requestInterface.request(name, s); requestInterface.request(name, s);
} }

View File

@@ -6,17 +6,16 @@ import android.os.Bundle;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.widget.ExpandableListView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R; import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.Download; import de.sebse.fuplanner.services.KVV.Download;
import de.sebse.fuplanner.services.KVV.KVV; import de.sebse.fuplanner.services.NewKVV.types.Modules;
import de.sebse.fuplanner.services.KVV.types.Modules;
import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.MainActivityListener;
import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.logging.Logger;
@@ -33,7 +32,7 @@ public class ModDetailAssignmentFragment extends Fragment implements Download.On
private ModDetailAssignmentAdapter adapter; private ModDetailAssignmentAdapter adapter;
private SwipeRefreshLayout swipeLayout; private SwipeRefreshLayout swipeLayout;
private Download download; private Download download;
private MainActivityListener context; @Nullable private MainActivityListener mListener;
public ModDetailAssignmentFragment() { public ModDetailAssignmentFragment() {
@@ -83,41 +82,34 @@ public class ModDetailAssignmentFragment extends Fragment implements Download.On
} }
private void refresh(boolean forceRefresh) { private void refresh(boolean forceRefresh) {
if (getActivity() != null) { if (mListener == null)
KVV kvv = ((MainActivity) getActivity()).getKVV(); return;
kvv.getModule(mItemPos, (Modules.Module module) -> { mListener.getNewKVV().modules().assignments().recv(mItemPos, success -> {
adapter.setModule(module); adapter.setModule(success);
kvv.getModuleAssignments(module, success1 -> { swipeLayout.setRefreshing(false);
adapter.setModule(); }, error -> {
swipeLayout.setRefreshing(false); swipeLayout.setRefreshing(false);
}, error -> { log.e(error);
swipeLayout.setRefreshing(false); }, forceRefresh);
log.e(error);
}, forceRefresh);
}, error -> {
swipeLayout.setRefreshing(false);
log.e(error);
}, forceRefresh);
}
} }
@Override @Override
public void request(String title, String url) { public void request(String title, String url) {
context.getKVV().getModule(mItemPos, (Modules.Module module) -> { if (mListener == null)
if (module == null) return;
return; mListener.getNewKVV().modules().list().find(mItemPos, (Modules.Module module) -> {
String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-"); String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-");
folderName += "/Assignment"; folderName += "/Assignment";
getDownload().openDownloadDialog(title, url, folderName); getDownload().openDownloadDialog(title, url, folderName);
}, log::e, false); }, log::e);
} }
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context); super.onAttach(context);
if (context instanceof MainActivityListener) { if (context instanceof MainActivityListener) {
this.context = ((MainActivityListener) context); this.mListener = ((MainActivityListener) context);
this.context.addRequestPermissionsResultListener(getDownload().getRequestPermissionsResultListener(), "ModDetailAssignmentFragment"); this.mListener.addRequestPermissionsResultListener(getDownload().getRequestPermissionsResultListener(), "ModDetailAssignmentFragment");
} else } else
throw new RuntimeException(context.toString() + " must implement MainActivityListener"); throw new RuntimeException(context.toString() + " must implement MainActivityListener");
} }
@@ -125,7 +117,10 @@ public class ModDetailAssignmentFragment extends Fragment implements Download.On
@Override @Override
public void onDetach() { public void onDetach() {
super.onDetach(); super.onDetach();
this.context.removeRequestPermissionsResultListener("ModDetailAssignmentFragment"); if (this.mListener != null) {
this.mListener.removeRequestPermissionsResultListener("ModDetailAssignmentFragment");
this.mListener = null;
}
} }
Download getDownload() { Download getDownload() {

View File

@@ -13,10 +13,10 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import de.sebse.fuplanner.R; import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.types.Announcement; import de.sebse.fuplanner.services.NewKVV.types.Announcement;
import de.sebse.fuplanner.services.KVV.types.Assignment; import de.sebse.fuplanner.services.NewKVV.types.Assignment;
import de.sebse.fuplanner.services.KVV.types.Event; import de.sebse.fuplanner.services.NewKVV.types.Event;
import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.services.NewKVV.types.Modules;
import de.sebse.fuplanner.tools.UtilsDate; import de.sebse.fuplanner.tools.UtilsDate;
import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.logging.Logger;
import de.sebse.fuplanner.tools.ui.CustomViewHolder; import de.sebse.fuplanner.tools.ui.CustomViewHolder;

View File

@@ -17,6 +17,7 @@ import de.sebse.fuplanner.MainActivity;
import de.sebse.fuplanner.R; import de.sebse.fuplanner.R;
import de.sebse.fuplanner.services.KVV.KVV; import de.sebse.fuplanner.services.KVV.KVV;
import de.sebse.fuplanner.services.KVV.types.Modules; import de.sebse.fuplanner.services.KVV.types.Modules;
import de.sebse.fuplanner.tools.MainActivityListener;
import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.logging.Logger;
/** /**
@@ -31,7 +32,8 @@ public class ModDetailOverviewFragment extends Fragment {
private final Logger log = new Logger(this); private final Logger log = new Logger(this);
private ModDetailOverviewAdapter adapter; private ModDetailOverviewAdapter adapter;
private SwipeRefreshLayout swipeLayout; private SwipeRefreshLayout swipeLayout;
@Nullable private ModDetailListener mListener; @Nullable private ModDetailListener mDetailListener;
@Nullable private MainActivityListener mListener;
public ModDetailOverviewFragment() { public ModDetailOverviewFragment() {
@@ -70,7 +72,7 @@ public class ModDetailOverviewFragment extends Fragment {
Context context = view.getContext(); Context context = view.getContext();
RecyclerView recyclerView = view.findViewById(R.id.list); RecyclerView recyclerView = view.findViewById(R.id.list);
recyclerView.setLayoutManager(new LinearLayoutManager(context)); recyclerView.setLayoutManager(new LinearLayoutManager(context));
adapter = new ModDetailOverviewAdapter(mListener); adapter = new ModDetailOverviewAdapter(mDetailListener);
recyclerView.setAdapter(adapter); recyclerView.setAdapter(adapter);
// Getting SwipeContainerLayout // Getting SwipeContainerLayout
@@ -82,19 +84,15 @@ public class ModDetailOverviewFragment extends Fragment {
return view; return view;
} }
private void refresh(boolean forceRefresh) { private void refresh(boolean forceRefresh) {
if (getActivity() != null) { if (mListener != null) {
KVV kvv = ((MainActivity) getActivity()).getKVV(); mListener.getNewKVV().modules().details().recv(mItemPos, pair -> {
kvv.getModule(mItemPos, (Modules.Module module) -> { adapter.setModule(pair.first);
adapter.setModule(module); if (pair.second)
kvv.getModuleDetails(module, pair -> {
adapter.setModule();
if (pair.second)
swipeLayout.setRefreshing(false);
}, error -> {
swipeLayout.setRefreshing(false); swipeLayout.setRefreshing(false);
log.e(error);
}, forceRefresh);
}, error -> { }, error -> {
swipeLayout.setRefreshing(false); swipeLayout.setRefreshing(false);
log.e(error); log.e(error);
@@ -104,15 +102,27 @@ public class ModDetailOverviewFragment extends Fragment {
@Override @Override
public void onAttach(Context context) { public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof MainActivityListener) {
this.mListener = ((MainActivityListener) context);
} else
throw new RuntimeException(context.toString() + " must implement MainActivityListener");
super.onAttach(context); super.onAttach(context);
Fragment parentFragment = getParentFragment(); Fragment parentFragment = getParentFragment();
if (parentFragment != null) { if (parentFragment != null) {
if (parentFragment instanceof ModDetailListener) { if (parentFragment instanceof ModDetailListener) {
mListener = (ModDetailListener) parentFragment; mDetailListener = (ModDetailListener) parentFragment;
} else { } else {
throw new RuntimeException(context.toString() throw new RuntimeException(context.toString() + " must implement ModDetailListener");
+ " must implement ModDetailListener");
} }
} else log.w("No parent fragment!"); } else log.w("No parent fragment!");
} }
@Override
public void onDetach() {
super.onDetach();
this.mListener = null;
}
} }

View File

@@ -7,37 +7,54 @@ import org.jetbrains.annotations.NotNull;
import java.util.HashMap; import java.util.HashMap;
public class KVVModules { public class KVVModules {
private final HashMap<String, Object> addons = new HashMap<>(); private final HashMap<String, Part> mAddons = new HashMap<>();
private final KVVLogin login; private KVVModulesList mList = null;
private final KVVLogin mLogin;
private final Context context; private final Context context;
public KVVModules(KVVLogin login, Context context) { public KVVModules(KVVLogin login, Context context) {
this.login = login; this.mLogin = login;
this.context = context; this.context = context;
} }
@NotNull
public KVVModulesDetails details() {
return (KVVModulesDetails) addAndGet("details", () -> {
ModulesPart[] parts = {announcements(), assignments()};
return new KVVModulesDetails(mLogin, list(), context, parts);
});
}
@NotNull @NotNull
public KVVModulesAnnouncements announcements() { public KVVModulesAnnouncements announcements() {
return (KVVModulesAnnouncements) addAndGet("announcements", () -> new KVVModulesAnnouncements(login, list(), context)); return (KVVModulesAnnouncements) addAndGet("announcements", () -> new KVVModulesAnnouncements(mLogin, list(), context));
}
@NotNull
public KVVModulesAssignments assignments() {
return (KVVModulesAssignments) addAndGet("assignments", () -> new KVVModulesAssignments(mLogin, list(), context));
} }
@NotNull @NotNull
public KVVModulesList list() { public KVVModulesList list() {
return (KVVModulesList) addAndGet("list", () -> new KVVModulesList(login, context)); if (mList == null) {
mList = new KVVModulesList(mLogin, context);
}
return mList;
} }
@NotNull @NotNull
private Object addAndGet(@NotNull String addon, @NotNull ModuleCreatorInterface creatorInterface) { private Part addAndGet(@NotNull String addon, @NotNull ModuleCreatorInterface creatorInterface) {
Object o = addons.get(addon); Part o = mAddons.get(addon);
if (o == null) { if (o == null) {
o = creatorInterface.create(); o = creatorInterface.create();
addons.put(addon, o); mAddons.put(addon, o);
} }
return o; return o;
} }
private interface ModuleCreatorInterface { private interface ModuleCreatorInterface {
@NotNull Object create(); @NotNull Part create();
} }
} }

View File

@@ -1,9 +1,6 @@
package de.sebse.fuplanner.services.NewKVV; package de.sebse.fuplanner.services.NewKVV;
import android.content.Context; import android.content.Context;
import android.os.Build;
import android.text.Html;
import android.text.Spanned;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
@@ -17,7 +14,7 @@ import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError; import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback; import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
class KVVModulesAnnouncements extends ModulesPart<ArrayList<Announcement>> { public class KVVModulesAnnouncements extends ModulesPart<ArrayList<Announcement>> {
KVVModulesAnnouncements(KVVLogin login, KVVModulesList list, Context context) { KVVModulesAnnouncements(KVVLogin login, KVVModulesList list, Context context) {
super(login, list, context); super(login, list, context);
@@ -30,16 +27,14 @@ class KVVModulesAnnouncements extends ModulesPart<ArrayList<Announcement>> {
@Override @Override
protected boolean setPart(Modules.Module module, ArrayList<Announcement> part) { protected boolean setPart(Modules.Module module, ArrayList<Announcement> part) {
boolean changed = false; boolean changed = module.announcements == null || module.announcements.hashCode() != part.hashCode();
if (module.announcements != null && module.announcements.hashCode() != part.hashCode())
changed = true;
module.announcements = part; module.announcements = part;
return changed; return changed;
} }
@Override @Override
protected void upgrade(final String ID, final NetworkCallback<ArrayList<Announcement>> callback, final NetworkErrorCallback errorCallback) { protected void upgrade(final String ID, final NetworkCallback<ArrayList<Announcement>> callback, final NetworkErrorCallback errorCallback) {
if (!login.isInOnlineMode()) { if (!login.isInOnlineMode() || login.getLoginToken() == null) {
errorCallback.onError(new NetworkError(101204, 500, "Currently running in offline mode!")); errorCallback.onError(new NetworkError(101204, 500, "Currently running in offline mode!"));
return; return;
} }

View File

@@ -0,0 +1,81 @@
package de.sebse.fuplanner.services.NewKVV;
import android.content.Context;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import de.sebse.fuplanner.services.NewKVV.types.Assignment;
import de.sebse.fuplanner.services.NewKVV.types.AssignmentList;
import de.sebse.fuplanner.services.NewKVV.types.Modules;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
public class KVVModulesAssignments extends ModulesPart<AssignmentList> {
KVVModulesAssignments(KVVLogin login, KVVModulesList list, Context context) {
super(login, list, context);
}
@Override
protected AssignmentList getPart(Modules.Module module) {
return module.assignments;
}
@Override
protected boolean setPart(Modules.Module module, AssignmentList part) {
boolean changed = module.assignments == null || module.assignments.hashCode() != part.hashCode();
module.assignments = part;
return changed;
}
@Override
protected void upgrade(final String ID, final NetworkCallback<AssignmentList> callback, final NetworkErrorCallback errorCallback) {
if (!login.isInOnlineMode() || login.getLoginToken() == null) {
errorCallback.onError(new NetworkError(101304, 500, "Currently running in offline mode!"));
return;
}
get(String.format("https://kvv.imp.fu-berlin.de/direct/assignment/site/%s.json", ID), login.getLoginToken().getCookies(), response ->{
String body = response.getParsed();
if (body == null) {
errorCallback.onError(new NetworkError(101301, 403, "No assignments retrieved!"));
return;
}
AssignmentList assignments = new AssignmentList();
try {
JSONObject json = new JSONObject(body);
JSONArray sites = json.getJSONArray("assignment_collection");
for (int i = 0; i < sites.length(); i++) {
JSONObject site = sites.getJSONObject(i);
String id = site.getString("id");
String title = site.getString("title");
String instructions = site.getString("instructions");
instructions = String.valueOf(fromHtml(instructions));
long dueTime = site.getJSONObject("dueTime").getLong("time");
String gradebookItemName = site.optString("gradebookItemName", null);
String gradeScale = site.getString("gradeScale");
JSONArray attachments = site.getJSONArray("attachments");
ArrayList<String> urls = new ArrayList<>();
for (int j = 0; j<attachments.length(); j++){
urls.add(attachments.getJSONObject(j).getString("url"));
}
assignments.add(0, new Assignment(id, title, dueTime, gradebookItemName, gradeScale, urls, instructions));
}
} catch (JSONException e) {
e.printStackTrace();
errorCallback.onError(new NetworkError(101302, 403, "Cannot parse announcements!"));
return;
}
// Empty assignments *may be* because token is invalid -> check
if (assignments.size() == 0)
login.testLoginToken(token -> callback.onResponse(assignments), errorCallback);
else
callback.onResponse(assignments);
}, error -> errorCallback.onError(new NetworkError(101303, error.networkResponse.statusCode, "Cannot get announcements!")));
}
}

View File

@@ -0,0 +1,47 @@
package de.sebse.fuplanner.services.NewKVV;
import android.content.Context;
import android.util.Pair;
import java.util.concurrent.atomic.AtomicReference;
import de.sebse.fuplanner.services.NewKVV.types.Modules;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkError;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
final public class KVVModulesDetails extends Part<Pair<Modules.Module, Boolean>> {
private final ModulesPart[] parts;
KVVModulesDetails(KVVLogin login, KVVModulesList list, Context context, ModulesPart[] parts) {
super(login, list, context);
this.parts = parts;
}
@Override
protected void recv(final Modules.Module module, final NetworkCallback<Pair<Modules.Module, Boolean>> callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries) {
final int[] returned = {0};
AtomicReference<NetworkError> lastError = new AtomicReference<>(null);
NetworkCallback<Modules.Module> successCb = success -> {
returned[0] += 1;
callback.onResponse(Pair.create(module, false));
if (returned[0] == parts.length) {
callback.onResponse(Pair.create(module, true));
if (lastError.get() != null)
errorCallback.onError(lastError.get());
}
};
NetworkErrorCallback errorCb = error -> {
lastError.set(error);
returned[0] += 1;
if (returned[0] == parts.length) {
callback.onResponse(Pair.create(module, true));
if (lastError.get() != null)
errorCallback.onError(lastError.get());
}
};
for (ModulesPart part: parts) {
part.recv(module, successCb, errorCb, forceRefresh, RETRY_COUNT);
}
}
}

View File

@@ -51,7 +51,7 @@ public class KVVModulesList extends HTTPService {
} }
private void find(String moduleID, NetworkCallback<Modules.Module> moduleNetworkCallback, NetworkErrorCallback errorCallback, int retries) { private void find(String moduleID, NetworkCallback<Modules.Module> moduleNetworkCallback, NetworkErrorCallback errorCallback, int retries) {
if (mModules != null && mLogin.getLoginToken() != null && mLogin.getLoginToken().isSameUser(mModules.getUsername())) if (mModules != null && mLogin.getLoginToken() != null && !mLogin.getLoginToken().isSameUser(mModules.getUsername()))
delete(); delete();
if (retries < 0) { if (retries < 0) {
errorCallback.onError(new NetworkError(101107, -1, "Too many retries!")); errorCallback.onError(new NetworkError(101107, -1, "Too many retries!"));
@@ -68,6 +68,7 @@ public class KVVModulesList extends HTTPService {
} }
void store() { void store() {
log.d("Save data");
if (this.mModules != null) { if (this.mModules != null) {
try { try {
this.mModules.save(getContext()); this.mModules.save(getContext());
@@ -88,7 +89,7 @@ public class KVVModulesList extends HTTPService {
} }
} }
private void delete() { public void delete() {
if (this.mModules != null) { if (this.mModules != null) {
this.mModules.delete(getContext()); this.mModules.delete(getContext());
this.mModules = null; this.mModules = null;
@@ -104,7 +105,7 @@ public class KVVModulesList extends HTTPService {
} }
private void recv(final NetworkCallback<Modules> callback, final NetworkErrorCallback errorCallback, boolean forceRefresh, final int retries) { private void recv(final NetworkCallback<Modules> callback, final NetworkErrorCallback errorCallback, boolean forceRefresh, final int retries) {
if (mModules != null && mLogin.getLoginToken() != null && mLogin.getLoginToken().isSameUser(mModules.getUsername())) if (mModules != null && mLogin.getLoginToken() != null && !mLogin.getLoginToken().isSameUser(mModules.getUsername()))
delete(); delete();
mQueue.add(() -> { mQueue.add(() -> {
if (this.mModules != null && !forceRefresh) { if (this.mModules != null && !forceRefresh) {
@@ -117,6 +118,7 @@ public class KVVModulesList extends HTTPService {
this.mModules = success; this.mModules = success;
else else
this.mModules.updateList(success); this.mModules.updateList(success);
store();
callback.onResponse(this.mModules); callback.onResponse(this.mModules);
mQueue.next(); mQueue.next();
}, error -> { }, error -> {

View File

@@ -7,31 +7,18 @@ import android.text.Spanned;
import de.sebse.fuplanner.services.NewKVV.types.Modules; import de.sebse.fuplanner.services.NewKVV.types.Modules;
import de.sebse.fuplanner.tools.NewAsyncQueue; import de.sebse.fuplanner.tools.NewAsyncQueue;
import de.sebse.fuplanner.tools.network.HTTPService;
import de.sebse.fuplanner.tools.network.NetworkCallback; import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback; import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
public abstract class ModulesPart<T> extends HTTPService { abstract class ModulesPart<T> extends Part<Modules.Module> {
static final int RETRY_COUNT = 1;
protected final KVVLogin login;
protected final KVVModulesList list;
private NewAsyncQueue queue = new NewAsyncQueue(); private NewAsyncQueue queue = new NewAsyncQueue();
ModulesPart(KVVLogin login, KVVModulesList list, Context context) { ModulesPart(KVVLogin login, KVVModulesList list, Context context) {
super(context); super(login, list, context);
this.login = login;
this.list = list;
} }
public void recv(final String moduleID, final NetworkCallback<Modules.Module> callback, final NetworkErrorCallback errorCallback) { @Override
recv(moduleID, callback, errorCallback, false); protected void recv(final Modules.Module module, final NetworkCallback<Modules.Module> callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries) {
}
public void recv(final String moduleID, final NetworkCallback<Modules.Module> callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh) {
list.find(moduleID, success -> recv(success, callback, errorCallback, forceRefresh, RETRY_COUNT), errorCallback);
}
private void recv(final Modules.Module module, final NetworkCallback<Modules.Module> callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries) {
queue.add(() -> { queue.add(() -> {
if (getPart(module) != null && !forceRefresh) { if (getPart(module) != null && !forceRefresh) {
callback.onResponse(module); callback.onResponse(module);

View File

@@ -0,0 +1,31 @@
package de.sebse.fuplanner.services.NewKVV;
import android.content.Context;
import de.sebse.fuplanner.services.NewKVV.types.Modules;
import de.sebse.fuplanner.tools.NewAsyncQueue;
import de.sebse.fuplanner.tools.network.HTTPService;
import de.sebse.fuplanner.tools.network.NetworkCallback;
import de.sebse.fuplanner.tools.network.NetworkErrorCallback;
public abstract class Part<T> extends HTTPService {
static final int RETRY_COUNT = 1;
protected final KVVLogin login;
protected final KVVModulesList list;
Part(KVVLogin login, KVVModulesList list, Context context) {
super(context);
this.login = login;
this.list = list;
}
public void recv(final String moduleID, final NetworkCallback<T> callback, final NetworkErrorCallback errorCallback) {
recv(moduleID, callback, errorCallback, false);
}
public void recv(final String moduleID, final NetworkCallback<T> callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh) {
list.find(moduleID, success -> recv(success, callback, errorCallback, forceRefresh, RETRY_COUNT), errorCallback);
}
abstract protected void recv(final Modules.Module module, final NetworkCallback<T> callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries);
}

View File

@@ -1,5 +1,7 @@
package de.sebse.fuplanner.services.NewKVV.types; package de.sebse.fuplanner.services.NewKVV.types;
import com.google.android.gms.common.internal.Objects;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
@@ -15,7 +17,6 @@ public class Assignment implements Serializable {
this.title = title; this.title = title;
this.dueTime = dueTime; this.dueTime = dueTime;
this.urls = urls; this.urls = urls;
//this.grade = grade;
this.instructions = instructions; this.instructions = instructions;
} }
@@ -50,4 +51,9 @@ public class Assignment implements Serializable {
"\nDue date: "+getDueDate()+ "\nDue date: "+getDueDate()+
"\nInstructions: "+getInstructions().substring(0, Math.min(getInstructions().length(), 100)); "\nInstructions: "+getInstructions().substring(0, Math.min(getInstructions().length(), 100));
} }
@Override
public int hashCode() {
return Objects.hashCode(getId(), getDueDate(), getInstructions(), getTitle(), getUrls());
}
} }

View File

@@ -15,6 +15,7 @@ public interface MainActivityListener {
void showToast(@StringRes int msgStringRes); void showToast(@StringRes int msgStringRes);
@Deprecated
KVV getKVV(); KVV getKVV();
de.sebse.fuplanner.services.NewKVV.KVV getNewKVV(); de.sebse.fuplanner.services.NewKVV.KVV getNewKVV();