diff --git a/applications/main/archive/archive.c b/applications/main/archive/archive.c index 8dd934cc7b..5db650445d 100644 --- a/applications/main/archive/archive.c +++ b/applications/main/archive/archive.c @@ -16,6 +16,7 @@ ArchiveApp* archive_alloc(void) { ArchiveApp* archive = malloc(sizeof(ArchiveApp)); archive->gui = furi_record_open(RECORD_GUI); + archive->loader = furi_record_open(RECORD_LOADER); archive->text_input = text_input_alloc(); archive->fav_move_str = furi_string_alloc(); @@ -61,6 +62,8 @@ void archive_free(ArchiveApp* archive) { text_input_free(archive->text_input); + furi_record_close(RECORD_LOADER); + archive->loader = NULL; furi_record_close(RECORD_GUI); archive->gui = NULL; diff --git a/applications/main/archive/archive_i.h b/applications/main/archive/archive_i.h index d444aef8fc..13b975a44d 100644 --- a/applications/main/archive/archive_i.h +++ b/applications/main/archive/archive_i.h @@ -22,6 +22,7 @@ typedef enum { struct ArchiveApp { Gui* gui; + Loader* loader; ViewDispatcher* view_dispatcher; SceneManager* scene_manager; ArchiveBrowserView* browser; diff --git a/applications/main/archive/scenes/archive_scene_browser.c b/applications/main/archive/scenes/archive_scene_browser.c index 284e534aba..ba928c4993 100644 --- a/applications/main/archive/scenes/archive_scene_browser.c +++ b/applications/main/archive/scenes/archive_scene_browser.c @@ -86,10 +86,8 @@ void archive_scene_browser_on_enter(void* context) { archive_update_focus(browser, archive->text_store); view_dispatcher_switch_to_view(archive->view_dispatcher, ArchiveViewBrowser); - Loader* loader = furi_record_open(RECORD_LOADER); - archive->loader_stop_subscription = - furi_pubsub_subscribe(loader_get_pubsub(loader), archive_loader_callback, archive); - furi_record_close(RECORD_LOADER); + archive->loader_stop_subscription = furi_pubsub_subscribe( + loader_get_pubsub(archive->loader), archive_loader_callback, archive); uint32_t state = scene_manager_get_scene_state(archive->scene_manager, ArchiveAppSceneBrowser); @@ -213,10 +211,11 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { if(!archive_is_home(browser)) { archive_leave_dir(browser); } else { - Loader* loader = furi_record_open(RECORD_LOADER); - furi_pubsub_unsubscribe( - loader_get_pubsub(loader), archive->loader_stop_subscription); - furi_record_close(RECORD_LOADER); + if(archive->loader_stop_subscription) { + furi_pubsub_unsubscribe( + loader_get_pubsub(archive->loader), archive->loader_stop_subscription); + archive->loader_stop_subscription = NULL; + } view_dispatcher_stop(archive->view_dispatcher); } @@ -232,8 +231,9 @@ bool archive_scene_browser_on_event(void* context, SceneManagerEvent event) { void archive_scene_browser_on_exit(void* context) { ArchiveApp* archive = (ArchiveApp*)context; - - Loader* loader = furi_record_open(RECORD_LOADER); - furi_pubsub_unsubscribe(loader_get_pubsub(loader), archive->loader_stop_subscription); - furi_record_close(RECORD_LOADER); + if(archive->loader_stop_subscription) { + furi_pubsub_unsubscribe( + loader_get_pubsub(archive->loader), archive->loader_stop_subscription); + archive->loader_stop_subscription = NULL; + } }