Merge lp:~stolowski/unity-scope-click/default-department-key into lp:unity-scope-click/devel

Proposed by Paweł Stołowski
Status: Merged
Approved by: Alejandro J. Cura
Approved revision: 348
Merged at revision: 357
Proposed branch: lp:~stolowski/unity-scope-click/default-department-key
Merge into: lp:unity-scope-click/devel
Diff against target: 564 lines (+201/-94)
10 files modified
libclickscope/click/application.h (+5/-2)
libclickscope/click/departments-db.cpp (+19/-0)
libclickscope/click/departments-db.h (+2/-0)
libclickscope/click/interface.cpp (+55/-13)
libclickscope/click/interface.h (+3/-2)
libclickscope/tests/applications/system/address-book-app.desktop (+1/-0)
libclickscope/tests/test_departments-db.cpp (+5/-0)
libclickscope/tests/test_interface.cpp (+104/-51)
scope/clickapps/apps-query.cpp (+1/-20)
scope/tests/test_apps_query.cpp (+6/-6)
To merge this branch: bzr merge lp:~stolowski/unity-scope-click/default-department-key
Reviewer Review Type Date Requested Status
PS Jenkins bot (community) continuous-integration Approve
dobey (community) Approve
Review via email: mp+227547@code.launchpad.net

Commit message

Handle X-Ubuntu-Default-Department-ID key of .desktop files to support departments for preinstalled apps.

Description of the change

Handle X-Ubuntu-Default-Department-ID key of .desktop files to support departments for preinstalled apps.

To post a comment you must log in.
Revision history for this message
dobey (dobey) :
review: Approve
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libclickscope/click/application.h'
2--- libclickscope/click/application.h 2014-05-27 15:02:04 +0000
3+++ libclickscope/click/application.h 2014-07-21 13:01:36 +0000
4@@ -42,10 +42,12 @@
5 std::string icon_url,
6 std::string url,
7 std::string description,
8- std::string main_screenshot
9+ std::string main_screenshot,
10+ std::string default_department
11 ) : Package {name, title, price, icon_url, url},
12 description(description),
13- main_screenshot(main_screenshot)
14+ main_screenshot(main_screenshot),
15+ default_department(default_department)
16 {
17
18 }
19@@ -55,6 +57,7 @@
20 std::string description;
21 std::vector<std::string> keywords;
22 std::string main_screenshot;
23+ std::string default_department;
24 time_t installed_time;
25 };
26
27
28=== modified file 'libclickscope/click/departments-db.cpp'
29--- libclickscope/click/departments-db.cpp 2014-07-17 10:49:54 +0000
30+++ libclickscope/click/departments-db.cpp 2014-07-21 13:01:36 +0000
31@@ -62,6 +62,7 @@
32 insert_dept_id_query_.reset(new QSqlQuery(db_));
33 insert_dept_name_query_.reset(new QSqlQuery(db_));
34 select_pkgs_by_dept_.reset(new QSqlQuery(db_));
35+ select_pkg_by_pkgid_.reset(new QSqlQuery(db_));
36 select_pkgs_by_dept_recursive_.reset(new QSqlQuery(db_));
37 select_parent_dept_.reset(new QSqlQuery(db_));
38 select_children_depts_.reset(new QSqlQuery(db_));
39@@ -75,6 +76,7 @@
40 insert_dept_name_query_->prepare("INSERT OR REPLACE INTO deptnames (deptid, locale, name) VALUES (:deptid, :locale, :name)");
41 select_pkgs_by_dept_->prepare("SELECT pkgid FROM pkgmap WHERE deptid=:deptid");
42 select_pkgs_by_dept_recursive_->prepare("WITH RECURSIVE recdepts(deptid) AS (SELECT deptid FROM depts_v WHERE deptid=:deptid UNION SELECT depts_v.deptid FROM recdepts,depts_v WHERE recdepts.deptid=depts_v.parentid) SELECT pkgid FROM pkgmap NATURAL JOIN recdepts");
43+ select_pkg_by_pkgid_->prepare("SELECT pkgid FROM pkgmap WHERE pkgid=:pkgid");
44 select_children_depts_->prepare("SELECT deptid,(SELECT COUNT(1) from DEPTS_V AS inner WHERE inner.parentid=outer.deptid) FROM DEPTS_V AS outer WHERE parentid=:parentid");
45 select_parent_dept_->prepare("SELECT parentid FROM depts_v WHERE deptid=:deptid");
46 select_dept_name_->prepare("SELECT name FROM deptnames WHERE deptid=:deptid AND locale=:locale");
47@@ -224,6 +226,23 @@
48 return pkgs;
49 }
50
51+bool DepartmentsDb::has_package(const std::string& package_id)
52+{
53+ select_pkg_by_pkgid_->bindValue(":pkgid", QVariant(QString::fromStdString(package_id)));
54+ if (!select_pkg_by_pkgid_->exec())
55+ {
56+ report_db_error(select_parent_dept_->lastError(), "Failed to query for package " + package_id);
57+ }
58+ if (!select_pkg_by_pkgid_->next())
59+ {
60+ select_pkg_by_pkgid_->finish();
61+ return false;
62+ }
63+ select_pkg_by_pkgid_->finish();
64+ return true;
65+
66+}
67+
68 void DepartmentsDb::store_package_mapping(const std::string& package_id, const std::string& department_id)
69 {
70 if (package_id.empty())
71
72=== modified file 'libclickscope/click/departments-db.h'
73--- libclickscope/click/departments-db.h 2014-07-17 06:28:31 +0000
74+++ libclickscope/click/departments-db.h 2014-07-21 13:01:36 +0000
75@@ -66,6 +66,7 @@
76
77 virtual std::string get_department_name(const std::string& department_id, const std::list<std::string>& locales);
78 virtual std::unordered_set<std::string> get_packages_for_department(const std::string& department_id, bool recursive = true);
79+ virtual bool has_package(const std::string& package_id);
80 virtual std::string get_parent_department_id(const std::string& department_id);
81 virtual std::list<DepartmentInfo> get_children_departments(const std::string& department_id);
82
83@@ -95,6 +96,7 @@
84 std::unique_ptr<QSqlQuery> insert_dept_id_query_;
85 std::unique_ptr<QSqlQuery> insert_dept_name_query_;
86 std::unique_ptr<QSqlQuery> select_pkgs_by_dept_;
87+ std::unique_ptr<QSqlQuery> select_pkg_by_pkgid_;
88 std::unique_ptr<QSqlQuery> select_pkgs_by_dept_recursive_;
89 std::unique_ptr<QSqlQuery> select_parent_dept_;
90 std::unique_ptr<QSqlQuery> select_children_depts_;
91
92=== modified file 'libclickscope/click/interface.cpp'
93--- libclickscope/click/interface.cpp 2014-07-17 18:37:23 +0000
94+++ libclickscope/click/interface.cpp 2014-07-21 13:01:36 +0000
95@@ -52,6 +52,7 @@
96
97 #include "interface.h"
98 #include <click/key_file_locator.h>
99+#include <click/departments-db.h>
100
101 #include <click/click-i18n.h>
102
103@@ -85,6 +86,7 @@
104 static const std::string DESKTOP_FILE_KEY_APP_ID("X-Ubuntu-Application-ID");
105 static const std::string DESKTOP_FILE_KEY_DOMAIN("X-Ubuntu-Gettext-Domain");
106 static const std::string DESKTOP_FILE_UBUNTU_TOUCH("X-Ubuntu-Touch");
107+static const std::string DESKTOP_FILE_UBUNTU_DEFAULT_DEPARTMENT("X-Ubuntu-Default-Department-ID");
108 static const std::string DESKTOP_FILE_COMMENT("Comment");
109 static const std::string DESKTOP_FILE_SCREENSHOT("X-Screenshot");
110 static const std::string DESKTOP_FILE_NODISPLAY("NoDisplay");
111@@ -169,6 +171,10 @@
112 DESKTOP_FILE_KEY_KEYWORDS);
113 }
114
115+ if (keyFile.has_key(DESKTOP_FILE_GROUP, DESKTOP_FILE_UBUNTU_DEFAULT_DEPARTMENT)) {
116+ app.default_department = keyFile.get_string(DESKTOP_FILE_GROUP, DESKTOP_FILE_UBUNTU_DEFAULT_DEPARTMENT);
117+ }
118+
119 if (keyFile.has_key(DESKTOP_FILE_GROUP, DESKTOP_FILE_KEY_APP_ID)) {
120 QString app_id = QString::fromStdString(keyFile.get_string(
121 DESKTOP_FILE_GROUP,
122@@ -229,14 +235,33 @@
123 * Find all of the installed apps matching @search_query in a timeout.
124 */
125 std::vector<click::Application> Interface::find_installed_apps(const std::string& search_query,
126- const std::unordered_set<std::string>& packages_in_department,
127- bool department_filter)
128+ const std::string& current_department,
129+ const std::shared_ptr<click::DepartmentsDb>& depts_db)
130 {
131+ //
132+ // only apply department filtering if not in root of all departments.
133+ bool apply_department_filter = (search_query.empty() && !current_department.empty());
134+
135+ // get the set of packages that belong to current deparment;
136+ std::unordered_set<std::string> packages_in_department;
137+ if (depts_db && apply_department_filter)
138+ {
139+ try
140+ {
141+ packages_in_department = depts_db->get_packages_for_department(current_department);
142+ }
143+ catch (const std::exception& e)
144+ {
145+ qWarning() << "Failed to get packages of department" << QString::fromStdString(current_department);
146+ apply_department_filter = false; // disable so that we are not loosing any apps if something goes wrong
147+ }
148+ }
149+
150 std::vector<Application> result;
151
152 bool include_desktop_results = show_desktop_apps();
153
154- auto enumerator = [&result, this, search_query, packages_in_department, department_filter, include_desktop_results]
155+ auto enumerator = [&result, this, search_query, current_department, packages_in_department, apply_department_filter, include_desktop_results, depts_db]
156 (const unity::util::IniParser& keyFile, const std::string& filename)
157 {
158 if (keyFile.has_group(DESKTOP_FILE_GROUP) == false) {
159@@ -253,17 +278,34 @@
160 auto app = load_app_from_desktop(keyFile, filename);
161
162 // check if apps is present in current department
163- if (department_filter)
164+ if (apply_department_filter)
165 {
166- if (!app.name.empty()) // app from click package
167- {
168- if (packages_in_department.find(app.name) == packages_in_department.end())
169- return;
170- }
171- else // non-click app, match on desktop file name
172- {
173- if (packages_in_department.find(filename) == packages_in_department.end())
174- return;
175+ // app from click package has non-empty name; for non-click apps use desktop filename
176+ const std::string key = app.name.empty() ? filename : app.name;
177+ if (packages_in_department.find(key) == packages_in_department.end())
178+ {
179+ if (app.default_department.empty())
180+ {
181+ // default department not present in the keyfile, skip this app
182+ return;
183+ }
184+ else
185+ {
186+ // default department not empty: check if this app is in a different
187+ // department in the db (i.e. got moved from the default department);
188+ if (depts_db->has_package(key))
189+ {
190+ // app is now in a different department
191+ return;
192+ }
193+
194+ if (app.default_department != current_department)
195+ {
196+ return;
197+ }
198+
199+ // else - this package is in current department
200+ }
201 }
202 }
203
204
205=== modified file 'libclickscope/click/interface.h'
206--- libclickscope/click/interface.h 2014-07-15 14:36:21 +0000
207+++ libclickscope/click/interface.h 2014-07-21 13:01:36 +0000
208@@ -44,6 +44,7 @@
209 {
210
211 class KeyFileLocator;
212+class DepartmentsDb;
213
214 // Hash map of desktop files that are not yet click packages
215 const std::unordered_set<std::string>& nonClickDesktopFiles();
216@@ -92,8 +93,8 @@
217 const std::string& filename);
218 static std::vector<Application> sort_apps(const std::vector<Application>& apps);
219 virtual std::vector<Application> find_installed_apps(const std::string& search_query,
220- const std::unordered_set<std::string>& packages_in_department = std::unordered_set<std::string>(),
221- bool department_filter = false);
222+ const std::string& current_department = "",
223+ const std::shared_ptr<click::DepartmentsDb>& depts_db = nullptr);
224
225 static bool is_non_click_app(const QString& filename);
226
227
228=== modified file 'libclickscope/tests/applications/system/address-book-app.desktop'
229--- libclickscope/tests/applications/system/address-book-app.desktop 2014-02-13 20:48:58 +0000
230+++ libclickscope/tests/applications/system/address-book-app.desktop 2014-07-21 13:01:36 +0000
231@@ -11,4 +11,5 @@
232 X-Ubuntu-StageHint=SideStage
233 X-Ubuntu-Gettext-Domain=address-book-app
234 X-Ubuntu-Single-Instance=true
235+X-Ubuntu-Default-Department-ID=accessories
236 # this one has no screenshot nor comment, to test how it breaks
237
238=== modified file 'libclickscope/tests/test_departments-db.cpp'
239--- libclickscope/tests/test_departments-db.cpp 2014-07-17 10:49:54 +0000
240+++ libclickscope/tests/test_departments-db.cpp 2014-07-21 13:01:36 +0000
241@@ -54,6 +54,7 @@
242 EXPECT_FALSE(insert_dept_name_query_->isActive());
243 EXPECT_FALSE(select_pkgs_by_dept_->isActive());
244 EXPECT_FALSE(select_pkgs_by_dept_recursive_->isActive());
245+ EXPECT_FALSE(select_pkg_by_pkgid_->isActive());
246 EXPECT_FALSE(select_parent_dept_->isActive());
247 EXPECT_FALSE(select_children_depts_->isActive());
248 EXPECT_FALSE(select_dept_name_->isActive());
249@@ -177,6 +178,10 @@
250 TEST_F(DepartmentsDbTest, testPackageLookup)
251 {
252 {
253+ EXPECT_TRUE(db->has_package("game1"));
254+ EXPECT_FALSE(db->has_package("foooo"));
255+ }
256+ {
257 auto pkgs = db->get_packages_for_department("rpg", false);
258 EXPECT_EQ(1u, pkgs.size());
259 EXPECT_TRUE(pkgs.find("game1") != pkgs.end());
260
261=== modified file 'libclickscope/tests/test_interface.cpp'
262--- libclickscope/tests/test_interface.cpp 2014-07-15 21:30:03 +0000
263+++ libclickscope/tests/test_interface.cpp 2014-07-21 13:01:36 +0000
264@@ -42,6 +42,7 @@
265
266 #include <click/interface.h>
267 #include <click/key_file_locator.h>
268+#include <click/departments-db.h>
269
270 using namespace click;
271 using namespace ::testing;
272@@ -53,25 +54,31 @@
273 // Maintaining this list here will become tedious over time.
274 static const std::vector<click::Application> non_desktop_applications =
275 {
276- {"com.ubuntu.stock-ticker-mobile", "Stock Ticker", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.stock-ticker-mobile/icons/stock_icon_48.png", "application:///com.ubuntu.stock-ticker-mobile_stock-ticker-mobile_0.3.7.66.desktop", "", ""},
277- {"", "Weather", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.weather/./weather64.png", "application:///com.ubuntu.weather_weather_1.0.168.desktop", "", ""},
278- {"com.ubuntu.developer.webapps.webapp-twitter", "Twitter", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-twitter/./twitter.png", "application:///com.ubuntu.developer.webapps.webapp-twitter_webapp-twitter_1.0.5.desktop", "", ""},
279- {"com.ubuntu.music", "Music", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.music/images/music.png", "application:///com.ubuntu.music_music_1.1.329.desktop", "", ""},
280- {"com.ubuntu.clock", "Clock", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.clock/./clock64.png", "application:///com.ubuntu.clock_clock_1.0.300.desktop", "", ""},
281- {"com.ubuntu.dropping-letters", "Dropping Letters", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.dropping-letters/dropping-letters.png", "application:///com.ubuntu.dropping-letters_dropping-letters_0.1.2.2.43.desktop", "", ""},
282- {"com.ubuntu.developer.webapps.webapp-gmail", "Gmail", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-gmail/./gmail.png", "application:///com.ubuntu.developer.webapps.webapp-gmail_webapp-gmail_1.0.8.desktop", "", ""},
283- {"com.ubuntu.terminal", "Terminal", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.terminal/./terminal64.png", "application:///com.ubuntu.terminal_terminal_0.5.29.desktop", "", ""},
284- {"com.ubuntu.calendar", "Calendar", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calendar/./calendar64.png", "application:///com.ubuntu.calendar_calendar_0.4.182.desktop", "", ""},
285- {"com.ubuntu.notes", "Notes", 0.0, "image://theme/notepad", "application:///com.ubuntu.notes_notes_1.4.242.desktop", "", ""},
286- {"com.ubuntu.developer.webapps.webapp-amazon", "Amazon", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-amazon/./amazon.png", "application:///com.ubuntu.developer.webapps.webapp-amazon_webapp-amazon_1.0.6.desktop", "", ""},
287- {"com.ubuntu.shorts", "Shorts", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.shorts/./rssreader64.png", "application:///com.ubuntu.shorts_shorts_0.2.162.desktop", "", ""},
288- {"com.ubuntu.filemanager", "File Manager", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.filemanager/./filemanager64.png", "application:///com.ubuntu.filemanager_filemanager_0.1.1.97.desktop", "", ""},
289- {"com.ubuntu.calculator", "Calculator", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator/./calculator64.png", "application:///com.ubuntu.calculator_calculator_0.1.3.206.desktop", "", ""},
290- {"com.ubuntu.sudoku", "Sudoku", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.sudoku/SudokuGameIcon.png", "application:///com.ubuntu.sudoku_sudoku_1.0.142.desktop", "", ""},
291- {"com.ubuntu.developer.webapps.webapp-ebay", "eBay", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-ebay/./ebay.png", "application:///com.ubuntu.developer.webapps.webapp-ebay_webapp-ebay_1.0.8.desktop", "", ""},
292- {"com.ubuntu.developer.webapps.webapp-facebook", "Facebook", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-facebook/./facebook.png", "application:///com.ubuntu.developer.webapps.webapp-facebook_webapp-facebook_1.0.5.desktop", "", ""},
293- {"", "Messaging", 0.0, "image://theme/messages-app", "application:///messaging-app.desktop", "Messaging application", "/usr/share/messaging-app/assets/messaging-app-screenshot.png"},
294- {"", "Contacts", 0.0, "image://theme/contacts-app", "application:///address-book-app.desktop", "", ""}
295+ {"com.ubuntu.stock-ticker-mobile", "Stock Ticker", 0.0,
296+ "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.stock-ticker-mobile/icons/stock_icon_48.png", "application:///com.ubuntu.stock-ticker-mobile_stock-ticker-mobile_0.3.7.66.desktop", "", "", ""},
297+ {"", "Weather", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.weather/./weather64.png", "application:///com.ubuntu.weather_weather_1.0.168.desktop", "", "", ""},
298+ {"com.ubuntu.developer.webapps.webapp-twitter", "Twitter", 0.0,
299+ "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-twitter/./twitter.png", "application:///com.ubuntu.developer.webapps.webapp-twitter_webapp-twitter_1.0.5.desktop", "", "", ""},
300+ {"com.ubuntu.music", "Music", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.music/images/music.png", "application:///com.ubuntu.music_music_1.1.329.desktop", "", "", ""},
301+ {"com.ubuntu.clock", "Clock", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.clock/./clock64.png", "application:///com.ubuntu.clock_clock_1.0.300.desktop", "", "", ""},
302+ {"com.ubuntu.dropping-letters", "Dropping Letters", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.dropping-letters/dropping-letters.png", "application:///com.ubuntu.dropping-letters_dropping-letters_0.1.2.2.43.desktop", "", "", ""},
303+ {"com.ubuntu.developer.webapps.webapp-gmail", "Gmail", 0.0,
304+ "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-gmail/./gmail.png", "application:///com.ubuntu.developer.webapps.webapp-gmail_webapp-gmail_1.0.8.desktop", "", "", ""},
305+ {"com.ubuntu.terminal", "Terminal", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.terminal/./terminal64.png", "application:///com.ubuntu.terminal_terminal_0.5.29.desktop", "", "", ""},
306+ {"com.ubuntu.calendar", "Calendar", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calendar/./calendar64.png", "application:///com.ubuntu.calendar_calendar_0.4.182.desktop", "", "", ""},
307+ {"com.ubuntu.notes", "Notes", 0.0, "image://theme/notepad", "application:///com.ubuntu.notes_notes_1.4.242.desktop", "", "", ""},
308+ {"com.ubuntu.developer.webapps.webapp-amazon", "Amazon", 0.0,
309+ "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-amazon/./amazon.png", "application:///com.ubuntu.developer.webapps.webapp-amazon_webapp-amazon_1.0.6.desktop", "", "", ""},
310+ {"com.ubuntu.shorts", "Shorts", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.shorts/./rssreader64.png", "application:///com.ubuntu.shorts_shorts_0.2.162.desktop", "", "", ""},
311+ {"com.ubuntu.filemanager", "File Manager", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.filemanager/./filemanager64.png", "application:///com.ubuntu.filemanager_filemanager_0.1.1.97.desktop", "", "", ""},
312+ {"com.ubuntu.calculator", "Calculator", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.calculator/./calculator64.png", "application:///com.ubuntu.calculator_calculator_0.1.3.206.desktop", "", "", ""},
313+ {"com.ubuntu.sudoku", "Sudoku", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.sudoku/SudokuGameIcon.png", "application:///com.ubuntu.sudoku_sudoku_1.0.142.desktop", "", "", ""},
314+ {"com.ubuntu.developer.webapps.webapp-ebay", "eBay", 0.0,
315+ "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-ebay/./ebay.png", "application:///com.ubuntu.developer.webapps.webapp-ebay_webapp-ebay_1.0.8.desktop", "", "", ""},
316+ {"com.ubuntu.developer.webapps.webapp-facebook", "Facebook", 0.0,
317+ "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.developer.webapps.webapp-facebook/./facebook.png", "application:///com.ubuntu.developer.webapps.webapp-facebook_webapp-facebook_1.0.5.desktop", "", "", ""},
318+ {"", "Messaging", 0.0, "image://theme/messages-app", "application:///messaging-app.desktop", "Messaging application", "/usr/share/messaging-app/assets/messaging-app-screenshot.png", ""},
319+ {"", "Contacts", 0.0, "image://theme/contacts-app", "application:///address-book-app.desktop", "", "", ""}
320 };
321
322 static click::Application desktop_application
323@@ -82,6 +89,7 @@
324 "image://theme/sample-desktop-app",
325 "application:///non-click-app-without-exception.desktop",
326 "multiline description goes here",
327+ "",
328 ""
329 };
330
331@@ -182,6 +190,50 @@
332 EXPECT_TRUE(results.empty());
333 }
334
335+//
336+// test that application with a default department id key in the desktop
337+// file is returned when department matches
338+TEST(ClickInterface, testFindAppsWithAppWithDefaultDepartmentId)
339+{
340+ QSharedPointer<click::KeyFileLocator> keyFileLocator(
341+ new click::KeyFileLocator(
342+ testing::systemApplicationsDirectoryForTesting(),
343+ testing::userApplicationsDirectoryForTesting()));
344+
345+ click::Interface iface(keyFileLocator);
346+
347+ auto depts_db = std::make_shared<click::DepartmentsDb>(":memory:");
348+ auto results = iface.find_installed_apps("", "accessories", depts_db);
349+
350+ EXPECT_EQ(1u, results.size());
351+ EXPECT_EQ("Contacts", results.begin()->title);
352+}
353+
354+TEST(ClickInterface, testFindAppsWithAppWithDefaultDepartmentIdOverriden)
355+{
356+ QSharedPointer<click::KeyFileLocator> keyFileLocator(
357+ new click::KeyFileLocator(
358+ testing::systemApplicationsDirectoryForTesting(),
359+ testing::userApplicationsDirectoryForTesting()));
360+
361+ click::Interface iface(keyFileLocator);
362+
363+ auto depts_db = std::make_shared<click::DepartmentsDb>(":memory:");
364+
365+ depts_db->store_department_name("utilities", "", "Utilities");
366+ depts_db->store_department_name("accessories", "", "Accessories");
367+
368+ auto results = iface.find_installed_apps("", "utilies", depts_db);
369+ EXPECT_EQ(0, results.size());
370+
371+ // address book applicaton moved to utilities
372+ depts_db->store_package_mapping("address-book-app.desktop", "utilities");
373+ results = iface.find_installed_apps("", "utilities", depts_db);
374+
375+ EXPECT_EQ(1u, results.size());
376+ EXPECT_EQ("Contacts", results.begin()->title);
377+}
378+
379 TEST(ClickInterface, testFindAppsInDirSorted)
380 {
381 QSharedPointer<click::KeyFileLocator> keyFileLocator(
382@@ -194,8 +246,9 @@
383 auto results = iface.find_installed_apps("ock");
384
385 const std::vector<click::Application> expected_results = {
386- {"com.ubuntu.clock", "Clock", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.clock/./clock64.png", "application:///com.ubuntu.clock_clock_1.0.300.desktop", "", ""},
387- {"com.ubuntu.stock-ticker-mobile", "Stock Ticker", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.stock-ticker-mobile/icons/stock_icon_48.png", "application:///com.ubuntu.stock-ticker-mobile_stock-ticker-mobile_0.3.7.66.desktop", "", ""},
388+ {"com.ubuntu.clock", "Clock", 0.0, "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.clock/./clock64.png", "application:///com.ubuntu.clock_clock_1.0.300.desktop", "", "", ""},
389+ {"com.ubuntu.stock-ticker-mobile", "Stock Ticker", 0.0,
390+ "/usr/share/click/preinstalled/.click/users/@all/com.ubuntu.stock-ticker-mobile/icons/stock_icon_48.png", "application:///com.ubuntu.stock-ticker-mobile_stock-ticker-mobile_0.3.7.66.desktop", "", "", ""},
391 };
392 EXPECT_EQ(expected_results, results);
393 }
394@@ -203,19 +256,19 @@
395 TEST(ClickInterface, testSortApps)
396 {
397 std::vector<click::Application> apps = {
398- {"", "Sudoku", 0.0, "", "", "", ""},
399- {"", "eBay", 0.0, "", "", "", ""},
400- {"", "Facebook", 0.0, "", "", "", ""},
401- {"", "Messaging", 0.0, "", "", "", ""},
402- {"", "Contacts", 0.0, "", "", "", ""},
403+ {"", "Sudoku", 0.0, "", "", "", "", ""},
404+ {"", "eBay", 0.0, "", "", "", "", ""},
405+ {"", "Facebook", 0.0, "", "", "", "", ""},
406+ {"", "Messaging", 0.0, "", "", "", "", ""},
407+ {"", "Contacts", 0.0, "", "", "", "", ""},
408 };
409
410 std::vector<click::Application> expected = {
411- {"", "Contacts", 0.0, "", "", "", ""},
412- {"", "eBay", 0.0, "", "", "", ""},
413- {"", "Facebook", 0.0, "", "", "", ""},
414- {"", "Messaging", 0.0, "", "", "", ""},
415- {"", "Sudoku", 0.0, "", "", "", ""},
416+ {"", "Contacts", 0.0, "", "", "", "", ""},
417+ {"", "eBay", 0.0, "", "", "", "", ""},
418+ {"", "Facebook", 0.0, "", "", "", "", ""},
419+ {"", "Messaging", 0.0, "", "", "", "", ""},
420+ {"", "Sudoku", 0.0, "", "", "", "", ""},
421 };
422
423 ASSERT_EQ(setenv(Configuration::LANGUAGE_ENVVAR, "en_US.UTF-8", 1), 0);
424@@ -226,13 +279,13 @@
425 TEST(ClickInterface, testSortAppsWithDuplicates)
426 {
427 std::vector<click::Application> apps = {
428- {"com.sudoku.sudoku", "Sudoku", 0.0, "", "", "", ""},
429- {"com.canonical.sudoku", "Sudoku", 0.0, "", "", "", ""},
430+ {"com.sudoku.sudoku", "Sudoku", 0.0, "", "", "", "", ""},
431+ {"com.canonical.sudoku", "Sudoku", 0.0, "", "", "", "", ""},
432 };
433
434 std::vector<click::Application> expected = {
435- {"com.canonical.sudoku", "Sudoku", 0.0, "", "", "", ""},
436- {"com.sudoku.sudoku", "Sudoku", 0.0, "", "", "", ""},
437+ {"com.canonical.sudoku", "Sudoku", 0.0, "", "", "", "", ""},
438+ {"com.sudoku.sudoku", "Sudoku", 0.0, "", "", "", "", ""},
439 };
440
441 ASSERT_EQ(setenv(Configuration::LANGUAGE_ENVVAR, "en_US.UTF-8", 1), 0);
442@@ -243,17 +296,17 @@
443 TEST(ClickInterface, testSortAppsWithAccents)
444 {
445 std::vector<click::Application> apps = {
446- {"", "Robots", 0.0, "", "", "", ""},
447- {"", "Æon", 0.0, "", "", "", ""},
448- {"", "Contacts", 0.0, "", "", "", ""},
449- {"", "Über", 0.0, "", "", "", ""},
450+ {"", "Robots", 0.0, "", "", "", "", ""},
451+ {"", "Æon", 0.0, "", "", "", "", ""},
452+ {"", "Contacts", 0.0, "", "", "", "", ""},
453+ {"", "Über", 0.0, "", "", "", "", ""},
454 };
455
456 std::vector<click::Application> expected = {
457- {"", "Æon", 0.0, "", "", "", ""},
458- {"", "Contacts", 0.0, "", "", "", ""},
459- {"", "Robots", 0.0, "", "", "", ""},
460- {"", "Über", 0.0, "", "", "", ""},
461+ {"", "Æon", 0.0, "", "", "", "", ""},
462+ {"", "Contacts", 0.0, "", "", "", "", ""},
463+ {"", "Robots", 0.0, "", "", "", "", ""},
464+ {"", "Über", 0.0, "", "", "", "", ""},
465 };
466
467 ASSERT_EQ(setenv(Configuration::LANGUAGE_ENVVAR, "en_US.UTF-8", 1), 0);
468@@ -264,17 +317,17 @@
469 TEST(ClickInterface, testSortAppsMixedCharsets)
470 {
471 std::vector<click::Application> apps = {
472- {"", "Robots", 0.0, "", "", "", ""},
473- {"", "汉字", 0.0, "", "", "", ""},
474- {"", "漢字", 0.0, "", "", "", ""},
475- {"", "Über", 0.0, "", "", "", ""},
476+ {"", "Robots", 0.0, "", "", "", "", ""},
477+ {"", "汉字", 0.0, "", "", "", "", ""},
478+ {"", "漢字", 0.0, "", "", "", "", ""},
479+ {"", "Über", 0.0, "", "", "", "", ""},
480 };
481
482 std::vector<click::Application> expected = {
483- {"", "汉字", 0.0, "", "", "", ""},
484- {"", "漢字", 0.0, "", "", "", ""},
485- {"", "Robots", 0.0, "", "", "", ""},
486- {"", "Über", 0.0, "", "", "", ""},
487+ {"", "汉字", 0.0, "", "", "", "", ""},
488+ {"", "漢字", 0.0, "", "", "", "", ""},
489+ {"", "Robots", 0.0, "", "", "", "", ""},
490+ {"", "Über", 0.0, "", "", "", "", ""},
491 };
492
493 ASSERT_EQ(setenv(Configuration::LANGUAGE_ENVVAR, "zh_CN.UTF-8", 1), 0);
494
495=== modified file 'scope/clickapps/apps-query.cpp'
496--- scope/clickapps/apps-query.cpp 2014-07-17 20:05:57 +0000
497+++ scope/clickapps/apps-query.cpp 2014-07-21 13:01:36 +0000
498@@ -336,28 +336,9 @@
499 auto const current_dept = query().department_id();
500 auto const querystr = query().query_string();
501
502- //
503- // get the set of packages that belong to current deparment;
504- // only apply department filtering if not in root of all departments.
505- bool apply_department_filter = (querystr.empty() && !current_dept.empty());
506- std::unordered_set<std::string> pkgs_in_department;
507- if (impl->depts_db && apply_department_filter)
508- {
509- try
510- {
511- pkgs_in_department = impl->depts_db->get_packages_for_department(current_dept);
512- }
513- catch (const std::exception& e)
514- {
515- qWarning() << "Failed to get packages of department" << QString::fromStdString(current_dept);
516- apply_department_filter = false; // disable so that we are not loosing any apps if something goes wrong
517- }
518- }
519-
520 const bool show_top_apps = querystr.empty() && current_dept.empty();
521 ResultPusher pusher(searchReply, show_top_apps ? impl->configuration.get_core_apps() : std::vector<std::string>());
522- auto const localResults = clickInterfaceInstance().find_installed_apps(
523- querystr, pkgs_in_department, apply_department_filter);
524+ auto const localResults = clickInterfaceInstance().find_installed_apps(querystr, current_dept, impl->depts_db);
525
526 if (querystr.empty()) {
527 if (impl->depts_db)
528
529=== modified file 'scope/tests/test_apps_query.cpp'
530--- scope/tests/test_apps_query.cpp 2014-07-17 20:05:57 +0000
531+++ scope/tests/test_apps_query.cpp 2014-07-21 13:01:36 +0000
532@@ -61,7 +61,7 @@
533 {
534 public:
535 MockClickInterface() = default;
536- MOCK_METHOD3(find_installed_apps, std::vector<click::Application>(const std::string&, const std::unordered_set<std::string>&, bool));
537+ MOCK_METHOD3(find_installed_apps, std::vector<click::Application>(const std::string&, const std::string&, const std::shared_ptr<click::DepartmentsDb>&));
538 };
539
540 class MockAppsQuery : public click::apps::Query
541@@ -89,10 +89,10 @@
542 {
543 std::string categoryTemplate("{}");
544 std::vector<click::Application> apps {
545- {"app1", "App1", 0.0f, "icon", "url", "", "sshot"},
546- {"app2", "App2", 0.0f, "icon", "url", "", "sshot"},
547- {"app3", "App3", 0.0f, "icon", "url", "", "sshot"},
548- {"", "App4", 0.0f, "icon", "application:///app4.desktop", "", "sshot"} // a non-click app
549+ {"app1", "App1", 0.0f, "icon", "url", "", "sshot", ""},
550+ {"app2", "App2", 0.0f, "icon", "url", "", "sshot", ""},
551+ {"app3", "App3", 0.0f, "icon", "url", "", "sshot", ""},
552+ {"", "App4", 0.0f, "icon", "application:///app4.desktop", "", "sshot", ""} // a non-click app
553 };
554
555 click::apps::ResultPusher pusher(reply, {"app2_fooappname", "app4"});
556@@ -171,7 +171,7 @@
557
558 class DepartmentsTest : public ::testing::Test {
559 protected:
560- const std::vector<click::Application> installed_apps = {{"app1", "App1", 0.0f, "icon", "url", "descr", "scrshot"}};
561+ const std::vector<click::Application> installed_apps = {{"app1", "App1", 0.0f, "icon", "url", "descr", "scrshot", ""}};
562 const scopes::SearchMetadata metadata{"en_EN", "phone"};
563 const scopes::CategoryRenderer renderer{"{}"};
564 const std::list<std::string> expected_locales {"en_EN", "en_US", ""};

Subscribers

People subscribed via source and target branches

to all changes: