M module-apps/application-calllog/widgets/CalllogItem.hpp => module-apps/application-calllog/widgets/CalllogItem.hpp +1 -1
@@ 22,7 22,7 @@ namespace gui
namespace timestamp
{
- inline constexpr auto min_w = 120;
+ inline constexpr auto min_w = 132;
}
} // namespace clItemStyle
M module-apps/application-messages/data/MessagesStyle.hpp => module-apps/application-messages/data/MessagesStyle.hpp +2 -2
@@ 1,4 1,4 @@
-// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
+// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#pragma once
@@ 32,7 32,7 @@ namespace style
inline constexpr uint32_t leftMargin = 10;
inline constexpr uint32_t rightMargin = 10;
- inline constexpr uint32_t timestampWidth = 120;
+ inline constexpr uint32_t timestampWidth = 132;
inline constexpr uint32_t numberImportanceWidth = 80;
inline constexpr uint32_t numberImportanceLeftMargin = 10;
inline constexpr uint32_t snippetLeftMargin = 5;
M module-utils/time/test/unittest_time.cpp => module-utils/time/test/unittest_time.cpp +110 -49
@@ 41,6 41,10 @@ const std::regex regexDDMMYYYY("^([0-2]\\d|3[0-1])\\.(0[1-9]|1[0-2])\\.\\d{4}$")
const std::regex regexDDMM("^([0-2]\\d|3[0-1])\\.(0[1-9]|1[0-2])$");
const std::regex regexMMDDYYYY("^(0[1-9]|1[0-2])\\.([0-2]\\d|3[0-1])\\.\\d{4}$");
const std::regex regexMMDD("^(0[1-9]|1[0-2])\\.([0-2]\\d|3[0-1])$");
+const std::regex regexDaysOfWeek("^(sun|Sun|mon|Mon|t(ues|hurs)|(T(ues|hurs))|Fri|"
+ "fri)(day|\\.)?$|wed(\\.|nesday)?$|Wed(\\.|nesday)?$|"
+ "Sat(\\.|urday)?$|sat(\\.|urday)?$|t((ue?)|(hu?r?))"
+ "\\.?$|T((ue?)|(hu?r?))\\.?$");
TEST_CASE("TimeStamp")
{
@@ 170,7 174,7 @@ TEST_CASE("TimeStamp")
}
}
-TEST_CASE("DateTime")
+TEST_CASE("DateTime formatting")
{
utils::setDisplayLanguage("English");
auto timezone = GENERATE("GMTO", "GMT-2", "GMT+2");
@@ 189,9 193,9 @@ TEST_CASE("DateTime")
);
const auto currentTimeTimeinfo = *std::localtime(¤tTime);
- SECTION("isToday")
+ SECTION("boolean operation 'isToday'")
{
- SECTION("today")
+ SECTION("test data contained in 'today'")
{
auto newTimeTimeinfo = currentTimeTimeinfo;
auto i = GENERATE(range(0, 23));
@@ 200,10 204,10 @@ TEST_CASE("DateTime")
DateTime datetime(timeSettings, newTime, currentTime);
REQUIRE(datetime.isToday());
}
- SECTION("not today")
+ SECTION("test data not contained in 'today'")
{
auto newTimeTimeinfo = currentTimeTimeinfo;
- SECTION("different day")
+ SECTION("for a time other than the present day")
{
for (int i = 1; i <= 31; i++) {
newTimeTimeinfo.tm_mday = i;
@@ 215,7 219,7 @@ TEST_CASE("DateTime")
REQUIRE(!datetime.isToday());
}
}
- SECTION("different month")
+ SECTION("for a time other than the current month")
{
for (int i = 1; i <= 12; i++) {
newTimeTimeinfo.tm_mon = i;
@@ 227,7 231,7 @@ TEST_CASE("DateTime")
REQUIRE(!datetime.isToday());
}
}
- SECTION("previous years")
+ SECTION("for the time last year")
{
auto i = GENERATE(range(1, 100));
newTimeTimeinfo.tm_year = currentTimeTimeinfo.tm_year - i;
@@ 235,7 239,7 @@ TEST_CASE("DateTime")
DateTime datetime(timeSettings, newTime, currentTime);
REQUIRE(!datetime.isToday());
}
- SECTION("next years")
+ SECTION("for time next year")
{
auto i = GENERATE(range(1, 100));
newTimeTimeinfo.tm_year = currentTimeTimeinfo.tm_year + i;
@@ 246,10 250,10 @@ TEST_CASE("DateTime")
}
}
- SECTION("isYesterday")
+ SECTION("boolean operation 'isYesterday'")
{
auto newTimeTimeinfo = currentTimeTimeinfo;
- SECTION("yesterday")
+ SECTION("test data contained in 'yesterday'")
{
newTimeTimeinfo.tm_mday -= 1;
for (int i = 0; i < 24; i++) {
@@ 259,9 263,9 @@ TEST_CASE("DateTime")
REQUIRE(datetime.isYesterday());
}
}
- SECTION("not yesterday")
+ SECTION("test data not contained in 'yesterday'")
{
- SECTION("different days")
+ SECTION("for a day other than 'yesterday'")
{
for (int i = 1; i < 32; i++) {
newTimeTimeinfo.tm_mday = i;
@@ 273,7 277,7 @@ TEST_CASE("DateTime")
REQUIRE(!datetime.isYesterday());
}
}
- SECTION("different months")
+ SECTION("for time from different months")
{
for (int i = 0; i < 12; i++) {
newTimeTimeinfo.tm_mon = i;
@@ 282,7 286,7 @@ TEST_CASE("DateTime")
REQUIRE(!datetime.isYesterday());
}
}
- SECTION("different years")
+ SECTION("for a time from another year")
{
// previous
for (int i = 1; i < 100; i++) {
@@ 300,54 304,103 @@ TEST_CASE("DateTime")
}
}
}
+ }
+
+ SECTION("boolean operation 'isCurrentYear'")
+ {
+ auto newTimeTimeinfo = currentTimeTimeinfo;
+ SECTION("for time from different days")
+ {
+ for (int i = 1; i < 32; i++) {
+ newTimeTimeinfo.tm_mday = i;
+ auto newTime = std::mktime(&newTimeTimeinfo);
+ DateTime datetime(timeSettings, newTime, currentTime);
+ REQUIRE(datetime.isCurrentYear());
+ }
+ }
+ SECTION("for time from different months")
+ {
+ for (int i = 0; i < 12; i++) {
+ newTimeTimeinfo.tm_mon = i;
+ auto newTime = std::mktime(&newTimeTimeinfo);
+ DateTime datetime(timeSettings, newTime, currentTime);
+ REQUIRE(datetime.isCurrentYear());
+ }
+ }
+ SECTION("for time from different years")
+ {
+ // previous
+ for (int i = 1; i < 100; i++) {
+ newTimeTimeinfo.tm_year = currentTimeTimeinfo.tm_year - i;
+ auto newTime = std::mktime(&newTimeTimeinfo);
+ DateTime datetime(timeSettings, newTime, currentTime);
+ REQUIRE(!datetime.isCurrentYear());
+ }
+ // forward
+ for (int i = 1; i < 100; i++) {
+ newTimeTimeinfo.tm_year = currentTimeTimeinfo.tm_year + i;
+ auto newTime = std::mktime(&newTimeTimeinfo);
+ DateTime datetime(timeSettings, newTime, currentTime);
+ REQUIRE(!datetime.isCurrentYear());
+ }
+ }
+ }
- SECTION("isCurrentYear")
+ SECTION("boolean operation 'isCurrentWeek'")
+ {
+ auto newTimeTimeinfo = currentTimeTimeinfo;
+ SECTION("test data contained in 'current week'")
+ {
+ auto i = GENERATE(range(2, 7));
+ newTimeTimeinfo.tm_mday -= i;
+ const auto newTime = std::mktime(&newTimeTimeinfo);
+ DateTime datetime(timeSettings, newTime, currentTime);
+ REQUIRE(datetime.isCurrentWeek());
+ }
+ SECTION("test data not contained in 'current week'")
{
auto newTimeTimeinfo = currentTimeTimeinfo;
- SECTION("different days")
+ SECTION("for days other than the last week")
{
- for (int i = 1; i < 32; i++) {
- newTimeTimeinfo.tm_mday = i;
- auto newTime = std::mktime(&newTimeTimeinfo);
- DateTime datetime(timeSettings, newTime, currentTime);
- REQUIRE(datetime.isCurrentYear());
- }
+ auto i = GENERATE(range(7, 32));
+ newTimeTimeinfo.tm_mday -= i;
+ auto newTime = std::mktime(&newTimeTimeinfo);
+ DateTime datetime(timeSettings, newTime, currentTime);
+ REQUIRE(!datetime.isCurrentWeek());
}
- SECTION("different months")
+ SECTION("for time from different months")
{
- for (int i = 0; i < 12; i++) {
- newTimeTimeinfo.tm_mon = i;
- auto newTime = std::mktime(&newTimeTimeinfo);
- DateTime datetime(timeSettings, newTime, currentTime);
- REQUIRE(datetime.isCurrentYear());
- }
+ auto i = GENERATE(range(1, 12));
+ newTimeTimeinfo.tm_mon -= i;
+ auto newTime = std::mktime(&newTimeTimeinfo);
+ DateTime datetime(timeSettings, newTime, currentTime);
+ REQUIRE(!datetime.isCurrentWeek());
}
- SECTION("different years")
+ SECTION("for earlier years")
{
- // previous
- for (int i = 1; i < 100; i++) {
- newTimeTimeinfo.tm_year = currentTimeTimeinfo.tm_year - i;
- auto newTime = std::mktime(&newTimeTimeinfo);
- DateTime datetime(timeSettings, newTime, currentTime);
- REQUIRE(!datetime.isCurrentYear());
- }
- // forward
- for (int i = 1; i < 100; i++) {
- newTimeTimeinfo.tm_year = currentTimeTimeinfo.tm_year + i;
- auto newTime = std::mktime(&newTimeTimeinfo);
- DateTime datetime(timeSettings, newTime, currentTime);
- REQUIRE(!datetime.isCurrentYear());
- }
+ auto i = GENERATE(range(1, 10));
+ newTimeTimeinfo.tm_year = currentTimeTimeinfo.tm_year - i;
+ auto newTime = std::mktime(&newTimeTimeinfo);
+ DateTime datetime(timeSettings, newTime, currentTime);
+ REQUIRE(!datetime.isCurrentWeek());
+ }
+ SECTION("for the time in the following years")
+ {
+ auto i = GENERATE(range(1, 10));
+ newTimeTimeinfo.tm_year = currentTimeTimeinfo.tm_year + i;
+ auto newTime = std::mktime(&newTimeTimeinfo);
+ DateTime datetime(timeSettings, newTime, currentTime);
+ REQUIRE(!datetime.isCurrentWeek());
}
}
}
- SECTION("Display")
+ SECTION("Date/time displayed")
{
auto newTimeTimeinfo = currentTimeTimeinfo;
timeSettings.timeFormat12h = true;
timeSettings.dateFormatDDMM = true;
- SECTION("now")
+ SECTION("for the current time")
{
std::regex reg = reg12h;
auto newTime = std::mktime(&newTimeTimeinfo);
@@ 359,7 412,7 @@ TEST_CASE("DateTime")
REQUIRE(std::regex_match(std::string(datetime.str()), reg));
}
- SECTION("yesterday")
+ SECTION("for the time yesterday")
{
newTimeTimeinfo.tm_mday -= 1;
auto newTime = std::mktime(&newTimeTimeinfo);
@@ 368,7 421,15 @@ TEST_CASE("DateTime")
REQUIRE(datetime.str() == "Yesterday");
}
- SECTION("same year")
+ SECTION("for a time earlier than yesterday but still in the same week")
+ {
+ newTimeTimeinfo.tm_mday -= 6;
+ const auto newTime = std::mktime(&newTimeTimeinfo);
+ DateTime datetime(timeSettings, newTime, currentTime);
+ REQUIRE(std::regex_match(std::string(datetime.str()), regexDaysOfWeek));
+ }
+
+ SECTION("for a time earlier than a week but still in the same year")
{
std::regex regexSameYear = regexDDMM;
if (newTimeTimeinfo.tm_mon == 0) {
@@ 386,7 447,7 @@ TEST_CASE("DateTime")
REQUIRE(std::regex_match(std::string(datetime.str()), regexSameYear));
}
- SECTION("different year")
+ SECTION("for the time last year")
{
std::regex regexPreviousYear = regexDDMMYYYY;
newTimeTimeinfo.tm_year -= 1;
M module-utils/time/time/time_conversion.cpp => module-utils/time/time/time_conversion.cpp +19 -4
@@ 154,14 154,14 @@ namespace utils::time
bool DateTime::isToday() const
{
- auto timeinfo = *std::localtime(&time);
- auto newer_timeinfo = *std::localtime(&referenceTime);
+ const auto timeinfo = *std::localtime(&time);
+ const auto newer_timeinfo = *std::localtime(&referenceTime);
return (newer_timeinfo.tm_yday == timeinfo.tm_yday && isCurrentYear());
}
bool DateTime::isYesterday() const
{
- auto timeinfo = *std::localtime(&time);
+ const auto timeinfo = *std::localtime(&time);
auto newer_timeinfo = *std::localtime(&referenceTime);
newer_timeinfo.tm_mday -= 1;
@@ 173,9 173,21 @@ namespace utils::time
bool DateTime::isCurrentYear() const
{
+ const auto timeinfo = *std::localtime(&time);
+ const auto newer_timeinfo = *std::localtime(&referenceTime);
+ return (newer_timeinfo.tm_year == timeinfo.tm_year);
+ }
+
+ bool DateTime::isCurrentWeek() const
+ {
auto timeinfo = *std::localtime(&time);
auto newer_timeinfo = *std::localtime(&referenceTime);
- return (newer_timeinfo.tm_year == timeinfo.tm_year);
+
+ timeinfo.tm_hour = timeinfo.tm_min = timeinfo.tm_sec = 0;
+ newer_timeinfo.tm_hour = newer_timeinfo.tm_min = newer_timeinfo.tm_sec = 0;
+
+ const auto dayDifference = std::difftime(std::mktime(&newer_timeinfo), std::mktime(&timeinfo)) / secondsInDay;
+ return std::abs(dayDifference) < Locale::num_days;
}
UTF8 DateTime::str(std::string format) const
@@ 191,6 203,9 @@ namespace utils::time
if (isYesterday()) {
return Locale::yesterday();
}
+ if (isCurrentWeek()) {
+ return Timestamp::day();
+ }
if (isCurrentYear()) {
auto localeFormat = timeSettings.isDateFormatDDMM() ? Locale::TimeFormat::FormatLocaleDate_DD_MM
: Locale::TimeFormat::FormatLocaleDate_MM_DD;
M module-utils/time/time/time_conversion.hpp => module-utils/time/time/time_conversion.hpp +2 -1
@@ 1,4 1,4 @@
-// Copyright (c) 2017-2022, Mudita Sp. z.o.o. All rights reserved.
+// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
#pragma once
@@ 152,6 152,7 @@ namespace utils
bool isToday() const;
bool isYesterday() const;
bool isCurrentYear() const;
+ bool isCurrentWeek() const;
};
class Date : public DateTime
M pure_changelog.md => pure_changelog.md +1 -0
@@ 3,6 3,7 @@
## Unreleased
### Added
* Always display network access technology and signal strength on the status bar
+* Add days of the week to the list of SMS, calls and notes
### Changed / Improved
* Improved dialog with network via USSD