1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-07-26 16:38:12 +00:00

fix(core): don't send ButtonRequests during menu handling

Use `LayoutContent.page_count()` instead of `ButtonRequest.pages`.

[no changelog]
This commit is contained in:
Roman Zeyde 2025-07-02 15:35:54 +03:00 committed by Roman Zeyde
parent 9d9f3732a3
commit 09be64d1e7
2 changed files with 37 additions and 38 deletions

View File

@ -80,6 +80,7 @@ async def confirm_with_menu(
) -> None: ) -> None:
while True: while True:
result = await interact(main, br_name, br_code) result = await interact(main, br_name, br_code)
br_name = None # ButtonRequest should be sent once (for the main layout)
if result is trezorui_api.INFO: if result is trezorui_api.INFO:
await show_menu(menu, br_name, br_code) await show_menu(menu, br_name, br_code)
else: else:

View File

@ -930,9 +930,13 @@ class DebugUI:
def default_input_flow(self) -> InputFlowType: def default_input_flow(self) -> InputFlowType:
while True: while True:
yield from self._handle_button_request() br = yield
if br.code == messages.ButtonRequestType.PinEntry:
self.debuglink.input(self.get_pin())
else:
self._paginate_and_confirm(br.pages)
def _visit_menu_items(self) -> InputFlowType: def _visit_menu_items(self) -> None:
layout = self.debuglink.read_layout() layout = self.debuglink.read_layout()
if not layout.has_menu(): if not layout.has_menu():
return return
@ -942,36 +946,30 @@ class DebugUI:
# enter info menu layout and paginate through its items # enter info menu layout and paginate through its items
self.debuglink.press_info() self.debuglink.press_info()
br = yield menu_items_count = self.debuglink.read_layout().page_count()
assert br.pages is not None for _ in range(menu_items_count):
for _ in range(br.pages):
self.debuglink.press_middle() self.debuglink.press_middle()
# paginate through all properties and confirm # paginate through all properties and confirm
yield from self._handle_button_request() self._paginate_and_confirm(None)
# paginate to next menu item # paginate to next menu item
br = yield
self.debuglink.press_right() self.debuglink.press_right()
# cancel info menu layout # cancel info menu layout
self.debuglink.press_no() self.debuglink.press_no()
# back to the main layout
br = yield
def _handle_button_request(self) -> InputFlowType: def _paginate_and_confirm(self, pages: int | None) -> None:
br = yield if pages is None:
if br.code == messages.ButtonRequestType.PinEntry: pages = self.debuglink.read_layout().page_count()
self.debuglink.input(self.get_pin())
else:
# Paginating (going as further as possible) # Paginating (going as further as possible)
if br.pages is not None: for _ in range(pages - 1):
for _ in range(br.pages - 1):
if self.debuglink.model is models.T3W1: if self.debuglink.model is models.T3W1:
self.debuglink.click(self.debuglink.screen_buttons.ok()) self.debuglink.click(self.debuglink.screen_buttons.ok())
else: else:
self.debuglink.swipe_up() self.debuglink.swipe_up()
# Visit info menus (if exist) # Visit info menus (if exist)
yield from self._visit_menu_items() self._visit_menu_items()
# Confirm current layout # Confirm current layout
if self.debuglink.model is models.T3T1: if self.debuglink.model is models.T3T1: