mirror of
https://github.com/mudita/MuditaOS.git
synced 2026-01-02 10:58:45 -05:00
During the phone call, the alarm was not displayed and subsequent alarms after this scenario did not work. This has now been fixed and the alarm during a phone call will be automatically snooze.
175 lines
5.8 KiB
C++
175 lines
5.8 KiB
C++
// Copyright (c) 2017-2023, Mudita Sp. z.o.o. All rights reserved.
|
|
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md
|
|
|
|
#include "AlarmEventsTable.hpp"
|
|
#include "Common/Types.hpp"
|
|
|
|
#include <Interface/AlarmEventRecord.hpp>
|
|
|
|
AlarmEventsTableRow::AlarmEventsTableRow(uint32_t id,
|
|
uint32_t hourOfDay,
|
|
uint32_t minuteOfHour,
|
|
const std::string &musicTone,
|
|
bool enabled,
|
|
uint32_t snoozeDuration,
|
|
const std::string &rruleText)
|
|
: Record{id}, hourOfDay{hourOfDay}, minuteOfHour{minuteOfHour}, musicTone{musicTone}, enabled{enabled},
|
|
snoozeDuration{snoozeDuration}, rruleText{rruleText}
|
|
{}
|
|
|
|
AlarmEventsTableRow::AlarmEventsTableRow(const AlarmEventRecord &rec)
|
|
: AlarmEventsTableRow{rec.ID,
|
|
static_cast<uint32_t>(rec.alarmTime.hourOfDay.count()),
|
|
static_cast<uint32_t>(rec.alarmTime.minuteOfHour.count()),
|
|
rec.musicTone,
|
|
rec.enabled,
|
|
rec.snoozeDuration,
|
|
rec.rruleText}
|
|
{}
|
|
|
|
AlarmEventsTableRow::AlarmEventsTableRow(const QueryResult &result)
|
|
: Record{result[0].getUInt32()}, hourOfDay{result[1].getUInt32()},
|
|
minuteOfHour{result[2].getUInt32()}, musicTone{result[3].getString()}, enabled{result[4].getBool()},
|
|
snoozeDuration{result[5].getUInt32()}, rruleText{result[6].getString()}
|
|
{}
|
|
|
|
auto AlarmEventsTableRow::isValid() const -> bool
|
|
{
|
|
return (ID != 0);
|
|
}
|
|
|
|
AlarmEventsTable::AlarmEventsTable(Database *db) : Table(db)
|
|
{
|
|
createTableRow = [](const QueryResult &retQuery) { return AlarmEventsTableRow(retQuery); };
|
|
}
|
|
|
|
bool AlarmEventsTable::create()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
bool AlarmEventsTable::add(AlarmEventsTableRow entry)
|
|
{
|
|
return db->execute("INSERT or ignore INTO alarms ( hour, minute, music_tone, enabled, snooze_duration, rrule)"
|
|
"VALUES (" u32_c u32_c str_c u32_c u32_c str_ ");",
|
|
entry.hourOfDay,
|
|
entry.minuteOfHour,
|
|
entry.musicTone.c_str(),
|
|
entry.enabled,
|
|
entry.snoozeDuration,
|
|
entry.rruleText.c_str());
|
|
}
|
|
|
|
bool AlarmEventsTable::removeById(uint32_t id)
|
|
{
|
|
return db->execute("DELETE FROM alarms WHERE alarms._id=" u32_ ";", id);
|
|
}
|
|
|
|
bool AlarmEventsTable::update(AlarmEventsTableRow entry)
|
|
{
|
|
return db->execute("UPDATE alarms SET hour=" u32_c "minute=" u32_c "music_tone=" str_c "enabled=" u32_c
|
|
"snooze_duration=" u32_c "rrule=" str_ " WHERE _id=" u32_ ";",
|
|
entry.hourOfDay,
|
|
entry.minuteOfHour,
|
|
entry.musicTone.c_str(),
|
|
entry.enabled,
|
|
entry.snoozeDuration,
|
|
entry.rruleText.c_str(),
|
|
entry.ID);
|
|
}
|
|
|
|
AlarmEventsTableRow AlarmEventsTable::getById(uint32_t id)
|
|
{
|
|
auto retQuery = db->query("SELECT * FROM alarms WHERE _id=" u32_ ";", id);
|
|
|
|
if ((retQuery == nullptr) || (retQuery->getRowCount() == 0)) {
|
|
return AlarmEventsTableRow();
|
|
}
|
|
|
|
return AlarmEventsTableRow(*retQuery);
|
|
}
|
|
|
|
std::vector<AlarmEventsTableRow> AlarmEventsTable::getLimitOffset(uint32_t offset, uint32_t limit)
|
|
{
|
|
auto retQuery =
|
|
db->query("SELECT * FROM alarms ORDER BY hour, minute LIMIT " u32_ " OFFSET " u32_ ";", limit, offset);
|
|
|
|
return retQueryUnpack(std::move(retQuery));
|
|
}
|
|
|
|
std::vector<AlarmEventsTableRow> AlarmEventsTable::getEnabled()
|
|
{
|
|
auto retQuery = db->query("SELECT * FROM alarms WHERE enabled = 1;");
|
|
|
|
return retQueryUnpack(std::move(retQuery));
|
|
}
|
|
|
|
std::vector<AlarmEventsTableRow> AlarmEventsTable::getLimitOffsetByField(uint32_t offset,
|
|
uint32_t limit,
|
|
AlarmEventsTableFields field,
|
|
const char *str)
|
|
{
|
|
std::unique_ptr<QueryResult> retQuery = nullptr;
|
|
const auto &fieldName = getFieldName(field);
|
|
|
|
if (fieldName.empty()) {
|
|
return {};
|
|
}
|
|
|
|
retQuery =
|
|
db->query("SELECT * FROM alarms e WHERE %q=" str_ "ORDER BY hour, minute LIMIT " u32_ " OFFSET " u32_c ";",
|
|
fieldName.c_str(),
|
|
str,
|
|
limit,
|
|
offset);
|
|
|
|
return retQueryUnpack(std::move(retQuery));
|
|
}
|
|
|
|
auto AlarmEventsTable::toggleAll(bool toggle) -> bool
|
|
{
|
|
auto ret = db->execute("UPDATE alarms SET enabled=" u32_ ";", static_cast<int>(toggle));
|
|
|
|
return ret;
|
|
}
|
|
|
|
uint32_t AlarmEventsTable::count()
|
|
{
|
|
auto queryRet = db->query("SELECT COUNT(*) FROM alarms;");
|
|
if (!queryRet || queryRet->getRowCount() == 0) {
|
|
return 0;
|
|
}
|
|
|
|
return (*queryRet)[0].getUInt32();
|
|
}
|
|
|
|
uint32_t AlarmEventsTable::countByFieldId(const char *field, uint32_t id)
|
|
{
|
|
auto queryRet = db->query("SELECT COUNT(*) FROM alarms WHERE %q=" u32_ ";", field, id);
|
|
if ((queryRet == nullptr) || (queryRet->getRowCount() == 0)) {
|
|
return 0;
|
|
}
|
|
|
|
return (*queryRet)[0].getUInt32();
|
|
}
|
|
|
|
std::string AlarmEventsTable::getFieldName(AlarmEventsTableFields field)
|
|
{
|
|
switch (field) {
|
|
case AlarmEventsTableFields::AlarmTimeHour:
|
|
return "hour";
|
|
case AlarmEventsTableFields::AlarmTimeMinute:
|
|
return "minute";
|
|
case AlarmEventsTableFields::MusicTone:
|
|
return "music_tone";
|
|
case AlarmEventsTableFields::Enabled:
|
|
return "enabled";
|
|
case AlarmEventsTableFields::SnoozeDuration:
|
|
return "snooze_duration";
|
|
case AlarmEventsTableFields::Rrule:
|
|
return "rrule";
|
|
default:
|
|
return "";
|
|
}
|
|
}
|