diff --git a/app/src/main/java/de/sebse/fuplanner/MainActivity.java b/app/src/main/java/de/sebse/fuplanner/MainActivity.java index e355068..7f32506 100644 --- a/app/src/main/java/de/sebse/fuplanner/MainActivity.java +++ b/app/src/main/java/de/sebse/fuplanner/MainActivity.java @@ -27,6 +27,7 @@ import java.util.Locale; import androidx.annotation.NonNull; import androidx.annotation.StringRes; +import androidx.arch.core.util.Function; import androidx.appcompat.app.ActionBarDrawerToggle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; @@ -129,6 +130,7 @@ public class MainActivity extends AppCompatActivity private boolean isPaused = false; private boolean isLoggedInBeforePause = false; private boolean isDrawerFixed = false; + private Function mMolduleListUpdateFunction; @Override protected void onCreate(Bundle savedInstanceState) { @@ -711,6 +713,11 @@ public class MainActivity extends AppCompatActivity setNavigationSelection(); } + @Override + public void onModulesFragmentListUpdate(Function update) { + this.mMolduleListUpdateFunction = update; + } + @Override public void onCanteensFragmentInteraction(final int itemID) { changeFragment(FRAGMENT_CANTEENS_DETAILS, String.valueOf(itemID)); @@ -790,4 +797,11 @@ public class MainActivity extends AppCompatActivity public interface KVVCallback { void get(KVV kvv); } + + @Override + public void onModuleListPartiallyUpdated(Modules modules) { + if (mMolduleListUpdateFunction != null) { + mMolduleListUpdateFunction.apply(modules); + } + } } 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 dd3bd49..0d2ebeb 100644 --- a/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java +++ b/app/src/main/java/de/sebse/fuplanner/fragments/ModulesFragment.java @@ -8,11 +8,13 @@ import android.view.ViewGroup; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.arch.core.util.Function; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import de.sebse.fuplanner.R; +import de.sebse.fuplanner.services.kvv.types.Modules; import de.sebse.fuplanner.tools.MainActivityListener; import de.sebse.fuplanner.tools.logging.Logger; @@ -84,6 +86,10 @@ public class ModulesFragment extends Fragment { super.onAttach(context); if (context instanceof OnModulesFragmentInteractionListener) { mListener = (OnModulesFragmentInteractionListener) context; + mListener.onModulesFragmentListUpdate(modules -> { + if (adapter != null) adapter.setModules(modules); + return null; + }); } else { throw new RuntimeException(context.toString() + " must implement OnModulesFragmentInteractionListener"); @@ -105,5 +111,6 @@ public class ModulesFragment extends Fragment { public interface OnModulesFragmentInteractionListener { void onModulesFragmentInteraction(String id); + void onModulesFragmentListUpdate(Function update); } } 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 b96d380..a87c469 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 @@ -52,6 +52,12 @@ public class KVV extends Service { for (KVVListener listener : mListeners.values()) listener.onModuleListChange(); } + + @Override + public void onModuleListPartiallyUpdated(de.sebse.fuplanner.services.kvv.types.Modules modules) { + for (KVVListener listener : mListeners.values()) + listener.onModuleListPartiallyUpdated(modules); + } }; public KVV() { diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/KVVListener.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/KVVListener.java index 818c6a2..2ee107a 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/KVVListener.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/KVVListener.java @@ -3,6 +3,7 @@ package de.sebse.fuplanner.services.kvv; import com.android.volley.NetworkResponse; import de.sebse.fuplanner.services.kvv.types.LoginTokenKVV; +import de.sebse.fuplanner.services.kvv.types.Modules; import de.sebse.fuplanner.tools.CustomAccountManager; public interface KVVListener { @@ -12,6 +13,8 @@ public interface KVVListener { default void onModuleListChange() {} + default void onModuleListPartiallyUpdated(Modules modules) {} + default void onKVVNetworkResponse(NetworkResponse error) {} CustomAccountManager getAccountManager(); diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java index 173fe4b..2f1a816 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/ModulesList.java @@ -287,6 +287,15 @@ public class ModulesList extends HTTPService { } callback.onResponse(modules); }); + NetworkCallback fastCallback = (modules -> { + mListener.onModuleListPartiallyUpdated(modules); + try { + cacheBBCourse().save(getContext()); + } catch (IOException e) { + e.printStackTrace(); + } + mListener.onModuleListPartiallyUpdated(modules); + }); if (!mLogin.isInOnlineMode() || mLogin.getLoginTokenBB() == null) { errorCallback.onError(new NetworkError(101120, 500, "Currently running in offline mode!")); @@ -323,16 +332,16 @@ public class ModulesList extends HTTPService { JSONObject site = sites[0].getJSONObject(i); String courseId = site.getString("courseId"); if (cacheBBCourse().hasKVVCourseID(courseId)) { + if (--latchNoLecturers[0] == 0) fastCallback.onResponse(modulesKVV); if (--latch[0] == 0) successCallback.onResponse(modulesKVV); - if (--latchNoLecturers[0] == 0) successCallback.onResponse(modulesKVV); continue; } Modules.Module bbCourse = cacheBBCourse().getBBCourse(courseId); if (bbCourse != null) { bbCourse = bbCourse.clone(); modulesKVV.addModule(bbCourse); + if (--latchNoLecturers[0] == 0) fastCallback.onResponse(modulesKVV); if (--latch[0] == 0) successCallback.onResponse(modulesKVV); - if (--latchNoLecturers[0] == 0) successCallback.onResponse(modulesKVV); continue; } get(String.format("https://lms.fu-berlin.de/learn/api/v1/courses/%s?fields=name,courseId,description", courseId), mLogin.getLoginTokenBB().getCookies(), response1 -> { @@ -377,17 +386,17 @@ public class ModulesList extends HTTPService { log.e(error); if (--latch[0] == 0) successCallback.onResponse(modulesKVV); }); - if (--latchNoLecturers[0] == 0) successCallback.onResponse(modulesKVV); + if (--latchNoLecturers[0] == 0) fastCallback.onResponse(modulesKVV); } else { cacheBBCourse().addKVVCourseID(courseId); + if (--latchNoLecturers[0] == 0) fastCallback.onResponse(modulesKVV); if (--latch[0] == 0) successCallback.onResponse(modulesKVV); - if (--latchNoLecturers[0] == 0) successCallback.onResponse(modulesKVV); } } catch (JSONException e) { e.printStackTrace(); log.e(new NetworkError(101125, 403, "Cannot parse course entry!")); + if (--latchNoLecturers[0] == 0) fastCallback.onResponse(modulesKVV); if (--latch[0] == 0) successCallback.onResponse(modulesKVV); - if (--latchNoLecturers[0] == 0) successCallback.onResponse(modulesKVV); } }, error -> errorCallback.onError(new NetworkError(101126, error.networkResponse.statusCode, "Cannot get module list!"))); } catch (JSONException e) { diff --git a/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVSyncAdapter.java b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVSyncAdapter.java index 8afabd8..8b8d047 100644 --- a/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVSyncAdapter.java +++ b/app/src/main/java/de/sebse/fuplanner/services/kvv/sync/KVVSyncAdapter.java @@ -47,13 +47,11 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter { @Override public void onServiceConnected(ComponentName className, IBinder service) { // We've bound to LocalService, cast the IBinder and get LocalService instance - log.d("connected 1", mWaitForBound, mBound); KVV.LocalBinder binder = (KVV.LocalBinder) service; mKVV = binder.getService(); mBound = true; if (mWaitForBound) { mWaitForBound = false; - log.d("connected", mKVV); mQueue.next(); } } @@ -104,13 +102,10 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter { SyncResult syncResult) { if (!mBound) { Intent intent = new Intent(getContext(), KVV.class); - log.d("connect22222", getContext().bindService(intent, mConnection, Context.BIND_AUTO_CREATE)); mWaitForBound = true; - log.d("connect", mKVV); mQueue.add(() -> {}); } mQueue.add(() -> { - log.d("kvv", mKVV); mKVV.account().restoreOnlineLogin(bool -> { mQueue.next(); }); @@ -122,7 +117,13 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter { } mKVV.modules().list().reloadIfOutdated(); mKVV.modules().list().recv(success -> { + final int[] latch = {0}; Iterator iterator = success.latestSemesterIterator(); + while (iterator.hasNext()) { + latch[0] += 1; + iterator.next(); + } + iterator = success.latestSemesterIterator(); while (iterator.hasNext()) { Modules.Module module = iterator.next(); final ArrayList announcements = module.announcements; @@ -147,11 +148,11 @@ public class KVVSyncAdapter extends AbstractThreadedSyncAdapter { sendNotifications(resources, module.resources, module.title, Resource::getTitle, Resource::getUrl, module.getID(), ModulePart.RESOURCES, R.string.resource_updated, R.string.resource_added, R.string.resource_removed); - mQueue.next(); + if (--latch[0] == 0) mQueue.next(); } - }, msg -> { - log.e(msg); - mQueue.next(); + }, error -> { + log.e(error); + if (--latch[0] == 0) mQueue.next(); }, true); } }, msg -> {