From 38548f02f2e17fbd7d07e1dcca2c49ca7315ac51 Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Mon, 28 Nov 2022 23:21:15 +0100 Subject: [PATCH] feat(core/rust): special shape erase button [no changelog] --- core/assets/back_btn.png | Bin 0 -> 6166 bytes core/assets/back_btn_tall.png | Bin 0 -> 6548 bytes core/embed/rust/src/ui/component/image.rs | 12 ---- core/embed/rust/src/ui/display/mod.rs | 21 ++++++ .../src/ui/model_tr/component/result_popup.rs | 1 - .../rust/src/ui/model_tt/component/button.rs | 63 +++++++++++------- .../model_tt/component/keyboard/mnemonic.rs | 9 ++- .../model_tt/component/keyboard/passphrase.rs | 46 +++++++------ .../src/ui/model_tt/component/keyboard/pin.rs | 12 ++-- .../rust/src/ui/model_tt/res/back_btn.toif | Bin 0 -> 136 bytes .../src/ui/model_tt/res/back_btn_tall.toif | Bin 0 -> 152 bytes core/embed/rust/src/ui/model_tt/theme.rs | 4 +- tests/ui_tests/fixtures.json | 4 +- 13 files changed, 108 insertions(+), 64 deletions(-) create mode 100644 core/assets/back_btn.png create mode 100644 core/assets/back_btn_tall.png create mode 100644 core/embed/rust/src/ui/model_tt/res/back_btn.toif create mode 100644 core/embed/rust/src/ui/model_tt/res/back_btn_tall.toif diff --git a/core/assets/back_btn.png b/core/assets/back_btn.png new file mode 100644 index 0000000000000000000000000000000000000000..f7e591f6983ff5cfd9e81514a4e0b8351e93241e GIT binary patch literal 6166 zcmeI0c|25Y8^`C7Qk00&M$=d#&Au>`C0QcdU@TEMGjoQKShr$;^m*UszveT`Irn{C-}}CP*LCi5pV>oo+AvRX zsUi#pn`dWhOpP6{nx$Y?j<6>A?@6kY0|D0^l&Y!x`Q5mpYNUW>wMp{ZHMQb z+Us2ow3nm)($CqZhL_(1CjwTQF0$s{!@ET4wM|68Z^?hEDlV!F>f!?Zo*(Kz3uZL% zQ97q$2 zaT}#~Ev<9NEZhClNb815S7}_Y!m1+n zqlVJ9yruEQ;iPxf%^&uM#OU5^Bl>rwRj61V8p}wiSkSI^_a3pdk(_HMk2<1bUsuzA zCKHFnHfx>;QG2#8BFv*LuX#?+iN1_KTPyq86q85eOxe=Y)`Q?9V$)e~ut#@p!Ud*4 zp;6=3aJ$B1=heHH`^lZHA5IuCUWQi|yu5}{QH{<>=P5K~t~d}=w8P)b*UX@e-!E~* zmVZ1j=j|--C8=z`K1B7gIeb<7fPE|R$=lNd4Fv$Uep?QdVWBQ!OP9%J?TD!*7mDw57K)Q z=|)xRYkaU3K`jyO=|LsA-o;hzopd)_{OPto+V6P}{qZoZb~H3#-H^7jCi^+&TA9m+ zW!n~*;ag0uS8fV8x~(}^=`SzvVPR46IZ$om+JXA()my?IJ()wi-+i@0!>F{gzTxE9 z`S%A#mGZB~c-JRUW(;T&BU(E15-nFv`p@#Gss0wSRz>CZh<~WNoq^VKWtL|=(|Z5n zwD~N1WjZ{y`eOf^xGlTUR`Uf7JAKODYH~+Blav(d(1>y8$7YtCOdNrC(RY(1Bf{X} z<gG}9xSj3Te zlTE4H3+wlOcF$O8y~xKs1)IJwGiro?aGpZu*=FaCVcz_69kZ&#`t~=!1kAnAN8bm9 z4qCU2*GW@Phg4UFqJ&kAyIo$8p1Hj8uk@*bkNKv>*L_Ui%qrFj&@Hjgnm{&phJ?jm zy_ynyF~+Zlwxj0K-N%eR?OvV5y3T7xZTKafVjs2Fhy?gZJ-hVzeSP_r=Zb9iTJ$<) zMcR57*ajKG!fp;v4#wgquggcOZVEB7rIL$Loz0Y%xs~{g&ULrhdgw|z$8d?)^~FXJxrFtB$jLp>Vt{f=5OI#G48~Dj(SyX8EEr;hYV^T164wLP! zR?S({B|PYQL_=Ng;(8m6Cut87`_@Y>P+(4cZsb>#-F zZIQztqB#?-+p{?44$M`WOzZLyr>9BkZyq=MJWAVNt~c|-tegk`iu50gdlK~esW-LV zmLJ?7JlM~h*jVAayTXFLA*SnId-OWpr_TJ=21ly|eP#53t(=n1Sw({K9=9dRI;#fH z9ONX=B4_%cOUy}bsxJSowR-kkd`_1#RTWq&*UBS z*Vj)w%v4h?pL4>m3HcE1Cn8t~hb9!2PEd(rfI_D!+boBrW*9W}T&l4b){-R-^x zcTE>ODapP*cBO1w$JDEo^x&G_3RrkQN`GIY^Pht=$>nZqyAm<;*9J+|s5&iGF&*!A zwV6wMc3P_48Yqbw$~boqg&gwoRLNotdltxF(pb>BTJF|`WnxZp;YhnScFP@gx#Pj7 zogTi*mwR4!YH^76(5~NAvOr$JW$Xa}0 zgss{Yb0xnw)&9|tJZ&O(w)FM-tKCL5rTY_4*rRt>9ZoE}qrxh7A@0uJ16!_s$4YwR zQz0*h-Hvqz&Mfpv%Y?IM#?SWCA^k31vXs3!64~Uk+w0AeX!nDrfQP(=#TC~&B{Q_) z>&N>J)GHq-?bh5&qSrrpe?y~=a|#>R?)3I}##Oksbl%$s%7SNZ9*WU%_k7hH^V>%+ zgcxX^$n}0<68pZe_uAY{RZZ-Pz;4`pIjpwclcVw$DW)``n=Xg2LZC&^Bx{vlYiB#lQG%8T} zV`o|$8`t<6OU;#EO1sW#c!w^?>v@dI+2mdm#p9D}$~8K@=tspJq8(*7B9Dcwe>N#? z#=UPN`nCw8k4@^MEc+Y|?F@JMy$T(g=g#$N?%;HptDEm0&~HJEq)1k6)NW$kcTTaJ zc*f>dEDz9lnOE9zp(oYNBsk7taSFBd5bM?Qr)8_e2D58U=^WI%_{x#!7NWhn=eYp> zDqeInuD*qG%k3IfixHj{yVf;4-Q>pSsM2j2?MLrjS~GudHn+;XxOH~t3IK!^-MU@N zz2g1xQ+3>uQ^zJ>E^B}_xKpY7HhTC$TbEC4Xp7?I=s;ocI4FS0qk||3hYxLGU@#MN z2_Il=1x0W=7{KP5B8JX1AmD7KDZ-QJh;igwf`M$?2m$C8;Y4FZY-Ny{2y-(<6A1+Z za6l0NmvDl)LW;x`F~y}o$FgQL0zPFT+G>jMa-_m7c>)klKoL+Fq_u<{ibI$w!c7EB z7RA-d<_iKkGerc7M0^Sw9Tpab3d5s#f&es@OeUi-I5ZB2ge;K4aIOfDAh|+q8Dg4Y z1qvAgHebZ%ap5v1K<9}?rU(So5C1wp4&Tx78=fotq5`A`S_1IVSQG}$;h?|w5Q?lr zA;^~r{Z|hm4ch6UT|psFEMS1vp&(bJ{XK%o_~y?S3xcP@VKUHQFvx*Sh0v(jABNmu z=ScnLA(J40&EZdZL1O=4DPpt!7VC$($$F;3`FN2cf*;i7dPk3&5~&Mx^f$&H^@6l|b!hptfCWL|j1R?{61dPZ4(ul>v(4jY-g$JilOa{eh55UM8Vrb7kb^10fz1_5{_dc$IiQ;ekg16!k;q0w65hy&L?)84(_v5X zJV1dEszezRi$US1xw5oSpkN?j0a=|wfGI2#3&m0Z0wSJ(#^VK>B4h}-%yX)|;U?2b zv1JP(i*Q-Rf2nylFl72{`Vt6cPj$iJQ)Np57}J9Yfl!b+H4x-C-Ngt5xB(z^eSaya zukGyrk}M*@h{eFrji4+OjgbV9jzg01MkFMjMaL5`Bq9StV*N-L@>rrUKmb|P8jIg#$u5;V;T-iA&@9IV?zvirV7#Jjm#2}EEOqMa8F`cPz0{%}Sl4&>`1&gB)jeZQ#1T9;*z9!WK{U2$c zHu!F(gQS^mgH}*zK}LUDk-umrtCWB6^`+eY!4V+zuR(rF-(Pb5lIy1w_$lLG)%8oR zpHkqbjDJ z?DHEeJ!3J{s35X)v{rbbq`7b|8Dq3@6l(flXJtY2YHCScseECbigg!iul&w#`RrEX z_0(8@@iR8h z7O?F4jisY^G7LsicG++pXQg&K;paNEDErcr_8n8X z_&La7j|(<=k462w6*FxS1@9ImRy|gbY$;Y~O5gb5Bq2HVJgniojfuy)5}S4Xa}E2$ zA7SLeE|KEI0q5=hwe6kLHOBe)k_4?9yt8M?0Cwogz9`z<3Axaf#MJgWJ8wt^n4PtgRmpn)9sdTW-=lB< literal 0 HcmV?d00001 diff --git a/core/assets/back_btn_tall.png b/core/assets/back_btn_tall.png new file mode 100644 index 0000000000000000000000000000000000000000..8e054340f01224937c219ee9d7120a529dbfcdbe GIT binary patch literal 6548 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, + bg: (&[u8], Offset, Color), + fg: (&[u8], Offset, Color), + bg_color: Color, +) { + let (data_bg, offset_bg, color_icon_bg) = bg; + let (data_fg, offset_fg, color_icon_fg) = fg; + + let pos_bg = if let Some(area) = bg_area { + rect_fill(area, bg_color); + area.top_left() + offset_bg + } else { + Point::from(offset_bg) + }; + + icon_top_left(pos_bg, data_bg, color_icon_bg, bg_color); + icon_top_left(pos_bg + offset_fg, data_fg, color_icon_fg, color_icon_bg); +} + /// Gets a color of a pixel on `p` coordinates of rounded rectangle with corner /// radius 2 fn rect_rounded2_get_pixel( diff --git a/core/embed/rust/src/ui/model_tr/component/result_popup.rs b/core/embed/rust/src/ui/model_tr/component/result_popup.rs index 77a4aa5d6..979e2a783 100644 --- a/core/embed/rust/src/ui/model_tr/component/result_popup.rs +++ b/core/embed/rust/src/ui/model_tr/component/result_popup.rs @@ -6,7 +6,6 @@ use crate::{ Child, Component, ComponentExt, Event, EventCtx, Label, Pad, }, constant::screen, - display::Font, geometry::{Alignment, Insets, LinearPlacement, Point, Rect}, model_tr::{ component::{Button, ButtonMsg, ButtonPos, ResultAnim, ResultAnimMsg}, diff --git a/core/embed/rust/src/ui/model_tt/component/button.rs b/core/embed/rust/src/ui/model_tt/component/button.rs index 9638876ad..1c0864509 100644 --- a/core/embed/rust/src/ui/model_tt/component/button.rs +++ b/core/embed/rust/src/ui/model_tt/component/button.rs @@ -52,6 +52,10 @@ impl Button { Self::new(ButtonContent::Icon(image)) } + pub fn with_icon_blend(bg: &'static [u8], fg: &'static [u8], fg_offset: Offset) -> Self { + Self::new(ButtonContent::IconBlend(bg, fg, fg_offset)) + } + pub fn empty() -> Self { Self::new(ButtonContent::Empty) } @@ -141,29 +145,34 @@ impl Button { } pub fn paint_background(&self, style: &ButtonStyle) { - if style.border_width > 0 { - // Paint the border and a smaller background on top of it. - display::rect_fill_rounded( - self.area, - style.border_color, - style.background_color, - style.border_radius, - ); - display::rect_fill_rounded( - self.area.inset(Insets::uniform(style.border_width)), - style.button_color, - style.border_color, - style.border_radius, - ); - } else { - // We do not need to draw an explicit border in this case, just a - // bigger background. - display::rect_fill_rounded( - self.area, - style.button_color, - style.background_color, - style.border_radius, - ); + match &self.content { + ButtonContent::IconBlend(_, _, _) => {} + _ => { + if style.border_width > 0 { + // Paint the border and a smaller background on top of it. + display::rect_fill_rounded( + self.area, + style.border_color, + style.background_color, + style.border_radius, + ); + display::rect_fill_rounded( + self.area.inset(Insets::uniform(style.border_width)), + style.button_color, + style.border_color, + style.border_radius, + ); + } else { + // We do not need to draw an explicit border in this case, just a + // bigger background. + display::rect_fill_rounded( + self.area, + style.button_color, + style.background_color, + style.border_radius, + ); + } + } } } @@ -196,6 +205,12 @@ impl Button { style.button_color, ); } + ButtonContent::IconBlend(bg, fg, offset) => display::icon_over_icon( + Some(self.area), + (bg, Offset::zero(), style.button_color), + (fg, *offset, style.text_color), + style.background_color, + ), } } } @@ -300,6 +315,7 @@ where ButtonContent::Empty => {} ButtonContent::Text(text) => t.field("text", text), ButtonContent::Icon(_) => t.symbol("icon"), + ButtonContent::IconBlend(_, _, _) => t.symbol("icon"), } t.close(); } @@ -318,6 +334,7 @@ pub enum ButtonContent { Empty, Text(T), Icon(&'static [u8]), + IconBlend(&'static [u8], &'static [u8], Offset), } #[derive(PartialEq, Eq)] diff --git a/core/embed/rust/src/ui/model_tt/component/keyboard/mnemonic.rs b/core/embed/rust/src/ui/model_tt/component/keyboard/mnemonic.rs index a8f9a9a10..de0f31175 100644 --- a/core/embed/rust/src/ui/model_tt/component/keyboard/mnemonic.rs +++ b/core/embed/rust/src/ui/model_tt/component/keyboard/mnemonic.rs @@ -2,7 +2,7 @@ use core::ops::Deref; use crate::ui::{ component::{maybe::paint_overlapping, Child, Component, Event, EventCtx, Label, Maybe}, - geometry::{Alignment, Grid, Rect}, + geometry::{Alignment, Grid, Offset, Rect}, model_tt::{ component::{Button, ButtonMsg}, theme, @@ -39,7 +39,12 @@ where )), back: Child::new(Maybe::hidden( theme::BG, - Button::with_icon(theme::ICON_BACK).styled(theme::button_clear()), + Button::with_icon_blend( + theme::IMAGE_BG_BACK_BTN_TALL, + theme::ICON_BACK, + Offset::new(30, 17), + ) + .styled(theme::button_clear()), )), input: Child::new(Maybe::hidden(theme::BG, input)), keys: T::keys().map(Button::with_text).map(Child::new), diff --git a/core/embed/rust/src/ui/model_tt/component/keyboard/passphrase.rs b/core/embed/rust/src/ui/model_tt/component/keyboard/passphrase.rs index 117e8795c..4b39a930b 100644 --- a/core/embed/rust/src/ui/model_tt/component/keyboard/passphrase.rs +++ b/core/embed/rust/src/ui/model_tt/component/keyboard/passphrase.rs @@ -4,7 +4,10 @@ use crate::ui::{ geometry::{Grid, Insets, Offset, Rect}, model_tt::component::{ button::{Button, ButtonContent, ButtonMsg::Clicked}, - keyboard::common::{paint_pending_marker, MultiTapKeyboard, TextBox, HEADER_PADDING_SIDE}, + keyboard::common::{ + paint_pending_marker, MultiTapKeyboard, TextBox, HEADER_HEIGHT, HEADER_PADDING_BOTTOM, + HEADER_PADDING_SIDE, + }, swipe::{Swipe, SwipeDirection}, theme, ScrollBar, }, @@ -46,10 +49,14 @@ impl PassphraseKeyboard { confirm: Button::with_icon(theme::ICON_CONFIRM) .styled(theme::button_confirm()) .into_child(), - back: Button::with_icon(theme::ICON_BACK) - .styled(theme::button_reset()) - .initially_enabled(false) - .into_child(), + back: Button::with_icon_blend( + theme::IMAGE_BG_BACK_BTN, + theme::ICON_BACK, + Offset::new(30, 12), + ) + .styled(theme::button_reset()) + .initially_enabled(false) + .into_child(), keys: KEYBOARD.map(|page| { page.map(|text| { if text == " " { @@ -70,6 +77,7 @@ impl PassphraseKeyboard { ButtonContent::Text(text) => text, ButtonContent::Icon(_) => " ", ButtonContent::Empty => "", + ButtonContent::IconBlend(_, _, _) => "", } } @@ -135,17 +143,16 @@ impl Component for PassphraseKeyboard { fn place(&mut self, bounds: Rect) -> Rect { let bounds = bounds.inset(theme::borders()); - let input_area = Grid::new(bounds, 5, 1) - .with_spacing(theme::KEYBOARD_SPACING) - .row_col(0, 0); + let (input_area, key_grid_area) = bounds.split_top(HEADER_HEIGHT + HEADER_PADDING_BOTTOM); - let (input_area, scroll_area) = input_area.split_bottom(ScrollBar::DOT_SIZE); - let input_area = - input_area.inset(Insets::new(0, HEADER_PADDING_SIDE, 2, HEADER_PADDING_SIDE)); + let (input_area, scroll_area) = + input_area.split_bottom(ScrollBar::DOT_SIZE + theme::KEYBOARD_SPACING); + let (scroll_area, _) = scroll_area.split_top(ScrollBar::DOT_SIZE); + let input_area = input_area.inset(Insets::sides(HEADER_PADDING_SIDE)); - let key_grid = Grid::new(bounds, 5, 3).with_spacing(theme::KEYBOARD_SPACING); - let confirm_btn_area = key_grid.cell(14); - let back_btn_area = key_grid.cell(12); + let key_grid = Grid::new(key_grid_area, 4, 3).with_spacing(theme::KEYBOARD_SPACING); + let confirm_btn_area = key_grid.cell(11); + let back_btn_area = key_grid.cell(9); self.page_swipe.place(bounds); self.input.place(input_area); @@ -162,10 +169,10 @@ impl Component for PassphraseKeyboard { // from the second row. let area = key_grid.cell(if key < 9 { // The grid has 3 columns, and we skip the first row. - key + 3 + key } else { // For the last key (the "0" position) we skip one cell. - key + 1 + 3 + key + 1 }); btn.place(area); } @@ -280,10 +287,11 @@ impl Component for Input { } fn paint(&mut self) { - const TEXT_OFFSET: Offset = Offset::y(8); - let style = theme::label_default(); - let mut text_baseline = self.area.bottom_left() - TEXT_OFFSET; + + let mut text_baseline = self.area.top_left() + Offset::y(style.text_font.text_height()) + - Offset::y(style.text_font.text_baseline()); + let text = self.textbox.content(); // Preparing the new text to be displayed. diff --git a/core/embed/rust/src/ui/model_tt/component/keyboard/pin.rs b/core/embed/rust/src/ui/model_tt/component/keyboard/pin.rs index ca9b7a52b..a16bbb511 100644 --- a/core/embed/rust/src/ui/model_tt/component/keyboard/pin.rs +++ b/core/embed/rust/src/ui/model_tt/component/keyboard/pin.rs @@ -70,10 +70,14 @@ where allow_cancel: bool, ) -> Self { // Control buttons. - let erase_btn = Button::with_icon(theme::ICON_BACK) - .styled(theme::button_reset()) - .with_long_press(ERASE_HOLD_DURATION) - .initially_enabled(false); + let erase_btn = Button::with_icon_blend( + theme::IMAGE_BG_BACK_BTN, + theme::ICON_BACK, + Offset::new(30, 12), + ) + .styled(theme::button_reset()) + .with_long_press(ERASE_HOLD_DURATION) + .initially_enabled(false); let erase_btn = Maybe::hidden(theme::BG, erase_btn).into_child(); let cancel_btn = Button::with_icon(theme::ICON_CANCEL).styled(theme::button_cancel()); diff --git a/core/embed/rust/src/ui/model_tt/res/back_btn.toif b/core/embed/rust/src/ui/model_tt/res/back_btn.toif new file mode 100644 index 0000000000000000000000000000000000000000..2a795395738a9214968bd541b1acfe06113537c0 GIT binary patch literal 136 zcmV;30C)dXPf15a044x@00023(!mXYAPj}!ZorC;z$lKwD2(7$PaX_S1g+p*eiQAL zFU@PINUhnPtG!F;0CP=jJ#jZFB)pM`C=|s(Vl)yfij2ZY1Qd#*knjX7qQDrIe-QdZ qQl6Hsql$zAgS_~C*-=dP{gUNGp(rAX0R=3+iG(8bfNMgQUW*G7cRKU{ literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/model_tt/res/back_btn_tall.toif b/core/embed/rust/src/ui/model_tt/res/back_btn_tall.toif new file mode 100644 index 0000000000000000000000000000000000000000..452371857d4247feb668ba86b73878a34689d757 GIT binary patch literal 152 zcmV;J0B8SHPf15a05AZI00023(yOm6?DiVXw0B@`fMBZ(kx^6>jl^ao4ip8&g~CV#6bVH^(MZ6)9uZMw6cq&l!=iSe zC@4-8^@mpy3Xeh^1rCD;^yT;Yg0QNvs+3T86k>6qC@6Lm9tG@dh!aId5mBfufSV#L Gy6OgXB0Eq3 literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/model_tt/theme.rs b/core/embed/rust/src/ui/model_tt/theme.rs index 2e2e01c6a..572ec9b09 100644 --- a/core/embed/rust/src/ui/model_tt/theme.rs +++ b/core/embed/rust/src/ui/model_tt/theme.rs @@ -65,6 +65,8 @@ pub const IMAGE_FG_ERROR: &[u8] = include_res!("model_tt/res/error_fg.toif"); pub const IMAGE_FG_INFO: &[u8] = include_res!("model_tt/res/info_fg.toif"); pub const IMAGE_BG_CIRCLE: &[u8] = include_res!("model_tt/res/circle.toif"); pub const IMAGE_BG_TRIANGLE: &[u8] = include_res!("model_tt/res/triangle.toif"); +pub const IMAGE_BG_BACK_BTN: &[u8] = include_res!("model_tt/res/back_btn.toif"); +pub const IMAGE_BG_BACK_BTN_TALL: &[u8] = include_res!("model_tt/res/back_btn_tall.toif"); // Scrollbar/PIN dots. pub const DOT_ACTIVE: &[u8] = include_res!("model_tt/res/scroll-active.toif"); @@ -229,7 +231,7 @@ pub fn button_reset() -> ButtonStyleSheet { }, disabled: &ButtonStyle { font: Font::BOLD, - text_color: GREY_LIGHT, + text_color: FG, button_color: YELLOW, background_color: BG, border_color: BG, diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 3be30fb46..0e158cb0f 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -1646,10 +1646,10 @@ "TT_test_session_id_and_passphrase.py::test_multiple_passphrases": "7f73c410413a655054ab7fcc95d9da528bd082a89cda3ee981c4c48b566e6660", "TT_test_session_id_and_passphrase.py::test_multiple_sessions": "f03b50df7f4a161078fa903c44f37272961b70358d4014d30a12888e1fd2caf1", "TT_test_session_id_and_passphrase.py::test_passphrase_ack_mismatch": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TT_test_session_id_and_passphrase.py::test_passphrase_always_on_device": "ea3049463b15861f70fab2d4a56fc5efd75b6e6464b9f81e19478e9f8ef48f8e", +"TT_test_session_id_and_passphrase.py::test_passphrase_always_on_device": "d2302e826a90ac2aaec7f7bcf9794fe1ffa077f04d9566ce4edbd53975caee16", "TT_test_session_id_and_passphrase.py::test_passphrase_length": "928b70f715015cb291bcd9890190dc53a4a31a7965d7b7eadfa5ec2e7a3a47a1", "TT_test_session_id_and_passphrase.py::test_passphrase_missing": "95a40f79fa7ffceb10e89b513c203b4937112b8d764cdba3c1df538355dc129c", -"TT_test_session_id_and_passphrase.py::test_passphrase_on_device": "9e9111f802d024580996acb984e520d68b0b61efaec50173f8755770586fd7bd", +"TT_test_session_id_and_passphrase.py::test_passphrase_on_device": "3425b0aa0fb34c5fb40dadd63533701ba93b752b9218d8cce72cc9c9e24c0236", "TT_test_session_id_and_passphrase.py::test_session_enable_passphrase": "9c96dc98e60e7b3a16d7f328f92a001e8c6727902e6912100fc45b3dabee612c", "TT_test_session_id_and_passphrase.py::test_session_with_passphrase": "a7046b2ffe82d6b5194ad34d17d0fa2e16bfa29ab8df798dc38d2b40de01c434", "TT_tezos-test_getaddress.py::test_tezos_get_address": "d5c6a3fcb7bf58d62be0eb6d3d51fa17ebeadfb8ec3359f11e5b3771bb33e4f4",