Model recoverable receiver and radio output lifecycle failures

This commit is contained in:
evgeny committed 2026-10-29 13:34:23 +01:00
1 parent 7780922353
commit 982ed0ca7d
2 files changed
+29 -5

No files matched your search

@@ -38,8 +38,21 @@ class Context {
var telephonyManager: TelephonyManager? = TelephonyManager()
val configProvider = HostConfigProvider()
val receivers = mutableMapOf<BroadcastReceiver, IntentFilter>()
fun registerReceiver(receiver: BroadcastReceiver, filter: IntentFilter, flags: Int = 0) { receivers[receiver] = filter }
fun unregisterReceiver(receiver: BroadcastReceiver) { check(receivers.remove(receiver) != null) { "receiver not registered" } }
var receiverFailures = emptySet<String>()
var registrationAttempts = 0
var unregistrationAttempts = 0
fun registerReceiver(receiver: BroadcastReceiver, filter: IntentFilter, flags: Int = 0) {
registrationAttempts++
check("register" !in receiverFailures) { "receiver registration failed" }
receivers[receiver] = filter
check("register after" !in receiverFailures) { "receiver registration failed after effect" }
}
fun unregisterReceiver(receiver: BroadcastReceiver) {
unregistrationAttempts++
check("unregister" !in receiverFailures) { "receiver unregistration failed" }
require(receivers.remove(receiver) != null) { "receiver not registered" }
check("unregister after" !in receiverFailures) { "receiver unregistration failed after effect" }
}
val applicationContext: Context get() = this
fun startActivity(intent: Intent) {
activityAttempts.add(Intent(intent))
@@ -49,7 +62,7 @@ class Context {
AUDIO_SERVICE -> AudioManager.shared
SENSOR_SERVICE -> sensorManager
VIBRATOR_SERVICE -> vibrator
POWER_SERVICE -> powerManager
POWER_SERVICE -> { check(!failPowerService) { "power service lookup unavailable" }; powerManager }
WIFI_SERVICE -> { check(!failWifiService) { "Wi-Fi service unavailable" }; wifiManager }
else -> error("Unknown service: $name")
}
@@ -12,17 +12,28 @@ class AudioTrack(val id: Int) : AudioRouting {
const val MODE_STREAM = 1
private var nextId = 100
val created = mutableListOf<AudioTrack>()
fun getMinBufferSize(rate: Int, channels: Int, encoding: Int): Int = 1920
var nextFailures = emptySet<String>()
var minimumBuffer = 1920
fun getMinBufferSize(rate: Int, channels: Int, encoding: Int): Int = minimumBuffer
}
constructor(attributes: AudioAttributes, format: AudioFormat, bufferSize: Int, mode: Int, session: Int) : this(++nextId) {
check(mode == MODE_STREAM && bufferSize >= 1920 && session == AudioManager.AUDIO_SESSION_ID_GENERATE)
check("create" !in nextFailures) { "track creation failed" }
failures = nextFailures
created.add(this)
}
var playbackHeadPosition = 0
private set
fun play() { access("play") }
fun stop() { access("stop") }
fun release() { access("release"); released = true }
var releaseCalls = 0
private set
fun release() {
releaseCalls++
check("release" !in failures) { "track release failed" }
released = true
check("release after" !in failures) { "track release failed after effect" }
}
fun write(samples: ShortArray, offset: Int, count: Int): Int {
access("write")
check(offset >= 0 && offset + count <= samples.size)