54 lines
1.9 KiB
Kotlin
54 lines
1.9 KiB
Kotlin
|
package co.electriccoin.zcash.crash.android
|
||
|
|
||
|
import android.content.Context
|
||
|
import androidx.annotation.AnyThread
|
||
|
import androidx.annotation.MainThread
|
||
|
import co.electriccoin.zcash.crash.ReportableException
|
||
|
import co.electriccoin.zcash.crash.android.internal.AndroidExceptionReporter
|
||
|
import co.electriccoin.zcash.crash.android.internal.AndroidUncaughtExceptionHandler
|
||
|
import co.electriccoin.zcash.crash.android.internal.new
|
||
|
import co.electriccoin.zcash.spackle.Twig
|
||
|
import kotlinx.coroutines.CoroutineScope
|
||
|
import kotlinx.coroutines.Dispatchers
|
||
|
import kotlinx.coroutines.SupervisorJob
|
||
|
import kotlinx.coroutines.launch
|
||
|
|
||
|
object CrashReporter {
|
||
|
|
||
|
private val crashReportingScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
||
|
|
||
|
@Volatile
|
||
|
private var applicationContext: Context? = null
|
||
|
|
||
|
/**
|
||
|
* Call to register detection of uncaught exceptions.
|
||
|
*
|
||
|
* This must should only be called once for the entire lifetime of an application's process.
|
||
|
*/
|
||
|
@MainThread
|
||
|
fun register(context: Context) {
|
||
|
AndroidUncaughtExceptionHandler.register(context)
|
||
|
|
||
|
applicationContext = context.applicationContext
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Report a caught exception, e.g. within a try-catch.
|
||
|
*
|
||
|
* Be sure to call [register] before calling this method.
|
||
|
*/
|
||
|
@AnyThread
|
||
|
fun reportCaughtException(exception: Throwable) {
|
||
|
// This method relies on a global Context reference, because often Context is not available
|
||
|
// in various places where we'd like to capture an exception from a try-catch.
|
||
|
|
||
|
applicationContext?.let {
|
||
|
crashReportingScope.launch {
|
||
|
AndroidExceptionReporter.reportException(it, ReportableException.new(it, exception, false))
|
||
|
}
|
||
|
} ?: run {
|
||
|
Twig.warn { "Unable to log exception; Call `register(Context)` prior to reportCaughtException(Throwable)" }
|
||
|
}
|
||
|
}
|
||
|
}
|