From faa07966da48c1718be8b58f7afa4d5193ede296 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Thu, 27 Feb 2020 12:09:24 +0100 Subject: [PATCH] fix crash on first start, if tcor is not reachable --- .../controller/TCoRAPIController.kt | 50 ++++++++++++++----- .../projectlaogai/hsoparser/DataTypes.kt | 4 ++ 2 files changed, 42 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt index 9d90148..d26309d 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/TCoRAPIController.kt @@ -24,16 +24,22 @@ package org.mosad.seil0.projectlaogai.controller import android.content.Context import android.util.Log -import kotlinx.coroutines.* +import com.google.gson.GsonBuilder +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.json.JSONObject import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.coursesCacheTime import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.mensaCacheTime import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.timetableCacheTime +import org.mosad.seil0.projectlaogai.hsoparser.CoursesList +import org.mosad.seil0.projectlaogai.hsoparser.MensaMenu +import org.mosad.seil0.projectlaogai.hsoparser.TimetableCourseWeek import java.io.BufferedWriter import java.io.File import java.io.FileWriter import java.net.URL -import kotlin.Exception class TCoRAPIController { @@ -45,10 +51,10 @@ class TCoRAPIController { * get the json object from tcor api and write it as file (cache) */ fun getCoursesList(context: Context) = GlobalScope.launch { - try { - val url = URL("$tcorBaseURL/courseList") - val file = File(context.filesDir, "courses.json") + val url = URL("$tcorBaseURL/courseList") + val file = File(context.filesDir, "courses.json") + try { // read data from the API val coursesObject = JSONObject(url.readText()) //JSONObject(inReader.readLine()) @@ -64,18 +70,24 @@ class TCoRAPIController { PreferencesController.save(context) } catch (ex: Exception) { Log.e(className, "failed to get /courseList", ex) - } + // write a empty file, since it is loaded later + withContext(Dispatchers.IO) { + val writer = BufferedWriter(FileWriter(file)) + writer.write(GsonBuilder().create().toJson(CoursesList())) + writer.close() + } + } } /** * get the json object from tcor api and write it as file (cache) */ fun getMensa(context: Context) = GlobalScope.launch { - try { - val url = URL("$tcorBaseURL/mensamenu") - val file = File(context.filesDir, "mensa.json") + val url = URL("$tcorBaseURL/mensamenu") + val file = File(context.filesDir, "mensa.json") + try { // read data from the API val mensaObject = JSONObject(url.readText()) //JSONObject(inReader.readLine()) @@ -91,6 +103,13 @@ class TCoRAPIController { PreferencesController.save(context) } catch (ex: Exception) { Log.e(className, "failed to get /mensamenu", ex) + + // write a empty file, since it is loaded later + withContext(Dispatchers.IO) { + val writer = BufferedWriter(FileWriter(file)) + writer.write(GsonBuilder().create().toJson(MensaMenu())) + writer.close() + } } } @@ -99,10 +118,10 @@ class TCoRAPIController { * get the json object from tcor api and write it as file (cache) */ fun getTimetable(courseName: String, week: Int, context: Context) = GlobalScope.launch { - try { - val url = URL("$tcorBaseURL/timetable?courseName=$courseName&week=$week") - val file = File(context.filesDir, "timetable-$courseName-$week.json") + val url = URL("$tcorBaseURL/timetable?courseName=$courseName&week=$week") + val file = File(context.filesDir, "timetable-$courseName-$week.json") + try { // read data from the API val timetableObject = JSONObject(url.readText()) //JSONObject(inReader.readLine()) @@ -118,6 +137,13 @@ class TCoRAPIController { PreferencesController.save(context) } catch (ex: Exception) { Log.e(className, "failed to get /timetable", ex) + + // write a empty file, since it is loaded later + withContext(Dispatchers.IO) { + val writer = BufferedWriter(FileWriter(file)) + writer.write(GsonBuilder().create().toJson(TimetableCourseWeek())) + writer.close() + } } } diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt index f1c23f5..d2d8aec 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt @@ -124,6 +124,10 @@ class NotRetardedCalendar { // data classes for the course part data class Course(val courseLink: String, val courseName: String) +data class CoursesMeta(val updateTime: Long = 0, val totalCourses: Int = 0) + +data class CoursesList(val meta: CoursesMeta = CoursesMeta(), val courses: ArrayList = ArrayList()) + // data classes for the Mensa part data class Meal(val day: String, val heading: String, val parts: ArrayList, val additives: String)