~aleteoryx/muditaos

63f09cbcc0fec5f77e363bbbe171b91e131d89bb — Maciej-Mudita 3 years ago 7d396ef
[MOS-196] Add days of the week to the list of SMS, calls and notes

If an event (e.g. receiving a call or SMS) happened
in the current week, we display the days of the week
instead of the date on the list.
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(&currentTime);

    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