Desktop: Unload animations before FAP is loaded

This commit is contained in:
Willy-JL
2024-04-05 01:48:01 +01:00
parent 5431257470
commit a95519ea86
3 changed files with 14 additions and 2 deletions

View File

@@ -32,10 +32,12 @@ static void desktop_loader_callback(const void* message, void* context) {
Desktop* desktop = context; Desktop* desktop = context;
const LoaderEvent* event = message; const LoaderEvent* event = message;
if(event->type == LoaderEventTypeApplicationStarted) { if(event->type == LoaderEventTypeApplicationBeforeLoad) {
view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopGlobalBeforeAppStarted); view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopGlobalBeforeAppStarted);
furi_check(furi_semaphore_acquire(desktop->animation_semaphore, 3000) == FuriStatusOk); furi_check(furi_semaphore_acquire(desktop->animation_semaphore, 3000) == FuriStatusOk);
} else if(event->type == LoaderEventTypeApplicationStopped) { } else if(
event->type == LoaderEventTypeApplicationLoadFailed ||
event->type == LoaderEventTypeApplicationStopped) {
view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopGlobalAfterAppFinished); view_dispatcher_send_custom_event(desktop->view_dispatcher, DesktopGlobalAfterAppFinished);
} }
} }

View File

@@ -255,6 +255,9 @@ static void loader_start_internal_app(
const FlipperInternalApplication* app, const FlipperInternalApplication* app,
const char* args) { const char* args) {
FURI_LOG_I(TAG, "Starting %s", app->name); FURI_LOG_I(TAG, "Starting %s", app->name);
LoaderEvent event;
event.type = LoaderEventTypeApplicationBeforeLoad;
furi_pubsub_publish(loader->pubsub, &event);
// store args // store args
furi_assert(loader->app.args == NULL); furi_assert(loader->app.args == NULL);
@@ -309,6 +312,9 @@ static LoaderStatus loader_start_external_app(
const char* args, const char* args,
FuriString* error_message) { FuriString* error_message) {
LoaderStatus status = loader_make_success_status(error_message); LoaderStatus status = loader_make_success_status(error_message);
LoaderEvent event;
event.type = LoaderEventTypeApplicationBeforeLoad;
furi_pubsub_publish(loader->pubsub, &event);
do { do {
loader->app.fap = flipper_application_alloc(storage, firmware_api_interface); loader->app.fap = flipper_application_alloc(storage, firmware_api_interface);
@@ -356,6 +362,8 @@ static LoaderStatus loader_start_external_app(
if(status != LoaderStatusOk) { if(status != LoaderStatusOk) {
flipper_application_free(loader->app.fap); flipper_application_free(loader->app.fap);
loader->app.fap = NULL; loader->app.fap = NULL;
event.type = LoaderEventTypeApplicationLoadFailed;
furi_pubsub_publish(loader->pubsub, &event);
} }
return status; return status;

View File

@@ -18,6 +18,8 @@ typedef enum {
} LoaderStatus; } LoaderStatus;
typedef enum { typedef enum {
LoaderEventTypeApplicationBeforeLoad,
LoaderEventTypeApplicationLoadFailed,
LoaderEventTypeApplicationStarted, LoaderEventTypeApplicationStarted,
LoaderEventTypeApplicationStopped LoaderEventTypeApplicationStopped
} LoaderEventType; } LoaderEventType;