From 4aed8bf75eacfa07bbc1eed373001060fd3ea932 Mon Sep 17 00:00:00 2001 From: "Uwe L. Korn" Date: Sat, 25 May 2013 23:14:15 +0200 Subject: [PATCH] Add desktop notifications for received tracks --- data/images/inbox-512x512.png | Bin 0 -> 14355 bytes resources.qrc | 1 + .../linux/fdonotify/FdoNotifyPlugin.cpp | 73 +++++++++++++++++- .../linux/fdonotify/FdoNotifyPlugin.h | 1 + src/libtomahawk/Typedefs.h | 4 +- src/libtomahawk/infosystem/InfoSystem.cpp | 2 +- src/libtomahawk/jobview/InboxJobItem.h | 2 +- src/libtomahawk/playlist/InboxModel.cpp | 19 +++++ 8 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 data/images/inbox-512x512.png diff --git a/data/images/inbox-512x512.png b/data/images/inbox-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..806661b5e0475544d59d56f6f85b57da1010e21a GIT binary patch literal 14355 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 literal 0 HcmV?d00001 diff --git a/resources.qrc b/resources.qrc index 17cd5b71a..b66ef2251 100644 --- a/resources.qrc +++ b/resources.qrc @@ -183,5 +183,6 @@ data/images/station-genre.svg data/images/station-year.svg data/images/outbox.svg + data/images/inbox-512x512.png diff --git a/src/infoplugins/linux/fdonotify/FdoNotifyPlugin.cpp b/src/infoplugins/linux/fdonotify/FdoNotifyPlugin.cpp index 67c9028a0..425af986e 100644 --- a/src/infoplugins/linux/fdonotify/FdoNotifyPlugin.cpp +++ b/src/infoplugins/linux/fdonotify/FdoNotifyPlugin.cpp @@ -63,7 +63,7 @@ FdoNotifyPlugin::FdoNotifyPlugin() , m_wmSupportsBodyMarkup( false ) { qDebug() << Q_FUNC_INFO; - m_supportedPushTypes << InfoNotifyUser << InfoNowPlaying << InfoTrackUnresolved << InfoNowStopped; + m_supportedPushTypes << InfoNotifyUser << InfoNowPlaying << InfoTrackUnresolved << InfoNowStopped << InfoInboxReceived; // Query the window manager for its capabilties in styling notifications. QDBusMessage message = QDBusMessage::createMethodCall( "org.freedesktop.Notifications", "/org/freedesktop/Notifications", "org.freedesktop.Notifications", "GetCapabilities" ); @@ -127,6 +127,10 @@ FdoNotifyPlugin::pushInfo( Tomahawk::InfoSystem::InfoPushData pushData ) nowPlaying( pushData.infoPair.second ); return; + case Tomahawk::InfoSystem::InfoInboxReceived: + inboxReceived( pushData.infoPair.second ); + return; + default: return; } @@ -166,6 +170,73 @@ FdoNotifyPlugin::notifyUser( const QString& messageText ) QDBusConnection::sessionBus().send( message ); } +void FdoNotifyPlugin::inboxReceived(const QVariant &input) +{ + tDebug( LOGVERBOSE ) << Q_FUNC_INFO; + if ( !input.canConvert< QVariantMap >() ) + return; + + QVariantMap map = input.toMap(); + + if ( !map.contains( "trackinfo" ) || !map[ "trackinfo" ].canConvert< Tomahawk::InfoSystem::InfoStringHash >() ) + return; + + if ( !map.contains( "sourceinfo" ) || !map[ "sourceinfo" ].canConvert< Tomahawk::InfoSystem::InfoStringHash >() ) + return; + + InfoStringHash hash = map[ "trackinfo" ].value< Tomahawk::InfoSystem::InfoStringHash >(); + if ( !hash.contains( "title" ) || !hash.contains( "artist" ) ) + return; + + InfoStringHash src = map[ "sourceinfo" ].value< Tomahawk::InfoSystem::InfoStringHash >(); + if ( !src.contains( "friendlyname" ) ) + return; + + QString messageText; + // If the window manager supports notification styling then use it. + if ( m_wmSupportsBodyMarkup ) + { + // Remark: If using xml-based markup in notifications, the supplied strings need to be escaped. + messageText = tr( "%1 sent you\n%2%4 %3.", "%1 is a nickname, %2 is a title, %3 is an artist, %4 is the preposition used to link track and artist ('by' in english)" ) + .arg( Qt::escape( src["friendlyname"] ) ) + .arg( Qt::escape( hash[ "title" ] ) ) + .arg( Qt::escape( hash[ "artist" ] ) ) + .arg( QString( "\n%1" ).arg( tr( "by", "preposition to link track and artist" ) ) ); + + // Dirty hack(TM) so that KNotify/QLabel recognizes the message as Rich Text + messageText = QString( "%1" ).arg( messageText ); + } + else + { + messageText = tr( "%1 sent you \"%2\" by %3.", "%1 is a nickname, %2 is a title, %3 is an artist" ) + .arg( src["friendlyname"] ) + .arg( hash[ "title" ] ) + .arg( hash[ "artist" ] ); + } + + tDebug( LOGVERBOSE ) << Q_FUNC_INFO << "sending message" << messageText; + + QDBusMessage message = QDBusMessage::createMethodCall( "org.freedesktop.Notifications", "/org/freedesktop/Notifications", "org.freedesktop.Notifications", "Notify" ); + QList arguments; + arguments << QString( "Tomahawk" ); //app_name + arguments << m_nowPlayingId; //notification_id + arguments << QString(); //app_icon + arguments << QString( "Tomahawk - Track received" ); //summary + arguments << messageText; //body + arguments << QStringList(); //actions + QVariantMap dict; + dict["desktop-entry"] = QString( "tomahawk" ); + + // Convert image to QVariant and scale to a consistent size. + dict[ "image_data" ] = ImageConverter::variantForImage( QImage( RESPATH "images/inbox-512x512.png" ).scaledToHeight( getNotificationIconHeight() ) ); + + arguments << dict; //hints + arguments << qint32( -1 ); //expire_timeout + message.setArguments( arguments ); + + // Handle reply in a callback, so that this a non-blocking call + QDBusConnection::sessionBus().send( message ); +} void FdoNotifyPlugin::nowPlaying( const QVariant& input ) diff --git a/src/infoplugins/linux/fdonotify/FdoNotifyPlugin.h b/src/infoplugins/linux/fdonotify/FdoNotifyPlugin.h index ff4743cdd..32003633f 100644 --- a/src/infoplugins/linux/fdonotify/FdoNotifyPlugin.h +++ b/src/infoplugins/linux/fdonotify/FdoNotifyPlugin.h @@ -65,6 +65,7 @@ private: int getNotificationIconHeight(); void notifyUser( const QString& messageText ); + void inboxReceived( const QVariant& input ); void nowPlaying( const QVariant& input ); quint32 m_nowPlayingId; diff --git a/src/libtomahawk/Typedefs.h b/src/libtomahawk/Typedefs.h index c876b084d..639a24555 100644 --- a/src/libtomahawk/Typedefs.h +++ b/src/libtomahawk/Typedefs.h @@ -216,7 +216,9 @@ namespace Tomahawk InfoNotifyUser = 100, - InfoLastInfo = 101 //WARNING: *ALWAYS* keep this last! + InfoInboxReceived = 101, + + InfoLastInfo = 102 //WARNING: *ALWAYS* keep this last! }; class InfoPlugin; diff --git a/src/libtomahawk/infosystem/InfoSystem.cpp b/src/libtomahawk/infosystem/InfoSystem.cpp index 0ba727535..fb303cffa 100644 --- a/src/libtomahawk/infosystem/InfoSystem.cpp +++ b/src/libtomahawk/infosystem/InfoSystem.cpp @@ -225,7 +225,7 @@ InfoSystem::getInfo( const QString &caller, const QVariantMap &customData, const bool InfoSystem::pushInfo( InfoPushData pushData ) { - tDebug() << Q_FUNC_INFO << "type is " << pushData.type; + tDebug() << Q_FUNC_INFO << "type is" << pushData.type; if ( !m_inited || !m_infoSystemWorkerThreadController->worker() ) { init(); diff --git a/src/libtomahawk/jobview/InboxJobItem.h b/src/libtomahawk/jobview/InboxJobItem.h index 91dd243b6..e9e90f35e 100644 --- a/src/libtomahawk/jobview/InboxJobItem.h +++ b/src/libtomahawk/jobview/InboxJobItem.h @@ -33,7 +33,7 @@ public: enum Side { Sending = 0, - Receiving + Receiving = 1 }; explicit InboxJobItem( Side side, diff --git a/src/libtomahawk/playlist/InboxModel.cpp b/src/libtomahawk/playlist/InboxModel.cpp index dd16e30d7..79aa0ed5b 100644 --- a/src/libtomahawk/playlist/InboxModel.cpp +++ b/src/libtomahawk/playlist/InboxModel.cpp @@ -23,6 +23,7 @@ #include "database/DatabaseCommand_DeleteInboxEntry.h" #include "database/DatabaseCommand_ModifyInboxEntry.h" #include "SourceList.h" +#include "TomahawkSettings.h" #include "utils/Logger.h" #include "utils/Closure.h" #include "jobview/JobStatusModel.h" @@ -138,6 +139,24 @@ InboxModel::showNotification( InboxJobItem::Side side, JobStatusView::instance()->model()->addJob( new InboxJobItem( side, src->friendlyName(), track ) ); + + if ( side == InboxJobItem::Receiving ) + { + Tomahawk::InfoSystem::InfoStringHash trackInfo; + trackInfo["title"] = track->track(); + trackInfo["artist"] = track->artist(); + + Tomahawk::InfoSystem::InfoStringHash sourceInfo; + sourceInfo["friendlyname"] = src->friendlyName(); + + QVariantMap playInfo; + playInfo["trackinfo"] = QVariant::fromValue< Tomahawk::InfoSystem::InfoStringHash >( trackInfo ); + playInfo["private"] = TomahawkSettings::instance()->privateListeningMode(); + playInfo["sourceinfo"] = QVariant::fromValue< Tomahawk::InfoSystem::InfoStringHash >( sourceInfo ); + + Tomahawk::InfoSystem::InfoPushData pushData ( "InboxModel", Tomahawk::InfoSystem::InfoInboxReceived, playInfo, Tomahawk::InfoSystem::PushShortUrlFlag ); + Tomahawk::InfoSystem::InfoSystem::instance()->pushInfo( pushData ); + } }