enhance: Load GlobalExceptionHandler before Crashlytics

This commit is contained in:
Ahmad Ansori Palembani 2024-06-06 06:49:26 +07:00
parent ad6c0cc358
commit d60b66ac9f
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
6 changed files with 73 additions and 19 deletions

View file

@ -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

View file

@ -243,6 +243,13 @@
android:exported="true"
android:permission="android.permission.INTERACT_ACROSS_USERS_FULL" />
<!-- Loading global exception handler before crashlytics (order: 100) -->
<provider
android:name="eu.kanade.tachiyomi.AppProvider"
android:authorities="${applicationId}.yokai"
android:exported="false"
android:initOrder="101" />
<meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
android:value="false" />
<meta-data android:name="android.webkit.WebView.MetricsOptOut"

View file

@ -20,4 +20,6 @@ class BasePreferences(private val preferenceStore: PreferenceStore) {
fun displayProfile() = preferenceStore.getString("pref_display_profile_key", "")
fun hasShownOnboarding() = preferenceStore.getBoolean(Preference.appStateKey("onboarding_complete"), false)
fun crashReport() = preferenceStore.getBoolean("pref_crash_report", true)
}

View file

@ -31,6 +31,8 @@ import coil3.request.allowHardware
import coil3.request.allowRgb565
import coil3.request.crossfade
import coil3.util.DebugLogger
import com.google.firebase.crashlytics.ktx.crashlytics
import com.google.firebase.ktx.Firebase
import eu.kanade.tachiyomi.appwidget.TachiyomiWidgetManager
import eu.kanade.tachiyomi.data.coil.BufferedSourceFetcher
import eu.kanade.tachiyomi.data.coil.CoilDiskCache
@ -42,6 +44,7 @@ import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import dev.yokai.core.di.AppModule
import dev.yokai.core.di.DomainModule
import dev.yokai.core.di.PreferenceModule
import dev.yokai.domain.base.BasePreferences
import eu.kanade.tachiyomi.network.NetworkHelper
import eu.kanade.tachiyomi.ui.crash.CrashActivity
import eu.kanade.tachiyomi.ui.crash.GlobalExceptionHandler
@ -66,6 +69,7 @@ import java.security.Security
open class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.Factory {
val preferences: PreferencesHelper by injectLazy()
val basePreferences: BasePreferences by injectLazy()
private val disableIncognitoReceiver = DisableIncognitoReceiver()
@ -73,8 +77,6 @@ open class App : Application(), DefaultLifecycleObserver, SingletonImageLoader.F
override fun onCreate() {
super<Application>.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)

View file

@ -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<out String>?,
selection: String?,
selectionArgs: Array<out String>?,
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<out String>?): Int = 0
override fun update(uri: Uri, values: ContentValues?, selection: String?, selectionArgs: Array<out String>?): Int = 0
}

View file

@ -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)