on xenial help sign in
Add new accountsservice property DemoEdgesCompleted
commitc87338bd5af257a3393e6190644270d22403c0b2 authorMichael Terry <michael.terry@canonical.com> dateWed 23 Sep 2015, 14:34 (11 years ago) parent5bae3e3
7 files changed+131
plugins/AccountsService/AccountsService.cpp+49 plugins/AccountsService/AccountsService.h+9 plugins/AccountsService/com.canonical.unity.AccountsService.xml+5 tests/mocks/AccountsService/AccountsService.cpp+20 tests/mocks/AccountsService/AccountsService.h+10 tests/plugins/AccountsService/PropertiesServer.cpp+1 tests/plugins/AccountsService/client.cpp+37
plugins/AccountsService/AccountsService.cpp+49
@@ -27,6 +27,7 @@ AccountsService::AccountsService(QObject* parent, const QString &user)
2727 : QObject(parent),
2828 m_service(new AccountsServiceDBusAdaptor(this)),
2929 m_demoEdges(false),
30+ m_demoEdgesCompleted(),
3031 m_enableLauncherWhileLocked(false),
3132 m_enableIndicatorsWhileLocked(false),
3233 m_statsWelcomeScreen(false),
@@ -54,6 +55,7 @@ void AccountsService::setUser(const QString &user)
5455 m_user = user;
5556 Q_EMIT userChanged();
5657
58+ updateDemoEdgesCompleted(false);
5759 updateDemoEdges(false);
5860 updateEnableLauncherWhileLocked(false);
5961 updateEnableIndicatorsWhileLocked(false);
@@ -80,6 +82,21 @@ void AccountsService::setDemoEdges(bool demoEdges)
8082 }
8183}
8284
85+QStringList AccountsService::demoEdgesCompleted() const
86+{
87+ return m_demoEdgesCompleted;
88+}
89+
90+void AccountsService::markDemoEdgeCompleted(const QString &edge)
91+{
92+ if (!m_demoEdgesCompleted.contains(edge)) {
93+ m_demoEdgesCompleted << edge;
94+ m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService", "DemoEdgesCompleted", m_demoEdgesCompleted);
95+
96+ Q_EMIT demoEdgesCompletedChanged();
97+ }
98+}
99+
83100bool AccountsService::enableLauncherWhileLocked() const
84101{
85102 return m_enableLauncherWhileLocked;
@@ -159,6 +176,35 @@ void AccountsService::updateDemoEdges(bool async)
159176 }
160177}
161178
179+void AccountsService::updateDemoEdgesCompleted(bool async)
180+{
181+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
182+ "com.canonical.unity.AccountsService",
183+ "DemoEdgesCompleted");
184+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
185+
186+ connect(watcher, &QDBusPendingCallWatcher::finished,
187+ this, [this](QDBusPendingCallWatcher* watcher) {
188+
189+ QDBusPendingReply<QDBusVariant> reply = *watcher;
190+ watcher->deleteLater();
191+ if (reply.isError()) {
192+ qWarning() << "Failed to get 'DemoEdgesCompleted' property - " << reply.error().message();
193+ return;
194+ }
195+
196+ auto demoEdgesCompleted = reply.value().variant().toStringList();
197+ if (m_demoEdgesCompleted != demoEdgesCompleted) {
198+ m_demoEdgesCompleted = demoEdgesCompleted;
199+ Q_EMIT demoEdgesCompletedChanged();
200+ }
201+ });
202+ if (!async) {
203+ watcher->waitForFinished();
204+ delete watcher;
205+ }
206+}
207+
162208void AccountsService::updateEnableLauncherWhileLocked(bool async)
163209{
164210 QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
@@ -419,6 +465,9 @@ void AccountsService::onPropertiesChanged(const QString &user, const QString &in
419465 if (changed.contains("demo-edges")) {
420466 updateDemoEdges();
421467 }
468+ if (changed.contains("DemoEdgesCompleted")) {
469+ updateDemoEdgesCompleted();
470+ }
422471 } else if (interface == "com.canonical.unity.AccountsService.Private") {
423472 if (changed.contains("FailedLogins")) {
424473 updateFailedLogins();
plugins/AccountsService/AccountsService.h+9
@@ -21,6 +21,7 @@
2121
2222#include <QObject>
2323#include <QString>
24+#include <QStringList>
2425
2526class AccountsServiceDBusAdaptor;
2627
@@ -36,6 +37,9 @@ class AccountsService: public QObject
3637 READ demoEdges
3738 WRITE setDemoEdges
3839 NOTIFY demoEdgesChanged)
40+ Q_PROPERTY (QStringList demoEdgesCompleted
41+ READ demoEdgesCompleted
42+ NOTIFY demoEdgesCompletedChanged)
3943 Q_PROPERTY (bool enableLauncherWhileLocked
4044 READ enableLauncherWhileLocked
4145 NOTIFY enableLauncherWhileLockedChanged)
@@ -79,6 +83,8 @@ public:
7983 void setUser(const QString &user);
8084 bool demoEdges() const;
8185 void setDemoEdges(bool demoEdges);
86+ QStringList demoEdgesCompleted() const;
87+ Q_INVOKABLE void markDemoEdgeCompleted(const QString &edge);
8288 bool enableLauncherWhileLocked() const;
8389 bool enableIndicatorsWhileLocked() const;
8490 QString backgroundFile() const;
@@ -94,6 +100,7 @@ public:
94100Q_SIGNALS:
95101 void userChanged();
96102 void demoEdgesChanged();
103+ void demoEdgesCompletedChanged();
97104 void enableLauncherWhileLockedChanged();
98105 void enableIndicatorsWhileLockedChanged();
99106 void backgroundFileChanged();
@@ -109,6 +116,7 @@ private Q_SLOTS:
109116
110117private:
111118 void updateDemoEdges(bool async = true);
119+ void updateDemoEdgesCompleted(bool async = true);
112120 void updateEnableLauncherWhileLocked(bool async = true);
113121 void updateEnableIndicatorsWhileLocked(bool async = true);
114122 void updateBackgroundFile(bool async = true);
@@ -121,6 +129,7 @@ private:
121129 AccountsServiceDBusAdaptor *m_service;
122130 QString m_user;
123131 bool m_demoEdges;
132+ QStringList m_demoEdgesCompleted;
124133 bool m_enableLauncherWhileLocked;
125134 bool m_enableIndicatorsWhileLocked;
126135 QString m_backgroundFile;
plugins/AccountsService/com.canonical.unity.AccountsService.xml+5
@@ -14,6 +14,11 @@
1414 <annotation name="org.freedesktop.Accounts.DefaultValue" value="true"/>
1515 </property>
1616
17+ <!-- List of tutorial pages that have been completed by the user -->
18+ <property name="DemoEdgesCompleted" type="as" access="readwrite">
19+ <annotation name="org.freedesktop.Accounts.DefaultValue" value="[]"/>
20+ </property>
21+
1722 <property name="LauncherItems" type="aa{sv}" access="readwrite">
1823 <annotation name="org.freedesktop.Accounts.DefaultValue" value="[{'defaults': <true>}]"/>
1924 </property>
tests/mocks/AccountsService/AccountsService.cpp+20
@@ -28,6 +28,7 @@ AccountsService::AccountsService(QObject* parent)
2828 m_statsWelcomeScreen(true),
2929 m_failedLogins(0),
3030 m_demoEdges(false),
31+ m_demoEdgesCompleted(),
3132 m_hereEnabled(false),
3233 m_hereLicensePath("")
3334{
@@ -56,6 +57,25 @@ void AccountsService::setDemoEdges(bool demoEdges)
5657 Q_EMIT demoEdgesChanged();
5758}
5859
60+QStringList AccountsService::demoEdgesCompleted() const
61+{
62+ return m_demoEdgesCompleted;
63+}
64+
65+void AccountsService::markDemoEdgeCompleted(const QString &edge)
66+{
67+ if (!m_demoEdgesCompleted.contains(edge)) {
68+ m_demoEdgesCompleted << edge;
69+ Q_EMIT demoEdgesCompletedChanged();
70+ }
71+}
72+
73+void AccountsService::setDemoEdgesCompleted(const QStringList &demoEdgesCompleted)
74+{
75+ m_demoEdgesCompleted = demoEdgesCompleted;
76+ Q_EMIT demoEdgesCompletedChanged();
77+}
78+
5979bool AccountsService::enableLauncherWhileLocked() const
6080{
6181 return m_enableLauncherWhileLocked;
tests/mocks/AccountsService/AccountsService.h+10
@@ -22,6 +22,7 @@
2222
2323#include <QObject>
2424#include <QString>
25+#include <QStringList>
2526#include <QVariant>
2627
2728class AccountsService: public QObject
@@ -36,6 +37,10 @@ class AccountsService: public QObject
3637 READ demoEdges
3738 WRITE setDemoEdges
3839 NOTIFY demoEdgesChanged)
40+ Q_PROPERTY (QStringList demoEdgesCompleted
41+ READ demoEdgesCompleted
42+ WRITE setDemoEdgesCompleted // only available in mock
43+ NOTIFY demoEdgesCompletedChanged)
3944 Q_PROPERTY (bool enableLauncherWhileLocked
4045 READ enableLauncherWhileLocked
4146 WRITE setEnableLauncherWhileLocked // only available in mock
@@ -83,6 +88,9 @@ public:
8388 void setUser(const QString &user);
8489 bool demoEdges() const;
8590 void setDemoEdges(bool demoEdges);
91+ QStringList demoEdgesCompleted() const;
92+ void setDemoEdgesCompleted(const QStringList &demoEdges);
93+ Q_INVOKABLE void markDemoEdgeCompleted(const QString &edge);
8694 bool enableLauncherWhileLocked() const;
8795 void setEnableLauncherWhileLocked(bool enableLauncherWhileLocked);
8896 bool enableIndicatorsWhileLocked() const;
@@ -103,6 +111,7 @@ public:
103111Q_SIGNALS:
104112 void userChanged();
105113 void demoEdgesChanged();
114+ void demoEdgesCompletedChanged();
106115 void enableLauncherWhileLockedChanged();
107116 void enableIndicatorsWhileLockedChanged();
108117 void backgroundFileChanged();
@@ -120,6 +129,7 @@ private:
120129 bool m_statsWelcomeScreen;
121130 uint m_failedLogins;
122131 bool m_demoEdges;
132+ QStringList m_demoEdgesCompleted;
123133 bool m_hereEnabled;
124134 QString m_hereLicensePath;
125135};
tests/plugins/AccountsService/PropertiesServer.cpp+1
@@ -71,6 +71,7 @@ void PropertiesServer::Set(const QString &interface, const QString &property, co
7171void PropertiesServer::Reset()
7272{
7373 m_properties["com.canonical.unity.AccountsService"]["demo-edges"] = false;
74+ m_properties["com.canonical.unity.AccountsService"]["DemoEdgesCompleted"] = QStringList();
7475 m_properties["com.canonical.unity.AccountsService.Private"]["FailedLogins"] = 0;
7576 m_properties["com.ubuntu.touch.AccountsService.SecurityPrivacy"]["StatsWelcomeScreen"] = true;
7677 m_properties["com.ubuntu.AccountsService.SecurityPrivacy"]["EnableLauncherWhileLocked"] = true;
tests/plugins/AccountsService/client.cpp+37
@@ -109,6 +109,43 @@ private Q_SLOTS:
109109 QCOMPARE(session.hereEnabled(), true);
110110 }
111111
112+ void testMarkDemoEdgeCompleted()
113+ {
114+ AccountsService session(this, QTest::currentTestFunction());
115+ QSignalSpy changedSpy(&session, &AccountsService::demoEdgesCompletedChanged);
116+
117+ QCOMPARE(changedSpy.count(), 0);
118+ QCOMPARE(session.demoEdgesCompleted(), QStringList());
119+
120+ session.markDemoEdgeCompleted("testedge");
121+ QCOMPARE(changedSpy.count(), 1);
122+ QCOMPARE(session.demoEdgesCompleted(), QStringList() << "testedge");
123+
124+ session.markDemoEdgeCompleted("testedge");
125+ QCOMPARE(changedSpy.count(), 1);
126+ QCOMPARE(session.demoEdgesCompleted(), QStringList() << "testedge");
127+
128+ session.markDemoEdgeCompleted("testedge2");
129+ QCOMPARE(changedSpy.count(), 2);
130+ QCOMPARE(session.demoEdgesCompleted(), QStringList() << "testedge" << "testedge2");
131+ }
132+
133+ void testAsynchronousChangeForDemoEdgesCompleted()
134+ {
135+ AccountsService session(this, QTest::currentTestFunction());
136+ QSignalSpy changedSpy(&session, &AccountsService::demoEdgesCompletedChanged);
137+
138+ QCOMPARE(changedSpy.count(), 0);
139+ QCOMPARE(session.demoEdgesCompleted(), QStringList());
140+
141+ ASSERT_DBUS_CALL(m_userInterface->call("Set",
142+ "com.canonical.unity.AccountsService",
143+ "DemoEdgesCompleted",
144+ dbusVariant(QStringList() << "testedge")));
145+ QTRY_COMPARE(changedSpy.count(), 1);
146+ QCOMPARE(session.demoEdgesCompleted(), QStringList() << "testedge");
147+ }
148+
112149 void testAsynchornousChangeForDemoEdges()
113150 {
114151 AccountsService session(this, QTest::currentTestFunction());