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)