You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
iceraven-browser/app/src/main/java/org/mozilla/fenix/home/intent/CrashReporterIntentProcesso...

48 lines
2.3 KiB
Kotlin

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
package org.mozilla.fenix.home.intent
import android.content.Intent
import android.util.Log
import androidx.navigation.NavController
import mozilla.components.lib.crash.Crash
import mozilla.components.lib.crash.Crash.NativeCodeCrash
import mozilla.components.lib.crash.CrashReporter
import org.mozilla.fenix.components.AppStore
import org.mozilla.fenix.components.appstate.AppAction
/**
* Process the [Intent] from [CrashReporter] through which the app is informed about
* recoverable native crashes.
*/
class CrashReporterIntentProcessor(private val appStore: AppStore) : HomeIntentProcessor {
override fun process(intent: Intent, navController: NavController, out: Intent): Boolean {
return if (Crash.isCrashIntent(intent)) {
val crash = Crash.fromIntent(intent)
// If only a child process crashed we can handle this gracefully.
if ((crash as? NativeCodeCrash)?.isFatal == false) {
appStore.dispatch(AppAction.AddNonFatalCrash(crash))
} else {
// A fatal crash means the app's main process is affected.
// An UncaughtExceptionCrash refers to a [Throwable] that would otherwise crash the app
// but is intercepted to allow us to gather more info and crash more gracefully.
//
// In both cases the app is left in a bad state so the main process is killed
// but not before gathering more info about the crashes to form and persist a crash report and
// not before "CrashHandlerService" is started in a separate process to be able to
// show a dialog allowing users to send the crash report and maybe restart the app.
// Log that an unexpected crash was sent but avoid leaking potential sensitive information.
// We expect other types of crashes to be handled by "CrashHandlerService".
Log.e("CrashReporterProcessor", "Invalid crash to process: ${crash::class}")
}
true
} else {
false
}
}
}