diff --git a/app/build.gradle b/app/build.gradle index 80e301f..c062b82 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "com.denizd.substitutionplan" minSdkVersion 21 targetSdkVersion 28 - versionCode 38 - versionName "2.3.0" + versionCode 39 + versionName "2.3.1" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/java/com/denizd/substitutionplan/activities/Login.kt b/app/src/main/java/com/denizd/substitutionplan/activities/Login.kt index 88444e6..50b46e7 100644 --- a/app/src/main/java/com/denizd/substitutionplan/activities/Login.kt +++ b/app/src/main/java/com/denizd/substitutionplan/activities/Login.kt @@ -18,11 +18,13 @@ import android.widget.LinearLayout import android.widget.TextView import androidx.appcompat.app.AppCompatActivity import androidx.constraintlayout.widget.ConstraintLayout +import androidx.coordinatorlayout.widget.CoordinatorLayout import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat import com.denizd.substitutionplan.R import com.denizd.substitutionplan.data.HelperFunctions import com.denizd.substitutionplan.data.LoginWebViewClient import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton +import com.google.android.material.snackbar.Snackbar import kotlin.math.hypot /** @@ -34,11 +36,13 @@ internal class Login : AppCompatActivity(R.layout.activity_login_webview), Login private lateinit var prefs: SharedPreferences private lateinit var parentLayout: ConstraintLayout private lateinit var logInButton: ExtendedFloatingActionButton + private lateinit var snackBarLayout: CoordinatorLayout override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setTheme(R.style.AppTheme0) parentLayout = findViewById(R.id.constraintLayout) + snackBarLayout = findViewById(R.id.snackBarLayout) parentLayout.layoutTransition.enableTransitionType(LayoutTransition.CHANGING) val title = findViewById(R.id.txtWelcome) prefs = PreferenceManager.getDefaultSharedPreferences(this) @@ -65,6 +69,8 @@ internal class Login : AppCompatActivity(R.layout.activity_login_webview), Login override fun onLoginSucceeded(success: Boolean) { if (success) { success() + } else { + Snackbar.make(snackBarLayout, getString(R.string.error_please_try_again), Snackbar.LENGTH_LONG).show() } } diff --git a/app/src/main/java/com/denizd/substitutionplan/data/HelperFunctions.kt b/app/src/main/java/com/denizd/substitutionplan/data/HelperFunctions.kt index 0ef00a1..b7f4cda 100644 --- a/app/src/main/java/com/denizd/substitutionplan/data/HelperFunctions.kt +++ b/app/src/main/java/com/denizd/substitutionplan/data/HelperFunctions.kt @@ -323,15 +323,15 @@ internal object HelperFunctions { * @return the ranking as an integer */ fun assignRanking(group: String, isPSA: Boolean): Int { - if (isPSA) return -31 + if (isPSA) return -102 return try { when { - checkStringForArray(group.substring(0, 1), juniors) -> -30 - group.substring(0, 1) == "1" || group.substring(0, 1) == "2" -> { - val a = group.substring(1, 2).toInt() - a - (a * 2) + group.substring(0, 2).toIntOrNull() != null -> { + val a = group.substring(0, 2).toInt() + -a } - else -> -29 + checkStringForArray(group.substring(0, 1), juniors) -> -101 + else -> -100 } } catch (e: Exception) { 0 diff --git a/app/src/main/java/com/denizd/substitutionplan/data/LoginWebViewClient.kt b/app/src/main/java/com/denizd/substitutionplan/data/LoginWebViewClient.kt index d78857b..c4c458c 100644 --- a/app/src/main/java/com/denizd/substitutionplan/data/LoginWebViewClient.kt +++ b/app/src/main/java/com/denizd/substitutionplan/data/LoginWebViewClient.kt @@ -15,6 +15,10 @@ import java.lang.IllegalStateException */ internal class LoginWebViewClient(private val successListener: OnLoginSuccessListener) : WebViewClient() { + private val schoolUrls = arrayOf("https://307.joomla.schule.bremen.de/index.php/component/users/#top", + "https://307.joomla.schule.bremen.de/index.php/component/users/?task=user.login&Itemid=171", + "https://307.joomla.schule.bremen.de/index.php/component/users/profile?Itemid=171") + /** * onPageStarted has been overridden to prevent users from reaching a domain different from * the school's login page @@ -22,9 +26,7 @@ internal class LoginWebViewClient(private val successListener: OnLoginSuccessLis override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) { super.onPageStarted(view, url, favicon) - if (url != "https://307.joomla.schule.bremen.de/index.php/component/users/profile?Itemid=171" - && url != "https://307.joomla.schule.bremen.de/index.php/component/users/#top" - && url != "https://307.joomla.schule.bremen.de/index.php/component/users/?task=user.login&Itemid=171") { + if (!HelperFunctions.checkStringForArray(url.toString(), schoolUrls)) { reloadLoginPage(webView = view) } } @@ -39,7 +41,10 @@ internal class LoginWebViewClient(private val successListener: OnLoginSuccessLis val cookies = CookieManager.getInstance().getCookie(url) - if (cookies.contains("joomla_user_state=logged_in")) { + if (cookies == null) { + reloadLoginPage(webView = view) + successListener.onLoginSucceeded(false) + } else if (cookies.contains("joomla_user_state=logged_in")) { successListener.onLoginSucceeded(true) } } @@ -54,10 +59,10 @@ internal class LoginWebViewClient(private val successListener: OnLoginSuccessLis internal interface OnLoginSuccessListener { /** - * This function can be overridden to execute code when a login has been successful + * This function returns a boolean value depending on the success status of the login process * * @param success boolean value that is set to true if the cookie could be found, - * false otherwise + * false if an error occurred */ fun onLoginSucceeded(success: Boolean) } diff --git a/app/src/main/res/layout/activity_login_webview.xml b/app/src/main/res/layout/activity_login_webview.xml index 3f1d48b..6e45210 100644 --- a/app/src/main/res/layout/activity_login_webview.xml +++ b/app/src/main/res/layout/activity_login_webview.xml @@ -74,4 +74,15 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"/> + + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 49c993d..24f5451 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -164,4 +164,5 @@ Sortierweise Informationen über Sortierweisen Du kannst zwischen zwei Sortierweisen auswählen, welche die Reihenfolge der Einträge auf dem Vertretungsplan bestimmen.\n\nStandardmäßig ist \'App-spezifisch\' ausgewählt; dies bietet einen konsistenten Plan sortiert nach Klassen, dann nach Stunden.\n\n\'Website-Original\' bietet die Original-Reihenfolge der Website. Diese ist jedoch nicht konsistent, weswegen \'App-spezifisch\' standardmäßig ausgewählt ist. + Ein Fehler ist aufgetreten, bitte versuche es erneut \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c7d0d18..676fb0d 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -176,4 +176,5 @@ Ordering system Information on ordering systems You may pick between two ordering systems that dictate the order in which the items on the substitution plan will appear in.\n\nThe default \'app-specific\' is an algorithm implemented in this app that provides a consistently-sorted substitution plan ordered just like the substitution plan on the website used to; sorted by classes, then by time.\n\n\'Website original\' offers the items on the substitution plan just like they\'re presented on the school website, but since these are not guaranteed to be consistent, \'app-specific\' is picked by default. + An error occurred, please try again