package org.terst.nav import android.app.Application import com.google.firebase.crashlytics.FirebaseCrashlytics import java.io.File import java.io.PrintWriter import java.io.StringWriter import java.text.SimpleDateFormat import java.util.Date import java.util.Locale class NavApplication : Application() { companion object { var isTesting: Boolean = false } override fun onCreate() { super.onCreate() FirebaseCrashlytics.getInstance().sendUnsentReports() installCrashLogger() } private fun installCrashLogger() { val default = Thread.getDefaultUncaughtExceptionHandler() Thread.setDefaultUncaughtExceptionHandler { thread, throwable -> try { writeCrashLog(thread, throwable) } catch (_: Exception) { // never suppress the original crash } default?.uncaughtException(thread, throwable) } } private fun writeCrashLog(thread: Thread, throwable: Throwable) { val sw = StringWriter() throwable.printStackTrace(PrintWriter(sw)) val timestamp = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.US).format(Date()) val body = buildString { appendLine("=== Nav Crash Log ===") appendLine("Time : $timestamp") appendLine("Thread : ${thread.name}") appendLine("Device : ${android.os.Build.MODEL} (API ${android.os.Build.VERSION.SDK_INT})") appendLine() append(sw) } // Try external storage first (readable without root) val dir = getExternalFilesDir(null) ?: filesDir val file = File(dir, "crash_${timestamp}.txt") file.writeText(body) // Also overwrite a fixed-name "latest" file for easy access File(dir, "crash_latest.txt").writeText(body) } }