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:
parent
b439b536a1
commit
a3aae9c234
@ -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()
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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")
|
||||||
|
@ -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.
|
||||||
|
@ -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")
|
||||||
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user