u2f_view.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include "u2f_view.h"
  2. #include <gui/elements.h>
  3. struct U2fView {
  4. View* view;
  5. U2fOkCallback callback;
  6. void* context;
  7. };
  8. typedef struct {
  9. U2fViewMsg display_msg;
  10. } U2fModel;
  11. static void u2f_view_draw_callback(Canvas* canvas, void* _model) {
  12. U2fModel* model = _model;
  13. canvas_draw_icon(canvas, 8, 14, &I_Drive_112x35);
  14. canvas_set_font(canvas, FontSecondary);
  15. if(model->display_msg == U2fMsgNotConnected) {
  16. canvas_draw_icon(canvas, 22, 15, &I_Connect_me_62x31);
  17. canvas_draw_str_aligned(
  18. canvas, 128 / 2, 3, AlignCenter, AlignTop, "Connect me to computer");
  19. } else if(model->display_msg == U2fMsgIdle) {
  20. canvas_draw_icon(canvas, 22, 15, &I_Connected_62x31);
  21. canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Connected!");
  22. } else if(model->display_msg == U2fMsgRegister) {
  23. elements_button_center(canvas, "OK");
  24. canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31);
  25. canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press OK to register");
  26. } else if(model->display_msg == U2fMsgAuth) {
  27. elements_button_center(canvas, "OK");
  28. canvas_draw_icon(canvas, 22, 15, &I_Auth_62x31);
  29. canvas_draw_str_aligned(
  30. canvas, 128 / 2, 3, AlignCenter, AlignTop, "Press OK to authenticate");
  31. } else if(model->display_msg == U2fMsgSuccess) {
  32. canvas_draw_icon(canvas, 22, 15, &I_Connected_62x31);
  33. canvas_draw_str_aligned(
  34. canvas, 128 / 2, 3, AlignCenter, AlignTop, "Authentication successfull!");
  35. } else if(model->display_msg == U2fMsgError) {
  36. canvas_draw_icon(canvas, 22, 15, &I_Error_62x31);
  37. canvas_draw_str_aligned(canvas, 128 / 2, 3, AlignCenter, AlignTop, "Ceritficate error");
  38. }
  39. }
  40. static bool u2f_view_input_callback(InputEvent* event, void* context) {
  41. furi_assert(context);
  42. U2fView* u2f = context;
  43. bool consumed = false;
  44. if(event->type == InputTypeShort) {
  45. if(event->key == InputKeyOk) {
  46. consumed = true;
  47. if(u2f->callback != NULL) u2f->callback(InputTypeShort, u2f->context);
  48. }
  49. }
  50. return consumed;
  51. }
  52. U2fView* u2f_view_alloc() {
  53. U2fView* u2f = malloc(sizeof(U2fView));
  54. u2f->view = view_alloc();
  55. view_allocate_model(u2f->view, ViewModelTypeLocking, sizeof(U2fModel));
  56. view_set_context(u2f->view, u2f);
  57. view_set_draw_callback(u2f->view, u2f_view_draw_callback);
  58. view_set_input_callback(u2f->view, u2f_view_input_callback);
  59. return u2f;
  60. }
  61. void u2f_view_free(U2fView* u2f) {
  62. furi_assert(u2f);
  63. view_free(u2f->view);
  64. free(u2f);
  65. }
  66. View* u2f_view_get_view(U2fView* u2f) {
  67. furi_assert(u2f);
  68. return u2f->view;
  69. }
  70. void u2f_view_set_ok_callback(U2fView* u2f, U2fOkCallback callback, void* context) {
  71. furi_assert(u2f);
  72. furi_assert(callback);
  73. with_view_model(
  74. u2f->view, (U2fModel * model) {
  75. UNUSED(model);
  76. u2f->callback = callback;
  77. u2f->context = context;
  78. return false;
  79. });
  80. }
  81. void u2f_view_set_state(U2fView* u2f, U2fViewMsg msg) {
  82. with_view_model(
  83. u2f->view, (U2fModel * model) {
  84. model->display_msg = msg;
  85. return true;
  86. });
  87. }