diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index 6b6922b..4d6cbc6 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -13,7 +13,6 @@ import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; -import android.util.Pair; import android.view.Menu; import android.view.MenuItem; import android.view.View; @@ -57,19 +56,19 @@ public class MainActivity extends AppCompatActivity private NavigationView mNavigationView; private int fragmentPage = FRAGMENT_NONE; - private int fragmentStatus = 0; + private String fragmentData = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int newFragmentPage = FRAGMENT_NONE; - int newFragmentStatus = 0; + String newFragmentData = ""; if (savedInstanceState != null) { newFragmentPage = savedInstanceState.getInt(ARG_FRAGMENT_PAGE, fragmentPage); - newFragmentStatus = savedInstanceState.getInt(ARG_FRAGMENT_STATUS, fragmentPage); + newFragmentData = savedInstanceState.getString(ARG_FRAGMENT_STATUS, fragmentData); log.d("fragmentPage", newFragmentPage); - log.d("fragmentStatus", newFragmentStatus); + log.d("fragmentData", newFragmentData); } setContentView(R.layout.activity_main); @@ -89,7 +88,7 @@ public class MainActivity extends AppCompatActivity if (newFragmentPage != FRAGMENT_LOGIN && newFragmentPage != FRAGMENT_STARTUP && newFragmentPage != FRAGMENT_NONE) { LoginToken loginToken = getKVV().easyLogin(); if (loginToken != null) - toLoginState(loginToken, newFragmentPage, newFragmentStatus); + toLoginState(loginToken, newFragmentPage, newFragmentData); else checkAndDoLogin(); } else { @@ -132,7 +131,7 @@ public class MainActivity extends AppCompatActivity @SuppressWarnings("StatementWithEmptyBody") @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { - //log.d("ITEM SELECTED", item.getTitle()); + log.d("ITEM SELECTED", item.getTitle()); // Handle navigation view item clicks here. int id = item.getItemId(); @@ -164,7 +163,7 @@ public class MainActivity extends AppCompatActivity int size = mNavigationView.getMenu().size(); for (int k = 0; k < size; k++) { //mNavigationView.getMenu().getItem(k).setChecked(mNavigationView.getMenu().getItem(k).getOrder() == 101+itemPosition); - mNavigationView.getMenu().getItem(k).setChecked(false); + mNavigationView.getMenu().getItem(k).setChecked(mNavigationView.getMenu().getItem(k) == item); } item.setChecked(true); @@ -180,7 +179,7 @@ public class MainActivity extends AppCompatActivity @Override protected void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putInt(ARG_FRAGMENT_PAGE, fragmentPage); - savedInstanceState.putInt(ARG_FRAGMENT_STATUS, fragmentStatus); + savedInstanceState.putString(ARG_FRAGMENT_STATUS, fragmentData); super.onSaveInstanceState(savedInstanceState); } @@ -210,7 +209,7 @@ public class MainActivity extends AppCompatActivity changeFragment(FRAGMENT_LOGIN); } - private void toLoginState(LoginToken loginToken, int newFragment, int newData) { + private void toLoginState(LoginToken loginToken, int newFragment, String newData) { if (loginToken == null) { toLogoutState(); } else { @@ -218,7 +217,7 @@ public class MainActivity extends AppCompatActivity } } - private void toLoginState(String fullname, String email, int newFragment, int newData) { + private void toLoginState(String fullname, String email, int newFragment, String newData) { changeFragment(newFragment, newData); View header = mNavigationView.getHeaderView(0); @@ -237,7 +236,7 @@ public class MainActivity extends AppCompatActivity } this.getKVV().login(credentials.getUsername(), credentials.getPassword(), success -> { this.getKVV().endUpdate(); - toLoginState(success, getDefaultFragmentAfterLogin(), 0); + toLoginState(success, getDefaultFragmentAfterLogin(), ""); }, error -> { log.e(error); this.getKVV().endUpdate(); @@ -247,10 +246,10 @@ public class MainActivity extends AppCompatActivity } private void changeFragment(int newFragment) { - changeFragment(newFragment, 0); + changeFragment(newFragment, ""); } - private void changeFragment(int newFragment, int newData) { + private void changeFragment(int newFragment, String newData) { onTitleTextChange(R.string.courses); Fragment fragment; if (newFragment == FRAGMENT_MODULES) { @@ -303,11 +302,11 @@ public class MainActivity extends AppCompatActivity log.d("Modules.get", success.size()); //SubMenu moduleMenu = navigationView.getMenu().findItem(R.id.nav_modules).getSubMenu(); int i = 0; - for (Iterator> it = success.latestSemesterIterator(); it.hasNext(); ) { - Pair module = it.next(); - MenuItem menuItem = mNavigationView.getMenu().add(Menu.NONE, Menu.NONE, 101 + i, module.first.title); + for (Iterator it = success.latestSemesterIterator(); it.hasNext(); ) { + Modules.Module module = it.next(); + MenuItem menuItem = mNavigationView.getMenu().add(Menu.NONE, Menu.NONE, 101 + i, module.title); menuItem.setOnMenuItemClickListener(item -> { - onModulesFragmentInteraction(module.second); + onModulesFragmentInteraction(module.getID()); return false; }); i++; @@ -315,14 +314,18 @@ public class MainActivity extends AppCompatActivity }, error -> log.e("Modules.error", error)); } if (newFragment == FRAGMENT_MODULES_DETAILS) { - int size = mNavigationView.getMenu().size(); - for (int k = 0; k < size; k++) { - mNavigationView.getMenu().getItem(k).setChecked(mNavigationView.getMenu().getItem(k).getOrder() == 101+newData); - } + getKVV().getModule(newData, success -> { + int size = mNavigationView.getMenu().size(); + //noinspection ConstantConditions + String title = success == null ? null : success.title; + for (int k = 0; k < size; k++) { + mNavigationView.getMenu().getItem(k).setChecked(mNavigationView.getMenu().getItem(k).getTitle().equals(title)); + } + }, log::e); } this.fragmentPage = newFragment; - this.fragmentStatus = newData; + this.fragmentData = newData; } @@ -333,11 +336,11 @@ public class MainActivity extends AppCompatActivity public void onLoginFragmentInteraction(LoginToken loginToken) { - toLoginState(loginToken.getFullname(), loginToken.getEmail(), getDefaultFragmentAfterLogin(), 0); + toLoginState(loginToken.getFullname(), loginToken.getEmail(), getDefaultFragmentAfterLogin(), ""); } - public void onModulesFragmentInteraction(final int itemPosition) { - changeFragment(FRAGMENT_MODULES_DETAILS, itemPosition); + public void onModulesFragmentInteraction(final String itemID) { + changeFragment(FRAGMENT_MODULES_DETAILS, itemID); } public void onTitleTextChange(String newTitle) { diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java index 5bbcdc6..7d81b3a 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesAdapter.java @@ -42,16 +42,16 @@ public class ModulesAdapter extends RecyclerView.Adapter { public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) { if (mValues == null) return; - final int finalPosition = holder.getAdapterPosition(); - holder.mTitle.setText(mValues.get(finalPosition).title); - holder.mSubLeft.setText(mValues.get(finalPosition).semester); - holder.mSubRight.setText(mValues.get(finalPosition).type); + Modules.Module module = mValues.getByIndex(holder.getAdapterPosition()); + holder.mTitle.setText(module.title); + holder.mSubLeft.setText(module.semester); + holder.mSubRight.setText(module.type); holder.mView.setOnClickListener(v -> { if (null != mListener) { // Notify the active callbacks interface (the activity, if the // fragment is attached to one) that an item has been selected. - mListener.onModulesFragmentInteraction(finalPosition); + mListener.onModulesFragmentInteraction(module.getID()); } }); } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java index afb1ca6..79b4ee8 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java @@ -105,6 +105,6 @@ public class ModulesFragment extends Fragment { } public interface OnModulesFragmentInteractionListener { - void onModulesFragmentInteraction(int item); + void onModulesFragmentInteraction(String id); } } diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java index c4c62ea..630b70f 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailAdapter.java @@ -8,10 +8,10 @@ import android.support.v4.app.FragmentStatePagerAdapter; import de.sebse.fuplanner.R; class ModDetailAdapter extends FragmentStatePagerAdapter { - private final int mItemPos; + private final String mItemPos; private final Context mContext; - ModDetailAdapter(FragmentManager fm, int itemPosition, Context context) { + ModDetailAdapter(FragmentManager fm, String itemPosition, Context context) { super(fm); this.mContext = context; this.mItemPos = itemPosition; 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 1a72af1..a27eaef 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 @@ -24,7 +24,7 @@ import de.sebse.fuplanner.tools.logging.Logger; public class ModDetailAnnounceFragment extends Fragment { private static final String ARG_POSITION = "itemPosition"; - private int mItemPos; + private String mItemPos; private Logger log = new Logger(this); private ModDetailAnnounceAdapter adapter; private SwipeRefreshLayout swipeLayout; @@ -41,10 +41,10 @@ public class ModDetailAnnounceFragment extends Fragment { * @param itemPosition Item position in module list. * @return A new instance of fragment ModDetailAnnounceFragment. */ - public static ModDetailAnnounceFragment newInstance(int itemPosition) { + public static ModDetailAnnounceFragment newInstance(String itemPosition) { ModDetailAnnounceFragment fragment = new ModDetailAnnounceFragment(); Bundle args = new Bundle(); - args.putInt(ARG_POSITION, itemPosition); + args.putString(ARG_POSITION, itemPosition); fragment.setArguments(args); return fragment; } @@ -53,7 +53,7 @@ public class ModDetailAnnounceFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - mItemPos = getArguments().getInt(ARG_POSITION); + mItemPos = getArguments().getString(ARG_POSITION); } } @@ -79,8 +79,7 @@ public class ModDetailAnnounceFragment extends Fragment { private void refresh(boolean forceRefresh) { if (getActivity() != null) { KVV kvv = ((MainActivity) getActivity()).getKVV(); - kvv.getModuleList((Modules success) -> { - Modules.Module module = success.get(mItemPos); + kvv.getModule(mItemPos, (Modules.Module module) -> { adapter.setModule(module); kvv.getModuleAnnouncements(module, success1 -> { adapter.setModule(); 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 f0d2a51..43ed849 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 @@ -24,7 +24,7 @@ import de.sebse.fuplanner.tools.logging.Logger; public class ModDetailAssignmentFragment extends Fragment { private static final String ARG_POSITION = "itemPosition"; - private int mItemPos; + private String mItemPos; private Logger log = new Logger(this); private ModDetailAssignmentAdapter adapter; private SwipeRefreshLayout swipeLayout; @@ -41,10 +41,10 @@ public class ModDetailAssignmentFragment extends Fragment { * @param itemPosition Item position in module list. * @return A new instance of fragment ModDetailAnnounceFragment. */ - public static ModDetailAssignmentFragment newInstance(int itemPosition) { + public static ModDetailAssignmentFragment newInstance(String itemPosition) { ModDetailAssignmentFragment fragment = new ModDetailAssignmentFragment(); Bundle args = new Bundle(); - args.putInt(ARG_POSITION, itemPosition); + args.putString(ARG_POSITION, itemPosition); fragment.setArguments(args); return fragment; } @@ -53,7 +53,7 @@ public class ModDetailAssignmentFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - mItemPos = getArguments().getInt(ARG_POSITION); + mItemPos = getArguments().getString(ARG_POSITION); } } @@ -79,8 +79,7 @@ public class ModDetailAssignmentFragment extends Fragment { private void refresh(boolean forceRefresh) { if (getActivity() != null) { KVV kvv = ((MainActivity) getActivity()).getKVV(); - kvv.getModuleList((Modules success) -> { - Modules.Module module = success.get(mItemPos); + kvv.getModule(mItemPos, (Modules.Module module) -> { adapter.setModule(module); kvv.getModuleAssignments(module, success1 -> { adapter.setModule(); diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java index 95ff906..d78d5c6 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailEventFragment.java @@ -26,7 +26,7 @@ import de.sebse.fuplanner.tools.logging.Logger; public class ModDetailEventFragment extends Fragment { private static final String ARG_POSITION = "itemPosition"; - private int mItemPos; + private String mItemPos; private Logger log = new Logger(this); private ModDetailEventAdapter adapter; private SwipeRefreshLayout swipeLayout; @@ -43,10 +43,10 @@ public class ModDetailEventFragment extends Fragment { * @param itemPosition Item position in module list. * @return A new instance of fragment ModDetailAnnounceFragment. */ - public static ModDetailEventFragment newInstance(int itemPosition) { + public static ModDetailEventFragment newInstance(String itemPosition) { ModDetailEventFragment fragment = new ModDetailEventFragment(); Bundle args = new Bundle(); - args.putInt(ARG_POSITION, itemPosition); + args.putString(ARG_POSITION, itemPosition); fragment.setArguments(args); return fragment; } @@ -55,7 +55,7 @@ public class ModDetailEventFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - mItemPos = getArguments().getInt(ARG_POSITION); + mItemPos = getArguments().getString(ARG_POSITION); } } @@ -83,8 +83,7 @@ public class ModDetailEventFragment extends Fragment { private void refresh(boolean forceRefresh) { if (getActivity() != null) { KVV kvv = ((MainActivity) getActivity()).getKVV(); - kvv.getModuleList((Modules success) -> { - Modules.Module module = success.get(mItemPos); + kvv.getModule(mItemPos, (Modules.Module module) -> { adapter.setModule(module); kvv.getModuleEvents(module, success1 -> { adapter.setModule(); diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java index 71ac2aa..cf5138b 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailFragment.java @@ -25,7 +25,7 @@ public class ModDetailFragment extends Fragment { private static final String ARG_POSITION = "itemPosition"; // Parameters - private int mItemPos; + private String mItemPos; private MainAcitivityListener mListener; private Logger log = new Logger(this); @@ -41,10 +41,10 @@ public class ModDetailFragment extends Fragment { * @param itemPosition Item position in module list. * @return A new instance of fragment ModDetailFragment. */ - public static Fragment newInstance(int itemPosition) { + public static Fragment newInstance(String itemPosition) { ModDetailFragment fragment = new ModDetailFragment(); Bundle args = new Bundle(); - args.putInt(ARG_POSITION, itemPosition); + args.putString(ARG_POSITION, itemPosition); fragment.setArguments(args); return fragment; } @@ -53,7 +53,7 @@ public class ModDetailFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - mItemPos = getArguments().getInt(ARG_POSITION); + mItemPos = getArguments().getString(ARG_POSITION); } if (mListener != null) { mListener.onTitleTextChange(R.string.courses); diff --git a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookFragment.java b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookFragment.java index 64bc999..f1debd0 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/moddetails/ModDetailGradebookFragment.java @@ -26,7 +26,7 @@ import de.sebse.fuplanner.tools.logging.Logger; public class ModDetailGradebookFragment extends Fragment { private static final String ARG_POSITION = "itemPosition"; - private int mItemPos; + private String mItemPos; private Logger log = new Logger(this); private ModDetailGradebookAdapter adapter; private SwipeRefreshLayout swipeLayout; @@ -43,10 +43,10 @@ public class ModDetailGradebookFragment extends Fragment { * @param itemPosition Item position in module list. * @return A new instance of fragment ModDetailAnnounceFragment. */ - public static ModDetailGradebookFragment newInstance(int itemPosition) { + public static ModDetailGradebookFragment newInstance(String itemPosition) { ModDetailGradebookFragment fragment = new ModDetailGradebookFragment(); Bundle args = new Bundle(); - args.putInt(ARG_POSITION, itemPosition); + args.putString(ARG_POSITION, itemPosition); fragment.setArguments(args); return fragment; } @@ -55,7 +55,7 @@ public class ModDetailGradebookFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - mItemPos = getArguments().getInt(ARG_POSITION); + mItemPos = getArguments().getString(ARG_POSITION); } } @@ -83,8 +83,7 @@ public class ModDetailGradebookFragment extends Fragment { private void refresh(boolean forceRefresh) { if (getActivity() != null) { KVV kvv = ((MainActivity) getActivity()).getKVV(); - kvv.getModuleList((Modules success) -> { - Modules.Module module = success.get(mItemPos); + kvv.getModule(mItemPos, (Modules.Module module) -> { adapter.setModule(module); kvv.getModuleGradebook(module, success1 -> { adapter.setModule(); 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 6b64b5c..4fcc7f9 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 @@ -26,7 +26,7 @@ import de.sebse.fuplanner.tools.logging.Logger; public class ModDetailOverviewFragment extends Fragment { private static final String ARG_POSITION = "itemPosition"; - private int mItemPos; + private String mItemPos; private Logger log = new Logger(this); private ModDetailOverviewAdapter adapter; private SwipeRefreshLayout swipeLayout; @@ -43,10 +43,10 @@ public class ModDetailOverviewFragment extends Fragment { * @param itemPosition Item position in module list. * @return A new instance of fragment ModDetailOverviewFragment. */ - public static ModDetailOverviewFragment newInstance(int itemPosition) { + public static ModDetailOverviewFragment newInstance(String itemPosition) { ModDetailOverviewFragment fragment = new ModDetailOverviewFragment(); Bundle args = new Bundle(); - args.putInt(ARG_POSITION, itemPosition); + args.putString(ARG_POSITION, itemPosition); fragment.setArguments(args); return fragment; } @@ -55,7 +55,7 @@ public class ModDetailOverviewFragment extends Fragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getArguments() != null) { - mItemPos = getArguments().getInt(ARG_POSITION); + mItemPos = getArguments().getString(ARG_POSITION); } } @@ -83,8 +83,7 @@ public class ModDetailOverviewFragment extends Fragment { private void refresh(boolean forceRefresh) { if (getActivity() != null) { KVV kvv = ((MainActivity) getActivity()).getKVV(); - kvv.getModuleList((Modules success) -> { - Modules.Module module = success.get(mItemPos); + kvv.getModule(mItemPos, (Modules.Module module) -> { adapter.setModule(module); kvv.getModuleDetails(module, pair -> { adapter.setModule(); diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java index 713ccad..c75133d 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVV.java @@ -10,6 +10,7 @@ import java.util.HashMap; import de.sebse.fuplanner.services.KVV.types.LoginToken; import de.sebse.fuplanner.services.KVV.types.Modules; +import de.sebse.fuplanner.tools.logging.Logger; import de.sebse.fuplanner.tools.network.NetworkCallback; import de.sebse.fuplanner.tools.network.NetworkErrorCallback; @@ -23,6 +24,7 @@ public class KVV { private boolean isUpdating; private ArrayList updatingList; private HashMap addons = new HashMap<>(); + private Logger log = new Logger(this); public KVV(Context context) { this.context = context; @@ -61,12 +63,28 @@ public class KVV { addons.clear(); } + public void getModule(String id, final NetworkCallback callback, final NetworkErrorCallback error) { + getModule(id, callback, error, false); + } + + public void getModule(String id, final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { + this.getLastToken(token -> { + KVVModuleList modules = (KVVModuleList) addons.get("modules"); + if (modules == null) { + modules = new KVVModuleList(KVV.this.context, token); + addons.put("modules", modules); + } + modules.getModule(id, callback, error, forceRefresh); + }); + } + public void getModuleList(final NetworkCallback callback, final NetworkErrorCallback error) { getModuleList(callback, error, false); } public void getModuleList(final NetworkCallback callback, final NetworkErrorCallback error, boolean forceRefresh) { this.getLastToken(token -> { + log.d("token here", token); KVVModuleList modules = (KVVModuleList) addons.get("modules"); if (modules == null) { modules = new KVVModuleList(KVV.this.context, token); diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java index 49c85fb..f7d672e 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/KVVModuleList.java @@ -66,7 +66,10 @@ public class KVVModuleList extends HTTPService { return; } this.getModuleListUpgrade(success -> { - this.moduleList = success; + if (this.moduleList == null) + this.moduleList = success; + else + this.moduleList.updateList(success); callback.onResponse(this.moduleList); queueModuleDetails.next("list"); }, queueModuleDetails.check("list", errorCallback)); @@ -129,8 +132,8 @@ public class KVVModuleList extends HTTPService { this.moduleList.save(context); } - public void getModule(int index, final NetworkCallback callback, final NetworkErrorCallback errorCallback, boolean forceRefresh) { - this.getModuleList(success -> callback.onResponse(success.get(index)), errorCallback, forceRefresh); + public void getModule(String id, final NetworkCallback callback, final NetworkErrorCallback errorCallback, boolean forceRefresh) { + this.getModuleList(success -> callback.onResponse(success.get(id)), errorCallback, forceRefresh); } diff --git a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java index 1c5b831..57098ff 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java +++ b/app/src/main/java/de/sebse/fuplanner/services/KVV/types/Modules.java @@ -3,7 +3,6 @@ package de.sebse.fuplanner.services.KVV.types; import android.content.Context; import android.support.annotation.NonNull; import android.support.annotation.Nullable; -import android.util.Pair; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -26,7 +25,7 @@ import de.sebse.fuplanner.tools.SortedModuleList; */ public class Modules implements Iterable, Serializable { - private final SortedModuleList list; + private SortedModuleList list; private String latestSemester = null; private LoginToken token; //private transient Logger log = new Logger(this); @@ -86,74 +85,22 @@ public class Modules implements Iterable, Serializable { @NonNull @Override public Iterator iterator() { - return new Iterator() { - private int pos = -1; - @Override - public boolean hasNext() { - return pos+1 < list.size(); - } - - @Override - public Module next() { - pos++; - if (pos < list.size()) - return list.get(pos); - return null; - } - - @Override - public void remove() { - throw new UnsupportedOperationException("no changes allowed"); - } - }; + return this.list.iterator(); } - public Iterator> latestSemesterIterator() { - return new Iterator>() { - private int index = -1; - private int next = -1; - @Override - public boolean hasNext() { - if (index==next) - predict(); - return next != -1; - } - - @Override - public Pair next() { - if (index == next) - predict(); - if (next == -1) - return null; - index = next; - return new Pair<>(list.get(index), index); - } - - @Override - public void remove() { - throw new UnsupportedOperationException("no changes allowed"); - } - - private void predict() { - int size = list.size(); - do { - next++; - } while (next < size && decline(list.get(next))); - if (next == size) - next = -1; - } - - private boolean decline(Module ob){ - return !ob.semester.equals(latestSemester); - } - }; + public Iterator latestSemesterIterator() { + return this.list.semesterIterator(latestSemester); } public int size() { return this.list.size(); } - public Module get(int index) { + public Module get(String id) { + return this.list.get(id); + } + + public Module getByIndex(int index) { return this.list.get(index); } @@ -182,6 +129,21 @@ public class Modules implements Iterable, Serializable { return token; } + public void updateList(Modules modules) { + this.latestSemester = modules.latestSemester; + SortedModuleList old = this.list; + this.list = modules.list; + for (Module oldModule : old) { + Module newModule = this.list.get(oldModule.getID()); + if (newModule != null) { + newModule.announcements = oldModule.announcements; + newModule.assignments = oldModule.assignments; + newModule.events = oldModule.events; + newModule.gradebook = oldModule.gradebook; + } + } + } + public class Module implements Serializable { public final String semester; public final HashSet lvNumber; diff --git a/app/src/main/java/de/sebse/fuplanner/tools/SortedModuleList.java b/app/src/main/java/de/sebse/fuplanner/tools/SortedModuleList.java index 35b0e68..bf56d55 100644 --- a/app/src/main/java/de/sebse/fuplanner/tools/SortedModuleList.java +++ b/app/src/main/java/de/sebse/fuplanner/tools/SortedModuleList.java @@ -1,9 +1,13 @@ package de.sebse.fuplanner.tools; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + import java.io.Serializable; import java.util.AbstractList; import java.util.ArrayList; import java.util.Collections; +import java.util.Iterator; import de.sebse.fuplanner.services.KVV.types.Modules; @@ -23,14 +27,89 @@ public class SortedModuleList extends AbstractList implements Se }); } + @Deprecated @Override public Modules.Module get(int i) { return internalList.get(i); } + @Nullable + public Modules.Module get(String id) { + for (Modules.Module module : this.internalList) { + if (module.getID().equals(id)) + return module; + } + return null; + } + @Override public int size() { return internalList.size(); } + @NonNull + @Override + public Iterator iterator() { + return new Iterator() { + private int pos = -1; + @Override + public boolean hasNext() { + return pos+1 < internalList.size(); + } + + @Override + public Modules.Module next() { + pos++; + if (pos < internalList.size()) + return internalList.get(pos); + return null; + } + + @Override + public void remove() { + throw new UnsupportedOperationException("no changes allowed"); + } + }; + } + + public Iterator semesterIterator(String semester) { + return new Iterator() { + private int index = -1; + private int next = -1; + @Override + public boolean hasNext() { + if (index==next) + predict(); + return next != -1; + } + + @Override + public Modules.Module next() { + if (index == next) + predict(); + if (next == -1) + return null; + index = next; + return internalList.get(index); + } + + @Override + public void remove() { + throw new UnsupportedOperationException("no changes allowed"); + } + + private void predict() { + int size = internalList.size(); + do { + next++; + } while (next < size && decline(internalList.get(next))); + if (next == size) + next = -1; + } + + private boolean decline(Modules.Module ob){ + return !ob.semester.equals(semester); + } + }; + } }