diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/android/media/HostAlerts.kt b/tools/chatgui-android/router-tests/src/main/kotlin/android/media/HostAlerts.kt index fb6a20f1..e20a64c2 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/android/media/HostAlerts.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/android/media/HostAlerts.kt @@ -35,7 +35,7 @@ class AudioFocusRequest private constructor(val attributes: AudioAttributes?, va } /** Управляемые lifecycle failures; callbacks намеренно сохраняются после release для теста запоздалой доставки. */ -class MediaPlayer private constructor(val resourceId: Int, val effectiveAttributes: AudioAttributes, private val failures: Set) { +class MediaPlayer private constructor(val resourceId: Int, val effectiveAttributes: AudioAttributes, var failures: Set) { companion object { val created = mutableListOf() var nextFailures = emptySet() @@ -52,6 +52,8 @@ class MediaPlayer private constructor(val resourceId: Int, val effectiveAttribut } var released = false private set + var playing = false + private set var startCalls = 0 private set var releaseCalls = 0 @@ -70,12 +72,14 @@ class MediaPlayer private constructor(val resourceId: Int, val effectiveAttribut fun setAudioAttributes(attributes: AudioAttributes) { fail("attributes") } fun setOnCompletionListener(listener: (MediaPlayer) -> Unit) { fail("completion listener"); completion = listener } fun setOnErrorListener(listener: (MediaPlayer, Int, Int) -> Boolean) { fail("error listener"); error = listener } - fun start() { startCalls++; fail("start") } + fun start() { startCalls++; fail("start"); playing = true; fail("start after") } fun stop() { fail("stop") } fun release() { releaseCalls++ - fail("release") + check("release" !in failures) { "release failed" } released = true + playing = false + check("release after" !in failures) { "release failed after effect" } } fun complete() { completion?.invoke(this) } fun playbackError(what: Int = 100, extra: Int = -1004): Boolean { @@ -85,15 +89,23 @@ class MediaPlayer private constructor(val resourceId: Int, val effectiveAttribut } } -class Ringtone internal constructor(private val failures: Set) { +class Ringtone internal constructor(var failures: Set) { var audioAttributes: AudioAttributes? = null set(value) { check("attributes" !in failures) { "ringtone attributes failed" }; field = value } var isLooping = false set(value) { check("loop" !in failures) { "ringtone loop failed" }; field = value } var playCalls = 0 var stopCalls = 0 - fun play() { playCalls++; check("play" !in failures) { "ringtone play failed" } } - fun stop() { stopCalls++; check("stop" !in failures) { "ringtone stop failed" } } + var playing = false + private set + fun play() { + playCalls++; check("play" !in failures) { "ringtone play failed" } + playing = true; check("play after" !in failures) { "ringtone play failed after effect" } + } + fun stop() { + stopCalls++; check("stop" !in failures) { "ringtone stop failed" } + playing = false; check("stop after" !in failures) { "ringtone stop failed after effect" } + } } object RingtoneManager { diff --git a/tools/chatgui-android/router-tests/src/main/kotlin/android/media/HostAudio.kt b/tools/chatgui-android/router-tests/src/main/kotlin/android/media/HostAudio.kt index a4ff236c..81d4e3d6 100644 --- a/tools/chatgui-android/router-tests/src/main/kotlin/android/media/HostAudio.kt +++ b/tools/chatgui-android/router-tests/src/main/kotlin/android/media/HostAudio.kt @@ -35,17 +35,24 @@ class AudioManager { var focusResult = AUDIOFOCUS_REQUEST_GRANTED var abandonResult = AUDIOFOCUS_REQUEST_GRANTED var failFocus = false + var failFocusAfter = false var failAbandon = false + var failAbandonAfter = false val focusHistory = mutableListOf() val abandoned = mutableListOf() + val focusOwners = mutableSetOf() fun requestAudioFocus(request: AudioFocusRequest): Int { focusHistory.add(request) check(!failFocus) { "focus unavailable" } + if (focusResult == AUDIOFOCUS_REQUEST_GRANTED) focusOwners.add(request) + check(!failFocusAfter) { "focus failed after effect" } return focusResult } fun abandonAudioFocusRequest(request: AudioFocusRequest): Int { abandoned.add(request) check(!failAbandon) { "abandon unavailable" } + if (abandonResult == AUDIOFOCUS_REQUEST_GRANTED) focusOwners.remove(request) + check(!failAbandonAfter) { "abandon failed after effect" } return abandonResult } val operations = mutableListOf()