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.