Merge lp:~stolowski/unity-scope-click/default-department-key into lp:unity-scope-click/devel
- default-department-key
- Merge into 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 |
Related bugs: |
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-
Description of the change
Handle X-Ubuntu-
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", ""}; |
PASSED: Continuous integration, rev:348 jenkins. qa.ubuntu. com/job/ unity-team- unity-scope- click-devel- ci/225/ jenkins. qa.ubuntu. com/job/ unity-team- unity-scope- click-devel- utopic- amd64-ci/ 200 jenkins. qa.ubuntu. com/job/ unity-team- unity-scope- click-devel- utopic- armhf-ci/ 199 jenkins. qa.ubuntu. com/job/ unity-team- unity-scope- click-devel- utopic- armhf-ci/ 199/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ unity-team- unity-scope- click-devel- utopic- i386-ci/ 199
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/unity- team-unity- scope-click- devel-ci/ 225/rebuild
http://