EIP712 verbose mode "Struct review" visual glitch fix

This commit is contained in:
Alexandre Paillier
2022-11-18 11:26:06 +01:00
parent b135e55b06
commit fb1e1b2f78
3 changed files with 34 additions and 21 deletions

View File

@@ -7,19 +7,25 @@ enum { UI_712_POS_REVIEW, UI_712_POS_END };
static uint8_t ui_pos;
static void dummy_cb(void) {
if (!ui_712_next_field()) {
if (ui_pos == UI_712_POS_REVIEW) {
ux_flow_next();
ui_pos = UI_712_POS_END;
} else // UI_712_POS_END
{
ux_flow_prev();
ui_pos = UI_712_POS_REVIEW;
}
} else {
// temporarily disable button clicks, they will be re-enabled as soon as new data
// is received and the page is redrawn with ux_flow_init()
G_ux.stack[0].button_push_callback = NULL;
switch (ui_712_next_field()) {
case EIP712_NO_MORE_FIELD:
if (ui_pos == UI_712_POS_REVIEW) {
ux_flow_next();
ui_pos = UI_712_POS_END;
} else // UI_712_POS_END
{
ux_flow_prev();
ui_pos = UI_712_POS_REVIEW;
}
break;
case EIP712_FIELD_INCOMING:
// temporarily disable button clicks, they will be re-enabled as soon as new data
// is received and the page is redrawn with ux_flow_init()
G_ux.stack[0].button_push_callback = NULL;
break;
case EIP712_FIELD_LATER:
default:
break;
}
}

View File

@@ -115,10 +115,12 @@ void ui_712_redraw_generic_step(void) {
/**
* Called to fetch the next field if they have not all been processed yet
*
* @return whether there will be a next field
* Also handles the special "Review struct" screen of the verbose mode
*
* @return the next field state
*/
bool ui_712_next_field(void) {
bool next = false;
e_eip712_nfs ui_712_next_field(void) {
e_eip712_nfs state = EIP712_NO_MORE_FIELD;
if (ui_ctx == NULL) {
apdu_response_code = APDU_RESPONSE_CONDITION_NOT_SATISFIED;
@@ -126,13 +128,13 @@ bool ui_712_next_field(void) {
if (ui_ctx->structs_to_review > 0) {
ui_712_review_struct(path_get_nth_field_to_last(ui_ctx->structs_to_review));
ui_ctx->structs_to_review -= 1;
}
if (!ui_ctx->end_reached) {
state = EIP712_FIELD_LATER;
} else if (!ui_ctx->end_reached) {
handle_eip712_return_code(true);
next = true;
state = EIP712_FIELD_INCOMING;
}
}
return next;
return state;
}
/**

View File

@@ -10,6 +10,11 @@
#define UI_712_FIELD_NAME_PROVIDED (1 << 1)
typedef enum { EIP712_FILTERING_BASIC, EIP712_FILTERING_FULL } e_eip712_filtering_mode;
typedef enum {
EIP712_FIELD_LATER,
EIP712_FIELD_INCOMING,
EIP712_NO_MORE_FIELD
} e_eip712_nfs; // next field state
typedef struct {
bool shown;
@@ -22,7 +27,7 @@ typedef struct {
bool ui_712_init(void);
void ui_712_deinit(void);
bool ui_712_next_field(void);
e_eip712_nfs ui_712_next_field(void);
void ui_712_review_struct(const void *const struct_ptr);
bool ui_712_new_field(const void *const field_ptr, const uint8_t *const data, uint8_t length);
void ui_712_end_sign(void);