diff --git a/CHANGELOG.md b/CHANGELOG.md
index cfe3d4f189..f627dd82b7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,5 +7,8 @@
## Other
-->
+## Changes
+- Crash report can now actually be disabled
+
## Other
-- Some more NullPointerException prevention that I missed
+- Loading GlobalExceptionHandler before Crashlytics
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 5aef0af295..7b756a93ad 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -243,6 +243,13 @@
android:exported="true"
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
+
+
+
.onCreate()
- GlobalExceptionHandler.initialize(applicationContext, CrashActivity::class.java)
-
if (BuildConfig.DEBUG) Timber.plant(Timber.DebugTree())
// TLS 1.3 support for Android 10 and below
@@ -94,6 +96,16 @@ open class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.F
importModule(DomainModule())
}
+ basePreferences.crashReport().changes()
+ .onEach {
+ try {
+ Firebase.crashlytics.setCrashlyticsCollectionEnabled(it)
+ } catch (e: Exception) {
+ // Probably already enabled/disabled
+ }
+ }
+ .launchIn(ProcessLifecycleOwner.get().lifecycleScope)
+
setupNotificationChannels()
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
diff --git a/app/src/main/java/eu/kanade/tachiyomi/AppProvider.kt b/app/src/main/java/eu/kanade/tachiyomi/AppProvider.kt
new file mode 100644
index 0000000000..6ece48f5a8
--- /dev/null
+++ b/app/src/main/java/eu/kanade/tachiyomi/AppProvider.kt
@@ -0,0 +1,34 @@
+package eu.kanade.tachiyomi
+
+import android.content.ContentProvider
+import android.content.ContentValues
+import android.database.Cursor
+import android.net.Uri
+import eu.kanade.tachiyomi.ui.crash.CrashActivity
+import eu.kanade.tachiyomi.ui.crash.GlobalExceptionHandler
+
+class AppProvider : ContentProvider() {
+ override fun onCreate(): Boolean {
+ context?.let {
+ GlobalExceptionHandler.initialize(it, CrashActivity::class.java)
+ return true
+ }
+ return false
+ }
+
+ override fun query(
+ uri: Uri,
+ projection: Array?,
+ selection: String?,
+ selectionArgs: Array?,
+ sortOrder: String?,
+ ): Cursor? = null
+
+ override fun getType(uri: Uri): String? = null
+
+ override fun insert(uri: Uri, values: ContentValues?): Uri? = null
+
+ override fun delete(uri: Uri, selection: String?, selectionArgs: Array?): Int = 0
+
+ override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array?): Int = 0
+}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsAdvancedController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsAdvancedController.kt
index f444518fea..38a6adadd7 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsAdvancedController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/controllers/SettingsAdvancedController.kt
@@ -15,7 +15,6 @@ import androidx.core.net.toUri
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceScreen
import com.google.firebase.crashlytics.ktx.crashlytics
-import com.google.firebase.ktx.Firebase
import com.hippo.unifile.UniFile
import dev.yokai.domain.base.BasePreferences.ExtensionInstaller
import dev.yokai.domain.extension.interactor.TrustExtension
@@ -105,17 +104,9 @@ class SettingsAdvancedController : SettingsLegacyController() {
titleRes = R.string.advanced
switchPreference {
- key = "acra.enable"
+ bindTo(basePreferences.crashReport())
titleRes = R.string.send_crash_report
summaryRes = R.string.helps_fix_bugs
- defaultValue = true
- onChange {
- try {
- Firebase.crashlytics.setCrashlyticsCollectionEnabled(it as Boolean)
- } catch (_: Exception) {
- }
- true
- }
}
preference {
@@ -436,13 +427,18 @@ class SettingsAdvancedController : SettingsLegacyController() {
}
}
- if (BuildConfig.DEBUG)
- preference {
- title = "Crash the app!"
- onClick {
- throw RuntimeException("Fell into the void")
- }
+ preference {
+ title = "Crash the app!"
+ summary = "To test crashes"
+ onClick {
+ activity!!.materialAlertDialog()
+ .setTitle(R.string.warning)
+ .setMessage("I told you this would crash the app, why would you want that?")
+ .setPositiveButton("Crash it anyway") { _, _ -> throw RuntimeException("Fell into the void") }
+ .setNegativeButton("Nevermind", null)
+ .show()
}
+ }
}
@OptIn(DelicateCoroutinesApi::class)