totp_scene_token_menu.c 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. #include "totp_scene_token_menu.h"
  2. #include <gui/gui.h>
  3. #include <dialogs/dialogs.h>
  4. #include "../../services/ui/ui_controls.h"
  5. #include "../../services/ui/constants.h"
  6. #include "../scene_director.h"
  7. #include "../../services/config/config.h"
  8. #include "../../services/list/list.h"
  9. #include "../../types/token_info.h"
  10. #include "../generate_token/totp_scene_generate_token.h"
  11. #include "../add_new_token/totp_scene_add_new_token.h"
  12. #include "../app_settings/totp_app_settings.h"
  13. #define SCREEN_HEIGHT_THIRD (SCREEN_HEIGHT / 3)
  14. #define SCREEN_HEIGHT_THIRD_CENTER (SCREEN_HEIGHT_THIRD >> 1)
  15. typedef enum { AddNewToken, DeleteToken, AppSettings } Control;
  16. typedef struct {
  17. Control selected_control;
  18. int16_t current_token_index;
  19. } SceneState;
  20. void totp_scene_token_menu_init(const PluginState* plugin_state) {
  21. UNUSED(plugin_state);
  22. }
  23. void totp_scene_token_menu_activate(
  24. PluginState* plugin_state,
  25. const TokenMenuSceneContext* context) {
  26. SceneState* scene_state = malloc(sizeof(SceneState));
  27. plugin_state->current_scene_state = scene_state;
  28. if(context != NULL) {
  29. scene_state->current_token_index = context->current_token_index;
  30. } else {
  31. scene_state->current_token_index = -1;
  32. }
  33. }
  34. void totp_scene_token_menu_render(Canvas* const canvas, PluginState* plugin_state) {
  35. const SceneState* scene_state = (SceneState*)plugin_state->current_scene_state;
  36. if(scene_state->current_token_index < 0) {
  37. ui_control_button_render(
  38. canvas,
  39. SCREEN_WIDTH_CENTER - 36,
  40. 5,
  41. 72,
  42. 21,
  43. "Add new token",
  44. scene_state->selected_control == AddNewToken);
  45. ui_control_button_render(
  46. canvas,
  47. SCREEN_WIDTH_CENTER - 36,
  48. 39,
  49. 72,
  50. 21,
  51. "Settings",
  52. scene_state->selected_control == AppSettings);
  53. } else {
  54. ui_control_button_render(
  55. canvas,
  56. SCREEN_WIDTH_CENTER - 36,
  57. SCREEN_HEIGHT_THIRD_CENTER - 8,
  58. 72,
  59. 16,
  60. "Add new token",
  61. scene_state->selected_control == AddNewToken);
  62. ui_control_button_render(
  63. canvas,
  64. SCREEN_WIDTH_CENTER - 36,
  65. SCREEN_HEIGHT_THIRD + SCREEN_HEIGHT_THIRD_CENTER - 8,
  66. 72,
  67. 16,
  68. "Delete token",
  69. scene_state->selected_control == DeleteToken);
  70. ui_control_button_render(
  71. canvas,
  72. SCREEN_WIDTH_CENTER - 36,
  73. SCREEN_HEIGHT_THIRD + SCREEN_HEIGHT_THIRD + SCREEN_HEIGHT_THIRD_CENTER - 8,
  74. 72,
  75. 16,
  76. "Settings",
  77. scene_state->selected_control == AppSettings);
  78. }
  79. }
  80. bool totp_scene_token_menu_handle_event(const PluginEvent* const event, PluginState* plugin_state) {
  81. if(event->type == EventTypeKey) {
  82. SceneState* scene_state = (SceneState*)plugin_state->current_scene_state;
  83. if(event->input.type == InputTypePress) {
  84. switch(event->input.key) {
  85. case InputKeyUp:
  86. if(scene_state->selected_control > AddNewToken) {
  87. scene_state->selected_control--;
  88. if(scene_state->selected_control == DeleteToken &&
  89. scene_state->current_token_index < 0) {
  90. scene_state->selected_control--;
  91. }
  92. } else {
  93. scene_state->selected_control = AppSettings;
  94. }
  95. break;
  96. case InputKeyDown:
  97. if(scene_state->selected_control < AppSettings) {
  98. scene_state->selected_control++;
  99. if(scene_state->selected_control == DeleteToken &&
  100. scene_state->current_token_index < 0) {
  101. scene_state->selected_control++;
  102. }
  103. } else {
  104. scene_state->selected_control = AddNewToken;
  105. }
  106. break;
  107. case InputKeyRight:
  108. break;
  109. case InputKeyLeft:
  110. break;
  111. case InputKeyOk:
  112. switch(scene_state->selected_control) {
  113. case AddNewToken: {
  114. TokenAddEditSceneContext add_new_token_scene_context = {
  115. .current_token_index = scene_state->current_token_index};
  116. totp_scene_director_activate_scene(
  117. plugin_state, TotpSceneAddNewToken, &add_new_token_scene_context);
  118. break;
  119. }
  120. case DeleteToken: {
  121. DialogMessage* message = dialog_message_alloc();
  122. dialog_message_set_buttons(message, "No", NULL, "Yes");
  123. dialog_message_set_header(message, "Confirmation", 0, 0, AlignLeft, AlignTop);
  124. dialog_message_set_text(
  125. message,
  126. "Are you sure want to delete?",
  127. SCREEN_WIDTH_CENTER,
  128. SCREEN_HEIGHT_CENTER,
  129. AlignCenter,
  130. AlignCenter);
  131. DialogMessageButton dialog_result =
  132. dialog_message_show(plugin_state->dialogs, message);
  133. dialog_message_free(message);
  134. if(dialog_result == DialogMessageButtonRight) {
  135. ListNode* list_node = list_element_at(
  136. plugin_state->tokens_list, scene_state->current_token_index);
  137. TokenInfo* tokenInfo = list_node->data;
  138. token_info_free(tokenInfo);
  139. plugin_state->tokens_list =
  140. list_remove(plugin_state->tokens_list, list_node);
  141. plugin_state->tokens_count--;
  142. totp_full_save_config_file(plugin_state);
  143. totp_scene_director_activate_scene(
  144. plugin_state, TotpSceneGenerateToken, NULL);
  145. }
  146. break;
  147. }
  148. case AppSettings: {
  149. if(scene_state->current_token_index >= 0) {
  150. AppSettingsSceneContext app_settings_context = {
  151. .current_token_index = scene_state->current_token_index};
  152. totp_scene_director_activate_scene(
  153. plugin_state, TotpSceneAppSettings, &app_settings_context);
  154. } else {
  155. totp_scene_director_activate_scene(
  156. plugin_state, TotpSceneAppSettings, NULL);
  157. }
  158. break;
  159. }
  160. }
  161. break;
  162. case InputKeyBack: {
  163. if(scene_state->current_token_index >= 0) {
  164. GenerateTokenSceneContext generate_scene_context = {
  165. .current_token_index = scene_state->current_token_index};
  166. totp_scene_director_activate_scene(
  167. plugin_state, TotpSceneGenerateToken, &generate_scene_context);
  168. } else {
  169. totp_scene_director_activate_scene(plugin_state, TotpSceneGenerateToken, NULL);
  170. }
  171. break;
  172. }
  173. }
  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. }
  183. void totp_scene_token_menu_free(const PluginState* plugin_state) {
  184. UNUSED(plugin_state);
  185. }