diff --git a/applications/main/momentum_app/momentum_app.c b/applications/main/momentum_app/momentum_app.c index e649a5b87..b54ecc863 100644 --- a/applications/main/momentum_app/momentum_app.c +++ b/applications/main/momentum_app/momentum_app.c @@ -8,7 +8,8 @@ static bool momentum_app_custom_event_callback(void* context, uint32_t event) { void callback_reboot(void* context) { UNUSED(context); - power_reboot(PowerBootModeNormal); + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } bool momentum_app_apply(MomentumApp* app) { diff --git a/applications/services/desktop/scenes/desktop_scene_pin_input.c b/applications/services/desktop/scenes/desktop_scene_pin_input.c index ac99f7bf1..a7a05667f 100644 --- a/applications/services/desktop/scenes/desktop_scene_pin_input.c +++ b/applications/services/desktop/scenes/desktop_scene_pin_input.c @@ -59,10 +59,12 @@ static void desktop_scene_pin_input_done_callback(const DesktopPinCode* pin_code } else { uint32_t pin_fails = furi_hal_rtc_get_pin_fails() + 1; if(pin_fails >= 10 && momentum_settings.bad_pins_format) { - storage_sd_format(furi_record_open(RECORD_STORAGE)); + Storage* storage = furi_record_open(RECORD_STORAGE); + storage_sd_format(storage); furi_record_close(RECORD_STORAGE); furi_hal_rtc_reset_registers(); - power_reboot(PowerBootModeNormal); + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } furi_hal_rtc_set_pin_fails(pin_fails); view_dispatcher_send_custom_event( diff --git a/applications/services/gui/modules/number_input.c b/applications/services/gui/modules/number_input.c index a1d59ee48..90a873a7a 100644 --- a/applications/services/gui/modules/number_input.c +++ b/applications/services/gui/modules/number_input.c @@ -285,13 +285,13 @@ static void number_input_view_draw_callback(Canvas* canvas, void* _model) { canvas, keyboard_origin_x + keys[column].x, keyboard_origin_y + keys[column].y, - &I_KeyBackspaceSelected_16x9); + &I_KeyBackspaceSelected_17x11); } else { canvas_draw_icon( canvas, keyboard_origin_x + keys[column].x, keyboard_origin_y + keys[column].y, - &I_KeyBackspace_16x9); + &I_KeyBackspace_17x11); } } else if(keys[column].text == sign_symbol) { if(model->selected_row == row && model->selected_column == column) { diff --git a/applications/services/loader/loader_menu.c b/applications/services/loader/loader_menu.c index 2753a58c3..8d80e89bc 100644 --- a/applications/services/loader/loader_menu.c +++ b/applications/services/loader/loader_menu.c @@ -63,13 +63,6 @@ static void loader_pubsub_callback(const void* message, void* context) { } } -static void loader_menu_set_view(LoaderMenu* loader_menu, View* view) { - view_holder_set_view(loader_menu->view_holder, view); - if(view) { - view_holder_update(view, loader_menu->view_holder); - } -} - static void loader_menu_dummy_draw(Canvas* canvas, void* context) { UNUSED(context); @@ -101,7 +94,7 @@ LoaderMenu* loader_menu_alloc(void (*closed_cb)(void*), void* context, bool sett loader_menu->view_holder = view_holder_alloc(); view_holder_attach_to_gui(loader_menu->view_holder, gui); view_holder_set_back_callback(loader_menu->view_holder, NULL, NULL); - loader_menu_set_view(loader_menu, loader_menu->dummy); + view_holder_set_view(loader_menu->view_holder, loader_menu->dummy); loader_menu->loader = furi_record_open(RECORD_LOADER); loader_menu->subscription = furi_pubsub_subscribe( @@ -123,6 +116,7 @@ void loader_menu_free(LoaderMenu* loader_menu) { furi_thread_free(loader_menu->thread); } + view_holder_set_view(loader_menu->view_holder, NULL); view_holder_free(loader_menu->view_holder); furi_record_close(RECORD_GUI); @@ -180,10 +174,18 @@ static void loader_menu_settings_menu_callback(void* context, uint32_t index) { loader_menu_start(name); } +// Can't do this in GUI callbacks because now ViewHolder waits for ongoing +// input, and inputs are not processed because GUI is processing callbacks +static void loader_menu_set_view_pending(void* context, uint32_t arg) { + LoaderMenuApp* app = context; + view_holder_set_view(app->loader_menu->view_holder, (View*)arg); +} + static void loader_menu_switch_to_settings(void* context, uint32_t index) { UNUSED(index); LoaderMenuApp* app = context; - loader_menu_set_view(app->loader_menu, submenu_get_view(app->settings_menu)); + furi_timer_pending_callback( + loader_menu_set_view_pending, app, (uint32_t)submenu_get_view(app->settings_menu)); app->loader_menu->current_view = LoaderMenuViewSettings; } @@ -191,7 +193,8 @@ static void loader_menu_back(void* context) { LoaderMenuApp* app = context; if(app->loader_menu->current_view == LoaderMenuViewSettings && !app->loader_menu->settings_only) { - loader_menu_set_view(app->loader_menu, menu_get_view(app->primary_menu)); + furi_timer_pending_callback( + loader_menu_set_view_pending, app, (uint32_t)menu_get_view(app->primary_menu)); app->loader_menu->current_view = LoaderMenuViewPrimary; } else { furi_thread_flags_set(furi_thread_get_id(app->loader_menu->thread), 0); @@ -364,7 +367,7 @@ static LoaderMenuApp* loader_menu_app_alloc(LoaderMenu* loader_menu) { View* view = app->loader_menu->current_view == LoaderMenuViewSettings ? submenu_get_view(app->settings_menu) : menu_get_view(app->primary_menu); - loader_menu_set_view(app->loader_menu, view); + view_holder_set_view(app->loader_menu->view_holder, view); view_holder_set_back_callback(app->loader_menu->view_holder, loader_menu_back, app); return app; @@ -372,7 +375,7 @@ static LoaderMenuApp* loader_menu_app_alloc(LoaderMenu* loader_menu) { static void loader_menu_app_free(LoaderMenuApp* app) { view_holder_set_back_callback(app->loader_menu->view_holder, NULL, NULL); - loader_menu_set_view(app->loader_menu, app->loader_menu->dummy); + view_holder_set_view(app->loader_menu->view_holder, app->loader_menu->dummy); if(!app->loader_menu->settings_only) { app->loader_menu->selected_primary = menu_get_selected_item(app->primary_menu); diff --git a/applications/services/power/power_service/power.c b/applications/services/power/power_service/power.c index a15728bc1..987bb6861 100644 --- a/applications/services/power/power_service/power.c +++ b/applications/services/power/power_service/power.c @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -598,7 +599,6 @@ static Power* power_alloc(void) { power->ascii_events_pubsub = furi_record_open(RECORD_ASCII_EVENTS); power->auto_shutdown_timer = furi_timer_alloc(power_auto_shutdown_timer_callback, FuriTimerTypeOnce, power); - power->app_running = loader_is_locked(loader); power->view_holder = view_holder_alloc(); power->view_power_off = power_off_alloc(); @@ -634,10 +634,16 @@ int32_t power_srv(void* p) { } Power* power = power_alloc(); - power_init_settings(power); power_update_info(power); furi_record_create(RECORD_POWER, power); + + // Can't be done in alloc, other things in startup need power service and it would deadlock by waiting for loader + Loader* loader = furi_record_open(RECORD_LOADER); + power->app_running = loader_is_locked(loader); + furi_record_close(RECORD_LOADER); + power_init_settings(power); + furi_event_loop_run(power->event_loop); return 0; diff --git a/applications/services/power/power_service/power_i.h b/applications/services/power/power_service/power_i.h index 03bf395ce..7f4a7ae0c 100644 --- a/applications/services/power/power_service/power_i.h +++ b/applications/services/power/power_service/power_i.h @@ -7,7 +7,6 @@ #include #include -#include #include "views/power_off.h" #include "views/power_unplug_usb.h" diff --git a/applications/settings/bt_settings_app/mock_bt_api.c b/applications/settings/bt_settings_app/mock_imports/mock_bt_api.c similarity index 100% rename from applications/settings/bt_settings_app/mock_bt_api.c rename to applications/settings/bt_settings_app/mock_imports/mock_bt_api.c diff --git a/applications/settings/power_settings_app/scenes/power_settings_scene_start.c b/applications/settings/power_settings_app/scenes/power_settings_scene_start.c index 7c51dde42..22c61dd9c 100644 --- a/applications/settings/power_settings_app/scenes/power_settings_scene_start.c +++ b/applications/settings/power_settings_app/scenes/power_settings_scene_start.c @@ -12,8 +12,8 @@ enum PowerSettingsSubmenuIndex { #define SHUTDOWN_IDLE_DELAY_COUNT 9 const char* const shutdown_idle_delay_text[SHUTDOWN_IDLE_DELAY_COUNT] = { "OFF", - "15min", - "30min", + "15m", + "30m", "1h", "2h", "6h", @@ -71,7 +71,7 @@ void power_settings_scene_start_on_enter(void* context) { variable_item_list_set_enter_callback( variable_item_list, power_settings_scene_start_submenu_callback, app); - view_dispatcher_switch_to_view(app->view_dispatcher, PowerSettingsAppViewSubmenu); + view_dispatcher_switch_to_view(app->view_dispatcher, PowerSettingsAppViewVariableItemList); } bool power_settings_scene_start_on_event(void* context, SceneManagerEvent event) { diff --git a/applications/settings/storage_settings/scenes/storage_settings_scene_formatting.c b/applications/settings/storage_settings/scenes/storage_settings_scene_formatting.c index 700391c3b..d1652fa20 100644 --- a/applications/settings/storage_settings/scenes/storage_settings_scene_formatting.c +++ b/applications/settings/storage_settings/scenes/storage_settings_scene_formatting.c @@ -53,7 +53,8 @@ void storage_settings_scene_formatting_on_enter(void* context) { dialog_ex, storage_error_get_desc(error), 64, 32, AlignCenter, AlignCenter); } else { if(scene_manager_get_scene_state(app->scene_manager, StorageSettingsFormatting)) { - power_reboot(PowerBootModeNormal); + Power* power = furi_record_open(RECORD_POWER); + power_reboot(power, PowerBootModeNormal); } else { dialog_ex_set_icon(dialog_ex, 48, 6, &I_DolphinDone_80x58); dialog_ex_set_header(dialog_ex, "Formatted", 5, 10, AlignLeft, AlignTop); diff --git a/applications/system/js_app/modules/js_keyboard.c b/applications/system/js_app/modules/js_keyboard.c index 240d99787..c21fc1800 100644 --- a/applications/system/js_app/modules/js_keyboard.c +++ b/applications/system/js_app/modules/js_keyboard.c @@ -92,10 +92,9 @@ static void js_keyboard_text(struct mjs* mjs) { view_holder_set_back_callback(keyboard->view_holder, keyboard_exit, keyboard); view_holder_set_view(keyboard->view_holder, text_input_get_view(keyboard->text_input)); - view_holder_start(keyboard->view_holder); api_lock_wait_unlock(keyboard->lock); - view_holder_stop(keyboard->view_holder); + view_holder_set_view(keyboard->view_holder, NULL); view_holder_free(keyboard->view_holder); furi_record_close(RECORD_GUI); @@ -148,10 +147,9 @@ static void js_keyboard_byte(struct mjs* mjs) { view_holder_set_back_callback(keyboard->view_holder, keyboard_exit, keyboard); view_holder_set_view(keyboard->view_holder, byte_input_get_view(keyboard->byte_input)); - view_holder_start(keyboard->view_holder); api_lock_wait_unlock(keyboard->lock); - view_holder_stop(keyboard->view_holder); + view_holder_set_view(keyboard->view_holder, NULL); view_holder_free(keyboard->view_holder); furi_record_close(RECORD_GUI); diff --git a/applications/system/js_app/modules/js_widget.c b/applications/system/js_app/modules/js_widget.c index 07be98033..16b058a17 100644 --- a/applications/system/js_app/modules/js_widget.c +++ b/applications/system/js_app/modules/js_widget.c @@ -825,7 +825,7 @@ static void js_widget_is_open(struct mjs* mjs) { static void widget_callback(void* context, uint32_t arg) { UNUSED(arg); JsWidgetInst* widget = context; - view_holder_stop(widget->view_holder); + view_holder_set_view(widget->view_holder, NULL); widget->is_shown = false; } @@ -845,7 +845,7 @@ static void js_widget_show(struct mjs* mjs) { return; } - view_holder_start(widget->view_holder); + view_holder_set_view(widget->view_holder, widget->view); widget->is_shown = true; mjs_return(mjs, MJS_UNDEFINED); @@ -855,7 +855,7 @@ static void js_widget_close(struct mjs* mjs) { JsWidgetInst* widget = get_this_ctx(mjs); if(!check_arg_count(mjs, 0)) return; - view_holder_stop(widget->view_holder); + view_holder_set_view(widget->view_holder, NULL); widget->is_shown = false; mjs_return(mjs, MJS_UNDEFINED); @@ -933,7 +933,6 @@ static void* js_widget_create(struct mjs* mjs, mjs_val_t* object) { widget->view_holder = view_holder_alloc(); view_holder_attach_to_gui(widget->view_holder, gui); view_holder_set_back_callback(widget->view_holder, widget_exit, widget); - view_holder_set_view(widget->view_holder, widget->view); *object = widget_obj; return widget; @@ -942,7 +941,7 @@ static void* js_widget_create(struct mjs* mjs, mjs_val_t* object) { static void js_widget_destroy(void* inst) { JsWidgetInst* widget = inst; - view_holder_stop(widget->view_holder); + view_holder_set_view(widget->view_holder, NULL); view_holder_free(widget->view_holder); widget->view_holder = NULL; diff --git a/targets/f7/api_symbols.csv b/targets/f7/api_symbols.csv index 938447f39..d4ff4489b 100644 --- a/targets/f7/api_symbols.csv +++ b/targets/f7/api_symbols.csv @@ -3926,8 +3926,12 @@ Variable,+,I_KeyBackspaceSelected_17x11,const Icon, Variable,+,I_KeyBackspace_17x11,const Icon, Variable,+,I_KeyKeyboardSelected_10x11,const Icon, Variable,+,I_KeyKeyboard_10x11,const Icon, +Variable,+,I_KeySaveBlockedSelected_22x11,const Icon, +Variable,+,I_KeySaveBlocked_22x11,const Icon, Variable,+,I_KeySaveSelected_22x11,const Icon, Variable,+,I_KeySave_22x11,const Icon, +Variable,+,I_KeySignSelected_21x11,const Icon, +Variable,+,I_KeySign_21x11,const Icon, Variable,+,I_Keychain_39x36,const Icon, Variable,+,I_Left_mouse_icon_9x9,const Icon, Variable,+,I_LoadingHourglass_24x24,const Icon,