From f5dff83595b037b7cb5b533da730b2b3ee3a183a Mon Sep 17 00:00:00 2001 From: FireFly7386 <123244840+FireFly7386@users.noreply.github.com> Date: Tue, 26 Mar 2024 08:18:44 +0100 Subject: [PATCH 1/2] Show the wrong PIN Attempt count on the login screen (#3495) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * now shows failed login attempt count * fixed the memory leaking * made some text changes * removed second allocation of the furi string * cleaned up code * Changed Position of the Wrong Attempts Text + It removes if you typed an arrow * aligned text to the center and switched to furi_string_reset insted of furi_string_set_str("") * fixed weird behavior * Desktop: cleanup pin scene code, better reporting on transition between states Co-authored-by: あく --- .../desktop/scenes/desktop_scene_pin_input.c | 21 +++++++++++++- .../desktop/views/desktop_view_pin_input.c | 28 +++++++++++++++++++ .../desktop/views/desktop_view_pin_input.h | 5 ++++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/applications/services/desktop/scenes/desktop_scene_pin_input.c b/applications/services/desktop/scenes/desktop_scene_pin_input.c index a21c59e38..f6de987bf 100644 --- a/applications/services/desktop/scenes/desktop_scene_pin_input.c +++ b/applications/services/desktop/scenes/desktop_scene_pin_input.c @@ -20,6 +20,7 @@ typedef struct { FuriTimer* timer; + FuriString* enter_pin_string; } DesktopScenePinInputState; static void desktop_scene_locked_light_red(bool value) { @@ -69,6 +70,18 @@ static void desktop_scene_pin_input_timer_callback(void* context) { desktop->view_dispatcher, DesktopPinInputEventResetWrongPinLabel); } +static void + desktop_scene_pin_input_update_wrong_count(DesktopScenePinInputState* state, Desktop* desktop) { + uint32_t attempts = furi_hal_rtc_get_pin_fails(); + if(attempts > 0) { + furi_string_printf(state->enter_pin_string, "Wrong Attempts: %lu", attempts); + desktop_view_pin_input_set_label_tertiary( + desktop->pin_input_view, 64, 60, furi_string_get_cstr(state->enter_pin_string)); + } else { + desktop_view_pin_input_set_label_tertiary(desktop->pin_input_view, 64, 60, NULL); + } +} + void desktop_scene_pin_input_on_enter(void* context) { Desktop* desktop = (Desktop*)context; @@ -81,6 +94,7 @@ void desktop_scene_pin_input_on_enter(void* context) { desktop->pin_input_view, desktop_scene_pin_input_done_callback); DesktopScenePinInputState* state = malloc(sizeof(DesktopScenePinInputState)); + state->enter_pin_string = furi_string_alloc(); state->timer = furi_timer_alloc(desktop_scene_pin_input_timer_callback, FuriTimerTypeOnce, desktop); scene_manager_set_scene_state(desktop->scene_manager, DesktopScenePinInput, (uint32_t)state); @@ -88,6 +102,7 @@ void desktop_scene_pin_input_on_enter(void* context) { desktop_view_pin_input_hide_pin(desktop->pin_input_view, true); desktop_view_pin_input_set_label_button(desktop->pin_input_view, "OK"); desktop_view_pin_input_set_label_secondary(desktop->pin_input_view, 44, 25, "Enter PIN:"); + desktop_scene_pin_input_update_wrong_count(state, desktop); desktop_view_pin_input_set_pin_position(desktop->pin_input_view, 64, 37); desktop_view_pin_input_reset_pin(desktop->pin_input_view); @@ -98,7 +113,8 @@ bool desktop_scene_pin_input_on_event(void* context, SceneManagerEvent event) { Desktop* desktop = (Desktop*)context; bool consumed = false; uint32_t pin_timeout = 0; - + DesktopScenePinInputState* state = (DesktopScenePinInputState*)scene_manager_get_scene_state( + desktop->scene_manager, DesktopScenePinInput); if(event.type == SceneManagerEventTypeCustom) { switch(event.event) { case DesktopPinInputEventUnlockFailed: @@ -114,6 +130,7 @@ bool desktop_scene_pin_input_on_event(void* context, SceneManagerEvent event) { desktop_view_pin_input_set_label_secondary( desktop->pin_input_view, 25, 25, "Wrong PIN try again:"); desktop_scene_pin_input_set_timer(desktop, true, WRONG_PIN_HEADER_TIMEOUT); + desktop_scene_pin_input_update_wrong_count(state, desktop); desktop_view_pin_input_reset_pin(desktop->pin_input_view); } consumed = true; @@ -123,6 +140,7 @@ bool desktop_scene_pin_input_on_event(void* context, SceneManagerEvent event) { desktop_view_pin_input_set_label_primary(desktop->pin_input_view, 0, 0, NULL); desktop_view_pin_input_set_label_secondary( desktop->pin_input_view, 44, 25, "Enter PIN:"); + desktop_scene_pin_input_update_wrong_count(state, desktop); consumed = true; break; case DesktopPinInputEventUnlocked: @@ -150,5 +168,6 @@ void desktop_scene_pin_input_on_exit(void* context) { desktop->scene_manager, DesktopScenePinInput); furi_timer_free(state->timer); + furi_string_free(state->enter_pin_string); free(state); } diff --git a/applications/services/desktop/views/desktop_view_pin_input.c b/applications/services/desktop/views/desktop_view_pin_input.c index 0894bb776..c859b9b02 100644 --- a/applications/services/desktop/views/desktop_view_pin_input.c +++ b/applications/services/desktop/views/desktop_view_pin_input.c @@ -35,6 +35,9 @@ typedef struct { const char* secondary_str; uint8_t secondary_str_x; uint8_t secondary_str_y; + const char* tertiary_str; + uint8_t tertiary_str_x; + uint8_t tertiary_str_y; const char* button_label; } DesktopViewPinInputModel; @@ -167,6 +170,17 @@ static void desktop_view_pin_input_draw(Canvas* canvas, void* context) { canvas_draw_str( canvas, model->secondary_str_x, model->secondary_str_y, model->secondary_str); } + + if(model->tertiary_str && model->pin.length == 0) { + canvas_set_font(canvas, FontSecondary); + canvas_draw_str_aligned( + canvas, + model->tertiary_str_x, + model->tertiary_str_y, + AlignCenter, + AlignBottom, + model->tertiary_str); + } } void desktop_view_pin_input_timer_callback(void* context) { @@ -294,6 +308,20 @@ void desktop_view_pin_input_set_label_secondary( view_commit_model(pin_input->view, true); } +void desktop_view_pin_input_set_label_tertiary( + DesktopViewPinInput* pin_input, + uint8_t x, + uint8_t y, + const char* label) { + furi_assert(pin_input); + + DesktopViewPinInputModel* model = view_get_model(pin_input->view); + model->tertiary_str = label; + model->tertiary_str_x = x; + model->tertiary_str_y = y; + view_commit_model(pin_input->view, true); +} + void desktop_view_pin_input_set_pin_position(DesktopViewPinInput* pin_input, uint8_t x, uint8_t y) { furi_assert(pin_input); diff --git a/applications/services/desktop/views/desktop_view_pin_input.h b/applications/services/desktop/views/desktop_view_pin_input.h index 40eee4cc9..c430aff9f 100644 --- a/applications/services/desktop/views/desktop_view_pin_input.h +++ b/applications/services/desktop/views/desktop_view_pin_input.h @@ -24,6 +24,11 @@ void desktop_view_pin_input_set_label_secondary( uint8_t x, uint8_t y, const char* label); +void desktop_view_pin_input_set_label_tertiary( + DesktopViewPinInput* pin_input, + uint8_t x, + uint8_t y, + const char* label); void desktop_view_pin_input_set_pin_position(DesktopViewPinInput* pin_input, uint8_t x, uint8_t y); View* desktop_view_pin_input_get_view(DesktopViewPinInput*); void desktop_view_pin_input_set_done_callback( From 21e7c46033b0a41a642e3fcb615edd850ae54c6f Mon Sep 17 00:00:00 2001 From: superKoder <6278466+superKoder@users.noreply.github.com> Date: Tue, 26 Mar 2024 00:24:28 -0700 Subject: [PATCH 2/2] infrared_transmit.h was missing `#pragma once` (#3541) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: superKoder Co-authored-by: あく --- lib/infrared/worker/infrared_transmit.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/infrared/worker/infrared_transmit.h b/lib/infrared/worker/infrared_transmit.h index 27e6a7df1..c425f53c9 100644 --- a/lib/infrared/worker/infrared_transmit.h +++ b/lib/infrared/worker/infrared_transmit.h @@ -1,3 +1,5 @@ +#pragma once + #include #include #include