[FL-3678] [FL-3733] [FL-3723] UI refactor (#3323)
* Added new image DolphinSaved_113x58.png for all "saved" pages * New image DolphinDone_80x58.png added * Replaced dolphins on all scenes accroding to new UI specs * New success dolphin image added * Success scene image replaced * Changed image and text for update initial scene * Image and text adjusted for "Original restored" scene * Removed old DolphinNice_96x59.png image * New image for LFRFID scene * Removed unused image * New UI image added to assets * Replaced warning dolphin on mf_classic write initial fail scene * Removed old image * Changed image on scenes to a new one * New dolphin mafia image * Replaced dolphin mafia image to a new one * Removed DolphinMafia_115x62.png * New check symbol on completed state for detect_reader * Adjusted layout elements position * Removed second switching to popup view in order to achieve control in support callbacks In general now we show generic scene and after that in on_enter callback we can redefine it for particular protocol * CardDetected event now also triggers on_event callback * Now on AuthRequest we throw CardDetected custom event * Added callback for read_on_event * Now we show different screen while reading and unlocking * Fixed missing asstes for some scenes * Update DolphinMafia_119x62.png * Adjusted all the scenes with DolphinMafia image * Scenes with save image adjusted * Removed unnecessary assets DolphinMafia_119x62.png and DolphinSaved_113x58.png * All common dolphins moved to Dolphin folder * Moved DolphinReadingSuccess_59x63.png to Dolphin folder * Set proper led color for detect and read scenes * Added new notification sequence for semi_success results * Use new sequence for semi_success nfc reads * Different events are now throwed depending on read result * Added handling of incomplete event for ultralight cards * Replaced image for iButton scene * Updated API for f18 * Fixed issue with unlock retry sequence * Fix after review * Success notification replaced to semi success in case of incomplete mf classic reading * New text for read scene * New read result sound notification logic for mf classic cards Co-authored-by: あく <alleteam@gmail.com> Co-authored-by: gornekich <n.gorbadey@gmail.com>
| @ -9,9 +9,8 @@ void ibutton_scene_delete_success_on_enter(void* context) { | |||||||
|     iButton* ibutton = context; |     iButton* ibutton = context; | ||||||
|     Popup* popup = ibutton->popup; |     Popup* popup = ibutton->popup; | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 0, 2, &I_DolphinMafia_115x62); |     popup_set_icon(popup, 0, 2, &I_DolphinMafia_119x62); | ||||||
|     popup_set_header(popup, "Deleted", 83, 19, AlignLeft, AlignBottom); |     popup_set_header(popup, "Deleted", 80, 19, AlignLeft, AlignBottom); | ||||||
| 
 |  | ||||||
|     popup_set_callback(popup, ibutton_scene_delete_success_popup_callback); |     popup_set_callback(popup, ibutton_scene_delete_success_popup_callback); | ||||||
|     popup_set_context(popup, ibutton); |     popup_set_context(popup, ibutton); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|  | |||||||
| @ -9,9 +9,8 @@ void ibutton_scene_save_success_on_enter(void* context) { | |||||||
|     iButton* ibutton = context; |     iButton* ibutton = context; | ||||||
|     Popup* popup = ibutton->popup; |     Popup* popup = ibutton->popup; | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 36, 5, &I_DolphinSaved_92x58); | ||||||
|     popup_set_header(popup, "Saved!", 5, 7, AlignLeft, AlignTop); |     popup_set_header(popup, "Saved", 15, 19, AlignLeft, AlignBottom); | ||||||
| 
 |  | ||||||
|     popup_set_callback(popup, ibutton_scene_save_success_popup_callback); |     popup_set_callback(popup, ibutton_scene_save_success_popup_callback); | ||||||
|     popup_set_context(popup, ibutton); |     popup_set_context(popup, ibutton); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ void ibutton_scene_write_success_on_enter(void* context) { | |||||||
|     iButton* ibutton = context; |     iButton* ibutton = context; | ||||||
|     Popup* popup = ibutton->popup; |     Popup* popup = ibutton->popup; | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 0, 12, &I_iButtonDolphinVerySuccess_108x52); |     popup_set_icon(popup, 0, 9, &I_iButtonDolphinVerySuccess_92x55); | ||||||
|     popup_set_text(popup, "Successfully written!", 40, 12, AlignLeft, AlignBottom); |     popup_set_text(popup, "Successfully written!", 40, 12, AlignLeft, AlignBottom); | ||||||
| 
 | 
 | ||||||
|     popup_set_callback(popup, ibutton_scene_write_success_popup_callback); |     popup_set_callback(popup, ibutton_scene_write_success_popup_callback); | ||||||
|  | |||||||
| @ -4,9 +4,8 @@ void infrared_scene_edit_delete_done_on_enter(void* context) { | |||||||
|     InfraredApp* infrared = context; |     InfraredApp* infrared = context; | ||||||
|     Popup* popup = infrared->popup; |     Popup* popup = infrared->popup; | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 0, 2, &I_DolphinMafia_115x62); |     popup_set_icon(popup, 0, 2, &I_DolphinMafia_119x62); | ||||||
|     popup_set_header(popup, "Deleted", 83, 19, AlignLeft, AlignBottom); |     popup_set_header(popup, "Deleted", 80, 19, AlignLeft, AlignBottom); | ||||||
| 
 |  | ||||||
|     popup_set_callback(popup, infrared_popup_closed_callback); |     popup_set_callback(popup, infrared_popup_closed_callback); | ||||||
|     popup_set_context(popup, context); |     popup_set_context(popup, context); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|  | |||||||
| @ -4,9 +4,8 @@ void infrared_scene_edit_rename_done_on_enter(void* context) { | |||||||
|     InfraredApp* infrared = context; |     InfraredApp* infrared = context; | ||||||
|     Popup* popup = infrared->popup; |     Popup* popup = infrared->popup; | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 36, 5, &I_DolphinSaved_92x58); | ||||||
|     popup_set_header(popup, "Saved!", 5, 7, AlignLeft, AlignTop); |     popup_set_header(popup, "Saved", 15, 19, AlignLeft, AlignBottom); | ||||||
| 
 |  | ||||||
|     popup_set_callback(popup, infrared_popup_closed_callback); |     popup_set_callback(popup, infrared_popup_closed_callback); | ||||||
|     popup_set_context(popup, context); |     popup_set_context(popup, context); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|  | |||||||
| @ -4,12 +4,12 @@ void infrared_scene_learn_done_on_enter(void* context) { | |||||||
|     InfraredApp* infrared = context; |     InfraredApp* infrared = context; | ||||||
|     Popup* popup = infrared->popup; |     Popup* popup = infrared->popup; | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |  | ||||||
| 
 |  | ||||||
|     if(infrared->app_state.is_learning_new_remote) { |     if(infrared->app_state.is_learning_new_remote) { | ||||||
|  |         popup_set_icon(popup, 48, 6, &I_DolphinDone_80x58); | ||||||
|         popup_set_header(popup, "New remote\ncreated!", 0, 0, AlignLeft, AlignTop); |         popup_set_header(popup, "New remote\ncreated!", 0, 0, AlignLeft, AlignTop); | ||||||
|     } else { |     } else { | ||||||
|         popup_set_header(popup, "Saved!", 5, 7, AlignLeft, AlignTop); |         popup_set_icon(popup, 36, 5, &I_DolphinSaved_92x58); | ||||||
|  |         popup_set_header(popup, "Saved", 15, 19, AlignLeft, AlignBottom); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     popup_set_callback(popup, infrared_popup_closed_callback); |     popup_set_callback(popup, infrared_popup_closed_callback); | ||||||
|  | |||||||
| @ -4,8 +4,8 @@ void lfrfid_scene_delete_success_on_enter(void* context) { | |||||||
|     LfRfid* app = context; |     LfRfid* app = context; | ||||||
|     Popup* popup = app->popup; |     Popup* popup = app->popup; | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 0, 2, &I_DolphinMafia_115x62); |     popup_set_icon(popup, 0, 2, &I_DolphinMafia_119x62); | ||||||
|     popup_set_header(popup, "Deleted", 83, 19, AlignLeft, AlignBottom); |     popup_set_header(popup, "Deleted", 80, 19, AlignLeft, AlignBottom); | ||||||
|     popup_set_context(popup, app); |     popup_set_context(popup, app); | ||||||
|     popup_set_callback(popup, lfrfid_popup_timeout_callback); |     popup_set_callback(popup, lfrfid_popup_timeout_callback); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|  | |||||||
| @ -7,8 +7,8 @@ void lfrfid_scene_save_success_on_enter(void* context) { | |||||||
|     // Clear state of data enter scene
 |     // Clear state of data enter scene
 | ||||||
|     scene_manager_set_scene_state(app->scene_manager, LfRfidSceneSaveData, 0); |     scene_manager_set_scene_state(app->scene_manager, LfRfidSceneSaveData, 0); | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 36, 5, &I_DolphinSaved_92x58); | ||||||
|     popup_set_header(popup, "Saved!", 5, 7, AlignLeft, AlignTop); |     popup_set_header(popup, "Saved", 15, 19, AlignLeft, AlignBottom); | ||||||
|     popup_set_context(popup, app); |     popup_set_context(popup, app); | ||||||
|     popup_set_callback(popup, lfrfid_popup_timeout_callback); |     popup_set_callback(popup, lfrfid_popup_timeout_callback); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|  | |||||||
| @ -57,7 +57,7 @@ bool lfrfid_scene_write_on_event(void* context, SceneManagerEvent event) { | |||||||
|             scene_manager_next_scene(app->scene_manager, LfRfidSceneWriteSuccess); |             scene_manager_next_scene(app->scene_manager, LfRfidSceneWriteSuccess); | ||||||
|             consumed = true; |             consumed = true; | ||||||
|         } else if(event.event == LfRfidEventWriteProtocolCannotBeWritten) { |         } else if(event.event == LfRfidEventWriteProtocolCannotBeWritten) { | ||||||
|             popup_set_icon(popup, 72, 17, &I_DolphinCommon_56x48); |             popup_set_icon(popup, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|             popup_set_header(popup, "Error", 64, 3, AlignCenter, AlignTop); |             popup_set_header(popup, "Error", 64, 3, AlignCenter, AlignTop); | ||||||
|             popup_set_text(popup, "This protocol\ncannot be written", 3, 17, AlignLeft, AlignTop); |             popup_set_text(popup, "This protocol\ncannot be written", 3, 17, AlignLeft, AlignTop); | ||||||
|             notification_message(app->notifications, &sequence_blink_start_red); |             notification_message(app->notifications, &sequence_blink_start_red); | ||||||
| @ -65,7 +65,7 @@ bool lfrfid_scene_write_on_event(void* context, SceneManagerEvent event) { | |||||||
|         } else if( |         } else if( | ||||||
|             (event.event == LfRfidEventWriteFobCannotBeWritten) || |             (event.event == LfRfidEventWriteFobCannotBeWritten) || | ||||||
|             (event.event == LfRfidEventWriteTooLongToWrite)) { |             (event.event == LfRfidEventWriteTooLongToWrite)) { | ||||||
|             popup_set_icon(popup, 72, 17, &I_DolphinCommon_56x48); |             popup_set_icon(popup, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|             popup_set_header(popup, "Still trying to write...", 64, 3, AlignCenter, AlignTop); |             popup_set_header(popup, "Still trying to write...", 64, 3, AlignCenter, AlignTop); | ||||||
|             popup_set_text( |             popup_set_text( | ||||||
|                 popup, |                 popup, | ||||||
|  | |||||||
| @ -4,8 +4,8 @@ void lfrfid_scene_write_success_on_enter(void* context) { | |||||||
|     LfRfid* app = context; |     LfRfid* app = context; | ||||||
|     Popup* popup = app->popup; |     Popup* popup = app->popup; | ||||||
| 
 | 
 | ||||||
|     popup_set_header(popup, "Successfully\nwritten!", 94, 3, AlignCenter, AlignTop); |     popup_set_header(popup, "Success!", 75, 10, AlignLeft, AlignTop); | ||||||
|     popup_set_icon(popup, 0, 6, &I_RFIDDolphinSuccess_108x57); |     popup_set_icon(popup, 0, 9, &I_DolphinSuccess_91x55); | ||||||
|     popup_set_context(popup, app); |     popup_set_context(popup, app); | ||||||
|     popup_set_callback(popup, lfrfid_popup_timeout_callback); |     popup_set_callback(popup, lfrfid_popup_timeout_callback); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|  | |||||||
| @ -52,9 +52,15 @@ static NfcCommand | |||||||
|     if(mf_ultralight_event->type == MfUltralightPollerEventTypeReadSuccess) { |     if(mf_ultralight_event->type == MfUltralightPollerEventTypeReadSuccess) { | ||||||
|         nfc_device_set_data( |         nfc_device_set_data( | ||||||
|             instance->nfc_device, NfcProtocolMfUltralight, nfc_poller_get_data(instance->poller)); |             instance->nfc_device, NfcProtocolMfUltralight, nfc_poller_get_data(instance->poller)); | ||||||
|         view_dispatcher_send_custom_event(instance->view_dispatcher, NfcCustomEventPollerSuccess); | 
 | ||||||
|  |         const MfUltralightData* data = | ||||||
|  |             nfc_device_get_data(instance->nfc_device, NfcProtocolMfUltralight); | ||||||
|  |         uint32_t event = (data->pages_read == data->pages_total) ? NfcCustomEventPollerSuccess : | ||||||
|  |                                                                    NfcCustomEventPollerIncomplete; | ||||||
|  |         view_dispatcher_send_custom_event(instance->view_dispatcher, event); | ||||||
|         return NfcCommandStop; |         return NfcCommandStop; | ||||||
|     } else if(mf_ultralight_event->type == MfUltralightPollerEventTypeAuthRequest) { |     } else if(mf_ultralight_event->type == MfUltralightPollerEventTypeAuthRequest) { | ||||||
|  |         view_dispatcher_send_custom_event(instance->view_dispatcher, NfcCustomEventCardDetected); | ||||||
|         nfc_device_set_data( |         nfc_device_set_data( | ||||||
|             instance->nfc_device, NfcProtocolMfUltralight, nfc_poller_get_data(instance->poller)); |             instance->nfc_device, NfcProtocolMfUltralight, nfc_poller_get_data(instance->poller)); | ||||||
|         const MfUltralightData* data = |         const MfUltralightData* data = | ||||||
| @ -90,10 +96,55 @@ static NfcCommand | |||||||
|     return NfcCommandContinue; |     return NfcCommandContinue; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | enum { | ||||||
|  |     NfcSceneMfUltralightReadMenuStateCardSearch, | ||||||
|  |     NfcSceneMfUltralightReadMenuStateCardFound, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | static void nfc_scene_read_setup_view(NfcApp* instance) { | ||||||
|  |     Popup* popup = instance->popup; | ||||||
|  |     popup_reset(popup); | ||||||
|  |     uint32_t state = scene_manager_get_scene_state(instance->scene_manager, NfcSceneRead); | ||||||
|  | 
 | ||||||
|  |     if(state == NfcSceneMfUltralightReadMenuStateCardSearch) { | ||||||
|  |         popup_set_icon(instance->popup, 0, 8, &I_NFC_manual_60x50); | ||||||
|  |         popup_set_header(instance->popup, "Unlocking", 97, 15, AlignCenter, AlignTop); | ||||||
|  |         popup_set_text( | ||||||
|  |             instance->popup, "Apply card to\nFlipper's back", 97, 27, AlignCenter, AlignTop); | ||||||
|  |     } else { | ||||||
|  |         popup_set_header(instance->popup, "Don't move", 85, 27, AlignCenter, AlignTop); | ||||||
|  |         popup_set_icon(instance->popup, 12, 20, &A_Loading_24); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void nfc_scene_read_on_enter_mf_ultralight(NfcApp* instance) { | static void nfc_scene_read_on_enter_mf_ultralight(NfcApp* instance) { | ||||||
|  |     bool unlocking = | ||||||
|  |         scene_manager_has_previous_scene(instance->scene_manager, NfcSceneMfUltralightUnlockWarn); | ||||||
|  | 
 | ||||||
|  |     uint32_t state = unlocking ? NfcSceneMfUltralightReadMenuStateCardSearch : | ||||||
|  |                                  NfcSceneMfUltralightReadMenuStateCardFound; | ||||||
|  | 
 | ||||||
|  |     scene_manager_set_scene_state(instance->scene_manager, NfcSceneRead, state); | ||||||
|  | 
 | ||||||
|  |     nfc_scene_read_setup_view(instance); | ||||||
|     nfc_poller_start(instance->poller, nfc_scene_read_poller_callback_mf_ultralight, instance); |     nfc_poller_start(instance->poller, nfc_scene_read_poller_callback_mf_ultralight, instance); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | bool nfc_scene_read_on_event_mf_ultralight(NfcApp* instance, uint32_t event) { | ||||||
|  |     if(event == NfcCustomEventCardDetected) { | ||||||
|  |         scene_manager_set_scene_state( | ||||||
|  |             instance->scene_manager, NfcSceneRead, NfcSceneMfUltralightReadMenuStateCardFound); | ||||||
|  |         nfc_scene_read_setup_view(instance); | ||||||
|  |     } else if((event == NfcCustomEventPollerIncomplete)) { | ||||||
|  |         notification_message(instance->notifications, &sequence_semi_success); | ||||||
|  |         scene_manager_next_scene(instance->scene_manager, NfcSceneReadSuccess); | ||||||
|  |         dolphin_deed(DolphinDeedNfcReadSuccess); | ||||||
|  |     } | ||||||
|  |     return true; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void nfc_scene_read_and_saved_menu_on_enter_mf_ultralight(NfcApp* instance) { | static void nfc_scene_read_and_saved_menu_on_enter_mf_ultralight(NfcApp* instance) { | ||||||
|     Submenu* submenu = instance->submenu; |     Submenu* submenu = instance->submenu; | ||||||
| 
 | 
 | ||||||
| @ -179,7 +230,7 @@ const NfcProtocolSupportBase nfc_protocol_support_mf_ultralight = { | |||||||
|     .scene_read = |     .scene_read = | ||||||
|         { |         { | ||||||
|             .on_enter = nfc_scene_read_on_enter_mf_ultralight, |             .on_enter = nfc_scene_read_on_enter_mf_ultralight, | ||||||
|             .on_event = nfc_protocol_support_common_on_event_empty, |             .on_event = nfc_scene_read_on_event_mf_ultralight, | ||||||
|         }, |         }, | ||||||
|     .scene_read_menu = |     .scene_read_menu = | ||||||
|         { |         { | ||||||
|  | |||||||
| @ -146,8 +146,7 @@ static void nfc_protocol_support_scene_more_info_on_exit(NfcApp* instance) { | |||||||
| 
 | 
 | ||||||
| // SceneRead
 | // SceneRead
 | ||||||
| static void nfc_protocol_support_scene_read_on_enter(NfcApp* instance) { | static void nfc_protocol_support_scene_read_on_enter(NfcApp* instance) { | ||||||
|     popup_set_header( |     popup_set_header(instance->popup, "Don't move", 85, 27, AlignCenter, AlignTop); | ||||||
|         instance->popup, "Reading card\nDon't move...", 85, 24, AlignCenter, AlignTop); |  | ||||||
|     popup_set_icon(instance->popup, 12, 23, &A_Loading_24); |     popup_set_icon(instance->popup, 12, 23, &A_Loading_24); | ||||||
| 
 | 
 | ||||||
|     view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup); |     view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup); | ||||||
| @ -162,7 +161,7 @@ static void nfc_protocol_support_scene_read_on_enter(NfcApp* instance) { | |||||||
|     // Start poller with the appropriate callback
 |     // Start poller with the appropriate callback
 | ||||||
|     nfc_protocol_support[protocol]->scene_read.on_enter(instance); |     nfc_protocol_support[protocol]->scene_read.on_enter(instance); | ||||||
| 
 | 
 | ||||||
|     nfc_blink_detect_start(instance); |     nfc_blink_read_start(instance); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static bool nfc_protocol_support_scene_read_on_event(NfcApp* instance, SceneManagerEvent event) { | static bool nfc_protocol_support_scene_read_on_event(NfcApp* instance, SceneManagerEvent event) { | ||||||
| @ -200,6 +199,10 @@ static bool nfc_protocol_support_scene_read_on_event(NfcApp* instance, SceneMana | |||||||
|                     instance->scene_manager, NfcSceneDetect); |                     instance->scene_manager, NfcSceneDetect); | ||||||
|             } |             } | ||||||
|             consumed = true; |             consumed = true; | ||||||
|  |         } else if(event.event == NfcCustomEventCardDetected) { | ||||||
|  |             const NfcProtocol protocol = | ||||||
|  |                 instance->protocols_detected[instance->protocols_detected_selected_idx]; | ||||||
|  |             consumed = nfc_protocol_support[protocol]->scene_read.on_event(instance, event.event); | ||||||
|         } |         } | ||||||
|     } else if(event.type == SceneManagerEventTypeBack) { |     } else if(event.type == SceneManagerEventTypeBack) { | ||||||
|         nfc_poller_stop(instance->poller); |         nfc_poller_stop(instance->poller); | ||||||
|  | |||||||
| @ -223,7 +223,7 @@ void nfc_text_store_clear(NfcApp* nfc) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void nfc_blink_read_start(NfcApp* nfc) { | void nfc_blink_read_start(NfcApp* nfc) { | ||||||
|     notification_message(nfc->notifications, &sequence_blink_start_cyan); |     notification_message(nfc->notifications, &sequence_blink_start_yellow); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void nfc_blink_emulate_start(NfcApp* nfc) { | void nfc_blink_emulate_start(NfcApp* nfc) { | ||||||
| @ -231,7 +231,7 @@ void nfc_blink_emulate_start(NfcApp* nfc) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void nfc_blink_detect_start(NfcApp* nfc) { | void nfc_blink_detect_start(NfcApp* nfc) { | ||||||
|     notification_message(nfc->notifications, &sequence_blink_start_yellow); |     notification_message(nfc->notifications, &sequence_blink_start_cyan); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void nfc_blink_stop(NfcApp* nfc) { | void nfc_blink_stop(NfcApp* nfc) { | ||||||
|  | |||||||
| @ -10,8 +10,8 @@ void nfc_scene_delete_success_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = nfc->popup; |     Popup* popup = nfc->popup; | ||||||
|     popup_set_icon(popup, 0, 2, &I_DolphinMafia_115x62); |     popup_set_icon(popup, 0, 2, &I_DolphinMafia_119x62); | ||||||
|     popup_set_header(popup, "Deleted", 83, 19, AlignLeft, AlignBottom); |     popup_set_header(popup, "Deleted", 80, 19, AlignLeft, AlignBottom); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, nfc); |     popup_set_context(popup, nfc); | ||||||
|     popup_set_callback(popup, nfc_scene_delete_success_popup_callback); |     popup_set_callback(popup, nfc_scene_delete_success_popup_callback); | ||||||
|  | |||||||
| @ -17,8 +17,9 @@ void nfc_scene_detect_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     popup_reset(instance->popup); |     popup_reset(instance->popup); | ||||||
|  |     popup_set_header(instance->popup, "Reading", 97, 15, AlignCenter, AlignTop); | ||||||
|     popup_set_text( |     popup_set_text( | ||||||
|         instance->popup, "Apply card to\nFlipper's back", 97, 24, AlignCenter, AlignTop); |         instance->popup, "Apply card to\nFlipper's back", 97, 27, AlignCenter, AlignTop); | ||||||
|     popup_set_icon(instance->popup, 0, 8, &I_NFC_manual_60x50); |     popup_set_icon(instance->popup, 0, 8, &I_NFC_manual_60x50); | ||||||
|     view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup); |     view_dispatcher_switch_to_view(instance->view_dispatcher, NfcViewPopup); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -12,9 +12,8 @@ void nfc_scene_exit_confirm_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     dialog_ex_set_left_button_text(dialog_ex, "Exit"); |     dialog_ex_set_left_button_text(dialog_ex, "Exit"); | ||||||
|     dialog_ex_set_right_button_text(dialog_ex, "Stay"); |     dialog_ex_set_right_button_text(dialog_ex, "Stay"); | ||||||
|     dialog_ex_set_header(dialog_ex, "Exit to NFC Menu?", 64, 11, AlignCenter, AlignTop); |     dialog_ex_set_header(dialog_ex, "Exit to NFC Menu?", 64, 0, AlignCenter, AlignTop); | ||||||
|     dialog_ex_set_text( |     dialog_ex_set_text(dialog_ex, "All unsaved data will be lost", 64, 12, AlignCenter, AlignTop); | ||||||
|         dialog_ex, "All unsaved data\nwill be lost!", 64, 25, AlignCenter, AlignTop); |  | ||||||
|     dialog_ex_set_context(dialog_ex, nfc); |     dialog_ex_set_context(dialog_ex, nfc); | ||||||
|     dialog_ex_set_result_callback(dialog_ex, nfc_scene_exit_confirm_dialog_callback); |     dialog_ex_set_result_callback(dialog_ex, nfc_scene_exit_confirm_dialog_callback); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -175,6 +175,16 @@ void nfc_scene_mf_classic_dict_attack_on_enter(void* context) { | |||||||
|     nfc_poller_start(instance->poller, nfc_dict_attack_worker_callback, instance); |     nfc_poller_start(instance->poller, nfc_dict_attack_worker_callback, instance); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void nfc_scene_mf_classic_dict_attack_notify_read(NfcApp* instance) { | ||||||
|  |     const MfClassicData* mfc_data = nfc_poller_get_data(instance->poller); | ||||||
|  |     bool is_card_fully_read = mf_classic_is_card_read(mfc_data); | ||||||
|  |     if(is_card_fully_read) { | ||||||
|  |         notification_message(instance->notifications, &sequence_success); | ||||||
|  |     } else { | ||||||
|  |         notification_message(instance->notifications, &sequence_semi_success); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| bool nfc_scene_mf_classic_dict_attack_on_event(void* context, SceneManagerEvent event) { | bool nfc_scene_mf_classic_dict_attack_on_event(void* context, SceneManagerEvent event) { | ||||||
|     NfcApp* instance = context; |     NfcApp* instance = context; | ||||||
|     bool consumed = false; |     bool consumed = false; | ||||||
| @ -196,7 +206,7 @@ bool nfc_scene_mf_classic_dict_attack_on_event(void* context, SceneManagerEvent | |||||||
|                 nfc_poller_start(instance->poller, nfc_dict_attack_worker_callback, instance); |                 nfc_poller_start(instance->poller, nfc_dict_attack_worker_callback, instance); | ||||||
|                 consumed = true; |                 consumed = true; | ||||||
|             } else { |             } else { | ||||||
|                 notification_message(instance->notifications, &sequence_success); |                 nfc_scene_mf_classic_dict_attack_notify_read(instance); | ||||||
|                 scene_manager_next_scene(instance->scene_manager, NfcSceneReadSuccess); |                 scene_manager_next_scene(instance->scene_manager, NfcSceneReadSuccess); | ||||||
|                 dolphin_deed(DolphinDeedNfcReadSuccess); |                 dolphin_deed(DolphinDeedNfcReadSuccess); | ||||||
|                 consumed = true; |                 consumed = true; | ||||||
| @ -225,13 +235,13 @@ bool nfc_scene_mf_classic_dict_attack_on_event(void* context, SceneManagerEvent | |||||||
|                     instance->poller = nfc_poller_alloc(instance->nfc, NfcProtocolMfClassic); |                     instance->poller = nfc_poller_alloc(instance->nfc, NfcProtocolMfClassic); | ||||||
|                     nfc_poller_start(instance->poller, nfc_dict_attack_worker_callback, instance); |                     nfc_poller_start(instance->poller, nfc_dict_attack_worker_callback, instance); | ||||||
|                 } else { |                 } else { | ||||||
|                     notification_message(instance->notifications, &sequence_success); |                     nfc_scene_mf_classic_dict_attack_notify_read(instance); | ||||||
|                     scene_manager_next_scene(instance->scene_manager, NfcSceneReadSuccess); |                     scene_manager_next_scene(instance->scene_manager, NfcSceneReadSuccess); | ||||||
|                     dolphin_deed(DolphinDeedNfcReadSuccess); |                     dolphin_deed(DolphinDeedNfcReadSuccess); | ||||||
|                 } |                 } | ||||||
|                 consumed = true; |                 consumed = true; | ||||||
|             } else if(state == DictAttackStateSystemDictInProgress) { |             } else if(state == DictAttackStateSystemDictInProgress) { | ||||||
|                 notification_message(instance->notifications, &sequence_success); |                 nfc_scene_mf_classic_dict_attack_notify_read(instance); | ||||||
|                 scene_manager_next_scene(instance->scene_manager, NfcSceneReadSuccess); |                 scene_manager_next_scene(instance->scene_manager, NfcSceneReadSuccess); | ||||||
|                 dolphin_deed(DolphinDeedNfcReadSuccess); |                 dolphin_deed(DolphinDeedNfcReadSuccess); | ||||||
|                 consumed = true; |                 consumed = true; | ||||||
|  | |||||||
| @ -11,7 +11,7 @@ void nfc_scene_mf_classic_keys_warn_duplicate_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = instance->popup; |     Popup* popup = instance->popup; | ||||||
|     popup_set_icon(popup, 72, 16, &I_DolphinCommon_56x48); |     popup_set_icon(popup, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|     popup_set_header(popup, "Key already exists!", 64, 3, AlignCenter, AlignTop); |     popup_set_header(popup, "Key already exists!", 64, 3, AlignCenter, AlignTop); | ||||||
|     popup_set_text( |     popup_set_text( | ||||||
|         popup, |         popup, | ||||||
|  | |||||||
| @ -12,8 +12,8 @@ void nfc_scene_mf_classic_update_initial_success_on_enter(void* context) { | |||||||
|     notification_message(instance->notifications, &sequence_success); |     notification_message(instance->notifications, &sequence_success); | ||||||
| 
 | 
 | ||||||
|     Popup* popup = instance->popup; |     Popup* popup = instance->popup; | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 48, 6, &I_DolphinDone_80x58); | ||||||
|     popup_set_header(popup, "Updated!", 11, 20, AlignLeft, AlignBottom); |     popup_set_header(popup, "Updated", 11, 20, AlignLeft, AlignBottom); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, instance); |     popup_set_context(popup, instance); | ||||||
|     popup_set_callback(popup, nfc_scene_mf_classic_update_initial_success_popup_callback); |     popup_set_callback(popup, nfc_scene_mf_classic_update_initial_success_popup_callback); | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ void nfc_scene_mf_classic_write_initial_fail_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     notification_message(instance->notifications, &sequence_error); |     notification_message(instance->notifications, &sequence_error); | ||||||
| 
 | 
 | ||||||
|     widget_add_icon_element(widget, 72, 17, &I_DolphinCommon_56x48); |     widget_add_icon_element(widget, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|     widget_add_string_element( |     widget_add_string_element( | ||||||
|         widget, 7, 4, AlignLeft, AlignTop, FontPrimary, "Writing gone wrong!"); |         widget, 7, 4, AlignLeft, AlignTop, FontPrimary, "Writing gone wrong!"); | ||||||
|     widget_add_string_multiline_element( |     widget_add_string_multiline_element( | ||||||
|  | |||||||
| @ -12,8 +12,8 @@ void nfc_scene_mf_classic_write_initial_success_on_enter(void* context) { | |||||||
|     notification_message(instance->notifications, &sequence_success); |     notification_message(instance->notifications, &sequence_success); | ||||||
| 
 | 
 | ||||||
|     Popup* popup = instance->popup; |     Popup* popup = instance->popup; | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_header(popup, "Success!", 75, 10, AlignLeft, AlignTop); | ||||||
|     popup_set_header(popup, "Successfully\nwritten", 13, 22, AlignLeft, AlignBottom); |     popup_set_icon(popup, 0, 9, &I_DolphinSuccess_91x55); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, instance); |     popup_set_context(popup, instance); | ||||||
|     popup_set_callback(popup, nfc_scene_mf_classic_write_initial_success_popup_callback); |     popup_set_callback(popup, nfc_scene_mf_classic_write_initial_success_popup_callback); | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ void nfc_scene_mf_classic_wrong_card_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     notification_message(instance->notifications, &sequence_error); |     notification_message(instance->notifications, &sequence_error); | ||||||
| 
 | 
 | ||||||
|     widget_add_icon_element(widget, 73, 17, &I_DolphinCommon_56x48); |     widget_add_icon_element(widget, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|     widget_add_string_element( |     widget_add_string_element( | ||||||
|         widget, 3, 4, AlignLeft, AlignTop, FontPrimary, "This is wrong card"); |         widget, 3, 4, AlignLeft, AlignTop, FontPrimary, "This is wrong card"); | ||||||
|     widget_add_string_multiline_element( |     widget_add_string_multiline_element( | ||||||
|  | |||||||
| @ -40,7 +40,7 @@ void nfc_scene_mf_ultralight_unlock_warn_on_enter(void* context) { | |||||||
|         dialog_ex_set_header(dialog_ex, "Risky function!", 64, 4, AlignCenter, AlignTop); |         dialog_ex_set_header(dialog_ex, "Risky function!", 64, 4, AlignCenter, AlignTop); | ||||||
|         dialog_ex_set_text( |         dialog_ex_set_text( | ||||||
|             dialog_ex, "Wrong password\ncan block your\ncard.", 4, 18, AlignLeft, AlignTop); |             dialog_ex, "Wrong password\ncan block your\ncard.", 4, 18, AlignLeft, AlignTop); | ||||||
|         dialog_ex_set_icon(dialog_ex, 73, 20, &I_DolphinCommon_56x48); |         dialog_ex_set_icon(dialog_ex, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|         dialog_ex_set_center_button_text(dialog_ex, "OK"); |         dialog_ex_set_center_button_text(dialog_ex, "OK"); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ void nfc_scene_mf_ultralight_write_fail_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     notification_message(instance->notifications, &sequence_error); |     notification_message(instance->notifications, &sequence_error); | ||||||
| 
 | 
 | ||||||
|     widget_add_icon_element(widget, 72, 17, &I_DolphinCommon_56x48); |     widget_add_icon_element(widget, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|     widget_add_string_element( |     widget_add_string_element( | ||||||
|         widget, 7, 4, AlignLeft, AlignTop, FontPrimary, "Writing gone wrong!"); |         widget, 7, 4, AlignLeft, AlignTop, FontPrimary, "Writing gone wrong!"); | ||||||
|     widget_add_string_multiline_element( |     widget_add_string_multiline_element( | ||||||
|  | |||||||
| @ -12,8 +12,8 @@ void nfc_scene_mf_ultralight_write_success_on_enter(void* context) { | |||||||
|     notification_message(instance->notifications, &sequence_success); |     notification_message(instance->notifications, &sequence_success); | ||||||
| 
 | 
 | ||||||
|     Popup* popup = instance->popup; |     Popup* popup = instance->popup; | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 48, 6, &I_DolphinDone_80x58); | ||||||
|     popup_set_header(popup, "Successfully\nwritten", 13, 22, AlignLeft, AlignBottom); |     popup_set_header(popup, "Successfully\nwritten", 5, 22, AlignLeft, AlignBottom); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, instance); |     popup_set_context(popup, instance); | ||||||
|     popup_set_callback(popup, nfc_scene_mf_ultralight_write_success_popup_callback); |     popup_set_callback(popup, nfc_scene_mf_ultralight_write_success_popup_callback); | ||||||
|  | |||||||
| @ -16,7 +16,7 @@ void nfc_scene_mf_ultralight_wrong_card_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     notification_message(instance->notifications, &sequence_error); |     notification_message(instance->notifications, &sequence_error); | ||||||
| 
 | 
 | ||||||
|     widget_add_icon_element(widget, 73, 17, &I_DolphinCommon_56x48); |     widget_add_icon_element(widget, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|     widget_add_string_element( |     widget_add_string_element( | ||||||
|         widget, 3, 4, AlignLeft, AlignTop, FontPrimary, "This is wrong card"); |         widget, 3, 4, AlignLeft, AlignTop, FontPrimary, "This is wrong card"); | ||||||
|     widget_add_string_multiline_element( |     widget_add_string_multiline_element( | ||||||
|  | |||||||
| @ -10,8 +10,8 @@ void nfc_scene_restore_original_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = nfc->popup; |     Popup* popup = nfc->popup; | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 48, 6, &I_DolphinDone_80x58); | ||||||
|     popup_set_header(popup, "Original file\nrestored", 13, 22, AlignLeft, AlignBottom); |     popup_set_header(popup, "Original file\nrestored", 5, 22, AlignLeft, AlignBottom); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, nfc); |     popup_set_context(popup, nfc); | ||||||
|     popup_set_callback(popup, nfc_scene_restore_original_popup_callback); |     popup_set_callback(popup, nfc_scene_restore_original_popup_callback); | ||||||
|  | |||||||
| @ -12,9 +12,8 @@ void nfc_scene_retry_confirm_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     dialog_ex_set_left_button_text(dialog_ex, "Retry"); |     dialog_ex_set_left_button_text(dialog_ex, "Retry"); | ||||||
|     dialog_ex_set_right_button_text(dialog_ex, "Stay"); |     dialog_ex_set_right_button_text(dialog_ex, "Stay"); | ||||||
|     dialog_ex_set_header(dialog_ex, "Retry Reading?", 64, 11, AlignCenter, AlignTop); |     dialog_ex_set_header(dialog_ex, "Retry Reading?", 64, 0, AlignCenter, AlignTop); | ||||||
|     dialog_ex_set_text( |     dialog_ex_set_text(dialog_ex, "All unsaved data will be lost", 64, 12, AlignCenter, AlignTop); | ||||||
|         dialog_ex, "All unsaved data\nwill be lost!", 64, 25, AlignCenter, AlignTop); |  | ||||||
|     dialog_ex_set_context(dialog_ex, nfc); |     dialog_ex_set_context(dialog_ex, nfc); | ||||||
|     dialog_ex_set_result_callback(dialog_ex, nfc_scene_retry_confirm_dialog_callback); |     dialog_ex_set_result_callback(dialog_ex, nfc_scene_retry_confirm_dialog_callback); | ||||||
| 
 | 
 | ||||||
| @ -29,7 +28,11 @@ bool nfc_scene_retry_confirm_on_event(void* context, SceneManagerEvent event) { | |||||||
|         if(event.event == DialogExResultRight) { |         if(event.event == DialogExResultRight) { | ||||||
|             consumed = scene_manager_previous_scene(nfc->scene_manager); |             consumed = scene_manager_previous_scene(nfc->scene_manager); | ||||||
|         } else if(event.event == DialogExResultLeft) { |         } else if(event.event == DialogExResultLeft) { | ||||||
|             if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneDetect)) { |             if(scene_manager_has_previous_scene( | ||||||
|  |                    nfc->scene_manager, NfcSceneMfUltralightUnlockWarn)) { | ||||||
|  |                 consumed = scene_manager_search_and_switch_to_previous_scene( | ||||||
|  |                     nfc->scene_manager, NfcSceneMfUltralightUnlockMenu); | ||||||
|  |             } else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneDetect)) { | ||||||
|                 consumed = scene_manager_search_and_switch_to_previous_scene( |                 consumed = scene_manager_search_and_switch_to_previous_scene( | ||||||
|                     nfc->scene_manager, NfcSceneDetect); |                     nfc->scene_manager, NfcSceneDetect); | ||||||
|             } else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneRead)) { |             } else if(scene_manager_has_previous_scene(nfc->scene_manager, NfcSceneRead)) { | ||||||
|  | |||||||
| @ -10,8 +10,8 @@ void nfc_scene_save_success_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = nfc->popup; |     Popup* popup = nfc->popup; | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 36, 5, &I_DolphinSaved_92x58); | ||||||
|     popup_set_header(popup, "Saved!", 13, 22, AlignLeft, AlignBottom); |     popup_set_header(popup, "Saved", 15, 19, AlignLeft, AlignBottom); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, nfc); |     popup_set_context(popup, nfc); | ||||||
|     popup_set_callback(popup, nfc_scene_save_success_popup_callback); |     popup_set_callback(popup, nfc_scene_save_success_popup_callback); | ||||||
|  | |||||||
| @ -50,6 +50,7 @@ static void detect_reader_draw_callback(Canvas* canvas, void* model) { | |||||||
|         if(m->state == DetectReaderStateDone) { |         if(m->state == DetectReaderStateDone) { | ||||||
|             canvas_set_font(canvas, FontPrimary); |             canvas_set_font(canvas, FontPrimary); | ||||||
|             canvas_draw_str_aligned(canvas, 51, 22, AlignLeft, AlignTop, "Completed!"); |             canvas_draw_str_aligned(canvas, 51, 22, AlignLeft, AlignTop, "Completed!"); | ||||||
|  |             canvas_draw_icon(canvas, 20, 23, &I_check_big_20x17); | ||||||
|         } else { |         } else { | ||||||
|             canvas_set_font(canvas, FontPrimary); |             canvas_set_font(canvas, FontPrimary); | ||||||
|             canvas_draw_str_aligned(canvas, 51, 22, AlignLeft, AlignTop, "Collecting..."); |             canvas_draw_str_aligned(canvas, 51, 22, AlignLeft, AlignTop, "Collecting..."); | ||||||
|  | |||||||
| @ -12,8 +12,8 @@ void subghz_scene_delete_success_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = subghz->popup; |     Popup* popup = subghz->popup; | ||||||
|     popup_set_icon(popup, 0, 2, &I_DolphinMafia_115x62); |     popup_set_icon(popup, 0, 2, &I_DolphinMafia_119x62); | ||||||
|     popup_set_header(popup, "Deleted", 83, 19, AlignLeft, AlignBottom); |     popup_set_header(popup, "Deleted", 80, 19, AlignLeft, AlignBottom); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, subghz); |     popup_set_context(popup, subghz); | ||||||
|     popup_set_callback(popup, subghz_scene_delete_success_popup_callback); |     popup_set_callback(popup, subghz_scene_delete_success_popup_callback); | ||||||
|  | |||||||
| @ -93,7 +93,7 @@ void subghz_scene_receiver_info_on_enter(void* context) { | |||||||
|                 subghz); |                 subghz); | ||||||
|         } |         } | ||||||
|     } else { |     } else { | ||||||
|         widget_add_icon_element(subghz->widget, 37, 15, &I_DolphinCommon_56x48); |         widget_add_icon_element(subghz->widget, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|         widget_add_string_element( |         widget_add_string_element( | ||||||
|             subghz->widget, 13, 8, AlignLeft, AlignBottom, FontSecondary, "Error history parse."); |             subghz->widget, 13, 8, AlignLeft, AlignBottom, FontSecondary, "Error history parse."); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -11,8 +11,8 @@ void subghz_scene_save_success_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = subghz->popup; |     Popup* popup = subghz->popup; | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 36, 5, &I_DolphinSaved_92x58); | ||||||
|     popup_set_header(popup, "Saved!", 13, 22, AlignLeft, AlignBottom); |     popup_set_header(popup, "Saved", 15, 19, AlignLeft, AlignBottom); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, subghz); |     popup_set_context(popup, subghz); | ||||||
|     popup_set_callback(popup, subghz_scene_save_success_popup_callback); |     popup_set_callback(popup, subghz_scene_save_success_popup_callback); | ||||||
|  | |||||||
| @ -11,7 +11,7 @@ void subghz_scene_show_error_sub_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     // Setup view
 |     // Setup view
 | ||||||
|     Popup* popup = subghz->popup; |     Popup* popup = subghz->popup; | ||||||
|     popup_set_icon(popup, 72, 17, &I_DolphinCommon_56x48); |     popup_set_icon(popup, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|     popup_set_header(popup, furi_string_get_cstr(subghz->error_str), 14, 15, AlignLeft, AlignTop); |     popup_set_header(popup, furi_string_get_cstr(subghz->error_str), 14, 15, AlignLeft, AlignTop); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, subghz); |     popup_set_context(popup, subghz); | ||||||
|  | |||||||
| @ -21,7 +21,7 @@ void subghz_scene_show_only_rx_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     popup_set_header(popup, header_text, 63, 3, AlignCenter, AlignTop); |     popup_set_header(popup, header_text, 63, 3, AlignCenter, AlignTop); | ||||||
|     popup_set_text(popup, message_text, 0, 17, AlignLeft, AlignTop); |     popup_set_text(popup, message_text, 0, 17, AlignLeft, AlignTop); | ||||||
|     popup_set_icon(popup, 72, 17, &I_DolphinCommon_56x48); |     popup_set_icon(popup, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
| 
 | 
 | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, subghz); |     popup_set_context(popup, subghz); | ||||||
|  | |||||||
| @ -70,7 +70,7 @@ void subghz_dialog_message_show_only_rx(SubGhz* subghz) { | |||||||
|     dialog_message_set_header(message, header_text, 63, 3, AlignCenter, AlignTop); |     dialog_message_set_header(message, header_text, 63, 3, AlignCenter, AlignTop); | ||||||
|     dialog_message_set_text(message, message_text, 0, 17, AlignLeft, AlignTop); |     dialog_message_set_text(message, message_text, 0, 17, AlignLeft, AlignTop); | ||||||
| 
 | 
 | ||||||
|     dialog_message_set_icon(message, &I_DolphinCommon_56x48, 72, 17); |     dialog_message_set_icon(message, &I_WarningDolphinFlip_45x42, 83, 22); | ||||||
| 
 | 
 | ||||||
|     dialog_message_show(dialogs, message); |     dialog_message_show(dialogs, message); | ||||||
|     dialog_message_free(message); |     dialog_message_free(message); | ||||||
|  | |||||||
| @ -55,7 +55,7 @@ LoaderStatus loader_start_with_gui_error(Loader* loader, const char* name, const | |||||||
|         DialogMessage* message = dialog_message_alloc(); |         DialogMessage* message = dialog_message_alloc(); | ||||||
|         dialog_message_set_header(message, "Update needed", 64, 3, AlignCenter, AlignTop); |         dialog_message_set_header(message, "Update needed", 64, 3, AlignCenter, AlignTop); | ||||||
|         dialog_message_set_buttons(message, NULL, NULL, NULL); |         dialog_message_set_buttons(message, NULL, NULL, NULL); | ||||||
|         dialog_message_set_icon(message, &I_DolphinCommon_56x48, 72, 17); |         dialog_message_set_icon(message, &I_WarningDolphinFlip_45x42, 83, 22); | ||||||
|         dialog_message_set_text( |         dialog_message_set_text( | ||||||
|             message, "Update firmware\nto run this app", 3, 26, AlignLeft, AlignTop); |             message, "Update firmware\nto run this app", 3, 26, AlignLeft, AlignTop); | ||||||
|         dialog_message_show(dialogs, message); |         dialog_message_show(dialogs, message); | ||||||
|  | |||||||
| @ -519,6 +519,24 @@ const NotificationSequence sequence_success = { | |||||||
|     NULL, |     NULL, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | const NotificationSequence sequence_semi_success = { | ||||||
|  |     &message_display_backlight_on, | ||||||
|  |     &message_green_255, | ||||||
|  |     &message_vibro_on, | ||||||
|  |     &message_note_c4, | ||||||
|  |     &message_delay_50, | ||||||
|  |     &message_note_e4, | ||||||
|  |     &message_delay_50, | ||||||
|  |     &message_note_g4, | ||||||
|  |     &message_delay_50, | ||||||
|  |     &message_sound_off, | ||||||
|  |     &message_delay_50, | ||||||
|  |     &message_note_c5, | ||||||
|  |     &message_delay_50, | ||||||
|  |     &message_sound_off, | ||||||
|  |     NULL, | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| const NotificationSequence sequence_error = { | const NotificationSequence sequence_error = { | ||||||
|     &message_display_backlight_on, |     &message_display_backlight_on, | ||||||
|     &message_red_255, |     &message_red_255, | ||||||
|  | |||||||
| @ -138,6 +138,7 @@ extern const NotificationSequence sequence_blink_stop; | |||||||
| extern const NotificationSequence sequence_single_vibro; | extern const NotificationSequence sequence_single_vibro; | ||||||
| extern const NotificationSequence sequence_double_vibro; | extern const NotificationSequence sequence_double_vibro; | ||||||
| extern const NotificationSequence sequence_success; | extern const NotificationSequence sequence_success; | ||||||
|  | extern const NotificationSequence sequence_semi_success; | ||||||
| extern const NotificationSequence sequence_error; | extern const NotificationSequence sequence_error; | ||||||
| extern const NotificationSequence sequence_audiovisual_alert; | extern const NotificationSequence sequence_audiovisual_alert; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -10,7 +10,7 @@ void bt_settings_scene_forget_dev_success_on_enter(void* context) { | |||||||
|     BtSettingsApp* app = context; |     BtSettingsApp* app = context; | ||||||
|     Popup* popup = app->popup; |     Popup* popup = app->popup; | ||||||
| 
 | 
 | ||||||
|     popup_set_icon(popup, 32, 5, &I_DolphinNice_96x59); |     popup_set_icon(popup, 48, 6, &I_DolphinDone_80x58); | ||||||
|     popup_set_header(popup, "Done", 14, 15, AlignLeft, AlignTop); |     popup_set_header(popup, "Done", 14, 15, AlignLeft, AlignTop); | ||||||
|     popup_set_timeout(popup, 1500); |     popup_set_timeout(popup, 1500); | ||||||
|     popup_set_context(popup, app); |     popup_set_context(popup, app); | ||||||
|  | |||||||
| @ -24,8 +24,8 @@ void desktop_settings_scene_pin_disable_on_enter(void* context) { | |||||||
| 
 | 
 | ||||||
|     popup_set_context(app->popup, app); |     popup_set_context(app->popup, app); | ||||||
|     popup_set_callback(app->popup, pin_disable_back_callback); |     popup_set_callback(app->popup, pin_disable_back_callback); | ||||||
|     popup_set_icon(app->popup, 0, 2, &I_DolphinMafia_115x62); |     popup_set_icon(app->popup, 0, 2, &I_DolphinMafia_119x62); | ||||||
|     popup_set_header(app->popup, "PIN\ndeleted!", 95, 9, AlignCenter, AlignCenter); |     popup_set_header(app->popup, "Deleted", 80, 19, AlignLeft, AlignBottom); | ||||||
|     popup_set_timeout(app->popup, 1500); |     popup_set_timeout(app->popup, 1500); | ||||||
|     popup_enable_timeout(app->popup); |     popup_enable_timeout(app->popup); | ||||||
|     view_dispatcher_switch_to_view(app->view_dispatcher, DesktopSettingsAppViewIdPopup); |     view_dispatcher_switch_to_view(app->view_dispatcher, DesktopSettingsAppViewIdPopup); | ||||||
|  | |||||||
| @ -125,7 +125,7 @@ void storage_settings_scene_benchmark_on_enter(void* context) { | |||||||
|     view_dispatcher_switch_to_view(app->view_dispatcher, StorageSettingsViewDialogEx); |     view_dispatcher_switch_to_view(app->view_dispatcher, StorageSettingsViewDialogEx); | ||||||
| 
 | 
 | ||||||
|     if(sd_status != FSE_OK) { |     if(sd_status != FSE_OK) { | ||||||
|         dialog_ex_set_icon(dialog_ex, 72, 17, &I_DolphinCommon_56x48); |         dialog_ex_set_icon(dialog_ex, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|         dialog_ex_set_header(dialog_ex, "SD Card Not Mounted", 64, 3, AlignCenter, AlignTop); |         dialog_ex_set_header(dialog_ex, "SD Card Not Mounted", 64, 3, AlignCenter, AlignTop); | ||||||
|         dialog_ex_set_text( |         dialog_ex_set_text( | ||||||
|             dialog_ex, "Try to reinsert\nor format SD\ncard.", 3, 19, AlignLeft, AlignTop); |             dialog_ex, "Try to reinsert\nor format SD\ncard.", 3, 19, AlignLeft, AlignTop); | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ void storage_settings_scene_format_confirm_on_enter(void* context) { | |||||||
|     FS_Error sd_status = storage_sd_status(app->fs_api); |     FS_Error sd_status = storage_sd_status(app->fs_api); | ||||||
| 
 | 
 | ||||||
|     if(sd_status == FSE_NOT_READY) { |     if(sd_status == FSE_NOT_READY) { | ||||||
|         dialog_ex_set_icon(dialog_ex, 72, 17, &I_DolphinCommon_56x48); |         dialog_ex_set_icon(dialog_ex, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|         dialog_ex_set_header(dialog_ex, "SD Card Not Mounted", 64, 3, AlignCenter, AlignTop); |         dialog_ex_set_header(dialog_ex, "SD Card Not Mounted", 64, 3, AlignCenter, AlignTop); | ||||||
|         dialog_ex_set_text( |         dialog_ex_set_text( | ||||||
|             dialog_ex, "Try to reinsert\nor format SD\ncard.", 3, 19, AlignLeft, AlignTop); |             dialog_ex, "Try to reinsert\nor format SD\ncard.", 3, 19, AlignLeft, AlignTop); | ||||||
|  | |||||||
| @ -47,7 +47,7 @@ void storage_settings_scene_formatting_on_enter(void* context) { | |||||||
|         dialog_ex_set_text( |         dialog_ex_set_text( | ||||||
|             dialog_ex, storage_error_get_desc(error), 64, 32, AlignCenter, AlignCenter); |             dialog_ex, storage_error_get_desc(error), 64, 32, AlignCenter, AlignCenter); | ||||||
|     } else { |     } else { | ||||||
|         dialog_ex_set_icon(dialog_ex, 72, 17, &I_DolphinCommon_56x48); |         dialog_ex_set_icon(dialog_ex, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|         dialog_ex_set_header(dialog_ex, "Format\ncomplete!", 14, 15, AlignLeft, AlignTop); |         dialog_ex_set_header(dialog_ex, "Format\ncomplete!", 14, 15, AlignLeft, AlignTop); | ||||||
|     } |     } | ||||||
|     dialog_ex_set_center_button_text(dialog_ex, "OK"); |     dialog_ex_set_center_button_text(dialog_ex, "OK"); | ||||||
|  | |||||||
| @ -19,7 +19,7 @@ void storage_settings_scene_sd_info_on_enter(void* context) { | |||||||
|     dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_sd_info_dialog_callback); |     dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_sd_info_dialog_callback); | ||||||
| 
 | 
 | ||||||
|     if(sd_status != FSE_OK) { |     if(sd_status != FSE_OK) { | ||||||
|         dialog_ex_set_icon(dialog_ex, 72, 17, &I_DolphinCommon_56x48); |         dialog_ex_set_icon(dialog_ex, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
|         dialog_ex_set_header(dialog_ex, "SD Card Not Mounted", 64, 3, AlignCenter, AlignTop); |         dialog_ex_set_header(dialog_ex, "SD Card Not Mounted", 64, 3, AlignCenter, AlignTop); | ||||||
|         dialog_ex_set_text( |         dialog_ex_set_text( | ||||||
|             dialog_ex, "Try to reinsert\nor format SD\ncard.", 3, 19, AlignLeft, AlignTop); |             dialog_ex, "Try to reinsert\nor format SD\ncard.", 3, 19, AlignLeft, AlignTop); | ||||||
|  | |||||||
| @ -42,7 +42,7 @@ void storage_settings_scene_unmounted_on_enter(void* context) { | |||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     dialog_ex_set_center_button_text(dialog_ex, "OK"); |     dialog_ex_set_center_button_text(dialog_ex, "OK"); | ||||||
|     dialog_ex_set_icon(dialog_ex, 72, 17, &I_DolphinCommon_56x48); |     dialog_ex_set_icon(dialog_ex, 83, 22, &I_WarningDolphinFlip_45x42); | ||||||
| 
 | 
 | ||||||
|     dialog_ex_set_context(dialog_ex, app); |     dialog_ex_set_context(dialog_ex, app); | ||||||
|     dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_unmounted_dialog_callback); |     dialog_ex_set_result_callback(dialog_ex, storage_settings_scene_unmounted_dialog_callback); | ||||||
|  | |||||||
| Before Width: | Height: | Size: 1.4 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/Dolphin/DolphinDone_80x58.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.6 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/Dolphin/DolphinMafia_119x62.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.3 KiB | 
| Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/Dolphin/DolphinSaved_92x58.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 901 B | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/Dolphin/DolphinSuccess_91x55.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 930 B | 
| Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/Dolphin/WarningDolphinFlip_45x42.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 1.4 KiB | 
| Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/NFC/check_big_20x17.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 199 B | 
| Before Width: | Height: | Size: 2.6 KiB | 
| Before Width: | Height: | Size: 2.4 KiB | 
| Before Width: | Height: | Size: 2.4 KiB | 
| Before Width: | Height: | Size: 2.1 KiB | 
							
								
								
									
										
											BIN
										
									
								
								assets/icons/iButton/iButtonDolphinVerySuccess_92x55.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| After Width: | Height: | Size: 967 B | 
| @ -2798,6 +2798,7 @@ Variable,+,sequence_reset_red,const NotificationSequence, | |||||||
| Variable,+,sequence_reset_rgb,const NotificationSequence, | Variable,+,sequence_reset_rgb,const NotificationSequence, | ||||||
| Variable,+,sequence_reset_sound,const NotificationSequence, | Variable,+,sequence_reset_sound,const NotificationSequence, | ||||||
| Variable,+,sequence_reset_vibro,const NotificationSequence, | Variable,+,sequence_reset_vibro,const NotificationSequence, | ||||||
|  | Variable,+,sequence_semi_success,const NotificationSequence, | ||||||
| Variable,+,sequence_set_blue_255,const NotificationSequence, | Variable,+,sequence_set_blue_255,const NotificationSequence, | ||||||
| Variable,+,sequence_set_green_255,const NotificationSequence, | Variable,+,sequence_set_green_255,const NotificationSequence, | ||||||
| Variable,+,sequence_set_only_blue_255,const NotificationSequence, | Variable,+,sequence_set_only_blue_255,const NotificationSequence, | ||||||
|  | |||||||
| 
 | 
| @ -3589,6 +3589,7 @@ Variable,+,sequence_reset_red,const NotificationSequence, | |||||||
| Variable,+,sequence_reset_rgb,const NotificationSequence, | Variable,+,sequence_reset_rgb,const NotificationSequence, | ||||||
| Variable,+,sequence_reset_sound,const NotificationSequence, | Variable,+,sequence_reset_sound,const NotificationSequence, | ||||||
| Variable,+,sequence_reset_vibro,const NotificationSequence, | Variable,+,sequence_reset_vibro,const NotificationSequence, | ||||||
|  | Variable,+,sequence_semi_success,const NotificationSequence, | ||||||
| Variable,+,sequence_set_blue_255,const NotificationSequence, | Variable,+,sequence_set_blue_255,const NotificationSequence, | ||||||
| Variable,+,sequence_set_green_255,const NotificationSequence, | Variable,+,sequence_set_green_255,const NotificationSequence, | ||||||
| Variable,+,sequence_set_only_blue_255,const NotificationSequence, | Variable,+,sequence_set_only_blue_255,const NotificationSequence, | ||||||
|  | |||||||
| 
 | 
 RebornedBrain
						RebornedBrain