1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-12 10:39:00 +00:00
trezor-firmware/core/src/apps/common/confirm.py

117 lines
3.8 KiB
Python
Raw Normal View History

2019-05-13 13:06:34 +00:00
from trezor import wire
2019-07-03 13:07:04 +00:00
from trezor.messages import ButtonRequestType
2019-09-19 07:37:23 +00:00
from trezor.ui.confirm import CONFIRMED, INFO, Confirm, HoldToConfirm, InfoConfirm
from . import button_request
2019-05-13 13:06:34 +00:00
if __debug__:
2019-10-02 12:40:25 +00:00
from trezor.ui.scroll import Paginated
2019-07-03 13:07:04 +00:00
if False:
2019-10-18 12:36:40 +00:00
from typing import Any, Callable, Optional
2019-07-03 13:07:04 +00:00
from trezor import ui
from trezor.ui.confirm import ButtonContent, ButtonStyleType
from trezor.ui.loader import LoaderStyleType
2019-10-02 12:40:25 +00:00
from trezor.messages.ButtonRequest import EnumTypeButtonRequestType
2019-07-03 13:07:04 +00:00
2019-05-13 13:06:34 +00:00
async def confirm(
ctx: wire.GenericContext,
content: ui.Component,
2019-10-02 12:40:25 +00:00
code: EnumTypeButtonRequestType = ButtonRequestType.Other,
2019-10-18 12:36:40 +00:00
confirm: Optional[ButtonContent] = Confirm.DEFAULT_CONFIRM,
2019-07-03 13:07:04 +00:00
confirm_style: ButtonStyleType = Confirm.DEFAULT_CONFIRM_STYLE,
2019-10-18 12:36:40 +00:00
cancel: Optional[ButtonContent] = Confirm.DEFAULT_CANCEL,
2019-07-03 13:07:04 +00:00
cancel_style: ButtonStyleType = Confirm.DEFAULT_CANCEL_STYLE,
major_confirm: bool = False,
) -> bool:
await button_request(ctx, code=code)
2017-09-16 13:00:31 +00:00
2019-05-13 13:06:34 +00:00
if content.__class__.__name__ == "Paginated":
2019-10-02 12:40:25 +00:00
# The following works because asserts are omitted in non-debug builds.
# IOW if the assert runs, that means __debug__ is True and Paginated is imported
assert isinstance(content, Paginated)
2019-05-13 13:06:34 +00:00
content.pages[-1] = Confirm(
content.pages[-1],
confirm,
confirm_style,
cancel,
cancel_style,
major_confirm,
2019-05-13 13:06:34 +00:00
)
2019-10-02 12:40:25 +00:00
dialog = content # type: ui.Layout
2019-05-13 13:06:34 +00:00
else:
dialog = Confirm(
content, confirm, confirm_style, cancel, cancel_style, major_confirm
)
return await ctx.wait(dialog) is CONFIRMED
2016-09-26 11:06:28 +00:00
2019-09-19 07:37:23 +00:00
async def info_confirm(
ctx: wire.GenericContext,
2019-09-19 07:37:23 +00:00
content: ui.Component,
info_func: Callable,
2019-10-02 12:40:25 +00:00
code: EnumTypeButtonRequestType = ButtonRequestType.Other,
2019-09-19 07:37:23 +00:00
confirm: ButtonContent = InfoConfirm.DEFAULT_CONFIRM,
confirm_style: ButtonStyleType = InfoConfirm.DEFAULT_CONFIRM_STYLE,
cancel: ButtonContent = InfoConfirm.DEFAULT_CANCEL,
cancel_style: ButtonStyleType = InfoConfirm.DEFAULT_CANCEL_STYLE,
info: ButtonContent = InfoConfirm.DEFAULT_INFO,
info_style: ButtonStyleType = InfoConfirm.DEFAULT_INFO_STYLE,
) -> bool:
await button_request(ctx, code=code)
2019-09-19 07:37:23 +00:00
dialog = InfoConfirm(
content, confirm, confirm_style, cancel, cancel_style, info, info_style
)
while True:
result = await ctx.wait(dialog)
2019-09-19 07:37:23 +00:00
if result is INFO:
await info_func(ctx)
else:
return result is CONFIRMED
2019-05-13 13:06:34 +00:00
async def hold_to_confirm(
ctx: wire.GenericContext,
content: ui.Component,
2019-10-02 12:40:25 +00:00
code: EnumTypeButtonRequestType = ButtonRequestType.Other,
confirm: str = HoldToConfirm.DEFAULT_CONFIRM,
2019-07-15 12:16:49 +00:00
confirm_style: ButtonStyleType = HoldToConfirm.DEFAULT_CONFIRM_STYLE,
2019-07-03 13:07:04 +00:00
loader_style: LoaderStyleType = HoldToConfirm.DEFAULT_LOADER_STYLE,
cancel: bool = True,
2019-07-03 13:07:04 +00:00
) -> bool:
await button_request(ctx, code=code)
2017-09-16 13:00:31 +00:00
2019-05-13 13:06:34 +00:00
if content.__class__.__name__ == "Paginated":
2019-10-02 12:40:25 +00:00
# The following works because asserts are omitted in non-debug builds.
# IOW if the assert runs, that means __debug__ is True and Paginated is imported
assert isinstance(content, Paginated)
2019-05-13 13:06:34 +00:00
content.pages[-1] = HoldToConfirm(
content.pages[-1], confirm, confirm_style, loader_style, cancel
2019-05-13 13:06:34 +00:00
)
2019-10-02 12:40:25 +00:00
dialog = content # type: ui.Layout
2019-05-13 13:06:34 +00:00
else:
dialog = HoldToConfirm(content, confirm, confirm_style, loader_style, cancel)
return await ctx.wait(dialog) is CONFIRMED
2019-07-03 13:07:04 +00:00
async def require_confirm(*args: Any, **kwargs: Any) -> None:
2016-09-26 11:06:28 +00:00
confirmed = await confirm(*args, **kwargs)
if not confirmed:
raise wire.ActionCancelled
2019-07-03 13:07:04 +00:00
async def require_hold_to_confirm(*args: Any, **kwargs: Any) -> None:
confirmed = await hold_to_confirm(*args, **kwargs)
if not confirmed:
raise wire.ActionCancelled