~aleteoryx/muditaos

1b16cab4801cb4cc245f7652f03021530029d2a3 — Mateusz Piesta 4 years ago 33f244b
[BH-1191] Alarm priorities

Enhanced alarm priorities handling

[BH-1259] Snooze time displayed incorrectly
while returning to the home screen

[BH-1263] Bottom message displayed when
editing alarm

Fixed ambiguous iterator use.
M module-services/service-time/AlarmOperations.cpp => module-services/service-time/AlarmOperations.cpp +3 -5
@@ 269,12 269,12 @@ namespace alarms
        }
    }

    auto AlarmOperationsCommon::minuteUpdated(TimePoint now) -> bool
    auto AlarmOperationsCommon::minuteUpdated(TimePoint now) -> void
    {
        return processEvents(now);
        processEvents(now);
    }

    bool AlarmOperationsCommon::processEvents(TimePoint now)
    void AlarmOperationsCommon::processEvents(TimePoint now)
    {
        const auto isHandlingInProgress = !ongoingSingleEvents.empty();
        if (!nextSingleEvents.empty()) {


@@ 287,9 287,7 @@ namespace alarms

        if (!isHandlingInProgress) {
            processOngoingEvents();
            return true;
        }
        return false;
    }

    void AlarmOperationsCommon::processOngoingEvents()

M module-services/service-time/AlarmOperations.hpp => module-services/service-time/AlarmOperations.hpp +19 -19
@@ 39,31 39,31 @@ namespace alarms

        virtual void updateEventsCache(TimePoint now) = 0;

        virtual void getAlarm(const std::uint32_t alarmId, OnGetAlarmProcessed callback)              = 0;
        virtual void getAlarm(const std::uint32_t alarmId, OnGetAlarmProcessed callback)                     = 0;
        virtual void getAlarmWithStatus(const std::uint32_t alarmId, OnGetAlarmWithStatusProcessed callback) = 0;
        virtual void addAlarm(AlarmEventRecord record, OnAddAlarmProcessed callback)                  = 0;
        virtual void updateAlarm(AlarmEventRecord record, OnUpdateAlarmProcessed callback)            = 0;
        virtual void removeAlarm(const std::uint32_t alarmId, OnRemoveAlarmProcessed callback)        = 0;
        virtual void addAlarm(AlarmEventRecord record, OnAddAlarmProcessed callback)                         = 0;
        virtual void updateAlarm(AlarmEventRecord record, OnUpdateAlarmProcessed callback)                   = 0;
        virtual void removeAlarm(const std::uint32_t alarmId, OnRemoveAlarmProcessed callback)               = 0;
        virtual void getAlarmsInRange(std::uint32_t offset,
                                      std::uint32_t limit,
                                      OnGetAlarmsInRangeProcessed callback)                           = 0;
        virtual void getNextSingleEvents(TimePoint start, OnGetAlarmsProcessed callback)              = 0;
        virtual void turnOffRingingAlarm(const std::uint32_t id, OnTurnOffRingingAlarm callback)      = 0;
        virtual void turnOffSnoozedAlarm(const std::uint32_t id, OnTurnOffRingingAlarm callback)      = 0;
                                      OnGetAlarmsInRangeProcessed callback)                                  = 0;
        virtual void getNextSingleEvents(TimePoint start, OnGetAlarmsProcessed callback)                     = 0;
        virtual void turnOffRingingAlarm(const std::uint32_t id, OnTurnOffRingingAlarm callback)             = 0;
        virtual void turnOffSnoozedAlarm(const std::uint32_t id, OnTurnOffRingingAlarm callback)             = 0;
        virtual void snoozeRingingAlarm(const std::uint32_t id,
                                        const TimePoint nextAlarmTime,
                                        OnSnoozeRingingAlarm callback)                                = 0;
                                        OnSnoozeRingingAlarm callback)                                       = 0;
        virtual void postponeSnooze(const std::uint32_t id,
                                    const TimePoint nextAlarmTime,
                                    OnSnoozeRingingAlarm callback)                                    = 0;
        virtual bool minuteUpdated(TimePoint now)                                                            = 0;
                                    OnSnoozeRingingAlarm callback)                                           = 0;
        virtual void minuteUpdated(TimePoint now)                                                            = 0;
        virtual void addAlarmExecutionHandler(const alarms::AlarmType type,
                                              const std::shared_ptr<alarms::AlarmHandler> handler)    = 0;
        virtual void stopAllSnoozedAlarms()                                                           = 0;
        virtual void addSnoozedAlarmsCountChangeCallback(OnSnoozedAlarmsCountChange)                  = 0;
        virtual void addActiveAlarmCountChangeCallback(OnActiveAlarmCountChange)                      = 0;
        virtual void toggleAll(bool toggle, OnToggleAll callback)                                     = 0;
        virtual void getSnoozedAlarms(OnGetSnoozedAlarms callback)                                    = 0;
                                              const std::shared_ptr<alarms::AlarmHandler> handler)           = 0;
        virtual void stopAllSnoozedAlarms()                                                                  = 0;
        virtual void addSnoozedAlarmsCountChangeCallback(OnSnoozedAlarmsCountChange)                         = 0;
        virtual void addActiveAlarmCountChangeCallback(OnActiveAlarmCountChange)                             = 0;
        virtual void toggleAll(bool toggle, OnToggleAll callback)                                            = 0;
        virtual void getSnoozedAlarms(OnGetSnoozedAlarms callback)                                           = 0;
    };

    class IAlarmOperationsFactory


@@ 100,7 100,7 @@ namespace alarms
        void postponeSnooze(const std::uint32_t id,
                            const TimePoint nextAlarmTime,
                            OnSnoozeRingingAlarm callback) override;
        bool minuteUpdated(TimePoint now) override;
        void minuteUpdated(TimePoint now) override;
        void addAlarmExecutionHandler(const alarms::AlarmType type,
                                      const std::shared_ptr<alarms::AlarmHandler> handler) override;
        void stopAllSnoozedAlarms() override;


@@ 140,7 140,7 @@ namespace alarms
                                     OnGetAlarmsProcessed handledCallback);
        void checkAndUpdateCache(AlarmEventRecord record);
        void switchAlarmExecution(const SingleEventRecord &singleAlarmEvent, bool newStateOn);
        bool processEvents(TimePoint now);
        void processEvents(TimePoint now);
        void processOngoingEvents();
        void processNextEventsQueue(const TimePoint now);
        void processSnoozedEventsQueue(const TimePoint now);

M products/BellHybrid/apps/application-bell-main/presenters/StateController.cpp => products/BellHybrid/apps/application-bell-main/presenters/StateController.cpp +8 -7
@@ 161,10 161,12 @@ namespace app::home_screen

        namespace AlarmEdit
        {
            auto entry = [](AbstractView &view, AbstractPresenter &presenter) {
                view.setAlarmEdit(true);
                view.setHeaderViewMode(HeaderViewMode::AlarmIconAndTime);
            };
            auto entry =
                [](AbstractView &view, AbstractPresenter &presenter, AbstractTemperatureModel &temperatureModel) {
                    view.setAlarmEdit(true);
                    view.setHeaderViewMode(HeaderViewMode::AlarmIconAndTime);
                    view.setTemperature(temperatureModel.getTemperature());
                };
            auto exit = [](AbstractView &view, AbstractPresenter &presenter) {
                view.setAlarmEdit(false);
                presenter.detachTimer();


@@ 256,8 258,6 @@ namespace app::home_screen
                presenter.spawnTimer();
                alarmModel.snooze();
                view.setHeaderViewMode(HeaderViewMode::SnoozeCountdown);

                const auto snoozeDuration = alarmModel.getTimeToNextSnooze();
                view.setSnoozeTime(alarmModel.getTimeOfNextSnooze());
                const auto bottomDescription = utils::translate("app_bellmain_home_screen_bottom_desc") + " " +
                                               std::to_string(alarmModel.getSnoozeDuration()) + " min";


@@ 269,9 269,10 @@ namespace app::home_screen
        namespace AlarmSnoozed
        {
            auto entry =
                [](AbstractView &view, AbstractPresenter &presenter, AbstractTemperatureModel &temperatureModel) {
                [](AbstractView &view, AbstractAlarmModel &alarmModel, AbstractTemperatureModel &temperatureModel) {
                    view.setHeaderViewMode(HeaderViewMode::SnoozeCountdown);
                    view.setTemperature(temperatureModel.getTemperature());
                    view.setSnoozeTime(alarmModel.getTimeOfNextSnooze());
                };
            auto exit = [](AbstractPresenter &presenter) { presenter.stopSnoozeTimer(); };
        } // namespace AlarmSnoozed

M products/BellHybrid/apps/application-bell-settings/models/alarm_settings/SnoozeListItemProvider.cpp => products/BellHybrid/apps/application-bell-settings/models/alarm_settings/SnoozeListItemProvider.cpp +6 -5
@@ 28,11 28,12 @@ namespace app::bell_settings
    {
        auto chimeIntervals = getDefaultChimeIntervalRange();

        chimeIntervals.erase(
            std::remove_if(chimeIntervals.begin() + 1,
                           chimeIntervals.end(),
                           [chimeLength](const auto &e) { return e.getValue().value() >= chimeLength; }),
            chimeIntervals.end());
        chimeIntervals.erase(std::remove_if(chimeIntervals.begin(),
                                            chimeIntervals.end(),
                                            [chimeLength](const auto &e) {
                                                return e.getValue() && (e.getValue().value() >= chimeLength);
                                            }),
                             chimeIntervals.end());

        return chimeIntervals;
    }

M products/BellHybrid/services/time/AlarmOperations.cpp => products/BellHybrid/services/time/AlarmOperations.cpp +19 -18
@@ 152,7 152,7 @@ namespace alarms
          bedtime(std::move(bedtimeSettingsProvider))
    {}

    bool AlarmOperations::minuteUpdated(TimePoint now)
    void AlarmOperations::minuteUpdated(TimePoint now)
    {
        /**
         * A very simple alarm priority:


@@ 163,15 163,11 @@ namespace alarms
         * By design, there is no possibility to have both the main alarm, pre wakeup, and snooze alarm set for the same
         * timestamp hence it is safe to process these three in the one go.
         */
        auto wasAlarmConsumed = AlarmOperationsCommon::minuteUpdated(now);
        wasAlarmConsumed |= processPreWakeUp(now);
        wasAlarmConsumed |= processSnoozeChime(now);

        if (not wasAlarmConsumed) {
        AlarmOperationsCommon::minuteUpdated(now);
        processPreWakeUp(now);
        if (isBedtimeAllowed()) {
            processBedtime(now);
        }

        return false;
    }

    void AlarmOperations::stopAllSnoozedAlarms()


@@ 180,22 176,22 @@ namespace alarms
        AlarmOperationsCommon::stopAllSnoozedAlarms();
    }

    bool AlarmOperations::processPreWakeUp(TimePoint now)
    void AlarmOperations::processPreWakeUp(TimePoint now)
    {
        if (nextSingleEvents.empty()) {
            return false;
            return;
        }

        auto nextEvent = getNextPreWakeUpEvent();
        if (!nextEvent.isValid()) {
            return false;
            return;
        }

        const auto decision = preWakeUp.decide(now, nextEvent);
        if (!decision.timeForChime && !decision.timeForFrontlight) {
            return false;
            return;
        }
        return handlePreWakeUp(nextEvent, decision);
        handlePreWakeUp(nextEvent, decision);
    }

    void AlarmOperations::processBedtime(TimePoint now)


@@ 224,20 220,16 @@ namespace alarms
        return event;
    }

    bool AlarmOperations::handlePreWakeUp(const SingleEventRecord &event, PreWakeUp::Decision decision)
    void AlarmOperations::handlePreWakeUp(const SingleEventRecord &event, PreWakeUp::Decision decision)
    {
        auto ret = false;
        if (auto alarmEventPtr = std::dynamic_pointer_cast<AlarmEventRecord>(event.parent); alarmEventPtr) {
            if (decision.timeForChime) {
                handleAlarmEvent(alarmEventPtr, alarms::AlarmType::PreWakeUpChime, true);
                ret = true;
            }
            if (decision.timeForFrontlight) {
                handleAlarmEvent(alarmEventPtr, alarms::AlarmType::PreWakeUpFrontlight, true);
                ret = true;
            }
        }
        return ret;
    }

    bool AlarmOperations::processSnoozeChime(TimePoint now)


@@ 287,6 279,10 @@ namespace alarms
        handleAlarmEvent(event, alarms::AlarmType::PreWakeUpChime, false);
        handleAlarmEvent(event, alarms::AlarmType::PreWakeUpFrontlight, false);
    }
    bool AlarmOperations::isBedtimeAllowed() const
    {
        return ongoingSingleEvents.empty() && not preWakeUp.isActive();
    }

    PreWakeUp::PreWakeUp(std::unique_ptr<PreWakeUpSettingsProvider> &&settingsProvider)
        : settingsProvider{std::move(settingsProvider)}


@@ 298,6 294,7 @@ namespace alarms
        const auto frontlightSettings  = settingsProvider->getFrontlightSettings();
        const auto isTimeForChime      = isTimeForPreWakeUp(now, event, chimeSettings);
        const auto isTimeForFrontlight = isTimeForPreWakeUp(now, event, frontlightSettings);
        active                         = isTimeForChime || isTimeForFrontlight;
        return {isTimeForChime, isTimeForFrontlight};
    }



@@ 308,6 305,10 @@ namespace alarms
        const auto expectedAlarmStart = std::chrono::floor<std::chrono::minutes>(now) + settings.timeBeforeAlarm;
        return settings.enabled && std::chrono::floor<std::chrono::minutes>(event.startDate) == expectedAlarmStart;
    }
    auto PreWakeUp::isActive() const -> bool
    {
        return active;
    }

    Bedtime::Bedtime(std::unique_ptr<AbstractBedtimeSettingsProvider> &&settingsProvider)
        : settingsProvider{std::move(settingsProvider)}

M products/BellHybrid/services/time/include/time/AlarmOperations.hpp => products/BellHybrid/services/time/include/time/AlarmOperations.hpp +7 -3
@@ 64,6 64,7 @@ namespace alarms

        explicit PreWakeUp(std::unique_ptr<PreWakeUpSettingsProvider> &&settingsProvider);
        auto decide(TimePoint now, const SingleEventRecord &event) -> Decision;
        auto isActive() const -> bool;

      private:
        auto isTimeForPreWakeUp(TimePoint now,


@@ 71,6 72,7 @@ namespace alarms
                                PreWakeUpSettingsProvider::Settings settings) -> bool;

        std::unique_ptr<PreWakeUpSettingsProvider> settingsProvider;
        bool active{false};
    };

    class Bedtime


@@ 95,19 97,21 @@ namespace alarms
                        std::unique_ptr<AbstractBedtimeSettingsProvider> &&BedtimeModel);

      private:
        bool minuteUpdated(TimePoint now) override;
        void minuteUpdated(TimePoint now) override;
        void stopAllSnoozedAlarms() override;
        bool processPreWakeUp(TimePoint now);
        void processPreWakeUp(TimePoint now);
        bool processSnoozeChime(TimePoint now);
        void stopAllSnoozeChimes();

        SingleEventRecord getNextPreWakeUpEvent();
        bool handlePreWakeUp(const SingleEventRecord &event, PreWakeUp::Decision decision);
        void handlePreWakeUp(const SingleEventRecord &event, PreWakeUp::Decision decision);
        void handleSnoozeChime(const SingleEventRecord &event, bool newStateOn);
        void handleBedtime(const SingleEventRecord &event, bool decision);
        void processBedtime(TimePoint now);
        void onAlarmTurnedOff(const std::shared_ptr<AlarmEventRecord> &event, alarms::AlarmType alarmType) override;

        bool isBedtimeAllowed() const;

        PreWakeUp preWakeUp;
        std::unique_ptr<SnoozeChimeSettingsProvider> snoozeChimeSettings;
        Bedtime bedtime;

M products/PurePhone/services/time/AlarmOperations.cpp => products/PurePhone/services/time/AlarmOperations.cpp +1 -1
@@ 25,7 25,7 @@ namespace alarms
        : AlarmOperationsCommon{std::move(alarmEventsRepo), std::move(getCurrentTimeCallback)}
    {}

    bool AlarmOperations::minuteUpdated(TimePoint now)
    void AlarmOperations::minuteUpdated(TimePoint now)
    {
        return AlarmOperationsCommon::minuteUpdated(now);
    }

M products/PurePhone/services/time/include/time/AlarmOperations.hpp => products/PurePhone/services/time/include/time/AlarmOperations.hpp +1 -1
@@ 22,7 22,7 @@ namespace alarms
        AlarmOperations(std::unique_ptr<AbstractAlarmEventsRepository> &&alarmEventsRepo,
                        GetCurrentTime getCurrentTimeCallback);

        bool minuteUpdated(TimePoint now) override;
        void minuteUpdated(TimePoint now) override;

      private:
    };