feat(android): pure idle-revert decision for UPnP output
This commit is contained in:
+21
@@ -0,0 +1,21 @@
|
|||||||
|
package com.fabledsword.minstrel.player.output
|
||||||
|
|
||||||
|
/** Action the idle-revert collector should take on a player-state change. */
|
||||||
|
internal enum class IdleRevertAction { ARM, CANCEL, IGNORE }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pure decision for the UPnP idle-revert timer. [armed] is whether the
|
||||||
|
* idle timer Job is currently running. We ARM only on the transition INTO
|
||||||
|
* "engaged + not playing" (so repeated paused emissions don't reset the
|
||||||
|
* countdown), CANCEL whenever playback resumes or UPnP disengages, and
|
||||||
|
* otherwise IGNORE.
|
||||||
|
*/
|
||||||
|
internal fun idleRevertAction(
|
||||||
|
upnpEngaged: Boolean,
|
||||||
|
isPlaying: Boolean,
|
||||||
|
armed: Boolean,
|
||||||
|
): IdleRevertAction = when {
|
||||||
|
upnpEngaged && !isPlaying -> if (armed) IdleRevertAction.IGNORE else IdleRevertAction.ARM
|
||||||
|
armed -> IdleRevertAction.CANCEL
|
||||||
|
else -> IdleRevertAction.IGNORE
|
||||||
|
}
|
||||||
+55
@@ -0,0 +1,55 @@
|
|||||||
|
package com.fabledsword.minstrel.player.output
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class IdleRevertDecisionTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `engaged and paused and not armed arms the timer`() {
|
||||||
|
assertEquals(
|
||||||
|
IdleRevertAction.ARM,
|
||||||
|
idleRevertAction(upnpEngaged = true, isPlaying = false, armed = false),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `engaged and paused and already armed is ignored`() {
|
||||||
|
assertEquals(
|
||||||
|
IdleRevertAction.IGNORE,
|
||||||
|
idleRevertAction(upnpEngaged = true, isPlaying = false, armed = true),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `resuming playback cancels an armed timer`() {
|
||||||
|
assertEquals(
|
||||||
|
IdleRevertAction.CANCEL,
|
||||||
|
idleRevertAction(upnpEngaged = true, isPlaying = true, armed = true),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `playing with no timer armed is ignored`() {
|
||||||
|
assertEquals(
|
||||||
|
IdleRevertAction.IGNORE,
|
||||||
|
idleRevertAction(upnpEngaged = true, isPlaying = true, armed = false),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `disengaging UPnP cancels an armed timer`() {
|
||||||
|
assertEquals(
|
||||||
|
IdleRevertAction.CANCEL,
|
||||||
|
idleRevertAction(upnpEngaged = false, isPlaying = false, armed = true),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `disengaged with no timer armed is ignored`() {
|
||||||
|
assertEquals(
|
||||||
|
IdleRevertAction.IGNORE,
|
||||||
|
idleRevertAction(upnpEngaged = false, isPlaying = true, armed = false),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user