1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-24 15:28:10 +00:00

xmr.ui: improves UX of the monero app

Based on the testing feedback I've made slight modifications to the UI.
Main points:

- running on the full brightness during the process (previously dimmed, felt broken)
- overlaying layout fix after transaction confirmation
This commit is contained in:
Dusan Klinec 2019-04-22 00:44:55 +02:00
parent b439b536a1
commit a3aae9c234
No known key found for this signature in database
GPG Key ID: 6337E118CCBCE103
10 changed files with 48 additions and 36 deletions

View File

@ -42,7 +42,7 @@ async def require_confirm_tx_key(ctx, export_key=False):
return await require_confirm(ctx, content, ButtonRequestType.SignTx) return await require_confirm(ctx, content, ButtonRequestType.SignTx)
async def require_confirm_transaction(ctx, tsx_data, network_type): async def require_confirm_transaction(ctx, state, tsx_data, network_type):
""" """
Ask for confirmation from user. Ask for confirmation from user.
""" """
@ -70,10 +70,7 @@ async def require_confirm_transaction(ctx, tsx_data, network_type):
await _require_confirm_payment_id(ctx, tsx_data.payment_id) await _require_confirm_payment_id(ctx, tsx_data.payment_id)
await _require_confirm_fee(ctx, tsx_data.fee) await _require_confirm_fee(ctx, tsx_data.fee)
await transaction_step(state, 0)
text = Text("Signing transaction", ui.ICON_SEND, icon_color=ui.BLUE)
text.normal("Signing...")
text.render()
async def _require_confirm_output(ctx, dst, network_type, payment_id): async def _require_confirm_output(ctx, dst, network_type, payment_id):
@ -119,46 +116,60 @@ async def _require_confirm_fee(ctx, fee):
await require_hold_to_confirm(ctx, content, ButtonRequestType.ConfirmOutput) await require_hold_to_confirm(ctx, content, ButtonRequestType.ConfirmOutput)
@ui.layout @ui.layout_no_slide
async def transaction_step(ctx, step, sub_step=None, sub_step_total=None): async def transaction_step(state, step, sub_step=None):
info = [] info = []
if step == 100: if step == 0:
info = ["Processing inputs", "%d/%d" % (sub_step + 1, sub_step_total)] info = ["Signing..."]
elif step == 100:
info = ["Processing inputs", "%d/%d" % (sub_step + 1, state.input_count)]
elif step == 200: elif step == 200:
info = ["Sorting"] info = ["Sorting..."]
elif step == 300: elif step == 300:
info = [ info = ["Hashing inputs", "%d/%d" % (sub_step + 1, state.input_count)]
"Processing inputs", elif step == 350:
"phase 2", info = ["Processing..."]
"%d/%d" % (sub_step + 1, sub_step_total),
]
elif step == 400: elif step == 400:
info = ["Processing outputs", "%d/%d" % (sub_step + 1, sub_step_total)] info = ["Processing outputs", "%d/%d" % (sub_step + 1, state.output_count)]
elif step == 500: elif step == 500:
info = ["Postprocessing..."] info = ["Postprocessing..."]
elif step == 600: elif step == 600:
info = ["Signing inputs", "%d/%d" % (sub_step + 1, sub_step_total)] info = ["Signing inputs", "%d/%d" % (sub_step + 1, state.input_count)]
else: else:
info = ["Processing..."] info = ["Processing..."]
state.progress_cur += 1
ui.display.clear()
text = Text("Signing transaction", ui.ICON_SEND, icon_color=ui.BLUE) text = Text("Signing transaction", ui.ICON_SEND, icon_color=ui.BLUE)
text.normal(*info)
text.render() text.render()
p = int(1000.0 * state.progress_cur / state.progress_total)
ui.display.loader(p, -4, ui.WHITE, ui.BG)
ui.display.text_center(ui.WIDTH // 2, 210, info[0], ui.NORMAL, ui.FG, ui.BG)
if len(info) > 1:
ui.display.text_center(ui.WIDTH // 2, 235, info[1], ui.NORMAL, ui.FG, ui.BG)
ui.display.refresh()
@ui.layout
@ui.layout_no_slide
async def keyimage_sync_step(ctx, current, total_num): async def keyimage_sync_step(ctx, current, total_num):
if current is None: if current is None:
return return
ui.display.clear()
text = Text("Syncing", ui.ICON_SEND, icon_color=ui.BLUE) text = Text("Syncing", ui.ICON_SEND, icon_color=ui.BLUE)
text.normal("%d/%d" % (current + 1, total_num))
text.render() text.render()
p = (int(1000.0 * (current + 1) / total_num)) if total_num > 0 else 0
ui.display.loader(p, 18, ui.WHITE, ui.BG)
ui.display.refresh()
@ui.layout
@ui.layout_no_slide
async def live_refresh_step(ctx, current): async def live_refresh_step(ctx, current):
if current is None: if current is None:
return return
ui.display.clear()
text = Text("Refreshing", ui.ICON_SEND, icon_color=ui.BLUE) text = Text("Refreshing", ui.ICON_SEND, icon_color=ui.BLUE)
text.normal("%d" % current) text.normal("%d" % current)
text.render() text.render()

View File

@ -68,6 +68,9 @@ class State:
self.input_count = 0 self.input_count = 0
self.output_count = 0 self.output_count = 0
self.progress_total = 0
self.progress_cur = 0
self.output_change = None self.output_change = None
self.fee = 0 self.fee = 0

View File

@ -36,16 +36,19 @@ async def init_transaction(
state.mem_trace(1) state.mem_trace(1)
state.input_count = tsx_data.num_inputs
state.output_count = len(tsx_data.outputs)
state.progress_total = 4 + 3 * state.input_count + state.output_count
state.progress_cur = 0
# Ask for confirmation # Ask for confirmation
await confirms.require_confirm_transaction( await confirms.require_confirm_transaction(
state.ctx, tsx_data, state.creds.network_type state.ctx, state, tsx_data, state.creds.network_type
) )
gc.collect() gc.collect()
state.mem_trace(3) state.mem_trace(3)
# Basic transaction parameters # Basic transaction parameters
state.input_count = tsx_data.num_inputs
state.output_count = len(tsx_data.outputs)
state.output_change = tsx_data.change_dts state.output_change = tsx_data.change_dts
state.mixin = tsx_data.mixin state.mixin = tsx_data.mixin
state.fee = tsx_data.fee state.fee = tsx_data.fee

View File

@ -32,9 +32,7 @@ async def set_input(state: State, src_entr: MoneroTransactionSourceEntry):
state.current_input_index += 1 state.current_input_index += 1
await confirms.transaction_step( await confirms.transaction_step(state, state.STEP_INP, state.current_input_index)
state.ctx, state.STEP_INP, state.current_input_index, state.input_count
)
if state.current_input_index >= state.input_count: if state.current_input_index >= state.input_count:
raise ValueError("Too many inputs") raise ValueError("Too many inputs")

View File

@ -21,7 +21,7 @@ async def tsx_inputs_permutation(state: State, permutation: list):
MoneroTransactionInputsPermutationAck, MoneroTransactionInputsPermutationAck,
) )
await transaction_step(state.ctx, state.STEP_PERM) await transaction_step(state, state.STEP_PERM)
""" """
Set permutation on the inputs - sorted by key image on host. Set permutation on the inputs - sorted by key image on host.

View File

@ -33,7 +33,7 @@ async def input_vini(
) )
await confirms.transaction_step( await confirms.transaction_step(
state.ctx, state.STEP_VINI, state.current_input_index + 1, state.input_count state, state.STEP_VINI, state.current_input_index + 1
) )
if state.current_input_index >= state.input_count: if state.current_input_index >= state.input_count:
raise ValueError("Too many inputs") raise ValueError("Too many inputs")

View File

@ -12,7 +12,7 @@ from apps.monero.xmr import crypto
async def all_inputs_set(state: State): async def all_inputs_set(state: State):
state.mem_trace(0) state.mem_trace(0)
await confirms.transaction_step(state.ctx, state.STEP_ALL_IN) await confirms.transaction_step(state, state.STEP_ALL_IN)
from trezor.messages.MoneroTransactionAllInputsSetAck import ( from trezor.messages.MoneroTransactionAllInputsSetAck import (
MoneroTransactionAllInputsSetAck, MoneroTransactionAllInputsSetAck,

View File

@ -23,10 +23,7 @@ async def set_output(
# Progress update only for master message (skip for offloaded BP msg) # Progress update only for master message (skip for offloaded BP msg)
if not is_offloaded_bp: if not is_offloaded_bp:
await confirms.transaction_step( await confirms.transaction_step(
state.ctx, state, state.STEP_OUT, state.current_output_index + 1
state.STEP_OUT,
state.current_output_index + 1,
state.output_count,
) )
state.mem_trace(1, True) state.mem_trace(1, True)

View File

@ -18,7 +18,7 @@ from apps.monero.xmr import crypto
async def all_outputs_set(state: State): async def all_outputs_set(state: State):
state.mem_trace(0) state.mem_trace(0)
await confirms.transaction_step(state.ctx, state.STEP_ALL_OUT) await confirms.transaction_step(state, state.STEP_ALL_OUT)
state.mem_trace(1) state.mem_trace(1)
_validate(state) _validate(state)

View File

@ -48,7 +48,7 @@ async def sign_input(
:return: Generated signature MGs[i] :return: Generated signature MGs[i]
""" """
await confirms.transaction_step( await confirms.transaction_step(
state.ctx, state.STEP_SIGN, state.current_input_index + 1, state.input_count state, state.STEP_SIGN, state.current_input_index + 1
) )
state.current_input_index += 1 state.current_input_index += 1