~aleteoryx/muditaos

ref: 9a281dfe68edffa42a8208476eb3bb1183c1865e muditaos/module-apps/application-messages/models/SMSTemplateModel.cpp -rw-r--r-- 2.6 KiB
9a281dfe — Marcin Zieliński [MOS-663] Replacement for empty templates screen 3 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include "ApplicationMessages.hpp"
#include "SMSTemplateItem.hpp"
#include "SMSTemplateModel.hpp"

#include <ListView.hpp>
#include <module-db/queries/messages/templates/QuerySMSTemplateGetForList.hpp>
#include <service-db/DBServiceAPI.hpp>

SMSTemplateModel::SMSTemplateModel(app::ApplicationCommon *app) : DatabaseModel(app), app::AsyncCallbackReceiver{app}
{
    /* In the base class DatabaseModel, this is initialised to maximal unsigned int value, but in fact should be 0.
       Not wanting to tinker with the whole database handling framework, let's correct this here in a smaller scale. */
    recordsCount = 0;
}

unsigned int SMSTemplateModel::requestRecordsCount()
{
    return recordsCount;
}

bool SMSTemplateModel::updateRecords(std::vector<SMSTemplateRecord> records)
{
    if (DatabaseModel::updateRecords(std::move(records))) {
        list->onProviderDataUpdate();
        return true;
    }
    return false;
}

unsigned int SMSTemplateModel::getMinimalItemSpaceRequired() const
{
    return style::smsTemplItem::h;
}

gui::ListItem *SMSTemplateModel::getItem(gui::Order order)
{
    auto templ = getRecord(order);

    if (!templ) {
        return nullptr;
    }

    auto item = new gui::SMSTemplateItem();
    item->setTemplate(templ);
    item->activatedCallback = [=](gui::Item &it) {
        LOG_INFO("activatedCallback");
        if (auto app = dynamic_cast<app::ApplicationMessages *>(application)) {
            if (app->templatesCallback) {
                return app->templatesCallback(templ);
            }
        }
        return false;
    };

    return item;
}

void SMSTemplateModel::requestRecords(const uint32_t offset, const uint32_t limit)
{
    auto query = std::make_unique<db::query::SMSTemplateGetForList>(offset, limit);
    auto task  = app::AsyncQuery::createFromQuery(std::move(query), db::Interface::Name::SMSTemplate);
    task->setCallback([this](auto response) { return handleQueryResponse(response); });
    task->execute(application, this);
}

auto SMSTemplateModel::handleQueryResponse(db::QueryResult *queryResult) -> bool
{
    auto msgResponse = dynamic_cast<db::query::SMSTemplateGetForListResult *>(queryResult);
    assert(msgResponse != nullptr);

    // If list record count has changed we need to rebuild list.
    if (recordsCount != (msgResponse->getCount())) {
        recordsCount = msgResponse->getCount();
        list->reSendLastRebuildRequest();
        return false;
    }

    auto records = msgResponse->getResults();

    return this->updateRecords(std::move(records));
}