From 380734f804d6915e8c9c6f48cfd6e5e1e87e3206 Mon Sep 17 00:00:00 2001 From: MX <10697207+xMasterX@users.noreply.github.com> Date: Thu, 29 Jun 2023 05:38:44 +0300 Subject: [PATCH] Allow api mismatch bypass again :C for those who explicitly doesn't update their manually installed apps and want to ignore warnings and issues caused by using outdated apps --- applications/services/loader/loader.c | 46 +++++++++++++++++++++++---- applications/services/loader/loader.h | 1 + 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/applications/services/loader/loader.c b/applications/services/loader/loader.c index ab7876a03..833954bf7 100644 --- a/applications/services/loader/loader.c +++ b/applications/services/loader/loader.c @@ -254,7 +254,8 @@ static LoaderStatus loader_start_external_app( Storage* storage, const char* path, const char* args, - FuriString* error_message) { + FuriString* error_message, + bool ignore_mismatch) { LoaderStatus status = loader_make_success_status(error_message); do { @@ -266,10 +267,38 @@ static LoaderStatus loader_start_external_app( FlipperApplicationPreloadStatus preload_res = flipper_application_preload(loader->app.fap, path); if(preload_res != FlipperApplicationPreloadStatusSuccess) { - const char* err_msg = flipper_application_preload_status_to_string(preload_res); - status = loader_make_status_error( - LoaderStatusErrorInternal, error_message, "Preload failed %s: %s", path, err_msg); - break; + if(preload_res == FlipperApplicationPreloadStatusApiMismatch) { + if(!ignore_mismatch) { + DialogsApp* dialogs = furi_record_open(RECORD_DIALOGS); + DialogMessage* message = dialog_message_alloc(); + dialog_message_set_header( + message, "API Mismatch", 64, 0, AlignCenter, AlignTop); + dialog_message_set_buttons(message, "Cancel", NULL, "Continue"); + dialog_message_set_text( + message, + "This app might not\nwork correctly\nContinue anyways?", + 64, + 32, + AlignCenter, + AlignCenter); + if(dialog_message_show(dialogs, message) == DialogMessageButtonRight) { + status = loader_make_status_error( + LoaderStatusErrorApiMismatch, error_message, "API Mismatch"); + } + dialog_message_free(message); + furi_record_close(RECORD_DIALOGS); + break; + } + } else { + const char* err_msg = flipper_application_preload_status_to_string(preload_res); + status = loader_make_status_error( + LoaderStatusErrorInternal, + error_message, + "Preload failed %s: %s", + path, + err_msg); + break; + } } FURI_LOG_I(TAG, "Mapping"); @@ -383,7 +412,12 @@ static LoaderStatus loader_do_start_by_name( { Storage* storage = furi_record_open(RECORD_STORAGE); if(storage_file_exists(storage, name)) { - status = loader_start_external_app(loader, storage, name, args, error_message); + status = + loader_start_external_app(loader, storage, name, args, error_message, false); + if(status == LoaderStatusErrorApiMismatch) { + status = loader_start_external_app( + loader, storage, name, args, error_message, true); + } furi_record_close(RECORD_STORAGE); break; } diff --git a/applications/services/loader/loader.h b/applications/services/loader/loader.h index 9fc4059f2..550d3d508 100644 --- a/applications/services/loader/loader.h +++ b/applications/services/loader/loader.h @@ -15,6 +15,7 @@ typedef enum { LoaderStatusErrorAppStarted, LoaderStatusErrorUnknownApp, LoaderStatusErrorInternal, + LoaderStatusErrorApiMismatch, } LoaderStatus; typedef enum {