pomodoro.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #include "pomodoro.h"
  2. #include <notification/notification_messages.h>
  3. #define TAG "PomodoroApp"
  4. enum PomodoroDebugSubmenuIndex {
  5. PomodoroSubmenuIndex10,
  6. PomodoroSubmenuIndex25,
  7. PomodoroSubmenuIndex50,
  8. };
  9. static void pomodoro_view_dispatcher_update_callback(void* context) {
  10. furi_assert(context);
  11. Pomodoro* app = (Pomodoro*)context;
  12. switch(app->view_id) {
  13. case PomodoroView10:
  14. pomodoro_timer_update(app->pomodoro_10);
  15. break;
  16. case PomodoroView25:
  17. pomodoro_timer_update(app->pomodoro_25);
  18. break;
  19. case PomodoroView50:
  20. pomodoro_timer_update(app->pomodoro_50);
  21. break;
  22. default:
  23. break;
  24. }
  25. pomodoro_timer_update(app->pomodoro_25);
  26. }
  27. void pomodoro_submenu_callback(void* context, uint32_t index) {
  28. furi_assert(context);
  29. Pomodoro* app = context;
  30. if(index == PomodoroSubmenuIndex10) {
  31. app->view_id = PomodoroView10;
  32. view_dispatcher_switch_to_view(app->view_dispatcher, PomodoroView10);
  33. }
  34. if(index == PomodoroSubmenuIndex25) {
  35. app->view_id = PomodoroView25;
  36. view_dispatcher_switch_to_view(app->view_dispatcher, PomodoroView25);
  37. }
  38. if(index == PomodoroSubmenuIndex50) {
  39. app->view_id = PomodoroView50;
  40. view_dispatcher_switch_to_view(app->view_dispatcher, PomodoroView50);
  41. }
  42. }
  43. void pomodoro_dialog_callback(DialogExResult result, void* context) {
  44. furi_assert(context);
  45. Pomodoro* app = context;
  46. if(result == DialogExResultLeft) {
  47. view_dispatcher_stop(app->view_dispatcher);
  48. } else if(result == DialogExResultRight) {
  49. view_dispatcher_switch_to_view(app->view_dispatcher, app->view_id); // Show last view
  50. } else if(result == DialogExResultCenter) {
  51. view_dispatcher_switch_to_view(app->view_dispatcher, PomodoroViewSubmenu);
  52. }
  53. }
  54. uint32_t pomodoro_exit_confirm_view(void* context) {
  55. UNUSED(context);
  56. return PomodoroViewExitConfirm;
  57. }
  58. uint32_t pomodoro_exit(void* context) {
  59. UNUSED(context);
  60. return VIEW_NONE;
  61. }
  62. Pomodoro* pomodoro_app_alloc() {
  63. Pomodoro* app = malloc(sizeof(Pomodoro));
  64. // Gui
  65. app->gui = furi_record_open(RECORD_GUI);
  66. // Notifications
  67. app->notifications = furi_record_open(RECORD_NOTIFICATION);
  68. // View dispatcher
  69. app->view_dispatcher = view_dispatcher_alloc();
  70. view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
  71. view_dispatcher_set_tick_event_callback(
  72. app->view_dispatcher, pomodoro_view_dispatcher_update_callback, 1000);
  73. view_dispatcher_enable_queue(app->view_dispatcher);
  74. view_dispatcher_attach_to_gui(app->view_dispatcher, app->gui, ViewDispatcherTypeFullscreen);
  75. // Submenu view
  76. app->submenu = submenu_alloc();
  77. submenu_add_item(
  78. app->submenu,
  79. "Classic: 25 work 5 rest",
  80. PomodoroSubmenuIndex25,
  81. pomodoro_submenu_callback,
  82. app);
  83. submenu_add_item(
  84. app->submenu,
  85. "Long: 50 work 10 rest",
  86. PomodoroSubmenuIndex50,
  87. pomodoro_submenu_callback,
  88. app);
  89. submenu_add_item(
  90. app->submenu,
  91. "Sprint: 10 work 2 rest",
  92. PomodoroSubmenuIndex10,
  93. pomodoro_submenu_callback,
  94. app);
  95. view_set_previous_callback(submenu_get_view(app->submenu), pomodoro_exit);
  96. view_dispatcher_add_view(
  97. app->view_dispatcher, PomodoroViewSubmenu, submenu_get_view(app->submenu));
  98. // Dialog view
  99. app->dialog = dialog_ex_alloc();
  100. dialog_ex_set_result_callback(app->dialog, pomodoro_dialog_callback);
  101. dialog_ex_set_context(app->dialog, app);
  102. dialog_ex_set_left_button_text(app->dialog, "Exit");
  103. dialog_ex_set_right_button_text(app->dialog, "Stay");
  104. dialog_ex_set_center_button_text(app->dialog, "Menu");
  105. dialog_ex_set_header(app->dialog, "Close Current App?", 16, 12, AlignLeft, AlignTop);
  106. view_dispatcher_add_view(
  107. app->view_dispatcher, PomodoroViewExitConfirm, dialog_ex_get_view(app->dialog));
  108. // 25 minutes view
  109. app->pomodoro_25 = pomodoro_25_alloc();
  110. view_set_previous_callback(pomodoro_25_get_view(app->pomodoro_25), pomodoro_exit_confirm_view);
  111. view_dispatcher_add_view(
  112. app->view_dispatcher, PomodoroView25, pomodoro_25_get_view(app->pomodoro_25));
  113. // 50 minutes view
  114. app->pomodoro_50 = pomodoro_50_alloc();
  115. view_set_previous_callback(pomodoro_50_get_view(app->pomodoro_50), pomodoro_exit_confirm_view);
  116. view_dispatcher_add_view(
  117. app->view_dispatcher, PomodoroView50, pomodoro_50_get_view(app->pomodoro_50));
  118. // 10 minutes view
  119. app->pomodoro_10 = pomodoro_10_alloc();
  120. view_set_previous_callback(pomodoro_10_get_view(app->pomodoro_10), pomodoro_exit_confirm_view);
  121. view_dispatcher_add_view(
  122. app->view_dispatcher, PomodoroView10, pomodoro_10_get_view(app->pomodoro_10));
  123. // TODO switch to menu after Media is done
  124. app->view_id = PomodoroViewSubmenu;
  125. view_dispatcher_switch_to_view(app->view_dispatcher, app->view_id);
  126. return app;
  127. }
  128. void pomodoro_app_free(Pomodoro* app) {
  129. furi_assert(app);
  130. // Reset notification
  131. notification_internal_message(app->notifications, &sequence_reset_blue);
  132. // Free views
  133. view_dispatcher_remove_view(app->view_dispatcher, PomodoroViewSubmenu);
  134. submenu_free(app->submenu);
  135. view_dispatcher_remove_view(app->view_dispatcher, PomodoroViewExitConfirm);
  136. dialog_ex_free(app->dialog);
  137. view_dispatcher_remove_view(app->view_dispatcher, PomodoroView25);
  138. pomodoro_25_free(app->pomodoro_25);
  139. view_dispatcher_remove_view(app->view_dispatcher, PomodoroView50);
  140. pomodoro_50_free(app->pomodoro_50);
  141. view_dispatcher_remove_view(app->view_dispatcher, PomodoroView10);
  142. pomodoro_10_free(app->pomodoro_10);
  143. view_dispatcher_free(app->view_dispatcher);
  144. // Close records
  145. furi_record_close(RECORD_GUI);
  146. app->gui = NULL;
  147. furi_record_close(RECORD_NOTIFICATION);
  148. app->notifications = NULL;
  149. // Free rest
  150. free(app);
  151. }
  152. int32_t pomodoro_app(void* p) {
  153. UNUSED(p);
  154. // Switch profile to Hid
  155. Pomodoro* app = pomodoro_app_alloc();
  156. view_dispatcher_run(app->view_dispatcher);
  157. pomodoro_app_free(app);
  158. return 0;
  159. }