From 57ce9ffa26b01775d873a25054619985f2adb449 Mon Sep 17 00:00:00 2001 From: Caesar2011 Date: Thu, 8 Nov 2018 00:22:31 +0100 Subject: [PATCH] Updated ModDetails: Overview, Assignments, Announcements (not runnable) --- .../java/de/sebse/fuplanner/MainActivity.java | 1 + .../moddetails/ModDetailAnnounceAdapter.java | 6 +- .../moddetails/ModDetailAnnounceFragment.java | 51 ++++++------ .../ModDetailAssignmentAdapter.java | 6 +- .../ModDetailAssignmentFragment.java | 49 +++++------ .../moddetails/ModDetailOverviewAdapter.java | 8 +- .../moddetails/ModDetailOverviewFragment.java | 42 ++++++---- .../fuplanner/services/NewKVV/KVVModules.java | 35 +++++--- .../NewKVV/KVVModulesAnnouncements.java | 11 +-- .../NewKVV/KVVModulesAssignments.java | 81 +++++++++++++++++++ .../services/NewKVV/KVVModulesDetails.java | 47 +++++++++++ .../services/NewKVV/KVVModulesList.java | 8 +- .../services/NewKVV/ModulesPart.java | 21 +---- .../sebse/fuplanner/services/NewKVV/Part.java | 31 +++++++ .../services/NewKVV/types/Assignment.java | 8 +- .../fuplanner/tools/MainActivityListener.java | 1 + 16 files changed, 285 insertions(+), 121 deletions(-) create mode 100644 app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesAssignments.java create mode 100644 app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesDetails.java create mode 100644 app/src/main/java/de/sebse/fuplanner/services/NewKVV/Part.java diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index b2cd54b..d1a1769 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -180,6 +180,7 @@ public class MainActivity extends AppCompatActivity break; case R.id.nav_logout: getNewKVV().account().logout(true); + getNewKVV().modules().list().delete(); this.getGoogleAuth().getLoginState(credentials -> { if (credentials != null) { this.getGoogleAuth().deleteLoginState(credentials.getUsername(), credentials.getPassword()); diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java index d35f26f..6e1c49b 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceAdapter.java @@ -17,8 +17,8 @@ import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.KVV.Download; -import de.sebse.fuplanner.services.KVV.types.Announcement; -import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.services.NewKVV.types.Announcement; +import de.sebse.fuplanner.services.NewKVV.types.Modules; import de.sebse.fuplanner.tools.Regex; import de.sebse.fuplanner.tools.UtilsDate; import de.sebse.fuplanner.tools.logging.Logger; @@ -76,12 +76,10 @@ class ModDetailAnnounceAdapter extends RecyclerView.Adapter { tag.id = i; tag.layoutColor = ContextCompat.getColor(holder.mView.getContext(), R.color.colorFUBlue); holder.mTagGroup.addTag(tag); - log.d(notes.get(i)); } holder.mTagGroup.setOnTagClickListener((tag, i) -> { String s = notes.get(i); if (s != null) { - log.d("Download", s); String name = urlToName(s, i, holder.mView.getResources()); requestInterface.request(name, s); } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java index 52f3713..4b4d34a 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAnnounceFragment.java @@ -6,17 +6,16 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ExpandableListView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.KVV.Download; -import de.sebse.fuplanner.services.KVV.KVV; -import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.services.NewKVV.types.Modules; import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; @@ -33,7 +32,7 @@ public class ModDetailAnnounceFragment extends Fragment implements Download.OnDo private ModDetailAnnounceAdapter adapter; private SwipeRefreshLayout swipeLayout; private Download download; - private MainActivityListener context; + @Nullable private MainActivityListener mListener; public ModDetailAnnounceFragment() { @@ -83,49 +82,45 @@ public class ModDetailAnnounceFragment extends Fragment implements Download.OnDo } private void refresh(boolean forceRefresh) { - if (getActivity() != null) { - KVV kvv = ((MainActivity) getActivity()).getKVV(); - kvv.getModule(mItemPos, (Modules.Module module) -> { - adapter.setModule(module); - kvv.getModuleAnnouncements(module, success1 -> { - adapter.setModule(); - swipeLayout.setRefreshing(false); - }, error -> { - swipeLayout.setRefreshing(false); - log.e(error); - }, forceRefresh); - }, error -> { - swipeLayout.setRefreshing(false); - log.e(error); - }, forceRefresh); - } + if (mListener == null) + return; + mListener.getNewKVV().modules().announcements().recv(mItemPos, success -> { + adapter.setModule(success); + swipeLayout.setRefreshing(false); + }, error -> { + swipeLayout.setRefreshing(false); + log.e(error); + }, forceRefresh); } @Override public void request(String title, String url) { - context.getKVV().getModule(mItemPos, (Modules.Module module) -> { - if (module == null) - return; + if (mListener == null) + return; + mListener.getNewKVV().modules().list().find(mItemPos, (Modules.Module module) -> { String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-"); folderName += "/Assignment"; getDownload().openDownloadDialog(title, url, folderName); - }, log::e, false); + }, log::e); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof MainActivityListener) { - this.context = ((MainActivityListener) context); - this.context.addRequestPermissionsResultListener(getDownload().getRequestPermissionsResultListener(), "ModDetailAnnounceFragment"); + this.mListener = ((MainActivityListener) context); + this.mListener.addRequestPermissionsResultListener(getDownload().getRequestPermissionsResultListener(), "ModDetailAnnounceFragment"); } else - throw new RuntimeException(context.toString() + " must implement ModDetailAnnounceFragment"); + throw new RuntimeException(context.toString() + " must implement MainActivityListener"); } @Override public void onDetach() { super.onDetach(); - this.context.removeRequestPermissionsResultListener("ModDetailResourceFragment"); + if (this.mListener != null) { + this.mListener.removeRequestPermissionsResultListener("ModDetailAnnounceFragment"); + this.mListener = null; + } } Download getDownload() { diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java index e695666..fb33aa8 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentAdapter.java @@ -17,8 +17,8 @@ import androidx.core.content.ContextCompat; import androidx.recyclerview.widget.RecyclerView; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.KVV.Download; -import de.sebse.fuplanner.services.KVV.types.Assignment; -import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.services.NewKVV.types.Assignment; +import de.sebse.fuplanner.services.NewKVV.types.Modules; import de.sebse.fuplanner.tools.Regex; import de.sebse.fuplanner.tools.UtilsDate; import de.sebse.fuplanner.tools.logging.Logger; @@ -76,12 +76,10 @@ class ModDetailAssignmentAdapter extends RecyclerView.Adapter tag.id = i; tag.layoutColor = ContextCompat.getColor(holder.mView.getContext(), R.color.colorFUBlue); holder.mTagGroup.addTag(tag); - log.d(notes.get(i)); } holder.mTagGroup.setOnTagClickListener((tag, i) -> { String s = notes.get(i); if (s != null) { - log.d("Download", s); String name = urlToName(s, i, holder.mView.getResources()); requestInterface.request(name, s); } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java index a3225d9..5396532 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAssignmentFragment.java @@ -6,17 +6,16 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.ExpandableListView; import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.KVV.Download; -import de.sebse.fuplanner.services.KVV.KVV; -import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.services.NewKVV.types.Modules; import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; @@ -33,7 +32,7 @@ public class ModDetailAssignmentFragment extends Fragment implements Download.On private ModDetailAssignmentAdapter adapter; private SwipeRefreshLayout swipeLayout; private Download download; - private MainActivityListener context; + @Nullable private MainActivityListener mListener; public ModDetailAssignmentFragment() { @@ -83,41 +82,34 @@ public class ModDetailAssignmentFragment extends Fragment implements Download.On } private void refresh(boolean forceRefresh) { - if (getActivity() != null) { - KVV kvv = ((MainActivity) getActivity()).getKVV(); - kvv.getModule(mItemPos, (Modules.Module module) -> { - adapter.setModule(module); - kvv.getModuleAssignments(module, success1 -> { - adapter.setModule(); - swipeLayout.setRefreshing(false); - }, error -> { - swipeLayout.setRefreshing(false); - log.e(error); - }, forceRefresh); - }, error -> { - swipeLayout.setRefreshing(false); - log.e(error); - }, forceRefresh); - } + if (mListener == null) + return; + mListener.getNewKVV().modules().assignments().recv(mItemPos, success -> { + adapter.setModule(success); + swipeLayout.setRefreshing(false); + }, error -> { + swipeLayout.setRefreshing(false); + log.e(error); + }, forceRefresh); } @Override public void request(String title, String url) { - context.getKVV().getModule(mItemPos, (Modules.Module module) -> { - if (module == null) - return; + if (mListener == null) + return; + mListener.getNewKVV().modules().list().find(mItemPos, (Modules.Module module) -> { String folderName = "FU-"+module.title.replaceAll("[:*<>|/\"\\\\]", "-"); folderName += "/Assignment"; getDownload().openDownloadDialog(title, url, folderName); - }, log::e, false); + }, log::e); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof MainActivityListener) { - this.context = ((MainActivityListener) context); - this.context.addRequestPermissionsResultListener(getDownload().getRequestPermissionsResultListener(), "ModDetailAssignmentFragment"); + this.mListener = ((MainActivityListener) context); + this.mListener.addRequestPermissionsResultListener(getDownload().getRequestPermissionsResultListener(), "ModDetailAssignmentFragment"); } else throw new RuntimeException(context.toString() + " must implement MainActivityListener"); } @@ -125,7 +117,10 @@ public class ModDetailAssignmentFragment extends Fragment implements Download.On @Override public void onDetach() { super.onDetach(); - this.context.removeRequestPermissionsResultListener("ModDetailAssignmentFragment"); + if (this.mListener != null) { + this.mListener.removeRequestPermissionsResultListener("ModDetailAssignmentFragment"); + this.mListener = null; + } } Download getDownload() { diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java index aca5eb7..1728f64 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewAdapter.java @@ -13,10 +13,10 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.recyclerview.widget.RecyclerView; import de.sebse.fuplanner.R; -import de.sebse.fuplanner.services.KVV.types.Announcement; -import de.sebse.fuplanner.services.KVV.types.Assignment; -import de.sebse.fuplanner.services.KVV.types.Event; -import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.services.NewKVV.types.Announcement; +import de.sebse.fuplanner.services.NewKVV.types.Assignment; +import de.sebse.fuplanner.services.NewKVV.types.Event; +import de.sebse.fuplanner.services.NewKVV.types.Modules; import de.sebse.fuplanner.tools.UtilsDate; import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.ui.CustomViewHolder; diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java index ae8c7ec..df03414 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailOverviewFragment.java @@ -17,6 +17,7 @@ import de.sebse.fuplanner.MainActivity; import de.sebse.fuplanner.R; import de.sebse.fuplanner.services.KVV.KVV; import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; /** @@ -31,7 +32,8 @@ public class ModDetailOverviewFragment extends Fragment { private final Logger log = new Logger(this); private ModDetailOverviewAdapter adapter; private SwipeRefreshLayout swipeLayout; - @Nullable private ModDetailListener mListener; + @Nullable private ModDetailListener mDetailListener; + @Nullable private MainActivityListener mListener; public ModDetailOverviewFragment() { @@ -70,7 +72,7 @@ public class ModDetailOverviewFragment extends Fragment { Context context = view.getContext(); RecyclerView recyclerView = view.findViewById(R.id.list); recyclerView.setLayoutManager(new LinearLayoutManager(context)); - adapter = new ModDetailOverviewAdapter(mListener); + adapter = new ModDetailOverviewAdapter(mDetailListener); recyclerView.setAdapter(adapter); // Getting SwipeContainerLayout @@ -82,19 +84,15 @@ public class ModDetailOverviewFragment extends Fragment { return view; } + + + private void refresh(boolean forceRefresh) { - if (getActivity() != null) { - KVV kvv = ((MainActivity) getActivity()).getKVV(); - kvv.getModule(mItemPos, (Modules.Module module) -> { - adapter.setModule(module); - kvv.getModuleDetails(module, pair -> { - adapter.setModule(); - if (pair.second) - swipeLayout.setRefreshing(false); - }, error -> { + if (mListener != null) { + mListener.getNewKVV().modules().details().recv(mItemPos, pair -> { + adapter.setModule(pair.first); + if (pair.second) swipeLayout.setRefreshing(false); - log.e(error); - }, forceRefresh); }, error -> { swipeLayout.setRefreshing(false); log.e(error); @@ -104,15 +102,27 @@ public class ModDetailOverviewFragment extends Fragment { @Override 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); Fragment parentFragment = getParentFragment(); if (parentFragment != null) { if (parentFragment instanceof ModDetailListener) { - mListener = (ModDetailListener) parentFragment; + mDetailListener = (ModDetailListener) parentFragment; } else { - throw new RuntimeException(context.toString() - + " must implement ModDetailListener"); + throw new RuntimeException(context.toString() + " must implement ModDetailListener"); } } else log.w("No parent fragment!"); } + + @Override + public void onDetach() { + super.onDetach(); + this.mListener = null; + } } diff --git a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModules.java b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModules.java index 546a057..ecc6aad 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModules.java +++ b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModules.java @@ -7,37 +7,54 @@ import org.jetbrains.annotations.NotNull; import java.util.HashMap; public class KVVModules { - private final HashMap addons = new HashMap<>(); - private final KVVLogin login; + private final HashMap mAddons = new HashMap<>(); + private KVVModulesList mList = null; + private final KVVLogin mLogin; private final Context context; public KVVModules(KVVLogin login, Context context) { - this.login = login; + this.mLogin = login; this.context = context; } + @NotNull + public KVVModulesDetails details() { + return (KVVModulesDetails) addAndGet("details", () -> { + ModulesPart[] parts = {announcements(), assignments()}; + return new KVVModulesDetails(mLogin, list(), context, parts); + }); + } + @NotNull 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 public KVVModulesList list() { - return (KVVModulesList) addAndGet("list", () -> new KVVModulesList(login, context)); + if (mList == null) { + mList = new KVVModulesList(mLogin, context); + } + return mList; } @NotNull - private Object addAndGet(@NotNull String addon, @NotNull ModuleCreatorInterface creatorInterface) { - Object o = addons.get(addon); + private Part addAndGet(@NotNull String addon, @NotNull ModuleCreatorInterface creatorInterface) { + Part o = mAddons.get(addon); if (o == null) { o = creatorInterface.create(); - addons.put(addon, o); + mAddons.put(addon, o); } return o; } private interface ModuleCreatorInterface { - @NotNull Object create(); + @NotNull Part create(); } } diff --git a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesAnnouncements.java b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesAnnouncements.java index 90e60c2..ed0fa02 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesAnnouncements.java +++ b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesAnnouncements.java @@ -1,9 +1,6 @@ package de.sebse.fuplanner.services.NewKVV; import android.content.Context; -import android.os.Build; -import android.text.Html; -import android.text.Spanned; import org.json.JSONArray; 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.NetworkErrorCallback; -class KVVModulesAnnouncements extends ModulesPart> { +public class KVVModulesAnnouncements extends ModulesPart> { KVVModulesAnnouncements(KVVLogin login, KVVModulesList list, Context context) { super(login, list, context); @@ -30,16 +27,14 @@ class KVVModulesAnnouncements extends ModulesPart> { @Override protected boolean setPart(Modules.Module module, ArrayList part) { - boolean changed = false; - if (module.announcements != null && module.announcements.hashCode() != part.hashCode()) - changed = true; + boolean changed = module.announcements == null || module.announcements.hashCode() != part.hashCode(); module.announcements = part; return changed; } @Override protected void upgrade(final String ID, final NetworkCallback> callback, final NetworkErrorCallback errorCallback) { - if (!login.isInOnlineMode()) { + if (!login.isInOnlineMode() || login.getLoginToken() == null) { errorCallback.onError(new NetworkError(101204, 500, "Currently running in offline mode!")); return; } diff --git a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesAssignments.java b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesAssignments.java new file mode 100644 index 0000000..d8eaa2a --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesAssignments.java @@ -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 { + + 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 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 urls = new ArrayList<>(); + for (int j = 0; j 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!"))); + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesDetails.java b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesDetails.java new file mode 100644 index 0000000..ac3e270 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesDetails.java @@ -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> { + 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> callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries) { + final int[] returned = {0}; + AtomicReference lastError = new AtomicReference<>(null); + NetworkCallback 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); + } + } +} diff --git a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesList.java b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesList.java index d48f33b..31f2946 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesList.java +++ b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/KVVModulesList.java @@ -51,7 +51,7 @@ public class KVVModulesList extends HTTPService { } private void find(String moduleID, NetworkCallback 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(); if (retries < 0) { errorCallback.onError(new NetworkError(101107, -1, "Too many retries!")); @@ -68,6 +68,7 @@ public class KVVModulesList extends HTTPService { } void store() { + log.d("Save data"); if (this.mModules != null) { try { this.mModules.save(getContext()); @@ -88,7 +89,7 @@ public class KVVModulesList extends HTTPService { } } - private void delete() { + public void delete() { if (this.mModules != null) { this.mModules.delete(getContext()); this.mModules = null; @@ -104,7 +105,7 @@ public class KVVModulesList extends HTTPService { } private void recv(final NetworkCallback 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(); mQueue.add(() -> { if (this.mModules != null && !forceRefresh) { @@ -117,6 +118,7 @@ public class KVVModulesList extends HTTPService { this.mModules = success; else this.mModules.updateList(success); + store(); callback.onResponse(this.mModules); mQueue.next(); }, error -> { diff --git a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/ModulesPart.java b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/ModulesPart.java index 17239ab..48d9833 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/ModulesPart.java +++ b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/ModulesPart.java @@ -7,31 +7,18 @@ import android.text.Spanned; 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 ModulesPart extends HTTPService { - static final int RETRY_COUNT = 1; - protected final KVVLogin login; - protected final KVVModulesList list; +abstract class ModulesPart extends Part { private NewAsyncQueue queue = new NewAsyncQueue(); ModulesPart(KVVLogin login, KVVModulesList list, Context context) { - super(context); - this.login = login; - this.list = list; + super(login, list, context); } - public void recv(final String moduleID, final NetworkCallback callback, final NetworkErrorCallback errorCallback) { - recv(moduleID, callback, errorCallback, false); - } - - public void recv(final String moduleID, final NetworkCallback 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 callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries) { + @Override + protected void recv(final Modules.Module module, final NetworkCallback callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries) { queue.add(() -> { if (getPart(module) != null && !forceRefresh) { callback.onResponse(module); diff --git a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/Part.java b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/Part.java new file mode 100644 index 0000000..12c13b6 --- /dev/null +++ b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/Part.java @@ -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 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 callback, final NetworkErrorCallback errorCallback) { + recv(moduleID, callback, errorCallback, false); + } + + public void recv(final String moduleID, final NetworkCallback 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 callback, final NetworkErrorCallback errorCallback, final boolean forceRefresh, final int retries); +} diff --git a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/types/Assignment.java b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/types/Assignment.java index 4f366af..cd6a824 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/NewKVV/types/Assignment.java +++ b/app/src/main/java/de/sebse/fuplanner/services/NewKVV/types/Assignment.java @@ -1,5 +1,7 @@ package de.sebse.fuplanner.services.NewKVV.types; +import com.google.android.gms.common.internal.Objects; + import java.io.Serializable; import java.util.ArrayList; @@ -15,7 +17,6 @@ public class Assignment implements Serializable { this.title = title; this.dueTime = dueTime; this.urls = urls; - //this.grade = grade; this.instructions = instructions; } @@ -50,4 +51,9 @@ public class Assignment implements Serializable { "\nDue date: "+getDueDate()+ "\nInstructions: "+getInstructions().substring(0, Math.min(getInstructions().length(), 100)); } + + @Override + public int hashCode() { + return Objects.hashCode(getId(), getDueDate(), getInstructions(), getTitle(), getUrls()); + } } diff --git a/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java b/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java index 67ed120..ce8977c 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/MainActivityListener.java @@ -15,6 +15,7 @@ public interface MainActivityListener { void showToast(@StringRes int msgStringRes); + @Deprecated KVV getKVV(); de.sebse.fuplanner.services.NewKVV.KVV getNewKVV();