summaryrefslogtreecommitdiff
path: root/saltoqd/cardmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'saltoqd/cardmanager.cpp')
-rw-r--r--saltoqd/cardmanager.cpp331
1 files changed, 331 insertions, 0 deletions
diff --git a/saltoqd/cardmanager.cpp b/saltoqd/cardmanager.cpp
new file mode 100644
index 0000000..5418104
--- /dev/null
+++ b/saltoqd/cardmanager.cpp
@@ -0,0 +1,331 @@
+#include "cardmanager.h"
+
+Card::Card(const QString &id, QObject *parent) :
+ QObject(parent), _id(id),
+ _vibrate(true), _open(false), _visible(false)
+{
+}
+
+QString Card::id() const
+{
+ return _id;
+}
+
+QString Card::header() const
+{
+ return _header;
+}
+
+void Card::setHeader(const QString &header)
+{
+ if (_header != header) {
+ _header = header;
+ emit headerChanged();
+ }
+}
+
+QString Card::title() const
+{
+ return _title;
+}
+
+void Card::setTitle(const QString &title)
+{
+ if (_title != title) {
+ _title = title;
+ emit titleChanged();
+ }
+}
+
+QString Card::info() const
+{
+ return _info;
+}
+
+void Card::setInfo(const QString &info)
+{
+ if (_info != info) {
+ _info = info;
+ emit infoChanged();
+ }
+}
+
+QDateTime Card::dateTime() const
+{
+ return _dateTime;
+}
+
+void Card::setDateTime(const QDateTime &dt)
+{
+ if (_dateTime != dt) {
+ _dateTime = dt;
+ emit dateTimeChanged();
+ }
+}
+
+bool Card::isVibrate() const
+{
+ return _vibrate;
+}
+
+void Card::setVibrate(bool vibrate)
+{
+ if (_vibrate != vibrate) {
+ _vibrate = vibrate;
+ emit vibrateChanged();
+ }
+}
+
+QString Card::text() const
+{
+ return _text;
+}
+
+void Card::setText(const QString &text)
+{
+ if (_text != text) {
+ _text = text;
+ emit textChanged();
+ }
+}
+
+QStringList Card::menuOptions() const
+{
+ return _options;
+}
+
+void Card::setMenuOptions(const QStringList &options)
+{
+ if (_options != options) {
+ _options = options;
+ emit menuOptionsChanged();
+ }
+}
+
+bool Card::isOpen() const
+{
+ return _open;
+}
+
+void Card::setOpen(bool open)
+{
+ _open = open;
+}
+
+bool Card::isVisible() const
+{
+ return _visible;
+}
+
+void Card::setVisible(bool visible)
+{
+ _visible = visible;
+}
+
+CardDeck::CardDeck(const QString &package, const QString &application, QObject *parent) :
+ QObject(parent),
+ _package(package), _application(application),
+ _refreshTimer(new QTimer(this))
+{
+ _refreshTimer->setSingleShot(true);
+ _refreshTimer->setInterval(100);
+ connect(_refreshTimer, &QTimer::timeout,
+ this, &CardDeck::needsRefresh);
+}
+
+QString CardDeck::package() const
+{
+ return _package;
+}
+
+QString CardDeck::application() const
+{
+ return _application;
+}
+
+QList<Card*> CardDeck::cards() const
+{
+ return _deck;
+}
+
+Card* CardDeck::cardAt(int position) const
+{
+ return _deck.at(position);
+}
+
+void CardDeck::appendCard(Card *card)
+{
+ insertCard(_deck.size(), card);
+}
+
+void CardDeck::insertCard(int position, Card *card)
+{
+ if (_ids.contains(card->id())) {
+ qWarning() << "Card" << card->id() << "already present";
+ return;
+ }
+
+ _deck.insert(position, card);
+ _ids.insert(card->id(), card);
+
+ connect(card, &Card::headerChanged, this, &CardDeck::scheduleRefresh);
+ connect(card, &Card::titleChanged, this, &CardDeck::scheduleRefresh);
+ connect(card, &Card::infoChanged, this, &CardDeck::scheduleRefresh);
+ connect(card, &Card::vibrateChanged, this, &CardDeck::scheduleRefresh);
+ connect(card, &Card::textChanged, this, &CardDeck::scheduleRefresh);
+ connect(card, &Card::menuOptionsChanged, this, &CardDeck::scheduleRefresh);
+
+ emit cardAdded(card);
+ scheduleRefresh();
+}
+
+void CardDeck::removeCard(int position)
+{
+ Card * card = _deck.takeAt(position);
+ _ids.remove(card->id());
+
+ disconnect(card, 0, this, 0);
+
+ emit cardRemoved(card);
+ scheduleRefresh();
+}
+
+void CardDeck::removeCard(Card *card)
+{
+ int position = _deck.indexOf(card);
+ if (position >= 0) {
+ removeCard(position);
+ } else {
+ qWarning() << "Card not found";
+ }
+}
+
+void CardDeck::scheduleRefresh()
+{
+ if (!_refreshTimer->isActive()) {
+ _refreshTimer->start();
+ }
+}
+
+CardManager::CardManager(FmsManager *fms, ToqManager *toq) :
+ QObject(toq), _toq(toq), _fms(fms)
+{
+ _toq->setEndpointListener(ToqConnection::AppMessagingEndpoint, this);
+}
+
+void CardManager::handleMessage(const ToqConnection::Message &msg)
+{
+
+}
+
+void CardManager::installDeck(CardDeck *deck)
+{
+ if (_decks.contains(deck->package())) {
+ qWarning() << "Deck" << deck->package() << "is already installed";
+ return;
+ }
+
+ _decks.insert(deck->package(), deck);
+
+ connect(deck, &CardDeck::needsRefresh, this, &CardManager::handleDeckNeedsRefresh);
+ connect(deck, &CardDeck::cardAdded, this, &CardManager::handleCardAdded);
+ connect(deck, &CardDeck::cardRemoved, this, &CardManager::handleCardRemoved);
+}
+
+void CardManager::uninstallDeck(CardDeck *deck)
+{
+ if (!_decks.contains(deck->package())) {
+ qWarning() << "Deck" << deck->package() << "is not installed";
+ }
+ _decks.remove(deck->package());
+
+ disconnect(deck, 0, this, 0);
+}
+
+QString CardManager::generateCardDescription(const QString &verb, Card *card) const
+{
+ QString desc = verb + " { ";
+ desc += QString("id = \"%1\", ").arg(card->id());
+ desc += QString("version = 2, ");
+ if (!card->header().isEmpty()) {
+ desc += QString("header = \"%1\", ").arg(card->header());
+ }
+ if (!card->title().isEmpty()) {
+ desc += QString("title = \"%1\", ").arg(card->title());
+ }
+ if (card->dateTime().isValid()) {
+ desc += QString("time = \"%1\", ").arg(card->dateTime().toMSecsSinceEpoch());
+ }
+ if (!card->info().isEmpty()) {
+ desc += QString("title = \"%1\", ").arg(card->info());
+ }
+ if (!card->isVibrate()) {
+ desc += QString("suppressvibe = \"true\", ");
+ }
+ if (!card->text().isEmpty()) {
+ desc += QString("detail = { \"%1\" }").arg(card->text());
+ }
+ desc += QString("}\n");
+ return desc;
+}
+
+void CardManager::refreshDeck(CardDeck *deck)
+{
+ Q_ASSERT(deck);
+ Q_ASSERT(_toq->isConnected());
+
+ qDebug() << "Refreshing deck" << deck->package();
+
+ QList<Card*> cards = deck->cards();
+ QString data;
+ for (Card * card : cards) {
+ data += generateCardDescription("NotifyCard", card);
+ }
+
+#if 0
+ qDebug() << data;
+ data = QLatin1String(
+ "NotifyCard { id = \"jackpal.androidterm\", version = 2, app = \"Terminal\", title = \"Terminal\", time = \"1427073495379\", cardevents = \"true\", divider = \"true\", icon = \"fms:/jackpal.androidterm.img\", detail = { \"Ses de terminal en ejecucin\" } }\n"
+ "NotifyCard { id = \"com.android.vending\", version = 2, app = \"Google Play Store\", title = \"Simulador Chat\", time = \"1427073139463\", divider = \"true\", icon = \"fms:/com.android.vending.img\", detail = { \"Instalada correctamente\" } }\n");
+#endif
+
+ qDebug() << data;
+
+ QString cardsFile = QString("/packages/%1/cards.dat").arg(deck->package());
+ _fms->updateFile(cardsFile, data.toUtf8());
+}
+
+void CardManager::handleToqConnected()
+{
+ for (const QString &package : _pending) {
+ refreshDeck(_decks.value(package));
+ }
+ _pending.clear();
+}
+
+void CardManager::handleDeckNeedsRefresh()
+{
+ CardDeck *deck = static_cast<CardDeck*>(sender());
+ qDebug() << deck->package() << "needs refresh";
+ if (_toq->isConnected()) {
+ refreshDeck(deck);
+ } else {
+ _pending.insert(deck->package());
+ }
+}
+
+void CardManager::handleCardAdded(Card *card)
+{
+ CardDeck *deck = static_cast<CardDeck*>(sender());
+ if (_toq->isConnected()) {
+
+ }
+}
+
+void CardManager::handleCardRemoved(Card *card)
+{
+ CardDeck *deck = static_cast<CardDeck*>(sender());
+ if (_toq->isConnected()) {
+
+ }
+}