totp_scene_token_menu.c 6.9 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. switch(scene_state->selected_control) {
  114. case AddNewToken: {
  115. #ifdef TOTP_UI_ADD_NEW_TOKEN_ENABLED
  116. totp_scene_director_activate_scene(plugin_state, TotpSceneAddNewToken);
  117. #else
  118. DialogMessage* message = dialog_message_alloc();
  119. dialog_message_set_buttons(message, "Back", NULL, NULL);
  120. dialog_message_set_header(message, "Information", 0, 0, AlignLeft, AlignTop);
  121. dialog_message_set_text(
  122. message,
  123. "Read here\nhttps://t.ly/8ZOtj\nhow to add new token",
  124. SCREEN_WIDTH_CENTER,
  125. SCREEN_HEIGHT_CENTER,
  126. AlignCenter,
  127. AlignCenter);
  128. dialog_message_show(plugin_state->dialogs_app, message);
  129. dialog_message_free(message);
  130. #endif
  131. break;
  132. }
  133. case DeleteToken: {
  134. DialogMessage* message = dialog_message_alloc();
  135. dialog_message_set_buttons(message, "No", NULL, "Yes");
  136. dialog_message_set_header(message, "Confirmation", 0, 0, AlignLeft, AlignTop);
  137. dialog_message_set_text(
  138. message,
  139. "Are you sure want to delete?",
  140. SCREEN_WIDTH_CENTER,
  141. SCREEN_HEIGHT_CENTER,
  142. AlignCenter,
  143. AlignCenter);
  144. DialogMessageButton dialog_result =
  145. dialog_message_show(plugin_state->dialogs_app, message);
  146. dialog_message_free(message);
  147. TokenInfoIteratorContext* iterator_context =
  148. totp_config_get_token_iterator_context(plugin_state);
  149. if(dialog_result == DialogMessageButtonRight &&
  150. totp_token_info_iterator_get_total_count(iterator_context) > 0) {
  151. if(!totp_token_info_iterator_remove_current_token_info(iterator_context)) {
  152. totp_dialogs_config_updating_error(plugin_state);
  153. return false;
  154. }
  155. totp_scene_director_activate_scene(plugin_state, TotpSceneGenerateToken);
  156. }
  157. break;
  158. }
  159. case AppSettings: {
  160. totp_scene_director_activate_scene(plugin_state, TotpSceneAppSettings);
  161. break;
  162. }
  163. default:
  164. break;
  165. }
  166. break;
  167. }
  168. case InputKeyBack: {
  169. totp_scene_director_activate_scene(plugin_state, TotpSceneGenerateToken);
  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. }