@@ -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();