From 21b2836f90b60ba92d648a8bb1be5c40062da635 Mon Sep 17 00:00:00 2001 From: Tom Grushka Date: Sun, 2 Aug 2026 15:49:33 -0600 Subject: [PATCH] Use `dumpsys deviceidle get screen` in CMD_SCREEN_ON This PR: - fixes a broken pipe like in #351, but from `grep -q` instead of `grep -m 1` - uses a much more efficient call to get screen state On Android 14, both `dumpsys power` greps no longer match. It prints `Display Power: com.android.server.power.PowerManagerService$1@a8a75e6` with no `state=` field, and `mScreenOn=true` is gone. So each poll, every 10 seconds, falls back to `dumpsys display`, a much more expensive call. Because `grep -q` terminates on first match, the pipe is broken, resulting in a stack trace every 10 seconds that looks like: ``` W FastPrintWriter: Write failure W FastPrintWriter: java.io.IOException: write failed: EPIPE (Broken pipe) W FastPrintWriter: at libcore.io.IoBridge.write(IoBridge.java:651) W FastPrintWriter: at java.io.FileOutputStream.write(FileOutputStream.java:432) W FastPrintWriter: at com.android.internal.util.FastPrintWriter.flushBytesLocked(FastPrintWriter.java:355) W FastPrintWriter: at com.android.internal.util.FastPrintWriter.flushLocked(FastPrintWriter.java:378) W FastPrintWriter: at com.android.internal.util.FastPrintWriter.flush(FastPrintWriter.java:413) W FastPrintWriter: at android.os.Binder.dump(Binder.java:1158) W FastPrintWriter: at android.os.Binder.onTransact(Binder.java:1022) W FastPrintWriter: Caused by: android.system.ErrnoException: write failed: EPIPE (Broken pipe) W FastPrintWriter: at libcore.io.IoBridge.write(IoBridge.java:646) W FastPrintWriter: ... 9 more ``` This PR fixes the issue: - uses `dumpsys deviceidle get screen` to check screen state, which is cheap and has been available since Android 7 - removes `-q` so grep will not stop on first match and cause broken pipe --- androidtv/constants.py | 2 +- tests/test_constants.py | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/androidtv/constants.py b/androidtv/constants.py index 6fa36bb3..d43af1b1 100644 --- a/androidtv/constants.py +++ b/androidtv/constants.py @@ -226,7 +226,7 @@ class DeviceEnum(IntEnum): CMD_INSTALLED_APPS = "pm list packages" #: Determine if the device is on -CMD_SCREEN_ON = "(dumpsys power | grep 'Display Power' | grep -q 'state=ON' || dumpsys power | grep -q 'mScreenOn=true' || dumpsys display | grep -q 'mScreenState=ON')" +CMD_SCREEN_ON = "(dumpsys deviceidle get screen | grep true || dumpsys power | grep 'Display Power' | grep 'state=ON' || dumpsys power | grep 'mScreenOn=true' || dumpsys display | grep 'mScreenState=ON') > /dev/null" #: Get the "STREAM_MUSIC" block from ``dumpsys audio`` CMD_STREAM_MUSIC = r"dumpsys audio | grep '\- STREAM_MUSIC:' -A 11" diff --git a/tests/test_constants.py b/tests/test_constants.py index d2f9ca5f..ce682340 100644 --- a/tests/test_constants.py +++ b/tests/test_constants.py @@ -231,13 +231,13 @@ def test_constants(self): # CMD_SCREEN_ON self.assertCommand( constants.CMD_SCREEN_ON, - r"(dumpsys power | grep 'Display Power' | grep -q 'state=ON' || dumpsys power | grep -q 'mScreenOn=true' || dumpsys display | grep -q 'mScreenState=ON')", + r"(dumpsys deviceidle get screen | grep true || dumpsys power | grep 'Display Power' | grep 'state=ON' || dumpsys power | grep 'mScreenOn=true' || dumpsys display | grep 'mScreenState=ON') > /dev/null", ) # CMD_SCREEN_ON_AWAKE_WAKE_LOCK_SIZE self.assertCommand( constants.CMD_SCREEN_ON_AWAKE_WAKE_LOCK_SIZE, - r"(dumpsys power | grep 'Display Power' | grep -q 'state=ON' || dumpsys power | grep -q 'mScreenOn=true' || dumpsys display | grep -q 'mScreenState=ON') && echo -e '1\c' || echo -e '0\c' && dumpsys power | grep mWakefulness | grep -q Awake && echo -e '1\c' || echo -e '0\c' && dumpsys power | grep Locks | grep 'size='", + r"(dumpsys deviceidle get screen | grep true || dumpsys power | grep 'Display Power' | grep 'state=ON' || dumpsys power | grep 'mScreenOn=true' || dumpsys display | grep 'mScreenState=ON') > /dev/null && echo -e '1\c' || echo -e '0\c' && dumpsys power | grep mWakefulness | grep -q Awake && echo -e '1\c' || echo -e '0\c' && dumpsys power | grep Locks | grep 'size='", ) # CMD_SERIALNO @@ -249,25 +249,25 @@ def test_constants(self): # CMD_TURN_OFF_ANDROIDTV self.assertCommand( constants.CMD_TURN_OFF_ANDROIDTV, - r"(dumpsys power | grep 'Display Power' | grep -q 'state=ON' || dumpsys power | grep -q 'mScreenOn=true' || dumpsys display | grep -q 'mScreenState=ON') && input keyevent 26", + r"(dumpsys deviceidle get screen | grep true || dumpsys power | grep 'Display Power' | grep 'state=ON' || dumpsys power | grep 'mScreenOn=true' || dumpsys display | grep 'mScreenState=ON') > /dev/null && input keyevent 26", ) # CMD_TURN_OFF_FIRETV self.assertCommand( constants.CMD_TURN_OFF_FIRETV, - r"(dumpsys power | grep 'Display Power' | grep -q 'state=ON' || dumpsys power | grep -q 'mScreenOn=true' || dumpsys display | grep -q 'mScreenState=ON') && input keyevent 223", + r"(dumpsys deviceidle get screen | grep true || dumpsys power | grep 'Display Power' | grep 'state=ON' || dumpsys power | grep 'mScreenOn=true' || dumpsys display | grep 'mScreenState=ON') > /dev/null && input keyevent 223", ) # CMD_TURN_ON_ANDROIDTV self.assertCommand( constants.CMD_TURN_ON_ANDROIDTV, - r"(dumpsys power | grep 'Display Power' | grep -q 'state=ON' || dumpsys power | grep -q 'mScreenOn=true' || dumpsys display | grep -q 'mScreenState=ON') || input keyevent 26", + r"(dumpsys deviceidle get screen | grep true || dumpsys power | grep 'Display Power' | grep 'state=ON' || dumpsys power | grep 'mScreenOn=true' || dumpsys display | grep 'mScreenState=ON') > /dev/null || input keyevent 26", ) # CMD_TURN_ON_FIRETV self.assertCommand( constants.CMD_TURN_ON_FIRETV, - r"(dumpsys power | grep 'Display Power' | grep -q 'state=ON' || dumpsys power | grep -q 'mScreenOn=true' || dumpsys display | grep -q 'mScreenState=ON') || (input keyevent 26 && input keyevent 3)", + r"(dumpsys deviceidle get screen | grep true || dumpsys power | grep 'Display Power' | grep 'state=ON' || dumpsys power | grep 'mScreenOn=true' || dumpsys display | grep 'mScreenState=ON') > /dev/null || (input keyevent 26 && input keyevent 3)", ) # CMD_VERSION