diff --git a/applications/services/desktop/scenes/desktop_scene_pin_input.c b/applications/services/desktop/scenes/desktop_scene_pin_input.c index a21c59e380b..f6de987bfa4 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 0894bb776f4..c859b9b023d 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 40eee4cc9b6..c430aff9ffe 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(