mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-22 14:28:07 +00:00
refactor(core): convert apps.common.sdcard to layouts
This commit is contained in:
parent
035f114125
commit
6ded531f8f
@ -1,9 +1,7 @@
|
||||
import storage.sd_salt
|
||||
from storage.sd_salt import SD_CARD_HOT_SWAPPABLE
|
||||
from trezor import fatfs, sdcard, ui, wire
|
||||
from trezor.ui.components.tt.text import Text
|
||||
|
||||
from apps.common.confirm import confirm, hold_to_confirm
|
||||
from trezor.ui.layouts import confirm_action, show_error
|
||||
|
||||
if False:
|
||||
from typing import Optional
|
||||
@ -14,60 +12,95 @@ class SdCardUnavailable(wire.ProcessError):
|
||||
|
||||
|
||||
async def _wrong_card_dialog(ctx: wire.GenericContext) -> bool:
|
||||
text = Text("SD card protection", ui.ICON_WRONG)
|
||||
text.bold("Wrong SD card.")
|
||||
text.br_half()
|
||||
if SD_CARD_HOT_SWAPPABLE:
|
||||
text.normal("Please insert the", "correct SD card for", "this device.")
|
||||
btn_confirm: Optional[str] = "Retry"
|
||||
btn_cancel = "Abort"
|
||||
return await confirm_action(
|
||||
ctx,
|
||||
"warning_wrong_sd",
|
||||
"SD card protection",
|
||||
action="Wrong SD card.",
|
||||
description="Please insert the correct SD card for this device.",
|
||||
verb="Retry",
|
||||
verb_cancel="Abort",
|
||||
icon=ui.ICON_WRONG,
|
||||
larger_vspace=True,
|
||||
)
|
||||
else:
|
||||
text.normal("Please unplug the", "device and insert the", "correct SD card.")
|
||||
btn_confirm = None
|
||||
btn_cancel = "Close"
|
||||
|
||||
return await confirm(ctx, text, confirm=btn_confirm, cancel=btn_cancel)
|
||||
return await show_error(
|
||||
ctx,
|
||||
"warning_wrong_sd",
|
||||
header="SD card protection",
|
||||
subheader="Wrong SD card.",
|
||||
content="Please unplug the\ndevice and insert the correct SD card.",
|
||||
)
|
||||
|
||||
|
||||
async def insert_card_dialog(ctx: wire.GenericContext) -> bool:
|
||||
text = Text("SD card protection", ui.ICON_WRONG)
|
||||
text.bold("SD card required.")
|
||||
text.br_half()
|
||||
if SD_CARD_HOT_SWAPPABLE:
|
||||
text.normal("Please insert your", "SD card.")
|
||||
btn_confirm: Optional[str] = "Retry"
|
||||
btn_cancel = "Abort"
|
||||
return await confirm_action(
|
||||
ctx,
|
||||
"warning_no_sd",
|
||||
"SD card protection",
|
||||
action="SD card required.",
|
||||
description="Please insert your SD card.",
|
||||
verb="Retry",
|
||||
verb_cancel="Abort",
|
||||
icon=ui.ICON_WRONG,
|
||||
larger_vspace=True,
|
||||
)
|
||||
else:
|
||||
text.normal("Please unplug the", "device and insert your", "SD card.")
|
||||
btn_confirm = None
|
||||
btn_cancel = "Close"
|
||||
|
||||
return await confirm(ctx, text, confirm=btn_confirm, cancel=btn_cancel)
|
||||
return await show_error(
|
||||
ctx,
|
||||
"warning_no_sd",
|
||||
header="SD card protection",
|
||||
subheader="SD card required.",
|
||||
content="Please unplug the\ndevice and insert your SD card.",
|
||||
)
|
||||
|
||||
|
||||
async def format_card_dialog(ctx: wire.GenericContext) -> bool:
|
||||
# Format card? yes/no
|
||||
text = Text("SD card error", ui.ICON_WRONG, ui.RED)
|
||||
text.bold("Unknown filesystem.")
|
||||
text.br_half()
|
||||
text.normal("Use a different card or")
|
||||
text.normal("format the SD card to")
|
||||
text.normal("the FAT32 filesystem.")
|
||||
if not await confirm(ctx, text, confirm="Format", cancel="Cancel"):
|
||||
if not await confirm_action(
|
||||
ctx,
|
||||
"warning_format_sd",
|
||||
"SD card error",
|
||||
action="Unknown filesystem.",
|
||||
description="Use a different card or format the SD card to the FAT32 filesystem.",
|
||||
icon=ui.ICON_WRONG,
|
||||
icon_color=ui.RED,
|
||||
verb="Format",
|
||||
verb_cancel="Cancel",
|
||||
larger_vspace=True,
|
||||
):
|
||||
return False
|
||||
|
||||
# Confirm formatting
|
||||
text = Text("Format SD card", ui.ICON_WIPE, ui.RED)
|
||||
text.normal("Do you really want to", "format the SD card?")
|
||||
text.br_half()
|
||||
text.bold("All data on the SD card", "will be lost.")
|
||||
return await hold_to_confirm(ctx, text, confirm="Format SD card")
|
||||
return await confirm_action(
|
||||
ctx,
|
||||
"confirm_format_sd",
|
||||
"Format SD card",
|
||||
action="All data on the SD card will be lost.",
|
||||
description="Do you really want to format the SD card?",
|
||||
reverse=True,
|
||||
verb="Format SD card",
|
||||
icon=ui.ICON_WIPE,
|
||||
icon_color=ui.RED,
|
||||
hold=True,
|
||||
larger_vspace=True,
|
||||
)
|
||||
|
||||
|
||||
async def sd_problem_dialog(ctx: wire.GenericContext) -> bool:
|
||||
text = Text("SD card problem", ui.ICON_WRONG, ui.RED)
|
||||
text.normal("There was a problem", "accessing the SD card.")
|
||||
return await confirm(ctx, text, confirm="Retry", cancel="Abort")
|
||||
return await confirm_action(
|
||||
ctx,
|
||||
"warning_sd_retry",
|
||||
"SD card problem",
|
||||
action=None,
|
||||
description="There was a problem accessing the SD card.",
|
||||
icon=ui.ICON_WRONG,
|
||||
icon_color=ui.RED,
|
||||
verb="Retry",
|
||||
verb_cancel="Abort",
|
||||
)
|
||||
|
||||
|
||||
async def ensure_sdcard(
|
||||
|
@ -1,13 +1,11 @@
|
||||
import storage.device
|
||||
import storage.sd_salt
|
||||
from trezor import config, ui, wire
|
||||
from trezor import config, wire
|
||||
from trezor.crypto import random
|
||||
from trezor.messages import SdProtectOperationType
|
||||
from trezor.messages.Success import Success
|
||||
from trezor.ui.components.tt.text import Text
|
||||
from trezor.ui.layouts import require, show_success
|
||||
from trezor.ui.layouts import confirm_action, require, show_success
|
||||
|
||||
from apps.common.confirm import require_confirm
|
||||
from apps.common.request_pin import (
|
||||
error_pin_invalid,
|
||||
request_pin,
|
||||
@ -167,24 +165,14 @@ async def sd_protect_refresh(ctx: wire.Context, msg: SdProtect) -> Success:
|
||||
|
||||
def require_confirm_sd_protect(ctx: wire.Context, msg: SdProtect) -> Awaitable[None]:
|
||||
if msg.operation == SdProtectOperationType.ENABLE:
|
||||
text = Text("SD card protection", ui.ICON_CONFIG)
|
||||
text.normal(
|
||||
"Do you really want to", "secure your device with", "SD card protection?"
|
||||
)
|
||||
text = "Do you really want to secure your device with SD card protection?"
|
||||
elif msg.operation == SdProtectOperationType.DISABLE:
|
||||
text = Text("SD card protection", ui.ICON_CONFIG)
|
||||
text.normal(
|
||||
"Do you really want to", "remove SD card", "protection from your", "device?"
|
||||
)
|
||||
text = "Do you really want to remove SD card protection from your device?"
|
||||
elif msg.operation == SdProtectOperationType.REFRESH:
|
||||
text = Text("SD card protection", ui.ICON_CONFIG)
|
||||
text.normal(
|
||||
"Do you really want to",
|
||||
"replace the current",
|
||||
"SD card secret with a",
|
||||
"newly generated one?",
|
||||
)
|
||||
text = "Do you really want to replace the current\nSD card secret with a newly generated one?"
|
||||
else:
|
||||
raise wire.ProcessError("Unknown operation")
|
||||
|
||||
return require_confirm(ctx, text)
|
||||
return require(
|
||||
confirm_action(ctx, "set_sd", "SD card protection", description=text)
|
||||
)
|
||||
|
@ -24,7 +24,7 @@ from ..constants.tt import (
|
||||
from .common import interact
|
||||
|
||||
if False:
|
||||
from typing import Any, Iterator, List, Sequence, Union, Optional
|
||||
from typing import Any, Iterator, List, Sequence, Union, Optional, Awaitable
|
||||
|
||||
from trezor import wire
|
||||
from trezor.messages.ButtonRequest import EnumTypeButtonRequestType
|
||||
@ -37,6 +37,7 @@ __all__ = (
|
||||
"confirm_backup",
|
||||
"confirm_path_warning",
|
||||
"show_address",
|
||||
"show_error",
|
||||
"show_pubkey",
|
||||
"show_success",
|
||||
"show_xpub",
|
||||
@ -57,24 +58,45 @@ async def confirm_action(
|
||||
ctx: wire.GenericContext,
|
||||
br_type: str,
|
||||
title: str,
|
||||
action: str,
|
||||
action: str = None,
|
||||
description: str = None,
|
||||
verb: Union[str, bytes] = Confirm.DEFAULT_CONFIRM,
|
||||
verb_cancel: Union[str, bytes] = Confirm.DEFAULT_CANCEL,
|
||||
icon: str = None,
|
||||
verb: Union[str, bytes, None] = Confirm.DEFAULT_CONFIRM,
|
||||
verb_cancel: Union[str, bytes, None] = Confirm.DEFAULT_CANCEL,
|
||||
hold: bool = False,
|
||||
icon: str = None, # TODO cleanup @ redesign
|
||||
icon_color: int = None, # TODO cleanup @ redesign
|
||||
reverse: bool = False, # TODO cleanup @ redesign
|
||||
larger_vspace: bool = False, # TODO cleanup @ redesign
|
||||
br_code: EnumTypeButtonRequestType = ButtonRequestType.Other,
|
||||
**kwargs: Any,
|
||||
) -> bool:
|
||||
text = Text(title, icon if icon is not None else ui.ICON_DEFAULT, new_lines=False)
|
||||
text.bold(action)
|
||||
text.br()
|
||||
if description:
|
||||
text = Text(
|
||||
title,
|
||||
icon if icon is not None else ui.ICON_DEFAULT,
|
||||
icon_color if icon_color is not None else ui.ORANGE_ICON,
|
||||
new_lines=False,
|
||||
)
|
||||
|
||||
if reverse and description is not None:
|
||||
text.normal(description)
|
||||
elif action is not None:
|
||||
text.bold(action)
|
||||
|
||||
if action is not None and description is not None:
|
||||
text.br()
|
||||
if larger_vspace:
|
||||
text.br_half()
|
||||
|
||||
if reverse and action is not None:
|
||||
text.bold(action)
|
||||
elif description is not None:
|
||||
text.normal(description)
|
||||
|
||||
cls = HoldToConfirm if hold else Confirm
|
||||
return is_confirmed(
|
||||
await interact(
|
||||
ctx,
|
||||
Confirm(text, confirm=verb, cancel=verb_cancel),
|
||||
cls(text, confirm=verb, cancel=verb_cancel),
|
||||
br_type,
|
||||
br_code,
|
||||
)
|
||||
@ -289,49 +311,95 @@ async def show_pubkey(
|
||||
)
|
||||
|
||||
|
||||
async def show_warning(
|
||||
async def _show_modal(
|
||||
ctx: wire.GenericContext,
|
||||
br_type: str,
|
||||
br_code: EnumTypeButtonRequestType,
|
||||
header: str,
|
||||
subheader: Optional[str],
|
||||
content: str,
|
||||
button_confirm: Optional[str],
|
||||
button_cancel: Optional[str],
|
||||
icon: str,
|
||||
icon_color: int,
|
||||
) -> bool:
|
||||
text = Text(header, icon, icon_color, new_lines=False)
|
||||
if subheader:
|
||||
text.bold(subheader)
|
||||
text.br()
|
||||
text.br_half()
|
||||
text.normal(content)
|
||||
return is_confirmed(
|
||||
await interact(
|
||||
ctx,
|
||||
Confirm(text, confirm=button_confirm, cancel=button_cancel),
|
||||
br_type,
|
||||
br_code,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def show_error(
|
||||
ctx: wire.GenericContext,
|
||||
br_type: str,
|
||||
content: str,
|
||||
header: str = "Error",
|
||||
subheader: Optional[str] = None,
|
||||
button: str = "Close",
|
||||
) -> Awaitable[bool]:
|
||||
return _show_modal(
|
||||
ctx,
|
||||
br_type=br_type,
|
||||
br_code=ButtonRequestType.Other,
|
||||
header=header,
|
||||
subheader=subheader,
|
||||
content=content,
|
||||
button_confirm=None,
|
||||
button_cancel=button,
|
||||
icon=ui.ICON_WRONG,
|
||||
icon_color=ui.ORANGE_ICON,
|
||||
)
|
||||
|
||||
|
||||
def show_warning(
|
||||
ctx: wire.GenericContext,
|
||||
br_type: str,
|
||||
content: str,
|
||||
subheader: Optional[str] = None,
|
||||
button: str = "Try again",
|
||||
) -> bool:
|
||||
text = Text("Warning", ui.ICON_WRONG, ui.RED, new_lines=False)
|
||||
if subheader:
|
||||
text.bold(subheader)
|
||||
text.br()
|
||||
text.br_half()
|
||||
text.normal(content)
|
||||
return is_confirmed(
|
||||
await interact(
|
||||
ctx,
|
||||
Confirm(text, confirm=button, cancel=None),
|
||||
br_type,
|
||||
ButtonRequestType.Warning,
|
||||
)
|
||||
) -> Awaitable[bool]:
|
||||
return _show_modal(
|
||||
ctx,
|
||||
br_type=br_type,
|
||||
br_code=ButtonRequestType.Warning,
|
||||
header="Warning",
|
||||
subheader=subheader,
|
||||
content=content,
|
||||
button_confirm=button,
|
||||
button_cancel=None,
|
||||
icon=ui.ICON_WRONG,
|
||||
icon_color=ui.RED,
|
||||
)
|
||||
|
||||
|
||||
async def show_success(
|
||||
def show_success(
|
||||
ctx: wire.GenericContext,
|
||||
br_type: str,
|
||||
content: str,
|
||||
subheader: Optional[str] = None,
|
||||
button: str = "Continue",
|
||||
) -> bool:
|
||||
text = Text("Success", ui.ICON_CONFIRM, ui.GREEN, new_lines=False)
|
||||
if subheader:
|
||||
text.bold(subheader)
|
||||
text.br()
|
||||
text.br_half()
|
||||
text.normal(content)
|
||||
return is_confirmed(
|
||||
await interact(
|
||||
ctx,
|
||||
Confirm(text, confirm=button, cancel=None),
|
||||
br_type,
|
||||
ButtonRequestType.Success,
|
||||
)
|
||||
) -> Awaitable[bool]:
|
||||
return _show_modal(
|
||||
ctx,
|
||||
br_type=br_type,
|
||||
br_code=ButtonRequestType.Success,
|
||||
header="Success",
|
||||
subheader=subheader,
|
||||
content=content,
|
||||
button_confirm=button,
|
||||
button_cancel=None,
|
||||
icon=ui.ICON_CONFIRM,
|
||||
icon_color=ui.GREEN,
|
||||
)
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user