From 04c8b2803dc56f7af3305bec14b9f32d677bc21d Mon Sep 17 00:00:00 2001 From: matejcik Date: Tue, 14 Apr 2020 12:21:32 +0200 Subject: [PATCH] core: refactor homescreen app, include lockscreen in it --- core/src/apps/homescreen/__init__.py | 45 ++++++++++++++++++++++++++ core/src/apps/homescreen/homescreen.py | 33 ++++++++----------- core/src/apps/homescreen/lockscreen.py | 12 +++++++ core/src/boot.py | 34 +++---------------- 4 files changed, 74 insertions(+), 50 deletions(-) create mode 100644 core/src/apps/homescreen/__init__.py create mode 100644 core/src/apps/homescreen/lockscreen.py diff --git a/core/src/apps/homescreen/__init__.py b/core/src/apps/homescreen/__init__.py new file mode 100644 index 000000000..db6742f50 --- /dev/null +++ b/core/src/apps/homescreen/__init__.py @@ -0,0 +1,45 @@ +import storage.device +from trezor import io, res, ui + +if False: + from typing import Any, Coroutine + + +class HomescreenBase(ui.Layout): + def __init__(self, lock_label = "Locked") -> None: + self.repaint = True + + self.lock_label = lock_label + self.label = storage.device.get_label() or "My Trezor" + self.image = storage.device.get_homescreen() or res.load( + "apps/homescreen/res/bg.toif" + ) + + def render_homescreen(self) -> None: + 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) + + def render_lock(self) -> None: + ui.display.bar_radius(40, 100, 160, 40, ui.TITLE_GREY, ui.BG, 4) + ui.display.bar_radius(42, 102, 156, 36, ui.BG, ui.TITLE_GREY, 4) + ui.display.text_center( + ui.WIDTH // 2, 128, self.lock_label, ui.BOLD, ui.TITLE_GREY, ui.BG + ) + + ui.display.text_center( + ui.WIDTH // 2 + 10, 220, "Tap to unlock", ui.BOLD, ui.TITLE_GREY, ui.BG + ) + ui.display.icon(45, 202, res.load(ui.ICON_CLICK), ui.TITLE_GREY, 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__() diff --git a/core/src/apps/homescreen/homescreen.py b/core/src/apps/homescreen/homescreen.py index 89bac637a..a9ffa50dc 100644 --- a/core/src/apps/homescreen/homescreen.py +++ b/core/src/apps/homescreen/homescreen.py @@ -1,30 +1,21 @@ import storage import storage.device -from trezor import config, res, ui +from trezor import config, ui + +from . import HomescreenBase async def homescreen() -> None: await Homescreen() -class Homescreen(ui.Layout): +class Homescreen(HomescreenBase): def __init__(self) -> None: - self.repaint = True - - def on_render(self) -> None: - if not self.repaint: - return - - image = None - if not storage.is_initialized(): - label = "Go to trezor.io/start" - else: - label = storage.device.get_label() or "My Trezor" - image = storage.device.get_homescreen() - - if not image: - image = res.load("apps/homescreen/res/bg.toif") + super().__init__() + if config.is_unlocked() and not storage.is_initialized(): + self.label = "Go to trezor.io/start" + def render_warning(self) -> None: if storage.is_initialized() and storage.device.no_backup(): ui.header_error("SEEDLESS") elif storage.is_initialized() and storage.device.unfinished_backup(): @@ -35,7 +26,9 @@ class Homescreen(ui.Layout): ui.header_warning("PIN NOT SET!") else: ui.display.bar(0, 0, ui.WIDTH, ui.HEIGHT, ui.BG) - ui.display.avatar(48, 48 - 10, image, ui.WHITE, ui.BLACK) - ui.display.text_center(ui.WIDTH // 2, 220, label, ui.BOLD, ui.FG, ui.BG) - self.repaint = False + def on_render(self) -> None: + self.render_warning() + self.render_homescreen() + if not config.is_unlocked(): + self.render_lock() diff --git a/core/src/apps/homescreen/lockscreen.py b/core/src/apps/homescreen/lockscreen.py new file mode 100644 index 000000000..2af6f260d --- /dev/null +++ b/core/src/apps/homescreen/lockscreen.py @@ -0,0 +1,12 @@ +from trezor import ui + +from . import HomescreenBase + + +class Lockscreen(HomescreenBase): + def on_render(self) -> None: + self.render_homescreen() + self.render_lock() + + def on_touch_end(self, x: int, y: int) -> None: + raise ui.Result(None) diff --git a/core/src/boot.py b/core/src/boot.py index 7dc00b850..54640fbe2 100644 --- a/core/src/boot.py +++ b/core/src/boot.py @@ -1,18 +1,20 @@ import storage import storage.device import storage.sd_salt -from trezor import config, log, loop, res, ui, utils, wire +from trezor import config, log, loop, ui, utils, wire from trezor.pin import show_pin_timeout from apps.common.request_pin import can_lock_device, verify_user_pin +from apps.homescreen.lockscreen import Lockscreen async def bootscreen() -> None: + lockscreen = Lockscreen(lock_label="Disconnected") ui.display.orientation(storage.device.get_rotation()) while True: try: if can_lock_device(): - await lockscreen() + await lockscreen await verify_user_pin() storage.init_unlocked() return @@ -28,34 +30,6 @@ async def bootscreen() -> None: utils.halt(e.__class__.__name__) -async def lockscreen() -> None: - label = storage.device.get_label() - image = storage.device.get_homescreen() - if not label: - label = "My Trezor" - if not image: - image = res.load("apps/homescreen/res/bg.toif") - - ui.backlight_fade(ui.BACKLIGHT_DIM) - - ui.display.clear() - ui.display.avatar(48, 48, image, ui.TITLE_GREY, ui.BG) - ui.display.text_center(ui.WIDTH // 2, 35, label, ui.BOLD, ui.TITLE_GREY, ui.BG) - - ui.display.bar_radius(40, 100, 160, 40, ui.TITLE_GREY, ui.BG, 4) - ui.display.bar_radius(42, 102, 156, 36, ui.BG, ui.TITLE_GREY, 4) - ui.display.text_center(ui.WIDTH // 2, 128, "Locked", ui.BOLD, ui.TITLE_GREY, ui.BG) - - ui.display.text_center( - ui.WIDTH // 2 + 10, 220, "Tap to unlock", ui.BOLD, ui.TITLE_GREY, ui.BG - ) - ui.display.icon(45, 202, res.load(ui.ICON_CLICK), ui.TITLE_GREY, ui.BG) - - ui.backlight_fade(ui.BACKLIGHT_NORMAL) - - await ui.click() - - ui.display.backlight(ui.BACKLIGHT_NONE) ui.backlight_fade(ui.BACKLIGHT_NORMAL) config.init(show_pin_timeout)