release 0.5.0 #35
@ -18,4 +18,4 @@ ProjectLaogai is a app to access the timetable and the mensa menu of Hochschule
 | 
				
			|||||||
[<img src="https://raw.githubusercontent.com/Seil0/Seil0.github.io/master/images/Project_Laogai/ProjectLaogai_Settings.png" width=180>](https://github.com/Seil0/Seil0.github.io/blob/master/images/Project_Laogai/ProjectLaogai_Settings.png)
 | 
					[<img src="https://raw.githubusercontent.com/Seil0/Seil0.github.io/master/images/Project_Laogai/ProjectLaogai_Settings.png" width=180>](https://github.com/Seil0/Seil0.github.io/blob/master/images/Project_Laogai/ProjectLaogai_Settings.png)
 | 
				
			||||||
[<img src="https://raw.githubusercontent.com/Seil0/Seil0.github.io/master/images/Project_Laogai/ProjectLaogai_NavDrawer.png" width=180>](https://github.com/Seil0/Seil0.github.io/blob/master/images/Project_Laogai/ProjectLaogai_NavDrawer.png)
 | 
					[<img src="https://raw.githubusercontent.com/Seil0/Seil0.github.io/master/images/Project_Laogai/ProjectLaogai_NavDrawer.png" width=180>](https://github.com/Seil0/Seil0.github.io/blob/master/images/Project_Laogai/ProjectLaogai_NavDrawer.png)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ProjectLaogai © 2019 [@Seil0](https://git.mosad.xyz/Seil0), a mosad [mosad](http://www.mosad.xyz) Project
 | 
					ProjectLaogai © 2019 [@Seil0](https://git.mosad.xyz/Seil0), a [mosad](http://www.mosad.xyz) Project
 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,7 @@ android {
 | 
				
			|||||||
        minSdkVersion 23
 | 
					        minSdkVersion 23
 | 
				
			||||||
        targetSdkVersion 28
 | 
					        targetSdkVersion 28
 | 
				
			||||||
        versionCode 14
 | 
					        versionCode 14
 | 
				
			||||||
        versionName "0.4.92"
 | 
					        versionName "0.4.93"
 | 
				
			||||||
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 | 
					        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
 | 
				
			||||||
        resValue "string", "build_time", buildTime()
 | 
					        resValue "string", "build_time", buildTime()
 | 
				
			||||||
        setProperty("archivesBaseName", "projectlaogai-$versionName")
 | 
					        setProperty("archivesBaseName", "projectlaogai-$versionName")
 | 
				
			||||||
 | 
				
			|||||||
@ -36,17 +36,10 @@ import com.google.android.material.navigation.NavigationView
 | 
				
			|||||||
import kotlinx.android.synthetic.main.activity_main.*
 | 
					import kotlinx.android.synthetic.main.activity_main.*
 | 
				
			||||||
import kotlinx.android.synthetic.main.app_bar_main.*
 | 
					import kotlinx.android.synthetic.main.app_bar_main.*
 | 
				
			||||||
import org.mosad.seil0.projectlaogai.controller.CacheController
 | 
					import org.mosad.seil0.projectlaogai.controller.CacheController
 | 
				
			||||||
import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.mensaMenu
 | 
					 | 
				
			||||||
import org.mosad.seil0.projectlaogai.controller.PreferencesController
 | 
					import org.mosad.seil0.projectlaogai.controller.PreferencesController
 | 
				
			||||||
import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cColorAccent
 | 
					import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cColorAccent
 | 
				
			||||||
import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cColorPrimary
 | 
					import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cColorPrimary
 | 
				
			||||||
import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cCourse
 | 
					 | 
				
			||||||
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.controller.TCoRAPIController
 | 
					 | 
				
			||||||
import org.mosad.seil0.projectlaogai.fragments.*
 | 
					import org.mosad.seil0.projectlaogai.fragments.*
 | 
				
			||||||
import java.util.*
 | 
					 | 
				
			||||||
import kotlin.system.measureTimeMillis
 | 
					import kotlin.system.measureTimeMillis
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
 | 
					class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
 | 
				
			||||||
@ -136,56 +129,8 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    private fun load() {
 | 
					    private fun load() {
 | 
				
			||||||
        val startupTime = measureTimeMillis {
 | 
					        val startupTime = measureTimeMillis {
 | 
				
			||||||
            // load the settings
 | 
					            PreferencesController.load(this) // load the settings, must be finished before doing anything else
 | 
				
			||||||
            PreferencesController.load(this) // this must be finished before doing anything else
 | 
					            CacheController(this) // load the cache
 | 
				
			||||||
 | 
					 | 
				
			||||||
            val tcor = TCoRAPIController(this)
 | 
					 | 
				
			||||||
            val currentTime = System.currentTimeMillis() / 1000
 | 
					 | 
				
			||||||
            val currentDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
 | 
					 | 
				
			||||||
            val cal = Calendar.getInstance()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // TODO this will backfire if someone has to update before the server finished updating the timetable at 0001/0101
 | 
					 | 
				
			||||||
            // timetable sunday workaround
 | 
					 | 
				
			||||||
            cal.time = Date(timetableCacheTime * 1000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // update blocking if a) it`s monday and the last cache was not on a monday or b) the cache is older than 6 days
 | 
					 | 
				
			||||||
            if((currentDay == Calendar.MONDAY && cal.get(Calendar.DAY_OF_WEEK) != Calendar.MONDAY) || currentTime - timetableCacheTime > 518400) {
 | 
					 | 
				
			||||||
                println("updating timetable after sunday!")
 | 
					 | 
				
			||||||
                val jobA = TCoRAPIController.getTimetable(cCourse.courseName, 0, this)
 | 
					 | 
				
			||||||
                val jobB = TCoRAPIController.getTimetable(cCourse.courseName, 1, this)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                jobA.get()
 | 
					 | 
				
			||||||
                jobB.get()
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // new sunday bug fix
 | 
					 | 
				
			||||||
            CacheController.readMensa(this)
 | 
					 | 
				
			||||||
            cal.time = Date(mensaMenu.meta.updateTime * 1000)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // if it's monday and the last cache update was on sunday or is older than 24hr, update blocking
 | 
					 | 
				
			||||||
            if ((currentDay == Calendar.MONDAY && cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) || currentTime - mensaMenu.meta.updateTime > 86400) {
 | 
					 | 
				
			||||||
                println("update mensa blocking")
 | 
					 | 
				
			||||||
                TCoRAPIController.getMensa(this).get()
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // get the cached files
 | 
					 | 
				
			||||||
            val cache = CacheController(this)
 | 
					 | 
				
			||||||
            cache.readStartCache(cCourse.courseName)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            // check if an update is necessary
 | 
					 | 
				
			||||||
            if(currentTime - coursesCacheTime > 86400)
 | 
					 | 
				
			||||||
                tcor.getCoursesList()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if(currentTime - mensaCacheTime > 10800)
 | 
					 | 
				
			||||||
                TCoRAPIController.getMensa(this)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if(currentTime - timetableCacheTime > 10800) {
 | 
					 | 
				
			||||||
                TCoRAPIController.getTimetable(cCourse.courseName, 0, this)
 | 
					 | 
				
			||||||
                TCoRAPIController.getTimetable(cCourse.courseName, 1, this)
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        println("startup completed in $startupTime ms")
 | 
					        println("startup completed in $startupTime ms")
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -26,11 +26,13 @@ import android.content.Context
 | 
				
			|||||||
import com.google.gson.Gson
 | 
					import com.google.gson.Gson
 | 
				
			||||||
import com.google.gson.GsonBuilder
 | 
					import com.google.gson.GsonBuilder
 | 
				
			||||||
import com.google.gson.JsonParser
 | 
					import com.google.gson.JsonParser
 | 
				
			||||||
 | 
					import com.google.gson.reflect.TypeToken
 | 
				
			||||||
 | 
					import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cCourse
 | 
				
			||||||
 | 
					import org.mosad.seil0.projectlaogai.hsoparser.*
 | 
				
			||||||
import java.io.BufferedReader
 | 
					import java.io.BufferedReader
 | 
				
			||||||
import java.io.File
 | 
					import java.io.File
 | 
				
			||||||
import java.io.FileReader
 | 
					import java.io.FileReader
 | 
				
			||||||
import com.google.gson.reflect.TypeToken
 | 
					import java.util.*
 | 
				
			||||||
import org.mosad.seil0.projectlaogai.hsoparser.*
 | 
					 | 
				
			||||||
import kotlin.collections.ArrayList
 | 
					import kotlin.collections.ArrayList
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class CacheController(cont: Context) {
 | 
					class CacheController(cont: Context) {
 | 
				
			||||||
@ -38,13 +40,71 @@ class CacheController(cont: Context) {
 | 
				
			|||||||
    private val context = cont
 | 
					    private val context = cont
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    init {
 | 
					    init {
 | 
				
			||||||
        // TODO move cache check here
 | 
					        val cal = Calendar.getInstance()
 | 
				
			||||||
 | 
					        val currentDay = Calendar.getInstance().get(Calendar.DAY_OF_WEEK)
 | 
				
			||||||
 | 
					        val currentTime = System.currentTimeMillis() / 1000
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // check if we need to update the mensa data before displaying it
 | 
				
			||||||
 | 
					        readMensa(context)
 | 
				
			||||||
 | 
					        cal.time = Date(mensaMenu.meta.updateTime * 1000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // if a) it's monday and the last cache update was on sunday or b) the cache is older than 24hr, update blocking
 | 
				
			||||||
 | 
					        if ((currentDay == Calendar.MONDAY && cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) || currentTime - mensaMenu.meta.updateTime > 86400) {
 | 
				
			||||||
 | 
					            println("update mensa blocking")
 | 
				
			||||||
 | 
					            TCoRAPIController.getMensa(context).get()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // check if we need to update the timetables before displaying them
 | 
				
			||||||
 | 
					        readTimetable(cCourse.courseName, 0, context)
 | 
				
			||||||
 | 
					        cal.time = Date(timetables[0].meta.updateTime * 1000)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // if a) it`s monday and the last cache update was not on a sunday or b) the cache is older than 5 days, update blocking
 | 
				
			||||||
 | 
					        if((currentDay == Calendar.MONDAY && cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) || currentTime - timetables[0].meta.updateTime > 432000) {
 | 
				
			||||||
 | 
					            println("updating timetable after sunday!")
 | 
				
			||||||
 | 
					            val jobA = TCoRAPIController.getTimetable(cCourse.courseName, 0, context)
 | 
				
			||||||
 | 
					            val jobB = TCoRAPIController.getTimetable(cCourse.courseName, 1, context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            jobA.get()
 | 
				
			||||||
 | 
					            jobB.get()
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // check if an update is necessary, not blocking
 | 
				
			||||||
 | 
					        if(currentTime - PreferencesController.coursesCacheTime > 86400)
 | 
				
			||||||
 | 
					            TCoRAPIController.getCoursesList(context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(currentTime - PreferencesController.mensaCacheTime > 10800)
 | 
				
			||||||
 | 
					            TCoRAPIController.getMensa(context)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if(currentTime - PreferencesController.timetableCacheTime > 10800) {
 | 
				
			||||||
 | 
					            TCoRAPIController.getTimetable(cCourse.courseName, 0, context)
 | 
				
			||||||
 | 
					            TCoRAPIController.getTimetable(cCourse.courseName, 1, context)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        readStartCache(cCourse.courseName)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    companion object {
 | 
					    companion object {
 | 
				
			||||||
        var coursesList = ArrayList<Course>()
 | 
					        var coursesList = ArrayList<Course>()
 | 
				
			||||||
        var timetables = ArrayList<TimetableWeek>()
 | 
					        var timetables = ArrayList<TimetableCourseWeek>()
 | 
				
			||||||
        var mensaMenu = MensaMenu(MensaMeta(0, ""), MensaWeek(), MensaWeek())
 | 
					        var mensaMenu = MensaMenu()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * read the courses list from the cached file
 | 
				
			||||||
 | 
					         * add them to the coursesList object
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        private fun readCoursesList(context: Context) {
 | 
				
			||||||
 | 
					            val file = File(context.filesDir, "courses.json")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // make sure the file exists
 | 
				
			||||||
 | 
					            if (!file.exists())
 | 
				
			||||||
 | 
					                TCoRAPIController.getCoursesList(context).get()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            val fileReader = FileReader(file)
 | 
				
			||||||
 | 
					            val bufferedReader = BufferedReader(fileReader)
 | 
				
			||||||
 | 
					            val coursesObject = JsonParser().parse(bufferedReader.readLine()).asJsonObject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            coursesList = Gson().fromJson(coursesObject.getAsJsonArray("courses"), object : TypeToken<List<Course>>() {}.type)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * get the MensaMenu object from the cached json,
 | 
					         * get the MensaMenu object from the cached json,
 | 
				
			||||||
@ -62,7 +122,7 @@ class CacheController(cont: Context) {
 | 
				
			|||||||
            val bufferedReader = BufferedReader(fileReader)
 | 
					            val bufferedReader = BufferedReader(fileReader)
 | 
				
			||||||
            val mensaObject = JsonParser().parse(bufferedReader.readLine()).asJsonObject
 | 
					            val mensaObject = JsonParser().parse(bufferedReader.readLine()).asJsonObject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            mensaMenu = GsonBuilder().create().fromJson(mensaObject, MensaMenu(MensaMeta(0, ""), MensaWeek(), MensaWeek()).javaClass)
 | 
					            mensaMenu = GsonBuilder().create().fromJson(mensaObject, MensaMenu().javaClass)
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
@ -82,10 +142,10 @@ class CacheController(cont: Context) {
 | 
				
			|||||||
            val timetableObject = JsonParser().parse(bufferedReader.readLine()).asJsonObject
 | 
					            val timetableObject = JsonParser().parse(bufferedReader.readLine()).asJsonObject
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // make sure you add the single weeks in the exact order!
 | 
					            // make sure you add the single weeks in the exact order!
 | 
				
			||||||
            if (timetables.size == week) {
 | 
					            if (timetables.size > week) {
 | 
				
			||||||
                timetables.add(Gson().fromJson(timetableObject.getAsJsonObject("timetable"), TimetableWeek().javaClass))
 | 
					                timetables[week] = (Gson().fromJson(timetableObject, TimetableCourseWeek().javaClass))
 | 
				
			||||||
            } else if (timetables.size >= week) {
 | 
					            } else {
 | 
				
			||||||
                timetables[week] = Gson().fromJson(timetableObject.getAsJsonObject("timetable"), TimetableWeek().javaClass)
 | 
					                timetables.add(Gson().fromJson(timetableObject, TimetableCourseWeek().javaClass))
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@ -95,28 +155,10 @@ class CacheController(cont: Context) {
 | 
				
			|||||||
     * @param courseName the course name (e.g AI1)
 | 
					     * @param courseName the course name (e.g AI1)
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    fun readStartCache(courseName: String) {
 | 
					    fun readStartCache(courseName: String) {
 | 
				
			||||||
        readCoursesList()
 | 
					        readCoursesList(context)
 | 
				
			||||||
        readMensa(context)
 | 
					        readMensa(context)
 | 
				
			||||||
        readTimetable(courseName, 0, context)
 | 
					        readTimetable(courseName, 0, context)
 | 
				
			||||||
        readTimetable(courseName, 1, context)
 | 
					        readTimetable(courseName, 1, context)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * read the courses list from the cached file
 | 
					 | 
				
			||||||
     * add them to the coursesList object
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private fun readCoursesList() {
 | 
					 | 
				
			||||||
        val file = File(context.filesDir, "courses.json")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // make sure the file exists
 | 
					 | 
				
			||||||
        if (!file.exists())
 | 
					 | 
				
			||||||
            TCoRAPIController(context).getCoursesList().get()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        val fileReader = FileReader(file)
 | 
					 | 
				
			||||||
        val bufferedReader = BufferedReader(fileReader)
 | 
					 | 
				
			||||||
        val coursesObject = JsonParser().parse(bufferedReader.readLine()).asJsonObject
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        coursesList = Gson().fromJson(coursesObject.getAsJsonArray("courses"), object : TypeToken<List<Course>>() {}.type)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -28,13 +28,35 @@ import org.json.JSONObject
 | 
				
			|||||||
import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.coursesCacheTime
 | 
					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.mensaCacheTime
 | 
				
			||||||
import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.timetableCacheTime
 | 
					import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.timetableCacheTime
 | 
				
			||||||
import java.io.*
 | 
					import java.io.BufferedWriter
 | 
				
			||||||
 | 
					import java.io.File
 | 
				
			||||||
 | 
					import java.io.FileWriter
 | 
				
			||||||
import java.net.URL
 | 
					import java.net.URL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TCoRAPIController(cont: Context) {
 | 
					class TCoRAPIController {
 | 
				
			||||||
    private val context = cont
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    companion object {
 | 
					    companion object {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        /**
 | 
				
			||||||
 | 
					         * get the json object from tcor api and write it as file (cache)
 | 
				
			||||||
 | 
					         */
 | 
				
			||||||
 | 
					        fun getCoursesList(context: Context) = doAsync {
 | 
				
			||||||
 | 
					            val url = URL("https://tcor.mosad.xyz/courseList")
 | 
				
			||||||
 | 
					            val file = File(context.filesDir, "courses.json")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // read data from the API
 | 
				
			||||||
 | 
					            val coursesObject = JSONObject(url.readText()) //JSONObject(inReader.readLine())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // write the json object to a file
 | 
				
			||||||
 | 
					            val writer = BufferedWriter(FileWriter(file))
 | 
				
			||||||
 | 
					            writer.write(coursesObject.toString())
 | 
				
			||||||
 | 
					            writer.close()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            // update cache time
 | 
				
			||||||
 | 
					            coursesCacheTime = System.currentTimeMillis() / 1000
 | 
				
			||||||
 | 
					            PreferencesController.save(context)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        /**
 | 
					        /**
 | 
				
			||||||
         * get the json object from tcor api and write it as file (cache)
 | 
					         * get the json object from tcor api and write it as file (cache)
 | 
				
			||||||
         */
 | 
					         */
 | 
				
			||||||
@ -76,23 +98,4 @@ class TCoRAPIController(cont: Context) {
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * get the json object from tcor api and write it as file (cache)
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    fun getCoursesList() = doAsync {
 | 
					 | 
				
			||||||
        val url = URL("https://tcor.mosad.xyz/courseList")
 | 
					 | 
				
			||||||
        val file = File(context.filesDir, "courses.json")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // read data from the API
 | 
					 | 
				
			||||||
        val coursesObject = JSONObject(url.readText()) //JSONObject(inReader.readLine())
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // write the json object to a file
 | 
					 | 
				
			||||||
        val writer = BufferedWriter(FileWriter(file))
 | 
					 | 
				
			||||||
        writer.write(coursesObject.toString())
 | 
					 | 
				
			||||||
        writer.close()
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // update cache time
 | 
					 | 
				
			||||||
        coursesCacheTime = System.currentTimeMillis() / 1000
 | 
					 | 
				
			||||||
        PreferencesController.save(context)
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -133,7 +133,7 @@ class HomeFragment : Fragment() {
 | 
				
			|||||||
                if (timetables.isNotEmpty() && dayIndex < 6) {
 | 
					                if (timetables.isNotEmpty() && dayIndex < 6) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    // first check the current day
 | 
					                    // first check the current day
 | 
				
			||||||
                    dayCardView = addDayTimetable(timetables[0].days[dayIndex])
 | 
					                    dayCardView = addDayTimetable(timetables[0].timetable.days[dayIndex])
 | 
				
			||||||
                    dayCardView.setDayHeading(resources.getString(R.string.today_date, formatter.format(cal.time)))
 | 
					                    dayCardView.setDayHeading(resources.getString(R.string.today_date, formatter.format(cal.time)))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                    // if there are no lessons try to find the next day with a lesson
 | 
					                    // if there are no lessons try to find the next day with a lesson
 | 
				
			||||||
@ -202,7 +202,7 @@ class HomeFragment : Fragment() {
 | 
				
			|||||||
        var weekIndexSearch = startWeekIndex
 | 
					        var weekIndexSearch = startWeekIndex
 | 
				
			||||||
        loop@ while (dayTimetable == null && weekIndexSearch <= timetables.size) {
 | 
					        loop@ while (dayTimetable == null && weekIndexSearch <= timetables.size) {
 | 
				
			||||||
            for (i in (dayIndexSearch) ..5) {
 | 
					            for (i in (dayIndexSearch) ..5) {
 | 
				
			||||||
                dayTimetable = timetables[weekIndexSearch].days[i]
 | 
					                dayTimetable = timetables[weekIndexSearch].timetable.days[i]
 | 
				
			||||||
                cal.add(Calendar.DATE, 1)
 | 
					                cal.add(Calendar.DATE, 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                // add the timetable to the card, if it contains at least one lesson break!
 | 
					                // add the timetable to the card, if it contains at least one lesson break!
 | 
				
			||||||
 | 
				
			|||||||
@ -41,7 +41,8 @@ import org.mosad.seil0.projectlaogai.controller.TCoRAPIController
 | 
				
			|||||||
import org.mosad.seil0.projectlaogai.hsoparser.DataTypes
 | 
					import org.mosad.seil0.projectlaogai.hsoparser.DataTypes
 | 
				
			||||||
import org.mosad.seil0.projectlaogai.hsoparser.NotRetardedCalendar
 | 
					import org.mosad.seil0.projectlaogai.hsoparser.NotRetardedCalendar
 | 
				
			||||||
import org.mosad.seil0.projectlaogai.hsoparser.TimetableWeek
 | 
					import org.mosad.seil0.projectlaogai.hsoparser.TimetableWeek
 | 
				
			||||||
import org.mosad.seil0.projectlaogai.uicomponents.*
 | 
					import org.mosad.seil0.projectlaogai.uicomponents.DayCardView
 | 
				
			||||||
 | 
					import org.mosad.seil0.projectlaogai.uicomponents.LessonLinearLayout
 | 
				
			||||||
import java.text.SimpleDateFormat
 | 
					import java.text.SimpleDateFormat
 | 
				
			||||||
import java.util.*
 | 
					import java.util.*
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -64,7 +65,7 @@ class TimeTableFragment : Fragment() {
 | 
				
			|||||||
        // init actions
 | 
					        // init actions
 | 
				
			||||||
        initActions()
 | 
					        initActions()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (timetables[0].days.isNotEmpty() && timetables[1].days.isNotEmpty()) {
 | 
					        if (timetables[0].timetable.days.isNotEmpty() && timetables[1].timetable.days.isNotEmpty()) {
 | 
				
			||||||
            addInitWeeks()
 | 
					            addInitWeeks()
 | 
				
			||||||
        } else {
 | 
					        } else {
 | 
				
			||||||
            MaterialDialog(context!!)
 | 
					            MaterialDialog(context!!)
 | 
				
			||||||
@ -114,10 +115,10 @@ class TimeTableFragment : Fragment() {
 | 
				
			|||||||
        val calendar = Calendar.getInstance()
 | 
					        val calendar = Calendar.getInstance()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // add current week
 | 
					        // add current week
 | 
				
			||||||
        addWeek(dayIndex, 5, timetables[0], calendar).get()
 | 
					        addWeek(dayIndex, 5, timetables[0].timetable, calendar).get()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // add next week
 | 
					        // add next week
 | 
				
			||||||
        addWeek(0, dayIndex - 1, timetables[1], calendar)
 | 
					        addWeek(0, dayIndex - 1, timetables[1].timetable, calendar)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private fun addWeek(dayStart: Int, dayEnd: Int, timetable: TimetableWeek, calendar: Calendar) = doAsync {
 | 
					    private fun addWeek(dayStart: Int, dayEnd: Int, timetable: TimetableWeek, calendar: Calendar) = doAsync {
 | 
				
			||||||
@ -177,10 +178,10 @@ class TimeTableFragment : Fragment() {
 | 
				
			|||||||
            val calendar = Calendar.getInstance()
 | 
					            val calendar = Calendar.getInstance()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // add current week
 | 
					            // add current week
 | 
				
			||||||
            addWeek(dayIndex, 5, timetables[0], calendar).get()
 | 
					            addWeek(dayIndex, 5, timetables[0].timetable, calendar).get()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // add next week
 | 
					            // add next week
 | 
				
			||||||
            addWeek(0, dayIndex - 1, timetables[1], calendar)
 | 
					            addWeek(0, dayIndex - 1, timetables[1].timetable, calendar)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            refreshLayout_Timetable.isRefreshing = false
 | 
					            refreshLayout_Timetable.isRefreshing = false
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
				
			|||||||
@ -122,9 +122,9 @@ data class Meals(val meals: ArrayList<Meal>)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
data class MensaWeek(val days: Array<Meals> = Array(7) { Meals(ArrayList()) })
 | 
					data class MensaWeek(val days: Array<Meals> = Array(7) { Meals(ArrayList()) })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
data class MensaMeta(val updateTime: Long, val mensaName: String)
 | 
					data class MensaMeta(val updateTime: Long = 0, val mensaName: String = "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
data class MensaMenu(val meta: MensaMeta, val currentWeek: MensaWeek, val nextWeek: MensaWeek)
 | 
					data class MensaMenu(val meta: MensaMeta = MensaMeta(), val currentWeek: MensaWeek = MensaWeek(), val nextWeek: MensaWeek = MensaWeek())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// data classes for the timetable part
 | 
					// data classes for the timetable part
 | 
				
			||||||
data class Lesson(
 | 
					data class Lesson(
 | 
				
			||||||
@ -137,3 +137,7 @@ data class Lesson(
 | 
				
			|||||||
data class TimetableDay(val timeslots: Array<ArrayList<Lesson>> = Array(6) { ArrayList<Lesson>() })
 | 
					data class TimetableDay(val timeslots: Array<ArrayList<Lesson>> = Array(6) { ArrayList<Lesson>() })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
data class TimetableWeek(val days: Array<TimetableDay> = Array(6) { TimetableDay() })
 | 
					data class TimetableWeek(val days: Array<TimetableDay> = Array(6) { TimetableDay() })
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					data class TimetableCourseMeta(var updateTime: Long = 0, val courseName: String = "", val week: Int = 0, val link: String = "")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					data class TimetableCourseWeek(val meta: TimetableCourseMeta = TimetableCourseMeta(), var timetable: TimetableWeek = TimetableWeek())
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user