blob: 73fb292b8b975d34af2871d8e8a20061b14cab83 [file]
# Copyright 2026 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import signal
import contextlib
import asyncio
from . import command_line
@contextlib.asynccontextmanager
async def caffeinate(interval=30):
"""A context manager to keep a device connected over ADB awake.
The device is kept awake by simulating keypresses of the F24 key in a loop.
Args:
interval: The interval (in seconds) between key events.
Usage::
async with colabutils.caffeinate():
await app.start(url='about:blank')
fcp_time_ms = await navigation.measure_fcp(app, url="https://google.com")
print(f"FCP: {fcp_time_ms} ms")
"""
# Simulate keypresses of the F24 key since it is unlikely that Chrome is
# listening for it.
cmd = "while true; do input keyevent 337; sleep {interval}; done"
caffeinate_task = asyncio.create_task(
command_line.adb_shell(cmd.format(interval=interval),
interruption_signal=signal.SIGINT))
try:
yield
finally:
caffeinate_task.cancel()
try:
await caffeinate_task
except asyncio.CancelledError:
pass # Expected if the task handles cancellation