diff --git a/app/build.gradle b/app/build.gradle index 21666e9..5ea0438 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,13 +7,13 @@ apply plugin: 'kotlin-android-extensions' android { signingConfigs { } - compileSdkVersion 28 + compileSdkVersion 29 defaultConfig { applicationId "org.mosad.seil0.projectlaogai" minSdkVersion 23 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 14 - versionName "0.5.0" + versionName "0.4.99" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" resValue "string", "build_time", buildTime() setProperty("archivesBaseName", "projectlaogai-$versionName") diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt index c475f98..e7aeade 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/HomeFragment.kt @@ -30,19 +30,16 @@ import android.view.View import android.view.ViewGroup import android.widget.TextView import androidx.fragment.app.Fragment -import com.afollestad.materialdialogs.MaterialDialog import kotlinx.android.synthetic.main.fragment_home.* import org.jetbrains.anko.doAsync import org.jetbrains.anko.uiThread import org.mosad.seil0.projectlaogai.R import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.mensaMenu import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.timetables -import org.mosad.seil0.projectlaogai.hsoparser.DataTypes import org.mosad.seil0.projectlaogai.hsoparser.Meal import org.mosad.seil0.projectlaogai.hsoparser.NotRetardedCalendar import org.mosad.seil0.projectlaogai.hsoparser.TimetableDay import org.mosad.seil0.projectlaogai.uicomponents.DayCardView -import org.mosad.seil0.projectlaogai.uicomponents.LessonLinearLayout import org.mosad.seil0.projectlaogai.uicomponents.MealLinearLayout import java.text.SimpleDateFormat import java.util.* @@ -53,7 +50,7 @@ import java.util.* */ class HomeFragment : Fragment() { - private val className = "MyActivity" + private val className = "HomeFragment" private val formatter = SimpleDateFormat("E dd.MM", Locale.getDefault()) override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -80,10 +77,10 @@ class HomeFragment : Fragment() { if (isAdded) { if (cal.get(Calendar.HOUR_OF_DAY) < 15) { - dayMeals = mensaMenu.currentWeek.days[NotRetardedCalendar().getDayOfWeekIndex()].meals + dayMeals = mensaMenu.currentWeek.days[NotRetardedCalendar.getDayOfWeekIndex()].meals mensaCardView.setDayHeading(activity!!.resources.getString(R.string.today_date, formatter.format(cal.time))) } else { - dayMeals = mensaMenu.currentWeek.days[NotRetardedCalendar().getTomorrowWeekIndex()].meals + dayMeals = mensaMenu.currentWeek.days[NotRetardedCalendar.getTomorrowWeekIndex()].meals cal.add(Calendar.DATE, 1) mensaCardView.setDayHeading(activity!!.resources.getString(R.string.tomorrow_date, formatter.format(cal.time))) } @@ -121,101 +118,52 @@ class HomeFragment : Fragment() { * add the current timetable to the home screen */ private fun addTimeTable() = doAsync { - val dayIndex = NotRetardedCalendar().getDayOfWeekIndex() - val cal = Calendar.getInstance() - var dayCardView: DayCardView uiThread { - if (isAdded) { - if (timetables.isNotEmpty() && dayIndex < 6) { - - // first check the current day - dayCardView = addDayTimetable(timetables[0].timetable.days[dayIndex]) - 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 (dayCardView.getLinLayoutDay().childCount <= 1) - dayCardView = findNextDay(0, dayIndex + 1) - + if (isAdded && timetables.isNotEmpty()) { + try { + val dayCardView = findNextDay(NotRetardedCalendar.getDayOfWeekIndex()) linLayout_Home.addView(dayCardView) - } else if (dayIndex == 6) { - // if that's the case it's sunday - dayCardView = findNextDay(1, 0) - linLayout_Home.addView(dayCardView) - } else { - MaterialDialog(context!!) - .title(R.string.error) - .message(R.string.timetable_error) - .show() - Log.e(className, "could not load timetable") // TODO send feedback + } catch (ex: Exception) { + Log.e(className, "could not load timetable", ex) // TODO send feedback } } } } - /** - * add the timetable of one day to the home-screen - * @param dayTimetable the day you wish to add - */ - private fun addDayTimetable(dayTimetable: TimetableDay) : DayCardView{ - var helpLesson = LessonLinearLayout(context) - val dayCardView = DayCardView(context!!) - - for ((tsIndex, timeslot) in dayTimetable.timeslots.withIndex()) { - - for(lesson in timeslot) { - if(lesson.lessonSubject.isNotEmpty()) { - - val lessonLayout = LessonLinearLayout(context) - lessonLayout.setLesson(lesson, DataTypes().getTime()[tsIndex]) - dayCardView.getLinLayoutDay().addView(lessonLayout) - - if (lesson != timeslot.last()) { - lessonLayout.disableDivider() - } - - helpLesson = lessonLayout - } - } - } - - helpLesson.disableDivider() - - return dayCardView - } - /** * find the next day with a lesson - * @param startWeekIndex the week you want to start searching + * start at week 0, startDayIndex and search every cached week until we find a) a day with a timetable + * or b) we find no timetable and add a no lesson card * @param startDayIndex the day index you want to start searching * @return a DayCardView with all lessons added */ - private fun findNextDay(startWeekIndex: Int, startDayIndex: Int) : DayCardView { - val cal = Calendar.getInstance() - var dayCardView = DayCardView(context!!) + private fun findNextDay(startDayIndex: Int) : DayCardView { + val dayCardView = DayCardView(context!!) var dayTimetable: TimetableDay? = null var dayIndexSearch = startDayIndex - var weekIndexSearch = startWeekIndex + var weekIndexSearch = 0 - loop@ while (dayTimetable == null && weekIndexSearch <= timetables.size) { - for (i in (dayIndexSearch) ..5) { - dayTimetable = timetables[weekIndexSearch].timetable.days[i] - cal.add(Calendar.DATE, 1) + while (dayTimetable == null && weekIndexSearch < timetables.size) { + for (dayIndex in dayIndexSearch..5) { + dayTimetable = timetables[weekIndexSearch].timetable.days[dayIndex] - // add the timetable to the card, if it contains at least one lesson break! - dayCardView = addDayTimetable(dayTimetable) - dayCardView.setDayHeading(formatter.format(cal.time)) + // some wired calendar magic, calculate the correct date to be shown ((timetable week - current week * 7) + days of calendar week + 1) + val daysToAdd = (timetables[weekIndexSearch].meta.weekNumberYear - NotRetardedCalendar.getWeekOfYear() - 1) * 7 + dayIndex +1 + dayCardView.addTimetableDay(dayTimetable, daysToAdd) + // if there are no lessons don't show the dayCardView if (dayCardView.getLinLayoutDay().childCount > 1) return dayCardView } - dayIndexSearch = 0 + weekIndexSearch++ - cal.add(Calendar.DATE, 1) + dayIndexSearch = 0 } + // there was no day found in the cached weeks, add no lesson card dayCardView.setDayHeading(formatter.format(Calendar.getInstance().time)) dayCardView.getLinLayoutDay().addView(getNoCard(resources.getString(R.string.no_lesson_today))) // if there is no lecture at all show the no lesson card return dayCardView diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt index 1341914..771637e 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/MensaFragment.kt @@ -54,7 +54,7 @@ class MensaFragment : Fragment() { refreshAction() // add the current week (week starts on sunday) - val dayCurrent = if(NotRetardedCalendar().getDayOfWeekIndex() == 6) 0 else NotRetardedCalendar().getDayOfWeekIndex() + val dayCurrent = if(NotRetardedCalendar.getDayOfWeekIndex() == 6) 0 else NotRetardedCalendar.getDayOfWeekIndex() addWeek(mensaMenu.currentWeek, dayCurrent).get() // add the next week @@ -128,7 +128,7 @@ class MensaFragment : Fragment() { linLayout_Mensa.removeAllViews() // add the refreshed menus - val dayCurrent = if (NotRetardedCalendar().getDayOfWeekIndex() == 6) 0 else NotRetardedCalendar().getDayOfWeekIndex() + val dayCurrent = if (NotRetardedCalendar.getDayOfWeekIndex() == 6) 0 else NotRetardedCalendar.getDayOfWeekIndex() addWeek(mensaMenu.currentWeek, dayCurrent).get() // add the next week diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt index 41de6c2..bd4a419 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/TimeTableFragment.kt @@ -38,11 +38,8 @@ import org.mosad.seil0.projectlaogai.controller.CacheController import org.mosad.seil0.projectlaogai.controller.CacheController.Companion.timetables import org.mosad.seil0.projectlaogai.controller.PreferencesController.Companion.cCourse import org.mosad.seil0.projectlaogai.controller.TCoRAPIController -import org.mosad.seil0.projectlaogai.hsoparser.DataTypes import org.mosad.seil0.projectlaogai.hsoparser.NotRetardedCalendar -import org.mosad.seil0.projectlaogai.hsoparser.TimetableWeek import org.mosad.seil0.projectlaogai.uicomponents.DayCardView -import org.mosad.seil0.projectlaogai.uicomponents.LessonLinearLayout import java.text.SimpleDateFormat import java.util.* @@ -52,7 +49,6 @@ import java.util.* */ class TimeTableFragment : Fragment() { - private val formatter = SimpleDateFormat("E dd.MM", Locale.getDefault()) private lateinit var scrollViewTimetable: ScrollView private lateinit var faBtnAddLesson: FloatingActionButton @@ -111,53 +107,30 @@ class TimeTableFragment : Fragment() { * add the current and next weeks lessons */ private fun addInitWeeks() = doAsync { - val dayIndex = NotRetardedCalendar().getDayOfWeekIndex() - val calendar = Calendar.getInstance() + val currentDayIndex = NotRetardedCalendar.getDayOfWeekIndex() - // add current week - addWeek(dayIndex, 5, timetables[0].timetable, calendar).get() - - // add next week - addWeek(0, dayIndex - 1, timetables[1].timetable, calendar) + addWeek(currentDayIndex, 5, 0).get() // add current week + addWeek(0, currentDayIndex - 1, 1) // add next week } - private fun addWeek(dayStart: Int, dayEnd: Int, timetable: TimetableWeek, calendar: Calendar) = doAsync { + private fun addWeek(startDayIndex: Int, dayEndIndex: Int, weekIndex: Int) = doAsync { + val timetable = timetables[weekIndex].timetable + val timetableMeta = timetables[weekIndex].meta + uiThread { - for (day in dayStart..dayEnd) { - var helpLesson = LessonLinearLayout(context) + for (dayIndex in startDayIndex..dayEndIndex) { val dayCardView = DayCardView(context!!) - dayCardView.setDayHeading(formatter.format(calendar.time)) - // for each timeslot of the day - for ((tsIndex, timeslot) in timetable.days[day].timeslots.withIndex()) { - - for(lesson in timeslot) { - - if(lesson.lessonSubject.isNotEmpty()) { - - val lessonLayout = LessonLinearLayout(context) - lessonLayout.setLesson(lesson, DataTypes().getTime()[tsIndex]) - dayCardView.getLinLayoutDay().addView(lessonLayout) - - if (lesson != timeslot.last()) - lessonLayout.disableDivider() - - helpLesson = lessonLayout - } - } - } - - helpLesson.disableDivider() - calendar.add(Calendar.DATE, 1) + // some wired calendar magic, calculate the correct date to be shown ((timetable week - current week * 7) + days of calendar week + 1) + val daysToAdd = (timetableMeta.weekNumberYear - NotRetardedCalendar.getWeekOfYear() - 1) * 7 + dayIndex +1 + dayCardView.addTimetableDay(timetable.days[dayIndex], daysToAdd) // if there are no lessons don't show the dayCardView if (dayCardView.getLinLayoutDay().childCount > 1) linLayout_Timetable.addView(dayCardView) } - - calendar.add(Calendar.DATE, 1) // before this we are at a sunday (no lecture on sundays!) } } @@ -174,14 +147,13 @@ class TimeTableFragment : Fragment() { linLayout_Timetable.removeAllViews() // add the refreshed timetables - val dayIndex = NotRetardedCalendar().getDayOfWeekIndex() - val calendar = Calendar.getInstance() + val dayIndex = NotRetardedCalendar.getDayOfWeekIndex() // add current week - addWeek(dayIndex, 5, timetables[0].timetable, calendar).get() + addWeek(dayIndex, 5, 0).get() // add next week - addWeek(0, dayIndex - 1, timetables[1].timetable, calendar) + addWeek(0, dayIndex - 1, 1) refreshLayout_Timetable.isRefreshing = false } 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 24ff111..f3936f3 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 @@ -83,31 +83,40 @@ class DataTypes { } class NotRetardedCalendar { - private val calendar = Calendar.getInstance()!! + companion object { + private val calendar = Calendar.getInstance() - fun getDayOfWeekIndex(): Int { - return when (calendar.get(Calendar.DAY_OF_WEEK)) { - Calendar.MONDAY -> 0 - Calendar.TUESDAY -> 1 - Calendar.WEDNESDAY -> 2 - Calendar.THURSDAY -> 3 - Calendar.FRIDAY -> 4 - Calendar.SATURDAY -> 5 - Calendar.SUNDAY -> 6 - else -> 7 + fun getDayOfWeekIndex(): Int { + return when (calendar.get(Calendar.DAY_OF_WEEK)) { + Calendar.MONDAY -> 0 + Calendar.TUESDAY -> 1 + Calendar.WEDNESDAY -> 2 + Calendar.THURSDAY -> 3 + Calendar.FRIDAY -> 4 + Calendar.SATURDAY -> 5 + Calendar.SUNDAY -> 6 + else -> 7 + } } - } - fun getTomorrowWeekIndex(): Int { - return when (calendar.get(Calendar.DAY_OF_WEEK)) { - Calendar.MONDAY -> 1 - Calendar.TUESDAY -> 2 - Calendar.WEDNESDAY -> 3 - Calendar.THURSDAY -> 4 - Calendar.FRIDAY -> 5 - Calendar.SATURDAY -> 6 - Calendar.SUNDAY -> 0 - else -> 7 + fun getTomorrowWeekIndex(): Int { + return when (calendar.get(Calendar.DAY_OF_WEEK)) { + Calendar.MONDAY -> 1 + Calendar.TUESDAY -> 2 + Calendar.WEDNESDAY -> 3 + Calendar.THURSDAY -> 4 + Calendar.FRIDAY -> 5 + Calendar.SATURDAY -> 6 + Calendar.SUNDAY -> 0 + else -> 7 + } + } + + fun getWeekOfYear(): Int { + return when (calendar.get(Calendar.DAY_OF_WEEK)) { + Calendar.SUNDAY -> Calendar.getInstance().get(Calendar.WEEK_OF_YEAR) - 1 + else -> Calendar.getInstance().get(Calendar.WEEK_OF_YEAR) + } } } } @@ -138,6 +147,6 @@ data class TimetableDay(val timeslots: Array> = Array(6) { Arr data class TimetableWeek(val days: Array = Array(6) { TimetableDay() }) -data class TimetableCourseMeta(var updateTime: Long = 0, val courseName: String = "", val week: 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()) diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/DayCardView.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/DayCardView.kt index 7ab1287..b1e9a95 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/DayCardView.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/DayCardView.kt @@ -28,9 +28,15 @@ import android.widget.LinearLayout import androidx.cardview.widget.CardView import kotlinx.android.synthetic.main.cardview_day.view.* import org.mosad.seil0.projectlaogai.R +import org.mosad.seil0.projectlaogai.hsoparser.DataTypes +import org.mosad.seil0.projectlaogai.hsoparser.TimetableDay +import java.text.SimpleDateFormat +import java.util.* class DayCardView(context: Context) : CardView(context) { + private val formatter = SimpleDateFormat("E dd.MM", Locale.getDefault()) + init { inflate(context, R.layout.cardview_day,this) @@ -46,4 +52,38 @@ class DayCardView(context: Context) : CardView(context) { txtView_DayHeading.text = heading } + /** + * add the lessons of one day to the dayCardView + * @param timetable a timetable containing the day (and it's lessons) to be added + */ + fun addTimetableDay(timetable: TimetableDay, daysToAdd: Int) { + var lastLesson = LessonLinearLayout(context) + + // set the heading + val cal = Calendar.getInstance() + cal.add(Calendar.DATE, daysToAdd) + txtView_DayHeading.text = formatter.format(cal.time) + + // for every timeslot of that timetable + for ((tsIndex, timeslot) in timetable.timeslots.withIndex()) { + + for (lesson in timeslot) { + if (lesson.lessonSubject.isNotEmpty()) { + + val lessonLayout = LessonLinearLayout(context) + lessonLayout.setLesson(lesson, DataTypes().getTime()[tsIndex]) + linLayout_Day.addView(lessonLayout) + + if (lesson != timeslot.last()) { + lessonLayout.disableDivider() + } + + lastLesson = lessonLayout + } + } + } + + lastLesson.disableDivider() // disable the divider for the last lesson of the day + } + } \ No newline at end of file diff --git a/app/src/main/res/layouts/activities/layout/linearlayout_lesson.xml b/app/src/main/res/layouts/activities/layout/linearlayout_lesson.xml index 90e6103..591ce3f 100644 --- a/app/src/main/res/layouts/activities/layout/linearlayout_lesson.xml +++ b/app/src/main/res/layouts/activities/layout/linearlayout_lesson.xml @@ -1,35 +1,52 @@ + android:id="@+id/linLayout_lesson" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingLeft="7dp" + android:paddingTop="2dp" + android:paddingRight="7dp" + android:paddingBottom="3dp"> + android:layout_height="wrap_content" + android:orientation="horizontal"> + + android:layout_height="wrap_content" + android:layout_weight="1" + android:textSize="15sp" /> + + android:textColor="@color/textSecondary" /> + + android:layout_height="wrap_content" + android:textSize="15sp" /> + + android:layout_height="wrap_content" /> + + android:layout_marginTop="2dp" + android:background="?dividerColor" /> \ No newline at end of file