added TimeTableParser

* you can access the current timetable and mensa menu now
* you can access the weeks mensa menu now
This commit is contained in:
Jannik 2018-10-29 18:03:20 +01:00
parent 47d48fb4d9
commit f9a122558d
9 changed files with 101 additions and 98 deletions

View File

@ -22,19 +22,18 @@
package org.mosad.seil0.projectlaogai
import android.annotation.SuppressLint
import android.graphics.Color
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.ScrollView
import android.widget.TextView
import kotlinx.android.synthetic.main.fragment_home.*
import org.jetbrains.anko.doAsync
import org.jetbrains.anko.uiThread
import org.mosad.seil0.projectlaogai.hsoparser.DataTypes
import org.mosad.seil0.projectlaogai.hsoparser.Lesson
import org.mosad.seil0.projectlaogai.hsoparser.Meal
import org.mosad.seil0.projectlaogai.hsoparser.MensaParser
import org.mosad.seil0.projectlaogai.uicomponents.LessonCardView
@ -46,37 +45,29 @@ import java.util.*
*/
class HomeFragment : Fragment() {
private lateinit var txtViewMenu1: TextView
private lateinit var txtViewMenu2: TextView
private lateinit var scrollViewTimeTable: ScrollView
val times = arrayOf("8.00 - 9.30", "9.45 - 11.15" ,"11.35 - 13.05", "14.00 -15.30", "15.45 - 17.15", "17.30 - 19.00")
private lateinit var linLayoutTimeTable: LinearLayout
private lateinit var currentMenus: ArrayList<Meal>
private lateinit var timeTableWeek: Array<Array<Lesson>>
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view: View = inflater.inflate(R.layout.fragment_home, container, false)
// init UI elements
txtViewMenu1 = view.findViewById(R.id.txtView_Menu1)
txtViewMenu2 = view.findViewById(R.id.txtView_Menu2)
scrollViewTimeTable = view.findViewById(R.id.scrollView_TimeTable)
linLayoutTimeTable = view.findViewById(R.id.linLayout_TimeTable)
linLayoutTimeTable = view.findViewById(R.id.linLayoutTimeTable)
//setText()
addCurentMensaMenu()
addLessons()
addCurrentMensaMenu()
addCurrentTimeTable()
// Inflate the layout for this fragment
return view
}
private fun addCurentMensaMenu() {
private fun addCurrentMensaMenu() {
doAsync {
val mensaParser = MensaParser()
val dayMenus: ArrayList<Meal> = mensaParser.getMensaMenuDay(mensaParser.getMensaMenu(), Calendar.getInstance().get(Calendar.DAY_OF_WEEK))
val dayMenus: ArrayList<Meal> = MensaParser().getMensaMenuDay(currentMenus, Calendar.getInstance().get(Calendar.DAY_OF_WEEK))
uiThread {
for(part in dayMenus[0].parts) {
@ -87,46 +78,33 @@ class HomeFragment : Fragment() {
txtViewMenu2.append(part)
}
}
}
}
@SuppressLint("SetTextI18n")
private fun addLessons() {
private fun addCurrentTimeTable() {
val timeTableDay = timeTableWeek[Calendar.getInstance().get(Calendar.DAY_OF_WEEK) -2]
// for each lesson to display on homescreen create a cardview
val lessonCardView1 = LessonCardView(context!!, null)
val lessonCardView2 = LessonCardView(context!!, null)
val lessonCardView3 = LessonCardView(context!!, null)
val lessonCardView4 = LessonCardView(context!!, null)
val lessonCardView5 = LessonCardView(context!!, null)
for (i in 0..5) {
val lessonCardView = LessonCardView(context!!, null)
lessonCardView1.getTxtViewLesson().text = "Computernetze 1\nMayer E.\nA213"
lessonCardView1.getTxtViewTime().text = "8.00 - 9.30"
lessonCardView.getTxtViewLesson().text = """${timeTableDay[i].lessonSubject}
"""
lessonCardView.getTxtViewLesson().append(timeTableDay[i].lessonTeacher + "\n")
lessonCardView.getTxtViewLesson().append(timeTableDay[i].lessonRoom)
lessonCardView.getTxtViewTime().text = DataTypes().getTime()[i]
lessonCardView2.getTxtViewLesson().text = "Computernetze 1\nMayer E.\nA213"
lessonCardView2.getTxtViewTime().text = "8.00 - 9.30"
lessonCardView3.getTxtViewLesson().text = "Computernetze 1\nMayer E.\nA213"
lessonCardView3.getTxtViewTime().text = "8.00 - 9.30"
lessonCardView4.getTxtViewLesson().text = "Computernetze 1\nMayer E.\nA213"
lessonCardView4.getTxtViewTime().text = "8.00 - 9.30"
lessonCardView5.getTxtViewLesson().text = "Computernetze 1\nMayer E.\nA213"
lessonCardView5.getTxtViewTime().text = "8.00 - 9.30"
lessonCardView1.setBackgroundColor(Color.parseColor("#3F51B5"))
// ff00ddff
linLayoutTimeTable.run {
addView(lessonCardView1)
addView(lessonCardView2)
addView(lessonCardView3)
addView(lessonCardView4)
addView(lessonCardView5)
if(lessonCardView.getTxtViewLesson().text.length > 2)
linLayoutTimeTable.addView(lessonCardView)
}
}
fun setCurrentMenu(weekMenus: ArrayList<Meal>){
this.currentMenus = weekMenus
}
fun setCurrentTimeTableWeek(timeTableWeek: Array<Array<Lesson>>) {
this.timeTableWeek = timeTableWeek
}
}

View File

@ -32,18 +32,34 @@ import android.view.MenuItem
import androidx.fragment.app.FragmentTransaction
import kotlinx.android.synthetic.main.activity_main.*
import kotlinx.android.synthetic.main.app_bar_main.*
import org.jetbrains.anko.doAsync
import org.mosad.seil0.projectlaogai.hsoparser.Lesson
import org.mosad.seil0.projectlaogai.hsoparser.Meal
import org.mosad.seil0.projectlaogai.hsoparser.MensaParser
import org.mosad.seil0.projectlaogai.hsoparser.TimeTableParser
import java.util.*
class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {
//TODO make toolbar and navbar global
private val mensaParser = MensaParser()
private val timeTableParser = TimeTableParser()
private var weekMenus = ArrayList<Meal>()
private lateinit var timeTableWeek: Array<Array<Lesson>>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setSupportActionBar(toolbar)
// load mensa and timetable
load()
//init home fragment TODO make a abstract fragment class
val homeFragment = HomeFragment()
homeFragment.setCurrentMenu(weekMenus)
homeFragment.setCurrentTimeTableWeek(timeTableWeek)
val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.fragment_container, homeFragment)
fragmentTransaction.commit()
@ -86,18 +102,20 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
when (item.itemId) {
R.id.nav_home -> {
val homeFragment = HomeFragment()
homeFragment.setCurrentMenu(weekMenus)
homeFragment.setCurrentTimeTableWeek(timeTableWeek)
val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.fragment_container, homeFragment)
fragmentTransaction.commit()
}
R.id.nav_mensa -> {
val mensaFragment = MensaFragment()
mensaFragment.setWeekMenu(weekMenus)
val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.fragment_container, mensaFragment)
fragmentTransaction.commit()
}
R.id.nav_timetable -> {
val timeTableFragment = TimeTableFragment()
val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction()
fragmentTransaction.replace(R.id.fragment_container, timeTableFragment)
@ -121,4 +139,18 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte
drawer_layout.closeDrawer(GravityCompat.START)
return true
}
/**
* load the mensa menus of the current week
* TODO show loading screen while loading
* TODO make mensa nad timetable query parallel
* TODO evaluate if we should use a timeout here
*/
private fun load() {
doAsync {
weekMenus = mensaParser.getMensaMenu()
timeTableWeek = timeTableParser.getTimeTable("https://www.hs-offenburg.de/index.php?id=6627&class=class&iddV=DA64F6FE-9DDB-429E-A677-05D0D40CB636&week=0")
}.get()
}
}

View File

@ -22,14 +22,12 @@
package org.mosad.seil0.projectlaogai
import android.annotation.SuppressLint
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
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
@ -45,6 +43,7 @@ import java.util.*
class MensaFragment : Fragment() {
private lateinit var linLayoutMensaFragment: LinearLayout
private lateinit var weekMenus: ArrayList<Meal>
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
@ -53,16 +52,14 @@ class MensaFragment : Fragment() {
linLayoutMensaFragment = view.findViewById(R.id.linLayout_MensaFragment)
addCurrentWeek()
//addDay(Calendar.getInstance().get(Calendar.DAY_OF_WEEK))
return view
}
fun addCurrentWeek() {
private fun addCurrentWeek() {
doAsync {
val mensaParser = MensaParser()
val weekMenus: ArrayList<Meal> = mensaParser.getMensaMenu()
uiThread {
@ -135,5 +132,8 @@ class MensaFragment : Fragment() {
}
fun setWeekMenu(weekMenus: ArrayList<Meal>){
this.weekMenus = weekMenus
}
}

View File

@ -74,7 +74,7 @@ class SettingsFragment : Fragment() {
// open a new dialog
val courses = listOf("AI1", "AI2", "AI3", "AI4", "AI5", "AI6", "AI7")
MaterialDialog(context!!)
.listItems(items = courses){ dialog, index, text ->
.listItems(items = courses){ _, _, text ->
// TODO save selected course
// update txtView
@ -97,7 +97,7 @@ class SettingsFragment : Fragment() {
MaterialDialog(context!!)
.title(R.string.primary_color)
.colorChooser(colors, initialSelection = Color.parseColor("#3F51B5")) { dialog, color ->
.colorChooser(colors, initialSelection = Color.parseColor("#3F51B5")) { _, color ->
viewPrimaryColor.setBackgroundColor(color)
}
.positiveButton(R.string.select)

View File

@ -1,10 +1,16 @@
package org.mosad.seil0.projectlaogai.hsoparser
class DataTypes {
val times = arrayOf("8.00 - 9.30", "9.45 - 11.15" ,"11.35 - 13.05", "14.00 -15.30", "15.45 - 17.15", "17.30 - 19.00")
init {
// do something
}
fun getTime(): Array<String> {
return times
}
}
data class Lesson(val lessonSubject: String, val lessonTeacher: String, val lessonRoom:String, val lessonRemark: String)

View File

@ -38,13 +38,13 @@ class MensaParser {
fun getMensaMenu(): ArrayList<Meal> {
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()
menuHTML.select("#speiseplan-tabs").select("div.tab-content").select("div.menu-tagesplan").forEachIndexed { _, element ->
val 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<String>(element.select("div.row").select("div.menu-info")[i].html().substringBefore("<span").replace("<br>", "|").split("|"))
var additives = element.select("div.row").select("div.menu-info")[i].select("span.show-with-allergenes").text()
val heading = element.select("div.row h4")[i].text()
val parts = ArrayList<String>(element.select("div.row").select("div.menu-info")[i].html().substringBefore("<span").replace("<br>", "|").split("|"))
val 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) {
@ -60,8 +60,8 @@ class MensaParser {
* return the mensa menu of a given day (Mon - Sat)
*/
fun getMensaMenuDay(mealList: ArrayList<Meal>, day: Int): ArrayList<Meal> {
var dayMenus = ArrayList<Meal>()
var strDay: String = when(day) {
val dayMenus = ArrayList<Meal>()
val strDay: String = when(day) {
Calendar.MONDAY -> "Mon"
Calendar.TUESDAY -> "Die"
Calendar.WEDNESDAY -> "Mit"
@ -73,7 +73,6 @@ class MensaParser {
for (meal in mealList) {
if (meal.day.contains(strDay)) {
println(meal.day)
dayMenus.add(meal)
}
}

View File

@ -25,15 +25,15 @@ package org.mosad.seil0.projectlaogai.hsoparser
import org.jsoup.Jsoup
class TimeTableParser {
val days = arrayOf("Monday", "Tuesday" ,"Wednesday", "Thursday", "Friday", "Saturday")
var courseTTLinkList = ArrayList<CourseTTLink>()
var timeTableWeek = arrayOf<Array<Lesson>>()
private val days = arrayOf("Monday", "Tuesday" ,"Wednesday", "Thursday", "Friday", "Saturday")
private var courseTTLinkList = ArrayList<CourseTTLink>()
private var timeTableWeek = arrayOf<Array<Lesson>>()
init {
// create the timetable array
for (i in 0..5) {
var timeTableDay = arrayOf<Lesson>()
for (j in 0..6) {
for (j in 0..5) {
timeTableDay += Lesson("", "","","")
}
timeTableWeek += timeTableDay
@ -45,15 +45,16 @@ class TimeTableParser {
* 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) {
fun getTimeTable(courseTTURL: String): Array<Array<Lesson>> {
val scheduleHTML = Jsoup.connect(courseTTURL).get()
val week = scheduleHTML.select("h1.timetable-caption").text()
println("$week successful!\n")
//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())
}
return timeTableWeek
}
/**
@ -74,7 +75,7 @@ class TimeTableParser {
for (j in 0..5) print("-".padEnd(26 + (j.toFloat().div(j).toInt()), '-') + "+")
println()
for (i in 0..6) {
for (i in 0..5) {
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) + " | ")
@ -87,15 +88,4 @@ class TimeTableParser {
println()
}
fun printTimeTableDay(timeTableDay: Array<Lesson>, 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()
}
}

View File

@ -37,14 +37,13 @@
android:textStyle="bold" android:textAlignment="center" android:textSize="16sp"
android:typeface="sans" android:fontFamily="sans-serif" android:paddingBottom="5dp"/>
<TextView
android:id="@+id/txtView_Menu1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
android:textAlignment="center"
android:textSize="16sp"
android:textStyle="bold"
android:typeface="sans"/>
android:typeface="sans" android:id="@+id/txtViewMenu1"/>
</LinearLayout>
</androidx.cardview.widget.CardView>
@ -72,7 +71,7 @@
android:textAlignment="center" android:textStyle="bold" android:textSize="16sp"
android:typeface="sans" android:fontFamily="sans-serif" android:paddingBottom="5dp"/>
<TextView
android:id="@+id/txtView_Menu2"
android:id="@+id/txtViewMenu2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="sans-serif"
@ -88,11 +87,11 @@
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/cardView2" android:id="@+id/scrollView_TimeTable"
app:layout_constraintTop_toBottomOf="@+id/cardView2" android:id="@+id/scrollViewTimeTable"
android:background="@color/colorPrimary" android:paddingTop="6dp">
<LinearLayout
android:id="@+id/linLayout_TimeTable"
android:id="@+id/linLayoutTimeTable"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"

View File

@ -2,7 +2,7 @@
<string name="app_name">Project Laogai</string>
<string name="navigation_drawer_open">Open navigation drawer</string>
<string name="navigation_drawer_close">Close navigation drawer</string>
<string name="nav_header_title">hso App 0.0.3</string>
<string name="nav_header_title">hso App 0.1.0</string>
<string name="nav_header_subtitle">seil0@mosad.xyz</string>
<string name="nav_header_desc">Navigation header</string>
@ -18,7 +18,7 @@
<string name="essen_2">Essen 2</string>
<string name="a_lesson">a lesson\na teacher\na room</string>
<string name="a_time">0.00 - 23.59</string>
<string name="a_time">0.00 23.59</string>
<string name="info">Info</string>
<string name="user">User</string>
@ -29,13 +29,12 @@
<string name="primary_color">primary color</string>
<string name="main_color_desc">The primary color, default is indigo</string>
<string name="select">select</string>
<string name="version">version 0.0.2</string>
<string name="version">version 0.1.0</string>
<string name="about">about</string>
<string name="about_text">This software is made by @Seil0 and is published under the terms and conditions of GPL 3.
For further information visit https://git.mosad.xyz/Seil0/ProjectLaogai\n\n(c) 2018 seil0@mosad.xyz
For further information visit git.mosad.xyz/Seil0/ProjectLaogai\n\n© 2018 seil0@mosad.xyz
</string>
<string name="about_txtView">hso App by @Seil0</string>
<!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string>
</resources>