diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index e2b69b8b02..173af53bed 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -377,6 +377,7 @@ list(APPEND SOURCE_FILES
displayapp/screens/FirmwareUpdate.cpp
displayapp/screens/Music.cpp
displayapp/screens/Navigation.cpp
+ displayapp/screens/Calendar.cpp
displayapp/screens/Metronome.cpp
displayapp/screens/Motion.cpp
displayapp/screens/Weather.cpp
diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp
index b1594f197c..11222af208 100644
--- a/src/displayapp/DisplayApp.cpp
+++ b/src/displayapp/DisplayApp.cpp
@@ -19,6 +19,7 @@
#include "displayapp/screens/Metronome.h"
#include "displayapp/screens/Music.h"
#include "displayapp/screens/Navigation.h"
+#include "displayapp/screens/Calendar.h"
#include "displayapp/screens/Notifications.h"
#include "displayapp/screens/SystemInfo.h"
#include "displayapp/screens/Tile.h"
diff --git a/src/displayapp/InfiniTimeTheme.h b/src/displayapp/InfiniTimeTheme.h
index 0690b09912..57680e8738 100644
--- a/src/displayapp/InfiniTimeTheme.h
+++ b/src/displayapp/InfiniTimeTheme.h
@@ -8,6 +8,7 @@ namespace Colors {
static constexpr lv_color_t green = LV_COLOR_MAKE(0x0, 0xb0, 0x0);
static constexpr lv_color_t blue = LV_COLOR_MAKE(0x0, 0x50, 0xff);
static constexpr lv_color_t lightGray = LV_COLOR_MAKE(0xb0, 0xb0, 0xb0);
+ static constexpr lv_color_t gray = LV_COLOR_MAKE(0x50, 0x50, 0x50);
static constexpr lv_color_t bg = LV_COLOR_MAKE(0x5d, 0x69, 0x7e);
static constexpr lv_color_t bgAlt = LV_COLOR_MAKE(0x38, 0x38, 0x38);
diff --git a/src/displayapp/apps/Apps.h.in b/src/displayapp/apps/Apps.h.in
index 2104a267c0..9fa4843a72 100644
--- a/src/displayapp/apps/Apps.h.in
+++ b/src/displayapp/apps/Apps.h.in
@@ -23,6 +23,7 @@ namespace Pinetime {
Twos,
HeartRate,
Navigation,
+ Calendar,
StopWatch,
Metronome,
Motion,
diff --git a/src/displayapp/apps/CMakeLists.txt b/src/displayapp/apps/CMakeLists.txt
index d78587609e..99b0a9365f 100644
--- a/src/displayapp/apps/CMakeLists.txt
+++ b/src/displayapp/apps/CMakeLists.txt
@@ -14,6 +14,7 @@ else ()
set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Metronome")
set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Navigation")
set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Weather")
+ set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Calendar")
#set(DEFAULT_USER_APP_TYPES "${DEFAULT_USER_APP_TYPES}, Apps::Motion")
set(USERAPP_TYPES "${DEFAULT_USER_APP_TYPES}" CACHE STRING "List of user apps to build into the firmware")
endif ()
diff --git a/src/displayapp/fonts/fonts.json b/src/displayapp/fonts/fonts.json
index 41c383c0d4..b88af94fe1 100644
--- a/src/displayapp/fonts/fonts.json
+++ b/src/displayapp/fonts/fonts.json
@@ -7,7 +7,7 @@
},
{
"file": "FontAwesome5-Solid+Brands+Regular.woff",
- "range": "0xf294, 0xf242, 0xf54b, 0xf21e, 0xf1e6, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf06e, 0xf015, 0xf00c, 0xf0f3, 0xf522, 0xf743"
+ "range": "0xf294, 0xf242, 0xf54b, 0xf21e, 0xf1e6, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf06e, 0xf015, 0xf00c, 0xf0f3, 0xf522, 0xf743, 0xf073"
}
],
"bpp": 1,
diff --git a/src/displayapp/screens/Calendar.cpp b/src/displayapp/screens/Calendar.cpp
new file mode 100644
index 0000000000..43643f6c97
--- /dev/null
+++ b/src/displayapp/screens/Calendar.cpp
@@ -0,0 +1,96 @@
+/* Copyright (C) 2024 thnikk, Boteium, JustScott
+
+ This file is part of InfiniTime.
+
+ InfiniTime is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ InfiniTime is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#include "displayapp/screens/Calendar.h"
+#include "components/datetime/DateTimeController.h"
+#include "displayapp/InfiniTimeTheme.h"
+
+using namespace Pinetime::Applications::Screens;
+
+Calendar::Calendar(Controllers::DateTime& dateTimeController) : dateTimeController {dateTimeController} {
+
+ // Create calendar object
+ calendar = lv_calendar_create(lv_scr_act(), NULL);
+ // Set size
+ lv_obj_set_size(calendar, LV_HOR_RES, LV_VER_RES);
+ // Set alignment
+ lv_obj_align(calendar, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, -5);
+ // Disable clicks
+ lv_obj_set_click(calendar, false);
+
+ // Set style of today's date
+ lv_obj_set_style_local_text_color(calendar, LV_CALENDAR_PART_DATE, LV_STATE_FOCUSED, Colors::deepOrange);
+
+ // Set style of inactive month's days
+ lv_obj_set_style_local_text_color(calendar, LV_CALENDAR_PART_DATE, LV_STATE_DISABLED, Colors::gray);
+
+ // Get today's date
+ current.year = static_cast(dateTimeController.Year());
+ current.month = static_cast(dateTimeController.Month());
+ current.day = static_cast(dateTimeController.Day());
+
+ // Set today's date
+ lv_calendar_set_today_date(calendar, ¤t);
+ lv_calendar_set_showed_date(calendar, ¤t);
+}
+
+bool Calendar::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
+ switch (event) {
+ case TouchEvents::SwipeLeft: {
+ if (current.month == 12) {
+ current.month = 1;
+ current.year++;
+ } else {
+ current.month++;
+ }
+
+ lv_calendar_set_showed_date(calendar, ¤t);
+ return true;
+ }
+ case TouchEvents::SwipeRight: {
+ if (current.month == 1) {
+ current.month = 12;
+ current.year--;
+ } else {
+ current.month--;
+ }
+
+ lv_calendar_set_showed_date(calendar, ¤t);
+ return true;
+ }
+ /*
+ case TouchEvents::SwipeUp: {
+ current.year++;
+ lv_calendar_set_showed_date(calendar, ¤t);
+ return true;
+ }
+ case TouchEvents::SwipeDown: {
+ current.year--;
+ lv_calendar_set_showed_date(calendar, ¤t);
+ return true;
+ }
+ */
+ default: {
+ return false;
+ }
+ }
+}
+
+Calendar::~Calendar() {
+ lv_obj_clean(lv_scr_act());
+}
diff --git a/src/displayapp/screens/Calendar.h b/src/displayapp/screens/Calendar.h
new file mode 100644
index 0000000000..bbdc8322f2
--- /dev/null
+++ b/src/displayapp/screens/Calendar.h
@@ -0,0 +1,59 @@
+/* Copyright (C) 2024 thnikk, Boteium, JustScott
+
+ This file is part of InfiniTime.
+
+ InfiniTime is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published
+ by the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ InfiniTime is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#pragma once
+
+#include "displayapp/apps/Apps.h"
+#include "displayapp/Controllers.h"
+#include "displayapp/screens/Screen.h"
+#include "components/datetime/DateTimeController.h"
+#include
+
+#include "Symbols.h"
+
+namespace Pinetime {
+ namespace Controllers {
+ class Settings;
+ }
+
+ namespace Applications {
+ namespace Screens {
+ class Calendar : public Screen {
+ public:
+ Calendar(Controllers::DateTime& dateTimeController);
+ ~Calendar() override;
+
+ private:
+ bool OnTouchEvent(TouchEvents event);
+ Controllers::DateTime& dateTimeController;
+ lv_obj_t* calendar;
+ lv_calendar_date_t current;
+ };
+ }
+
+ template <>
+ struct AppTraits {
+ static constexpr Apps app = Apps::Calendar;
+ static constexpr const char* icon = Screens::Symbols::calendar;
+
+ static Screens::Screen* Create(AppControllers& controllers) {
+ return new Screens::Calendar(controllers.dateTimeController);
+ };
+ };
+ }
+}
diff --git a/src/displayapp/screens/Symbols.h b/src/displayapp/screens/Symbols.h
index bd958b285f..e48b433686 100644
--- a/src/displayapp/screens/Symbols.h
+++ b/src/displayapp/screens/Symbols.h
@@ -39,6 +39,7 @@ namespace Pinetime {
static constexpr const char* eye = "\xEF\x81\xAE";
static constexpr const char* home = "\xEF\x80\x95";
static constexpr const char* sleep = "\xEE\xBD\x84";
+ static constexpr const char* calendar = "\xEF\x81\xB3";
// fontawesome_weathericons.c
// static constexpr const char* sun = "\xEF\x86\x85";