nfc_scene_saved_menu.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. #include "../nfc_i.h"
  2. #include <dolphin/dolphin.h>
  3. enum SubmenuIndex {
  4. SubmenuIndexEmulate,
  5. SubmenuIndexEditUid,
  6. SubmenuIndexRename,
  7. SubmenuIndexDelete,
  8. SubmenuIndexInfo,
  9. SubmenuIndexRestoreOriginal,
  10. };
  11. void nfc_scene_saved_menu_submenu_callback(void* context, uint32_t index) {
  12. Nfc* nfc = context;
  13. view_dispatcher_send_custom_event(nfc->view_dispatcher, index);
  14. }
  15. void nfc_scene_saved_menu_on_enter(void* context) {
  16. Nfc* nfc = context;
  17. Submenu* submenu = nfc->submenu;
  18. if(nfc->dev->format == NfcDeviceSaveFormatUid ||
  19. nfc->dev->format == NfcDeviceSaveFormatMifareDesfire) {
  20. submenu_add_item(
  21. submenu,
  22. "Emulate UID",
  23. SubmenuIndexEmulate,
  24. nfc_scene_saved_menu_submenu_callback,
  25. nfc);
  26. if(nfc->dev->dev_data.protocol == NfcDeviceProtocolUnknown) {
  27. submenu_add_item(
  28. submenu,
  29. "Edit UID",
  30. SubmenuIndexEditUid,
  31. nfc_scene_saved_menu_submenu_callback,
  32. nfc);
  33. }
  34. } else if(
  35. nfc->dev->format == NfcDeviceSaveFormatMifareUl ||
  36. nfc->dev->format == NfcDeviceSaveFormatMifareClassic) {
  37. submenu_add_item(
  38. submenu, "Emulate", SubmenuIndexEmulate, nfc_scene_saved_menu_submenu_callback, nfc);
  39. }
  40. submenu_add_item(
  41. submenu, "Info", SubmenuIndexInfo, nfc_scene_saved_menu_submenu_callback, nfc);
  42. if(nfc->dev->shadow_file_exist) {
  43. submenu_add_item(
  44. submenu,
  45. "Restore to original",
  46. SubmenuIndexRestoreOriginal,
  47. nfc_scene_saved_menu_submenu_callback,
  48. nfc);
  49. }
  50. submenu_add_item(
  51. submenu, "Rename", SubmenuIndexRename, nfc_scene_saved_menu_submenu_callback, nfc);
  52. submenu_add_item(
  53. submenu, "Delete", SubmenuIndexDelete, nfc_scene_saved_menu_submenu_callback, nfc);
  54. submenu_set_selected_item(
  55. nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneSavedMenu));
  56. view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu);
  57. }
  58. bool nfc_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
  59. Nfc* nfc = context;
  60. NfcDeviceData* dev_data = &nfc->dev->dev_data;
  61. bool consumed = false;
  62. if(event.type == SceneManagerEventTypeCustom) {
  63. scene_manager_set_scene_state(nfc->scene_manager, NfcSceneSavedMenu, event.event);
  64. if(event.event == SubmenuIndexEmulate) {
  65. if(nfc->dev->format == NfcDeviceSaveFormatMifareUl) {
  66. scene_manager_next_scene(nfc->scene_manager, NfcSceneMfUltralightEmulate);
  67. } else if(nfc->dev->format == NfcDeviceSaveFormatMifareClassic) {
  68. scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate);
  69. } else {
  70. scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid);
  71. }
  72. DOLPHIN_DEED(DolphinDeedNfcEmulate);
  73. consumed = true;
  74. } else if(event.event == SubmenuIndexRename) {
  75. scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName);
  76. consumed = true;
  77. } else if(event.event == SubmenuIndexEditUid) {
  78. scene_manager_next_scene(nfc->scene_manager, NfcSceneSetUid);
  79. consumed = true;
  80. } else if(event.event == SubmenuIndexDelete) {
  81. scene_manager_next_scene(nfc->scene_manager, NfcSceneDelete);
  82. consumed = true;
  83. } else if(event.event == SubmenuIndexInfo) {
  84. bool application_info_present = false;
  85. if(dev_data->protocol == NfcDeviceProtocolEMV) {
  86. application_info_present = true;
  87. } else if(
  88. dev_data->protocol == NfcDeviceProtocolMifareClassic ||
  89. dev_data->protocol == NfcDeviceProtocolMifareUl) {
  90. application_info_present = nfc_supported_card_verify_and_parse(dev_data);
  91. }
  92. if(application_info_present) {
  93. scene_manager_next_scene(nfc->scene_manager, NfcSceneDeviceInfo);
  94. } else {
  95. scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcDataInfo);
  96. }
  97. consumed = true;
  98. } else if(event.event == SubmenuIndexRestoreOriginal) {
  99. scene_manager_next_scene(nfc->scene_manager, NfcSceneRestoreOriginalConfirm);
  100. consumed = true;
  101. }
  102. }
  103. return consumed;
  104. }
  105. void nfc_scene_saved_menu_on_exit(void* context) {
  106. Nfc* nfc = context;
  107. submenu_reset(nfc->submenu);
  108. }