From 9ee670a440e6dae2411a4f33ee318ce21918abce Mon Sep 17 00:00:00 2001 From: tychovrahe Date: Tue, 4 Jun 2024 15:46:36 +0200 Subject: [PATCH] feat(core): change default homescreen image for mercury the default homescreen is rendered algorithmically, when changing homescreen to default we now use text message due to lack of scaling [no changelog] --- core/embed/rust/librust_qstr.h | 1 + .../generated/translated_string.rs | 3 + .../ui/model_mercury/component/homescreen.rs | 118 +++++++++++++----- .../ui/model_mercury/cshape/unlock_overlay.rs | 2 +- .../embed/rust/src/ui/model_mercury/layout.rs | 40 +++--- .../rust/src/ui/model_mercury/res/hs_lock.png | Bin 0 -> 8384 bytes .../src/ui/model_mercury/res/hs_lock.toif | Bin 0 -> 224 bytes .../rust/src/ui/model_mercury/theme/mod.rs | 2 +- core/mocks/trezortranslate_keys.pyi | 1 + core/translations/en.json | 1 + core/translations/order.json | 3 +- core/translations/signatures.json | 6 +- tests/ui_tests/fixtures.json | 16 +-- 13 files changed, 131 insertions(+), 62 deletions(-) create mode 100644 core/embed/rust/src/ui/model_mercury/res/hs_lock.png create mode 100644 core/embed/rust/src/ui/model_mercury/res/hs_lock.toif diff --git a/core/embed/rust/librust_qstr.h b/core/embed/rust/librust_qstr.h index ece0cbd029..99bc9e2056 100644 --- a/core/embed/rust/librust_qstr.h +++ b/core/embed/rust/librust_qstr.h @@ -250,6 +250,7 @@ static void _librust_qstrs(void) { MP_QSTR_hold_danger; MP_QSTR_homescreen__click_to_connect; MP_QSTR_homescreen__click_to_unlock; + MP_QSTR_homescreen__set_default; MP_QSTR_homescreen__title_backup_failed; MP_QSTR_homescreen__title_backup_needed; MP_QSTR_homescreen__title_coinjoin_authorized; diff --git a/core/embed/rust/src/translations/generated/translated_string.rs b/core/embed/rust/src/translations/generated/translated_string.rs index 86056ad150..e037ae6237 100644 --- a/core/embed/rust/src/translations/generated/translated_string.rs +++ b/core/embed/rust/src/translations/generated/translated_string.rs @@ -1333,6 +1333,7 @@ pub enum TranslatedString { recovery__title_unlock_repeated_backup = 933, // "Multi-share backup" recovery__unlock_repeated_backup = 934, // "Create additional backup?" recovery__unlock_repeated_backup_verb = 935, // "Unlock backup" + homescreen__set_default = 936, // "Do you really want to set default homescreen image?" } impl TranslatedString { @@ -2661,6 +2662,7 @@ impl TranslatedString { Self::recovery__title_unlock_repeated_backup => "Multi-share backup", Self::recovery__unlock_repeated_backup => "Create additional backup?", Self::recovery__unlock_repeated_backup_verb => "Unlock backup", + Self::homescreen__set_default => "Do you really want to set default homescreen image?", } } @@ -3990,6 +3992,7 @@ impl TranslatedString { Qstr::MP_QSTR_recovery__title_unlock_repeated_backup => Some(Self::recovery__title_unlock_repeated_backup), Qstr::MP_QSTR_recovery__unlock_repeated_backup => Some(Self::recovery__unlock_repeated_backup), Qstr::MP_QSTR_recovery__unlock_repeated_backup_verb => Some(Self::recovery__unlock_repeated_backup_verb), + Qstr::MP_QSTR_homescreen__set_default => Some(Self::homescreen__set_default), _ => None, } } diff --git a/core/embed/rust/src/ui/model_mercury/component/homescreen.rs b/core/embed/rust/src/ui/model_mercury/component/homescreen.rs index e09e0b71c1..99a1692b8c 100644 --- a/core/embed/rust/src/ui/model_mercury/component/homescreen.rs +++ b/core/embed/rust/src/ui/model_mercury/component/homescreen.rs @@ -10,7 +10,7 @@ use crate::{ event::{TouchEvent, USBEvent}, geometry::{Alignment, Alignment2D, Offset, Point, Rect}, layout::util::get_user_custom_image, - model_mercury::{constant, theme::IMAGE_HOMESCREEN}, + model_mercury::constant, shape::{self, Renderer}, }, }; @@ -20,7 +20,7 @@ use crate::ui::{ constant::{screen, HEIGHT, WIDTH}, model_mercury::{ cshape, - theme::{GREY_LIGHT, ICON_KEY, TITLE_HEIGHT}, + theme::{GREY_LIGHT, HOMESCREEN_ICON, ICON_KEY}, }, shape::{render_on_canvas, ImageBuffer, Rgb565Canvas}, util::animation_disabled, @@ -43,6 +43,46 @@ pub const HOMESCREEN_IMAGE_WIDTH: i16 = WIDTH; pub const HOMESCREEN_IMAGE_HEIGHT: i16 = HEIGHT; pub const HOMESCREEN_TOIF_SIZE: i16 = 144; +fn render_default_hs<'a>(target: &mut impl Renderer<'a>) { + const OVERLAY_OFFSET: i16 = 9; + + const RADIUS: i16 = 85; + + const SPAN: i16 = 10; + + const THICKNESS: i16 = 6; + + const NUM_CIRCLES: i16 = 5; + + let area = AREA.translate(Offset::y(OVERLAY_OFFSET)); + + shape::Bar::new(area) + .with_fg(theme::BG) + .with_bg(theme::BG) + .render(target); + + #[cfg(any(feature = "universal_fw", feature = "ui_debug"))] + let colors = [0x0BB671, 0x247553, 0x235C44, 0x1D3E30, 0x14271F]; + #[cfg(not(any(feature = "universal_fw", feature = "ui_debug")))] + let colors = [0xEEA600, 0xB27C00, 0x775300, 0x463100, 0x2C1F00]; + + for i in 0..NUM_CIRCLES { + let r = RADIUS - i * SPAN; + let fg = Color::from_u32(colors[i as usize]); + let bg = theme::BG; + let thickness = THICKNESS; + shape::Circle::new(area.center(), r) + .with_fg(fg) + .with_bg(bg) + .with_thickness(thickness) + .render(target); + } + + shape::ToifImage::new(area.center(), HOMESCREEN_ICON.toif) + .with_align(Alignment2D::CENTER) + .render(target); +} + #[derive(Clone, Copy)] pub struct HomescreenNotification { pub text: TString<'static>, @@ -52,8 +92,10 @@ pub struct HomescreenNotification { pub struct Homescreen { label: Label<'static>, + label_width: i16, + label_height: i16, notification: Option<(TString<'static>, u8)>, - image: BinaryData<'static>, + image: Option>, hold_to_lock: bool, loader: Loader, delay: Option, @@ -69,8 +111,13 @@ impl Homescreen { notification: Option<(TString<'static>, u8)>, hold_to_lock: bool, ) -> Self { + let label_width = label.map(|t| theme::TEXT_DEMIBOLD.text_font.text_width(t)); + let label_height = label.map(|t| theme::TEXT_DEMIBOLD.text_font.visible_text_height(t)); + Self { - label: Label::new(label, Alignment::Start, theme::TEXT_DEMIBOLD).vertically_centered(), + label: Label::new(label, Alignment::Center, theme::TEXT_DEMIBOLD).vertically_centered(), + label_width, + label_height, notification, image: get_homescreen_image(), hold_to_lock, @@ -171,7 +218,7 @@ impl Component for Homescreen { fn place(&mut self, bounds: Rect) -> Rect { self.loader.place(AREA.translate(LOADER_OFFSET)); self.label - .place(bounds.split_top(TITLE_HEIGHT).0.translate(Offset::x(4))); + .place(bounds.split_top(38).0.split_left(self.label_width + 12).0); bounds } @@ -192,10 +239,14 @@ impl Component for Homescreen { if self.loader.is_animating() || self.loader.is_completely_grown(Instant::now()) { self.render_loader(target); } else { - if let ImageInfo::Jpeg(_) = ImageInfo::parse(self.image) { - shape::JpegImage::new_image(AREA.center(), self.image) - .with_align(Alignment2D::CENTER) - .render(target); + if let Some(image) = self.image { + if let ImageInfo::Jpeg(_) = ImageInfo::parse(image) { + shape::JpegImage::new_image(AREA.center(), image) + .with_align(Alignment2D::CENTER) + .render(target); + } + } else { + render_default_hs(target); } let label_width = self @@ -203,7 +254,7 @@ impl Component for Homescreen { .text() .map(|t| theme::TEXT_DEMIBOLD.text_font.text_width(t)); - let r = Rect::new(Point::new(-30, -30), Point::new(label_width + 12, 42)); + let r = Rect::new(Point::new(-30, -30), Point::new(label_width + 12, 38)); shape::Bar::new(r) .with_bg(Color::black()) .with_alpha(160) @@ -293,8 +344,10 @@ impl LockscreenAnim { pub struct Lockscreen { anim: LockscreenAnim, - label: TString<'static>, - image: BinaryData<'static>, + label: Label<'static>, + label_width: i16, + label_height: i16, + image: Option>, bootscreen: bool, coinjoin_authorized: bool, bg_image: ImageBuffer>, @@ -306,12 +359,21 @@ impl Lockscreen { let mut buf = unwrap!(ImageBuffer::new(AREA.size()), "no image buf"); render_on_canvas(buf.canvas(), None, |target| { - shape::JpegImage::new_image(Point::zero(), image).render(target); + if let Some(image) = image { + shape::JpegImage::new_image(Point::zero(), image).render(target); + } else { + render_default_hs(target); + } }); + let label_width = label.map(|t| theme::TEXT_DEMIBOLD.text_font.text_width(t)); + let label_height = label.map(|t| theme::TEXT_DEMIBOLD.text_font.visible_text_height(t)); + Lockscreen { anim: LockscreenAnim::default(), - label, + label: Label::new(label, Alignment::Center, theme::TEXT_DEMIBOLD), + label_width, + label_height, image, bootscreen, coinjoin_authorized, @@ -324,6 +386,8 @@ impl Component for Lockscreen { type Msg = HomescreenMsg; fn place(&mut self, bounds: Rect) -> Rect { + self.label + .place(bounds.split_top(38).0.split_left(self.label_width + 12).0); bounds } @@ -395,29 +459,15 @@ impl Component for Lockscreen { (None, TR::lockscreen__tap_to_unlock) }; - let mut label_style = theme::TEXT_DEMIBOLD; - label_style.text_color = theme::GREY_LIGHT; + self.label.render(target); - let mut offset = 0; - - self.label.map(|t| { - offset = theme::TEXT_DEMIBOLD.text_font.visible_text_height(t); - - let text_pos = Point::new(0, offset); - - shape::Text::new(text_pos, t) - .with_font(theme::TEXT_DEMIBOLD.text_font) - .with_fg(theme::GREY_LIGHT) - .render(target); - }); - - offset += 6; + let mut offset = 6 + self.label_height; if let Some(t) = locked { t.map_translated(|t| { offset += theme::TEXT_SUB_GREY.text_font.visible_text_height(t); - let text_pos = Point::new(0, offset); + let text_pos = Point::new(6, offset); shape::Text::new(text_pos, t) .with_font(theme::TEXT_SUB_GREY.text_font) @@ -457,13 +507,13 @@ pub fn check_homescreen_format(image: BinaryData) -> bool { } } -fn get_homescreen_image() -> BinaryData<'static> { +fn get_homescreen_image() -> Option> { if let Ok(image) = get_user_custom_image() { if check_homescreen_format(image) { - return image; + return Some(image); } } - IMAGE_HOMESCREEN.into() + None } #[cfg(feature = "ui_debug")] diff --git a/core/embed/rust/src/ui/model_mercury/cshape/unlock_overlay.rs b/core/embed/rust/src/ui/model_mercury/cshape/unlock_overlay.rs index f6285a77ed..1b2075f316 100644 --- a/core/embed/rust/src/ui/model_mercury/cshape/unlock_overlay.rs +++ b/core/embed/rust/src/ui/model_mercury/cshape/unlock_overlay.rs @@ -70,7 +70,7 @@ impl UnlockOverlay { canvas.fill_circle(center, r - Self::THICKNESS, opaque, 255); // Inner fixed circle - let r = Self::RADIUS - (9 * Self::SPAN) / 2; + let r = Self::RADIUS - (9 * Self::SPAN) / 2 - 1; canvas.fill_circle(center, r, transp, 255); canvas.fill_circle(center, r - Self::THICKNESS, opaque, 255); } diff --git a/core/embed/rust/src/ui/model_mercury/layout.rs b/core/embed/rust/src/ui/model_mercury/layout.rs index da9135bbc2..587703e8d2 100644 --- a/core/embed/rust/src/ui/model_mercury/layout.rs +++ b/core/embed/rust/src/ui/model_mercury/layout.rs @@ -586,24 +586,36 @@ extern "C" fn new_confirm_homescreen(n_args: usize, args: *const Obj, kwargs: *m let title: TString = kwargs.get(Qstr::MP_QSTR_title)?.try_into()?; let image: Obj = kwargs.get(Qstr::MP_QSTR_image)?; - let mut jpeg: BinaryData = image.try_into()?; + let jpeg: BinaryData = image.try_into()?; if jpeg.is_empty() { // Incoming data may be empty, meaning we should - // display default homescreen image. - jpeg = theme::IMAGE_HOMESCREEN.into(); + // display default homescreen message. + let buttons = Button::cancel_confirm_text(None, Some(TR::buttons__change.into())); + let obj = LayoutObj::new(Frame::centered( + title, + Dialog::new( + Paragraphs::new([Paragraph::new( + &theme::TEXT_DEMIBOLD, + TR::homescreen__set_default, + ) + .centered()]), + buttons, + ), + ))?; + Ok(obj.into()) + } else { + if !check_homescreen_format(jpeg) { + return Err(value_error!("Invalid image.")); + }; + + let buttons = Button::cancel_confirm_text(None, Some(TR::buttons__change.into())); + let obj = LayoutObj::new(Frame::centered( + title, + Dialog::new(Jpeg::new(jpeg, 1), buttons), + ))?; + Ok(obj.into()) } - - if !check_homescreen_format(jpeg) { - return Err(value_error!("Invalid image.")); - }; - - let buttons = Button::cancel_confirm_text(None, Some(TR::buttons__change.into())); - let obj = LayoutObj::new(Frame::centered( - title, - Dialog::new(Jpeg::new(jpeg, 1), buttons), - ))?; - Ok(obj.into()) }; unsafe { util::try_with_args_and_kwargs(n_args, args, kwargs, block) } diff --git a/core/embed/rust/src/ui/model_mercury/res/hs_lock.png b/core/embed/rust/src/ui/model_mercury/res/hs_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..82bdd2114febc7a4fda517afa785781fb049339e GIT binary patch literal 8384 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 literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/model_mercury/res/hs_lock.toif b/core/embed/rust/src/ui/model_mercury/res/hs_lock.toif new file mode 100644 index 0000000000000000000000000000000000000000..b2b7dc24edf76c1d30e8feaea4698085426a4b96 GIT binary patch literal 224 zcmV<603ZKUPf15004@O30001EU;qMv?SJ1_Gcmw`!ms~8Fdr`P^gkHHLb(C|p@0>_ z{|w{%L->Dz%yV~u#C=8(Hv!1Rt=|IhE<{hxC14h|rEHdr_{3{O4> zj6VUwzYkTA_y-yw_tik$!hi4(x~~c6{)LEWE`iD<{6P-N^DGPwzfica)CW$1ERf`Q a3&QPVgr(1GC|n=_3gjSh85oZFKp6nj*mFDp literal 0 HcmV?d00001 diff --git a/core/embed/rust/src/ui/model_mercury/theme/mod.rs b/core/embed/rust/src/ui/model_mercury/theme/mod.rs index 71d8d639b7..af3d6fe282 100644 --- a/core/embed/rust/src/ui/model_mercury/theme/mod.rs +++ b/core/embed/rust/src/ui/model_mercury/theme/mod.rs @@ -173,7 +173,7 @@ include_icon!(IMAGE_BG_BACK_BTN_TALL, "model_tt/res/bg-back52.toif"); include_icon!(ICON_LOGO_EMPTY, "model_tt/res/lock_empty.toif"); // Default homescreen -pub const IMAGE_HOMESCREEN: &[u8] = include_res!("model_tt/res/bg.jpg"); +include_icon!(HOMESCREEN_ICON, "model_mercury/res/hs_lock.toif"); pub const fn label_default() -> TextStyle { TEXT_NORMAL diff --git a/core/mocks/trezortranslate_keys.pyi b/core/mocks/trezortranslate_keys.pyi index 90dc945342..701cb3be44 100644 --- a/core/mocks/trezortranslate_keys.pyi +++ b/core/mocks/trezortranslate_keys.pyi @@ -356,6 +356,7 @@ class TR: haptic_feedback__title: str = "Haptic feedback" homescreen__click_to_connect: str = "Click to Connect" homescreen__click_to_unlock: str = "Click to Unlock" + homescreen__set_default: str = "Do you really want to set default homescreen image?" homescreen__title_backup_failed: str = "Backup failed" homescreen__title_backup_needed: str = "Backup needed" homescreen__title_coinjoin_authorized: str = "Coinjoin authorized" diff --git a/core/translations/en.json b/core/translations/en.json index d3b648f735..c5520e499b 100644 --- a/core/translations/en.json +++ b/core/translations/en.json @@ -366,6 +366,7 @@ "homescreen__title_pin_not_set": "PIN not set", "homescreen__title_seedless": "Seedless", "homescreen__title_set": "Change homescreen?", + "homescreen__set_default": "Do you really want to set default homescreen image?", "inputs__back": "BACK", "inputs__cancel": "CANCEL", "inputs__delete": "DELETE", diff --git a/core/translations/order.json b/core/translations/order.json index 172418c8df..54dd2a1b68 100644 --- a/core/translations/order.json +++ b/core/translations/order.json @@ -934,5 +934,6 @@ "932": "brightness__title", "933": "recovery__title_unlock_repeated_backup", "934": "recovery__unlock_repeated_backup", - "935": "recovery__unlock_repeated_backup_verb" + "935": "recovery__unlock_repeated_backup_verb", + "936": "homescreen__set_default" } diff --git a/core/translations/signatures.json b/core/translations/signatures.json index 070161e6a7..29509e9cb6 100644 --- a/core/translations/signatures.json +++ b/core/translations/signatures.json @@ -1,8 +1,8 @@ { "current": { - "merkle_root": "45979e4f395fcad03d843869023d35047483512ec797063806998dc553823c72", - "datetime": "2024-06-03T12:43:57.548072", - "commit": "510121bad342d1f900ca123e131448d577a25e39" + "merkle_root": "886b12bcb1eb7dd11f8f8509fb5ee2eb13e1ca6ae968ca0e6732b440ba465416", + "datetime": "2024-06-05T13:23:30.327902", + "commit": "9ad44f311cad1eee987452c8de21d18d931df44e" }, "history": [ { diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 8ce7b3d712..fee4f52bff 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -22666,14 +22666,14 @@ "T3T1_fr_zcash-test_sign_tx.py::test_version_group_id_missing": "37dad81ffcb3e0cccd78790d07ff0141ddf6cf2c4e67c3a8c9000c7ce7e45eaf" }, "persistence_tests": { -"T3T1_en_test_safety_checks.py::test_safety_checks_level_after_reboot[SafetyCheckLevel.PromptAlways--081810a6": "5d970f956013d770ac3b9836c8958b1c24b6294079c259b7146071e168bba628", -"T3T1_en_test_safety_checks.py::test_safety_checks_level_after_reboot[SafetyCheckLevel.PromptTempora-b3d21f4a": "9fdd5f4f77b63affc70af34ee0c55be5522f0389340ceb31e644b964610503e9", -"T3T1_en_test_safety_checks.py::test_safety_checks_level_after_reboot[SafetyCheckLevel.Strict-Safety-f1ff9c26": "67c493757e3dc5228907e3db9dd853788c37be93295d247ae988b3ab7f988ec0", -"T3T1_en_test_shamir_persistence.py::test_abort": "699a1450e491a9059926afded4c4bac2fc20bc125adc6508e446457052015014", -"T3T1_en_test_shamir_persistence.py::test_recovery_multiple_resets": "6da13841e94b968ebf1871dd18e20b73ff464f07eb21ebf6d510675505b22945", -"T3T1_en_test_shamir_persistence.py::test_recovery_on_old_wallet": "a4c00fba813a30af023ce02cf7f554f736852f15f68241d88e1a1085cbc23b03", -"T3T1_en_test_shamir_persistence.py::test_recovery_single_reset": "7c1d0aa16d3a4c19815262ef18bf53796d3cefa5d71f19775ddf95acc153055a", -"T3T1_en_test_wipe_code.py::test_wipe_code_activate_core": "d43d9181b68b25ee2520976f899898a9882fdbcf2bd77c0bef92a47ca0487d04" +"T3T1_en_test_safety_checks.py::test_safety_checks_level_after_reboot[SafetyCheckLevel.PromptAlways--081810a6": "7d18d65883b195be762f7d2e7ca1337d19caf65eb4c2c439484a8abc0b7a9f32", +"T3T1_en_test_safety_checks.py::test_safety_checks_level_after_reboot[SafetyCheckLevel.PromptTempora-b3d21f4a": "b01f34ba8953a78b2fb235e345c862a54b91dd0ff4b072fa7172d0f24977558f", +"T3T1_en_test_safety_checks.py::test_safety_checks_level_after_reboot[SafetyCheckLevel.Strict-Safety-f1ff9c26": "5856901cae7d000f7db9a185676fcd2a32a748c42cbbeb50c1069ea842ce3247", +"T3T1_en_test_shamir_persistence.py::test_abort": "a1bb0393f40369d65478bd037fafdec4d64a37486cc432b68ffe7051c5f27df4", +"T3T1_en_test_shamir_persistence.py::test_recovery_multiple_resets": "cca49682544d6fce18e06c9d7f626787b7ebae95821c82a56fdc168d2c89a179", +"T3T1_en_test_shamir_persistence.py::test_recovery_on_old_wallet": "6bd027b12b00011e7fda75b13286751c67c7e279ff32e285f2a7ee7078f00aee", +"T3T1_en_test_shamir_persistence.py::test_recovery_single_reset": "8f2c5939c72cbd699820a81d4edd0b9a082684a6a79739312f9de067bdd47603", +"T3T1_en_test_wipe_code.py::test_wipe_code_activate_core": "d250aad4cba370f28bdac1c2e59b1dc59ba9fcbfd6ed7be5f0e74544a7851424" } } }