diff --git a/core/src/apps/homescreen/homescreen.py b/core/src/apps/homescreen/homescreen.py index b030f5d9c..fbeb567bb 100644 --- a/core/src/apps/homescreen/homescreen.py +++ b/core/src/apps/homescreen/homescreen.py @@ -32,6 +32,7 @@ class Homescreen(HomescreenBase): style=LoaderNeutral, target_ms=_LOADER_TOTAL_MS - _LOADER_DELAY_MS, offset_y=-10, + reverse_speedup=3, ) self.touch_ms: Optional[int] = None diff --git a/core/src/trezor/ui/loader.py b/core/src/trezor/ui/loader.py index 9f93a77a5..04dc50190 100644 --- a/core/src/trezor/ui/loader.py +++ b/core/src/trezor/ui/loader.py @@ -44,6 +44,7 @@ if False: _TARGET_MS = const(1000) _OFFSET_Y = const(-24) +_REVERSE_SPEEDUP = const(2) class Loader(ui.Component): @@ -52,6 +53,7 @@ class Loader(ui.Component): style: LoaderStyleType = LoaderDefault, target_ms: int = _TARGET_MS, offset_y: int = _OFFSET_Y, + reverse_speedup: int = _REVERSE_SPEEDUP, ) -> None: super().__init__() self.normal_style = style.normal @@ -60,9 +62,13 @@ class Loader(ui.Component): self.start_ms: Optional[int] = None self.stop_ms: Optional[int] = None self.offset_y = offset_y + self.reverse_speedup = reverse_speedup def start(self) -> None: - self.start_ms = utime.ticks_ms() + if self.start_ms is not None and self.stop_ms is not None: + self.start_ms = utime.ticks_ms() - self.elapsed_ms() + else: + self.start_ms = utime.ticks_ms() self.stop_ms = None self.on_start() @@ -70,27 +76,27 @@ class Loader(ui.Component): self.stop_ms = utime.ticks_ms() def elapsed_ms(self) -> int: - if self.start_ms is None: - return 0 - return utime.ticks_ms() - self.start_ms - - def on_render(self) -> None: - target = self.target_ms start = self.start_ms stop = self.stop_ms - if start is None: - return now = utime.ticks_ms() - if stop is None: - r = min(now - start, target) + if start is None: + return 0 + elif stop is not None: + return max(stop - start + (stop - now) * self.reverse_speedup, 0) else: - r = max(stop - start + (stop - now) * 2, 0) + return min(now - start, self.target_ms) + + def on_render(self) -> None: + if self.start_ms is None: + return + target = self.target_ms + r = self.elapsed_ms() if r != target: s = self.normal_style else: s = self.active_style - progress = r * 1000 // target + progress = r * 1000 // target # scale to 0-1000 if s.icon is None: display.loader(progress, False, self.offset_y, s.fg_color, s.bg_color) else: