mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-18 05:28:40 +00:00
core: simplify homescreen and lockscreen implementations
This commit is contained in:
parent
35a0ae1d18
commit
847691798b
@ -1,11 +1,10 @@
|
|||||||
import storage.device
|
import storage.device
|
||||||
from trezor import io, res, ui
|
from trezor import loop, res, ui
|
||||||
|
|
||||||
if False:
|
|
||||||
from typing import Any, Coroutine
|
|
||||||
|
|
||||||
|
|
||||||
class HomescreenBase(ui.Layout):
|
class HomescreenBase(ui.Layout):
|
||||||
|
RENDER_SLEEP = loop.SLEEP_FOREVER
|
||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
self.repaint = True
|
self.repaint = True
|
||||||
|
|
||||||
@ -17,16 +16,3 @@ class HomescreenBase(ui.Layout):
|
|||||||
def render_homescreen(self) -> None:
|
def render_homescreen(self) -> None:
|
||||||
ui.display.avatar(48, 48 - 10, self.image, ui.WHITE, ui.BLACK)
|
ui.display.avatar(48, 48 - 10, self.image, ui.WHITE, ui.BLACK)
|
||||||
ui.display.text_center(ui.WIDTH // 2, 220, self.label, ui.BOLD, ui.FG, ui.BG)
|
ui.display.text_center(ui.WIDTH // 2, 220, self.label, ui.BOLD, ui.FG, ui.BG)
|
||||||
|
|
||||||
def dispatch(self, event: int, x: int, y: int) -> None:
|
|
||||||
if event is ui.RENDER and self.repaint:
|
|
||||||
self.repaint = False
|
|
||||||
self.on_render()
|
|
||||||
elif event is io.TOUCH_END:
|
|
||||||
self.on_touch_end(x, y)
|
|
||||||
|
|
||||||
def __iter__(self) -> Coroutine[Any, Any, ui.ResultValue]:
|
|
||||||
# called whenever `await homescreen` is invoked.
|
|
||||||
# we want to repaint once after that and then never again
|
|
||||||
self.repaint = True
|
|
||||||
return super().__iter__()
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from trezor import loop, res, ui, wire
|
from trezor import res, ui, wire
|
||||||
|
|
||||||
from . import HomescreenBase
|
from . import HomescreenBase
|
||||||
|
|
||||||
@ -20,6 +20,8 @@ async def lockscreen() -> None:
|
|||||||
|
|
||||||
|
|
||||||
class Lockscreen(HomescreenBase):
|
class Lockscreen(HomescreenBase):
|
||||||
|
BACKLIGHT_LEVEL = ui.BACKLIGHT_LOW
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self, lock_label: str = "Locked", tap_label: str = "Tap to unlock"
|
self, lock_label: str = "Locked", tap_label: str = "Tap to unlock"
|
||||||
) -> None:
|
) -> None:
|
||||||
@ -39,33 +41,6 @@ class Lockscreen(HomescreenBase):
|
|||||||
)
|
)
|
||||||
ui.display.icon(45, 202, res.load(ui.ICON_CLICK), ui.TITLE_GREY, ui.BG)
|
ui.display.icon(45, 202, res.load(ui.ICON_CLICK), ui.TITLE_GREY, ui.BG)
|
||||||
|
|
||||||
def handle_rendering(self) -> loop.Task: # type: ignore
|
|
||||||
"""Task that is rendering the layout in a busy loop.
|
|
||||||
|
|
||||||
Copy-pasted from ui.Layout.handle_rendering with modification to set the
|
|
||||||
backlight to a lower level while lockscreen is on, and a longer sleep because
|
|
||||||
we never do any redrawing."""
|
|
||||||
# Before the first render, we dim the display.
|
|
||||||
ui.backlight_fade(ui.BACKLIGHT_DIM)
|
|
||||||
# Clear the screen of any leftovers, make sure everything is marked for
|
|
||||||
# repaint (we can be running the same layout instance multiple times)
|
|
||||||
# and paint it.
|
|
||||||
ui.display.clear()
|
|
||||||
self.on_render()
|
|
||||||
|
|
||||||
if __debug__ and self.should_notify_layout_change:
|
|
||||||
from apps.debug import notify_layout_change
|
|
||||||
|
|
||||||
self.should_notify_layout_change = False
|
|
||||||
notify_layout_change(self)
|
|
||||||
|
|
||||||
ui.refresh()
|
|
||||||
ui.backlight_fade(ui.BACKLIGHT_LOW)
|
|
||||||
# long sleep
|
|
||||||
sleep = loop.sleep(1000 * 1000 * 1000)
|
|
||||||
while True:
|
|
||||||
yield sleep
|
|
||||||
|
|
||||||
def on_render(self) -> None:
|
def on_render(self) -> None:
|
||||||
self.render_homescreen()
|
self.render_homescreen()
|
||||||
self.render_lock()
|
self.render_lock()
|
||||||
|
@ -222,6 +222,10 @@ class Syscall:
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
SLEEP_FOREVER = Syscall()
|
||||||
|
"""Tasks awaiting `SLEEP_FOREVER` will never be resumed."""
|
||||||
|
|
||||||
|
|
||||||
class sleep(Syscall):
|
class sleep(Syscall):
|
||||||
"""
|
"""
|
||||||
Pause current task and resume it after given delay. Although the delay is
|
Pause current task and resume it after given delay. Although the delay is
|
||||||
|
@ -305,6 +305,9 @@ class Layout(Component):
|
|||||||
raised, usually from some of the child components.
|
raised, usually from some of the child components.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
BACKLIGHT_LEVEL = style.BACKLIGHT_NORMAL
|
||||||
|
RENDER_SLEEP = loop.sleep(_RENDER_DELAY_US) # type: loop.Syscall
|
||||||
|
|
||||||
async def __iter__(self) -> ResultValue:
|
async def __iter__(self) -> ResultValue:
|
||||||
"""
|
"""
|
||||||
Run the layout and wait until it completes. Returns the result value.
|
Run the layout and wait until it completes. Returns the result value.
|
||||||
@ -381,8 +384,8 @@ class Layout(Component):
|
|||||||
# rendering everything synchronously, so refresh it manually and turn
|
# rendering everything synchronously, so refresh it manually and turn
|
||||||
# the brightness on again.
|
# the brightness on again.
|
||||||
refresh()
|
refresh()
|
||||||
backlight_fade(style.BACKLIGHT_NORMAL)
|
backlight_fade(self.BACKLIGHT_LEVEL)
|
||||||
sleep = loop.sleep(_RENDER_DELAY_US)
|
sleep = self.RENDER_SLEEP
|
||||||
while True:
|
while True:
|
||||||
# Wait for a couple of ms and render the layout again. Because
|
# Wait for a couple of ms and render the layout again. Because
|
||||||
# components use re-paint marking, they do not really draw on the
|
# components use re-paint marking, they do not really draw on the
|
||||||
|
Loading…
Reference in New Issue
Block a user