kiosk: report ALL crashes via ErrorReporter

- onRenderProcessGone: WebView renderer crash/OOM kill now reported
  and Activity is recreated automatically (no more silent crash)
- onReceivedHttpError: HTTP 5xx from server now reported
- onLowMemory: system low-memory event reported
- onTrimMemory: moderate+ memory trim events reported

Every error path in the kiosk now sends an auto-report issue.
This commit is contained in:
dadaloop82
2026-05-08 11:27:28 +00:00
parent 336d9091be
commit 96d3514c38
@@ -23,16 +23,20 @@ import android.view.View
import android.view.WindowInsets import android.view.WindowInsets
import android.view.WindowInsetsController import android.view.WindowInsetsController
import android.view.WindowManager import android.view.WindowManager
import android.content.ComponentCallbacks2
import android.webkit.ConsoleMessage import android.webkit.ConsoleMessage
import android.webkit.JavascriptInterface import android.webkit.JavascriptInterface
import android.webkit.PermissionRequest import android.webkit.PermissionRequest
import android.webkit.RenderProcessGoneDetail
import android.webkit.SslErrorHandler import android.webkit.SslErrorHandler
import android.webkit.ValueCallback import android.webkit.ValueCallback
import android.webkit.WebChromeClient import android.webkit.WebChromeClient
import android.webkit.WebResourceError import android.webkit.WebResourceError
import android.webkit.WebResourceRequest import android.webkit.WebResourceRequest
import android.webkit.WebResourceResponse
import android.webkit.WebView import android.webkit.WebView
import android.webkit.WebViewClient import android.webkit.WebViewClient
import androidx.annotation.RequiresApi
import android.widget.ImageButton import android.widget.ImageButton
import android.widget.LinearLayout import android.widget.LinearLayout
import android.widget.ProgressBar import android.widget.ProgressBar
@@ -334,6 +338,40 @@ class KioskActivity : AppCompatActivity() {
view?.loadData(errorPageHtml(), "text/html", "UTF-8") view?.loadData(errorPageHtml(), "text/html", "UTF-8")
} }
} }
override fun onReceivedHttpError(
view: WebView?,
request: WebResourceRequest?,
errorResponse: WebResourceResponse?
) {
val code = errorResponse?.statusCode ?: 0
val url = request?.url?.toString() ?: ""
if (code >= 500) {
ErrorReporter.reportMessage(
type = "webview-http-error",
message = "Server returned HTTP $code",
extra = mapOf("url" to url, "status" to code,
"main_frame" to (request?.isForMainFrame == true))
)
if (request?.isForMainFrame == true) {
view?.loadData(errorPageHtml(), "text/html", "UTF-8")
}
}
}
@RequiresApi(Build.VERSION_CODES.O)
override fun onRenderProcessGone(view: WebView?, detail: RenderProcessGoneDetail?): Boolean {
val crashed = detail?.didCrash() ?: true
val priority = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
detail?.rendererPriorityAtExit() ?: -1 else -1
ErrorReporter.reportMessage(
type = if (crashed) "renderer-crashed" else "renderer-killed-oom",
message = "WebView renderer process ${if (crashed) "crashed" else "killed by system (OOM)"}",
extra = mapOf("priority" to priority),
forceReport = true
)
// Give the reporter 600 ms to queue the POST, then restart the Activity cleanly
Handler(Looper.getMainLooper()).postDelayed({ recreate() }, 600)
return true // we handled it — do NOT let the system kill the Activity immediately
}
override fun onPageFinished(view: WebView?, url: String?) { override fun onPageFinished(view: WebView?, url: String?) {
super.onPageFinished(view, url) super.onPageFinished(view, url)
injectKioskOverlay() injectKioskOverlay()
@@ -972,6 +1010,35 @@ class KioskActivity : AppCompatActivity() {
} }
} }
override fun onLowMemory() {
super.onLowMemory()
ErrorReporter.reportMessage(
type = "low-memory",
message = "Device reported onLowMemory — risk of OOM renderer kill"
)
}
override fun onTrimMemory(level: Int) {
super.onTrimMemory(level)
if (level >= ComponentCallbacks2.TRIM_MEMORY_MODERATE) {
val label = when (level) {
ComponentCallbacks2.TRIM_MEMORY_MODERATE -> "MODERATE"
ComponentCallbacks2.TRIM_MEMORY_COMPLETE -> "COMPLETE"
ComponentCallbacks2.TRIM_MEMORY_BACKGROUND -> "BACKGROUND"
ComponentCallbacks2.TRIM_MEMORY_UI_HIDDEN -> "UI_HIDDEN"
ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE -> "RUNNING_MODERATE"
ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW -> "RUNNING_LOW"
ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL -> "RUNNING_CRITICAL"
else -> "LEVEL_$level"
}
ErrorReporter.reportMessage(
type = "trim-memory",
message = "System memory trim: $label (level $level)",
extra = mapOf("level" to level, "label" to label)
)
}
}
override fun onDestroy() { override fun onDestroy() {
tts?.stop() tts?.stop()
tts?.shutdown() tts?.shutdown()