From 47d48fb4d9e9653d70282dcb4f50b2c2c09aa38c Mon Sep 17 00:00:00 2001 From: Seil0 Date: Mon, 29 Oct 2018 13:04:20 +0100 Subject: [PATCH] added the mensa parser --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 1 + .../uicomponents/MensDayCardView.kt | 28 ----- .../mosad/seil0/projectlaogai/HomeFragment.kt | 33 ++++-- .../seil0/projectlaogai/MensaFragment.kt | 100 ++++++++++++----- .../projectlaogai/hsoparser/DataTypes.kt | 14 +++ .../projectlaogai/hsoparser/MensaParser.kt | 82 ++++++++++++++ .../hsoparser/TimeTableParser.kt | 101 ++++++++++++++++++ .../uicomponents/LessonCardView.kt | 2 +- .../uicomponents/MensaDayCardView.kt | 54 ++++++++++ .../uicomponents/MenuCardView.kt | 6 +- app/src/main/res/layout/menu_cardview.xml | 2 +- 12 files changed, 363 insertions(+), 61 deletions(-) delete mode 100644 app/src/main/java/ord/mosad/seil0/projectlaogai/uicomponents/MensDayCardView.kt create mode 100644 app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt create mode 100644 app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/MensaParser.kt create mode 100644 app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/TimeTableParser.kt rename app/src/main/java/{ord => org}/mosad/seil0/projectlaogai/uicomponents/LessonCardView.kt (96%) create mode 100644 app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MensaDayCardView.kt rename app/src/main/java/{ord => org}/mosad/seil0/projectlaogai/uicomponents/MenuCardView.kt (85%) diff --git a/app/build.gradle b/app/build.gradle index b88014f..a4b5c15 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,6 +30,7 @@ dependencies { implementation 'com.google.android.material:material:1.0.0' implementation 'androidx.constraintlayout:constraintlayout:2.0.0-alpha2' implementation 'org.jsoup:jsoup:1.11.3' + implementation "org.jetbrains.anko:anko-commons:0.10.4" implementation 'com.afollestad.material-dialogs:core:2.0.0-beta4' implementation 'com.afollestad.material-dialogs:color:2.0.0-beta4' diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 7beb404..1ff019e 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + = mensaParser.getMensaMenuDay(mensaParser.getMensaMenu(), Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) + + uiThread { + for(part in dayMenus[0].parts) { + txtViewMenu1.append(part) + } + + for(part in dayMenus[1].parts) { + txtViewMenu2.append(part) + } + } + + } + } @SuppressLint("SetTextI18n") diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/MensaFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/MensaFragment.kt index 7d851bb..4f3621e 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/MensaFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/MensaFragment.kt @@ -29,8 +29,14 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.LinearLayout -import ord.mosad.seil0.projectlaogai.uicomponents.MensaDayCardView -import ord.mosad.seil0.projectlaogai.uicomponents.MenuCardView +import kotlinx.android.synthetic.main.mensaday_cardview.view.* +import org.jetbrains.anko.doAsync +import org.jetbrains.anko.uiThread +import org.mosad.seil0.projectlaogai.hsoparser.Meal +import org.mosad.seil0.projectlaogai.hsoparser.MensaParser +import org.mosad.seil0.projectlaogai.uicomponents.MensaDayCardView +import org.mosad.seil0.projectlaogai.uicomponents.MenuCardView +import java.util.* /** * The mensa controller class @@ -46,40 +52,86 @@ class MensaFragment : Fragment() { linLayoutMensaFragment = view.findViewById(R.id.linLayout_MensaFragment) - addDay() + addCurrentWeek() + //addDay(Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) return view } - @SuppressLint("SetTextI18n") - fun addDay() { + fun addCurrentWeek() { + doAsync { + val mensaParser = MensaParser() + val weekMenus: ArrayList = mensaParser.getMensaMenu() + + uiThread { + + for(day in Calendar.getInstance().get(Calendar.DAY_OF_WEEK)..7) { + + var strDay: String = when(day) { + Calendar.MONDAY -> "Mon" + Calendar.TUESDAY -> "Die" + Calendar.WEDNESDAY -> "Mit" + Calendar.THURSDAY -> "Don" + Calendar.FRIDAY -> "Fre" + Calendar.SATURDAY -> "Sam" + else -> "TODAY" //TODO + } + + val cardViewMensaDay = MensaDayCardView(context!!, null) + var add = false + + for (meal in weekMenus) { + //println("Day: " + meal.day) + if (meal.day.contains(strDay)) { + + val menuViewMenu = MenuCardView(context!!, null) + menuViewMenu.setMenuHeading(meal.heading) + + for(part in meal.parts) { + menuViewMenu.getTxtViewMenu().append(part) + } + + cardViewMensaDay.setDayHeading(meal.day) //TODO move this out of the first for loop, performance!! + cardViewMensaDay.getLinLayoutMensaDay().addView(menuViewMenu) + add = true + } + } + + + if(add) + linLayoutMensaFragment.addView(cardViewMensaDay) + } + } + + } + } + + fun addDay(day: Int) { val cardViewMensaDay = MensaDayCardView(context!!, null) - val menuViewMenu1 = MenuCardView(context!!, null) - val menuViewMenu2 = MenuCardView(context!!, null) - menuViewMenu1.getTxtViewMenuHeading().text = "Essen 1" - menuViewMenu1.getTxtViewMenu().text = "Buntes Pfannengemüse\nCouscous\nBlattsalat" - menuViewMenu2.getTxtViewMenuHeading().text = "Essen 2" - menuViewMenu2.getTxtViewMenu().text = "Riesen Currywurst\nCurryketchup\nGitterkartoffeln\nBlattsalat" + doAsync { + val mensaParser = MensaParser() + val dayMenus: ArrayList = mensaParser.getMensaMenuDay(mensaParser.getMensaMenu(), day) - cardViewMensaDay.getLinLayoutMensaDay().addView(menuViewMenu1) - cardViewMensaDay.getLinLayoutMensaDay().addView(menuViewMenu2) - linLayoutMensaFragment.addView(cardViewMensaDay) + uiThread { + for (meal in dayMenus) { + val menuViewMenu = MenuCardView(context!!, null) + menuViewMenu.setMenuHeading(meal.heading) - val cardViewMensaDay2 = MensaDayCardView(context!!, null) - val menuViewMenu12 = MenuCardView(context!!, null) - val menuViewMenu22 = MenuCardView(context!!, null) + for(part in meal.parts) { + menuViewMenu.getTxtViewMenu().append(part) + } - menuViewMenu12.getTxtViewMenuHeading().text = "Essen 12" - menuViewMenu12.getTxtViewMenu().text = "Buntes Pfannengemüse\nCouscous\nBlattsalat" - menuViewMenu22.getTxtViewMenuHeading().text = "Essen 22" - menuViewMenu22.getTxtViewMenu().text = "Riesen Currywurst\nCurryketchup\nGitterkartoffeln\nBlattsalat" + cardViewMensaDay.setDayHeading(meal.day) //TODO move this out of the first for loop, performance!! + cardViewMensaDay.getLinLayoutMensaDay().addView(menuViewMenu) + } - cardViewMensaDay2.getLinLayoutMensaDay().addView(menuViewMenu12) - cardViewMensaDay2.getLinLayoutMensaDay().addView(menuViewMenu22) - linLayoutMensaFragment.addView(cardViewMensaDay2) + linLayoutMensaFragment.addView(cardViewMensaDay) + } + + } } 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 new file mode 100644 index 0000000..de937cc --- /dev/null +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/DataTypes.kt @@ -0,0 +1,14 @@ +package org.mosad.seil0.projectlaogai.hsoparser + +class DataTypes { + init { + // do something + } + +} + +data class Lesson(val lessonSubject: String, val lessonTeacher: String, val lessonRoom:String, val lessonRemark: String) + +data class CourseTTLink(val courseTTLink: String, val course: String) + +data class Meal(val day: String, val heading: String, val parts: ArrayList, val additives: String) \ No newline at end of file diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/MensaParser.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/MensaParser.kt new file mode 100644 index 0000000..a3eb365 --- /dev/null +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/MensaParser.kt @@ -0,0 +1,82 @@ +/** + * ProjectLaogai + * + * Copyright 2018 + * + * 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.hsoparser + +import org.jsoup.Jsoup +import java.util.* + +class MensaParser { + private var mealList = ArrayList() + + init { + // do something + } + + /** + * returns the mensa menu for the whole week + */ + fun getMensaMenu(): ArrayList { + val menuHTML = Jsoup.connect("https://www.swfr.de/de/essen-trinken/speiseplaene/mensa-offenburg/").get() + + menuHTML.select("#speiseplan-tabs").select("div.tab-content").select("div.menu-tagesplan").forEachIndexed { index, element -> + var day = element.select("h3").text() + for (i in 0 .. (element.select("div.row h4").size - 1)) { + try { + var heading = element.select("div.row h4")[i].text() + var parts = ArrayList(element.select("div.row").select("div.menu-info")[i].html().substringBefore("", "|").split("|")) + var additives = element.select("div.row").select("div.menu-info")[i].select("span.show-with-allergenes").text() + + mealList.add(Meal(day, heading, parts, additives)) + } catch (e: Exception) { + // catch + } + } + } + + return mealList + } + + /** + * return the mensa menu of a given day (Mon - Sat) + */ + fun getMensaMenuDay(mealList: ArrayList, day: Int): ArrayList { + var dayMenus = ArrayList() + var strDay: String = when(day) { + Calendar.MONDAY -> "Mon" + Calendar.TUESDAY -> "Die" + Calendar.WEDNESDAY -> "Mit" + Calendar.THURSDAY -> "Don" + Calendar.FRIDAY -> "Fre" + Calendar.SATURDAY -> "Sam" + else -> "TODAY" //TODO + } + + for (meal in mealList) { + if (meal.day.contains(strDay)) { + println(meal.day) + dayMenus.add(meal) + } + } + return dayMenus + } +} diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/TimeTableParser.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/TimeTableParser.kt new file mode 100644 index 0000000..87b544f --- /dev/null +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/TimeTableParser.kt @@ -0,0 +1,101 @@ +/** + * ProjectLaogai + * + * Copyright 2018 + * + * 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.hsoparser + +import org.jsoup.Jsoup + +class TimeTableParser { + val days = arrayOf("Monday", "Tuesday" ,"Wednesday", "Thursday", "Friday", "Saturday") + var courseTTLinkList = ArrayList() + var timeTableWeek = arrayOf>() + + init { + // create the timetable array + for (i in 0..5) { + var timeTableDay = arrayOf() + for (j in 0..6) { + timeTableDay += Lesson("", "","","") + } + timeTableWeek += timeTableDay + } + } + + /** + * get the timetable from the given url + * the timetable is organised per row not per column; + * Mon 1, Tue 1, Wed 1, Thur 1, Fri 1, Sat 1, Mon 2 and so on + */ + fun getTimeTable(courseTTURL: String) { + val scheduleHTML = Jsoup.connect(courseTTURL).get() + + val week = scheduleHTML.select("h1.timetable-caption").text() + println("$week successful!\n") + + scheduleHTML.select("table.timetable").select("td.lastcol").forEachIndexed { index, element -> + timeTableWeek[index % 6][index / 6] = Lesson(element.select("div.lesson-subject").text(), element.select("div.lesson-teacher").text(), element.select("div.lesson-room").text(), element.select("div.lesson-remark").text()) + } + } + + /** + * parse all courses from the courses site at https://www.hs-offenburg.de/studium/vorlesungsplaene/ + */ + fun getCourseTTLinks() { + val courseHTML = Jsoup.connect("https://www.hs-offenburg.de/studium/vorlesungsplaene/").get() + + courseHTML.select("ul.index-group").select("li.Class").select("a[href]").forEachIndexed { _, element -> + courseTTLinkList.add(CourseTTLink(element.attr("href"),element.text())) + } + } + + fun printTimeTableWeek (timeTableWeek: Array>) { + + for (j in 0..5) print(days[j].padEnd(25 ,' ') + " | ") + println() + for (j in 0..5) print("-".padEnd(26 + (j.toFloat().div(j).toInt()), '-') + "+") + println() + + for (i in 0..6) { + for (j in 0..5) print(timeTableWeek[j][i].lessonSubject.padEnd(25 ,' ').substring(0,25) + " | ") + println() + for (j in 0..5) print(timeTableWeek[j][i].lessonTeacher.padEnd(25 ,' ').substring(0,25) + " | ") + println() + for (j in 0..5) print(timeTableWeek[j][i].lessonRoom.padEnd(25 ,' ').substring(0,25) + " | ") + println() + for (j in 0..5) print("-".padEnd(26 + (j.toFloat().div(j).toInt()), '-') + "+") + println() + } + println() + } + + fun printTimeTableDay(timeTableDay: Array, day: Int) { + println(days[day]) + for (i in 0..6) { + println("-".padEnd(22, '-')) + println(timeTableDay[i].lessonSubject) + println(timeTableDay[i].lessonTeacher) + println(timeTableDay[i].lessonRoom) + } + println("-".padEnd(22, '-')) + println() + } +} \ No newline at end of file diff --git a/app/src/main/java/ord/mosad/seil0/projectlaogai/uicomponents/LessonCardView.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/LessonCardView.kt similarity index 96% rename from app/src/main/java/ord/mosad/seil0/projectlaogai/uicomponents/LessonCardView.kt rename to app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/LessonCardView.kt index a3ee5a0..56f7928 100644 --- a/app/src/main/java/ord/mosad/seil0/projectlaogai/uicomponents/LessonCardView.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/LessonCardView.kt @@ -20,7 +20,7 @@ * */ -package ord.mosad.seil0.projectlaogai.uicomponents +package org.mosad.seil0.projectlaogai.uicomponents import android.content.Context import android.graphics.Color diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MensaDayCardView.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MensaDayCardView.kt new file mode 100644 index 0000000..38f4aee --- /dev/null +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MensaDayCardView.kt @@ -0,0 +1,54 @@ +/** + * ProjectLaogai + * + * Copyright 2018 + * + * 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.uicomponents + +import android.content.Context +import android.util.AttributeSet +import android.widget.LinearLayout +import android.widget.TextView +import org.mosad.seil0.projectlaogai.R + +class MensaDayCardView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : androidx.cardview.widget.CardView(context, attrs){ + + private var linLayoutMensaDay: LinearLayout + private var txtViewDayHeading: TextView + + init { + inflate(context, R.layout.mensaday_cardview,this) + + linLayoutMensaDay = findViewById(R.id.linLayout_MensaDay) + txtViewDayHeading = findViewById(R.id.txtView_DayHeading) + + // workaround to prevent a white border + //this.setBackgroundColor(Color.TRANSPARENT) + } + + fun getLinLayoutMensaDay(): LinearLayout { + return linLayoutMensaDay + } + + fun setDayHeading(heading: String) { + txtViewDayHeading.text = heading + } + +} \ No newline at end of file diff --git a/app/src/main/java/ord/mosad/seil0/projectlaogai/uicomponents/MenuCardView.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MenuCardView.kt similarity index 85% rename from app/src/main/java/ord/mosad/seil0/projectlaogai/uicomponents/MenuCardView.kt rename to app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MenuCardView.kt index 88c9007..b02f3bf 100644 --- a/app/src/main/java/ord/mosad/seil0/projectlaogai/uicomponents/MenuCardView.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/MenuCardView.kt @@ -1,4 +1,4 @@ -package ord.mosad.seil0.projectlaogai.uicomponents +package org.mosad.seil0.projectlaogai.uicomponents import android.content.Context import android.graphics.Color @@ -25,6 +25,10 @@ class MenuCardView @JvmOverloads constructor(context: Context, attrs: AttributeS return txtViewMenuHeading } + fun setMenuHeading(heading: String) { + txtViewMenuHeading.text = heading + } + fun getTxtViewMenu(): TextView { return txtViewMenu } diff --git a/app/src/main/res/layout/menu_cardview.xml b/app/src/main/res/layout/menu_cardview.xml index 0c4bea2..fc2949b 100644 --- a/app/src/main/res/layout/menu_cardview.xml +++ b/app/src/main/res/layout/menu_cardview.xml @@ -5,7 +5,7 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/cardView" android:layout_width="match_parent" - android:layout_height="125dp" + android:layout_height="wrap_content" android:layout_marginStart="5dp" android:layout_marginTop="5dp" android:layout_marginEnd="5dp"