From 4f341693405a051d727d9e1f7d5a8c26c22dca6c Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Fri, 3 Jan 2020 06:48:24 -0800 Subject: [PATCH 1/8] Add command for checking that an app is not the current app before launching it --- androidtv/constants.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/androidtv/constants.py b/androidtv/constants.py index 60ababb5..7836d17e 100644 --- a/androidtv/constants.py +++ b/androidtv/constants.py @@ -26,6 +26,9 @@ #: Get the current app CMD_CURRENT_APP = "CURRENT_APP=$(dumpsys window windows | grep mCurrentFocus) && CURRENT_APP=${CURRENT_APP#*{* * } && CURRENT_APP=${CURRENT_APP%%/*} && echo $CURRENT_APP" +#: 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 + " 1; fi" + #: Get the state from ``dumpsys media_session``; this assumes that the variable ``CURRENT_APP`` has been defined CMD_MEDIA_SESSION_STATE = "dumpsys media_session | grep -A 100 'Sessions Stack' | grep -A 100 $CURRENT_APP | grep -m 1 'state=PlaybackState {'" From 14681e6c80795f38d6ee12d23504ee14883ff90a Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Fri, 3 Jan 2020 06:54:53 -0800 Subject: [PATCH 2/8] Check that an app is not the current app before launching it --- androidtv/basetv.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/androidtv/basetv.py b/androidtv/basetv.py index d9360be0..0a1076f2 100644 --- a/androidtv/basetv.py +++ b/androidtv/basetv.py @@ -813,13 +813,8 @@ def launch_app(self, app): app : str The ID of the app that will be launched - Returns - ------- - dict - A dictionary with keys ``'output'`` and ``'retcode'``, if they could be determined; otherwise, an empty dictionary - """ - return self._send_intent(app, constants.INTENT_LAUNCH) + self._adb.shell(constants.CMD_LAUNCH_APP.format(app)) def stop_app(self, app): """Stop an app. From e602d3c5f3f762d65381e093a1f70c650f677b49 Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Fri, 3 Jan 2020 06:58:06 -0800 Subject: [PATCH 3/8] Move 'INTENT_*' constants to the top --- androidtv/constants.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/androidtv/constants.py b/androidtv/constants.py index 7836d17e..ce69e688 100644 --- a/androidtv/constants.py +++ b/androidtv/constants.py @@ -11,6 +11,11 @@ import re +# Intents +INTENT_LAUNCH = "android.intent.category.LAUNCHER" +INTENT_HOME = "android.intent.category.HOME" + + # echo '1' if the previous shell command was successful CMD_SUCCESS1 = r" && echo -e '1\c'" @@ -85,11 +90,6 @@ CMD_MAC_ETH0 = "ip addr show eth0 | grep -m 1 ether" -# Intents -INTENT_LAUNCH = "android.intent.category.LAUNCHER" -INTENT_HOME = "android.intent.category.HOME" - - # ADB key event codes # https://developer.android.com/reference/android/view/KeyEvent KEY_BACK = 4 From 0a71ae47c745942689ede304a3bd6a6647d548bd Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Fri, 3 Jan 2020 07:03:33 -0800 Subject: [PATCH 4/8] Update test for 'launch_app' method --- tests/test_firetv.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/tests/test_firetv.py b/tests/test_firetv.py index 01263f3d..a259256f 100644 --- a/tests/test_firetv.py +++ b/tests/test_firetv.py @@ -151,15 +151,9 @@ def test_launch_app_stop_app(self): """Test that the ``FireTV.launch_app`` and ``FireTV.stop_app`` methods work correctly. """ - with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell('output\r\nretcode')[self.PATCH_KEY]: - result = self.ftv.launch_app("TEST") - self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, "monkey -p TEST -c android.intent.category.LAUNCHER 1; echo $?") - self.assertDictEqual(result, {'output': 'output', 'retcode': 'retcode'}) - with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell(None)[self.PATCH_KEY]: - result = self.ftv.launch_app("TEST") - self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, "monkey -p TEST -c android.intent.category.LAUNCHER 1; echo $?") - self.assertDictEqual(result, {}) + self.ftv.launch_app("TEST") + self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, constants.CMD_LAUNCH_APP.format("TEST")) self.ftv.stop_app("TEST") self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, "am force-stop TEST") From 339cea2eb1aeef0c1e934f66da62ca6c7b0ad27b Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Fri, 3 Jan 2020 07:08:15 -0800 Subject: [PATCH 5/8] Add 'launch_app' test that will cover '_send_intent' method --- tests/test_firetv.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/test_firetv.py b/tests/test_firetv.py index a259256f..65b03686 100644 --- a/tests/test_firetv.py +++ b/tests/test_firetv.py @@ -151,6 +151,10 @@ def test_launch_app_stop_app(self): """Test that the ``FireTV.launch_app`` and ``FireTV.stop_app`` methods work correctly. """ + with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell('output\r\nretcode')[self.PATCH_KEY]: + result = self.ftv.launch_app("TEST", check_current=False) + self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, "monkey -p TEST -c android.intent.category.LAUNCHER 1; echo $?") + with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell(None)[self.PATCH_KEY]: self.ftv.launch_app("TEST") self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, constants.CMD_LAUNCH_APP.format("TEST")) From e5785cd87530e325d61765c1a6f4328e727aa7a5 Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Fri, 3 Jan 2020 07:11:51 -0800 Subject: [PATCH 6/8] Add a 'check_current' parameter to 'launch_app' --- androidtv/basetv.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/androidtv/basetv.py b/androidtv/basetv.py index 0a1076f2..5599fc55 100644 --- a/androidtv/basetv.py +++ b/androidtv/basetv.py @@ -805,16 +805,21 @@ def _send_intent(self, pkg, intent, count=1): return {"output": output, "retcode": retcode} - def launch_app(self, app): + def launch_app(self, app, check_current=True): """Launch an app. Parameters ---------- app : str The ID of the app that will be launched + check_current : book + Whether to check that the app is not already the current app before launching it """ - self._adb.shell(constants.CMD_LAUNCH_APP.format(app)) + if check_current: + self._adb.shell(constants.CMD_LAUNCH_APP.format(app)) + else: + self._send_intent(app, constants.INTENT_LAUNCH) def stop_app(self, app): """Stop an app. From 6246b6d5faf51d69205be18cdfee23aacd2090ac Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Fri, 3 Jan 2020 07:19:26 -0800 Subject: [PATCH 7/8] Get coverage to 100% --- tests/test_firetv.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/test_firetv.py b/tests/test_firetv.py index 65b03686..e5fef8d7 100644 --- a/tests/test_firetv.py +++ b/tests/test_firetv.py @@ -155,7 +155,11 @@ def test_launch_app_stop_app(self): result = self.ftv.launch_app("TEST", check_current=False) self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, "monkey -p TEST -c android.intent.category.LAUNCHER 1; echo $?") - with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell(None)[self.PATCH_KEY]: + with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell(None)[self.PATCH_KEY]: + result = self.ftv.launch_app("TEST", check_current=False) + self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, "monkey -p TEST -c android.intent.category.LAUNCHER 1; echo $?") + + with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell(None)[self.PATCH_KEY]: self.ftv.launch_app("TEST") self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, constants.CMD_LAUNCH_APP.format("TEST")) From 20a39b1eaa401f947daecbe63dc55d22209a7ead Mon Sep 17 00:00:00 2001 From: Jeff Irion Date: Fri, 3 Jan 2020 07:29:21 -0800 Subject: [PATCH 8/8] Fix indentation --- tests/test_firetv.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/test_firetv.py b/tests/test_firetv.py index e5fef8d7..b93987bf 100644 --- a/tests/test_firetv.py +++ b/tests/test_firetv.py @@ -152,14 +152,14 @@ def test_launch_app_stop_app(self): """ with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell('output\r\nretcode')[self.PATCH_KEY]: - result = self.ftv.launch_app("TEST", check_current=False) - self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, "monkey -p TEST -c android.intent.category.LAUNCHER 1; echo $?") + self.ftv.launch_app("TEST", check_current=False) + self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, "monkey -p TEST -c android.intent.category.LAUNCHER 1; echo $?") with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell(None)[self.PATCH_KEY]: - result = self.ftv.launch_app("TEST", check_current=False) - self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, "monkey -p TEST -c android.intent.category.LAUNCHER 1; echo $?") + result = self.ftv.launch_app("TEST", check_current=False) + self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, "monkey -p TEST -c android.intent.category.LAUNCHER 1; echo $?") - with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell(None)[self.PATCH_KEY]: + with patchers.patch_connect(True)[self.PATCH_KEY], patchers.patch_shell(None)[self.PATCH_KEY]: self.ftv.launch_app("TEST") self.assertEqual(getattr(self.ftv._adb, self.ADB_ATTR).shell_cmd, constants.CMD_LAUNCH_APP.format("TEST"))