Updated ModDetails: Overview, Assignments, Announcements (not runnable)
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 -> {
|
|
||||||
adapter.setModule();
|
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
}, error -> {
|
}, error -> {
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
log.e(error);
|
log.e(error);
|
||||||
}, forceRefresh);
|
}, 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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 -> {
|
|
||||||
adapter.setModule();
|
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
}, error -> {
|
}, error -> {
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
log.e(error);
|
log.e(error);
|
||||||
}, forceRefresh);
|
}, 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() {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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,37 +84,45 @@ 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);
|
|
||||||
kvv.getModuleDetails(module, pair -> {
|
|
||||||
adapter.setModule();
|
|
||||||
if (pair.second)
|
if (pair.second)
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
}, error -> {
|
}, error -> {
|
||||||
swipeLayout.setRefreshing(false);
|
swipeLayout.setRefreshing(false);
|
||||||
log.e(error);
|
log.e(error);
|
||||||
}, forceRefresh);
|
}, forceRefresh);
|
||||||
}, error -> {
|
|
||||||
swipeLayout.setRefreshing(false);
|
|
||||||
log.e(error);
|
|
||||||
}, forceRefresh);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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!")));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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 -> {
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user