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

refactor(core): convert apps.common.sdcard to layouts

This commit is contained in:
Martin Milata 2021-02-10 18:36:08 +01:00
parent 035f114125
commit 6ded531f8f
3 changed files with 189 additions and 100 deletions

View File

@ -1,9 +1,7 @@
import storage.sd_salt import storage.sd_salt
from storage.sd_salt import SD_CARD_HOT_SWAPPABLE from storage.sd_salt import SD_CARD_HOT_SWAPPABLE
from trezor import fatfs, sdcard, ui, wire from trezor import fatfs, sdcard, ui, wire
from trezor.ui.components.tt.text import Text from trezor.ui.layouts import confirm_action, show_error
from apps.common.confirm import confirm, hold_to_confirm
if False: if False:
from typing import Optional from typing import Optional
@ -14,60 +12,95 @@ class SdCardUnavailable(wire.ProcessError):
async def _wrong_card_dialog(ctx: wire.GenericContext) -> bool: 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: if SD_CARD_HOT_SWAPPABLE:
text.normal("Please insert the", "correct SD card for", "this device.") return await confirm_action(
btn_confirm: Optional[str] = "Retry" ctx,
btn_cancel = "Abort" "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: else:
text.normal("Please unplug the", "device and insert the", "correct SD card.") return await show_error(
btn_confirm = None ctx,
btn_cancel = "Close" "warning_wrong_sd",
header="SD card protection",
return await confirm(ctx, text, confirm=btn_confirm, cancel=btn_cancel) subheader="Wrong SD card.",
content="Please unplug the\ndevice and insert the correct SD card.",
)
async def insert_card_dialog(ctx: wire.GenericContext) -> bool: 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: if SD_CARD_HOT_SWAPPABLE:
text.normal("Please insert your", "SD card.") return await confirm_action(
btn_confirm: Optional[str] = "Retry" ctx,
btn_cancel = "Abort" "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: else:
text.normal("Please unplug the", "device and insert your", "SD card.") return await show_error(
btn_confirm = None ctx,
btn_cancel = "Close" "warning_no_sd",
header="SD card protection",
return await confirm(ctx, text, confirm=btn_confirm, cancel=btn_cancel) subheader="SD card required.",
content="Please unplug the\ndevice and insert your SD card.",
)
async def format_card_dialog(ctx: wire.GenericContext) -> bool: async def format_card_dialog(ctx: wire.GenericContext) -> bool:
# Format card? yes/no # Format card? yes/no
text = Text("SD card error", ui.ICON_WRONG, ui.RED) if not await confirm_action(
text.bold("Unknown filesystem.") ctx,
text.br_half() "warning_format_sd",
text.normal("Use a different card or") "SD card error",
text.normal("format the SD card to") action="Unknown filesystem.",
text.normal("the FAT32 filesystem.") description="Use a different card or format the SD card to the FAT32 filesystem.",
if not await confirm(ctx, text, confirm="Format", cancel="Cancel"): icon=ui.ICON_WRONG,
icon_color=ui.RED,
verb="Format",
verb_cancel="Cancel",
larger_vspace=True,
):
return False return False
# Confirm formatting # Confirm formatting
text = Text("Format SD card", ui.ICON_WIPE, ui.RED) return await confirm_action(
text.normal("Do you really want to", "format the SD card?") ctx,
text.br_half() "confirm_format_sd",
text.bold("All data on the SD card", "will be lost.") "Format SD card",
return await hold_to_confirm(ctx, text, confirm="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: async def sd_problem_dialog(ctx: wire.GenericContext) -> bool:
text = Text("SD card problem", ui.ICON_WRONG, ui.RED) return await confirm_action(
text.normal("There was a problem", "accessing the SD card.") ctx,
return await confirm(ctx, text, confirm="Retry", cancel="Abort") "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( async def ensure_sdcard(

View File

@ -1,13 +1,11 @@
import storage.device import storage.device
import storage.sd_salt import storage.sd_salt
from trezor import config, ui, wire from trezor import config, wire
from trezor.crypto import random from trezor.crypto import random
from trezor.messages import SdProtectOperationType from trezor.messages import SdProtectOperationType
from trezor.messages.Success import Success from trezor.messages.Success import Success
from trezor.ui.components.tt.text import Text from trezor.ui.layouts import confirm_action, require, show_success
from trezor.ui.layouts import require, show_success
from apps.common.confirm import require_confirm
from apps.common.request_pin import ( from apps.common.request_pin import (
error_pin_invalid, error_pin_invalid,
request_pin, 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]: def require_confirm_sd_protect(ctx: wire.Context, msg: SdProtect) -> Awaitable[None]:
if msg.operation == SdProtectOperationType.ENABLE: if msg.operation == SdProtectOperationType.ENABLE:
text = Text("SD card protection", ui.ICON_CONFIG) text = "Do you really want to secure your device with SD card protection?"
text.normal(
"Do you really want to", "secure your device with", "SD card protection?"
)
elif msg.operation == SdProtectOperationType.DISABLE: elif msg.operation == SdProtectOperationType.DISABLE:
text = Text("SD card protection", ui.ICON_CONFIG) text = "Do you really want to remove SD card protection from your device?"
text.normal(
"Do you really want to", "remove SD card", "protection from your", "device?"
)
elif msg.operation == SdProtectOperationType.REFRESH: elif msg.operation == SdProtectOperationType.REFRESH:
text = Text("SD card protection", ui.ICON_CONFIG) text = "Do you really want to replace the current\nSD card secret with a newly generated one?"
text.normal(
"Do you really want to",
"replace the current",
"SD card secret with a",
"newly generated one?",
)
else: else:
raise wire.ProcessError("Unknown operation") raise wire.ProcessError("Unknown operation")
return require_confirm(ctx, text) return require(
confirm_action(ctx, "set_sd", "SD card protection", description=text)
)

View File

@ -24,7 +24,7 @@ from ..constants.tt import (
from .common import interact from .common import interact
if False: 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 import wire
from trezor.messages.ButtonRequest import EnumTypeButtonRequestType from trezor.messages.ButtonRequest import EnumTypeButtonRequestType
@ -37,6 +37,7 @@ __all__ = (
"confirm_backup", "confirm_backup",
"confirm_path_warning", "confirm_path_warning",
"show_address", "show_address",
"show_error",
"show_pubkey", "show_pubkey",
"show_success", "show_success",
"show_xpub", "show_xpub",
@ -57,24 +58,45 @@ async def confirm_action(
ctx: wire.GenericContext, ctx: wire.GenericContext,
br_type: str, br_type: str,
title: str, title: str,
action: str, action: str = None,
description: str = None, description: str = None,
verb: Union[str, bytes] = Confirm.DEFAULT_CONFIRM, verb: Union[str, bytes, None] = Confirm.DEFAULT_CONFIRM,
verb_cancel: Union[str, bytes] = Confirm.DEFAULT_CANCEL, verb_cancel: Union[str, bytes, None] = Confirm.DEFAULT_CANCEL,
icon: str = None, 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, br_code: EnumTypeButtonRequestType = ButtonRequestType.Other,
**kwargs: Any, **kwargs: Any,
) -> bool: ) -> bool:
text = Text(title, icon if icon is not None else ui.ICON_DEFAULT, new_lines=False) 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) text.bold(action)
if action is not None and description is not None:
text.br() text.br()
if description: if larger_vspace:
text.br_half()
if reverse and action is not None:
text.bold(action)
elif description is not None:
text.normal(description) text.normal(description)
cls = HoldToConfirm if hold else Confirm
return is_confirmed( return is_confirmed(
await interact( await interact(
ctx, ctx,
Confirm(text, confirm=verb, cancel=verb_cancel), cls(text, confirm=verb, cancel=verb_cancel),
br_type, br_type,
br_code, 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, ctx: wire.GenericContext,
br_type: str, br_type: str,
content: str, content: str,
subheader: Optional[str] = None, subheader: Optional[str] = None,
button: str = "Try again", button: str = "Try again",
) -> bool: ) -> Awaitable[bool]:
text = Text("Warning", ui.ICON_WRONG, ui.RED, new_lines=False) return _show_modal(
if subheader:
text.bold(subheader)
text.br()
text.br_half()
text.normal(content)
return is_confirmed(
await interact(
ctx, ctx,
Confirm(text, confirm=button, cancel=None), br_type=br_type,
br_type, br_code=ButtonRequestType.Warning,
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, ctx: wire.GenericContext,
br_type: str, br_type: str,
content: str, content: str,
subheader: Optional[str] = None, subheader: Optional[str] = None,
button: str = "Continue", button: str = "Continue",
) -> bool: ) -> Awaitable[bool]:
text = Text("Success", ui.ICON_CONFIRM, ui.GREEN, new_lines=False) return _show_modal(
if subheader:
text.bold(subheader)
text.br()
text.br_half()
text.normal(content)
return is_confirmed(
await interact(
ctx, ctx,
Confirm(text, confirm=button, cancel=None), br_type=br_type,
br_type, br_code=ButtonRequestType.Success,
ButtonRequestType.Success, header="Success",
) subheader=subheader,
content=content,
button_confirm=button,
button_cancel=None,
icon=ui.ICON_CONFIRM,
icon_color=ui.GREEN,
) )