diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 4ec27b2..a592398 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -44,6 +44,10 @@
+
+
+
diff --git a/app/src/main/java/com/dzeio/openhealth/Application.kt b/app/src/main/java/com/dzeio/openhealth/Application.kt
index cd5fc34..806ebef 100644
--- a/app/src/main/java/com/dzeio/openhealth/Application.kt
+++ b/app/src/main/java/com/dzeio/openhealth/Application.kt
@@ -1,39 +1,57 @@
-package com.dzeio.openhealth
-
-import android.app.Application
-import android.content.SharedPreferences
-import androidx.preference.PreferenceManager
-import com.google.android.material.color.DynamicColors
-import dagger.hilt.android.HiltAndroidApp
-import java.util.Locale
-
-@HiltAndroidApp
-class Application : Application() {
- companion object {
- const val TAG = "OpenHealth"
- }
-
- override fun onCreate() {
- super.onCreate()
-
- // Android Dynamics Colors
- DynamicColors.applyToActivitiesIfAvailable(this)
-
- // Change application Language based on setting
- val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
- val lang = preferences.getString("global_language", Locale.getDefault().language)
- val locale = Locale(lang)
- Locale.setDefault(locale)
-
-// val overrideConfiguration = baseContext.resources.configuration
-// overrideConfiguration.locale = locale
-// val context: Context = createConfigurationContext(overrideConfiguration)
-// val resources: Resources = context.resources
- }
-
- /**
- * SharedPreferences Key
- */
- object Settings {
- }
-}
+package com.dzeio.openhealth
+
+import android.app.Application
+import android.content.Intent
+import android.content.SharedPreferences
+import android.util.Log
+import androidx.preference.PreferenceManager
+import com.dzeio.openhealth.ui.ErrorActivity
+import com.google.android.material.color.DynamicColors
+import dagger.hilt.android.HiltAndroidApp
+import java.util.Locale
+
+@HiltAndroidApp
+class Application : Application() {
+ companion object {
+ const val TAG = "OpenHealth"
+ }
+
+ override fun onCreate() {
+ super.onCreate()
+
+ // Application Error Handling
+ Thread.setDefaultUncaughtExceptionHandler { paramThread, paramThrowable ->
+ //Log error to logcat if it wasn't done before
+ Log.e(TAG, "Error, ${paramThread.id}", paramThrowable)
+
+ // send use to the Error Activity
+ val intent = Intent(applicationContext, ErrorActivity::class.java)
+
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+ intent.putExtra("error", paramThrowable.stackTraceToString())
+ startActivity(intent)
+
+ return@setDefaultUncaughtExceptionHandler
+ }
+
+ // Android Dynamics Colors
+ DynamicColors.applyToActivitiesIfAvailable(this)
+
+ // Change application Language based on setting
+ val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(this)
+ val lang = preferences.getString("global_language", Locale.getDefault().language)
+ val locale = Locale(lang)
+ Locale.setDefault(locale)
+
+// val overrideConfiguration = baseContext.resources.configuration
+// overrideConfiguration.locale = locale
+// val context: Context = createConfigurationContext(overrideConfiguration)
+// val resources: Resources = context.resources
+ }
+
+ /**
+ * SharedPreferences Key
+ */
+ object Settings {
+ }
+}
diff --git a/app/src/main/java/com/dzeio/openhealth/ui/ErrorActivity.kt b/app/src/main/java/com/dzeio/openhealth/ui/ErrorActivity.kt
new file mode 100644
index 0000000..a3c8cbc
--- /dev/null
+++ b/app/src/main/java/com/dzeio/openhealth/ui/ErrorActivity.kt
@@ -0,0 +1,90 @@
+package com.dzeio.openhealth.ui
+
+import android.content.ActivityNotFoundException
+import android.content.Intent
+import android.net.Uri
+import android.os.Build
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.widget.Toast
+import com.dzeio.openhealth.Application
+import com.dzeio.openhealth.BuildConfig
+import com.dzeio.openhealth.core.BaseActivity
+import com.dzeio.openhealth.databinding.ActivityErrorBinding
+import dagger.hilt.android.AndroidEntryPoint
+
+@AndroidEntryPoint
+class ErrorActivity : BaseActivity() {
+
+ companion object {
+ const val TAG = "${Application.TAG}/ErrorActivity"
+ }
+
+ override val bindingInflater: (LayoutInflater) -> ActivityErrorBinding =
+ ActivityErrorBinding::inflate
+
+ override fun onCreated(savedInstanceState: Bundle?) {
+ super.onCreated(savedInstanceState)
+
+ val params = intent
+
+ val data = params.getStringExtra("error")
+
+ // Get Application datas
+ val deviceToReport = if (Build.DEVICE.contains(Build.MANUFACTURER)) Build.DEVICE else "${Build.MANUFACTURER} ${Build.DEVICE}"
+
+ val infos = """
+ Application ID: ${BuildConfig.APPLICATION_ID}
+ Version Code: ${BuildConfig.VERSION_CODE}
+ Version Name: ${BuildConfig.VERSION_NAME}
+
+ Android ${Build.VERSION.RELEASE} SDK ${Build.VERSION.SDK_INT}
+ Model: $deviceToReport ${Build.MODEL}
+ """.trimIndent()
+
+ // merge our texts
+ val reportText = infos + "\n\n" + data
+
+ // put it in the textView
+ binding.errorText.text = reportText
+
+ // Handle the Quit button
+ binding.errorQuit.setOnClickListener {
+ finish()
+ }
+
+ // Handle the Email Button
+ binding.errorSubmitEmail.setOnClickListener {
+
+ // Create Intent
+ val intent = Intent(Intent.ACTION_SEND)
+ intent.data = Uri.parse("mailto:")
+ intent.type = "text/plain"
+ intent.putExtra(Intent.EXTRA_EMAIL, arrayOf("report.openhealth@dzeio.com"))
+ intent.putExtra(Intent.EXTRA_SUBJECT, "Error report for application crash")
+ intent.putExtra(Intent.EXTRA_TEXT, "Send Report Email\n$reportText")
+
+ try {
+ startActivity(Intent.createChooser(intent, "Send Report Email..."))
+ } catch (e: ActivityNotFoundException) {
+ Toast.makeText(this, "Not Email client found :(", Toast.LENGTH_LONG).show()
+ }
+ }
+
+ // Handle the GitHub Button
+ binding.errorSubmitGithub.setOnClickListener {
+
+ // Build URL
+ val url = "https://github.com/dzeiocom/OpenHealth/issues/new?title=Application Error&body=$reportText"
+
+ try {
+ startActivity(
+ Intent(Intent.ACTION_VIEW, Uri.parse(url))
+ )
+ } catch (e: ActivityNotFoundException) {
+ Toast.makeText(this, "No Web Browser found :(", Toast.LENGTH_LONG).show()
+ }
+ }
+
+ }
+}
diff --git a/app/src/main/res/layout/activity_error.xml b/app/src/main/res/layout/activity_error.xml
new file mode 100644
index 0000000..045108c
--- /dev/null
+++ b/app/src/main/res/layout/activity_error.xml
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
index d7a4dcd..be35cd3 100644
--- a/app/src/main/res/values-fr/strings.xml
+++ b/app/src/main/res/values-fr/strings.xml
@@ -39,5 +39,12 @@
Modifier l\'objectif
Modifier le but journalier
Vous avez décliné une permission, vous ne pouvez pas utiliser cette extension suaf si vous réactivez la permission manuellement
+ Pas
+
+ Une Erreur est survenu lors de l\'utilisation de l\'application
+ Merci d\'envoyer le rapport d\'erreur afin que nous puissions améliorer votre experience
+ Envoyer par Email
+ Envoyer depuis Github
+ Quitter
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 0e41f7a..f7d289e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -51,4 +51,12 @@
You declined a permission, you can\'t use this extension unless you enable it manually
Modifiy daily goal
Steps
+
+
+
+ An Error Occurred in the application forcing it to close down
+ Please report it so we can enhance you\'re Android OpenHealth experience
+ Report on Github
+ Report via Email
+ Quit