totp_scene_token_menu.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "totp_scene_token_menu.h"
  2. #include <gui/gui.h>
  3. #include <dialogs/dialogs.h>
  4. #include "../../ui_controls.h"
  5. #include "../../common_dialogs.h"
  6. #include "../../constants.h"
  7. #include "../../scene_director.h"
  8. #include "../../../services/config/config.h"
  9. #include "../../../types/token_info.h"
  10. #include "../../../config/app/config.h"
  11. #include <roll_value.h>
  12. #define SCREEN_HEIGHT_THIRD (SCREEN_HEIGHT / 3)
  13. #define SCREEN_HEIGHT_THIRD_CENTER (SCREEN_HEIGHT_THIRD >> 1)
  14. typedef enum { AddNewToken, DeleteToken, AppSettings } Control;
  15. typedef struct {
  16. Control selected_control;
  17. } SceneState;
  18. void totp_scene_token_menu_activate(PluginState* plugin_state) {
  19. SceneState* scene_state = malloc(sizeof(SceneState));
  20. furi_check(scene_state != NULL);
  21. plugin_state->current_scene_state = scene_state;
  22. }
  23. void totp_scene_token_menu_render(Canvas* const canvas, PluginState* plugin_state) {
  24. const SceneState* scene_state = (SceneState*)plugin_state->current_scene_state;
  25. const TokenInfoIteratorContext* iterator_context =
  26. totp_config_get_token_iterator_context(plugin_state);
  27. if(totp_token_info_iterator_get_total_count(iterator_context) == 0) {
  28. ui_control_button_render(
  29. canvas,
  30. SCREEN_WIDTH_CENTER - 36,
  31. 5,
  32. 72,
  33. 21,
  34. "Add new token",
  35. scene_state->selected_control == AddNewToken);
  36. ui_control_button_render(
  37. canvas,
  38. SCREEN_WIDTH_CENTER - 36,
  39. 39,
  40. 72,
  41. 21,
  42. "Settings",
  43. scene_state->selected_control == AppSettings);
  44. } else {
  45. ui_control_button_render(
  46. canvas,
  47. SCREEN_WIDTH_CENTER - 36,
  48. SCREEN_HEIGHT_THIRD_CENTER - 8,
  49. 72,
  50. 16,
  51. "Add new token",
  52. scene_state->selected_control == AddNewToken);
  53. ui_control_button_render(
  54. canvas,
  55. SCREEN_WIDTH_CENTER - 36,
  56. SCREEN_HEIGHT_THIRD + SCREEN_HEIGHT_THIRD_CENTER - 8,
  57. 72,
  58. 16,
  59. "Delete token",
  60. scene_state->selected_control == DeleteToken);
  61. ui_control_button_render(
  62. canvas,
  63. SCREEN_WIDTH_CENTER - 36,
  64. SCREEN_HEIGHT_THIRD + SCREEN_HEIGHT_THIRD + SCREEN_HEIGHT_THIRD_CENTER - 8,
  65. 72,
  66. 16,
  67. "Settings",
  68. scene_state->selected_control == AppSettings);
  69. }
  70. }
  71. bool totp_scene_token_menu_handle_event(const PluginEvent* const event, PluginState* plugin_state) {
  72. if(event->type != EventTypeKey) {
  73. return true;
  74. }
  75. SceneState* scene_state = (SceneState*)plugin_state->current_scene_state;
  76. if(event->input.type == InputTypePress) {
  77. switch(event->input.key) {
  78. case InputKeyUp: {
  79. const TokenInfoIteratorContext* iterator_context =
  80. totp_config_get_token_iterator_context(plugin_state);
  81. totp_roll_value_uint8_t(
  82. &scene_state->selected_control,
  83. -1,
  84. AddNewToken,
  85. AppSettings,
  86. RollOverflowBehaviorRoll);
  87. if(scene_state->selected_control == DeleteToken &&
  88. totp_token_info_iterator_get_total_count(iterator_context) == 0) {
  89. scene_state->selected_control--;
  90. }
  91. break;
  92. }
  93. case InputKeyDown: {
  94. const TokenInfoIteratorContext* iterator_context =
  95. totp_config_get_token_iterator_context(plugin_state);
  96. totp_roll_value_uint8_t(
  97. &scene_state->selected_control,
  98. 1,
  99. AddNewToken,
  100. AppSettings,
  101. RollOverflowBehaviorRoll);
  102. if(scene_state->selected_control == DeleteToken &&
  103. totp_token_info_iterator_get_total_count(iterator_context) == 0) {
  104. scene_state->selected_control++;
  105. }
  106. break;
  107. }
  108. case InputKeyRight:
  109. break;
  110. case InputKeyLeft:
  111. break;
  112. case InputKeyOk:
  113. break;
  114. case InputKeyBack: {
  115. totp_scene_director_activate_scene(plugin_state, TotpSceneGenerateToken);
  116. break;
  117. }
  118. default:
  119. break;
  120. }
  121. } else if(event->input.type == InputTypeRelease && event->input.key == InputKeyOk) {
  122. switch(scene_state->selected_control) {
  123. case AddNewToken: {
  124. #ifdef TOTP_UI_ADD_NEW_TOKEN_ENABLED
  125. totp_scene_director_activate_scene(plugin_state, TotpSceneAddNewToken);
  126. #else
  127. DialogMessage* message = dialog_message_alloc();
  128. dialog_message_set_buttons(message, "Back", NULL, NULL);
  129. dialog_message_set_header(message, "Information", 0, 0, AlignLeft, AlignTop);
  130. dialog_message_set_text(
  131. message,
  132. "Read here\nhttps://t.ly/8ZOtj\n how to add new token",
  133. SCREEN_WIDTH_CENTER,
  134. SCREEN_HEIGHT_CENTER,
  135. AlignCenter,
  136. AlignCenter);
  137. dialog_message_show(plugin_state->dialogs_app, message);
  138. dialog_message_free(message);
  139. #endif
  140. break;
  141. }
  142. case DeleteToken: {
  143. DialogMessage* message = dialog_message_alloc();
  144. dialog_message_set_buttons(message, "No", NULL, "Yes");
  145. dialog_message_set_header(message, "Confirmation", 0, 0, AlignLeft, AlignTop);
  146. dialog_message_set_text(
  147. message,
  148. "Are you sure want to delete?",
  149. SCREEN_WIDTH_CENTER,
  150. SCREEN_HEIGHT_CENTER,
  151. AlignCenter,
  152. AlignCenter);
  153. DialogMessageButton dialog_result =
  154. dialog_message_show(plugin_state->dialogs_app, message);
  155. dialog_message_free(message);
  156. TokenInfoIteratorContext* iterator_context =
  157. totp_config_get_token_iterator_context(plugin_state);
  158. if(dialog_result == DialogMessageButtonRight &&
  159. totp_token_info_iterator_get_total_count(iterator_context) > 0) {
  160. if(!totp_token_info_iterator_remove_current_token_info(iterator_context)) {
  161. totp_dialogs_config_updating_error(plugin_state);
  162. return false;
  163. }
  164. totp_scene_director_activate_scene(plugin_state, TotpSceneGenerateToken);
  165. }
  166. break;
  167. }
  168. case AppSettings: {
  169. totp_scene_director_activate_scene(plugin_state, TotpSceneAppSettings);
  170. break;
  171. }
  172. default:
  173. break;
  174. }
  175. }
  176. return true;
  177. }
  178. void totp_scene_token_menu_deactivate(PluginState* plugin_state) {
  179. if(plugin_state->current_scene_state == NULL) return;
  180. free(plugin_state->current_scene_state);
  181. plugin_state->current_scene_state = NULL;
  182. }