mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-04-20 00:59:02 +00:00
fix(eckhart): fix last pending char for max len passphrase
This commit is contained in:
parent
344bbd4f56
commit
68337ec628
@ -34,12 +34,20 @@ pub enum ButtonState {
|
||||
const KEYPAD_MAX_KEYS: usize = 10;
|
||||
type KeypadKeys = [Maybe<Button>; KEYPAD_MAX_KEYS];
|
||||
|
||||
/// Represents the state of a keypad, including individual button states.
|
||||
pub struct KeypadState {
|
||||
/// State of the "Back" button.
|
||||
pub back: ButtonState,
|
||||
/// State of the "Erase" button.
|
||||
pub erase: ButtonState,
|
||||
/// State of the "Cancel" button.
|
||||
pub cancel: ButtonState,
|
||||
/// State of the "Confirm" button.
|
||||
pub confirm: ButtonState,
|
||||
/// Common state of the keypad generic keys.
|
||||
pub keys: ButtonState,
|
||||
/// Optional override for one key, containing the index and state.
|
||||
pub override_key: Option<(usize, ButtonState)>,
|
||||
}
|
||||
|
||||
pub struct Keypad {
|
||||
@ -167,7 +175,7 @@ impl Keypad {
|
||||
Self::apply_button_state(&mut self.erase, &state.erase, ctx);
|
||||
Self::apply_button_state(&mut self.cancel, &state.cancel, ctx);
|
||||
Self::apply_button_state(&mut self.confirm, &state.confirm, ctx);
|
||||
self.set_keys_state(ctx, &state.keys);
|
||||
self.set_keys_state(ctx, &state.keys, state.override_key);
|
||||
}
|
||||
|
||||
/// Set the content of a key at the specified index.
|
||||
@ -221,11 +229,31 @@ impl Keypad {
|
||||
}
|
||||
}
|
||||
|
||||
/// Set the state of all key buttons
|
||||
pub fn set_keys_state(&mut self, ctx: &mut EventCtx, state: &ButtonState) {
|
||||
for btn in self.keys.iter_mut() {
|
||||
/// Sets the state of all key buttons, except for an optional override key.
|
||||
pub fn set_keys_state(
|
||||
&mut self,
|
||||
ctx: &mut EventCtx,
|
||||
state: &ButtonState,
|
||||
override_key: Option<(usize, ButtonState)>,
|
||||
) {
|
||||
// Apply the state to all keys except the override key.
|
||||
for (idx, btn) in self.keys.iter_mut().enumerate() {
|
||||
if let Some((override_idx, _)) = override_key {
|
||||
if override_idx == idx {
|
||||
continue; // Skip setting the state for the override key
|
||||
}
|
||||
}
|
||||
Self::apply_button_state(btn, state, ctx);
|
||||
}
|
||||
|
||||
// Apply the override state if any.
|
||||
if let Some((override_idx, override_state)) = override_key {
|
||||
Self::apply_button_state(
|
||||
self.get_button_mut(&KeypadButton::Key(override_idx)),
|
||||
&override_state,
|
||||
ctx,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/// Set the state of one keypad button.
|
||||
|
@ -210,17 +210,31 @@ impl PassphraseKeyboard {
|
||||
cancel: ButtonState::Hidden,
|
||||
confirm: ButtonState::Disabled,
|
||||
keys: ButtonState::Disabled,
|
||||
override_key: None,
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
if self.passphrase().len() == MAX_LENGTH {
|
||||
// Disable all except of confirm and erase buttons
|
||||
KeypadState {
|
||||
back: ButtonState::Hidden,
|
||||
erase: ButtonState::Enabled,
|
||||
cancel: ButtonState::Hidden,
|
||||
confirm: ButtonState::Enabled,
|
||||
keys: ButtonState::Disabled,
|
||||
if let Some(pending_key) = self.multi_tap.pending_key() {
|
||||
// Disable all except of confirm, erase and the pending key
|
||||
KeypadState {
|
||||
back: ButtonState::Hidden,
|
||||
erase: ButtonState::Enabled,
|
||||
cancel: ButtonState::Hidden,
|
||||
confirm: ButtonState::Enabled,
|
||||
keys: ButtonState::Disabled,
|
||||
override_key: Some((pending_key, ButtonState::Enabled)),
|
||||
}
|
||||
} else {
|
||||
// Disable all except of confirm and erase buttons
|
||||
KeypadState {
|
||||
back: ButtonState::Hidden,
|
||||
erase: ButtonState::Enabled,
|
||||
cancel: ButtonState::Hidden,
|
||||
confirm: ButtonState::Enabled,
|
||||
keys: ButtonState::Disabled,
|
||||
override_key: None,
|
||||
}
|
||||
}
|
||||
} else if self.input.textbox.is_empty() {
|
||||
// Disable all except of confirm and erase buttons
|
||||
@ -230,6 +244,7 @@ impl PassphraseKeyboard {
|
||||
cancel: ButtonState::Hidden,
|
||||
confirm: ButtonState::Enabled,
|
||||
keys: ButtonState::Enabled,
|
||||
override_key: None,
|
||||
}
|
||||
} else {
|
||||
KeypadState {
|
||||
@ -238,6 +253,7 @@ impl PassphraseKeyboard {
|
||||
cancel: ButtonState::Hidden,
|
||||
confirm: ButtonState::Enabled,
|
||||
keys: ButtonState::Enabled,
|
||||
override_key: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -292,6 +308,7 @@ impl Component for PassphraseKeyboard {
|
||||
.last_char_timer
|
||||
.start(ctx, Duration::from_secs(LAST_DIGIT_TIMEOUT_S));
|
||||
self.input.marker = false;
|
||||
self.update_keypad_state(ctx);
|
||||
return None;
|
||||
}
|
||||
|
||||
|
@ -73,6 +73,7 @@ impl<'a> PinKeyboard<'a> {
|
||||
cancel: ButtonState::Hidden,
|
||||
confirm: ButtonState::Disabled,
|
||||
keys: ButtonState::Disabled,
|
||||
override_key: None,
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
@ -84,6 +85,7 @@ impl<'a> PinKeyboard<'a> {
|
||||
cancel: ButtonState::Hidden,
|
||||
confirm: ButtonState::Enabled,
|
||||
keys: ButtonState::Disabled,
|
||||
override_key: None,
|
||||
}
|
||||
} else if self.input.is_empty() {
|
||||
KeypadState {
|
||||
@ -96,6 +98,7 @@ impl<'a> PinKeyboard<'a> {
|
||||
},
|
||||
confirm: ButtonState::Hidden,
|
||||
keys: ButtonState::Enabled,
|
||||
override_key: None,
|
||||
}
|
||||
} else {
|
||||
KeypadState {
|
||||
@ -104,6 +107,7 @@ impl<'a> PinKeyboard<'a> {
|
||||
cancel: ButtonState::Hidden,
|
||||
confirm: ButtonState::Enabled,
|
||||
keys: ButtonState::Enabled,
|
||||
override_key: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user