Skip to content

Commit

Permalink
Merge 73c3fd5 into 4ab4f57
Browse files Browse the repository at this point in the history
  • Loading branch information
JeffLIrion committed Oct 21, 2020
2 parents 4ab4f57 + 73c3fd5 commit 716407e
Show file tree
Hide file tree
Showing 10 changed files with 75 additions and 12 deletions.
2 changes: 1 addition & 1 deletion androidtv/androidtv/androidtv_async.py
Expand Up @@ -173,7 +173,7 @@ async def running_apps(self):
A list of the running apps
"""
running_apps_response = await self._adb.shell(constants.CMD_ANDROIDTV_RUNNING_APPS)
running_apps_response = await self._adb.shell(constants.CMD_RUNNING_APPS_ANDROIDTV)

return self._running_apps(running_apps_response)

Expand Down
2 changes: 1 addition & 1 deletion androidtv/androidtv/androidtv_sync.py
Expand Up @@ -173,7 +173,7 @@ def running_apps(self):
A list of the running apps
"""
running_apps_response = self._adb.shell(constants.CMD_ANDROIDTV_RUNNING_APPS)
running_apps_response = self._adb.shell(constants.CMD_RUNNING_APPS_ANDROIDTV)

return self._running_apps(running_apps_response)

Expand Down
17 changes: 17 additions & 0 deletions androidtv/basetv/basetv.py
Expand Up @@ -359,6 +359,23 @@ def _current_app_media_session_state(self, media_session_state_response):

return current_app, media_session_state

@staticmethod
def _get_hdmi_input(hdmi_response):
"""Get the HDMI input from the output of :py:const:`androidtv.constants.CMD_HDMI_INPUT`.
Parameters
----------
hdmi_response : str, None
The output of :py:const:`androidtv.constants.CMD_HDMI_INPUT`
Returns
-------
str, None
The HDMI input, or ``None`` if it could not be determined
"""
return hdmi_response if hdmi_response else None

@staticmethod
def _is_volume_muted(stream_music):
"""Determine whether or not the volume is muted from the ``STREAM_MUSIC`` block from ``adb shell dumpsys audio``.
Expand Down
11 changes: 11 additions & 0 deletions androidtv/basetv/basetv_async.py
Expand Up @@ -254,6 +254,17 @@ async def current_app(self):

return self._current_app(current_app_response)

async def get_hdmi_input(self):
"""Get the HDMI input from the output of :py:const:`androidtv.constants.CMD_HDMI_INPUT`.
Returns
-------
str, None
The HDMI input, or ``None`` if it could not be determined
"""
return self._get_hdmi_input(await self._adb.shell(constants.CMD_HDMI_INPUT))

async def is_volume_muted(self):
"""Whether or not the volume is muted.
Expand Down
11 changes: 11 additions & 0 deletions androidtv/basetv/basetv_sync.py
Expand Up @@ -254,6 +254,17 @@ def current_app(self):

return self._current_app(current_app_response)

def get_hdmi_input(self):
"""Get the HDMI input from the output of :py:const:`androidtv.constants.CMD_HDMI_INPUT`.
Returns
-------
str, None
The HDMI input, or ``None`` if it could not be determined
"""
return self._get_hdmi_input(self._adb.shell(constants.CMD_HDMI_INPUT))

def is_volume_muted(self):
"""Whether or not the volume is muted.
Expand Down
19 changes: 11 additions & 8 deletions androidtv/constants.py
Expand Up @@ -34,6 +34,9 @@
#: Get the current app for a Google TV device
CMD_CURRENT_APP_GOOGLE_TV = "CURRENT_APP=$(dumpsys window windows | grep 'Window #1') && CURRENT_APP=${CURRENT_APP#*{* * } && CURRENT_APP=${CURRENT_APP%%/*} && echo $CURRENT_APP"

#: Get the HDMI input
CMD_HDMI_INPUT = "dumpsys activity starter | grep -o 'HDMIInputService\\/HW[0-9]' -m 1 | grep -o 'HW[0-9]'"

#: Launch an app if it is not already the current app
CMD_LAUNCH_APP = "CURRENT_APP=$(dumpsys window windows | grep mCurrentFocus) && CURRENT_APP=${{CURRENT_APP#*{{* * }} && CURRENT_APP=${{CURRENT_APP%%/*}} && if [ $CURRENT_APP != '{0}' ]; then monkey -p {0} -c " + INTENT_LAUNCH + " --pct-syskeys 0 1; fi"

Expand All @@ -44,10 +47,10 @@
CMD_MEDIA_SESSION_STATE_FULL = CMD_CURRENT_APP + " && " + CMD_MEDIA_SESSION_STATE

#: Get the running apps for an Android TV device
CMD_ANDROIDTV_RUNNING_APPS = "ps -A | grep u0_a"
CMD_RUNNING_APPS_ANDROIDTV = "ps -A | grep u0_a"

#: Get the running apps for a Fire TV device
CMD_FIRETV_RUNNING_APPS = "ps | grep u0_a"
CMD_RUNNING_APPS_FIRETV = "ps | grep u0_a"

#: Determine if the device is on
CMD_SCREEN_ON = "(dumpsys power | grep 'Display Power' | grep -q 'state=ON' || dumpsys power | grep -q 'mScreenOn=true')"
Expand All @@ -59,37 +62,37 @@
CMD_WAKE_LOCK_SIZE = "dumpsys power | grep Locks | grep 'size='"

#: Get the properties for an Android TV device (``lazy=True, get_running_apps=True``); see :py:meth:`androidtv.androidtv.androidtv_sync.AndroidTVSync.get_properties` and :py:meth:`androidtv.androidtv.androidtv_async.AndroidTVAsync.get_properties`
CMD_ANDROIDTV_PROPERTIES_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1 + " && " + CMD_AWAKE + CMD_SUCCESS1 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC + " && " + CMD_ANDROIDTV_RUNNING_APPS
CMD_ANDROIDTV_PROPERTIES_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1 + " && " + CMD_AWAKE + CMD_SUCCESS1 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC + " && " + CMD_RUNNING_APPS_ANDROIDTV

#: Get the properties for an Android TV device (``lazy=True, get_running_apps=False``); see :py:meth:`androidtv.androidtv.androidtv_sync.AndroidTVSync.get_properties` and :py:meth:`androidtv.androidtv.androidtv_async.AndroidTVAsync.get_properties`
CMD_ANDROIDTV_PROPERTIES_LAZY_NO_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1 + " && " + CMD_AWAKE + CMD_SUCCESS1 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC

#: Get the properties for an Android TV device (``lazy=False, get_running_apps=True``); see :py:meth:`androidtv.androidtv.androidtv_sync.AndroidTVSync.get_properties` and :py:meth:`androidtv.androidtv.androidtv_async.AndroidTVAsync.get_properties`
CMD_ANDROIDTV_PROPERTIES_NOT_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1_FAILURE0 + " && " + CMD_AWAKE + CMD_SUCCESS1_FAILURE0 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC + " && " + CMD_ANDROIDTV_RUNNING_APPS
CMD_ANDROIDTV_PROPERTIES_NOT_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1_FAILURE0 + " && " + CMD_AWAKE + CMD_SUCCESS1_FAILURE0 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC + " && " + CMD_RUNNING_APPS_ANDROIDTV

#: Get the properties for an Android TV device (``lazy=False, get_running_apps=False``); see :py:meth:`androidtv.androidtv.androidtv_sync.AndroidTVSync.get_properties` and :py:meth:`androidtv.androidtv.androidtv_async.AndroidTVAsync.get_properties`
CMD_ANDROIDTV_PROPERTIES_NOT_LAZY_NO_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1_FAILURE0 + " && " + CMD_AWAKE + CMD_SUCCESS1_FAILURE0 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC

#: Get the properties for a Google TV device (``lazy=True, get_running_apps=True``); see :py:meth:`androidtv.androidtv.androidtv_sync.AndroidTVSync.get_properties` and :py:meth:`androidtv.androidtv.androidtv_async.AndroidTVAsync.get_properties`
CMD_GOOGLE_TV_PROPERTIES_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1 + " && " + CMD_AWAKE + CMD_SUCCESS1 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP_GOOGLE_TV + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC + " && " + CMD_ANDROIDTV_RUNNING_APPS
CMD_GOOGLE_TV_PROPERTIES_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1 + " && " + CMD_AWAKE + CMD_SUCCESS1 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP_GOOGLE_TV + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC + " && " + CMD_RUNNING_APPS_ANDROIDTV

#: Get the properties for a Google TV device (``lazy=True, get_running_apps=False``); see :py:meth:`androidtv.androidtv.androidtv_sync.AndroidTVSync.get_properties` and :py:meth:`androidtv.androidtv.androidtv_async.AndroidTVAsync.get_properties`
CMD_GOOGLE_TV_PROPERTIES_LAZY_NO_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1 + " && " + CMD_AWAKE + CMD_SUCCESS1 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP_GOOGLE_TV + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC

#: Get the properties for a Google TV device (``lazy=False, get_running_apps=True``); see :py:meth:`androidtv.androidtv.androidtv_sync.AndroidTVSync.get_properties` and :py:meth:`androidtv.androidtv.androidtv_async.AndroidTVAsync.get_properties`
CMD_GOOGLE_TV_PROPERTIES_NOT_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1_FAILURE0 + " && " + CMD_AWAKE + CMD_SUCCESS1_FAILURE0 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP_GOOGLE_TV + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC + " && " + CMD_ANDROIDTV_RUNNING_APPS
CMD_GOOGLE_TV_PROPERTIES_NOT_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1_FAILURE0 + " && " + CMD_AWAKE + CMD_SUCCESS1_FAILURE0 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP_GOOGLE_TV + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC + " && " + CMD_RUNNING_APPS_ANDROIDTV

#: Get the properties for a Google TV device (``lazy=False, get_running_apps=False``); see :py:meth:`androidtv.androidtv.androidtv_sync.AndroidTVSync.get_properties` and :py:meth:`androidtv.androidtv.androidtv_async.AndroidTVAsync.get_properties`
CMD_GOOGLE_TV_PROPERTIES_NOT_LAZY_NO_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1_FAILURE0 + " && " + CMD_AWAKE + CMD_SUCCESS1_FAILURE0 + " && (" + CMD_AUDIO_STATE + ") && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP_GOOGLE_TV + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_STREAM_MUSIC

#: Get the properties for a Fire TV device (``lazy=True, get_running_apps=True``); see :py:meth:`androidtv.firetv.firetv_sync.FireTVSync.get_properties` and :py:meth:`androidtv.firetv.firetv_async.FireTVAsync.get_properties`
CMD_FIRETV_PROPERTIES_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1 + " && " + CMD_AWAKE + CMD_SUCCESS1 + " && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_FIRETV_RUNNING_APPS
CMD_FIRETV_PROPERTIES_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1 + " && " + CMD_AWAKE + CMD_SUCCESS1 + " && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_RUNNING_APPS_FIRETV

#: Get the properties for a Fire TV device (``lazy=True, get_running_apps=False``); see :py:meth:`androidtv.firetv.firetv_sync.FireTVSync.get_properties` and :py:meth:`androidtv.firetv.firetv_async.FireTVAsync.get_properties`
CMD_FIRETV_PROPERTIES_LAZY_NO_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1 + " && " + CMD_AWAKE + CMD_SUCCESS1 + " && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo)"

#: Get the properties for a Fire TV device (``lazy=False, get_running_apps=True``); see :py:meth:`androidtv.firetv.firetv_sync.FireTVSync.get_properties` and :py:meth:`androidtv.firetv.firetv_async.FireTVAsync.get_properties`
CMD_FIRETV_PROPERTIES_NOT_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1_FAILURE0 + " && " + CMD_AWAKE + CMD_SUCCESS1_FAILURE0 + " && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_FIRETV_RUNNING_APPS
CMD_FIRETV_PROPERTIES_NOT_LAZY_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1_FAILURE0 + " && " + CMD_AWAKE + CMD_SUCCESS1_FAILURE0 + " && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo) && " + CMD_RUNNING_APPS_FIRETV

#: Get the properties for a Fire TV device (``lazy=False, get_running_apps=False``); see :py:meth:`androidtv.firetv.firetv_sync.FireTVSync.get_properties` and :py:meth:`androidtv.firetv.firetv_async.FireTVAsync.get_properties`
CMD_FIRETV_PROPERTIES_NOT_LAZY_NO_RUNNING_APPS = CMD_SCREEN_ON + CMD_SUCCESS1_FAILURE0 + " && " + CMD_AWAKE + CMD_SUCCESS1_FAILURE0 + " && " + CMD_WAKE_LOCK_SIZE + " && " + CMD_CURRENT_APP + " && (" + CMD_MEDIA_SESSION_STATE + " || echo)"
Expand Down
2 changes: 1 addition & 1 deletion androidtv/firetv/firetv_async.py
Expand Up @@ -155,7 +155,7 @@ async def running_apps(self):
A list of the running apps
"""
running_apps_response = await self._adb.shell(constants.CMD_FIRETV_RUNNING_APPS)
running_apps_response = await self._adb.shell(constants.CMD_RUNNING_APPS_FIRETV)

return self._running_apps(running_apps_response)

Expand Down
2 changes: 1 addition & 1 deletion androidtv/firetv/firetv_sync.py
Expand Up @@ -155,7 +155,7 @@ def running_apps(self):
A list of the running apps
"""
running_apps_response = self._adb.shell(constants.CMD_FIRETV_RUNNING_APPS)
running_apps_response = self._adb.shell(constants.CMD_RUNNING_APPS_FIRETV)

return self._running_apps(running_apps_response)

Expand Down
11 changes: 11 additions & 0 deletions tests/test_basetv_async.py
Expand Up @@ -477,6 +477,17 @@ async def test_wake_lock_size(self):
with async_patchers.patch_shell('INVALID')[self.PATCH_KEY]:
self.assertIsNone(await self.btv.wake_lock_size())

@awaiter
async def test_get_hdmi_input(self):
"""Check that the ``get_hdmi_input`` function works correctly.
"""
with async_patchers.patch_shell("HDMI2")[self.PATCH_KEY]:
self.assertEqual(await self.btv.get_hdmi_input(), "HDMI2")

with async_patchers.patch_shell("")[self.PATCH_KEY]:
self.assertIsNone(await self.btv.get_hdmi_input(), None)

@awaiter
async def test_learn_sendevent(self):
"""Check that the ``learn_sendevent`` method works correctly.
Expand Down
10 changes: 10 additions & 0 deletions tests/test_basetv_sync.py
Expand Up @@ -464,6 +464,16 @@ def test_wake_lock_size(self):
with patchers.patch_shell('INVALID')[self.PATCH_KEY]:
self.assertIsNone(self.btv.wake_lock_size())

def test_get_hdmi_input(self):
"""Check that the ``get_hdmi_input`` function works correctly.
"""
with patchers.patch_shell("HDMI2")[self.PATCH_KEY]:
self.assertEqual(self.btv.get_hdmi_input(), "HDMI2")

with patchers.patch_shell("")[self.PATCH_KEY]:
self.assertIsNone(self.btv.get_hdmi_input(), None)

def test_learn_sendevent(self):
"""Check that the ``learn_sendevent`` method works correctly.
Expand Down

0 comments on commit 716407e

Please sign in to comment.