diff --git a/core/assets/check40.png b/core/assets/check40.png new file mode 100644 index 000000000..6e5e48114 Binary files /dev/null and b/core/assets/check40.png differ diff --git a/core/assets/menu.png b/core/assets/download32.png similarity index 55% rename from core/assets/menu.png rename to core/assets/download32.png index 55027b2da..bbd7ff7e8 100644 Binary files a/core/assets/menu.png and b/core/assets/download32.png differ diff --git a/core/assets/erase_big.png b/core/assets/erase_big.png deleted file mode 100644 index 4282cf69d..000000000 Binary files a/core/assets/erase_big.png and /dev/null differ diff --git a/core/assets/fire24.png b/core/assets/fire24.png new file mode 100644 index 000000000..f68163493 Binary files /dev/null and b/core/assets/fire24.png differ diff --git a/core/assets/fire32.png b/core/assets/fire32.png new file mode 100644 index 000000000..e22e038a7 Binary files /dev/null and b/core/assets/fire32.png differ diff --git a/core/assets/fire40.png b/core/assets/fire40.png new file mode 100644 index 000000000..48ee4f203 Binary files /dev/null and b/core/assets/fire40.png differ diff --git a/core/assets/close.png b/core/assets/menu32.png similarity index 60% rename from core/assets/close.png rename to core/assets/menu32.png index e75807674..383c6e7eb 100644 Binary files a/core/assets/close.png and b/core/assets/menu32.png differ diff --git a/core/assets/refresh24.png b/core/assets/refresh24.png new file mode 100644 index 000000000..a2fa27ace Binary files /dev/null and b/core/assets/refresh24.png differ diff --git a/core/assets/warning40.png b/core/assets/warning40.png new file mode 100644 index 000000000..711694f12 Binary files /dev/null and b/core/assets/warning40.png differ diff --git a/core/embed/bootloader/bootui.c b/core/embed/bootloader/bootui.c index ae5a9d6c8..141b60d96 100644 --- a/core/embed/bootloader/bootui.c +++ b/core/embed/bootloader/bootui.c @@ -190,11 +190,11 @@ void ui_screen_done(int restart_seconds, secbool full_redraw) { const char *str; char count_str[24]; if (restart_seconds >= 1) { - mini_snprintf(count_str, sizeof(count_str), "Done! Restarting in %d s", + mini_snprintf(count_str, sizeof(count_str), "DONE! RESTARTING IN %d", restart_seconds); str = count_str; } else { - str = "Done! Unplug the device."; + str = "DONE! RECONNECT THE DEVICE"; } screen_install_success(str, initial_setup, full_redraw); diff --git a/core/embed/bootloader/main.c b/core/embed/bootloader/main.c index cdcca3254..a00567ac3 100644 --- a/core/embed/bootloader/main.c +++ b/core/embed/bootloader/main.c @@ -146,11 +146,13 @@ static usb_result_t bootloader_usb_loop(const vendor_header *const vhdr, r = process_msg_WipeDevice(USB_IFACE_NUM, msg_size, buf); if (r < 0) { // error screen_wipe_fail(); + hal_delay(100); usb_stop(); usb_deinit(); return SHUTDOWN; } else { // success screen_wipe_success(); + hal_delay(100); usb_stop(); usb_deinit(); return SHUTDOWN; diff --git a/core/embed/rust/src/ui/component/pad.rs b/core/embed/rust/src/ui/component/pad.rs index 70a79707c..cf13ab452 100644 --- a/core/embed/rust/src/ui/component/pad.rs +++ b/core/embed/rust/src/ui/component/pad.rs @@ -18,6 +18,13 @@ impl Pad { } } + pub fn with_clear(self) -> Self { + Self { + clear: true, + ..self + } + } + pub fn place(&mut self, area: Rect) { self.area = area; } diff --git a/core/embed/rust/src/ui/model_tt/bootloader/confirm.rs b/core/embed/rust/src/ui/model_tt/bootloader/confirm.rs index e86aca6ad..943a3d5a3 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/confirm.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/confirm.rs @@ -9,8 +9,8 @@ use crate::ui::{ geometry::{Alignment, Insets, Offset, Point, Rect, TOP_CENTER}, model_tt::{ bootloader::theme::{ - button_bld_menu, BUTTON_AREA_START, CLOSE, CONTENT_PADDING, CORNER_BUTTON_AREA, - INFO_SMALL, TEXT_TITLE, TITLE_AREA, + button_bld_menu, BUTTON_AREA_START, BUTTON_HEIGHT, CONTENT_PADDING, CORNER_BUTTON_AREA, + CORNER_BUTTON_TOUCH_EXPANSION, INFO32, TEXT_TITLE, TITLE_AREA, TITLE_Y_ADJUSTMENT, X32, }, component::{Button, ButtonMsg::Clicked}, constant::WIDTH, @@ -18,6 +18,10 @@ use crate::ui::{ }, }; +const ICON_TOP: i16 = 17; +const CONTENT_START_WITH_ICON: i16 = 40 + CONTENT_PADDING; +const CONTENT_START: i16 = 58; + #[derive(Copy, Clone, ToPrimitive)] pub enum ConfirmMsg { Cancel = 1, @@ -29,27 +33,28 @@ pub struct Confirm<'a> { content_pad: Pad, bg_color: Color, icon: Option, - title: Option>>, - message: Child>>, - left: Child>, - right: Child>, + title: Option>>, + message: Child>, + alert: Option>>, + left_button: Child>, + right_button: Child>, info_button: Option>, close_button: Option>, info_title: Option>>, - info_text: Option>>, + info_text: Option>>>, show_info: bool, - - confirm_left: bool, } impl<'a> Confirm<'a> { + #[allow(clippy::too_many_arguments)] pub fn new( bg_color: Color, icon: Option, - left: Button<&'static str>, - right: Button<&'static str>, - confirm_left: bool, - confirm: (Option<&'static str>, Paragraphs>), + left_button: Button<&'static str>, + right_button: Button<&'static str>, + title: Option>, + msg: Label<&'a str>, + alert: Option>, info: Option<(&'static str, Paragraphs>)>, ) -> Self { let mut instance = Self { @@ -57,31 +62,29 @@ impl<'a> Confirm<'a> { content_pad: Pad::with_background(bg_color), bg_color, icon, - message: Child::new(confirm.1), - left: Child::new(left), - right: Child::new(right), + title: title.map(Child::new), + message: Child::new(msg), + alert: alert.map(Child::new), + left_button: Child::new(left_button), + right_button: Child::new(right_button), close_button: None, info_button: None, info_title: None, info_text: None, - confirm_left, show_info: false, - title: confirm - .0 - .map(|title| Child::new(Label::new(title, Alignment::Start, TEXT_TITLE))), }; if let Some((title, text)) = info { instance.info_title = Some(Child::new(Label::new(title, Alignment::Start, TEXT_TITLE))); - instance.info_text = Some(text); + instance.info_text = Some(text.into_child()); instance.info_button = Some( - Button::with_icon(Icon::new(INFO_SMALL)) + Button::with_icon(Icon::new(INFO32)) .styled(button_bld_menu()) - .with_expanded_touch_area(Insets::uniform(13)), + .with_expanded_touch_area(Insets::uniform(CORNER_BUTTON_TOUCH_EXPANSION)), ); instance.close_button = Some( - Button::with_icon(Icon::new(CLOSE)) + Button::with_icon(Icon::new(X32)) .styled(button_bld_menu()) - .with_expanded_touch_area(Insets::uniform(13)), + .with_expanded_touch_area(Insets::uniform(CORNER_BUTTON_TOUCH_EXPANSION)), ); } instance.bg.clear(); @@ -98,29 +101,86 @@ impl<'a> Component for Confirm<'a> { Point::zero(), Point::new(WIDTH, BUTTON_AREA_START), )); - let icon_height = if let Some(icon) = self.icon { - icon.toif.height() - } else { - 0 - }; - self.message.place(Rect::new( - Point::new(CONTENT_PADDING, 32 + icon_height), - Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START), - )); - let button_size = Offset::new(106, 38); - self.left.place(Rect::from_top_left_and_size( + let content_area_start = if self.icon.is_some() { + CONTENT_START_WITH_ICON + } else { + CONTENT_START + }; + + let content_area = Rect::new( + Point::new(CONTENT_PADDING, content_area_start), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING), + ); + + self.message.place(content_area); + let message_height = self.message.inner().area().height(); + + if let Some(alert) = &mut self.alert { + alert.place(content_area); + let alert_height = alert.inner().area().height(); + + let space_height = (content_area.height() - message_height - alert_height) / 3; + + self.message.place(Rect::new( + Point::new(CONTENT_PADDING, content_area_start + space_height), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START), + )); + self.alert.place(Rect::new( + Point::new( + CONTENT_PADDING, + content_area_start + 2 * space_height + message_height, + ), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START), + )); + } else { + self.message.place(Rect::new( + Point::new( + CONTENT_PADDING, + content_area.center().y - (message_height / 2), + ), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING), + )); + } + + let button_size = Offset::new((WIDTH - 3 * CONTENT_PADDING) / 2, BUTTON_HEIGHT); + self.left_button.place(Rect::from_top_left_and_size( Point::new(CONTENT_PADDING, BUTTON_AREA_START), button_size, )); - self.right.place(Rect::from_top_left_and_size( - Point::new(124, BUTTON_AREA_START), + self.right_button.place(Rect::from_top_left_and_size( + Point::new(2 * CONTENT_PADDING + button_size.x, BUTTON_AREA_START), button_size, )); self.info_button.place(CORNER_BUTTON_AREA); self.close_button.place(CORNER_BUTTON_AREA); - self.info_title.place(TITLE_AREA); - self.title.place(TITLE_AREA); + + if let Some(title) = self.info_title.as_mut() { + title.place(TITLE_AREA); + let title_height = title.inner().area().height(); + + title.place(Rect::new( + Point::new( + CONTENT_PADDING, + TITLE_AREA.center().y - (title_height / 2) - TITLE_Y_ADJUSTMENT, + ), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING), + )); + } + + if let Some(title) = self.title.as_mut() { + title.place(TITLE_AREA); + let title_height = title.inner().area().height(); + + title.place(Rect::new( + Point::new( + CONTENT_PADDING, + TITLE_AREA.center().y - (title_height / 2) - TITLE_Y_ADJUSTMENT, + ), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING), + )); + } + self.info_text.place(Rect::new( Point::new(CONTENT_PADDING, TITLE_AREA.y1), Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START), @@ -144,19 +204,11 @@ impl<'a> Component for Confirm<'a> { self.content_pad.clear(); return None; } - if let Some(Clicked) = self.left.event(ctx, event) { - return if self.confirm_left { - Some(Self::Msg::Confirm) - } else { - Some(Self::Msg::Cancel) - }; + if let Some(Clicked) = self.left_button.event(ctx, event) { + return Some(Self::Msg::Cancel); }; - if let Some(Clicked) = self.right.event(ctx, event) { - return if self.confirm_left { - Some(Self::Msg::Cancel) - } else { - Some(Self::Msg::Confirm) - }; + if let Some(Clicked) = self.right_button.event(ctx, event) { + return Some(Self::Msg::Confirm); }; None } @@ -169,17 +221,18 @@ impl<'a> Component for Confirm<'a> { self.close_button.paint(); self.info_title.paint(); self.info_text.paint(); - self.left.paint(); - self.right.paint(); + self.left_button.paint(); + self.right_button.paint(); } else { self.info_button.paint(); self.title.paint(); self.message.paint(); - self.left.paint(); - self.right.paint(); + self.alert.paint(); + self.left_button.paint(); + self.right_button.paint(); if let Some(icon) = self.icon { icon.draw( - Point::new(screen().center().x, 32), + Point::new(screen().center().x, ICON_TOP), TOP_CENTER, WHITE, self.bg_color, @@ -190,7 +243,7 @@ impl<'a> Component for Confirm<'a> { #[cfg(feature = "ui_bounds")] fn bounds(&self, sink: &mut dyn FnMut(Rect)) { - self.left.bounds(sink); - self.right.bounds(sink); + self.left_button.bounds(sink); + self.right_button.bounds(sink); } } diff --git a/core/embed/rust/src/ui/model_tt/bootloader/intro.rs b/core/embed/rust/src/ui/model_tt/bootloader/intro.rs index e275e152d..4ec81114b 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/intro.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/intro.rs @@ -7,14 +7,17 @@ use crate::ui::{ display::Icon, geometry::{Alignment, Insets, Point, Rect}, model_tt::{ - bootloader::theme::{button_bld_menu, button_bld_menu_item, BLD_BG, MENU}, + bootloader::theme::{button_bld, button_bld_menu, BLD_BG, MENU32}, component::ButtonMsg::Clicked, }, }; use heapless::String; use crate::ui::model_tt::{ - bootloader::theme::{CONTENT_PADDING, CORNER_BUTTON_AREA, TEXT_TITLE, TITLE_AREA}, + bootloader::theme::{ + BUTTON_AREA_START, BUTTON_HEIGHT, CONTENT_PADDING, CORNER_BUTTON_AREA, TEXT_TITLE, + TITLE_AREA, TITLE_Y_ADJUSTMENT, + }, component::Button, constant::WIDTH, }; @@ -40,20 +43,17 @@ impl<'a> Intro<'a> { unwrap!(title.push_str("BOOTLOADER ")); unwrap!(title.push_str(bld_version)); - let mut instance = Self { - bg: Pad::with_background(BLD_BG), + Self { + bg: Pad::with_background(BLD_BG).with_clear(), title: Child::new(Label::new(title, Alignment::Start, TEXT_TITLE)), menu: Child::new( - Button::with_icon(Icon::new(MENU)) + Button::with_icon(Icon::new(MENU32)) .styled(button_bld_menu()) .with_expanded_touch_area(Insets::uniform(13)), ), - host: Child::new(Button::with_text("INSTALL FIRMWARE").styled(button_bld_menu_item())), + host: Child::new(Button::with_text("INSTALL FIRMWARE").styled(button_bld())), text: Child::new(content), - }; - - instance.bg.clear(); - instance + } } } @@ -61,17 +61,26 @@ impl<'a> Component for Intro<'a> { type Msg = IntroMsg; fn place(&mut self, bounds: Rect) -> Rect { - const BUTTON_AREA_START: i16 = 188; self.bg.place(screen()); + self.title.place(TITLE_AREA); + let title_height = self.title.inner().area().height(); + self.title.place(Rect::new( + Point::new( + CONTENT_PADDING, + TITLE_AREA.center().y - (title_height / 2) - TITLE_Y_ADJUSTMENT, + ), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING), + )); + self.menu.place(CORNER_BUTTON_AREA); self.host.place(Rect::new( - Point::new(10, BUTTON_AREA_START), - Point::new(10 + 220, BUTTON_AREA_START + 38), + Point::new(CONTENT_PADDING, BUTTON_AREA_START), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START + BUTTON_HEIGHT), )); self.text.place(Rect::new( - Point::new(CONTENT_PADDING, 75), - Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START), + Point::new(CONTENT_PADDING, TITLE_AREA.y1 + CONTENT_PADDING), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START - CONTENT_PADDING), )); bounds } diff --git a/core/embed/rust/src/ui/model_tt/bootloader/menu.rs b/core/embed/rust/src/ui/model_tt/bootloader/menu.rs index 820bc234a..319fa5f82 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/menu.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/menu.rs @@ -1,18 +1,22 @@ use crate::ui::{ component::{Child, Component, Event, EventCtx, Label, Pad}, - constant::{screen, WIDTH}, + constant::{screen, HEIGHT, WIDTH}, display::Icon, geometry::{Alignment, Insets, Point, Rect}, model_tt::{ bootloader::theme::{ - button_bld_menu, button_bld_menu_item, BLD_BG, CLOSE, CONTENT_PADDING, - CORNER_BUTTON_AREA, ERASE, REBOOT, TEXT_TITLE, TITLE_AREA, + button_bld, button_bld_menu, BLD_BG, BUTTON_HEIGHT, CONTENT_PADDING, + CORNER_BUTTON_AREA, CORNER_BUTTON_TOUCH_EXPANSION, FIRE24, REFRESH24, TEXT_TITLE, + TITLE_AREA, TITLE_Y_ADJUSTMENT, X32, }, component::{Button, ButtonMsg::Clicked, IconText}, }, }; use heapless::String; +const BUTTON_AREA_START: i16 = 56; +const BUTTON_SPACING: i16 = 8; + #[repr(u32)] #[derive(Copy, Clone, ToPrimitive)] pub enum MenuMsg { @@ -30,28 +34,23 @@ pub struct Menu { } impl Menu { - pub fn new(bld_version: &'static str) -> Self { - let content_reboot = IconText::new("REBOOT TREZOR", Icon::new(REBOOT)); - let content_reset = IconText::new("FACTORY RESET", Icon::new(ERASE)); + pub fn new(_bld_version: &'static str) -> Self { + let content_reboot = IconText::new("REBOOT TREZOR", Icon::new(REFRESH24)); + let content_reset = IconText::new("FACTORY RESET", Icon::new(FIRE24)); let mut title: String<32> = String::new(); unwrap!(title.push_str("BOOTLOADER ")); - unwrap!(title.push_str(bld_version)); let mut instance = Self { bg: Pad::with_background(BLD_BG), title: Child::new(Label::new(title, Alignment::Start, TEXT_TITLE)), close: Child::new( - Button::with_icon(Icon::new(CLOSE)) + Button::with_icon(Icon::new(X32)) .styled(button_bld_menu()) - .with_expanded_touch_area(Insets::uniform(13)), - ), - reboot: Child::new( - Button::with_icon_and_text(content_reboot).styled(button_bld_menu_item()), - ), - reset: Child::new( - Button::with_icon_and_text(content_reset).styled(button_bld_menu_item()), + .with_expanded_touch_area(Insets::uniform(CORNER_BUTTON_TOUCH_EXPANSION)), ), + reboot: Child::new(Button::with_icon_and_text(content_reboot).styled(button_bld())), + reset: Child::new(Button::with_icon_and_text(content_reset).styled(button_bld())), }; instance.bg.clear(); instance @@ -64,14 +63,28 @@ impl Component for Menu { fn place(&mut self, bounds: Rect) -> Rect { self.bg.place(screen()); self.title.place(TITLE_AREA); + let title_height = self.title.inner().area().height(); + self.title.place(Rect::new( + Point::new( + CONTENT_PADDING, + TITLE_AREA.center().y - (title_height / 2) - TITLE_Y_ADJUSTMENT, + ), + Point::new(WIDTH - CONTENT_PADDING, HEIGHT), + )); self.close.place(CORNER_BUTTON_AREA); self.reboot.place(Rect::new( - Point::new(CONTENT_PADDING, 64), - Point::new(WIDTH - CONTENT_PADDING, 64 + 38), + Point::new(CONTENT_PADDING, BUTTON_AREA_START), + Point::new(WIDTH - CONTENT_PADDING, BUTTON_AREA_START + BUTTON_HEIGHT), )); self.reset.place(Rect::new( - Point::new(CONTENT_PADDING, 110), - Point::new(WIDTH - CONTENT_PADDING, 110 + 38), + Point::new( + CONTENT_PADDING, + BUTTON_AREA_START + BUTTON_HEIGHT + BUTTON_SPACING, + ), + Point::new( + WIDTH - CONTENT_PADDING, + BUTTON_AREA_START + 2 * BUTTON_HEIGHT + BUTTON_SPACING, + ), )); bounds } diff --git a/core/embed/rust/src/ui/model_tt/bootloader/mod.rs b/core/embed/rust/src/ui/model_tt/bootloader/mod.rs index 79f4a8875..3f9b8c77a 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/mod.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/mod.rs @@ -1,7 +1,7 @@ use crate::{ trezorhal::io::io_touch_read, ui::{ - component::{Component, Event, EventCtx, Never}, + component::{Component, Event, EventCtx, Label, Never}, display::{self, Font}, event::TouchEvent, geometry::Point, @@ -23,20 +23,20 @@ use crate::{ component::text::paragraphs::{Paragraph, ParagraphVecShort, Paragraphs, VecExt}, constant::screen, display::{Color, Icon}, - geometry::{LinearPlacement, CENTER}, + geometry::{Alignment, LinearPlacement, CENTER}, model_tt::{ bootloader::{ connect::Connect, theme::{ - button_install_cancel, button_install_confirm, button_wipe_cancel, - button_wipe_confirm, BLD_BG, BLD_FG, BLD_WIPE_COLOR, ERASE_BIG, LOGO_EMPTY, - RECEIVE, TEXT_WIPE_BOLD, WELCOME_COLOR, + button_bld, button_confirm, button_wipe_cancel, button_wipe_confirm, BLD_BG, + BLD_BTN_COLOR, BLD_FG, BLD_WIPE_CANCEL_BTN_COLOR, BLD_WIPE_COLOR, CHECK24, + CHECK40, DOWNLOAD32, FIRE32, FIRE40, LOGO_EMPTY, TEXT_WIPE_BOLD, + TEXT_WIPE_NORMAL, WARNING40, WELCOME_COLOR, WELCOME_HIGHLIGHT_COLOR, X24, }, }, component::{Button, ResultScreen}, theme::{ - BACKLIGHT_DIM, BACKLIGHT_NORMAL, BG, BLACK, FG, GREY_DARK, ICON_SUCCESS_SMALL, - ICON_WARN_SMALL, TEXT_ERROR_BOLD, TEXT_ERROR_NORMAL, WHITE, + BACKLIGHT_DIM, BACKLIGHT_NORMAL, BLACK, FG, GREY_DARK, TEXT_ERROR_HIGHLIGHT, WHITE, }, }, util::{from_c_array, from_c_str}, @@ -66,11 +66,11 @@ where } fn fadein() { - display::fade_backlight_duration(BACKLIGHT_NORMAL, 500); + display::fade_backlight_duration(BACKLIGHT_NORMAL, 150); } fn fadeout() { - display::fade_backlight_duration(BACKLIGHT_DIM, 500); + display::fade_backlight_duration(BACKLIGHT_DIM, 150); } fn run(frame: &mut F) -> u32 @@ -145,34 +145,31 @@ extern "C" fn screen_install_confirm( core::str::from_utf8_unchecked(fingerprint_buffer.as_ref()) }; - let mut version_str: String<64> = String::new(); + let mut version_str: String<128> = String::new(); unwrap!(version_str.push_str("Firmware version ")); unwrap!(version_str.push_str(version)); - - let mut vendor_str: String<64> = String::new(); - unwrap!(vendor_str.push_str("by ")); - unwrap!(vendor_str.push_str(text)); + unwrap!(version_str.push_str("\nby ")); + unwrap!(version_str.push_str(text)); let title = if downgrade { - "DOWNGRADE FW" + Label::new("DOWNGRADE FW", Alignment::Start, theme::TEXT_BOLD) } else if vendor { - "CHANGE FW VENDOR" + Label::new("CHANGE FW\nVENDOR", Alignment::Start, theme::TEXT_BOLD) } else { - "UPDATE FIRMWARE" + Label::new("UPDATE FIRMWARE", Alignment::Start, theme::TEXT_BOLD) }; - let mut messages = ParagraphVecShort::new(); + let msg = Label::new(version_str.as_ref(), Alignment::Start, theme::TEXT_NORMAL); - messages.add(Paragraph::new(&theme::TEXT_NORMAL, version_str.as_ref())); - messages.add(Paragraph::new(&theme::TEXT_NORMAL, vendor_str.as_ref())); - - if vendor || downgrade { - messages - .add(Paragraph::new(&theme::TEXT_BOLD, "Seed will be erased!").with_top_padding(16)); - } - - let message = - Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); + let alert = if vendor || downgrade { + Some(Label::new( + "SEED WILL BE ERASED!", + Alignment::Start, + theme::TEXT_BOLD, + )) + } else { + None + }; let mut messages = ParagraphVecShort::new(); messages.add(Paragraph::new(&theme::TEXT_FINGERPRINT, fingerprint_str)); @@ -180,16 +177,24 @@ extern "C" fn screen_install_confirm( let fingerprint = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); - let left = Button::with_text("CANCEL").styled(button_install_cancel()); - let right = Button::with_text("INSTALL").styled(button_install_confirm()); + let (left, right) = if !(vendor || downgrade) { + let l = Button::with_text("CANCEL").styled(button_bld()); + let r = Button::with_text("INSTALL").styled(button_confirm()); + (l, r) + } else { + let l = Button::with_icon(Icon::new(X24)).styled(button_bld()); + let r = Button::with_icon(Icon::new(CHECK24)).styled(button_confirm()); + (l, r) + }; let mut frame = Confirm::new( BLD_BG, None, left, right, - false, - (Some(title), message), + Some(title), + msg, + alert, Some(("FW FINGERPRINT", fingerprint)), ); @@ -198,32 +203,30 @@ extern "C" fn screen_install_confirm( #[no_mangle] extern "C" fn screen_wipe_confirm() -> u32 { - let icon = Some(Icon::new(ERASE_BIG)); + let icon = Some(Icon::new(FIRE40)); - let mut messages = ParagraphVecShort::new(); - - messages.add( - Paragraph::new( - &TEXT_ERROR_NORMAL, - "Are you sure you want to factory reset the device?", - ) - .centered(), + let msg = Label::new( + "Are you sure you want to factory reset the device?", + Alignment::Center, + TEXT_WIPE_NORMAL, + ); + let alert = Label::new( + "SEED AND FIRMWARE\nWILL BE ERASED!", + Alignment::Center, + TEXT_WIPE_BOLD, ); - messages.add(Paragraph::new(&TEXT_ERROR_BOLD, "Seed and firmware\nwill be erased!").centered()); - let message = - Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); - - let left = Button::with_text("RESET").styled(button_wipe_confirm()); - let right = Button::with_text("CANCEL").styled(button_wipe_cancel()); + let right = Button::with_text("RESET").styled(button_wipe_confirm()); + let left = Button::with_text("CANCEL").styled(button_wipe_cancel()); let mut frame = Confirm::new( BLD_WIPE_COLOR, icon, left, right, - true, - (None, message), + None, + msg, + Some(alert), None, ); @@ -261,7 +264,7 @@ extern "C" fn screen_intro( messages.add(Paragraph::new(&theme::TEXT_NORMAL, fw.as_ref())); messages.add(Paragraph::new(&theme::TEXT_NORMAL, vendor_.as_ref())); - let p = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_start()); + let p = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); let mut frame = Intro::new(bld_version, p); @@ -282,7 +285,7 @@ fn screen_progress( } display::text_center( - Point::new(constant::WIDTH / 2, 214), + Point::new(constant::WIDTH / 2, 195), text, Font::NORMAL, fg_color, @@ -296,28 +299,28 @@ fn screen_progress( #[no_mangle] extern "C" fn screen_install_progress(progress: u16, initialize: bool, initial_setup: bool) { - let bg_color = if initial_setup { WELCOME_COLOR } else { BG }; + let bg_color = if initial_setup { WELCOME_COLOR } else { BLD_BG }; let fg_color = if initial_setup { FG } else { BLD_FG }; screen_progress( - "Installing firmware...", + "Installing firmware", progress, initialize, fg_color, bg_color, - Some((Icon::new(RECEIVE), fg_color)), + Some((Icon::new(DOWNLOAD32), fg_color)), ) } #[no_mangle] extern "C" fn screen_wipe_progress(progress: u16, initialize: bool) { screen_progress( - "Resetting Trezor...", + "Resetting Trezor", progress, initialize, theme::BLD_FG, BLD_WIPE_COLOR, - Some((Icon::new(ERASE_BIG), theme::BLD_FG)), + Some((Icon::new(FIRE32), theme::BLD_FG)), ) } @@ -331,15 +334,15 @@ extern "C" fn screen_connect() { extern "C" fn screen_wipe_success() { let mut messages = ParagraphVecShort::new(); - messages.add(Paragraph::new(&TEXT_ERROR_BOLD, "Trezor reset").centered()); - messages.add(Paragraph::new(&TEXT_ERROR_BOLD, "successfully.").centered()); + messages.add(Paragraph::new(&TEXT_WIPE_NORMAL, "Trezor reset").centered()); + messages.add(Paragraph::new(&TEXT_WIPE_NORMAL, "successfully").centered()); let m_top = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); let mut messages = ParagraphVecShort::new(); - messages.add(Paragraph::new(&TEXT_WIPE_BOLD, "PLEASE RECONNECT").centered()); - messages.add(Paragraph::new(&TEXT_WIPE_BOLD, "THE DEVICE").centered()); + messages.add(Paragraph::new(&TEXT_ERROR_HIGHLIGHT, "PLEASE RECONNECT").centered()); + messages.add(Paragraph::new(&TEXT_ERROR_HIGHLIGHT, "THE DEVICE").centered()); let m_bottom = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); @@ -347,7 +350,8 @@ extern "C" fn screen_wipe_success() { let mut frame = ResultScreen::new( WHITE, BLD_WIPE_COLOR, - Icon::new(ICON_SUCCESS_SMALL), + BLD_WIPE_CANCEL_BTN_COLOR, + Icon::new(CHECK40), m_top, m_bottom, true, @@ -359,22 +363,23 @@ extern "C" fn screen_wipe_success() { extern "C" fn screen_wipe_fail() { let mut messages = ParagraphVecShort::new(); - messages.add(Paragraph::new(&TEXT_ERROR_BOLD, "Trezor reset was").centered()); - messages.add(Paragraph::new(&TEXT_ERROR_BOLD, "not successful.").centered()); + messages.add(Paragraph::new(&TEXT_WIPE_NORMAL, "Trezor reset was").centered()); + messages.add(Paragraph::new(&TEXT_WIPE_NORMAL, "not successful.").centered()); let m_top = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); let mut messages = ParagraphVecShort::new(); - messages.add(Paragraph::new(&TEXT_WIPE_BOLD, "PLEASE RECONNECT").centered()); - messages.add(Paragraph::new(&TEXT_WIPE_BOLD, "THE DEVICE").centered()); + messages.add(Paragraph::new(&TEXT_ERROR_HIGHLIGHT, "PLEASE RECONNECT").centered()); + messages.add(Paragraph::new(&TEXT_ERROR_HIGHLIGHT, "THE DEVICE").centered()); let m_bottom = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); let mut frame = ResultScreen::new( WHITE, BLD_WIPE_COLOR, - Icon::new(ICON_WARN_SMALL), + BLD_WIPE_CANCEL_BTN_COLOR, + Icon::new(WARNING40), m_top, m_bottom, true, @@ -408,8 +413,8 @@ extern "C" fn screen_boot_empty(firmware_present: bool, fading: bool) { #[no_mangle] extern "C" fn screen_install_fail() { let mut messages = ParagraphVecShort::new(); - messages.add(Paragraph::new(&theme::TEXT_BOLD, "Firmware installation was").centered()); - messages.add(Paragraph::new(&theme::TEXT_BOLD, "not successful.").centered()); + messages.add(Paragraph::new(&theme::TEXT_NORMAL, "Firmware installation was").centered()); + messages.add(Paragraph::new(&theme::TEXT_NORMAL, "not successful.").centered()); let m_top = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); @@ -423,7 +428,8 @@ extern "C" fn screen_install_fail() { let mut frame = ResultScreen::new( WHITE, BLD_BG, - Icon::new(ICON_WARN_SMALL), + BLD_BTN_COLOR, + Icon::new(WARNING40), m_top, m_bottom, true, @@ -433,8 +439,8 @@ extern "C" fn screen_install_fail() { fn screen_install_success_bld(msg: &'static str, complete_draw: bool) { let mut messages = ParagraphVecShort::new(); - messages.add(Paragraph::new(&theme::TEXT_BOLD, "Firmware installed").centered()); - messages.add(Paragraph::new(&theme::TEXT_BOLD, "successfully.").centered()); + messages.add(Paragraph::new(&theme::TEXT_NORMAL, "Firmware installed").centered()); + messages.add(Paragraph::new(&theme::TEXT_NORMAL, "successfully").centered()); let m_top = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); @@ -446,7 +452,8 @@ fn screen_install_success_bld(msg: &'static str, complete_draw: bool) { let mut frame = ResultScreen::new( WHITE, BLD_BG, - Icon::new(ICON_SUCCESS_SMALL), + BLD_BTN_COLOR, + Icon::new(CHECK40), m_top, m_bottom, complete_draw, @@ -456,8 +463,8 @@ fn screen_install_success_bld(msg: &'static str, complete_draw: bool) { fn screen_install_success_initial(msg: &'static str, complete_draw: bool) { let mut messages = ParagraphVecShort::new(); - messages.add(Paragraph::new(&theme::TEXT_WELCOME_BOLD, "Firmware installed").centered()); - messages.add(Paragraph::new(&theme::TEXT_WELCOME_BOLD, "successfully.").centered()); + messages.add(Paragraph::new(&theme::TEXT_WELCOME_URL, "Firmware installed").centered()); + messages.add(Paragraph::new(&theme::TEXT_WELCOME_URL, "successfully").centered()); let m_top = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); @@ -471,7 +478,8 @@ fn screen_install_success_initial(msg: &'static str, complete_draw: bool) { let mut frame = ResultScreen::new( FG, WELCOME_COLOR, - Icon::new(ICON_SUCCESS_SMALL), + WELCOME_HIGHLIGHT_COLOR, + Icon::new(CHECK40), m_top, m_bottom, complete_draw, @@ -501,11 +509,7 @@ extern "C" fn screen_welcome() { let mut messages = ParagraphVecShort::new(); messages.add(Paragraph::new(&theme::TEXT_WELCOME, "Get started with").centered()); messages.add(Paragraph::new(&theme::TEXT_WELCOME, "your trezor at").centered()); - messages.add( - Paragraph::new(&theme::TEXT_WELCOME_BOLD, "trezor.io/start") - .centered() - .with_top_padding(2), - ); + messages.add(Paragraph::new(&theme::TEXT_WELCOME_URL, "trezor.io/start").centered()); let mut frame = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); show(&mut frame, false); diff --git a/core/embed/rust/src/ui/model_tt/bootloader/theme.rs b/core/embed/rust/src/ui/model_tt/bootloader/theme.rs index bba7416a1..090df5b13 100644 --- a/core/embed/rust/src/ui/model_tt/bootloader/theme.rs +++ b/core/embed/rust/src/ui/model_tt/bootloader/theme.rs @@ -1,107 +1,77 @@ -use crate::{ - alpha, - ui::{ - component::{text::TextStyle, LineBreaking::BreakWordsNoHyphen}, - constant::WIDTH, - display::{Color, Font}, - geometry::{Offset, Point, Rect}, - model_tt::{ - component::{ButtonStyle, ButtonStyleSheet}, - theme::{BLACK, FG, GREY_DARK, GREY_LIGHT, GREY_MEDIUM, WHITE}, - }, +use crate::ui::{ + component::{text::TextStyle, LineBreaking::BreakWordsNoHyphen}, + constant::WIDTH, + display::{Color, Font}, + geometry::{Offset, Point, Rect}, + model_tt::{ + component::{ButtonStyle, ButtonStyleSheet}, + theme::{BLACK, FG, GREY_DARK, GREY_LIGHT, GREY_MEDIUM, WHITE}, }, }; -pub const BLD_BG: Color = Color::rgb(0x00, 0x17, 0xA3); +pub const BLD_BG: Color = Color::rgb(0x00, 0x1E, 0xAD); pub const BLD_FG: Color = WHITE; -pub const BLD_WIPE_COLOR: Color = Color::rgb(0xAD, 0x2B, 0x2B); -pub const BLD_WIPE_TEXT_COLOR: Color = Color::rgb(0xD6, 0x95, 0x95); +pub const BLD_WIPE_COLOR: Color = Color::rgb(0xE7, 0x0E, 0x0E); +pub const BLD_WIPE_TEXT_COLOR: Color = WHITE; -pub const BLD_WIPE_BTN_COLOR: Color = Color::alpha(BLD_WIPE_COLOR, alpha!(0.3)); -pub const BLD_WIPE_BTN_COLOR_ACTIVE: Color = Color::rgb(0xB9, 0x4B, 0x4B); -pub const BLD_WIPE_CANCEL_BTN_COLOR_ACTIVE: Color = Color::rgb(0xF3, 0xDF, 0xDF); +pub const BLD_WIPE_BTN_COLOR: Color = WHITE; +pub const BLD_WIPE_BTN_COLOR_ACTIVE: Color = Color::rgb(0xFA, 0xCF, 0xCF); -pub const BLD_INSTALL_BTN_COLOR: Color = Color::alpha(BLD_BG, alpha!(0.3)); -pub const BLD_INSTALL_BTN_COLOR_ACTIVE: Color = Color::rgb(0xD9, 0xDC, 0xF1); -pub const BLD_INSTALL_CANCEL_BTN_COLOR_ACTIVE: Color = Color::rgb(0x26, 0x3A, 0xB1); +pub const BLD_WIPE_CANCEL_BTN_COLOR: Color = Color::rgb(0xFF, 0x41, 0x41); +pub const BLD_WIPE_CANCEL_BTN_COLOR_ACTIVE: Color = Color::rgb(0xAE, 0x09, 0x09); -pub const BLD_COLOR_SUBMSG: Color = Color::rgb(0x80, 0x8B, 0xD1); +pub const BLD_INSTALL_BTN_COLOR_ACTIVE: Color = Color::rgb(0xCD, 0xD2, 0xEF); -pub const BLD_BTN_MENU_COLOR: Color = Color::alpha(BLD_BG, alpha!(0.22)); -pub const BLD_BTN_MENU_COLOR_ACTIVE: Color = Color::alpha(BLD_BG, alpha!(0.11)); -pub const BLD_BTN_MENUITEM_COLOR: Color = Color::alpha(BLD_BG, alpha!(0.33)); -pub const BLD_BTN_MENUITEM_COLOR_ACTIVE: Color = - Color::rgba(BLD_BG, 0xFF, 0xFF, 0xFF, alpha!(0.11)); -pub const BLD_TITLE_COLOR: Color = Color::rgba(BLD_BG, 0xFF, 0xFF, 0xFF, alpha!(0.75)); +pub const BLD_BTN_COLOR: Color = Color::rgb(0x2D, 0x42, 0xBF); +pub const BLD_BTN_COLOR_ACTIVE: Color = Color::rgb(0x04, 0x10, 0x58); + +pub const BLD_TITLE_COLOR: Color = WHITE; pub const WELCOME_COLOR: Color = BLACK; +pub const WELCOME_HIGHLIGHT_COLOR: Color = Color::rgb(0x28, 0x28, 0x28); // Commonly used corner radius (i.e. for buttons). pub const RADIUS: u8 = 2; // Commonly used constants for UI elements. -pub const CONTENT_PADDING: i16 = 10; -pub const TITLE_AREA: Rect = Rect::new(Point::new(15, 14), Point::new(200, 30)); -pub const CORNER_BUTTON_SIZE: i16 = 32; -pub const CORNER_BUTTON_PADDING: i16 = 8; +pub const CONTENT_PADDING: i16 = 6; +pub const TITLE_AREA: Rect = Rect::new( + Point::new(CONTENT_PADDING, CONTENT_PADDING), + Point::new(WIDTH, CORNER_BUTTON_SIZE + CONTENT_PADDING), +); + +pub const CORNER_BUTTON_TOUCH_EXPANSION: i16 = 13; +pub const CORNER_BUTTON_SIZE: i16 = 44; pub const CORNER_BUTTON_AREA: Rect = Rect::from_top_left_and_size( Point::new( - WIDTH - CORNER_BUTTON_SIZE - CORNER_BUTTON_PADDING, - CORNER_BUTTON_PADDING, + WIDTH - CORNER_BUTTON_SIZE - CONTENT_PADDING, + CONTENT_PADDING, ), Offset::uniform(CORNER_BUTTON_SIZE), ); pub const TITLE_AREA_HEIGHT: i16 = 16; pub const TITLE_AREA_START_Y: i16 = 8; -pub const BUTTON_AREA_START: i16 = 188; - -// UI icons. -pub const ICON_CANCEL: &[u8] = include_res!("model_tt/res/x24.toif"); -pub const ICON_CONFIRM: &[u8] = include_res!("model_tt/res/check24.toif"); +pub const BUTTON_AREA_START: i16 = 184; +pub const BUTTON_HEIGHT: i16 = 50; +pub const TITLE_Y_ADJUSTMENT: i16 = 3; // BLD icons -pub const CLOSE: &[u8] = include_res!("model_tt/res/close.toif"); -pub const ERASE: &[u8] = include_res!("model_tt/res/erase.toif"); -pub const ERASE_BIG: &[u8] = include_res!("model_tt/res/erase_big.toif"); -pub const REBOOT: &[u8] = include_res!("model_tt/res/reboot.toif"); -pub const MENU: &[u8] = include_res!("model_tt/res/menu.toif"); -pub const RECEIVE: &[u8] = include_res!("model_tt/res/receive.toif"); +pub const X24: &[u8] = include_res!("model_tt/res/x24.toif"); +pub const X32: &[u8] = include_res!("model_tt/res/x32.toif"); +pub const FIRE24: &[u8] = include_res!("model_tt/res/fire24.toif"); +pub const FIRE32: &[u8] = include_res!("model_tt/res/fire32.toif"); +pub const FIRE40: &[u8] = include_res!("model_tt/res/fire40.toif"); +pub const REFRESH24: &[u8] = include_res!("model_tt/res/refresh24.toif"); +pub const MENU32: &[u8] = include_res!("model_tt/res/menu32.toif"); +pub const INFO32: &[u8] = include_res!("model_tt/res/info32.toif"); +pub const DOWNLOAD32: &[u8] = include_res!("model_tt/res/download32.toif"); +pub const WARNING40: &[u8] = include_res!("model_tt/res/warning40.toif"); +pub const CHECK24: &[u8] = include_res!("model_tt/res/check24.toif"); +pub const CHECK40: &[u8] = include_res!("model_tt/res/check40.toif"); + pub const LOGO_EMPTY: &[u8] = include_res!("model_tt/res/trezor_empty.toif"); -pub const INFO_SMALL: &[u8] = include_res!("model_tt/res/info_small.toif"); -pub fn button_install_cancel() -> ButtonStyleSheet { - ButtonStyleSheet { - normal: &ButtonStyle { - font: Font::BOLD, - text_color: WHITE, - button_color: BLD_BTN_MENUITEM_COLOR, - background_color: BLD_BG, - border_color: BLD_BG, - border_radius: RADIUS, - border_width: 0, - }, - active: &ButtonStyle { - font: Font::BOLD, - text_color: WHITE, - button_color: BLD_INSTALL_CANCEL_BTN_COLOR_ACTIVE, - background_color: BLD_BG, - border_color: BLD_BG, - border_radius: RADIUS, - border_width: 0, - }, - disabled: &ButtonStyle { - font: Font::BOLD, - text_color: GREY_LIGHT, - button_color: GREY_DARK, - background_color: WHITE, - border_color: WHITE, - border_radius: RADIUS, - border_width: 0, - }, - } -} - -pub fn button_install_confirm() -> ButtonStyleSheet { +pub fn button_confirm() -> ButtonStyleSheet { ButtonStyleSheet { normal: &ButtonStyle { font: Font::BOLD, @@ -137,8 +107,8 @@ pub fn button_wipe_cancel() -> ButtonStyleSheet { ButtonStyleSheet { normal: &ButtonStyle { font: Font::BOLD, - text_color: BLD_WIPE_COLOR, - button_color: WHITE, + text_color: WHITE, + button_color: BLD_WIPE_CANCEL_BTN_COLOR, background_color: BLD_WIPE_COLOR, border_color: BLD_WIPE_COLOR, border_radius: RADIUS, @@ -146,7 +116,7 @@ pub fn button_wipe_cancel() -> ButtonStyleSheet { }, active: &ButtonStyle { font: Font::BOLD, - text_color: BLD_WIPE_COLOR, + text_color: WHITE, button_color: BLD_WIPE_CANCEL_BTN_COLOR_ACTIVE, background_color: BLD_WIPE_COLOR, border_color: BLD_WIPE_COLOR, @@ -169,7 +139,7 @@ pub fn button_wipe_confirm() -> ButtonStyleSheet { ButtonStyleSheet { normal: &ButtonStyle { font: Font::BOLD, - text_color: WHITE, + text_color: BLD_WIPE_COLOR, button_color: BLD_WIPE_BTN_COLOR, background_color: BLD_WIPE_COLOR, border_color: BLD_WIPE_COLOR, @@ -178,7 +148,7 @@ pub fn button_wipe_confirm() -> ButtonStyleSheet { }, active: &ButtonStyle { font: Font::BOLD, - text_color: WHITE, + text_color: BLD_WIPE_COLOR, button_color: BLD_WIPE_BTN_COLOR_ACTIVE, background_color: BLD_WIPE_COLOR, border_color: BLD_WIPE_COLOR, @@ -202,39 +172,39 @@ pub fn button_bld_menu() -> ButtonStyleSheet { normal: &ButtonStyle { font: Font::BOLD, text_color: BLD_FG, - button_color: BLD_BTN_MENU_COLOR, + button_color: BLD_BG, background_color: BLD_BG, - border_color: BLD_BG, - border_radius: 4, - border_width: 0, + border_color: BLD_BTN_COLOR, + border_radius: 2, + border_width: 2, }, active: &ButtonStyle { font: Font::BOLD, text_color: BLD_FG, - button_color: BLD_BTN_MENU_COLOR_ACTIVE, + button_color: BLD_BG, background_color: BLD_BG, - border_color: BLD_BG, - border_radius: 4, - border_width: 0, + border_color: BLD_BTN_COLOR_ACTIVE, + border_radius: 2, + border_width: 2, }, disabled: &ButtonStyle { font: Font::BOLD, text_color: GREY_LIGHT, - button_color: BLD_BTN_MENU_COLOR, + button_color: BLD_BG, background_color: BLD_BG, border_color: BLD_BG, - border_radius: 4, - border_width: 0, + border_radius: 2, + border_width: 2, }, } } -pub fn button_bld_menu_item() -> ButtonStyleSheet { +pub fn button_bld() -> ButtonStyleSheet { ButtonStyleSheet { normal: &ButtonStyle { font: Font::BOLD, text_color: BLD_FG, - button_color: BLD_BTN_MENUITEM_COLOR, + button_color: BLD_BTN_COLOR, background_color: BLD_BG, border_color: BLD_BG, border_radius: 4, @@ -243,7 +213,7 @@ pub fn button_bld_menu_item() -> ButtonStyleSheet { active: &ButtonStyle { font: Font::BOLD, text_color: BLD_FG, - button_color: BLD_BTN_MENUITEM_COLOR_ACTIVE, + button_color: BLD_BTN_COLOR_ACTIVE, background_color: BLD_BG, border_color: BLD_BG, border_radius: 4, @@ -252,7 +222,7 @@ pub fn button_bld_menu_item() -> ButtonStyleSheet { disabled: &ButtonStyle { font: Font::BOLD, text_color: GREY_LIGHT, - button_color: BLD_BTN_MENUITEM_COLOR, + button_color: BLD_BTN_COLOR, background_color: BLD_BG, border_color: BLD_BG, border_radius: 4, @@ -267,7 +237,7 @@ pub const TEXT_WELCOME: TextStyle = TextStyle::new( GREY_MEDIUM, GREY_MEDIUM, ); -pub const TEXT_WELCOME_BOLD: TextStyle = TextStyle::new(Font::BOLD, FG, WELCOME_COLOR, FG, FG); +pub const TEXT_WELCOME_URL: TextStyle = TextStyle::new(Font::NORMAL, FG, WELCOME_COLOR, FG, FG); pub const TEXT_TITLE: TextStyle = TextStyle::new( Font::BOLD, BLD_TITLE_COLOR, @@ -277,8 +247,8 @@ pub const TEXT_TITLE: TextStyle = TextStyle::new( ); pub const TEXT_SUBMSG_INITIAL: TextStyle = TextStyle::new( Font::BOLD, - GREY_MEDIUM, - WELCOME_COLOR, + WHITE, + WELCOME_HIGHLIGHT_COLOR, GREY_MEDIUM, GREY_MEDIUM, ); @@ -295,10 +265,11 @@ pub const TEXT_WIPE_BOLD: TextStyle = TextStyle::new( BLD_WIPE_TEXT_COLOR, BLD_WIPE_TEXT_COLOR, ); -pub const TEXT_SUBMSG: TextStyle = TextStyle::new( - Font::BOLD, - BLD_COLOR_SUBMSG, - BLD_BG, - BLD_COLOR_SUBMSG, - BLD_COLOR_SUBMSG, +pub const TEXT_WIPE_NORMAL: TextStyle = TextStyle::new( + Font::NORMAL, + BLD_WIPE_TEXT_COLOR, + BLD_WIPE_COLOR, + BLD_WIPE_TEXT_COLOR, + BLD_WIPE_TEXT_COLOR, ); +pub const TEXT_SUBMSG: TextStyle = TextStyle::new(Font::BOLD, WHITE, BLD_BTN_COLOR, WHITE, WHITE); diff --git a/core/embed/rust/src/ui/model_tt/component/result.rs b/core/embed/rust/src/ui/model_tt/component/result.rs index 7c16eb1b0..6a3ae9c48 100644 --- a/core/embed/rust/src/ui/model_tt/component/result.rs +++ b/core/embed/rust/src/ui/model_tt/component/result.rs @@ -1,14 +1,11 @@ -use crate::{ - alpha, - ui::{ - component::{ - text::paragraphs::{ParagraphStrType, ParagraphVecShort, Paragraphs}, - Child, Component, Event, EventCtx, Never, Pad, - }, - constant::screen, - display::{self, Color, Icon}, - geometry::{Offset, Point, Rect, CENTER}, +use crate::ui::{ + component::{ + text::paragraphs::{ParagraphStrType, ParagraphVecShort, Paragraphs}, + Child, Component, Event, EventCtx, Never, Pad, }, + constant::screen, + display::{self, Color, Icon}, + geometry::{Point, Rect, CENTER}, }; use crate::ui::model_tt::constant::{HEIGHT, WIDTH}; @@ -18,6 +15,7 @@ pub struct ResultScreen { small_pad: Pad, fg_color: Color, bg_color: Color, + msg_area_color: Color, icon: Icon, message_top: Child>>, message_bottom: Child>>, @@ -27,6 +25,7 @@ impl ResultScreen { pub fn new( fg_color: Color, bg_color: Color, + msg_area_color: Color, icon: Icon, message_top: Paragraphs>, message_bottom: Paragraphs>, @@ -37,6 +36,7 @@ impl ResultScreen { small_pad: Pad::with_background(bg_color), fg_color, bg_color, + msg_area_color, icon, message_top: Child::new(message_top), message_bottom: Child::new(message_bottom), @@ -59,9 +59,9 @@ impl Component for ResultScreen { .place(Rect::new(Point::new(0, 0), Point::new(WIDTH, HEIGHT))); self.message_top - .place(Rect::new(Point::new(15, 59), Point::new(WIDTH - 15, 149))); + .place(Rect::new(Point::new(15, 59), Point::new(WIDTH - 15, 176))); - let bottom_area = Rect::new(Point::new(15, 151), Point::new(WIDTH - 15, HEIGHT)); + let bottom_area = Rect::new(Point::new(6, 176), Point::new(WIDTH - 6, 176 + 56)); self.small_pad.place(bottom_area); self.message_bottom.place(bottom_area); @@ -83,11 +83,13 @@ impl Component for ResultScreen { self.fg_color, self.bg_color, ); - display::rect_fill( - Rect::from_top_left_and_size(Point::new(12, 149), Offset::new(216, 1)), - Color::alpha(self.bg_color, alpha!(0.2)), - ); self.message_top.paint(); + display::rect_fill_rounded( + Rect::new(Point::new(6, 176), Point::new(WIDTH - 6, 176 + 56)), + self.msg_area_color, + self.bg_color, + 2, + ); self.message_bottom.paint(); } } diff --git a/core/embed/rust/src/ui/model_tt/res/check40.toif b/core/embed/rust/src/ui/model_tt/res/check40.toif new file mode 100644 index 000000000..c18a3894e Binary files /dev/null and b/core/embed/rust/src/ui/model_tt/res/check40.toif differ diff --git a/core/embed/rust/src/ui/model_tt/res/close.toif b/core/embed/rust/src/ui/model_tt/res/close.toif deleted file mode 100644 index a53d508b3..000000000 Binary files a/core/embed/rust/src/ui/model_tt/res/close.toif and /dev/null differ diff --git a/core/embed/rust/src/ui/model_tt/res/download32.toif b/core/embed/rust/src/ui/model_tt/res/download32.toif new file mode 100644 index 000000000..37cd09b22 Binary files /dev/null and b/core/embed/rust/src/ui/model_tt/res/download32.toif differ diff --git a/core/embed/rust/src/ui/model_tt/res/erase_big.toif b/core/embed/rust/src/ui/model_tt/res/erase_big.toif deleted file mode 100644 index 5d2508a18..000000000 Binary files a/core/embed/rust/src/ui/model_tt/res/erase_big.toif and /dev/null differ diff --git a/core/embed/rust/src/ui/model_tt/res/fire24.toif b/core/embed/rust/src/ui/model_tt/res/fire24.toif new file mode 100644 index 000000000..0333bc08e Binary files /dev/null and b/core/embed/rust/src/ui/model_tt/res/fire24.toif differ diff --git a/core/embed/rust/src/ui/model_tt/res/fire32.toif b/core/embed/rust/src/ui/model_tt/res/fire32.toif new file mode 100644 index 000000000..ccc4aa314 Binary files /dev/null and b/core/embed/rust/src/ui/model_tt/res/fire32.toif differ diff --git a/core/embed/rust/src/ui/model_tt/res/fire40.toif b/core/embed/rust/src/ui/model_tt/res/fire40.toif new file mode 100644 index 000000000..9816f26dd Binary files /dev/null and b/core/embed/rust/src/ui/model_tt/res/fire40.toif differ diff --git a/core/embed/rust/src/ui/model_tt/res/menu.toif b/core/embed/rust/src/ui/model_tt/res/menu.toif deleted file mode 100644 index b69042148..000000000 Binary files a/core/embed/rust/src/ui/model_tt/res/menu.toif and /dev/null differ diff --git a/core/embed/rust/src/ui/model_tt/res/menu32.toif b/core/embed/rust/src/ui/model_tt/res/menu32.toif new file mode 100644 index 000000000..5403e18df Binary files /dev/null and b/core/embed/rust/src/ui/model_tt/res/menu32.toif differ diff --git a/core/embed/rust/src/ui/model_tt/res/reboot.toif b/core/embed/rust/src/ui/model_tt/res/reboot.toif deleted file mode 100644 index d45654cbc..000000000 Binary files a/core/embed/rust/src/ui/model_tt/res/reboot.toif and /dev/null differ diff --git a/core/embed/rust/src/ui/model_tt/res/refresh24.toif b/core/embed/rust/src/ui/model_tt/res/refresh24.toif new file mode 100644 index 000000000..a18e672e5 Binary files /dev/null and b/core/embed/rust/src/ui/model_tt/res/refresh24.toif differ diff --git a/core/embed/rust/src/ui/model_tt/res/warning40.toif b/core/embed/rust/src/ui/model_tt/res/warning40.toif new file mode 100644 index 000000000..21840bc00 Binary files /dev/null and b/core/embed/rust/src/ui/model_tt/res/warning40.toif differ diff --git a/core/embed/rust/src/ui/model_tt/screens.rs b/core/embed/rust/src/ui/model_tt/screens.rs index 50b9442a7..c4ded7897 100644 --- a/core/embed/rust/src/ui/model_tt/screens.rs +++ b/core/embed/rust/src/ui/model_tt/screens.rs @@ -10,7 +10,10 @@ use crate::ui::{ model_tt::{ component::ResultScreen, constant, - theme::{FATAL_ERROR_COLOR, ICON_WARN_SMALL, TEXT_ERROR_BOLD, TEXT_ERROR_NORMAL, WHITE}, + theme::{ + FATAL_ERROR_COLOR, FATAL_ERROR_HIGHLIGHT_COLOR, ICON_WARNING40, TEXT_ERROR_BOLD, + TEXT_ERROR_HIGHLIGHT, TEXT_ERROR_NORMAL, WHITE, + }, }, }; @@ -49,15 +52,21 @@ pub fn screen_fatal_error(msg: Option<&str>, file: &str) { }; let mut messages = ParagraphVecShort::new(); - messages - .add(Paragraph::new(&TEXT_ERROR_BOLD, "PLEASE CONTACT\nTREZOR SUPPORT".into()).centered()); + messages.add( + Paragraph::new( + &TEXT_ERROR_HIGHLIGHT, + "PLEASE CONTACT\nTREZOR SUPPORT".into(), + ) + .centered(), + ); let m_bottom = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); let mut frame = ResultScreen::new( WHITE, FATAL_ERROR_COLOR, - Icon::new(ICON_WARN_SMALL), + FATAL_ERROR_HIGHLIGHT_COLOR, + Icon::new(ICON_WARNING40), m_top, m_bottom, true, @@ -87,14 +96,16 @@ pub fn screen_error_shutdown(label: &str, msg: Option<&str>) { }; let mut messages = ParagraphVecShort::new(); - messages.add(Paragraph::new(&TEXT_ERROR_BOLD, "PLEASE UNPLUG\nTHE DEVICE".into()).centered()); + messages + .add(Paragraph::new(&TEXT_ERROR_HIGHLIGHT, "PLEASE UNPLUG\nTHE DEVICE".into()).centered()); let m_bottom = Paragraphs::new(messages).with_placement(LinearPlacement::vertical().align_at_center()); let mut frame = ResultScreen::new( WHITE, FATAL_ERROR_COLOR, - Icon::new(ICON_WARN_SMALL), + FATAL_ERROR_HIGHLIGHT_COLOR, + Icon::new(ICON_WARNING40), m_top, m_bottom, true, diff --git a/core/embed/rust/src/ui/model_tt/theme.rs b/core/embed/rust/src/ui/model_tt/theme.rs index 6acf0bc81..d0cfb3e7c 100644 --- a/core/embed/rust/src/ui/model_tt/theme.rs +++ b/core/embed/rust/src/ui/model_tt/theme.rs @@ -42,7 +42,8 @@ pub const GREY_MEDIUM: Color = Color::rgb(0x4F, 0x4F, 0x4F); // button pressed pub const GREY_DARK: Color = Color::rgb(0x28, 0x28, 0x28); // button pub const VIOLET: Color = Color::rgb(0x95, 0x00, 0xCA); -pub const FATAL_ERROR_COLOR: Color = Color::rgb(0xAD, 0x2B, 0x2B); +pub const FATAL_ERROR_COLOR: Color = Color::rgb(0xE7, 0x0E, 0x0E); +pub const FATAL_ERROR_HIGHLIGHT_COLOR: Color = Color::rgb(0xFF, 0x41, 0x41); // Commonly used corner radius (i.e. for buttons). pub const RADIUS: u8 = 2; @@ -70,6 +71,7 @@ pub const ICON_LIST_CHECK: &[u8] = include_res!("model_tt/res/check16.toif"); // Homescreen notifications. pub const ICON_WARN: &[u8] = include_res!("model_tt/res/warning16.toif"); +pub const ICON_WARNING40: &[u8] = include_res!("model_tt/res/warning40.toif"); pub const ICON_LOCK: &[u8] = include_res!("model_tt/res/lock16.toif"); pub const ICON_COINJOIN: &[u8] = include_res!("model_tt/res/coinjoin16.toif"); pub const ICON_MAGIC: &[u8] = include_res!("model_tt/res/magic.toif"); @@ -108,10 +110,6 @@ pub const DOT_INACTIVE_HALF: &[u8] = include_res!("model_tt/res/scroll-inactive- pub const DOT_INACTIVE_QUARTER: &[u8] = include_res!("model_tt/res/scroll-inactive-quarter.toif"); pub const DOT_SMALL: &[u8] = include_res!("model_tt/res/scroll-small.toif"); -// Bootloader. TODO -pub const ICON_SUCCESS_SMALL: &[u8] = include_res!("model_tt/res/success_bld.toif"); -pub const ICON_WARN_SMALL: &[u8] = include_res!("model_tt/res/warn_bld.toif"); - pub const fn label_default() -> TextStyle { TEXT_NORMAL } @@ -522,6 +520,13 @@ pub const TEXT_ERROR_NORMAL: TextStyle = TextStyle::new(Font::NORMAL, FG, FATAL_ERROR_COLOR, GREY_LIGHT, GREY_LIGHT); pub const TEXT_ERROR_BOLD: TextStyle = TextStyle::new(Font::BOLD, FG, FATAL_ERROR_COLOR, GREY_LIGHT, GREY_LIGHT); +pub const TEXT_ERROR_HIGHLIGHT: TextStyle = TextStyle::new( + Font::BOLD, + FG, + FATAL_ERROR_HIGHLIGHT_COLOR, + GREY_LIGHT, + GREY_LIGHT, +); pub const TEXT_NORMAL_OFF_WHITE: TextStyle = TextStyle::new(Font::NORMAL, OFF_WHITE, BG, GREY_LIGHT, GREY_LIGHT);