Made universal media player cache active player

Revised universal media player to cache the active player when updating
the state when any of the children change. Revised tests to accommodate
this change.
This commit is contained in:
Ryan Kraus 2016-01-12 01:34:25 -05:00 committed by Paulus Schoutsen
parent 85d732a45a
commit a8d5b0e5ec
2 changed files with 38 additions and 3 deletions

View File

@ -144,6 +144,7 @@ class UniversalMediaPlayer(MediaPlayerDevice):
self._children = children
self._cmds = commands
self._attrs = attributes
self._child_state = None
track_state_change(hass, self.dependencies, self.update_state)
@ -207,13 +208,19 @@ class UniversalMediaPlayer(MediaPlayerDevice):
else:
return None
@property
def active_child_state(self):
def _cache_active_child_state(self):
""" The state of the active child or None """
for child_name in self._children:
child_state = self.hass.states.get(child_name)
if child_state and child_state.state not in OFF_STATES:
return child_state
self._child_state = child_state
return
self._child_state = None
@property
def active_child_state(self):
""" the state of the active child or none """
return self._child_state
@property
def name(self):
@ -420,4 +427,5 @@ class UniversalMediaPlayer(MediaPlayerDevice):
def update_state(self, *_):
""" event to trigger a state update in HA """
self._cache_active_child_state()
self.update_ha_state()

View File

@ -190,21 +190,26 @@ class TestMediaPlayer(unittest.TestCase):
universal.validate_config(config)
ump = universal.UniversalMediaPlayer(self.hass, **config)
ump.entity_id = media_player.ENTITY_ID_FORMAT.format(config['name'])
ump.update_state()
self.assertEqual(None, ump.active_child_state)
self.mock_mp_1._state = STATE_PLAYING
self.mock_mp_1.update_ha_state()
ump.update_state()
self.assertEqual(self.mock_mp_1.entity_id,
ump.active_child_state.entity_id)
self.mock_mp_2._state = STATE_PLAYING
self.mock_mp_2.update_ha_state()
ump.update_state()
self.assertEqual(self.mock_mp_1.entity_id,
ump.active_child_state.entity_id)
self.mock_mp_1._state = STATE_OFF
self.mock_mp_1.update_ha_state()
ump.update_state()
self.assertEqual(self.mock_mp_2.entity_id,
ump.active_child_state.entity_id)
@ -223,11 +228,14 @@ class TestMediaPlayer(unittest.TestCase):
universal.validate_config(config)
ump = universal.UniversalMediaPlayer(self.hass, **config)
ump.entity_id = media_player.ENTITY_ID_FORMAT.format(config['name'])
ump.update_state()
self.assertTrue(ump.state, STATE_OFF)
self.mock_mp_1._state = STATE_PLAYING
self.mock_mp_1.update_ha_state()
ump.update_state()
self.assertEqual(STATE_PLAYING, ump.state)
def test_state_with_children_and_attrs(self):
@ -236,17 +244,22 @@ class TestMediaPlayer(unittest.TestCase):
universal.validate_config(config)
ump = universal.UniversalMediaPlayer(self.hass, **config)
ump.entity_id = media_player.ENTITY_ID_FORMAT.format(config['name'])
ump.update_state()
self.assertEqual(ump.state, STATE_OFF)
self.hass.states.set(self.mock_state_switch_id, STATE_ON)
ump.update_state()
self.assertEqual(ump.state, STATE_ON)
self.mock_mp_1._state = STATE_PLAYING
self.mock_mp_1.update_ha_state()
ump.update_state()
self.assertEqual(ump.state, STATE_PLAYING)
self.hass.states.set(self.mock_state_switch_id, STATE_OFF)
ump.update_state()
self.assertEqual(ump.state, STATE_OFF)
def test_volume_level(self):
@ -255,15 +268,19 @@ class TestMediaPlayer(unittest.TestCase):
universal.validate_config(config)
ump = universal.UniversalMediaPlayer(self.hass, **config)
ump.entity_id = media_player.ENTITY_ID_FORMAT.format(config['name'])
ump.update_state()
self.assertEqual(None, ump.volume_level)
self.mock_mp_1._state = STATE_PLAYING
self.mock_mp_1.update_ha_state()
ump.update_state()
self.assertEqual(0, ump.volume_level)
self.mock_mp_1._volume_level = 1
self.mock_mp_1.update_ha_state()
ump.update_state()
self.assertEqual(1, ump.volume_level)
def test_is_volume_muted_children_only(self):
@ -272,15 +289,19 @@ class TestMediaPlayer(unittest.TestCase):
universal.validate_config(config)
ump = universal.UniversalMediaPlayer(self.hass, **config)
ump.entity_id = media_player.ENTITY_ID_FORMAT.format(config['name'])
ump.update_state()
self.assertFalse(ump.is_volume_muted)
self.mock_mp_1._state = STATE_PLAYING
self.mock_mp_1.update_ha_state()
ump.update_state()
self.assertFalse(ump.is_volume_muted)
self.mock_mp_1._is_volume_muted = True
self.mock_mp_1.update_ha_state()
ump.update_state()
self.assertTrue(ump.is_volume_muted)
def test_is_volume_muted_children_and_attr(self):
@ -301,12 +322,15 @@ class TestMediaPlayer(unittest.TestCase):
universal.validate_config(config)
ump = universal.UniversalMediaPlayer(self.hass, **config)
ump.entity_id = media_player.ENTITY_ID_FORMAT.format(config['name'])
ump.update_state()
self.assertEqual(0, ump.supported_media_commands)
self.mock_mp_1._supported_media_commands = 512
self.mock_mp_1._state = STATE_PLAYING
self.mock_mp_1.update_ha_state()
ump.update_state()
self.assertEqual(512, ump.supported_media_commands)
def test_supported_media_commands_children_and_cmds(self):
@ -320,11 +344,14 @@ class TestMediaPlayer(unittest.TestCase):
config['commands']['volume_mute'] = 'test'
ump = universal.UniversalMediaPlayer(self.hass, **config)
ump.entity_id = media_player.ENTITY_ID_FORMAT.format(config['name'])
ump.update_state()
self.mock_mp_1._supported_media_commands = \
universal.SUPPORT_VOLUME_SET
self.mock_mp_1._state = STATE_PLAYING
self.mock_mp_1.update_ha_state()
ump.update_state()
check_flags = universal.SUPPORT_TURN_ON | universal.SUPPORT_TURN_OFF \
| universal.SUPPORT_VOLUME_STEP | universal.SUPPORT_VOLUME_MUTE