mirror of
https://github.com/JustinZeus/Wholphin.git
synced 2026-07-08 23:51:21 +02:00
## Description - Catch network exceptions when querying to populate the nav drawer - Perform screensaver work on IO thread - Fix possible crash if screensaver service runs while regular activity is destroyed - Fix genre images & backdrop images not loading This PR also adds an Jellyfin SDK `ApiClient` wrapper to push all network calls onto the IO thread. And tries to use a more strict network-on-main policy for debug builds. ### Related issues Fixes #994 Fixes #1001 Should fix #1003 ### Testing Emulator with simulated exception throws ## Screenshots N/A ## AI or LLM usage None
124 lines
3.9 KiB
Kotlin
124 lines
3.9 KiB
Kotlin
package com.github.damontecres.wholphin
|
|
|
|
import android.app.Application
|
|
import android.os.Build
|
|
import android.os.StrictMode
|
|
import android.util.Log
|
|
import androidx.compose.runtime.Composer
|
|
import androidx.compose.runtime.ExperimentalComposeRuntimeApi
|
|
import androidx.hilt.work.HiltWorkerFactory
|
|
import androidx.work.Configuration
|
|
import dagger.hilt.android.HiltAndroidApp
|
|
import okhttp3.OkHttp
|
|
import org.acra.ACRA
|
|
import org.acra.ReportField
|
|
import org.acra.config.dialog
|
|
import org.acra.data.StringFormat
|
|
import org.acra.ktx.initAcra
|
|
import timber.log.Timber
|
|
import javax.inject.Inject
|
|
|
|
@OptIn(ExperimentalComposeRuntimeApi::class)
|
|
@HiltAndroidApp
|
|
class WholphinApplication :
|
|
Application(),
|
|
Configuration.Provider {
|
|
init {
|
|
instance = this
|
|
|
|
if (BuildConfig.DEBUG) {
|
|
Timber.plant(Timber.DebugTree())
|
|
} else {
|
|
Timber.plant(
|
|
object : Timber.Tree() {
|
|
override fun isLoggable(
|
|
tag: String?,
|
|
priority: Int,
|
|
): Boolean = priority >= Log.INFO
|
|
|
|
override fun log(
|
|
priority: Int,
|
|
tag: String?,
|
|
message: String,
|
|
t: Throwable?,
|
|
) {
|
|
Log.println(priority, tag ?: "Wholphin", message)
|
|
}
|
|
},
|
|
)
|
|
}
|
|
|
|
Composer.setDiagnosticStackTraceEnabled(BuildConfig.DEBUG)
|
|
}
|
|
|
|
override fun onCreate() {
|
|
super.onCreate()
|
|
if (BuildConfig.DEBUG) {
|
|
StrictMode.setThreadPolicy(
|
|
StrictMode.ThreadPolicy
|
|
.Builder()
|
|
.detectNetwork()
|
|
.penaltyLog()
|
|
.penaltyDeathOnNetwork()
|
|
.build(),
|
|
)
|
|
StrictMode.setVmPolicy(
|
|
StrictMode.VmPolicy
|
|
.Builder()
|
|
.detectAll()
|
|
.penaltyLog()
|
|
.build(),
|
|
)
|
|
}
|
|
OkHttp.initialize(this)
|
|
initAcra {
|
|
buildConfigClass = BuildConfig::class.java
|
|
reportFormat = StringFormat.JSON
|
|
excludeMatchingSharedPreferencesKeys = listOf()
|
|
reportContent =
|
|
listOf(
|
|
ReportField.ANDROID_VERSION,
|
|
ReportField.APP_VERSION_CODE,
|
|
ReportField.APP_VERSION_NAME,
|
|
ReportField.BRAND,
|
|
// ReportField.BUILD_CONFIG,
|
|
// ReportField.BUILD,
|
|
ReportField.CUSTOM_DATA,
|
|
ReportField.LOGCAT,
|
|
ReportField.PHONE_MODEL,
|
|
ReportField.PRODUCT,
|
|
ReportField.REPORT_ID,
|
|
ReportField.SHARED_PREFERENCES,
|
|
ReportField.STACK_TRACE,
|
|
ReportField.USER_COMMENT,
|
|
ReportField.USER_CRASH_DATE,
|
|
)
|
|
dialog {
|
|
text =
|
|
"Wholphin has crashed! Would you like to attempt to " +
|
|
"send a crash report to your Jellyfin server?"
|
|
title = "Wholphin Crash Report"
|
|
positiveButtonText = "Send"
|
|
negativeButtonText = "Do not send"
|
|
}
|
|
reportSendFailureToast = "Crash report failed to send"
|
|
reportSendSuccessToast = "Sent crash report!"
|
|
}
|
|
ACRA.errorReporter.putCustomData("SDK_INT", Build.VERSION.SDK_INT.toString())
|
|
}
|
|
|
|
@Inject
|
|
lateinit var workerFactory: HiltWorkerFactory
|
|
|
|
override val workManagerConfiguration: Configuration
|
|
get() =
|
|
Configuration
|
|
.Builder()
|
|
.setWorkerFactory(workerFactory)
|
|
.build()
|
|
|
|
companion object {
|
|
lateinit var instance: WholphinApplication
|
|
private set
|
|
}
|
|
}
|