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 9552a7e..d4df974 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
@@ -27,6 +27,7 @@ import android.util.Log
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
+import org.jsoup.HttpStatusException
import org.jsoup.Jsoup
import org.jsoup.nodes.Element
import org.mosad.seil0.projectlaogai.R
@@ -51,6 +52,34 @@ class QISPOSParser(val context: Context) {
private val baseURL = "https://notenverwaltung.hs-offenburg.de"
private val loginPath = "/qispos/rds?state=user&type=1&category=auth.login&startpage=portal.vm&breadCrumbSource=portal"
+ /**
+ * check if qispos is available
+ * @return a http status code, 999 if no HttpStatusException supplied
+ */
+ fun checkQISPOSStatus(): Int {
+ return runBlocking {
+ withContext(Dispatchers.IO) {
+ val socketFactory = createSSLSocketFactory()
+
+ try {
+ val res = Jsoup.connect(baseURL + loginPath)
+ .sslSocketFactory(socketFactory)
+ .followRedirects(true)
+ .referrer("https://notenverwaltung.hs-offenburg.de/qispos/rds?state=user&type=0")
+ .execute()
+
+ res.statusCode()
+ } catch (exHttp: HttpStatusException) {
+ exHttp.statusCode
+ } catch (ex: Exception) {
+ Log.e(className, "Error while checking status", ex)
+ 999
+ }
+
+ }
+ }
+ }
+
/**
* parse the html from readGrades()
* @return a SortedMap, each entry is a semester, each semester has a ArrayList with subjects
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
index cc10a27..ccae6cd 100644
--- a/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/GradesFragment.kt
+++ b/app/src/main/java/org/mosad/seil0/projectlaogai/fragments/GradesFragment.kt
@@ -22,18 +22,17 @@
package org.mosad.seil0.projectlaogai.fragments
+import android.graphics.Rect
import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
+import androidx.core.content.res.ResourcesCompat
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 kotlinx.coroutines.*
import org.mosad.seil0.projectlaogai.R
import org.mosad.seil0.projectlaogai.controller.QISPOSParser
import org.mosad.seil0.projectlaogai.controller.preferences.EncryptedPreferences
@@ -49,19 +48,27 @@ class GradesFragment : Fragment() {
private lateinit var refreshLayoutGrades: SwipeRefreshLayout
+ private lateinit var parser: QISPOSParser
+
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)
refreshLayoutGrades.isEnabled = false // disable swipe
- if (checkCredentials()) {
+ parser = QISPOSParser(context!!)// init the parser
+
+ return view
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ if (checkCredentials() && checkQisposStatus()) {
GlobalScope.launch(Dispatchers.Default) {
addGrades()
}
}
-
- return view
}
/**
@@ -92,13 +99,35 @@ class GradesFragment : Fragment() {
return credentialsPresent
}
+ /**
+ * check if qispos is available, if not show an error
+ */
+ private fun checkQisposStatus(): Boolean {
+ val statusCode = parser.checkQISPOSStatus()
+
+ val infoText = resources.getString(when(statusCode) {
+ 503 -> R.string.qispos_unavailable
+ else -> R.string.qispos_generic_error
+ })
+
+ val img = ResourcesCompat.getDrawable(resources, R.drawable.ic_error_outline_black_24dp, null)?.apply {
+ bounds = Rect(0, 0, 75, 75)
+ }
+
+ txtView_Loading?.apply {
+ text = infoText
+ setCompoundDrawables(null, null, null, img)
+ }
+
+ return statusCode == 200
+ }
+
// add the grades to the layout, async
private fun addGrades() = GlobalScope.launch(Dispatchers.Default) {
withContext(Dispatchers.Main) {
refreshLayout_Grades.isRefreshing = true
}
- val parser = QISPOSParser(context!!)
val grades = parser.parseGrades()
withContext(Dispatchers.Main) {
@@ -137,7 +166,7 @@ class GradesFragment : Fragment() {
// disable sub-subject if not set
if (subSubject == null)
subjectLayout.disableSubSubject()
-
+
// disable divider if last element
if (index == semester.value.lastIndex || semester.value.indexOf(subSubject) == semester.value.lastIndex)
subjectLayout.disableDivider()
@@ -151,6 +180,8 @@ class GradesFragment : Fragment() {
}
}
+
+
val txtViewLegal = TextView(context).apply {
text = resources.getString(R.string.without_guarantee)
textAlignment = View.TEXT_ALIGNMENT_CENTER
diff --git a/app/src/main/res/drawable/ic_error_outline_black_24dp.xml b/app/src/main/res/drawable/ic_error_outline_black_24dp.xml
new file mode 100644
index 0000000..843f0a8
--- /dev/null
+++ b/app/src/main/res/drawable/ic_error_outline_black_24dp.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/app/src/main/res/values-de-rDE/strings.xml b/app/src/main/res/values-de-rDE/strings.xml
index 704e46b..e63d921 100644
--- a/app/src/main/res/values-de-rDE/strings.xml
+++ b/app/src/main/res/values-de-rDE/strings.xml
@@ -42,6 +42,8 @@
Lade Daten von den Hochschul Servern.\nDas kann eine Weile dauern.
Diese Funktion benötigt deine Login-Daten. Bitte logge dich über die Einstellungen ein.
+ Die Notenverwaltung ist zur Zeit nicht ereichbar.\nVersuche es später noch einmal.\n
+ Error.\nVersuche es später noch einmal.\n
Alle Angaben ohne Gewähr.
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 4d35cea..4b1ecea 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -22,7 +22,7 @@
Course
Select your current course.\nAdditional lessons can be added later.
Login
- Project Laogai can connect to the HIS Online-Portal. Your Login-Data will be stored encrypted on your device. This feature is provided "as is", without any guarantee.
+ Project Laogai can connect to the Qispos Online-Portal. Your Login-Data will be stored encrypted on your device. This feature is provided "as is", without any guarantee.
E-Mail
Password
login
@@ -44,6 +44,8 @@
Loading data from the university servers.\nThis may take a while.
This feature needs your Login-Data to work. Please login via the settings.
+ The Qispos server is currently unavailable.\nPlease try again later.\n
+ Error.\nPlease try again later.\n
All information is supplied without guarantee.