u2f_view.c 3.2 KB

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