/** * 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 import android.os.Bundle import android.view.Menu import android.view.MenuItem import androidx.appcompat.app.ActionBarDrawerToggle import androidx.appcompat.app.AppCompatActivity import androidx.core.view.GravityCompat import androidx.fragment.app.FragmentTransaction import com.afollestad.materialdialogs.MaterialDialog import com.google.android.material.navigation.NavigationView 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.* import kotlin.system.measureTimeMillis class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener { //TODO make toolbar and navbar global private val mensaParser = MensaParser() private val timeTableParser = TimeTableParser() private var weekMenus = ArrayList() private var courseTTLinkList = ArrayList() private var timeTableCurrentWeek = arrayOf>() private var timeTableNextWeek = arrayOf>() private lateinit var course: CourseTTLink 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.setMainActivity(this) val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.replace(R.id.fragment_container, homeFragment) fragmentTransaction.commit() val toggle = ActionBarDrawerToggle( this, drawer_layout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close ) drawer_layout.addDrawerListener(toggle) toggle.syncState() nav_view.setNavigationItemSelectedListener(this) } override fun onBackPressed() { if (drawer_layout.isDrawerOpen(GravityCompat.START)) { drawer_layout.closeDrawer(GravityCompat.START) } else { super.onBackPressed() } } override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the menu; this adds items to the action bar if it is present. menuInflater.inflate(R.menu.main, menu) return true } override fun onOptionsItemSelected(item: MenuItem): Boolean { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. return when (item.itemId) { R.id.action_settings -> true else -> super.onOptionsItemSelected(item) } } override fun onNavigationItemSelected(item: MenuItem): Boolean { // Handle navigation view item clicks here. when (item.itemId) { R.id.nav_home -> { val homeFragment = HomeFragment() 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.setMainActivity(this) val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.replace(R.id.fragment_container, mensaFragment) fragmentTransaction.commit() } R.id.nav_timetable -> { val timeTableFragment = TimeTableFragment() timeTableFragment.setMainActivity(this) val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.replace(R.id.fragment_container, timeTableFragment) fragmentTransaction.commit() } R.id.nav_moodle -> { } R.id.nav_settings -> { val settingsFragment = SettingsFragment() settingsFragment.setMainActivity(this) val fragmentTransaction: FragmentTransaction = supportFragmentManager.beginTransaction() fragmentTransaction.replace(R.id.fragment_container, settingsFragment) fragmentTransaction.commit() } } drawer_layout.closeDrawer(GravityCompat.START) return true } /** * update the gui with the data of the new selected course * save selected course and courseTTLink */ fun updateCourse(course: CourseTTLink) { println(course.course) println(course.courseTTLink) this.course = course // save new selected course val sharedPref = getPreferences(MODE_PRIVATE) ?: return with (sharedPref.edit()) { putString(getString(R.string.save_key_course), course.course) putString(getString(R.string.save_key_courseTTLink), course.courseTTLink.replace("http", "https")) apply() } timeTableCurrentWeek = timeTableParser.getTimeTable(course.courseTTLink.replace("http", "https")) } /** * load the mensa menus of the current week * TODO evaluate if we should use a timeout here */ private fun load() { // load saved course val sharedPref = getPreferences(MODE_PRIVATE) ?: return course = CourseTTLink( sharedPref.getString(getString(R.string.save_key_courseTTLink), "https://www.hs-offenburg.de/index.php?id=6627&class=class&iddV=DA64F6FE-9DDB-429E-A677-05D0D40CB636&week=0")!!, sharedPref.getString(getString(R.string.save_key_course), "AI3")!! ) /** * load mensa, course timetable and courselist from the swfr/hso website * TODO make an API see https://git.mosad.xyz/Seil0/TheCitadelofRicks */ 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 { try { timeTableNextWeek = timeTableParser.getTimeTable(course.courseTTLink.replace("week=0","week=1")) } catch (e: Exception) { e.stackTrace } } val t1 = doAsync { weekMenus = mensaParser.getMensaMenu() } val t2 = doAsync { try { timeTableCurrentWeek = timeTableParser.getTimeTable(course.courseTTLink) } catch (e: Exception) { uiThread { MaterialDialog(this@MainActivity) .title(R.string.error) .message(R.string.no_tt_error) .show() } e.stackTrace } } t1.get() t2.get() } println("Completed in $time ms") } fun getCourseTTLinkList(): ArrayList{ return courseTTLinkList } fun getTimeTableCurrentWeek(): Array> { return timeTableCurrentWeek } fun getTimeTableNextWeek(): Array> { return timeTableNextWeek } fun getWeekMenu(): ArrayList{ return weekMenus } fun getCourse(): CourseTTLink { return course } }