1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-01-05 21:10:57 +00:00

fix(core): properly send the resume signal to homescreen layouts

This commit is contained in:
matejcik 2024-11-25 16:06:16 +01:00 committed by matejcik
parent 8a2a381949
commit 313e9e5c48
3 changed files with 18 additions and 21 deletions

View File

@ -8,12 +8,12 @@ import trezorui2
from trezor import io, log, loop, utils, wire, workflow from trezor import io, log, loop, utils, wire, workflow
from trezor.messages import ButtonAck, ButtonRequest from trezor.messages import ButtonAck, ButtonRequest
from trezor.wire import context from trezor.wire import context
from trezorui2 import BacklightLevels, LayoutState from trezorui2 import AttachType, BacklightLevels, LayoutState
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Any, Callable, Generator, Generic, Iterator, TypeVar from typing import Any, Callable, Generator, Generic, Iterator, TypeVar
from trezorui2 import AttachType, LayoutObj, UiResult # noqa: F401 from trezorui2 import LayoutObj, UiResult # noqa: F401
T = TypeVar("T", covariant=True) T = TypeVar("T", covariant=True)
@ -169,6 +169,10 @@ class Layout(Generic[T]):
self.context: context.Context | None = None self.context: context.Context | None = None
self.state: LayoutState = LayoutState.INITIAL self.state: LayoutState = LayoutState.INITIAL
# Indicates whether we should use Resume attach style when launching.
# Homescreen layouts can override this.
self.should_resume = False
def is_ready(self) -> bool: def is_ready(self) -> bool:
"""True if the layout is in READY state.""" """True if the layout is in READY state."""
return CURRENT_LAYOUT is not self and self.result_box.is_empty() return CURRENT_LAYOUT is not self and self.result_box.is_empty()
@ -198,7 +202,7 @@ class Layout(Generic[T]):
# make sure we are not restarted before picking the previous result # make sure we are not restarted before picking the previous result
assert self.is_ready() assert self.is_ready()
transition_in = None transition_in = AttachType.RESUME if self.should_resume else AttachType.INITIAL
# set up the global layout, shutting down any competitors # set up the global layout, shutting down any competitors
# (caller should still call `workflow.close_others()` to ensure that someone # (caller should still call `workflow.close_others()` to ensure that someone

View File

@ -1,7 +1,7 @@
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
import trezorui2 import trezorui2
from trezor import ui, utils, workflow from trezor import ui, workflow
from trezor.enums import ButtonRequestType from trezor.enums import ButtonRequestType
from trezor.messages import ButtonAck, ButtonRequest from trezor.messages import ButtonAck, ButtonRequest
from trezor.wire import ActionCancelled, context from trezor.wire import ActionCancelled, context
@ -109,14 +109,4 @@ async def with_info(
def draw_simple(layout: trezorui2.LayoutObj[Any]) -> None: def draw_simple(layout: trezorui2.LayoutObj[Any]) -> None:
# Simple drawing not supported for layouts that set timers. ui.Layout(layout).start()
def dummy_set_timer(token: int, duration: int) -> None:
raise RuntimeError
layout.attach_timer_fn(dummy_set_timer, None)
if utils.USE_BACKLIGHT:
ui.backlight_fade(ui.BacklightLevels.DIM)
if layout.paint():
ui.refresh()
if utils.USE_BACKLIGHT:
ui.backlight_fade(ui.BacklightLevels.NORMAL)

View File

@ -15,13 +15,17 @@ class HomescreenBase(ui.Layout):
def __init__(self, layout: Any) -> None: def __init__(self, layout: Any) -> None:
super().__init__(layout=layout) super().__init__(layout=layout)
self.should_resume = self._should_resume()
def _should_resume(self) -> bool:
return storage_cache.homescreen_shown is self.RENDER_INDICATOR
def _paint(self) -> None: def _paint(self) -> None:
if self.layout.paint(): if self.layout.paint():
ui.refresh() ui.refresh()
def _first_paint(self) -> None: def _first_paint(self) -> None:
if storage_cache.homescreen_shown is not self.RENDER_INDICATOR: if not self.should_resume:
super()._first_paint() super()._first_paint()
storage_cache.homescreen_shown = self.RENDER_INDICATOR storage_cache.homescreen_shown = self.RENDER_INDICATOR
# else: # else:
@ -50,15 +54,14 @@ class Homescreen(HomescreenBase):
elif notification_is_error: elif notification_is_error:
level = 0 level = 0
skip = storage_cache.homescreen_shown is self.RENDER_INDICATOR
super().__init__( super().__init__(
layout=trezorui2.show_homescreen( layout=trezorui2.show_homescreen(
label=label, label=label,
notification=notification, notification=notification,
notification_level=level, notification_level=level,
hold=hold_to_lock, hold=hold_to_lock,
skip_first_paint=skip, skip_first_paint=self._should_resume(),
), )
) )
async def usb_checker_task(self) -> None: async def usb_checker_task(self) -> None:
@ -99,6 +102,7 @@ class Lockscreen(HomescreenBase):
coinjoin_authorized=coinjoin_authorized, coinjoin_authorized=coinjoin_authorized,
), ),
) )
self.should_resume = skip
async def get_result(self) -> Any: async def get_result(self) -> Any:
result = await super().get_result() result = await super().get_result()
@ -111,13 +115,12 @@ class Busyscreen(HomescreenBase):
RENDER_INDICATOR = storage_cache.BUSYSCREEN_ON RENDER_INDICATOR = storage_cache.BUSYSCREEN_ON
def __init__(self, delay_ms: int) -> None: def __init__(self, delay_ms: int) -> None:
skip = storage_cache.homescreen_shown is self.RENDER_INDICATOR
super().__init__( super().__init__(
layout=trezorui2.show_progress_coinjoin( layout=trezorui2.show_progress_coinjoin(
title=TR.coinjoin__waiting_for_others, title=TR.coinjoin__waiting_for_others,
indeterminate=True, indeterminate=True,
time_ms=delay_ms, time_ms=delay_ms,
skip_first_paint=skip, skip_first_paint=self._should_resume(),
) )
) )