fix: move BootCompletedReceiver disk read off the main thread

isEnabled() reads plain SharedPreferences (a synchronous disk read, by
design) and scans the accounts cache. Since onReceive runs on the main
thread, this triggered a StrictMode DiskReadViolation at boot. Wrap the
work in goAsync() + a background thread so it runs off the main thread
while keeping the receiver alive until the check completes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P4tx1QSE27uoDpnxZZ7msT
This commit is contained in:
Claude
2026-07-18 14:39:03 +00:00
parent 4e53f26b38
commit 20e86b8998
@@ -50,11 +50,23 @@ class BootCompletedReceiver : BroadcastReceiver() {
"android.intent.action.QUICKBOOT_POWERON",
Intent.ACTION_MY_PACKAGE_REPLACED,
-> {
Log.d(TAG) { "Received ${intent.action}, checking if notification service should start" }
if (NotificationRelayService.isEnabled(context)) {
Log.d(TAG, "Starting notification relay service")
NotificationRelayService.start(context)
}
// isEnabled() reads plain SharedPreferences (a synchronous disk read, by
// design — see LocalPreferences.globalSettingsPrefs) and scans the accounts
// cache. onReceive runs on the main thread, so hop off it via goAsync() to
// avoid a StrictMode DiskReadViolation while keeping the receiver alive until
// the work finishes.
val pending = goAsync()
Thread {
try {
Log.d(TAG) { "Received ${intent.action}, checking if notification service should start" }
if (NotificationRelayService.isEnabled(context)) {
Log.d(TAG, "Starting notification relay service")
NotificationRelayService.start(context)
}
} finally {
pending.finish()
}
}.start()
}
}
}