1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-23 06:48:16 +00:00

chore(core): decrease homescreen size by 280 bytes

This commit is contained in:
grdddj 2022-09-17 20:11:24 +02:00 committed by matejcik
parent 11fc2d36f7
commit 48b4c5aaba
4 changed files with 94 additions and 57 deletions

View File

@ -2,7 +2,7 @@ from typing import Any
import storage.cache
import storage.device
from trezor import res, ui
from trezor import ui
class HomescreenBase(ui.Layout):
@ -14,6 +14,8 @@ class HomescreenBase(ui.Layout):
self.repaint = storage.cache.homescreen_shown is not self.RENDER_INDICATOR
def get_image(self) -> bytes:
from trezor import res
return storage.device.get_homescreen() or res.load(
"apps/homescreen/res/bg.toif"
)

View File

@ -1,27 +1,33 @@
import storage.cache
from trezor import loop, ui
from trezor.ui.layouts import show_coinjoin
from typing import TYPE_CHECKING
from apps.base import busy_expiry_ms, set_homescreen
import storage.cache as storage_cache
from . import HomescreenBase
if TYPE_CHECKING:
from trezor import loop
async def busyscreen() -> None:
await Busyscreen()
class Busyscreen(HomescreenBase):
RENDER_INDICATOR = storage.cache.BUSYSCREEN_ON
RENDER_INDICATOR = storage_cache.BUSYSCREEN_ON
def create_tasks(self) -> tuple[loop.AwaitableTask, ...]:
return self.handle_rendering(), self.handle_input(), self.handle_expiry()
def handle_expiry(self) -> loop.Task: # type: ignore [awaitable-is-generator]
from apps.base import busy_expiry_ms, set_homescreen
from trezor import ui, loop
yield loop.sleep(busy_expiry_ms())
storage.cache.delete(storage.cache.APP_COMMON_BUSY_DEADLINE_MS)
storage_cache.delete(storage_cache.APP_COMMON_BUSY_DEADLINE_MS)
set_homescreen()
raise ui.Result(None)
def do_render(self) -> None:
from trezor.ui.layouts import show_coinjoin
show_coinjoin()

View File

@ -1,22 +1,23 @@
import utime
from micropython import const
from typing import Tuple
from typing import TYPE_CHECKING, Tuple
import storage
import storage.cache
import storage.device
from trezor import config, io, loop, ui, utils
from trezor.ui.loader import Loader, LoaderNeutral
from apps.base import lock_device
from trezor import config, ui
from . import HomescreenBase
if TYPE_CHECKING:
from trezor import loop
_LOADER_DELAY_MS = const(500)
_LOADER_TOTAL_MS = const(2500)
async def homescreen() -> None:
from apps.base import lock_device
await Homescreen()
lock_device()
@ -25,15 +26,18 @@ class Homescreen(HomescreenBase):
RENDER_INDICATOR = storage.cache.HOMESCREEN_ON
def __init__(self) -> None:
from trezor.ui.loader import Loader, LoaderNeutral
import storage.device as storage_device
super().__init__()
if not storage.device.is_initialized():
if not storage_device.is_initialized():
self.label = "Go to trezor.io/start"
self.loader = Loader(
style=LoaderNeutral,
target_ms=_LOADER_TOTAL_MS - _LOADER_DELAY_MS,
offset_y=-10,
reverse_speedup=3,
LoaderNeutral,
_LOADER_TOTAL_MS - _LOADER_DELAY_MS,
-10,
3,
)
self.touch_ms: int | None = None
@ -41,45 +45,61 @@ class Homescreen(HomescreenBase):
return super().create_tasks() + (self.usb_checker_task(),)
async def usb_checker_task(self) -> None:
from trezor import loop, io
usbcheck = loop.wait(io.USB_CHECK)
while True:
await usbcheck
self.set_repaint(True)
def do_render(self) -> None:
from trezor import utils
from trezor import ui # local_cache_global
import storage.device as storage_device
header_error = ui.header_error # local_cache_attribute
header_warning = ui.header_warning # local_cache_attribute
display = ui.display # local_cache_attribute
model = utils.MODEL # local_cache_attribute
# warning bar on top
if storage.device.is_initialized() and storage.device.no_backup():
ui.header_error("SEEDLESS")
elif storage.device.is_initialized() and storage.device.unfinished_backup():
ui.header_error("BACKUP FAILED!")
elif storage.device.is_initialized() and storage.device.needs_backup():
ui.header_warning("NEEDS BACKUP!")
elif storage.device.is_initialized() and not config.has_pin():
ui.header_warning("PIN NOT SET!")
elif storage.device.get_experimental_features():
ui.header_warning("EXPERIMENTAL MODE!")
if storage_device.is_initialized() and storage_device.no_backup():
header_error("SEEDLESS")
elif storage_device.is_initialized() and storage_device.unfinished_backup():
header_error("BACKUP FAILED!")
elif storage_device.is_initialized() and storage_device.needs_backup():
header_warning("NEEDS BACKUP!")
elif storage_device.is_initialized() and not config.has_pin():
header_warning("PIN NOT SET!")
elif storage_device.get_experimental_features():
header_warning("EXPERIMENTAL MODE!")
else:
ui.display.bar(0, 0, ui.WIDTH, ui.get_header_height(), ui.BG)
display.bar(0, 0, ui.WIDTH, ui.get_header_height(), ui.BG)
# homescreen with shifted avatar and text on bottom
# Differs for each model
if not utils.usb_data_connected():
ui.header_error("NO USB CONNECTION")
header_error("NO USB CONNECTION")
# TODO: support homescreen avatar change for R and 1
if utils.MODEL in ("T",):
ui.display.avatar(48, 48 - 10, self.get_image(), ui.WHITE, ui.BLACK)
elif utils.MODEL in ("R",):
if model in ("T",):
display.avatar(48, 48 - 10, self.get_image(), ui.WHITE, ui.BLACK)
elif model in ("R",):
icon = "trezor/res/homescreen_model_r.toif" # 92x92 px
ui.display.icon(18, 18, ui.res.load(icon), ui.style.FG, ui.style.BG)
elif utils.MODEL in ("1",):
display.icon(18, 18, ui.res.load(icon), ui.style.FG, ui.style.BG)
elif model in ("1",):
icon = "trezor/res/homescreen_model_1.toif" # 64x36 px
ui.display.icon(33, 14, ui.res.load(icon), ui.style.FG, ui.style.BG)
display.icon(33, 14, ui.res.load(icon), ui.style.FG, ui.style.BG)
label_heights = {"1": 60, "R": 120, "T": 220}
ui.display.text_center(
ui.WIDTH // 2, label_heights[utils.MODEL], self.label, ui.BOLD, ui.FG, ui.BG
display.text_center(
ui.WIDTH // 2,
label_heights[model],
self.label,
ui.BOLD,
ui.FG,
ui.BG,
)
ui.refresh()
@ -101,18 +121,20 @@ class Homescreen(HomescreenBase):
if self.loader.elapsed_ms() >= self.loader.target_ms:
raise ui.Result(None)
def _loader_start(self) -> None:
ui.display.clear()
ui.display.text_center(ui.WIDTH // 2, 35, "Hold to lock", ui.BOLD, ui.FG, ui.BG)
self.loader.start()
def dispatch(self, event: int, x: int, y: int) -> None:
if (
self.touch_ms is not None
and self.touch_ms + _LOADER_DELAY_MS < utime.ticks_ms()
):
self.touch_ms = None
self._loader_start()
# _loader_start
ui.display.clear()
ui.display.text_center(
ui.WIDTH // 2, 35, "Hold to lock", ui.BOLD, ui.FG, ui.BG
)
self.loader.start()
# END _loader_start
if event is ui.RENDER and self.loader.start_ms is not None:
self.loader.dispatch(event, x, y)

View File

@ -1,10 +1,12 @@
import storage.cache
from trezor import loop, res, ui, wire
from trezor import loop, ui
from . import HomescreenBase
async def lockscreen() -> None:
from trezor import wire
from apps.common.request_pin import can_lock_device
from apps.base import unlock_device
@ -37,24 +39,29 @@ class Lockscreen(HomescreenBase):
super().__init__()
def do_render(self) -> None:
from trezor import res
from trezor import ui # local_cache_global
display = ui.display # local_cache_attribute
title_grey = ui.TITLE_GREY # local_cache_attribute
bg = ui.BG # local_cache_attribute
# homescreen with label text on top
ui.display.text_center(
ui.WIDTH // 2, 35, self.label, ui.BOLD, ui.TITLE_GREY, ui.BG
)
ui.display.avatar(48, 48, self.get_image(), ui.WHITE, ui.BLACK)
display.text_center(ui.WIDTH // 2, 35, self.label, ui.BOLD, title_grey, bg)
display.avatar(48, 48, self.get_image(), ui.WHITE, ui.BLACK)
# lock bar
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
display.bar_radius(40, 100, 160, 40, title_grey, bg, 4)
display.bar_radius(42, 102, 156, 36, bg, title_grey, 4)
display.text_center(
ui.WIDTH // 2, 128, self.lock_label, ui.BOLD, title_grey, bg
)
# "tap to unlock"
ui.display.text_center(
ui.WIDTH // 2 + 10, 220, self.tap_label, ui.BOLD, ui.TITLE_GREY, ui.BG
display.text_center(
ui.WIDTH // 2 + 10, 220, self.tap_label, ui.BOLD, title_grey, bg
)
ui.display.icon(45, 202, res.load(ui.ICON_CLICK), ui.TITLE_GREY, ui.BG)
display.icon(45, 202, res.load(ui.ICON_CLICK), title_grey, bg)
def on_touch_end(self, _x: int, _y: int) -> None:
raise ui.Result(None)