package world.respect import android.app.Application import android.content.Context import android.os.Build import coil3.ImageLoader import coil3.PlatformContext import coil3.SingletonImageLoader import coil3.network.okhttp.OkHttpNetworkFetcherFactory import coil3.request.crossfade import io.github.aakira.napier.DebugAntilog import io.github.aakira.napier.Napier import okhttp3.OkHttpClient import org.acra.config.httpSender import org.acra.data.StringFormat import org.acra.ktx.initAcra import org.acra.security.TLS import org.acra.sender.HttpSender import org.koin.android.ext.android.get import org.koin.android.ext.koin.androidContext import org.koin.core.context.startKoin import world.respect.app.BuildConfig class RespectApp : Application(), SingletonImageLoader.Factory { override fun onCreate() { super.onCreate() Napier.base(DebugAntilog()) //See https://stackoverflow.com/questions/23844667/how-do-i-detect-if-i-am-in-release-or-debug-mode /* uncomment if needed for web content debugging if(applicationInfo.flags.and(FLAG_DEBUGGABLE) == FLAG_DEBUGGABLE) { //Debugging enabled in webview is false by default. Have seen crash reports caused by // this line; which is not needed in release. WebView.setWebContentsDebuggingEnabled(true) } */ startKoin { androidContext(this@RespectApp) modules(appKoinModule) } } override fun attachBaseContext(base: Context) { super.attachBaseContext(base) if(BuildConfig.ACRA_URI.isNotEmpty()) { initAcra { reportFormat = StringFormat.JSON httpSender { uri = BuildConfig.ACRA_URI basicAuthLogin = BuildConfig.ACRA_BASICAUTHLOGIN.trim() basicAuthPassword = BuildConfig.ACRA_BASICAUTHPASSWORD.trim() httpMethod = HttpSender.Method.POST /* As per https://github.com/ACRA/acra/issues/1458 ACRA may attmept to use * obsolete protocols which will cause a crash when sending a crash log. */ tlsProtocols = if(Build.VERSION.SDK_INT >= 29) { //Android 10 and higher TLS1.3 is enabled by default listOf(TLS.V1_2, TLS.V1_3) } else { listOf(TLS.V1_2) } } } } } override fun newImageLoader(context: PlatformContext): ImageLoader { val okHttpClient: OkHttpClient = get() return ImageLoader.Builder(applicationContext) .components { //As per https://coil-kt.github.io/coil/network/#using-a-custom-okhttpclient add(OkHttpNetworkFetcherFactory(callFactory = { okHttpClient } )) } .crossfade(true) .build() } }