additional Subject are now added to the timetable

This commit is contained in:
Jannik 2020-06-12 00:51:50 +02:00
parent 69ce9fef5a
commit f6b00a8d81
Signed by: Seil0
GPG Key ID: E8459F3723C52C24
7 changed files with 104 additions and 38 deletions

View File

@ -33,6 +33,7 @@ import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.
import org.mosad.seil0.projectlaogai.util.Course import org.mosad.seil0.projectlaogai.util.Course
import org.mosad.seil0.projectlaogai.util.MensaMenu import org.mosad.seil0.projectlaogai.util.MensaMenu
import org.mosad.seil0.projectlaogai.util.TimetableCourseWeek import org.mosad.seil0.projectlaogai.util.TimetableCourseWeek
import org.mosad.seil0.projectlaogai.util.TimetableWeek
import java.io.BufferedReader import java.io.BufferedReader
import java.io.File import java.io.File
import java.io.FileReader import java.io.FileReader
@ -156,10 +157,25 @@ class CacheController(cont: Context) {
val timetableObject = JsonParser.parseString(bufferedReader.readLine()).asJsonObject val timetableObject = JsonParser.parseString(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!
val timetable = Gson().fromJson(timetableObject, TimetableCourseWeek().javaClass)
if (timetables.size > week) { if (timetables.size > week) {
timetables[week] = (Gson().fromJson(timetableObject, TimetableCourseWeek().javaClass)) timetables[week] = timetable
TimetableController.timetable[week] = TimetableWeek(
timetable.meta.weekIndex,
timetable.meta.weekNumberYear,
timetable.timetable.days
)
} else { } else {
timetables.add(Gson().fromJson(timetableObject, TimetableCourseWeek().javaClass)) timetables.add(timetable)
TimetableController.timetable.add(
TimetableWeek(
timetable.meta.weekIndex,
timetable.meta.weekNumberYear,
timetable.timetable.days
)
)
} }
} }
} }

View File

@ -1,18 +1,44 @@
/**
* ProjectLaogai
*
* Copyright 2019-2020 <seil0@mosad.xyz>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
*/
package org.mosad.seil0.projectlaogai.controller package org.mosad.seil0.projectlaogai.controller
import org.mosad.seil0.projectlaogai.util.Lesson import org.mosad.seil0.projectlaogai.util.Lesson
import org.mosad.seil0.projectlaogai.util.TimetableWeek
/** /**
* TODO this controller contains * TODO this controller contains
* * a list with all additional lessons * * a list with all additional lessons
* * the main course and additional info for timetables * * the main course and additional info for timetables
* * all concrete objects * * all concrete objects
*
* TODO add configurable week to addSubject() and removeSubject()
*/ */
class TimetableController { class TimetableController {
companion object { companion object {
val aLessons = HashMap<String, Lesson>() // the key is courseName_lessonID val timetable = ArrayList<TimetableWeek>()
val aSubjectMap = HashMap<String, ArrayList<String>>() val lessonMap = HashMap<String, Lesson>() // the key is courseName_lessonID
val subjectMap = HashMap<String, ArrayList<String>>()
/** /**
* add a subject to the subjects map and all it's lessons * add a subject to the subjects map and all it's lessons
@ -20,21 +46,25 @@ class TimetableController {
* @param courseName course to which the subject belongs * @param courseName course to which the subject belongs
* @param subject the subjects name * @param subject the subjects name
*/ */
fun addASubject(courseName: String, subject: String) { fun addSubject(courseName: String, subject: String) {
// add subject // add subject
if (aSubjectMap.containsKey(courseName)) { if (subjectMap.containsKey(courseName)) {
aSubjectMap[courseName]?.add(subject) subjectMap[courseName]?.add(subject)
} else { } else {
aSubjectMap[courseName] = arrayListOf(subject) subjectMap[courseName] = arrayListOf(subject)
} }
// add concrete lessons // add concrete lessons
TCoRAPIController.getLessons(courseName, subject, 0).forEach {lesson -> TCoRAPIController.getLessons(courseName, subject, 0).forEach {lesson ->
//the courseName, subject and lessonID, separator: - //the courseName, subject and lessonID, separator: -
val key = "$courseName-$subject-${lesson.lessonID}" val key = "$courseName-$subject-${lesson.lessonID}"
aLessons[key] = lesson lessonMap[key] = lesson
// add lesson to the timetable
val id = lesson.lessonID.split(".")
if(id.size == 3)
timetable[0].days[id[0].toInt()].timeslots[id[1].toInt()].add(lesson)
} }
println(aLessons)
} }
/** /**
@ -43,20 +73,22 @@ class TimetableController {
* @param courseName course to which the subject belongs * @param courseName course to which the subject belongs
* @param subject the subjects name * @param subject the subjects name
*/ */
fun removeASubject(courseName: String, subject: String) { fun removeSubject(courseName: String, subject: String) {
// remove subject // remove subject
subjectMap[courseName]?.remove(subject)
aSubjectMap[courseName]?.remove(subject)
// remove concrete lessons // remove concrete lessons
val iterator = lessonMap.iterator()
println(aLessons) while (iterator.hasNext()) {
val iter = aLessons.iterator() val it = iterator.next()
while (iter.hasNext()) {
val it = iter.next()
if(it.key.contains("$courseName-$subject")) { if(it.key.contains("$courseName-$subject")) {
println(it.key) // remove the lesson from the lessons list
iter.remove() // use iterator to remove, otherwise ConcurrentModificationException iterator.remove() // use iterator to remove, otherwise ConcurrentModificationException
// remove the lesson from the timetable
val id = it.value.lessonID.split(".")
if(id.size == 3)
timetable[0].days[id[0].toInt()].timeslots[id[1].toInt()].remove(it.value)
} }
} }
} }

View File

@ -34,7 +34,7 @@ import kotlinx.android.synthetic.main.fragment_home.*
import kotlinx.coroutines.* import kotlinx.coroutines.*
import org.mosad.seil0.projectlaogai.R import org.mosad.seil0.projectlaogai.R
import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.mensaMenu import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.mensaMenu
import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.timetables import org.mosad.seil0.projectlaogai.controller.TimetableController
import org.mosad.seil0.projectlaogai.util.Meal import org.mosad.seil0.projectlaogai.util.Meal
import org.mosad.seil0.projectlaogai.util.TimetableDay import org.mosad.seil0.projectlaogai.util.TimetableDay
import org.mosad.seil0.projectlaogai.uicomponents.DayCardView import org.mosad.seil0.projectlaogai.uicomponents.DayCardView
@ -119,7 +119,7 @@ class HomeFragment : Fragment() {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
if (isAdded && timetables.isNotEmpty()) { if (isAdded && TimetableController.timetable.isNotEmpty()) {
try { try {
val dayCardView = findNextDay(NotRetardedCalendar.getDayOfWeekIndex()) val dayCardView = findNextDay(NotRetardedCalendar.getDayOfWeekIndex())
linLayout_Home.addView(dayCardView) linLayout_Home.addView(dayCardView)
@ -144,12 +144,13 @@ class HomeFragment : Fragment() {
var dayIndexSearch = startDayIndex var dayIndexSearch = startDayIndex
var weekIndexSearch = 0 var weekIndexSearch = 0
while (dayTimetable == null && weekIndexSearch < timetables.size) { while (dayTimetable == null && weekIndexSearch < TimetableController.timetable.size) {
for (dayIndex in dayIndexSearch..5) { for (dayIndex in dayIndexSearch..5) {
dayTimetable = timetables[weekIndexSearch].timetable.days[dayIndex] dayTimetable = TimetableController.timetable[weekIndexSearch].days[dayIndex]
// some wired calendar magic, calculate the correct date to be shown ((timetable week - current week * 7) + (dayIndex - dayIndex of current week) // some wired calendar magic, calculate the correct date to be shown ((timetable week - current week * 7) + (dayIndex - dayIndex of current week)
val daysToAdd = (timetables[weekIndexSearch].meta.weekNumberYear - NotRetardedCalendar.getWeekOfYear()) * 7 + (dayIndex - NotRetardedCalendar.getDayOfWeekIndex()) val daysToAdd = ((TimetableController.timetable[weekIndexSearch].weekNumberYear - NotRetardedCalendar.getWeekOfYear())
* 7 + (dayIndex - NotRetardedCalendar.getDayOfWeekIndex()))
dayCardView.addTimetableDay(dayTimetable, daysToAdd) dayCardView.addTimetableDay(dayTimetable, daysToAdd)
// if there are no lessons don't show the dayCardView // if there are no lessons don't show the dayCardView

View File

@ -153,7 +153,7 @@ class SettingsFragment : Fragment() {
linLayoutManageLessons.setOnClickListener { linLayoutManageLessons.setOnClickListener {
val lessons = ArrayList<String>() val lessons = ArrayList<String>()
TimetableController.aSubjectMap.forEach { pair -> TimetableController.subjectMap.forEach { pair ->
pair.value.forEach { pair.value.forEach {
lessons.add("${pair.key} - $it") lessons.add("${pair.key} - $it")
} }
@ -169,7 +169,7 @@ class SettingsFragment : Fragment() {
listItemsMultiChoice(items = lessons) { dialog, indices, items -> listItemsMultiChoice(items = lessons) { dialog, indices, items ->
items.forEach { items.forEach {
val list = it.split(" - ") val list = it.split(" - ")
TimetableController.removeASubject(list[0], list[1]) TimetableController.removeSubject(list[0], list[1])
// TODO save // TODO save
} }
} }

View File

@ -40,6 +40,7 @@ import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.timeta
import org.mosad.seil0.projectlaogai.controller.PreferencesController import org.mosad.seil0.projectlaogai.controller.PreferencesController
import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cCourse import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cCourse
import org.mosad.seil0.projectlaogai.controller.TCoRAPIController import org.mosad.seil0.projectlaogai.controller.TCoRAPIController
import org.mosad.seil0.projectlaogai.controller.TimetableController
import org.mosad.seil0.projectlaogai.uicomponents.AddSubjectDialog import org.mosad.seil0.projectlaogai.uicomponents.AddSubjectDialog
import org.mosad.seil0.projectlaogai.uicomponents.DayCardView import org.mosad.seil0.projectlaogai.uicomponents.DayCardView
import org.mosad.seil0.projectlaogai.util.NotRetardedCalendar import org.mosad.seil0.projectlaogai.util.NotRetardedCalendar
@ -64,6 +65,8 @@ class TimeTableFragment : Fragment() {
if (timetables.size > 1 && timetables[0].timetable.days.isNotEmpty() && timetables[1].timetable.days.isNotEmpty()) { if (timetables.size > 1 && timetables[0].timetable.days.isNotEmpty() && timetables[1].timetable.days.isNotEmpty()) {
initTimetable() initTimetable()
println(TimetableController.timetable)
} else { } else {
MaterialDialog(context!!) MaterialDialog(context!!)
.title(R.string.error) .title(R.string.error)
@ -85,7 +88,7 @@ class TimeTableFragment : Fragment() {
// show the AddLessonDialog if the ftaBtn is clicked // show the AddLessonDialog if the ftaBtn is clicked
faBtnAddSubject.setOnClickListener { faBtnAddSubject.setOnClickListener {
AddSubjectDialog(context!!).initialize().show{ AddSubjectDialog(context!!).initialize(this@TimeTableFragment).show{
getActionButton(WhichButton.POSITIVE).updateTextColor(PreferencesController.cColorAccent) getActionButton(WhichButton.POSITIVE).updateTextColor(PreferencesController.cColorAccent)
getActionButton(WhichButton.NEGATIVE).updateTextColor(PreferencesController.cColorAccent) getActionButton(WhichButton.NEGATIVE).updateTextColor(PreferencesController.cColorAccent)
} }
@ -110,19 +113,21 @@ class TimeTableFragment : Fragment() {
addTimetableWeek(currentDayIndex, 5, 0).join() // add current week addTimetableWeek(currentDayIndex, 5, 0).join() // add current week
addTimetableWeek(0, currentDayIndex - 1, 1) // add next week addTimetableWeek(0, currentDayIndex - 1, 1) // add next week
// TODO add additional lessons
} }
private fun addTimetableWeek(dayBegin: Int, dayEnd: Int, week: Int) = GlobalScope.launch(Dispatchers.Main) { private fun addTimetableWeek(dayBegin: Int, dayEnd: Int, week: Int) = GlobalScope.launch(Dispatchers.Main) {
val timetable = timetables[week].timetable //val timetable = timetables[week].timetable
val timetableMeta = timetables[week].meta //val timetableMeta = timetables[week].meta
val timetable = TimetableController.timetable[week]
for (dayIndex in dayBegin..dayEnd) { for (dayIndex in dayBegin..dayEnd) {
val dayCardView = DayCardView(context!!) val dayCardView = DayCardView(context!!)
// some wired calendar magic, calculate the correct date to be shown ((timetable week - current week * 7) + (dayIndex - dayIndex of current week) // some wired calendar magic, calculate the correct date to be shown
val daysToAdd = (timetableMeta.weekNumberYear - NotRetardedCalendar.getWeekOfYear()) * 7 + (dayIndex - NotRetardedCalendar.getDayOfWeekIndex()) // ((timetable week - current week * 7) + (dayIndex - dayIndex of current week)
val daysToAdd = ((TimetableController.timetable[week].weekNumberYear - NotRetardedCalendar.getWeekOfYear())
* 7 + (dayIndex - NotRetardedCalendar.getDayOfWeekIndex()))
dayCardView.addTimetableDay(timetable.days[dayIndex], daysToAdd) dayCardView.addTimetableDay(timetable.days[dayIndex], daysToAdd)
// if there are no lessons don't show the dayCardView // if there are no lessons don't show the dayCardView
@ -143,6 +148,11 @@ class TimeTableFragment : Fragment() {
CacheController.readTimetable(cCourse.courseName, 0, context!!) CacheController.readTimetable(cCourse.courseName, 0, context!!)
CacheController.readTimetable(cCourse.courseName, 1, context!!) CacheController.readTimetable(cCourse.courseName, 1, context!!)
refreshUI()
}
// TODO rename
fun refreshUI() = GlobalScope.launch(Dispatchers.Default) {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {
// remove all menus from the layout // remove all menus from the layout
linLayout_Timetable.removeAllViews() linLayout_Timetable.removeAllViews()

View File

@ -38,6 +38,7 @@ import org.mosad.seil0.projectlaogai.R
import org.mosad.seil0.projectlaogai.controller.CacheController import org.mosad.seil0.projectlaogai.controller.CacheController
import org.mosad.seil0.projectlaogai.controller.TCoRAPIController import org.mosad.seil0.projectlaogai.controller.TCoRAPIController
import org.mosad.seil0.projectlaogai.controller.TimetableController import org.mosad.seil0.projectlaogai.controller.TimetableController
import org.mosad.seil0.projectlaogai.fragments.TimeTableFragment
import org.mosad.seil0.projectlaogai.util.Course import org.mosad.seil0.projectlaogai.util.Course
import java.util.stream.Collectors import java.util.stream.Collectors
@ -59,7 +60,7 @@ class AddSubjectDialog(_context: Context) {
/** /**
* create a new AddLessonDialog (BottomSheet) * create a new AddLessonDialog (BottomSheet)
*/ */
fun initialize(): MaterialDialog { fun initialize(ttf: TimeTableFragment): MaterialDialog {
val dialog = MaterialDialog(context, BottomSheet()) val dialog = MaterialDialog(context, BottomSheet())
.title(R.string.add_lesson) .title(R.string.add_lesson)
.message(R.string.add_lesson_desc) .message(R.string.add_lesson_desc)
@ -70,8 +71,11 @@ class AddSubjectDialog(_context: Context) {
println("add lesson \"$selectedCourse: $selectedSubject\"") println("add lesson \"$selectedCourse: $selectedSubject\"")
println(lessons.toString()) println(lessons.toString())
TimetableController.addASubject(selectedCourse, selectedSubject) TimetableController.addSubject(selectedCourse, selectedSubject)
// TODO refresh timetable (add a function to show additional lessons) // TODO refresh timetable (add a function to show additional lessons)
runBlocking {
ttf.refreshUI()
}
// TODO save // TODO save
} }
.negativeButton(R.string.cancel) .negativeButton(R.string.cancel)

View File

@ -106,8 +106,11 @@ 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 weekIndex: Int = 0, val weekNumberYear: Int = 0, val days: Array<TimetableDay> = Array(6) { TimetableDay() })
// TCoR
data class TimetableWeekTCoR(val days: Array<TimetableDay> = Array(6) { TimetableDay() })
data class TimetableCourseMeta(val updateTime: Long = 0, val courseName: String = "", val weekIndex: Int = 0, val weekNumberYear: Int = 0, val link: String = "") data class TimetableCourseMeta(val updateTime: Long = 0, val courseName: String = "", val weekIndex: Int = 0, val weekNumberYear: Int = 0, val link: String = "")
data class TimetableCourseWeek(val meta: TimetableCourseMeta = TimetableCourseMeta(), var timetable: TimetableWeek = TimetableWeek()) data class TimetableCourseWeek(val meta: TimetableCourseMeta = TimetableCourseMeta(), var timetable: TimetableWeekTCoR = TimetableWeekTCoR())