nfc_scene_saved_menu.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. #include "../nfc_i.h"
  2. #include <dolphin/dolphin.h>
  3. enum SubmenuIndex {
  4. SubmenuIndexEmulate,
  5. SubmenuIndexEditUid,
  6. SubmenuIndexDetectReader,
  7. SubmenuIndexWrite,
  8. SubmenuIndexUpdate,
  9. SubmenuIndexRename,
  10. SubmenuIndexDelete,
  11. SubmenuIndexInfo,
  12. SubmenuIndexRestoreOriginal,
  13. SubmenuIndexMfUlUnlockByReader,
  14. SubmenuIndexMfUlUnlockByPassword,
  15. };
  16. void nfc_scene_saved_menu_submenu_callback(void* context, uint32_t index) {
  17. Nfc* nfc = context;
  18. view_dispatcher_send_custom_event(nfc->view_dispatcher, index);
  19. }
  20. void nfc_scene_saved_menu_on_enter(void* context) {
  21. Nfc* nfc = context;
  22. Submenu* submenu = nfc->submenu;
  23. if(nfc->dev->format == NfcDeviceSaveFormatUid ||
  24. nfc->dev->format == NfcDeviceSaveFormatMifareDesfire) {
  25. submenu_add_item(
  26. submenu,
  27. "Emulate UID",
  28. SubmenuIndexEmulate,
  29. nfc_scene_saved_menu_submenu_callback,
  30. nfc);
  31. if(nfc->dev->dev_data.protocol == NfcDeviceProtocolUnknown) {
  32. submenu_add_item(
  33. submenu,
  34. "Edit UID",
  35. SubmenuIndexEditUid,
  36. nfc_scene_saved_menu_submenu_callback,
  37. nfc);
  38. }
  39. } else if(
  40. nfc->dev->format == NfcDeviceSaveFormatMifareUl ||
  41. nfc->dev->format == NfcDeviceSaveFormatMifareClassic) {
  42. submenu_add_item(
  43. submenu, "Emulate", SubmenuIndexEmulate, nfc_scene_saved_menu_submenu_callback, nfc);
  44. }
  45. if(nfc->dev->format == NfcDeviceSaveFormatMifareClassic) {
  46. if(!mf_classic_is_card_read(&nfc->dev->dev_data.mf_classic_data)) {
  47. submenu_add_item(
  48. submenu,
  49. "Detect reader",
  50. SubmenuIndexDetectReader,
  51. nfc_scene_saved_menu_submenu_callback,
  52. nfc);
  53. }
  54. submenu_add_item(
  55. submenu,
  56. "Write To Initial Card",
  57. SubmenuIndexWrite,
  58. nfc_scene_saved_menu_submenu_callback,
  59. nfc);
  60. submenu_add_item(
  61. submenu,
  62. "Update From Initial Card",
  63. SubmenuIndexUpdate,
  64. nfc_scene_saved_menu_submenu_callback,
  65. nfc);
  66. }
  67. submenu_add_item(
  68. submenu, "Info", SubmenuIndexInfo, nfc_scene_saved_menu_submenu_callback, nfc);
  69. if(nfc->dev->format == NfcDeviceSaveFormatMifareUl &&
  70. !mf_ul_is_full_capture(&nfc->dev->dev_data.mf_ul_data)) {
  71. submenu_add_item(
  72. submenu,
  73. "Unlock With Reader",
  74. SubmenuIndexMfUlUnlockByReader,
  75. nfc_scene_saved_menu_submenu_callback,
  76. nfc);
  77. submenu_add_item(
  78. submenu,
  79. "Unlock With Password",
  80. SubmenuIndexMfUlUnlockByPassword,
  81. nfc_scene_saved_menu_submenu_callback,
  82. nfc);
  83. }
  84. if(nfc->dev->shadow_file_exist) {
  85. submenu_add_item(
  86. submenu,
  87. "Restore to original",
  88. SubmenuIndexRestoreOriginal,
  89. nfc_scene_saved_menu_submenu_callback,
  90. nfc);
  91. }
  92. submenu_add_item(
  93. submenu, "Rename", SubmenuIndexRename, nfc_scene_saved_menu_submenu_callback, nfc);
  94. submenu_add_item(
  95. submenu, "Delete", SubmenuIndexDelete, nfc_scene_saved_menu_submenu_callback, nfc);
  96. submenu_set_selected_item(
  97. nfc->submenu, scene_manager_get_scene_state(nfc->scene_manager, NfcSceneSavedMenu));
  98. view_dispatcher_switch_to_view(nfc->view_dispatcher, NfcViewMenu);
  99. }
  100. bool nfc_scene_saved_menu_on_event(void* context, SceneManagerEvent event) {
  101. Nfc* nfc = context;
  102. NfcDeviceData* dev_data = &nfc->dev->dev_data;
  103. bool consumed = false;
  104. if(event.type == SceneManagerEventTypeCustom) {
  105. scene_manager_set_scene_state(nfc->scene_manager, NfcSceneSavedMenu, event.event);
  106. if(event.event == SubmenuIndexEmulate) {
  107. if(nfc->dev->format == NfcDeviceSaveFormatMifareUl) {
  108. scene_manager_next_scene(nfc->scene_manager, NfcSceneMfUltralightEmulate);
  109. } else if(nfc->dev->format == NfcDeviceSaveFormatMifareClassic) {
  110. scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicEmulate);
  111. } else {
  112. scene_manager_next_scene(nfc->scene_manager, NfcSceneEmulateUid);
  113. }
  114. DOLPHIN_DEED(DolphinDeedNfcEmulate);
  115. consumed = true;
  116. } else if(event.event == SubmenuIndexDetectReader) {
  117. scene_manager_next_scene(nfc->scene_manager, NfcSceneDetectReader);
  118. DOLPHIN_DEED(DolphinDeedNfcDetectReader);
  119. consumed = true;
  120. } else if(event.event == SubmenuIndexWrite) {
  121. scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicWrite);
  122. consumed = true;
  123. } else if(event.event == SubmenuIndexUpdate) {
  124. scene_manager_next_scene(nfc->scene_manager, NfcSceneMfClassicUpdate);
  125. consumed = true;
  126. } else if(event.event == SubmenuIndexRename) {
  127. scene_manager_next_scene(nfc->scene_manager, NfcSceneSaveName);
  128. consumed = true;
  129. } else if(event.event == SubmenuIndexEditUid) {
  130. scene_manager_next_scene(nfc->scene_manager, NfcSceneSetUid);
  131. consumed = true;
  132. } else if(event.event == SubmenuIndexDelete) {
  133. scene_manager_next_scene(nfc->scene_manager, NfcSceneDelete);
  134. consumed = true;
  135. } else if(event.event == SubmenuIndexInfo) {
  136. bool application_info_present = false;
  137. if(dev_data->protocol == NfcDeviceProtocolEMV) {
  138. application_info_present = true;
  139. } else if(
  140. dev_data->protocol == NfcDeviceProtocolMifareClassic ||
  141. dev_data->protocol == NfcDeviceProtocolMifareUl) {
  142. application_info_present = nfc_supported_card_verify_and_parse(dev_data);
  143. }
  144. if(application_info_present) {
  145. scene_manager_next_scene(nfc->scene_manager, NfcSceneDeviceInfo);
  146. } else {
  147. scene_manager_next_scene(nfc->scene_manager, NfcSceneNfcDataInfo);
  148. }
  149. consumed = true;
  150. } else if(event.event == SubmenuIndexRestoreOriginal) {
  151. scene_manager_next_scene(nfc->scene_manager, NfcSceneRestoreOriginalConfirm);
  152. consumed = true;
  153. } else if(event.event == SubmenuIndexMfUlUnlockByReader) {
  154. scene_manager_next_scene(nfc->scene_manager, NfcSceneMfUltralightUnlockAuto);
  155. consumed = true;
  156. } else if(event.event == SubmenuIndexMfUlUnlockByPassword) {
  157. scene_manager_next_scene(nfc->scene_manager, NfcSceneMfUltralightUnlockMenu);
  158. consumed = true;
  159. }
  160. }
  161. return consumed;
  162. }
  163. void nfc_scene_saved_menu_on_exit(void* context) {
  164. Nfc* nfc = context;
  165. submenu_reset(nfc->submenu);
  166. }