- progressCounter++;
- splashProgress.setProgress(progressCounter);
- long now = (new Date()).getTime()/1000;
- switch(progressCounter) {
- case 1:
- AppContext.getDatabaseManager().initializeDatabase();
- break;
- case 2:
- AppContext.addDefaultSearchIndexes();
- break;
- case 3:
- String lastCNSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastCNSync");
- long lastCNSync;
- if(lastCNSyncStr != null)
- lastCNSync = Long.parseLong(lastCNSyncStr);
- else
- lastCNSync = 0;
-
- CourseNameManager cnm = new CourseNameManager();
-
- if(lastCNSync == 0 || now - lastCNSync > (86400 * 7)) { //sync every 7 days
- cnm.synchronizeCourseNames(new CourseNameManagerInterface() {
- @Override
- public void onCourseNamesSynchronized() {
- long now = (new Date()).getTime() / 1000;
- AppContext.getDatabaseManager().setRuntimeCache("LastCNSync", Long.toString(now));
- timerHandler.postDelayed(timerRunnable, 100);
- }
-
- @Override
- public void onCourseNamesFailed(String errorMessage) {
- timerHandler.postDelayed(timerRunnable, 100);
- }
- });
+ runSplashTasks();
+ }
+ };
+
+ return view;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ timerHandler.postDelayed(timerRunnable, 500);
+ }
+
+ private void runSplashTasks() {
+ /*
+ Dieser Taskhandler, bestehend aus den Methoden runSplashTasks, runSplashTask, onSplashTaskComplete, onSplashTasksFinished
+ soll möglichst effizient alle durchzuführenden Aufgaben (Tasks) beim Ladevorgang der App durchführen.
+
+ Die Tasks werden innerhalb der Methode runSplashTask definiert.
+ Es können beliebig tasks parallel durchgeführt werden, solange diese Asnychron arbeiten. Siehe PARALLELIZE_SPLASHTASKS
+ */
+ progressCounter = 0;
+ lastTaskId = 0;
+ pendingSplashTasks = 1; // 1 (Timer Task)
+ splashProgress.setMax(SPLASHTASK_COUNT+1);
+ splashProgress.setProgress(0);
+ pendingSplashTask[0] = true;
+ for(int i = 0; i < PARALLELIZE_SPLASHTASKS; i++) {
+ if(lastTaskId >= SPLASHTASK_COUNT)
+ break;
+ pendingSplashTasks++;
+ lastTaskId++;
+ pendingSplashTask[lastTaskId] = true;
+ runSplashTask(lastTaskId);
+ }
+ timerRunnable = new Runnable() {
+ @Override
+ public void run() {
+ onSplashTaskComplete(0, true);
+ }
+ };
+ timerHandler.postDelayed(timerRunnable, 3000); // Show Splashscreen at least 3 seconds
+ }
+
+ private void onSplashTaskComplete(int taskId, boolean success) {
+ if(!pendingSplashTask[taskId])
+ return; // double callback call?
+ pendingSplashTask[taskId] = false;
+ pendingSplashTasks--;
+ progressCounter++;
+ splashProgress.setProgress(progressCounter);
+
+ if(lastTaskId < SPLASHTASK_COUNT) {
+ pendingSplashTasks++;
+ lastTaskId++;
+ pendingSplashTask[lastTaskId] = true;
+ runSplashTask(lastTaskId);
+ } else if(pendingSplashTasks == 0) {
+ onSplashTasksFinished();
+ }
+ }
+
+ private void onSplashTasksFinished() {
+ ((CampusApp) AppContext.getMainActivity()).loadMainUi();
+ AppContext.getNavigationManager().navigatePage("Dashboard", null, false);
+ }
+
+ private void runSplashTask(int taskId) {
+ long now = (new Date()).getTime() / 1000;
+ switch (taskId) {
+ case 1:
+ AppContext.getDatabaseManager().initializeDatabase();
+ onSplashTaskComplete(1, true);
+ break;
+ case 2:
+ AppContext.addDefaultSearchIndexes();
+ onSplashTaskComplete(2, true);
+ break;
+ case 3:
+ String lastCNSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastCNSync");
+ long lastCNSync;
+ if (lastCNSyncStr != null)
+ lastCNSync = Long.parseLong(lastCNSyncStr);
+ else
+ lastCNSync = 0;
+
+ CourseNameManager cnm = new CourseNameManager();
+
+ if (lastCNSync == 0 || now - lastCNSync > (86400 * 7)) { //sync every 7 days
+ cnm.synchronizeCourseNames(new CourseNameManagerInterface() {
+ @Override
+ public void onCourseNamesSynchronized() {
+ long now = (new Date()).getTime() / 1000;
+ AppContext.getDatabaseManager().setRuntimeCache("LastCNSync", Long.toString(now));
+ onSplashTaskComplete(3, true);
+