blob: 3ca3e7306799a80dacd58a0fa853f1ffc0e50006 [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