From 9d7504bbafd6d8a047d55c0e55aba79fd404a412 Mon Sep 17 00:00:00 2001 From: Jannik Seiler Date: Fri, 14 Aug 2020 21:41:43 +0200 Subject: [PATCH] add grades ui --- app/build.gradle | 2 +- .../mosad/seil0/projectlaogai/MainActivity.kt | 6 +- .../projectlaogai/controller/QISPOSParser.kt | 36 +++++- .../projectlaogai/fragments/GradesFragment.kt | 103 ++++++++++++++++++ .../uicomponents/GradeLinearLayout.kt | 51 +++++++++ .../activities/layout/linearlayout_grade.xml | 41 +++++++ .../fragments/layout/fragment_grades.xml | 37 +++++++ .../main/res/menu/activity_main_drawer.xml | 4 + app/src/main/res/values-de-rDE/strings.xml | 4 + app/src/main/res/values/strings.xml | 4 + 10 files changed, 278 insertions(+), 10 deletions(-) create mode 100644 app/src/main/java/org/mosad/seil0/projectlaogai/fragments/GradesFragment.kt create mode 100644 app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/GradeLinearLayout.kt create mode 100644 app/src/main/res/layouts/activities/layout/linearlayout_grade.xml create mode 100644 app/src/main/res/layouts/fragments/layout/fragment_grades.xml diff --git a/app/build.gradle b/app/build.gradle index 39f46d0..262ce53 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -11,7 +11,7 @@ android { minSdkVersion 23 targetSdkVersion 29 versionCode 15 - versionName "0.5.91" + versionName "0.5.92" 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/MainActivity.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt index dbab618..9c0793a 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/MainActivity.kt @@ -44,7 +44,6 @@ import com.google.android.material.navigation.NavigationView import kotlinx.android.synthetic.main.activity_main.* import kotlinx.android.synthetic.main.app_bar_main.* import org.mosad.seil0.projectlaogai.controller.NFCMensaCard -import org.mosad.seil0.projectlaogai.controller.QISPOSParser import org.mosad.seil0.projectlaogai.controller.cache.CacheController import org.mosad.seil0.projectlaogai.controller.preferences.EncryptedPreferences import org.mosad.seil0.projectlaogai.controller.preferences.Preferences @@ -156,6 +155,7 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte R.id.nav_mensa -> MensaFragment() R.id.nav_timetable -> TimeTableFragment() R.id.nav_moodle -> MoodleFragment() + R.id.nav_grades -> GradesFragment() R.id.nav_settings -> SettingsFragment() else -> HomeFragment() } @@ -177,10 +177,6 @@ class MainActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelecte Preferences.load(this) // load the settings, must be finished before doing anything else CacheController(this) // load the cache EncryptedPreferences.load(this) - - val parser = QISPOSParser() - parser.parseGrades(applicationContext) - } Log.i(className, "startup completed in $startupTime ms") } diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/QISPOSParser.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/QISPOSParser.kt index 3e4d546..09efd86 100644 --- a/app/src/main/java/org/mosad/seil0/projectlaogai/controller/QISPOSParser.kt +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/controller/QISPOSParser.kt @@ -1,3 +1,25 @@ +/** + * ProjectLaogai + * + * Copyright 2019-2020 + * + * 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.controller import android.content.Context @@ -28,22 +50,26 @@ class QISPOSParser { //private val rootPath = "/qispos/rds?state=change&type=1&moduleParameter=studyPOSMenu&nextdir=change&next=menu.vm&subdir=applications&xml=menu&purge=y&navigationPosition=functions%2CstudyPOSMenu&breadcrumb=studyPOSMenu&topitem=functions&subitem=studyPOSMenu" - fun parseGrades(context: Context) { + fun parseGrades(context: Context): HashMap> { val gradesMap = HashMap>() val gradesListHtml = readGrades(context) gradesListHtml?.select("table > tbody > tr")?.forEach { - val row = it.select("td.qis_konto") + //val row = it.select("td.qis_konto") + + val row = it.select("td.tabelle1_alignleft,td.tabelle1_aligncenter,td.tabelle1_alignright") //println("-----------------------------------------------------------") //println(it.select("td.qis_konto")) - if(row.size >= 6) { + //if(row.size >= 6) { + // only real subjects will be selected + if(row.size >= 6 && row[0].text().length >=7) { val subject = gradeSubject( id = row[0].text(), name = row[1].text(), semester = row[2].text(), - grade = row[3].text(), + grade = if (row[3].text().isNotEmpty()) row[3].text() else row[4].text(), credits = row[5].text() ) @@ -73,6 +99,8 @@ class QISPOSParser { // TODO sort println("finished parsing!") + + return gradesMap } /** diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/GradesFragment.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/GradesFragment.kt new file mode 100644 index 0000000..a864a23 --- /dev/null +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/GradesFragment.kt @@ -0,0 +1,103 @@ +/** + * ProjectLaogai + * + * Copyright 2019-2020 + * + * 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.fragments + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.Fragment +import androidx.swiperefreshlayout.widget.SwipeRefreshLayout +import kotlinx.android.synthetic.main.fragment_grades.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import org.mosad.seil0.projectlaogai.R +import org.mosad.seil0.projectlaogai.controller.QISPOSParser +import org.mosad.seil0.projectlaogai.uicomponents.DayCardView +import org.mosad.seil0.projectlaogai.uicomponents.GradeLinearLayout + +/** + * A simple [Fragment] subclass. + */ +class GradesFragment : Fragment() { + + private lateinit var refreshLayoutGrades: SwipeRefreshLayout + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + val view: View = inflater.inflate(R.layout.fragment_grades, container, false) + + refreshLayoutGrades = view.findViewById(R.id.refreshLayout_Grades) + + GlobalScope.launch(Dispatchers.Default) { + addGrades() + } + + return view + } + + private fun addGrades() = GlobalScope.launch(Dispatchers.Default) { + withContext(Dispatchers.Main) { + refreshLayout_Grades.isRefreshing = true + } + + val parser = QISPOSParser() + val grades = parser.parseGrades(context!!) + + withContext(Dispatchers.Main) { + linLayout_Grades.removeAllViews() // clear layout + } + + // for each semester add a new card + grades.forEach { semester -> + val semesterCard = DayCardView(context!!) + semesterCard.setDayHeading(semester.key) + + // for each subject add a new linLayout + semester.value.forEachIndexed { index, subject -> + val subjectLayout = GradeLinearLayout(context).set { + subjectName = subject.name + grade = subject.grade + } + + if (index == semester.value.lastIndex) + subjectLayout.disableDivider() + + semesterCard.getLinLayoutDay().addView(subjectLayout) + } + + // without context we can't access the view + withContext(Dispatchers.Main) { + linLayout_Grades.addView(semesterCard) + } + } + withContext(Dispatchers.Main) { + refreshLayout_Grades.isRefreshing = false + } + + //refreshLayoutGrades.isRefreshing = false + } + +} \ No newline at end of file diff --git a/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/GradeLinearLayout.kt b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/GradeLinearLayout.kt new file mode 100644 index 0000000..ac2f16a --- /dev/null +++ b/app/src/main/java/org/mosad/seil0/projectlaogai/uicomponents/GradeLinearLayout.kt @@ -0,0 +1,51 @@ +/** + * ProjectLaogai + * + * Copyright 2019-2020 + * + * 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.view.View +import android.widget.LinearLayout +import androidx.cardview.widget.CardView +import kotlinx.android.synthetic.main.linearlayout_grade.view.* +import org.mosad.seil0.projectlaogai.R + +class GradeLinearLayout(context: Context?): LinearLayout(context) { + + var subjectName = "" + var grade = "" + + init { + CardView.inflate(context, R.layout.linearlayout_grade, this) + } + + fun set(func: GradeLinearLayout.() -> Unit): GradeLinearLayout = apply { + func() + + txtView_subject.text = subjectName + txtView_grade.text = grade + } + + fun disableDivider() { + divider_grades.visibility = View.GONE + } +} \ No newline at end of file diff --git a/app/src/main/res/layouts/activities/layout/linearlayout_grade.xml b/app/src/main/res/layouts/activities/layout/linearlayout_grade.xml new file mode 100644 index 0000000..9c8eee6 --- /dev/null +++ b/app/src/main/res/layouts/activities/layout/linearlayout_grade.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/layouts/fragments/layout/fragment_grades.xml b/app/src/main/res/layouts/fragments/layout/fragment_grades.xml new file mode 100644 index 0000000..04ef54d --- /dev/null +++ b/app/src/main/res/layouts/fragments/layout/fragment_grades.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/menu/activity_main_drawer.xml b/app/src/main/res/menu/activity_main_drawer.xml index f0fdacc..0b257b9 100644 --- a/app/src/main/res/menu/activity_main_drawer.xml +++ b/app/src/main/res/menu/activity_main_drawer.xml @@ -20,6 +20,10 @@ android:id="@+id/nav_moodle" android:icon="@drawable/ic_school_black_24dp" android:title="@string/moodle"/> + Mensa Stundenplan Moodle + Noten Einstellungen @@ -38,6 +39,9 @@ Studiengänge: Vorlesungen: + + Lade Daten von den Hochschul Servern.\nDas kann eine Weile dauern. + Info Benutzer diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a89f178..fa5453a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -10,6 +10,7 @@ Mensa Timetable Moodle + Grades Settings @@ -40,6 +41,9 @@ Courses: Lessons: + + Loading data from the university servers.\nThis may take a while. + Info User