@@ -27,6 +27,7 @@ AccountsService::AccountsService(QObject* parent, const QString &user)
27 : QObject(parent),
27 : QObject(parent),
28 m_service(new AccountsServiceDBusAdaptor(this)),
28 m_service(new AccountsServiceDBusAdaptor(this)),
29 m_demoEdges(false),
29 m_demoEdges(false),
30+ m_demoEdgesCompleted(),
30 m_enableLauncherWhileLocked(false),
31 m_enableLauncherWhileLocked(false),
31 m_enableIndicatorsWhileLocked(false),
32 m_enableIndicatorsWhileLocked(false),
32 m_statsWelcomeScreen(false),
33 m_statsWelcomeScreen(false),
@@ -54,6 +55,7 @@ void AccountsService::setUser(const QString &user)
54 m_user = user;
55 m_user = user;
55 Q_EMIT userChanged();
56 Q_EMIT userChanged();
58+ updateDemoEdgesCompleted(false);
57 updateDemoEdges(false);
59 updateDemoEdges(false);
58 updateEnableLauncherWhileLocked(false);
60 updateEnableLauncherWhileLocked(false);
59 updateEnableIndicatorsWhileLocked(false);
61 updateEnableIndicatorsWhileLocked(false);
@@ -80,6 +82,21 @@ void AccountsService::setDemoEdges(bool demoEdges)
85+QStringList AccountsService::demoEdgesCompleted() const
87+ return m_demoEdgesCompleted;
90+void AccountsService::markDemoEdgeCompleted(const QString &edge)
92+ if (!m_demoEdgesCompleted.contains(edge)) {
93+ m_demoEdgesCompleted << edge;
94+ m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService", "DemoEdgesCompleted", m_demoEdgesCompleted);
96+ Q_EMIT demoEdgesCompletedChanged();
83bool AccountsService::enableLauncherWhileLocked() const
100bool AccountsService::enableLauncherWhileLocked() const
85 return m_enableLauncherWhileLocked;
102 return m_enableLauncherWhileLocked;
@@ -159,6 +176,35 @@ void AccountsService::updateDemoEdges(bool async)
179+void AccountsService::updateDemoEdgesCompleted(bool async)
181+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
182+ "com.canonical.unity.AccountsService",
183+ "DemoEdgesCompleted");
184+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
186+ connect(watcher, &QDBusPendingCallWatcher::finished,
187+ this, [this](QDBusPendingCallWatcher* watcher) {
189+ QDBusPendingReply<QDBusVariant> reply = *watcher;
190+ watcher->deleteLater();
191+ if (reply.isError()) {
192+ qWarning() << "Failed to get 'DemoEdgesCompleted' property - " << reply.error().message();
196+ auto demoEdgesCompleted = reply.value().variant().toStringList();
197+ if (m_demoEdgesCompleted != demoEdgesCompleted) {
198+ m_demoEdgesCompleted = demoEdgesCompleted;
199+ Q_EMIT demoEdgesCompletedChanged();
203+ watcher->waitForFinished();
162void AccountsService::updateEnableLauncherWhileLocked(bool async)
208void AccountsService::updateEnableLauncherWhileLocked(bool async)
164 QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
210 QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
@@ -419,6 +465,9 @@ void AccountsService::onPropertiesChanged(const QString &user, const QString &in
419 if (changed.contains("demo-edges")) {
465 if (changed.contains("demo-edges")) {
420 updateDemoEdges();
466 updateDemoEdges();
468+ if (changed.contains("DemoEdgesCompleted")) {
469+ updateDemoEdgesCompleted();
422 } else if (interface == "com.canonical.unity.AccountsService.Private") {
471 } else if (interface == "com.canonical.unity.AccountsService.Private") {
423 if (changed.contains("FailedLogins")) {
472 if (changed.contains("FailedLogins")) {
424 updateFailedLogins();
473 updateFailedLogins();