1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-22 06:18:07 +00:00

chore(core/ui): unify UI2 layouts that raise when not confirmed

[no changelog]
This commit is contained in:
grdddj 2022-09-12 15:38:18 +02:00 committed by Martin Milata
parent 23a0a37a45
commit be93dad604

View File

@ -9,14 +9,16 @@ import trezorui2
from ..common import button_request, interact
if TYPE_CHECKING:
from typing import Any, Awaitable, Iterable, NoReturn, Sequence
from typing import Any, Awaitable, Iterable, NoReturn, Sequence, TypeVar
from ..common import PropertyType, ExceptionType
T = TypeVar("T")
class _RustLayout(ui.Layout):
# pylint: disable=super-init-not-called
def __init__(self, layout: Any, is_backup=False):
def __init__(self, layout: Any, is_backup: bool = False):
self.layout = layout
self.timer = loop.Timer()
self.layout.attach_timer_fn(self.set_timer)
@ -46,9 +48,9 @@ class _RustLayout(ui.Layout):
)
def read_content(self) -> list[str]:
result = []
result: list[str] = []
def callback(*args):
def callback(*args: Any) -> None:
for arg in args:
result.append(str(arg))
@ -97,7 +99,7 @@ class _RustLayout(ui.Layout):
end = ">"
start_pos = content.index(start)
end_pos = content.index(end, start_pos)
words = []
words: list[str] = []
for line in content[start_pos + len(start) : end_pos].split("\n"):
line = line.strip()
if not line:
@ -158,6 +160,13 @@ class _RustLayout(ui.Layout):
return self.layout.page_count()
async def raise_if_not_confirmed(a: Awaitable[T], exc: Any = wire.ActionCancelled) -> T:
result = await a
if result is not trezorui2.CONFIRMED:
raise exc
return result
async def confirm_action(
ctx: wire.GenericContext,
br_type: str,
@ -189,24 +198,25 @@ async def confirm_action(
log.error(__name__, "confirm_action description_param_font not implemented")
description = description.format(description_param)
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_action(
title=title.upper(),
action=action,
description=description,
verb=verb,
verb_cancel=verb_cancel,
hold=hold,
reverse=reverse,
)
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_action(
title=title.upper(),
action=action,
description=description,
verb=verb,
verb_cancel=verb_cancel,
hold=hold,
reverse=reverse,
)
),
br_type,
br_code,
),
br_type,
br_code,
exc,
)
if result is not trezorui2.CONFIRMED:
raise exc
async def confirm_reset_device(
@ -217,19 +227,21 @@ async def confirm_reset_device(
else:
title = "CREATE NEW WALLET"
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_reset_device(
title=title.upper(),
prompt=prompt.replace("\n", " "),
)
),
"recover_device" if recovery else "setup_device",
ButtonRequestType.ProtectCall if recovery else ButtonRequestType.ResetDevice,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_reset_device(
title=title.upper(),
prompt=prompt.replace("\n", " "),
)
),
"recover_device" if recovery else "setup_device",
ButtonRequestType.ProtectCall
if recovery
else ButtonRequestType.ResetDevice,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
# TODO cleanup @ redesign
@ -271,19 +283,19 @@ async def confirm_backup(ctx: wire.GenericContext) -> bool:
async def confirm_path_warning(
ctx: wire.GenericContext, path: str, path_type: str = "Path"
) -> None:
result = await interact(
ctx,
_RustLayout(
trezorui2.show_warning(
title="Unknown path",
description=path,
)
),
"path_warning",
ButtonRequestType.UnknownDerivationPath,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.show_warning(
title="Unknown path",
description=path,
)
),
"path_warning",
ButtonRequestType.UnknownDerivationPath,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
def _show_xpub(xpub: str, title: str, cancel: str) -> ui.Layout:
@ -300,14 +312,14 @@ def _show_xpub(xpub: str, title: str, cancel: str) -> ui.Layout:
async def show_xpub(
ctx: wire.GenericContext, xpub: str, title: str, cancel: str
) -> None:
result = await interact(
ctx,
_show_xpub(xpub, title, cancel),
"show_xpub",
ButtonRequestType.PublicKey,
await raise_if_not_confirmed(
interact(
ctx,
_show_xpub(xpub, title, cancel),
"show_xpub",
ButtonRequestType.PublicKey,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def show_address(
@ -423,21 +435,21 @@ async def show_warning(
icon: str = ui.ICON_WRONG,
icon_color: int = ui.RED,
) -> None:
result = await interact(
ctx,
_RustLayout(
trezorui2.show_warning(
title=content.replace("\n", " "),
description=subheader or "",
button=button.upper(),
allow_cancel=False,
)
),
br_type,
br_code,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.show_warning(
title=content.replace("\n", " "),
description=subheader or "",
button=button.upper(),
allow_cancel=False,
)
),
br_type,
br_code,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def show_success(
@ -447,21 +459,21 @@ async def show_success(
subheader: str | None = None,
button: str = "CONTINUE",
) -> None:
result = await interact(
ctx,
_RustLayout(
trezorui2.show_success(
title=content.replace("\n", " "),
description=subheader or "",
button=button.upper(),
allow_cancel=False,
)
),
br_type,
ButtonRequestType.Success,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.show_success(
title=content.replace("\n", " "),
description=subheader or "",
button=button.upper(),
allow_cancel=False,
)
),
br_type,
ButtonRequestType.Success,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def confirm_output(
@ -483,35 +495,35 @@ async def confirm_output(
if title.startswith("CONFIRM "):
title = title[len("CONFIRM ") :]
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_output(
title=title,
description="To:",
value=address,
)
),
"confirm_output",
br_code,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_output(
title=title,
description="To:",
value=address,
)
),
"confirm_output",
br_code,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_output(
title=title,
description="Amount:",
value=amount,
)
),
"confirm_output",
br_code,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_output(
title=title,
description="Amount:",
value=amount,
)
),
"confirm_output",
br_code,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def confirm_payment_request(
@ -605,22 +617,22 @@ async def confirm_blob(
if isinstance(data, bytes):
data = hexlify(data).decode()
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_blob(
title=title.upper(),
description=description or "",
data=data,
ask_pagination=ask_pagination,
hold=hold,
)
),
br_type,
br_code,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_blob(
title=title.upper(),
description=description or "",
data=data,
ask_pagination=ask_pagination,
hold=hold,
)
),
br_type,
br_code,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
def confirm_address(
@ -706,53 +718,54 @@ async def confirm_total(
br_type: str = "confirm_total",
br_code: ButtonRequestType = ButtonRequestType.SignTx,
) -> None:
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_output(
title=title.upper(),
description="Fee:",
value=fee_amount,
)
),
"confirm_total",
br_code,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_output(
title=title.upper(),
description="Fee:",
value=fee_amount,
)
),
"confirm_total",
br_code,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_total(
title=title.upper(),
description="Total amount:",
value=total_amount,
)
),
"confirm_total",
br_code,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_total(
title=title.upper(),
description="Total amount:",
value=total_amount,
)
),
"confirm_total",
br_code,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def confirm_joint_total(
ctx: wire.GenericContext, spending_amount: str, total_amount: str
) -> None:
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_joint_total(
spending_amount=spending_amount,
total_amount=total_amount,
)
),
"confirm_joint_total",
ButtonRequestType.SignTx,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_joint_total(
spending_amount=spending_amount,
total_amount=total_amount,
)
),
"confirm_joint_total",
ButtonRequestType.SignTx,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def confirm_metadata(
@ -794,34 +807,33 @@ async def confirm_metadata(
hold=hold,
)
result = await interact(
ctx,
_RustLayout(layout),
br_type,
br_code,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(layout),
br_type,
br_code,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def confirm_replacement(
ctx: wire.GenericContext, description: str, txid: str
) -> None:
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_blob(
title=description.upper(),
description="Confirm transaction ID:",
data=txid,
)
),
"confirm_replacement",
ButtonRequestType.SignTx,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_blob(
title=description.upper(),
description="Confirm transaction ID:",
data=txid,
)
),
"confirm_replacement",
ButtonRequestType.SignTx,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def confirm_modify_output(
@ -831,21 +843,21 @@ async def confirm_modify_output(
amount_change: str,
amount_new: str,
) -> None:
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_modify_output(
address=address,
sign=sign,
amount_change=amount_change,
amount_new=amount_new,
)
),
"modify_output",
ButtonRequestType.ConfirmOutput,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_modify_output(
address=address,
sign=sign,
amount_change=amount_change,
amount_new=amount_new,
)
),
"modify_output",
ButtonRequestType.ConfirmOutput,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def confirm_modify_fee(
@ -855,39 +867,39 @@ async def confirm_modify_fee(
total_fee_new: str,
fee_rate_amount: str | None = None,
) -> None:
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_modify_fee(
sign=sign,
user_fee_change=user_fee_change,
total_fee_new=total_fee_new,
)
),
"modify_fee",
ButtonRequestType.SignTx,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_modify_fee(
sign=sign,
user_fee_change=user_fee_change,
total_fee_new=total_fee_new,
)
),
"modify_fee",
ButtonRequestType.SignTx,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def confirm_coinjoin(
ctx: wire.GenericContext, coin_name: str, max_rounds: int, max_fee_per_vbyte: str
) -> None:
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_coinjoin(
coin_name=coin_name,
max_rounds=str(max_rounds),
max_feerate=f"{max_fee_per_vbyte} sats/vbyte",
)
),
"coinjoin_final",
ButtonRequestType.Other,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_coinjoin(
coin_name=coin_name,
max_rounds=str(max_rounds),
max_feerate=f"{max_fee_per_vbyte} sats/vbyte",
)
),
"coinjoin_final",
ButtonRequestType.Other,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
# TODO cleanup @ redesign
@ -907,35 +919,35 @@ async def confirm_signverify(
title = f"SIGN {coin} MESSAGE"
br_type = "sign_message"
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_blob(
title=title,
description="Confirm address:",
data=address,
)
),
br_type,
ButtonRequestType.Other,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_blob(
title=title,
description="Confirm address:",
data=address,
)
),
br_type,
ButtonRequestType.Other,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
result = await interact(
ctx,
_RustLayout(
trezorui2.confirm_blob(
title=title,
description="Confirm message:",
data=message,
)
),
br_type,
ButtonRequestType.Other,
await raise_if_not_confirmed(
interact(
ctx,
_RustLayout(
trezorui2.confirm_blob(
title=title,
description="Confirm message:",
data=message,
)
),
br_type,
ButtonRequestType.Other,
)
)
if result is not trezorui2.CONFIRMED:
raise wire.ActionCancelled
async def show_popup(
@ -946,7 +958,7 @@ async def show_popup(
timeout_ms: int = 3000,
) -> None:
if subtitle:
title += f"\n{subtitle}".format(subtitle)
title += f"\n{subtitle}"
await _RustLayout(
trezorui2.show_error(
title=title,