@@ -22,6 +22,7 @@
2222#include "launcherbackend.h"
2323
2424#include <QDir>
25+#include <QDBusArgument>
2526#include <QFileInfo>
2627
2728LauncherBackend::LauncherBackend(bool useStorage, QObject *parent):
@@ -69,7 +70,7 @@ void LauncherBackend::setStoredApplications(const QStringList &appIds)
6970 clearItems();
7071
7172 for (const QString &appId: appIds) {
72− loadDesktopFile(appId, pinnedItems.contains(desktopFile(appId)));
73+ loadApp(makeAppDetails(appId, pinnedItems.contains(desktopFile(appId))));
7374 }
7475
7576 syncToAccounts();
@@ -165,46 +166,45 @@ void LauncherBackend::triggerQuickListAction(const QString &appId, const QString
165166
166167void LauncherBackend::syncFromAccounts()
167168{
168− auto appIds = QStringList();
169+ QList<QVariantMap> apps;
170+
171+ clearItems();
169172
170173 if (m_user != "" && m_accounts != nullptr) {
171− appIds = m_accounts->getUserProperty(m_user, "launcher-items").toStringList();
174+ auto variant = m_accounts->getUserProperty(m_user, "launcher-items");
175+ variant.value<QDBusArgument>() >> apps;
172176 }
173177
174178 // TODO: load default pinned ones from default config, instead of hardcoding here...
175− if (appIds.isEmpty()) {
176− appIds <<
177− "phone-app.desktop" <<
178− "camera-app.desktop" <<
179− "gallery-app.desktop" <<
180− "facebook-webapp.desktop" <<
181− "webbrowser-app.desktop" <<
182− "twitter-webapp.desktop" <<
183− "gmail-webapp.desktop" <<
184− "ubuntu-weather-app.desktop" <<
185− "notes-app.desktop" <<
186− "calendar-app.desktop";
179+ if (apps.isEmpty()) {
180+ apps <<
181+ makeAppDetails("phone-app.desktop", true) <<
182+ makeAppDetails("camera-app.desktop", true) <<
183+ makeAppDetails("gallery-app.desktop", true) <<
184+ makeAppDetails("facebook-webapp.desktop", true) <<
185+ makeAppDetails("webbrowser-app.desktop", true) <<
186+ makeAppDetails("twitter-webapp.desktop", true) <<
187+ makeAppDetails("gmail-webapp.desktop", true) <<
188+ makeAppDetails("ubuntu-weather-app.desktop", true) <<
189+ makeAppDetails("notes-app.desktop", true) <<
190+ makeAppDetails("calendar-app.desktop", true);
187191 }
188192
189− setStoredApplications(appIds);
190−
191− // Mark all apps as pinned (since we just refreshed the set)
192− for (LauncherBackendItem &app: m_storedApps) {
193− app.pinned = true;
193+ for (const QVariant &app: apps) {
194+ loadApp(app.toMap());
194195 }
195196}
196197
197198void LauncherBackend::syncToAccounts()
198199{
199− auto pinnedItems = QStringList();
200− for (LauncherBackendItem &app: m_storedApps) {
201− if (app.pinned) {
202− pinnedItems.append(app.settings->fileName());
200+ if (m_user != "" && m_accounts != nullptr) {
201+ QList<QVariantMap> items;
202+
203+ for (LauncherBackendItem &app: m_storedApps) {
204+ items << makeAppDetails(app.settings->fileName(), app.pinned);
203205 }
204− }
205206
206− if (m_user != "" && m_accounts != nullptr) {
207− m_accounts->setUserProperty(m_user, "launcher-items", QVariant(pinnedItems));
207+ m_accounts->setUserProperty(m_user, "launcher-items", QVariant::fromValue(items));
208208 }
209209}
210210
@@ -214,13 +214,27 @@ QSettings *LauncherBackend::parseDesktopFile(const QString &appId) const
214214 return new QSettings(fullAppId, QSettings::IniFormat);
215215}
216216
217−bool LauncherBackend::loadDesktopFile(const QString &appId, bool isPinned)
217+void LauncherBackend::loadApp(const QVariantMap &details)
218218{
219− auto item = LauncherBackendItem();
219+ auto appId = details.value("id").toString();
220+ auto isPinned = details.value("is-pinned").toBool();
221+
222+ if (appId.isEmpty()) {
223+ return;
224+ }
225+
226+ LauncherBackendItem item;
220227 item.settings = parseDesktopFile(appId);
221228 item.pinned = isPinned;
222229 m_storedApps.append(item);
223− return true; // QSettings doesn't really indicate a failure mode right now
230+}
231+
232+QVariantMap LauncherBackend::makeAppDetails(const QString &appId, bool pinned) const
233+{
234+ QVariantMap details;
235+ details.insert("id", appId);
236+ details.insert("is-pinned", pinned);
237+ return details;
224238}
225239
226240int LauncherBackend::findItem(const QString &appId) const