package com.github.damontecres.wholphin import android.app.Application import android.os.Build import android.os.StrictMode import android.os.StrictMode.ThreadPolicy 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 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) { StrictMode.setThreadPolicy( ThreadPolicy .Builder() .detectNetwork() .penaltyLog() .build(), ) } 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() 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 } }