on xenial help sign in
Have the greeter use AccountsService to determine its background. Fixes: https://bugs.launchpad.net/bugs/1218402.
8970503Michael Terry
Components/EdgeDemo.qml+4−4
@@ -44,13 +44,13 @@ Item {
44
44
45 function hideEdgeDemoInShell() {
45 function hideEdgeDemoInShell() {
46 var user = LightDM.Users.data(greeter.currentIndex, LightDM.UserRoles.NameRole);
46 var user = LightDM.Users.data(greeter.currentIndex, LightDM.UserRoles.NameRole);
47− AccountsService.setUserProperty(user, "demo-edges", false);
47+ AccountsService.demoEdges = false;
48 d.showEdgeDemo = false;
48 d.showEdgeDemo = false;
49 stopDemo();
49 stopDemo();
50 }
50 }
51
51
52 function hideEdgeDemoInGreeter() {
52 function hideEdgeDemoInGreeter() {
53− // TODO: AccountsService.setUserProperty("lightdm", "demo-edges", false);
53+ // TODO: AccountsService.demoEdges = false as lightdm user
54 d.showEdgeDemoInGreeter = false;
54 d.showEdgeDemoInGreeter = false;
55 }
55 }
56
56
@@ -80,7 +80,7 @@ Item {
80 property QtObject leftEdgeDemo
80 property QtObject leftEdgeDemo
81 property QtObject finalEdgeDemo
81 property QtObject finalEdgeDemo
82 property bool showEdgeDemo: false
82 property bool showEdgeDemo: false
83− property bool showEdgeDemoInGreeter: d.showEdgeDemo // TODO: AccountsService.getUserProperty("lightdm", "demo-edges")
83+ property bool showEdgeDemoInGreeter: d.showEdgeDemo // TODO: AccountsService.demoEdges as lightdm user
84
84
85 onShowEdgeDemoInGreeterChanged: {
85 onShowEdgeDemoInGreeterChanged: {
86 if (!d.overlay && d.showEdgeDemoInGreeter) {
86 if (!d.overlay && d.showEdgeDemoInGreeter) {
@@ -126,7 +126,7 @@ Item {
126
126
127 onSelected: {
127 onSelected: {
128 var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole)
128 var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole)
129− d.showEdgeDemo = AccountsService.getUserProperty(user, "demo-edges")
129+ d.showEdgeDemo = AccountsService.demoEdges
130 }
130 }
131 }
131 }
132
132
Greeter/GreeterContent.qml+19−2
@@ -15,6 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18+import AccountsService 0.1
18import Ubuntu.Components 0.1
19import Ubuntu.Components 0.1
19import LightDM 0.1 as LightDM
20import LightDM 0.1 as LightDM
20import "../Components"
21import "../Components"
@@ -39,14 +40,30 @@ MouseArea {
39 color: "black"
40 color: "black"
40 }
41 }
41
42
43+ property url backgroundValue: AccountsService.backgroundFile != undefined && AccountsService.backgroundFile.length > 0 ? AccountsService.backgroundFile : shell.defaultBackground
44+ onBackgroundValueChanged: wallpaper.source = backgroundValue
45+
42 CrossFadeImage {
46 CrossFadeImage {
43 id: wallpaper
47 id: wallpaper
44−
45− source: shell.background
46 anchors.fill: parent
48 anchors.fill: parent
47 fadeInFirst: false
49 fadeInFirst: false
48 }
50 }
49
51
52+ // See Shell.qml's backgroundSettings treatment for why we need a separate
53+ // Image, but it boils down to avoiding binding loop detection.
54+ Image {
55+ source: wallpaper.source
56+ height: 0
57+ width: 0
58+ sourceSize.height: 0
59+ sourceSize.width: 0
60+ onStatusChanged: {
61+ if (status == Image.Error && source != shell.defaultBackground) {
62+ wallpaper.source = shell.defaultBackground
63+ }
64+ }
65+ }
66+
50 Rectangle {
67 Rectangle {
51 anchors.fill: parent
68 anchors.fill: parent
52 color: "black"
69 color: "black"
Shell.qml+2
@@ -15,6 +15,7 @@
15 */
15 */
16
16
17import QtQuick 2.0
17import QtQuick 2.0
18+import AccountsService 0.1
18import GSettings 1.0
19import GSettings 1.0
19import Ubuntu.Application 0.1
20import Ubuntu.Application 0.1
20import Ubuntu.Components 0.1
21import Ubuntu.Components 0.1
@@ -478,6 +479,7 @@ FocusScope {
478 onSelected: {
479 onSelected: {
479 // Update launcher items for new user
480 // Update launcher items for new user
480 var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole);
481 var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole);
482+ AccountsService.user = user;
481 LauncherModel.setUser(user);
483 LauncherModel.setUser(user);
482 }
484 }
483
485
plugins/AccountsService/AccountsService.cpp+67−37
@@ -17,58 +17,88 @@
17 */
17 */
18
18
19#include "AccountsService.h"
19#include "AccountsService.h"
20−#include <QDBusConnection>
20+#include "AccountsServiceDBusAdaptor.h"
21−#include <QDBusConnectionInterface>
21+
22−#include <QDBusMessage>
22+#include <QStringList>
23−#include <QDBusVariant>
24
23
25AccountsService::AccountsService(QObject* parent)
24AccountsService::AccountsService(QObject* parent)
26 : QObject(parent),
25 : QObject(parent),
27− accounts_manager(NULL),
26+ m_service(new AccountsServiceDBusAdaptor(this)),
28− users()
27+ m_user(qgetenv("USER"))
29{
28{
30− auto connection = QDBusConnection::SM_BUSNAME();
29+ connect(m_service, SIGNAL(propertiesChanged(const QString &, const QString &, const QStringList &)),
31− auto interface = connection.interface();
30+ this, SLOT(propertiesChanged(const QString &, const QString &, const QStringList &)));
32− interface->startService("org.freedesktop.Accounts");
31+ connect(m_service, SIGNAL(maybeChanged(const QString &)),
33− accounts_manager = new QDBusInterface("org.freedesktop.Accounts",
32+ this, SLOT(maybeChanged(const QString &)));
34− "/org/freedesktop/Accounts",
35− "org.freedesktop.Accounts",
36− connection, this);
37}
33}
38
34
39−QVariant AccountsService::getUserProperty(const QString &user, const QString &property)
35+QString AccountsService::getUser()
40{
36{
41− auto iface = getUserInterface(user);
37+ return m_user;
42− if (iface != nullptr && iface->isValid()) {
38+}
43− auto answer = iface->call("Get", "com.canonical.unity.AccountsService", property);
39+
44− if (answer.type() == QDBusMessage::ReplyMessage) {
40+void AccountsService::setUser(const QString &user)
45− return answer.arguments()[0].value<QDBusVariant>().variant();
41+{
46− }
42+ m_user = user;
43+ Q_EMIT userChanged();
44+
45+ updateDemoEdges();
46+ updateBackgroundFile();
47+}
48+
49+bool AccountsService::getDemoEdges()
50+{
51+ return m_demoEdges;
52+}
53+
54+void AccountsService::setDemoEdges(bool demoEdges)
55+{
56+ m_demoEdges = demoEdges;
57+ m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges", demoEdges);
58+}
59+
60+QString AccountsService::getBackgroundFile()
61+{
62+ return m_backgroundFile;
63+}
64+
65+void AccountsService::updateDemoEdges()
66+{
67+ auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
68+ if (m_demoEdges != demoEdges) {
69+ m_demoEdges = demoEdges;
70+ Q_EMIT demoEdgesChanged();
47 }
71 }
48− return QVariant();
49}
72}
50
73
51−void AccountsService::setUserProperty(const QString &user, const QString &property, const QVariant &value)
74+void AccountsService::updateBackgroundFile()
52{
75{
53− auto iface = getUserInterface(user);
76+ auto backgroundFile = m_service->getUserProperty(m_user, "org.freedesktop.Accounts.User", "BackgroundFile").toString();
54− if (iface != nullptr && iface->isValid()) {
77+ if (m_backgroundFile != backgroundFile) {
55− // The value needs to be carefully wrapped
78+ m_backgroundFile = backgroundFile;
56− iface->call("Set", "com.canonical.unity.AccountsService", property, QVariant::fromValue(QDBusVariant(value)));
79+ Q_EMIT backgroundFileChanged();
57 }
80 }
58}
81}
59
82
60−QDBusInterface *AccountsService::getUserInterface(const QString &user)
83+void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)
61{
84{
62− auto iface = users.value(user);
85+ if (m_user != user) {
63− if (iface == nullptr && accounts_manager->isValid()) {
86+ return;
64− auto answer = accounts_manager->call("FindUserByName", user);
87+ }
65− if (answer.type() == QDBusMessage::ReplyMessage) {
88+
66− iface = new QDBusInterface("org.freedesktop.Accounts",
89+ if (interface == "com.canonical.unity.AccountsService") {
67− answer.arguments()[0].value<QDBusObjectPath>().path(),
90+ if (changed.contains("demo-edges")) {
68− "org.freedesktop.DBus.Properties",
91+ updateDemoEdges();
69− accounts_manager->connection(), this);
70− users.insert(user, iface);
71 }
92 }
72 }
93 }
94+}
95+
96+void AccountsService::maybeChanged(const QString &user)
97+{
98+ if (m_user != user) {
73− return iface;
99+ return;
100+ }
101+
102+ // Standard properties might have changed
103+ updateBackgroundFile();
74}
104}
plugins/AccountsService/AccountsService.h+34−8
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2012,2013 Canonical, Ltd.
2+ * Copyright (C) 2013 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -19,26 +19,52 @@
19#ifndef UNITY_ACCOUNTSSERVICE_H
19#ifndef UNITY_ACCOUNTSSERVICE_H
20#define UNITY_ACCOUNTSSERVICE_H
20#define UNITY_ACCOUNTSSERVICE_H
21
21
22−#include <QDBusInterface>
23−#include <QMap>
24#include <QObject>
22#include <QObject>
25#include <QString>
23#include <QString>
26
24
25+class AccountsServiceDBusAdaptor;
26+
27class AccountsService: public QObject
27class AccountsService: public QObject
28{
28{
29 Q_OBJECT
29 Q_OBJECT
30+ Q_PROPERTY (QString user
31+ READ getUser
32+ WRITE setUser
33+ NOTIFY userChanged)
34+ Q_PROPERTY (bool demoEdges
35+ READ getDemoEdges
36+ WRITE setDemoEdges
37+ NOTIFY demoEdgesChanged)
38+ Q_PROPERTY (QString backgroundFile
39+ READ getBackgroundFile
40+ NOTIFY backgroundFileChanged)
30
41
31public:
42public:
32 explicit AccountsService(QObject *parent = 0);
43 explicit AccountsService(QObject *parent = 0);
33
44
34− Q_INVOKABLE QVariant getUserProperty(const QString &user, const QString &property);
45+ QString getUser();
46+ void setUser(const QString &user);
47+ bool getDemoEdges();
48+ void setDemoEdges(bool demoEdges);
49+ QString getBackgroundFile();
50+
51+Q_SIGNALS:
52+ void userChanged();
53+ void demoEdgesChanged();
54+ void backgroundFileChanged();
55+
56+private Q_SLOTS:
35− Q_INVOKABLE void setUserProperty(const QString &user, const QString &property, const QVariant &value);
57+ void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
58+ void maybeChanged(const QString &user);
36
59
37private:
60private:
38− QDBusInterface *getUserInterface(const QString &user);
61+ void updateDemoEdges();
62+ void updateBackgroundFile();
39
63
40− QDBusInterface *accounts_manager;
64+ AccountsServiceDBusAdaptor *m_service;
41− QMap<QString, QDBusInterface *> users;
65+ QString m_user;
66+ bool m_demoEdges;
67+ QString m_backgroundFile;
42};
68};
43
69
44#endif
70#endif
plugins/AccountsService/AccountsServiceDBusAdaptor.cppnew file+126
@@ -0,0 +1,126 @@
1+/*
2+ * Copyright (C) 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 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 General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Author: Michael Terry <michael.terry@canonical.com>
17+ */
18+
19+#include "AccountsServiceDBusAdaptor.h"
20+#include <QDBusConnection>
21+#include <QDBusConnectionInterface>
22+#include <QDBusMessage>
23+#include <QDBusVariant>
24+
25+AccountsServiceDBusAdaptor::AccountsServiceDBusAdaptor(QObject* parent)
26+ : QObject(parent),
27+ accounts_manager(NULL),
28+ users()
29+{
30+ auto connection = QDBusConnection::SM_BUSNAME();
31+ auto interface = connection.interface();
32+ interface->startService("org.freedesktop.Accounts");
33+ accounts_manager = new QDBusInterface("org.freedesktop.Accounts",
34+ "/org/freedesktop/Accounts",
35+ "org.freedesktop.Accounts",
36+ connection, this);
37+}
38+
39+QVariant AccountsServiceDBusAdaptor::getUserProperty(const QString &user, const QString &interface, const QString &property)
40+{
41+ auto iface = getUserInterface(user);
42+ if (iface != nullptr && iface->isValid()) {
43+ auto answer = iface->call("Get", interface, property);
44+ if (answer.type() == QDBusMessage::ReplyMessage) {
45+ return answer.arguments()[0].value<QDBusVariant>().variant();
46+ }
47+ }
48+ return QVariant();
49+}
50+
51+void AccountsServiceDBusAdaptor::setUserProperty(const QString &user, const QString &interface, const QString &property, const QVariant &value)
52+{
53+ auto iface = getUserInterface(user);
54+ if (iface != nullptr && iface->isValid()) {
55+ // The value needs to be carefully wrapped
56+ iface->call("Set", interface, property, QVariant::fromValue(QDBusVariant(value)));
57+ }
58+}
59+
60+void AccountsServiceDBusAdaptor::propertiesChangedSlot(const QString &interface, const QVariantMap &changed, const QStringList &invalid)
61+{
62+ // Merge changed and invalidated together
63+ QStringList combined;
64+ combined << invalid;
65+ combined << changed.keys();
66+ combined.removeDuplicates();
67+
68+ Q_EMIT propertiesChanged(getUserForPath(message().path()), interface, combined);
69+}
70+
71+void AccountsServiceDBusAdaptor::maybeChangedSlot()
72+{
73+ Q_EMIT maybeChanged(getUserForPath(message().path()));
74+}
75+
76+QString AccountsServiceDBusAdaptor::getUserForPath(const QString &path)
77+{
78+ QMap<QString, QDBusInterface *>::const_iterator i;
79+ for (i = users.constBegin(); i != users.constEnd(); ++i) {
80+ if (i.value()->path() == path) {
81+ return i.key();
82+ }
83+ }
84+ return QString();
85+}
86+
87+QDBusInterface *AccountsServiceDBusAdaptor::getUserInterface(const QString &user)
88+{
89+ auto iface = users.value(user);
90+ if (iface == nullptr && accounts_manager->isValid()) {
91+ auto answer = accounts_manager->call("FindUserByName", user);
92+ if (answer.type() == QDBusMessage::ReplyMessage) {
93+ auto path = answer.arguments()[0].value<QDBusObjectPath>().path();
94+
95+ iface = new QDBusInterface("org.freedesktop.Accounts",
96+ path,
97+ "org.freedesktop.DBus.Properties",
98+ accounts_manager->connection(), this);
99+
100+ // With its own pre-defined properties, AccountsService is oddly
101+ // close-lipped. It won't send out proper DBus.Properties notices,
102+ // but it does have one catch-all Changed() signal. So let's
103+ // listen to that.
104+ iface->connection().connect(
105+ iface->service(),
106+ path,
107+ "org.freedesktop.Accounts.User",
108+ "Changed",
109+ this,
110+ SLOT(maybeChangedSlot()));
111+
112+ // But custom properties do send out the right notifications, so
113+ // let's still listen there.
114+ iface->connection().connect(
115+ iface->service(),
116+ path,
117+ "org.freedesktop.DBus.Properties",
118+ "PropertiesChanged",
119+ this,
120+ SLOT(propertiesChangedSlot(QString, QVariantMap, QStringList)));
121+
122+ users.insert(user, iface);
123+ }
124+ }
125+ return iface;
126+}
plugins/AccountsService/AccountsServiceDBusAdaptor.hnew file+54
@@ -0,0 +1,54 @@
1+/*
2+ * Copyright (C) 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 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 General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ *
16+ * Authors: Michael Terry <michael.terry@canonical.com>
17+ */
18+
19+#ifndef UNITY_ACCOUNTSSERVICEDBUSADAPTOR_H
20+#define UNITY_ACCOUNTSSERVICEDBUSADAPTOR_H
21+
22+#include <QDBusContext>
23+#include <QDBusInterface>
24+#include <QMap>
25+#include <QObject>
26+#include <QString>
27+
28+class AccountsServiceDBusAdaptor: public QObject, public QDBusContext
29+{
30+ Q_OBJECT
31+
32+public:
33+ explicit AccountsServiceDBusAdaptor(QObject *parent = 0);
34+
35+ Q_INVOKABLE QVariant getUserProperty(const QString &user, const QString &interface, const QString &property);
36+ Q_INVOKABLE void setUserProperty(const QString &user, const QString &interface, const QString &property, const QVariant &value);
37+
38+Q_SIGNALS:
39+ void propertiesChanged(const QString &user, const QString &interface, const QStringList &changed);
40+ void maybeChanged(const QString &user); // Standard properties might have changed
41+
42+private Q_SLOTS:
43+ void propertiesChangedSlot(const QString &interface, const QVariantMap &changed, const QStringList &invalid);
44+ void maybeChangedSlot();
45+
46+private:
47+ QDBusInterface *getUserInterface(const QString &user);
48+ QString getUserForPath(const QString &path);
49+
50+ QDBusInterface *accounts_manager;
51+ QMap<QString, QDBusInterface *> users;
52+};
53+
54+#endif
plugins/AccountsService/CMakeLists.txt+1
@@ -4,6 +4,7 @@ add_definitions(-DSM_BUSNAME=systemBus)
4
4
5add_library(AccountsService-qml MODULE
5add_library(AccountsService-qml MODULE
6 AccountsService.cpp
6 AccountsService.cpp
7+ AccountsServiceDBusAdaptor.cpp
7 plugin.cpp
8 plugin.cpp
8 )
9 )
9
10
plugins/Unity/Launcher/CMakeLists.txt+1−1
@@ -17,7 +17,7 @@ set(QMLLAUNCHERPLUGIN_SRC
17 quicklistmodel.cpp
17 quicklistmodel.cpp
18 common/quicklistentry.cpp
18 common/quicklistentry.cpp
19 backend/launcherbackend.cpp
19 backend/launcherbackend.cpp
20− ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsService.cpp
20+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
21 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h
21 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h
22 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherModelInterface.h
22 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherModelInterface.h
23 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/QuickListModelInterface.h
23 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/QuickListModelInterface.h
plugins/Unity/Launcher/backend/launcherbackend.cpp+4−4
@@ -18,7 +18,7 @@
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
19 */
19 */
20
20
21−#include "AccountsService.h"
21+#include "AccountsServiceDBusAdaptor.h"
22#include "launcherbackend.h"
22#include "launcherbackend.h"
23
23
24#include <QDir>
24#include <QDir>
@@ -43,7 +43,7 @@ LauncherBackend::LauncherBackend(bool useStorage, QObject *parent):
43 m_accounts(nullptr)
43 m_accounts(nullptr)
44{
44{
45 if (useStorage) {
45 if (useStorage) {
46− m_accounts = new AccountsService(this);
46+ m_accounts = new AccountsServiceDBusAdaptor(this);
47 }
47 }
48 m_user = qgetenv("USER");
48 m_user = qgetenv("USER");
49 syncFromAccounts();
49 syncFromAccounts();
@@ -214,7 +214,7 @@ void LauncherBackend::syncFromAccounts()
214 m_storedApps.clear();
214 m_storedApps.clear();
215
215
216 if (m_accounts && !m_user.isEmpty()) {
216 if (m_accounts && !m_user.isEmpty()) {
217− QVariant variant = m_accounts->getUserProperty(m_user, "launcher-items");
217+ QVariant variant = m_accounts->getUserProperty(m_user, "com.canonical.unity.AccountsService", "launcher-items");
218 apps = qdbus_cast<QList<QVariantMap>>(variant.value<QDBusArgument>());
218 apps = qdbus_cast<QList<QVariantMap>>(variant.value<QDBusArgument>());
219 defaults = isDefaultsItem(apps);
219 defaults = isDefaultsItem(apps);
220 }
220 }
@@ -257,7 +257,7 @@ void LauncherBackend::syncToAccounts()
257 items << itemToVariant(appId);
257 items << itemToVariant(appId);
258 }
258 }
259
259
260− m_accounts->setUserProperty(m_user, "launcher-items", QVariant::fromValue(items));
260+ m_accounts->setUserProperty(m_user, "com.canonical.unity.AccountsService", "launcher-items", QVariant::fromValue(items));
261 }
261 }
262}
262}
263
263
plugins/Unity/Launcher/backend/launcherbackend.h+2−2
@@ -25,7 +25,7 @@
25#include <QSettings>
25#include <QSettings>
26#include <QStringList>
26#include <QStringList>
27
27
28−class AccountsService;
28+class AccountsServiceDBusAdaptor;
29
29
30/**
30/**
31 * @brief An interface that provides all the data needed by the launcher.
31 * @brief An interface that provides all the data needed by the launcher.
@@ -156,7 +156,7 @@ private:
156 QList<QString> m_storedApps;
156 QList<QString> m_storedApps;
157 mutable QHash<QString, LauncherBackendItem*> m_itemCache;
157 mutable QHash<QString, LauncherBackendItem*> m_itemCache;
158
158
159− AccountsService *m_accounts;
159+ AccountsServiceDBusAdaptor *m_accounts;
160 QString m_user;
160 QString m_user;
161};
161};
162
162
tests/mocks/AccountsService/AccountsService.cpp+19−3
@@ -23,11 +23,27 @@ AccountsService::AccountsService(QObject* parent)
23{
23{
24}
24}
25
25
26−QVariant AccountsService::getUserProperty(const QString &, const QString &)
26+QString AccountsService::getUser()
27{
27{
28− return QVariant(false);
28+ return "testuser";
29}
29}
30
30
31−void AccountsService::setUserProperty(const QString &, const QString &, const QVariant &)
31+void AccountsService::setUser(const QString &user)
32{
32{
33+ Q_UNUSED(user)
34+}
35+
36+bool AccountsService::getDemoEdges()
37+{
38+ return false;
39+}
40+
41+void AccountsService::setDemoEdges(bool demoEdges)
42+{
43+ Q_UNUSED(demoEdges)
44+}
45+
46+QString AccountsService::getBackgroundFile()
47+{
48+ return TOP_SRCDIR "/graphics/phone_background.jpg";
33}
49}
tests/mocks/AccountsService/AccountsService.h+22−3
@@ -1,5 +1,5 @@
1/*
1/*
2− * Copyright (C) 2012,2013 Canonical, Ltd.
2+ * Copyright (C) 2013 Canonical, Ltd.
3 *
3 *
4 * This program is free software; you can redistribute it and/or modify
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
5 * it under the terms of the GNU General Public License as published by
@@ -27,12 +27,31 @@
27class AccountsService: public QObject
27class AccountsService: public QObject
28{
28{
29 Q_OBJECT
29 Q_OBJECT
30+ Q_PROPERTY (QString user
31+ READ getUser
32+ WRITE setUser
33+ NOTIFY userChanged)
34+ Q_PROPERTY (bool demoEdges
35+ READ getDemoEdges
36+ WRITE setDemoEdges
37+ NOTIFY demoEdgesChanged)
38+ Q_PROPERTY (QString backgroundFile
39+ READ getBackgroundFile
40+ NOTIFY backgroundFileChanged)
30
41
31public:
42public:
32 explicit AccountsService(QObject *parent = 0);
43 explicit AccountsService(QObject *parent = 0);
33
44
34− Q_INVOKABLE QVariant getUserProperty(const QString &user, const QString &property);
45+ QString getUser();
35− Q_INVOKABLE void setUserProperty(const QString &user, const QString &property, const QVariant &value);
46+ void setUser(const QString &user);
47+ bool getDemoEdges();
48+ void setDemoEdges(bool demoEdges);
49+ QString getBackgroundFile();
50+
51+Q_SIGNALS:
52+ void userChanged();
53+ void demoEdgesChanged();
54+ void backgroundFileChanged();
36};
55};
37
56
38#endif
57#endif
tests/mocks/AccountsService/CMakeLists.txt+2
@@ -1,3 +1,5 @@
1+add_definitions(-DTOP_SRCDIR="${CMAKE_SOURCE_DIR}")
2+
1add_library(MockAccountsService-qml MODULE
3add_library(MockAccountsService-qml MODULE
2 AccountsService.cpp
4 AccountsService.cpp
3 plugin.cpp
5 plugin.cpp
tests/plugins/AccountsService/CMakeLists.txt+1
@@ -25,6 +25,7 @@ qt5_use_modules(mock-server Core DBus)
25
25
26add_executable(test-accountsservice
26add_executable(test-accountsservice
27 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsService.cpp
27 ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsService.cpp
28+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
28 client.cpp
29 client.cpp
29 )
30 )
30qt5_use_modules(test-accountsservice Core DBus Test)
31qt5_use_modules(test-accountsservice Core DBus Test)
tests/plugins/AccountsService/client.cpp+19−7
@@ -18,6 +18,7 @@
18 */
18 */
19
19
20#include "AccountsService.h"
20#include "AccountsService.h"
21+#include "AccountsServiceDBusAdaptor.h"
21#include <QSignalSpy>
22#include <QSignalSpy>
22#include <QTest>
23#include <QTest>
23
24
@@ -30,17 +31,28 @@ private Q_SLOTS:
30 void testInvalids()
31 void testInvalids()
31 {
32 {
32 // Test various invalid calls
33 // Test various invalid calls
33− AccountsService session;
34+ AccountsServiceDBusAdaptor session;
34− QCOMPARE(session.getUserProperty("NOPE", "demo-edges"), QVariant());
35+ QCOMPARE(session.getUserProperty("NOPE", "com.canonical.unity.AccountsService", "demo-edges"), QVariant());
35− QCOMPARE(session.getUserProperty("testuser", "NOPE"), QVariant());
36+ QCOMPARE(session.getUserProperty("testuser", "com.canonical.unity.AccountsService", "NOPE"), QVariant());
37+ }
38+
39+ void testGetSetServiceDBusAdaptor()
40+ {
41+ AccountsServiceDBusAdaptor session;
42+ session.setUserProperty("testuser", "com.canonical.unity.AccountsService", "demo-edges", QVariant(true));
43+ QCOMPARE(session.getUserProperty("testuser", "com.canonical.unity.AccountsService", "demo-edges"), QVariant(true));
44+ session.setUserProperty("testuser", "com.canonical.unity.AccountsService", "demo-edges", QVariant(false));
45+ QCOMPARE(session.getUserProperty("testuser", "com.canonical.unity.AccountsService", "demo-edges"), QVariant(false));
36 }
46 }
37
47
38− void testGetSet()
48+ void testGetSetService()
39 {
49 {
40 AccountsService session;
50 AccountsService session;
41− QCOMPARE(session.getUserProperty("testuser", "demo-edges"), QVariant(true));
51+ session.setUser("testuser");
42− session.setUserProperty("testuser", "demo-edges", QVariant(false));
52+ session.setDemoEdges(true);
53+ QCOMPARE(session.getDemoEdges(), true);
54+ session.setDemoEdges(false);
43− QCOMPARE(session.getUserProperty("testuser", "demo-edges"), QVariant(false));
55+ QCOMPARE(session.getDemoEdges(), false);
44 }
56 }
45};
57};
46
58
tests/plugins/Unity/Launcher/CMakeLists.txt+2−2
@@ -21,7 +21,7 @@ add_test(NAME launcherbackendtest COMMAND ${testBackendCommand})
21add_custom_target(launcherbackendtest ${testBackendCommand})
21add_custom_target(launcherbackendtest ${testBackendCommand})
22add_executable(launcherbackendtestExec
22add_executable(launcherbackendtestExec
23 launcherbackendtest.cpp
23 launcherbackendtest.cpp
24− ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsService.cpp
24+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
25 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/backend/launcherbackend.cpp
25 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/backend/launcherbackend.cpp
26 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/common/quicklistentry.cpp
26 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/common/quicklistentry.cpp
27 )
27 )
@@ -39,7 +39,7 @@ add_executable(launchermodeltestExec
39 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/launchermodel.cpp
39 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/launchermodel.cpp
40 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/launcheritem.cpp
40 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/launcheritem.cpp
41 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/quicklistmodel.cpp
41 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/quicklistmodel.cpp
42− ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsService.cpp
42+ ${CMAKE_SOURCE_DIR}/plugins/AccountsService/AccountsServiceDBusAdaptor.cpp
43 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/backend/launcherbackend.cpp
43 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/backend/launcherbackend.cpp
44 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/common/quicklistentry.cpp
44 ${CMAKE_SOURCE_DIR}/plugins/Unity/Launcher/common/quicklistentry.cpp
45 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h
45 ${LAUNCHER_API_INCLUDEDIR}/unity/shell/launcher/LauncherItemInterface.h