on fa85355 help sign in
unity8/plugins/IndicatorsClient/indicators/common/indicatorclient_common.cpp
273 lines 7.2 kB history raw
1/*
2 * Copyright 2013 Canonical Ltd.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU Lesser General Public License as published by
6 * the Free Software Foundation; version 3.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Lesser General Public License for more details.
12 *
13 * You should have received a copy of the GNU Lesser General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authors:
17 * Renato Araujo Oliveira Filho <renato@canonical.com>
18 */
20#include "indicatorclient_common.h"
22#include <QUrl>
23#include <QtPlugin>
24#include <QResource>
25#include <QDebug>
26#include <QFileInfo>
27#include <QDir>
28#include <QQmlEngine>
29#include <QQmlContext>
30#include <QJsonObject>
32#include <qdbusmenumodel.h>
33#include <qdbusactiongroup.h>
34#include <qstateaction.h>
36//TODO: load this property dynamically
37#define TARGET_DEVICE "phone"
39IndicatorClientCommon::IndicatorClientCommon(QObject *parent)
40 : QObject(parent),
41 m_icon(""),
42 m_visible(false),
43 m_priority(0),
44 m_model(0),
45 m_actionGroup(0),
46 m_action(0),
47 m_component(0)
51IndicatorClientCommon::~IndicatorClientCommon()
53 shutdown();
56void IndicatorClientCommon::init(const QSettings& settings)
58 setId(settings.value("Indicator Service/Name").toString());
59 QString dbusService = settings.value("Indicator Service/DBusName").toString();
60 QString objectPath = settings.value("Indicator Service/ObjectPath").toString();
62 m_model = new QDBusMenuModel(this);
63 m_model->setBusName(dbusService);
64 m_model->setObjectPath(objectPath + "/" + TARGET_DEVICE);
65 m_model->setBusType(DBusEnums::SessionBus);
67 //keep track of any change in the model
68 connect(m_model, SIGNAL(statusChanged(DBusEnums::ConnectionStatus)), SLOT(onModelChanged()));
69 connect(m_model, SIGNAL(rowsInserted(QModelIndex,int,int)), SLOT(onModelChanged()));
70 connect(m_model, SIGNAL(rowsRemoved(QModelIndex,int,int)), SLOT(onModelChanged()));
71 connect(m_model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), SLOT(onModelChanged()));
73 m_actionGroup = new QDBusActionGroup(this);
74 m_actionGroup->setBusType(m_model->busType());
75 m_actionGroup->setBusName(m_model->busName());
76 m_actionGroup->setObjectPath(objectPath);
78 m_initialProperties.clear();
79 m_initialProperties.insert("title", m_title);
80 m_initialProperties.insert("busType", 1);
81 m_initialProperties.insert("busName", dbusService);
82 m_initialProperties.insert("objectPath", objectPath);
84 m_actionGroup->start();
85 m_model->start();
88void IndicatorClientCommon::onModelChanged()
90 DBusEnums::ConnectionStatus status = m_model->status();
92 if (status == DBusEnums::Connected) {
93 QModelIndex index = m_model->index(0);
94 if (index.isValid()) {
95 QVariant extra = m_model->data(index, QDBusMenuModel::Extra);
96 QVariantMap extraMap = extra.toMap();
97 if (extraMap.contains("canonical_type")) {
98 QString type = extraMap["canonical_type"].toString();
99 parseRootElement(type, m_model->itemData(index));
100 }
101 }
102 } else {
103 parseRootElement("", QMap<int, QVariant>());
104 }
107bool IndicatorClientCommon::parseRootElement(const QString &type, QMap<int, QVariant> data)
109 if (type.isEmpty()) {
110 return false;
111 } else if (type != "com.canonical.indicator.root") {
112 if (!type.startsWith("com.canonical.indicator.root")) {
113 qWarning() << "indicator" << title() << "does not support root element";
114 }
115 return false;
116 } else {
117 if (m_action != 0) {
118 delete m_action;
119 }
121 QVariant action = data[QDBusMenuModel::Action];
122 m_action = m_actionGroup->action(action.toString());
124 if (m_action->isValid()) {
125 updateState(m_action->state());
126 }
127 QObject::connect(m_action, SIGNAL(stateChanged(QVariant)), this, SLOT(updateState(QVariant)));
128 return true;
129 }
132void IndicatorClientCommon::updateState(const QVariant &state)
134 if (state.isValid()) {
135 // (sssb) : the current label, icon name, accessible name, and visibility state of the indicator.
136 QVariantList states = state.toList();
137 if (states.size() == 4) {
138 setLabel(states[0].toString());
139 setIcon(QUrl(states[1].toString()));
140 setVisible(states[2].toBool());
141 return;
142 }
143 }
145 setLabel("");
146 setIcon(QUrl());
147 setVisible(false);
150void IndicatorClientCommon::shutdown()
152 delete m_component;
153 m_component = 0;
155 delete m_model;
156 m_model = 0;
158 delete m_action;
159 m_action = 0;
161 delete m_actionGroup;
162 m_actionGroup = 0;
165QString IndicatorClientCommon::identifier() const
167 return m_identifier;
170void IndicatorClientCommon::setId(const QString &identifier)
172 if (identifier != m_identifier) {
173 m_identifier = identifier;
174 Q_EMIT identifierChanged(m_identifier);
175 }
178QUrl IndicatorClientCommon::icon() const
180 if (!m_icon.isEmpty() && m_icon.scheme().isEmpty()) {
181 return QString("image://gicon/") + QUrl::toPercentEncoding(m_icon.toString());
182 } else {
183 return m_icon;
184 }
187void IndicatorClientCommon::setIcon(const QUrl &icon)
189 if (icon != m_icon) {
190 m_icon = icon;
191 Q_EMIT iconChanged(m_icon);
192 }
195QString IndicatorClientCommon::title() const
197 return m_title;
200void IndicatorClientCommon::setTitle(const QString &title)
202 if (title != m_title) {
203 m_title = title;
204 Q_EMIT titleChanged(m_title);
205 }
208QString IndicatorClientCommon::description() const
210 return m_description;
213void IndicatorClientCommon::setDescription(const QString &description)
215 if (description != m_description) {
216 m_description = description;
217 Q_EMIT titleChanged(m_description);
218 }
221int IndicatorClientCommon::priority() const
223 return m_priority;
226void IndicatorClientCommon::setPriority(int priority)
228 if (priority != m_priority) {
229 m_priority = priority;
230 Q_EMIT priorityChanged(m_priority);
231 }
234bool IndicatorClientCommon::visible() const
236 return m_visible;
239void IndicatorClientCommon::setVisible(bool visible)
241 if (visible != m_visible) {
242 m_visible = visible;
243 Q_EMIT visibleChanged(m_visible);
244 }
247QString IndicatorClientCommon::label() const
249 return m_label;
252void IndicatorClientCommon::setLabel(const QString &label)
254 if (label != m_label) {
255 m_label = label;
256 Q_EMIT labelChanged(m_label);
257 }
260QDBusActionGroup *IndicatorClientCommon::actionGroup() const
262 return m_actionGroup;
265QUrl IndicatorClientCommon::componentSource() const
267 return QUrl("qrc:/indicatorsclient/qml/CommonIndicator.qml");
270IndicatorClientInterface::PropertiesMap IndicatorClientCommon::initialProperties()
272 return m_initialProperties;