From 9be7a56b0543ff8819826c2b5e4b90bbd4c6efe0 Mon Sep 17 00:00:00 2001 From: Seil0 Date: Thu, 1 Nov 2018 02:12:43 +0100 Subject: [PATCH] added course choose option * you can choose any available course now (not saved yet, the app will hang a few seconds) --- .../mosad/seil0/projectlaogai/MainActivity.kt | 63 +++++++++++++++---- .../projectlaogai/fragments/HomeFragment.kt | 21 +++---- .../projectlaogai/fragments/MensaFragment.kt | 9 +-- .../fragments/SettingsFragment.kt | 23 +++++-- .../hsoparser/TimeTableParser.kt | 7 ++- 5 files changed, 85 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt index e8d9e76..22a7846 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt @@ -30,18 +30,19 @@ import androidx.appcompat.app.AppCompatActivity import android.view.Menu import android.view.MenuItem import androidx.fragment.app.FragmentTransaction +import com.afollestad.materialdialogs.MaterialDialog import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.app_bar_main.* import org.jetbrains.anko.doAsync +import org.jetbrains.anko.uiThread import org.mosad.seil0.projectlaogai.fragments.HomeFragment import org.mosad.seil0.projectlaogai.fragments.MensaFragment import org.mosad.seil0.projectlaogai.fragments.SettingsFragment import org.mosad.seil0.projectlaogai.fragments.TimeTableFragment -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 org.mosad.seil0.projectlaogai.hsoparser.* import java.util.* +import kotlin.collections.ArrayList +import kotlin.system.measureTimeMillis class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { @@ -51,6 +52,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte private var weekMenus = ArrayList() private lateinit var timeTableWeek: Array> + private var courseTTLinkList = ArrayList() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -62,8 +64,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte //init home fragment TODO make a abstract fragment class val homeFragment = HomeFragment() - homeFragment.setCurrentMenu(weekMenus) - homeFragment.setCurrentTimeTableWeek(timeTableWeek) + homeFragment.setMainActivity(this) val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.replace(R.id.fragment_container, homeFragment) fragmentTransaction.commit() @@ -106,15 +107,14 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte when (item.itemId) { R.id.nav_home -> { val homeFragment = HomeFragment() - homeFragment.setCurrentMenu(weekMenus) - homeFragment.setCurrentTimeTableWeek(timeTableWeek) + homeFragment.setMainActivity(this) val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.replace(R.id.fragment_container, homeFragment) fragmentTransaction.commit() } R.id.nav_mensa -> { val mensaFragment = MensaFragment() - mensaFragment.setWeekMenu(weekMenus) + mensaFragment.setMainActivity(this) val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.replace(R.id.fragment_container, mensaFragment) fragmentTransaction.commit() @@ -134,6 +134,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte } R.id.nav_settings -> { val settingsFragment = SettingsFragment() + settingsFragment.setMainActivity(this) val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.replace(R.id.fragment_container, settingsFragment) fragmentTransaction.commit() @@ -144,6 +145,20 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte return true } + /** + * update the gui with the data of the new selected course TODO + * save selected course and courseTTLink TODO + */ + fun updateCourse(course: CourseTTLink) { + println(course.course) + println(course.courseTTLink) + + // the app is hanging here + doAsync { + timeTableWeek = timeTableParser.getTimeTable(course.courseTTLink.replace("http", "https")) + }.get() + } + /** * load the mensa menus of the current week * TODO show loading screen while loading @@ -151,10 +166,32 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte * 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() + val time = measureTimeMillis { + /* getting the course list should be faster than the timetable, + * we need have time until the user opens the dialog + */ + doAsync { + courseTTLinkList = timeTableParser.getCourseTTLinks() + } + + 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() + } + println("Completed in $time ms") + } + fun getCourseTTLinkList(): ArrayList{ + return courseTTLinkList + } + + fun getCurrentTimeTableWeek(): Array> { + return timeTableWeek + } + + fun getWeekMenu(): ArrayList{ + return weekMenus + } } 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 f3ec0a0..c1b7d3b 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 @@ -23,18 +23,17 @@ package org.mosad.seil0.projectlaogai.fragments 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 androidx.fragment.app.Fragment import kotlinx.android.synthetic.main.fragment_home.* import org.jetbrains.anko.doAsync - import org.jetbrains.anko.uiThread +import org.mosad.seil0.projectlaogai.MainActivity import org.mosad.seil0.projectlaogai.R 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,10 +45,8 @@ import java.util.* */ class HomeFragment : Fragment() { - 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 - private lateinit var timeTableWeek: Array> + private var mainActivity = MainActivity() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -68,7 +65,7 @@ class HomeFragment : Fragment() { private fun addCurrentMensaMenu() { doAsync { - val dayMenus: ArrayList = MensaParser().getMensaMenuDay(currentMenus, Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) + val dayMenus: ArrayList = MensaParser().getMensaMenuDay(mainActivity.getWeekMenu(), Calendar.getInstance().get(Calendar.DAY_OF_WEEK)) uiThread { @@ -90,7 +87,7 @@ class HomeFragment : Fragment() { } private fun addCurrentTimeTable() { - val timeTableDay = timeTableWeek[Calendar.getInstance().get(Calendar.DAY_OF_WEEK) -2] + val timeTableDay = mainActivity.getCurrentTimeTableWeek()[Calendar.getInstance().get(Calendar.DAY_OF_WEEK) -2] for (i in 0..5) { val lessonCardView = LessonCardView(context!!, null) @@ -113,12 +110,8 @@ class HomeFragment : Fragment() { } } - fun setCurrentMenu(weekMenus: ArrayList){ - this.currentMenus = weekMenus - } - - fun setCurrentTimeTableWeek(timeTableWeek: Array>) { - this.timeTableWeek = timeTableWeek + fun setMainActivity(mainActivity: MainActivity) { + this.mainActivity = mainActivity } } 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 6212613..0a63461 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 @@ -30,6 +30,7 @@ import android.view.ViewGroup import android.widget.LinearLayout import org.jetbrains.anko.doAsync import org.jetbrains.anko.uiThread +import org.mosad.seil0.projectlaogai.MainActivity import org.mosad.seil0.projectlaogai.R import org.mosad.seil0.projectlaogai.hsoparser.Meal import org.mosad.seil0.projectlaogai.hsoparser.MensaParser @@ -44,7 +45,7 @@ import java.util.* class MensaFragment : Fragment() { private lateinit var linLayoutMensaFragment: LinearLayout - private lateinit var weekMenus: ArrayList + private var mainActivity = MainActivity() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -78,7 +79,7 @@ class MensaFragment : Fragment() { val cardViewMensaDay = MensaDayCardView(context!!, null) var add = false - for (meal in weekMenus) { + for (meal in mainActivity.getWeekMenu()) { //println("Day: " + meal.day) if (meal.day.contains(strDay)) { @@ -139,8 +140,8 @@ class MensaFragment : Fragment() { } - fun setWeekMenu(weekMenus: ArrayList){ - this.weekMenus = weekMenus + fun setMainActivity(mainActivity: MainActivity) { + this.mainActivity = mainActivity } } diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt index 2db4a9f..cc3b445 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/SettingsFragment.kt @@ -33,7 +33,10 @@ import com.afollestad.materialdialogs.MaterialDialog import com.afollestad.materialdialogs.color.colorChooser import com.afollestad.materialdialogs.list.listItems import kotlinx.android.synthetic.main.fragment_settings.* +import org.mosad.seil0.projectlaogai.MainActivity import org.mosad.seil0.projectlaogai.R +import org.mosad.seil0.projectlaogai.hsoparser.CourseTTLink +import java.util.ArrayList /** * The settings controller class @@ -46,6 +49,9 @@ class SettingsFragment : Fragment() { private lateinit var linLayoutInfo: LinearLayout private lateinit var linLayoutMainColor: LinearLayout private lateinit var viewPrimaryColor: View + private lateinit var courseTTLinkList: ArrayList + private var mainActivity = MainActivity() + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { @@ -73,13 +79,19 @@ class SettingsFragment : Fragment() { linLayoutCourse.setOnClickListener { // open a new dialog - val courses = listOf("AI1", "AI2", "AI3", "AI4", "AI5", "AI6", "AI7") - MaterialDialog(context!!) - .listItems(items = courses){ _, _, text -> - // TODO save selected course + val courseList = ArrayList() + courseTTLinkList = mainActivity.getCourseTTLinkList() + courseTTLinkList.forEach { (_, course) -> + courseList.add(course) + } + + MaterialDialog(context!!) + .listItems(items = courseList){ _, index, text -> // update txtView txtView_Course.text = text + + mainActivity.updateCourse(courseTTLinkList[index]) } .show() } @@ -106,5 +118,8 @@ class SettingsFragment : Fragment() { } } + fun setMainActivity(mainActivity: MainActivity) { + this.mainActivity = mainActivity + } } 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 index 8d03f5a..a8bb55d 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/TimeTableParser.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/hsoparser/TimeTableParser.kt @@ -48,8 +48,8 @@ class TimeTableParser { fun getTimeTable(courseTTURL: String): Array> { 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()) @@ -60,12 +60,13 @@ class TimeTableParser { /** * parse all courses from the courses site at https://www.hs-offenburg.de/studium/vorlesungsplaene/ */ - fun getCourseTTLinks() { + fun getCourseTTLinks(): ArrayList { 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())) } + return courseTTLinkList } fun printTimeTableWeek (timeTableWeek: Array>) {