nfc_scene_saved_menu.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. nfc->dev->format == NfcDeviceSaveFormatBankCard) {
  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. consumed = true;
  73. } else if(event.event == SubmenuIndexRename) {
  74. scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName);
  75. consumed = true;
  76. } else if(event.event == SubmenuIndexEditUid) {
  77. scene_manager_next_scene(nfc->scene_manager, NfcSceneSetUid);
  78. consumed = true;
  79. } else if(event.event == SubmenuIndexDelete) {
  80. scene_manager_next_scene(nfc->scene_manager, NfcSceneDelete);
  81. consumed = true;
  82. } else if(event.event == SubmenuIndexInfo) {
  83. bool application_info_present = false;
  84. if(dev_data->protocol == NfcDeviceProtocolEMV) {
  85. application_info_present = true;
  86. } else if(dev_data->protocol == NfcDeviceProtocolMifareClassic) {
  87. application_info_present = nfc_supported_card_verify_and_parse(dev_data);
  88. }
  89. if(application_info_present) {
  90. scene_manager_next_scene(nfc->scene_manager, NfcSceneDeviceInfo);
  91. } else {
  92. scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcDataInfo);
  93. }
  94. consumed = true;
  95. } else if(event.event == SubmenuIndexRestoreOriginal) {
  96. scene_manager_next_scene(nfc->scene_manager, NfcSceneRestoreOriginalConfirm);
  97. consumed = true;
  98. }
  99. }
  100. return consumed;
  101. }
  102. void nfc_scene_saved_menu_on_exit(void* context) {
  103. Nfc* nfc = context;
  104. submenu_reset(nfc->submenu);
  105. }