3 * This program is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
16 package de.dhbwloe.campusapp.fragments;
17 import android.graphics.Bitmap;
18 import android.graphics.BitmapFactory;
19 import android.graphics.Point;
20 import android.os.Bundle;
21 import android.os.Handler;
22 import android.support.v4.app.Fragment;
23 import android.view.Display;
24 import android.view.LayoutInflater;
25 import android.view.View;
26 import android.view.ViewGroup;
27 import android.widget.ImageView;
28 import android.widget.ProgressBar;
29 import android.widget.TextView;
31 import java.util.Date;
33 import de.dhbwloe.campusapp.CampusApp;
34 import de.dhbwloe.campusapp.CampusAppContext;
35 import de.dhbwloe.campusapp.CampusAppFragment;
36 import de.dhbwloe.campusapp.R;
37 import de.dhbwloe.campusapp.coursenames.CourseNameManager;
38 import de.dhbwloe.campusapp.coursenames.CourseNameManagerInterface;
39 import de.dhbwloe.campusapp.mensaplan.MensaplanManager;
40 import de.dhbwloe.campusapp.mensaplan.MensaplanManagerInterface;
41 import de.dhbwloe.campusapp.news.NewsManager;
42 import de.dhbwloe.campusapp.news.NewsManagerInterface;
43 import de.dhbwloe.campusapp.search.SearchIndices;
44 import de.dhbwloe.campusapp.vorlesungen.CalendarManager;
45 import de.dhbwloe.campusapp.vorlesungen.CalendarManagerInterface;
46 import de.dhbwloe.campusapp.vorlesungen.CourseEvent;
47 import de.dhbwloe.campusapp.vorlesungen.CourseGroup;
50 * A simple {@link Fragment} subclass.
52 public class SplashScreen extends CampusAppFragment {
53 private static final int PARALLELIZE_SPLASHTASKS = 4;
54 private static final int SPLASHTASK_COUNT = 9;
56 private ProgressBar splashProgress;
57 private int progressCounter;
58 private int pendingSplashTasks;
59 private int lastTaskId;
60 private boolean[] pendingSplashTask = new boolean[SPLASHTASK_COUNT+1];
61 private Handler timerHandler = new Handler();
62 private Runnable timerRunnable;
65 public void onCreate(Bundle savedInstanceState) {
66 super.onCreate(savedInstanceState);
72 public void onSaveInstanceState(Bundle savedInstanceState) {
73 timerHandler.removeCallbacksAndMessages(null);
74 super.onSaveInstanceState(savedInstanceState);
78 public View onCreateView(LayoutInflater inflater, ViewGroup container,
79 Bundle savedInstanceState) {
80 View view = inflater.inflate(R.layout.fragment_splashscreen, container, false);
82 TextView versionView = (TextView) view.findViewById(R.id.version);
83 versionView.setText(CampusAppContext.APPVERSION);
85 splashProgress = (ProgressBar)view.findViewById(R.id.splashProgress);
87 AppContext.setTitle("DHBW Lörrach");
89 timerRunnable = new Runnable() {
100 public void onResume() {
102 timerHandler.postDelayed(timerRunnable, 500);
105 private void runSplashTasks() {
107 Dieser Taskhandler, bestehend aus den Methoden runSplashTasks, runSplashTask, onSplashTaskComplete, onSplashTasksFinished
108 soll möglichst effizient alle durchzuführenden Aufgaben (Tasks) beim Ladevorgang der App durchführen.
110 Die Tasks werden innerhalb der Methode runSplashTask definiert.
111 Es können beliebig tasks parallel durchgeführt werden, solange diese Asnychron arbeiten. Siehe PARALLELIZE_SPLASHTASKS
115 pendingSplashTasks = 1; // 1 (Timer Task)
116 splashProgress.setMax(SPLASHTASK_COUNT+1);
117 splashProgress.setProgress(0);
118 pendingSplashTask[0] = true;
119 for(int i = 0; i < PARALLELIZE_SPLASHTASKS; i++) {
120 if(lastTaskId >= SPLASHTASK_COUNT)
122 pendingSplashTasks++;
124 pendingSplashTask[lastTaskId] = true;
125 runSplashTask(lastTaskId);
127 timerRunnable = new Runnable() {
130 onSplashTaskComplete(0, true);
133 timerHandler.postDelayed(timerRunnable, 3000); // Show Splashscreen at least 3 seconds
136 private void onSplashTaskComplete(int taskId, boolean success) {
137 if(!pendingSplashTask[taskId])
138 return; // double callback call?
139 pendingSplashTask[taskId] = false;
140 pendingSplashTasks--;
142 splashProgress.setProgress(progressCounter);
144 if(lastTaskId < SPLASHTASK_COUNT) {
145 pendingSplashTasks++;
147 pendingSplashTask[lastTaskId] = true;
148 runSplashTask(lastTaskId);
149 } else if(pendingSplashTasks == 0) {
150 onSplashTasksFinished();
154 private void onSplashTasksFinished() {
155 ((CampusApp) AppContext.getMainActivity()).loadMainUi();
156 AppContext.getNavigationManager().navigatePage("Dashboard", null, false);
159 private void runSplashTask(int taskId) {
160 long now = (new Date()).getTime() / 1000;
163 AppContext.getDatabaseManager().initializeDatabase();
164 onSplashTaskComplete(1, true);
167 AppContext.addDefaultSearchIndexes();
168 onSplashTaskComplete(2, true);
171 String lastCNSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastCNSync");
173 if (lastCNSyncStr != null)
174 lastCNSync = Long.parseLong(lastCNSyncStr);
178 CourseNameManager cnm = new CourseNameManager();
180 if (lastCNSync == 0 || now - lastCNSync > (86400 * 7)) { //sync every 7 days
181 cnm.synchronizeCourseNames(new CourseNameManagerInterface() {
183 public void onCourseNamesSynchronized() {
184 long now = (new Date()).getTime() / 1000;
185 AppContext.getDatabaseManager().setRuntimeCache("LastCNSync", Long.toString(now));
186 onSplashTaskComplete(3, true);
191 public void onCourseNamesFailed(String errorMessage) {
192 onSplashTaskComplete(3, false);
196 onSplashTaskComplete(3, true);
199 String startCounter = AppContext.getDatabaseManager().getRuntimeCache("AppStartCounter");
200 if (startCounter == null || Integer.parseInt(startCounter) == 0) {
201 AppContext.getNavigationManager().navigatePage("FirstRun", null, false);
204 AppContext.getDatabaseManager().setRuntimeCache("AppStartCounter", Integer.toString(Integer.parseInt(startCounter) + 1));
205 onSplashTaskComplete(4, true);
208 String lastVLMFullSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastVLMFullSync");
209 String lastVLMPartialSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastVLMPartialSync");
210 long lastVLMFullSync, lastVLMPartialSync;
211 if (lastVLMFullSyncStr != null)
212 lastVLMFullSync = Long.parseLong(lastVLMFullSyncStr);
215 if (lastVLMPartialSyncStr != null)
216 lastVLMPartialSync = Long.parseLong(lastVLMPartialSyncStr);
218 lastVLMPartialSync = 0;
220 final String kursTag = AppContext.getDatabaseManager().getRuntimeCache("CourseName");
221 if (kursTag == null || kursTag.isEmpty()) {
222 onSplashTaskComplete(5, true);
225 CalendarManager vpm = new CalendarManager(AppContext, kursTag);
227 if (lastVLMFullSync == 0 || now - lastVLMFullSync > (86400 * 14)) { // full sync every 14 days
228 vpm.performFullSynchronisation(new CalendarManagerInterface() {
230 public void onCalendarUpdateDone() {
231 if (!AppContext.getDatabaseManager().haveCourseName(kursTag)) {
232 CourseNameManager cnm = new CourseNameManager();
233 cnm.addCourseName(kursTag);
236 long now = (new Date()).getTime() / 1000;
237 AppContext.getDatabaseManager().setRuntimeCache("LastVLMFullSync", Long.toString(now));
238 AppContext.getDatabaseManager().setRuntimeCache("LastVLMPartialSync", Long.toString(now));
239 onSplashTaskComplete(5, true);
243 public void onCalendarUpdateFail(String errorMessage) {
244 onSplashTaskComplete(5, false);
248 public SearchIndices onGenerateCalendarSearchIndices(CourseEvent event) {
249 CourseGroup group = event.getCourseGroup();
250 SearchIndices indices = new SearchIndices("Vorlesungsplan#Group" + group.getGroupId(), false);
251 indices.setUpdateTime(event.getEventFrom());
252 indices.setTarget("#Vorlesungsplan#groupid=" + group.getGroupId());
253 indices.setTitle("Vorlesungsplan " + event.getCourseName());
254 indices.setDescription("Vorlesung " + event.getEventTitle());
255 indices.addKeyWord(event.getGroupTitle());
256 indices.addKeyWord(event.getEventLocation());
260 } else if (lastVLMPartialSync == 0 || now - lastVLMPartialSync > (86400)) { // partial sync every day
261 vpm.performFastSynchronisation(new CalendarManagerInterface() {
263 public void onCalendarUpdateDone() {
264 if (!AppContext.getDatabaseManager().haveCourseName(kursTag)) {
265 CourseNameManager cnm = new CourseNameManager();
266 cnm.addCourseName(kursTag);
269 long now = (new Date()).getTime() / 1000;
270 AppContext.getDatabaseManager().setRuntimeCache("LastVLMPartialSync", Long.toString(now));
271 onSplashTaskComplete(5, true);
275 public void onCalendarUpdateFail(String errorMessage) {
276 onSplashTaskComplete(5, false);
280 public SearchIndices onGenerateCalendarSearchIndices(CourseEvent event) {
281 CourseGroup group = event.getCourseGroup();
282 SearchIndices indices = new SearchIndices("Vorlesungsplan#Group" + group.getGroupId(), false);
283 indices.setUpdateTime(event.getEventFrom());
284 indices.setTarget("#Vorlesungsplan#groupid=" + group.getGroupId());
285 indices.setTitle(AppContext.getResString(R.string.search_vorlesungsplan_group_title, event.getCourseName()));
286 indices.setDescription(event.getEventTitle());
287 indices.addKeyWord(event.getGroupTitle());
288 indices.addKeyWord(event.getEventLocation());
293 onSplashTaskComplete(5, true);
296 String lastMPMSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastMPSync");
298 if (lastMPMSyncStr != null)
299 lastMPMSync = Long.parseLong(lastMPMSyncStr);
303 MensaplanManager mpm = new MensaplanManager(AppContext);
305 if (lastMPMSync == 0 || now - lastMPMSync > (86400 * 2)) { //sync every 2 days
306 mpm.performSynchronisation(new MensaplanManagerInterface() {
308 public void onMensaplanUpdateDone() {
309 long now = (new Date()).getTime() / 1000;
310 AppContext.getDatabaseManager().setRuntimeCache("LastMPSync", Long.toString(now));
311 onSplashTaskComplete(6, true);
315 public void onMensaplanUpdateFail(String errorMessage) {
316 onSplashTaskComplete(6, false);
320 onSplashTaskComplete(6, true);
323 final String syncSource = "DHBW";
324 String lastNewsSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastNewsSync_" + syncSource);
326 if (lastNewsSyncStr != null)
327 lastNewsSync = Long.parseLong(lastNewsSyncStr);
331 NewsManager nm = new NewsManager(AppContext, syncSource);
333 if (lastNewsSync == 0 || now - lastNewsSync > (86400 * 1)) { //sync every day
334 nm.performSynchronisation(new NewsManagerInterface() {
336 public void onNewsUpdateDone() {
337 long now = (new Date()).getTime() / 1000;
338 AppContext.getDatabaseManager().setRuntimeCache("LastNewsSync_" + syncSource, Long.toString(now));
339 onSplashTaskComplete(7, true);
343 public void onNewsUpdateFail(String errorMessage) {
344 onSplashTaskComplete(7, false);
348 onSplashTaskComplete(7, true);
351 final String syncSource2 = "STUV";
352 String lastNewsSyncStr2 = AppContext.getDatabaseManager().getRuntimeCache("LastNewsSync_" + syncSource2);
354 if (lastNewsSyncStr2 != null)
355 lastNewsSync2 = Long.parseLong(lastNewsSyncStr2);
359 NewsManager nm2 = new NewsManager(AppContext, syncSource2);
361 if (lastNewsSync2 == 0 || now - lastNewsSync2 > (86400 * 1)) { //sync every day
362 nm2.performSynchronisation(new NewsManagerInterface() {
364 public void onNewsUpdateDone() {
365 long now = (new Date()).getTime() / 1000;
366 AppContext.getDatabaseManager().setRuntimeCache("LastNewsSync_" + syncSource2, Long.toString(now));
367 onSplashTaskComplete(8, true);
371 public void onNewsUpdateFail(String errorMessage) {
372 onSplashTaskComplete(8, false);
376 onSplashTaskComplete(8, true);
379 String lastStuvSyncStr = AppContext.getDatabaseManager().getRuntimeCache("LastStuvSync");
381 if (lastStuvSyncStr != null)
382 lastStuvSync = Long.parseLong(lastStuvSyncStr);
386 final String calendarName = "STUV";
387 CalendarManager stuvsyncmgr = new CalendarManager(AppContext, calendarName);
389 if (lastStuvSync == 0 || now - lastStuvSync > (86400 * 3)) { // full sync every 3 days
390 stuvsyncmgr.performFullSynchronisation(new CalendarManagerInterface() {
392 public void onCalendarUpdateDone() {
393 long now = (new Date()).getTime() / 1000;
394 AppContext.getDatabaseManager().setRuntimeCache("LastStuvSync", Long.toString(now));
395 onSplashTaskComplete(9, true);
399 public void onCalendarUpdateFail(String errorMessage) {
400 onSplashTaskComplete(9, false);
404 public SearchIndices onGenerateCalendarSearchIndices(CourseEvent event) {
405 CourseGroup group = event.getCourseGroup();
406 SearchIndices indices = new SearchIndices("Vorlesungsplan#Group" + group.getGroupId(), false);
407 indices.setUpdateTime(event.getEventFrom());
408 indices.setTarget("#News#showevent=" + group.getGroupId() + "&course=" + calendarName);
409 indices.setTitle(calendarName + " Event: " + event.getCourseName());
410 indices.setDescription(event.getEventTitle());
411 indices.addKeyWord(event.getGroupTitle());
412 indices.addKeyWord(event.getEventLocation());
418 onSplashTaskComplete(9, true);
422 onSplashTaskComplete(taskId, true);