@@ -21,6 +21,7 @@
2121
2222#include <QFile>
2323#include <QStringList>
24+#include <QDebug>
2425
2526AccountsService::AccountsService(QObject* parent)
2627 : QObject(parent),
@@ -56,15 +57,15 @@ void AccountsService::setUser(const QString &user)
5657 m_user = user;
5758 Q_EMIT userChanged();
5859
59− updateDemoEdges();
60− updateEnableLauncherWhileLocked();
61− updateEnableIndicatorsWhileLocked();
62− updateBackgroundFile();
63− updateStatsWelcomeScreen();
64− updatePasswordDisplayHint();
65− updateFailedLogins();
66− updateHereEnabled();
67− updateHereLicensePath();
60+ updateDemoEdges(false);
61+ updateEnableLauncherWhileLocked(false);
62+ updateEnableIndicatorsWhileLocked(false);
63+ updateBackgroundFile(false);
64+ updateStatsWelcomeScreen(false);
65+ updatePasswordDisplayHint(false);
66+ updateFailedLogins(false);
67+ updateHereEnabled(false);
68+ updateHereLicensePath(false);
6869}
6970
7071bool AccountsService::demoEdges() const
@@ -74,8 +75,12 @@ bool AccountsService::demoEdges() const
7475
7576void AccountsService::setDemoEdges(bool demoEdges)
7677{
77− m_demoEdges = demoEdges;
78− m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges", demoEdges);
78+ if (m_demoEdges != demoEdges) {
79+ m_demoEdges = demoEdges;
80+ m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges", demoEdges);
81+
82+ Q_EMIT demoEdgesChanged();
83+ }
7984}
8085
8186bool AccountsService::enableLauncherWhileLocked() const
@@ -110,7 +115,12 @@ bool AccountsService::hereEnabled() const
110115
111116void AccountsService::setHereEnabled(bool enabled)
112117{
113− m_service->setUserProperty(m_user, "com.ubuntu.location.providers.here.AccountsService", "LicenseAccepted", enabled);
118+ if (m_hereEnabled != enabled) {
119+ m_hereEnabled = enabled;
120+ m_service->setUserProperty(m_user, "com.ubuntu.location.providers.here.AccountsService", "LicenseAccepted", enabled);
121+
122+ Q_EMIT hereEnabledChanged();
123+ }
114124}
115125
116126QString AccountsService::hereLicensePath() const
@@ -123,88 +133,276 @@ bool AccountsService::hereLicensePathValid() const
123133 return !m_hereLicensePath.isNull();
124134}
125135
126−void AccountsService::updateDemoEdges()
136+void AccountsService::updateDemoEdges(bool async)
127137{
128− auto demoEdges = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService", "demo-edges").toBool();
129− if (m_demoEdges != demoEdges) {
130− m_demoEdges = demoEdges;
131− Q_EMIT demoEdgesChanged();
138+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
139+ "com.canonical.unity.AccountsService",
140+ "demo-edges");
141+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
142+
143+ connect(watcher, &QDBusPendingCallWatcher::finished,
144+ this, [this](QDBusPendingCallWatcher* watcher) {
145+
146+ QDBusPendingReply<QDBusVariant> reply = *watcher;
147+ if (reply.isError()) {
148+ qWarning() << "Failed to get 'demo-edges' property - " << reply.error().message();
149+ watcher->deleteLater();
150+ return;
151+ }
152+
153+ auto demoEdges = reply.value().variant().toBool();
154+ if (m_demoEdges != demoEdges) {
155+ m_demoEdges = demoEdges;
156+ Q_EMIT demoEdgesChanged();
157+ }
158+ watcher->deleteLater();
159+ });
160+ if (!async) {
161+ watcher->waitForFinished();
162+ delete watcher;
132163 }
133164}
134165
135−void AccountsService::updateEnableLauncherWhileLocked()
166+void AccountsService::updateEnableLauncherWhileLocked(bool async)
136167{
137− auto enableLauncherWhileLocked = m_service->getUserProperty(m_user, "com.ubuntu.AccountsService.SecurityPrivacy", "EnableLauncherWhileLocked").toBool();
138− if (m_enableLauncherWhileLocked != enableLauncherWhileLocked) {
139− m_enableLauncherWhileLocked = enableLauncherWhileLocked;
140− Q_EMIT enableLauncherWhileLockedChanged();
168+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
169+ "com.ubuntu.AccountsService.SecurityPrivacy",
170+ "EnableLauncherWhileLocked");
171+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
172+
173+ connect(watcher, &QDBusPendingCallWatcher::finished,
174+ this, [this](QDBusPendingCallWatcher* watcher) {
175+
176+ QDBusPendingReply<QDBusVariant> reply = *watcher;
177+ if (reply.isError()) {
178+ qWarning() << "Failed to get 'EnableLauncherWhileLocked' property - " << reply.error().message();
179+ watcher->deleteLater();
180+ return;
181+ }
182+
183+ auto enableLauncherWhileLocked = reply.value().variant().toBool();
184+ if (m_enableLauncherWhileLocked != enableLauncherWhileLocked) {
185+ m_enableLauncherWhileLocked = enableLauncherWhileLocked;
186+ Q_EMIT enableLauncherWhileLockedChanged();
187+ }
188+ watcher->deleteLater();
189+ });
190+ if (!async) {
191+ watcher->waitForFinished();
192+ delete watcher;
141193 }
142194}
143195
144−void AccountsService::updateEnableIndicatorsWhileLocked()
196+void AccountsService::updateEnableIndicatorsWhileLocked(bool async)
145197{
146− auto enableIndicatorsWhileLocked = m_service->getUserProperty(m_user, "com.ubuntu.AccountsService.SecurityPrivacy", "EnableIndicatorsWhileLocked").toBool();
147− if (m_enableIndicatorsWhileLocked != enableIndicatorsWhileLocked) {
148− m_enableIndicatorsWhileLocked = enableIndicatorsWhileLocked;
149− Q_EMIT enableIndicatorsWhileLockedChanged();
198+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
199+ "com.ubuntu.AccountsService.SecurityPrivacy",
200+ "EnableIndicatorsWhileLocked");
201+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
202+
203+ connect(watcher, &QDBusPendingCallWatcher::finished,
204+ this, [this](QDBusPendingCallWatcher* watcher) {
205+
206+ QDBusPendingReply<QDBusVariant> reply = *watcher;
207+ if (reply.isError()) {
208+ qWarning() << "Failed to get 'EnableIndicatorsWhileLocked' property - " << reply.error().message();
209+ watcher->deleteLater();
210+ return;
211+ }
212+
213+ auto enableIndicatorsWhileLocked = reply.value().variant().toBool();
214+ if (m_enableIndicatorsWhileLocked != enableIndicatorsWhileLocked) {
215+ m_enableIndicatorsWhileLocked = enableIndicatorsWhileLocked;
216+ Q_EMIT enableIndicatorsWhileLockedChanged();
217+ }
218+ watcher->deleteLater();
219+ });
220+ if (!async) {
221+ watcher->waitForFinished();
222+ delete watcher;
150223 }
151224}
152225
153−void AccountsService::updateBackgroundFile()
226+void AccountsService::updateBackgroundFile(bool async)
154227{
155− QString backgroundFile = m_service->getUserProperty(m_user, "org.freedesktop.Accounts.User", "BackgroundFile").toString();
156− if (m_backgroundFile != backgroundFile) {
157− m_backgroundFile = backgroundFile;
158− Q_EMIT backgroundFileChanged();
228+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
229+ "org.freedesktop.Accounts.User",
230+ "BackgroundFile");
231+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
232+
233+ connect(watcher, &QDBusPendingCallWatcher::finished,
234+ this, [this](QDBusPendingCallWatcher* watcher) {
235+
236+ QDBusPendingReply<QDBusVariant> reply = *watcher;
237+ if (reply.isError()) {
238+ qWarning() << "Failed to get 'BackgroundFile' property - " << reply.error().message();
239+ watcher->deleteLater();
240+ return;
241+ }
242+
243+ auto backgroundFile = reply.value().variant().toString();
244+ if (m_backgroundFile != backgroundFile) {
245+ m_backgroundFile = backgroundFile;
246+ Q_EMIT backgroundFileChanged();
247+ }
248+ watcher->deleteLater();
249+ });
250+ if (!async) {
251+ watcher->waitForFinished();
252+ delete watcher;
159253 }
160254}
161255
162−void AccountsService::updateStatsWelcomeScreen()
256+void AccountsService::updateStatsWelcomeScreen(bool async)
163257{
164− bool statsWelcomeScreen = m_service->getUserProperty(m_user, "com.ubuntu.touch.AccountsService.SecurityPrivacy", "StatsWelcomeScreen").toBool();
165− if (m_statsWelcomeScreen != statsWelcomeScreen) {
166− m_statsWelcomeScreen = statsWelcomeScreen;
167− Q_EMIT statsWelcomeScreenChanged();
258+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
259+ "com.ubuntu.touch.AccountsService.SecurityPrivacy",
260+ "StatsWelcomeScreen");
261+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
262+
263+ connect(watcher, &QDBusPendingCallWatcher::finished,
264+ this, [this](QDBusPendingCallWatcher* watcher) {
265+
266+ QDBusPendingReply<QDBusVariant> reply = *watcher;
267+ if (reply.isError()) {
268+ qWarning() << "Failed to get 'StatsWelcomeScreen' property - " << reply.error().message();
269+ watcher->deleteLater();
270+ return;
271+ }
272+
273+ auto statsWelcomeScreen = reply.value().variant().toBool();
274+ if (m_statsWelcomeScreen != statsWelcomeScreen) {
275+ m_statsWelcomeScreen = statsWelcomeScreen;
276+ Q_EMIT statsWelcomeScreenChanged();
277+ }
278+ watcher->deleteLater();
279+ });
280+ if (!async) {
281+ watcher->waitForFinished();
282+ delete watcher;
168283 }
169284}
170285
171−void AccountsService::updatePasswordDisplayHint()
286+void AccountsService::updatePasswordDisplayHint(bool async)
172287{
173− PasswordDisplayHint passwordDisplayHint = (PasswordDisplayHint)m_service->getUserProperty(m_user, "com.ubuntu.AccountsService.SecurityPrivacy", "PasswordDisplayHint").toInt();
174− if (m_passwordDisplayHint != passwordDisplayHint) {
175− m_passwordDisplayHint = passwordDisplayHint;
176− Q_EMIT passwordDisplayHintChanged();
288+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
289+ "com.ubuntu.AccountsService.SecurityPrivacy",
290+ "PasswordDisplayHint");
291+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
292+
293+ connect(watcher, &QDBusPendingCallWatcher::finished,
294+ this, [this](QDBusPendingCallWatcher* watcher) {
295+
296+ QDBusPendingReply<QDBusVariant> reply = *watcher;
297+ if (reply.isError()) {
298+ qWarning() << "Failed to get 'PasswordDisplayHint' property - " << reply.error().message();
299+ watcher->deleteLater();
300+ return;
301+ }
302+
303+ PasswordDisplayHint passwordDisplayHint = (PasswordDisplayHint)reply.value().variant().toInt();
304+ if (m_passwordDisplayHint != passwordDisplayHint) {
305+ m_passwordDisplayHint = passwordDisplayHint;
306+ Q_EMIT passwordDisplayHintChanged();
307+ }
308+ watcher->deleteLater();
309+ });
310+ if (!async) {
311+ watcher->waitForFinished();
312+ delete watcher;
177313 }
178314}
179315
180−void AccountsService::updateFailedLogins()
316+void AccountsService::updateFailedLogins(bool async)
181317{
182− uint failedLogins = m_service->getUserProperty(m_user, "com.canonical.unity.AccountsService.Private", "FailedLogins").toUInt();
183− if (m_failedLogins != failedLogins) {
184− m_failedLogins = failedLogins;
185− Q_EMIT failedLoginsChanged();
318+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
319+ "com.canonical.unity.AccountsService.Private",
320+ "FailedLogins");
321+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
322+
323+ connect(watcher, &QDBusPendingCallWatcher::finished,
324+ this, [this](QDBusPendingCallWatcher* watcher) {
325+
326+ QDBusPendingReply<QDBusVariant> reply = *watcher;
327+ if (reply.isError()) {
328+ qWarning() << "Failed to get 'FailedLogins' property - " << reply.error().message();
329+ watcher->deleteLater();
330+ return;
331+ }
332+
333+ uint failedLogins = reply.value().variant().toUInt();
334+ if (m_failedLogins != failedLogins) {
335+ m_failedLogins = failedLogins;
336+ Q_EMIT failedLoginsChanged();
337+ }
338+ watcher->deleteLater();
339+ });
340+ if (!async) {
341+ watcher->waitForFinished();
342+ delete watcher;
186343 }
187344}
188345
189−void AccountsService::updateHereEnabled()
346+void AccountsService::updateHereEnabled(bool async)
190347{
191− bool hereEnabled = m_service->getUserProperty(m_user, "com.ubuntu.location.providers.here.AccountsService", "LicenseAccepted").toBool();
192− if (m_hereEnabled != hereEnabled) {
193− m_hereEnabled = hereEnabled;
194− Q_EMIT hereEnabledChanged();
348+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
349+ "com.ubuntu.location.providers.here.AccountsService",
350+ "LicenseAccepted");
351+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
352+
353+ connect(watcher, &QDBusPendingCallWatcher::finished,
354+ this, [this](QDBusPendingCallWatcher* watcher) {
355+
356+ QDBusPendingReply<QDBusVariant> reply = *watcher;
357+ if (reply.isError()) {
358+ qWarning() << "Failed to get 'LicenseAccepted' property - " << reply.error().message();
359+ watcher->deleteLater();
360+ return;
361+ }
362+
363+ auto hereEnabled = reply.value().variant().toBool();
364+ if (m_hereEnabled != hereEnabled) {
365+ m_hereEnabled = hereEnabled;
366+ Q_EMIT hereEnabledChanged();
367+ }
368+ watcher->deleteLater();
369+ });
370+ if (!async) {
371+ watcher->waitForFinished();
372+ delete watcher;
195373 }
196374}
197375
198−void AccountsService::updateHereLicensePath()
376+void AccountsService::updateHereLicensePath(bool async)
199377{
200− QString hereLicensePath = m_service->getUserProperty(m_user, "com.ubuntu.location.providers.here.AccountsService", "LicenseBasePath").toString();
378+ QDBusPendingCall pendingReply = m_service->getUserPropertyAsync(m_user,
379+ "com.ubuntu.location.providers.here.AccountsService",
380+ "LicenseBasePath");
381+ QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pendingReply, this);
382+
383+ connect(watcher, &QDBusPendingCallWatcher::finished,
384+ this, [this](QDBusPendingCallWatcher* watcher) {
385+
386+ QDBusPendingReply<QDBusVariant> reply = *watcher;
387+ if (reply.isError()) {
388+ qWarning() << "Failed to get 'LicenseBasePath' property - " << reply.error().message();
389+ watcher->deleteLater();
390+ return;
391+ }
201392
202− if (hereLicensePath.isEmpty() || !QFile::exists(hereLicensePath))
203− hereLicensePath = "";
393+ auto hereLicensePath = reply.value().variant().toString();
394+ if (hereLicensePath.isEmpty() || !QFile::exists(hereLicensePath))
395+ hereLicensePath = "";
204396
205− if (m_hereLicensePath.isNull() || m_hereLicensePath != hereLicensePath) {
206− m_hereLicensePath = hereLicensePath;
207− Q_EMIT hereLicensePathChanged();
397+ if (m_hereLicensePath.isNull() || m_hereLicensePath != hereLicensePath) {
398+ m_hereLicensePath = hereLicensePath;
399+ Q_EMIT hereLicensePathChanged();
400+ }
401+ watcher->deleteLater();
402+ });
403+ if (!async) {
404+ watcher->waitForFinished();
405+ delete watcher;
208406 }
209407}
210408
@@ -215,8 +413,12 @@ uint AccountsService::failedLogins() const
215413
216414void AccountsService::setFailedLogins(uint failedLogins)
217415{
218− m_failedLogins = failedLogins;
219− m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService.Private", "FailedLogins", failedLogins);
416+ if (m_failedLogins != failedLogins) {
417+ m_failedLogins = failedLogins;
418+ m_service->setUserProperty(m_user, "com.canonical.unity.AccountsService.Private", "FailedLogins", failedLogins);
419+
420+ Q_EMIT failedLoginsChanged();
421+ }
220422}
221423
222424void AccountsService::propertiesChanged(const QString &user, const QString &interface, const QStringList &changed)