diff --git a/app/build.gradle b/app/build.gradle index 4b09486..fd38dc6 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -5,13 +5,13 @@ apply plugin: 'kotlin-android-extensions' android { useLibrary 'org.apache.http.legacy' - compileSdkVersion 28 + compileSdkVersion 29 defaultConfig { applicationId "de.nils_beyer.android.testapplication" minSdkVersion 17 - targetSdkVersion 28 - versionCode 22 - versionName "1.7.6" + targetSdkVersion 29 + versionCode 23 + versionName "1.7.7" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 94d0956..2202e6d 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,7 @@ + = 23) { window.statusBarColor = resources.getColor(R.color.login_color, theme) } @@ -60,6 +64,7 @@ class LoginActivity : AppCompatActivity() { finish() } else { login_error.visibility = View.VISIBLE + login_error.text = getString(R.string.login_error) val vibratorService = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator // Use new VibrationEffect call on Android Oreo @@ -76,7 +81,23 @@ class LoginActivity : AppCompatActivity() { // on error progressBar.visibility = View.GONE login_btn_login.isEnabled = true - Snackbar.make(activity_login, getString(R.string.io_error), Snackbar.LENGTH_LONG).show() + + login_error.visibility = View.VISIBLE + login_error.text = it.message + + val vibratorService = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator + + // Use new VibrationEffect call on Android Oreo + // if not available, use the deprecated vibrate method. + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + vibratorService.vibrate(VibrationEffect.createOneShot( + 100, VibrationEffect.DEFAULT_AMPLITUDE + )) + } else { + vibratorService.vibrate(100) + } + + Snackbar.make(activity_login, String.format(getString(R.string.activity_login_generic_error_template), it.message), Snackbar.LENGTH_LONG).show() }) } @@ -100,9 +121,9 @@ class LoginActivity : AppCompatActivity() { private fun checkPassword(callback: (Boolean)->(Unit), error : (Exception) -> Unit) { Thread(Runnable { try { - login_account_spinner.getSelectedAccount()!!.tryRegister(this, login_username.text.toString(), login_password.text.toString()) + login_account_spinner.getSelectedAccount().tryRegister(this, login_username.text.toString(), login_password.text.toString()) runOnUiThread { callback(true) } - } catch (e: SecurityException) { + } catch (e: UnAuthorizedException) { // In case that the authorization // credentials are wrong // a security Exception is thrown by the @@ -128,4 +149,16 @@ class LoginActivity : AppCompatActivity() { imm.hideSoftInputFromWindow(view.windowToken, 0) } } + + /** + * Returns the app version name or null if packageManager throws an error + */ + private fun getAppVersion() : String? { + return try { + val pInfo = packageManager.getPackageInfo(packageName, 0) + pInfo.versionName + } catch (e: PackageManager.NameNotFoundException) { + null + } + } } diff --git a/app/src/main/java/de/nils_beyer/android/Vertretungen/download/DownloadHTML.kt b/app/src/main/java/de/nils_beyer/android/Vertretungen/download/DownloadHTML.kt index e372d4d..ac581a9 100644 --- a/app/src/main/java/de/nils_beyer/android/Vertretungen/download/DownloadHTML.kt +++ b/app/src/main/java/de/nils_beyer/android/Vertretungen/download/DownloadHTML.kt @@ -7,7 +7,9 @@ import java.net.HttpURLConnection import java.net.URL import javax.net.ssl.HttpsURLConnection -@Throws(SecurityException::class, IllegalStateException::class) +class UnAuthorizedException : Exception() + +@Throws(SecurityException::class, IllegalStateException::class, UnAuthorizedException::class) fun downloadHTMLFileWithCredientials(url : String, username : String, password : String) : String { // Setup HTTP connection val urlConnection = URL(url).openConnection() as HttpsURLConnection @@ -18,7 +20,7 @@ fun downloadHTMLFileWithCredientials(url : String, username : String, password : // 401 - Unauthorized e.g. wrong credentials if (httpStatusCode == 401) { - throw SecurityException("Unauthorized HTTP request") + throw UnAuthorizedException() } if (httpStatusCode != 200) { diff --git a/app/src/main/java/de/nils_beyer/android/Vertretungen/download/StudentDownloadService.java b/app/src/main/java/de/nils_beyer/android/Vertretungen/download/StudentDownloadService.java index 38246f3..470ff4c 100644 --- a/app/src/main/java/de/nils_beyer/android/Vertretungen/download/StudentDownloadService.java +++ b/app/src/main/java/de/nils_beyer/android/Vertretungen/download/StudentDownloadService.java @@ -88,7 +88,7 @@ protected void onHandleIntent(Intent intent) { reply.send(this, DownloadResultCodes.RESULT_SUCCESS.ordinal(), result); - } catch (SecurityException exc) { + } catch (UnAuthorizedException exc) { // The given username/password are incorrect StudentAccount.INSTANCE.setLoginValid(getApplicationContext(), false); Intent data = new Intent(); @@ -124,11 +124,11 @@ private String readMotd(String html) { } } - protected String downloadHTMLFile(String url) throws SecurityException, IllegalStateException { + protected String downloadHTMLFile(String url) throws SecurityException, IllegalStateException, UnAuthorizedException { return downloadHTMLFile(url, StudentAccount.getUserName(getApplicationContext()), StudentAccount.getPassword(getApplicationContext())); } - public static String downloadHTMLFile(String url, String username, String password) throws SecurityException, IllegalStateException { + public static String downloadHTMLFile(String url, String username, String password) throws SecurityException, IllegalStateException, UnAuthorizedException { return DownloadHTMLKt.downloadHTMLFileWithCredientials(url, username, password); } diff --git a/app/src/main/java/de/nils_beyer/android/Vertretungen/download/TeacherDownloadService.java b/app/src/main/java/de/nils_beyer/android/Vertretungen/download/TeacherDownloadService.java index f994c20..48db1ef 100644 --- a/app/src/main/java/de/nils_beyer/android/Vertretungen/download/TeacherDownloadService.java +++ b/app/src/main/java/de/nils_beyer/android/Vertretungen/download/TeacherDownloadService.java @@ -99,7 +99,7 @@ protected void onHandleIntent(Intent intent) { VertretungenWidgetProvider.updateWidgetData(this); reply.send(this, DownloadResultCodes.RESULT_SUCCESS.ordinal(), result); - } catch (SecurityException exc) { + } catch (UnAuthorizedException exc) { // The given username/password are incorrect StudentAccount.INSTANCE.setLoginValid(getApplicationContext(), false); Intent data = new Intent(); @@ -120,7 +120,7 @@ protected String downloadHTMLFile(String url) throws Exception { return downloadHTMLFile(url, TeacherAccount.getUserName(getApplicationContext()), TeacherAccount.getPassword(getApplicationContext())); } - public static String downloadHTMLFile(String url, String username, String password) throws IllegalStateException, SecurityException { + public static String downloadHTMLFile(String url, String username, String password) throws IllegalStateException, SecurityException, UnAuthorizedException { return DownloadHTMLKt.downloadHTMLFileWithCredientials(url, username, password); } diff --git a/app/src/main/res/layout/activity_login.xml b/app/src/main/res/layout/activity_login.xml index 8b1b984..e7d6a07 100644 --- a/app/src/main/res/layout/activity_login.xml +++ b/app/src/main/res/layout/activity_login.xml @@ -101,10 +101,19 @@ + android:layout_alignParentBottom="true" + android:text="@string/login_info" + android:textStyle="italic" /> + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5a47682..2559a3e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -29,7 +29,8 @@ Keine Daten heruntergeladen - Verbindungsfehler \nBitte überprüfen Sie Ihre Internetverbindung + Etwas ist fehlgeschlagen.\n%s + Etwas ist fehlgeschlagen. Prüfen Sie Ihre Internetverbindung oder versuchen Sie sich erneut anzumelden. Anmeldedaten fehlerhaft. Neu anmelden Daten erfolgreich heruntergeladen