From 630cc2e3097f2236a4c1191be6c955ec523d6f1a Mon Sep 17 00:00:00 2001 From: Tomasz Sterna Date: Mon, 14 Jul 2014 17:13:34 +0200 Subject: Supress unused parameter warnings --- daemon/watchcommands.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'daemon') diff --git a/daemon/watchcommands.cpp b/daemon/watchcommands.cpp index 7fc84fc..1df811a 100644 --- a/daemon/watchcommands.cpp +++ b/daemon/watchcommands.cpp @@ -8,6 +8,8 @@ WatchCommands::WatchCommands(WatchConnector *watch, QObject *parent) : void WatchCommands::processMessage(uint endpoint, uint datalen, QByteArray data) { + Q_UNUSED(datalen); + logger()->debug() << __FUNCTION__ << endpoint << "/" << data.length(); switch (endpoint) { case WatchConnector::watchPHONE_VERSION: -- cgit v1.2.3 From 7d8f121652ceecc371a5f73986e2ef8fc2f1e4be Mon Sep 17 00:00:00 2001 From: Tomasz Sterna Date: Wed, 16 Jul 2014 04:26:05 +0200 Subject: Use new Log4Qt features and fixes --- daemon/daemon.cpp | 40 ---------------------------------------- daemon/voicecallhandler.cpp | 3 +-- ext/Log4Qt | 2 +- 3 files changed, 2 insertions(+), 43 deletions(-) (limited to 'daemon') diff --git a/daemon/daemon.cpp b/daemon/daemon.cpp index eba9afa..a2cb900 100644 --- a/daemon/daemon.cpp +++ b/daemon/daemon.cpp @@ -54,18 +54,8 @@ void signalhandler(int sig) } } -// For some reason exactly SystemLogAppender doesn't have a factory registered in log4qt, -// so in order for it to be instantiatable from .conf file (or even in general?) we declare factory -// right here and will register it in initLoggin() -Log4Qt::Appender *create_system_log_appender() { - return new Log4Qt::SystemLogAppender; -} - void initLogging() { - // Should really be done in log4qt, but somehow it's missing these - Log4Qt::Factory::registerAppender("org.apache.log4j.SystemLogAppender", create_system_log_appender); - // Sailfish OS-specific locations for the app settings files and app's own files const QString logConfigFilePath(QStandardPaths::standardLocations(QStandardPaths::ConfigLocation).at(0) + "pebble/log4qt.conf"); @@ -74,36 +64,6 @@ void initLogging() const QString& usedConfigFile = QFile::exists(logConfigFilePath) ? logConfigFilePath : fallbackLogConfigPath; Log4Qt::PropertyConfigurator::configure(usedConfigFile); - // Uglyish hack for replacing $XDG_CACHE_HOME with the proper cache directory - // TODO: Implement replacing of $XDG_CACHE_HOME (and other vars?) with the proper values before configuring log4qt - - // Iterate all appenders attached to root logger and whenever a FileAppender (or its descender found), replace - // $XDG_CACHE_HOME with the proper folder name - QList appenders = Log4Qt::LogManager::rootLogger()->appenders(); - QList::iterator i; - QDir pathCreator; - for (i = appenders.begin(); i != appenders.end(); ++i) { - Log4Qt::FileAppender* fa = qobject_cast(*i); - if(fa) { - QString filename = fa->file(); - - // As per March 2014 on emulator QStandardPaths::CacheLocation is /home/nemo/.cache - // while on device it is /home/nemo/.cache/app-name - // both things are fine, logging path will just be a little deeper on device - filename.replace("$XDG_CACHE_HOME", - QStandardPaths::standardLocations(QStandardPaths::CacheLocation).at(0) - ); - // make sure loggin dir exists - QFileInfo fi(filename); - if(!pathCreator.mkpath(fi.path())) { - Log4Qt::LogManager::rootLogger()->error("Failed to create dir for logging: %1", fi.path()); - } - - fa->setFile(filename); - fa->activateOptions(); - } - } - // For capturing qDebug() and console.log() messages // Note that console.log() might fail in Sailfish OS device builds. Not sure why, but it seems like // console.log() exactly in Sailfish OS device release builds doesn't go through the same qDebug() channel diff --git a/daemon/voicecallhandler.cpp b/daemon/voicecallhandler.cpp index 55b7c84..d11ceb8 100644 --- a/daemon/voicecallhandler.cpp +++ b/daemon/voicecallhandler.cpp @@ -189,8 +189,7 @@ bool VoiceCallHandler::getProperties() QDBusReply reply = props.call("GetAll", d->interface->interface()); if (reply.isValid()) { QVariantMap props = reply.value(); - QString str; QDebug(&str) << props; - logger()->debug() << str; + logger()->debug() << props; d->providerId = props["providerId"].toString(); d->duration = props["duration"].toInt(); d->status = props["status"].toInt(); diff --git a/ext/Log4Qt b/ext/Log4Qt index cc5ec1f..dbcddd9 160000 --- a/ext/Log4Qt +++ b/ext/Log4Qt @@ -1 +1 @@ -Subproject commit cc5ec1fbb9bc8bd6e3f0355c1635819eb5bb2cf9 +Subproject commit dbcddd9f4399ad4f0e92773bf768c4b5a46c426c -- cgit v1.2.3 From 524a0a854c4cafad8ccbc645a858029bf97a045e Mon Sep 17 00:00:00 2001 From: Tomasz Sterna Date: Fri, 18 Jul 2014 00:59:33 +0200 Subject: Implemented Music Control --- daemon/manager.cpp | 2 +- daemon/manager.h | 4 +++ daemon/watchcommands.cpp | 86 +++++++++++++++++++++++++++++++++++++++++++++-- daemon/watchcommands.h | 3 +- daemon/watchconnector.cpp | 2 +- daemon/watchconnector.h | 4 +-- pebble.pro | 1 + 7 files changed, 94 insertions(+), 8 deletions(-) (limited to 'daemon') diff --git a/daemon/manager.cpp b/daemon/manager.cpp index 496f6d8..a2365b4 100644 --- a/daemon/manager.cpp +++ b/daemon/manager.cpp @@ -26,7 +26,7 @@ Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallMan connect(watch, SIGNAL(connectedChanged()), SLOT(onConnectedChanged())); - connect(watch, SIGNAL(messageDecoded(uint,uint,QByteArray)), commands, SLOT(processMessage(uint,uint,QByteArray))); + connect(watch, SIGNAL(messageDecoded(uint,QByteArray)), commands, SLOT(processMessage(uint,QByteArray))); connect(commands, SIGNAL(hangup()), SLOT(hangupAll())); // Set BT icon for notification diff --git a/daemon/manager.h b/daemon/manager.h index ba482bb..e967dae 100644 --- a/daemon/manager.h +++ b/daemon/manager.h @@ -27,6 +27,9 @@ class Manager : friend class PebbledProxy; + Q_PROPERTY(QString mpris READ mpris) + Q_PROPERTY(QVariantMap mprisMetadata READ getMprisMetadata WRITE setMprisMetadata NOTIFY mprisMetadataChanged) + QBluetoothLocalDevice btDevice; watch::WatchConnector *watch; @@ -50,6 +53,7 @@ public: Q_INVOKABLE void processUnreadMessages(GroupObject *group); Q_INVOKABLE QString mpris(); QVariantMap mprisMetadata; + QVariantMap getMprisMetadata() { return mprisMetadata; } signals: void mprisMetadataChanged(QVariantMap); diff --git a/daemon/watchcommands.cpp b/daemon/watchcommands.cpp index 1df811a..9cd95b5 100644 --- a/daemon/watchcommands.cpp +++ b/daemon/watchcommands.cpp @@ -1,15 +1,17 @@ #include "watchcommands.h" +#include +#include +#include + using namespace watch; WatchCommands::WatchCommands(WatchConnector *watch, QObject *parent) : QObject(parent), watch(watch) {} -void WatchCommands::processMessage(uint endpoint, uint datalen, QByteArray data) +void WatchCommands::processMessage(uint endpoint, QByteArray data) { - Q_UNUSED(datalen); - logger()->debug() << __FUNCTION__ << endpoint << "/" << data.length(); switch (endpoint) { case WatchConnector::watchPHONE_VERSION: @@ -22,6 +24,7 @@ void WatchCommands::processMessage(uint endpoint, uint datalen, QByteArray data) break; case WatchConnector::watchMUSIC_CONTROL: logger()->debug() << "MUSIC_CONTROL" << data.toHex(); + musicControl(WatchConnector::MusicControl(data.at(0))); break; default: @@ -37,3 +40,80 @@ void WatchCommands::onMprisMetadataChanged(QVariantMap metadata) logger()->debug() << __FUNCTION__ << track << album << artist; watch->sendMusicNowPlaying(track, album, artist); } + +void WatchCommands::musicControl(WatchConnector::MusicControl operation) +{ + logger()->debug() << "Operation:" << operation; + + QString mpris = parent()->property("mpris").toString(); + if (mpris.isEmpty()) { + logger()->debug() << "No mpris interface active"; + return; + } + + QString method; + + switch(operation) { + case WatchConnector::musicPLAY_PAUSE: + method = "PlayPause"; + break; + case WatchConnector::musicPAUSE: + method = "Pause"; + break; + case WatchConnector::musicPLAY: + method = "Play"; + break; + case WatchConnector::musicNEXT: + method = "Next"; + break; + case WatchConnector::musicPREVIOUS: + method = "Previous"; + break; + case WatchConnector::musicVOLUME_UP: + case WatchConnector::musicVOLUME_DOWN: { + QDBusReply VolumeReply = QDBusConnection::sessionBus().call( + QDBusMessage::createMethodCall(mpris, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Get") + << "org.mpris.MediaPlayer2.Player" << "Volume"); + if (VolumeReply.isValid()) { + double volume = VolumeReply.value().variant().toDouble(); + if (operation == WatchConnector::musicVOLUME_UP) { + volume += 0.1; + } + else { + volume -= 0.1; + } + logger()->debug() << "Setting volume" << volume; + QDBusError err = QDBusConnection::sessionBus().call( + QDBusMessage::createMethodCall(mpris, "/org/mpris/MediaPlayer2", "org.freedesktop.DBus.Properties", "Set") + << "org.mpris.MediaPlayer2.Player" << "Volume" << QVariant::fromValue(QDBusVariant(volume))); + if (err.isValid()) { + logger()->error() << err.message(); + } + } + else { + logger()->error() << VolumeReply.error().message(); + } + } + return; + case WatchConnector::musicGET_NOW_PLAYING: + onMprisMetadataChanged(parent()->property("mprisMetadata").toMap()); + return; + + case WatchConnector::musicSEND_NOW_PLAYING: + logger()->warn() << "Operation" << operation << "not supported"; + return; + } + + if (method.isEmpty()) { + logger()->error() << "Requested unsupported operation" << operation; + return; + } + + logger()->debug() << operation << "->" << method; + + QDBusError err = QDBusConnection::sessionBus().call( + QDBusMessage::createMethodCall(mpris, "/org/mpris/MediaPlayer2", "org.mpris.MediaPlayer2.Player", method)); + if (err.isValid()) { + logger()->error() << err.message(); + } +} diff --git a/daemon/watchcommands.h b/daemon/watchcommands.h index 6ce70bb..4bd8f3d 100644 --- a/daemon/watchcommands.h +++ b/daemon/watchcommands.h @@ -20,10 +20,11 @@ signals: void hangup(); public slots: - void processMessage(uint endpoint, uint datalen, QByteArray data); + void processMessage(uint endpoint, QByteArray data); protected slots: void onMprisMetadataChanged(QVariantMap metadata); + void musicControl(watch::WatchConnector::MusicControl operation); }; diff --git a/daemon/watchconnector.cpp b/daemon/watchconnector.cpp index 89d504b..1bdec8d 100644 --- a/daemon/watchconnector.cpp +++ b/daemon/watchconnector.cpp @@ -98,7 +98,7 @@ void WatchConnector::decodeMsg(QByteArray data) logger()->debug() << "Length:" << datalen << " Endpoint:" << decodeEndpoint(endpoint); logger()->debug() << "Data:" << data.mid(index).toHex(); - emit messageDecoded(endpoint, datalen, data); + emit messageDecoded(endpoint, data.mid(index, datalen)); } void WatchConnector::onReadSocket() diff --git a/daemon/watchconnector.h b/daemon/watchconnector.h index dafaa83..936deff 100644 --- a/daemon/watchconnector.h +++ b/daemon/watchconnector.h @@ -88,7 +88,7 @@ public: callSTART = 8, callEND = 9 }; - enum { + enum MusicControl { musicPLAY_PAUSE = 1, musicPAUSE = 2, musicPLAY = 3, @@ -137,7 +137,7 @@ public: signals: void messageReceived(QString peer, QString msg); - void messageDecoded(uint endpoint, uint datalen, QByteArray data); + void messageDecoded(uint endpoint, QByteArray data); void nameChanged(); void connectedChanged(); diff --git a/pebble.pro b/pebble.pro index b3df9cf..9c9fd13 100644 --- a/pebble.pro +++ b/pebble.pro @@ -2,5 +2,6 @@ TEMPLATE = subdirs CONFIG += ordered SUBDIRS = ext daemon app OTHER_FILES += \ + README.md \ rpm/pebble.spec \ rpm/pebble.yaml -- cgit v1.2.3 From c47315faa12bbb36772c3f5897751bf74fa122f4 Mon Sep 17 00:00:00 2001 From: Tomasz Sterna Date: Fri, 18 Jul 2014 23:36:05 +0200 Subject: Implemented settings skeleton and notifications --- app/qml/pages/ManagerPage.qml | 11 +++++++++-- daemon/daemon.cpp | 4 +++- daemon/daemon.pro | 3 ++- daemon/manager.cpp | 18 ++++++++++++++++-- daemon/manager.h | 7 ++++++- daemon/settings.h | 25 +++++++++++++++++++++++++ 6 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 daemon/settings.h (limited to 'daemon') diff --git a/app/qml/pages/ManagerPage.qml b/app/qml/pages/ManagerPage.qml index 92d79b1..a6b6699 100644 --- a/app/qml/pages/ManagerPage.qml +++ b/app/qml/pages/ManagerPage.qml @@ -32,10 +32,17 @@ import QtQuick 2.0 import QtQml 2.1 import Sailfish.Silica 1.0 +import org.nemomobile.configuration 1.0 Page { id: page + ConfigurationGroup { + id: settings + path: "/org/pebbled/settings" + property bool silentWhenConnected: false + } + SilicaFlickable { anchors.fill: parent @@ -121,10 +128,10 @@ Page { } TextSwitch { text: qsTr("Silent when connected") - checked: false + checked: settings.silentWhenConnected automaticCheck: false onClicked: { - console.log('settings.silentConnected'); + settings.silentWhenConnected = !settings.silentWhenConnected; } } } diff --git a/daemon/daemon.cpp b/daemon/daemon.cpp index a2cb900..b891680 100644 --- a/daemon/daemon.cpp +++ b/daemon/daemon.cpp @@ -86,7 +86,9 @@ int main(int argc, char *argv[]) DBusConnector dbus; VoiceCallManager voice; - Manager manager(&watch, &dbus, &voice); + Settings settings; + + Manager manager(&watch, &dbus, &voice, &settings); signal(SIGINT, signalhandler); signal(SIGTERM, signalhandler); diff --git a/daemon/daemon.pro b/daemon/daemon.pro index 3db6918..cf6d5b9 100644 --- a/daemon/daemon.pro +++ b/daemon/daemon.pro @@ -29,7 +29,8 @@ HEADERS += \ watchconnector.h \ dbusconnector.h \ dbusadaptor.h \ - watchcommands.h + watchcommands.h \ + settings.h OTHER_FILES += \ org.pebbled.xml \ diff --git a/daemon/manager.cpp b/daemon/manager.cpp index a2365b4..8e07d52 100644 --- a/daemon/manager.cpp +++ b/daemon/manager.cpp @@ -5,10 +5,14 @@ #include #include -Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallManager *voice) : +Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallManager *voice, Settings *settings) : QObject(0), watch(watch), dbus(dbus), voice(voice), commands(new WatchCommands(watch, this)), - notification(MNotification::DeviceEvent) + settings(settings), notification(MNotification::DeviceEvent) { + connect(settings, SIGNAL(valueChanged(QString)), SLOT(onSettingChanged(const QString&))); + connect(settings, SIGNAL(valuesChanged()), SLOT(onSettingsChanged())); + connect(settings, SIGNAL(silentWhenConnectedChanged()), SLOT(onSettingsChanged())); + // We don't need to handle presence changes, so report them separately and ignore them QMap parameters; parameters.insert(QString::fromLatin1("mergePresenceChanges"), QString::fromLatin1("false")); @@ -54,6 +58,16 @@ Manager::Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallMan connect(this, SIGNAL(mprisMetadataChanged(QVariantMap)), commands, SLOT(onMprisMetadataChanged(QVariantMap))); } +void Manager::onSettingChanged(const QString &key) +{ + logger()->debug() << __FUNCTION__ << key << ":" << settings->property(qPrintable(key)); +} + +void Manager::onSettingsChanged() +{ + logger()->warn() << __FUNCTION__ << "Not implemented!"; +} + void Manager::onPebbleChanged() { const QVariantMap & pebble = dbus->pebble(); diff --git a/daemon/manager.h b/daemon/manager.h index e967dae..64dbcce 100644 --- a/daemon/manager.h +++ b/daemon/manager.h @@ -5,6 +5,7 @@ #include "dbusconnector.h" #include "voicecallmanager.h" #include "watchcommands.h" +#include "settings.h" #include #include @@ -38,6 +39,8 @@ class Manager : WatchCommands *commands; + Settings *settings; + MNotification notification; QContactManager *contacts; @@ -47,7 +50,7 @@ class Manager : QString lastSeenMpris; public: - explicit Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallManager *voice); + explicit Manager(watch::WatchConnector *watch, DBusConnector *dbus, VoiceCallManager *voice, Settings *settings); Q_INVOKABLE QString findPersonByNumber(QString number); Q_INVOKABLE void processUnreadMessages(GroupObject *group); @@ -62,6 +65,8 @@ public slots: void hangupAll(); protected slots: + void onSettingChanged(const QString &key); + void onSettingsChanged(); void onPebbleChanged(); void onConnectedChanged(); void onActiveVoiceCallChanged(); diff --git a/daemon/settings.h b/daemon/settings.h new file mode 100644 index 0000000..50ffd86 --- /dev/null +++ b/daemon/settings.h @@ -0,0 +1,25 @@ +#ifndef SETTINGS_H +#define SETTINGS_H + +#include + +class Settings : public MDConfGroup +{ + Q_OBJECT + + Q_PROPERTY(bool silentWhenConnected MEMBER silentWhenConnected NOTIFY silentWhenConnectedChanged) + bool silentWhenConnected; + +public: + explicit Settings(QObject *parent = 0) : + MDConfGroup("/org/pebbled/settings", parent, BindProperties) + { resolveMetaObject(); } + +signals: + void silentWhenConnectedChanged(bool); + +public slots: + +}; + +#endif // SETTINGS_H -- cgit v1.2.3