nfc_scene_saved_menu.c 4.4 KB

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