diff --git a/app/src/main/java/de/xikolo/controllers/dialogs/Android4DeprecatedDialog.kt b/app/src/main/java/de/xikolo/controllers/dialogs/Android4DeprecatedDialog.kt
new file mode 100644
index 000000000..4cb544a72
--- /dev/null
+++ b/app/src/main/java/de/xikolo/controllers/dialogs/Android4DeprecatedDialog.kt
@@ -0,0 +1,36 @@
+package de.xikolo.controllers.dialogs
+
+import android.app.Dialog
+import android.os.Bundle
+import android.support.v7.app.AlertDialog
+import de.xikolo.R
+import de.xikolo.controllers.dialogs.base.BaseDialogFragment
+
+class Android4DeprecatedDialog : BaseDialogFragment() {
+
+ companion object {
+ val TAG: String = Android4DeprecatedDialog::class.java.simpleName
+ }
+
+ var listener: Listener? = null
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val builder = AlertDialog.Builder(activity!!, R.style.AppTheme_Dialog)
+ .setTitle(
+ getString(R.string.dialog_android_4_deprecation_title)
+ )
+ .setMessage(
+ getString(R.string.dialog_android_4_deprecation_message)
+ )
+ .setPositiveButton(getString(R.string.ok)) { _, _ ->
+ listener?.onConfirmed()
+ }
+
+ return builder.create()
+ }
+
+ interface Listener {
+ fun onConfirmed()
+ }
+
+}
diff --git a/app/src/main/java/de/xikolo/controllers/dialogs/Android4UnsupportedDialog.kt b/app/src/main/java/de/xikolo/controllers/dialogs/Android4UnsupportedDialog.kt
new file mode 100644
index 000000000..424e5c2c9
--- /dev/null
+++ b/app/src/main/java/de/xikolo/controllers/dialogs/Android4UnsupportedDialog.kt
@@ -0,0 +1,36 @@
+package de.xikolo.controllers.dialogs
+
+import android.app.Dialog
+import android.os.Bundle
+import android.support.v7.app.AlertDialog
+import de.xikolo.R
+import de.xikolo.controllers.dialogs.base.BaseDialogFragment
+
+class Android4UnsupportedDialog : BaseDialogFragment() {
+
+ companion object {
+ val TAG: String = Android4UnsupportedDialog::class.java.simpleName
+ }
+
+ var listener: Listener? = null
+
+ override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
+ val builder = AlertDialog.Builder(activity!!, R.style.AppTheme_Dialog)
+ .setTitle(
+ getString(R.string.dialog_android_4_unsupported_title)
+ )
+ .setMessage(
+ getString(R.string.dialog_android_4_unsupported_message)
+ )
+ .setNegativeButton(getString(R.string.dialog_android_4_unsupported_no)) { _, _ ->
+ listener?.onConfirmed()
+ }
+
+ return builder.create()
+ }
+
+ interface Listener {
+ fun onConfirmed()
+ }
+
+}
diff --git a/app/src/main/java/de/xikolo/controllers/main/SplashActivity.kt b/app/src/main/java/de/xikolo/controllers/main/SplashActivity.kt
index f6daa3892..9dc1c10ec 100644
--- a/app/src/main/java/de/xikolo/controllers/main/SplashActivity.kt
+++ b/app/src/main/java/de/xikolo/controllers/main/SplashActivity.kt
@@ -2,12 +2,15 @@ package de.xikolo.controllers.main
import android.content.Intent
import android.net.Uri
+import android.os.Build
import android.os.Bundle
import android.support.v4.app.DialogFragment
import android.support.v7.app.AppCompatActivity
import de.xikolo.controllers.dialogs.*
import de.xikolo.jobs.CheckHealthJob
import de.xikolo.jobs.base.RequestJobCallback
+import de.xikolo.storages.ApplicationPreferences
+import de.xikolo.utils.DateUtil
import java.util.*
import java.util.concurrent.TimeUnit
@@ -47,7 +50,44 @@ class SplashActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- CheckHealthJob(healthCheckCallback).run()
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+ when {
+ DateUtil.isPast("2018-07-15T00:00:00.000") && !ApplicationPreferences().firstAndroid4DeprecationWarningShown -> {
+ val dialog = Android4DeprecatedDialog()
+ dialog.listener = object : Android4DeprecatedDialog.Listener {
+ override fun onConfirmed() {
+ CheckHealthJob(healthCheckCallback).run()
+ }
+ }
+ showDialog(dialog, Android4DeprecatedDialog.TAG)
+ ApplicationPreferences().firstAndroid4DeprecationWarningShown = true
+ }
+ DateUtil.isPast("2018-08-15T00:00:00.000") && !ApplicationPreferences().secondAndroid4DeprecationWarningShown -> {
+ val dialog = Android4DeprecatedDialog()
+ dialog.listener = object : Android4DeprecatedDialog.Listener {
+ override fun onConfirmed() {
+ CheckHealthJob(healthCheckCallback).run()
+ }
+ }
+ showDialog(dialog, Android4DeprecatedDialog.TAG)
+ ApplicationPreferences().secondAndroid4DeprecationWarningShown = true
+ }
+ DateUtil.isPast("2018-08-31T00:00:00.000") -> {
+ val dialog = Android4UnsupportedDialog()
+ dialog.listener = object : Android4UnsupportedDialog.Listener {
+ override fun onConfirmed() {
+ closeApp()
+ }
+ }
+ showDialog(dialog, Android4DeprecatedDialog.TAG)
+ }
+ else -> {
+ CheckHealthJob(healthCheckCallback).run()
+ }
+ }
+ } else {
+ CheckHealthJob(healthCheckCallback).run()
+ }
}
private fun showApiVersionExpiredDialog() {
diff --git a/app/src/main/java/de/xikolo/storages/ApplicationPreferences.kt b/app/src/main/java/de/xikolo/storages/ApplicationPreferences.kt
index 2587da3f3..2c430fa8b 100644
--- a/app/src/main/java/de/xikolo/storages/ApplicationPreferences.kt
+++ b/app/src/main/java/de/xikolo/storages/ApplicationPreferences.kt
@@ -39,6 +39,14 @@ class ApplicationPreferences {
get() = getBoolean(context.getString(R.string.preference_used_second_screen), false)
set(value) = putBoolean(context.getString(R.string.preference_used_second_screen), value)
+ var firstAndroid4DeprecationWarningShown: Boolean
+ get() = getBoolean(context.getString(R.string.preference_first_android_4_deprecation_dialog), false)
+ set(value) = putBoolean(context.getString(R.string.preference_first_android_4_deprecation_dialog), value)
+
+ var secondAndroid4DeprecationWarningShown: Boolean
+ get() = getBoolean(context.getString(R.string.preference_second_android_4_deprecation_dialog), false)
+ set(value) = putBoolean(context.getString(R.string.preference_second_android_4_deprecation_dialog), value)
+
private fun getBoolean(key: String, defValue: Boolean = true) = preferences.getBoolean(key, defValue)
private fun putBoolean(key: String, value: Boolean) {
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 8498e9a3d..4a53acb89 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -105,6 +105,12 @@
Beim Kontaktieren des Servers ist ein Problem aufgetreten. Bitte versuche es später noch einmal.
Schließen
+ Android 4 Unterstützung wird eingestellt
+ Aus Sicherheitsgründen endet die Unterstützung für Android 4 am 31. August 2018. Danach wird die App nicht mehr funktionieren. Bitte aktualisieren Sie Ihr Gerät oder verwenden Sie stattdessen die Web-Version.
+ Android 4 Unterstützung wurde eingestellt
+ Aus Sicherheitsgründen wurde die Unterstützung für Android 4 beendet. Bitte aktualisieren Sie Ihr Gerät oder verwenden Sie stattdessen die Web-Version.
+ Schließen
+
Module
diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml
index 9cceb3abc..cebfa5626 100644
--- a/app/src/main/res/values/keys.xml
+++ b/app/src/main/res/values/keys.xml
@@ -30,6 +30,9 @@
used_second_screen
dialog_second_screen
+ first_android_4_deprecation_dialog
+ second_android_4_deprecation_dialog
+
%1$02d:%2$02d
%1$d%%
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 9cb3964c3..c4244871b 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -107,6 +107,12 @@
There was an issue while contacting the server. Please try again later.
Close
+ Android 4 support is discontinued
+ For security reasons, support for Android 4 ends on August 31, 2018. After that, the app will no longer work. Please upgrade your device or use the web version instead.
+ Android 4 support has been discontinued
+ For security reasons, support for Android 4 ended. Please upgrade your device or use the web version instead.
+ Close
+
Module
@@ -148,6 +154,7 @@
or
SSO
SSO Login
+ OK
%1$.1f of %2$.1f self-test points
%1$.1f of %2$.1f assignment points