Merge lp:~donadigo/appcenter/client-class-improvements into lp:~elementary-apps/appcenter/appcenter
- client-class-improvements
- Merge into appcenter
Proposed by
Adam Bieńkowski
Status: | Merged |
---|---|
Approved by: | Zisu Andrei |
Approved revision: | 328 |
Merged at revision: | 334 |
Proposed branch: | lp:~donadigo/appcenter/client-class-improvements |
Merge into: | lp:~elementary-apps/appcenter/appcenter |
Diff against target: |
465 lines (+89/-107) 3 files modified
src/Core/Client.vala (+86/-100) src/Core/Task.vala (+1/-5) src/MainWindow.vala (+2/-2) |
To merge this branch: | bzr merge lp:~donadigo/appcenter/client-class-improvements |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Corentin Noël | Approve | ||
Review via email: mp+308592@code.launchpad.net |
Commit message
Client:
* Use one task accross the class
* Fix code-style issues
* Cache used members / variables
Description of the change
This branch does some improvements to the Client class, mostly it replaces the task list with one task (packagekit can do only one task at a time), fixes some code-style issues.
To post a comment you must log in.
Revision history for this message
RabbitBot (rabbitbot-a) wrote : | # |
Attempt to merge into lp:appcenter failed due to conflicts:
text conflict in src/Application
text conflict in src/Core/
text conflict in src/MainWindow.vala
- 328. By Adam Bieńkowski
-
Resolve conflicts
Revision history for this message
Adam Bieńkowski (donadigo) wrote : | # |
Conflicts resolved.
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'src/Core/Client.vala' | |||
2 | --- src/Core/Client.vala 2016-10-26 12:59:05 +0000 | |||
3 | +++ src/Core/Client.vala 2016-11-06 15:34:19 +0000 | |||
4 | @@ -16,18 +16,16 @@ | |||
5 | 16 | 16 | ||
6 | 17 | public class AppCenterCore.Client : Object { | 17 | public class AppCenterCore.Client : Object { |
7 | 18 | public signal void updates_available (); | 18 | public signal void updates_available (); |
8 | 19 | public signal void tasks_finished (); | ||
9 | 20 | 19 | ||
10 | 21 | public bool connected { public get; private set; } | 20 | public bool connected { public get; private set; } |
11 | 22 | public bool updating_cache { public get; private set; } | 21 | public bool updating_cache { public get; private set; } |
12 | 22 | public uint task_count { public get; private set; default = 0; } | ||
13 | 23 | 23 | ||
14 | 24 | public AppCenterCore.Package os_updates { public get; private set; } | 24 | public AppCenterCore.Package os_updates { public get; private set; } |
15 | 25 | 25 | ||
16 | 26 | private Gee.LinkedList<AppCenter.Task> task_list; | ||
17 | 27 | private Gee.LinkedList<AppCenter.Task> task_with_agreement_list; | ||
18 | 28 | private Gee.HashMap<string, AppCenterCore.Package> package_list; | 26 | private Gee.HashMap<string, AppCenterCore.Package> package_list; |
19 | 29 | private AppStream.Pool appstream_pool; | 27 | private AppStream.Pool appstream_pool; |
21 | 30 | private GLib.Cancellable interface_cancellable; | 28 | private GLib.Cancellable cancellable; |
22 | 31 | private GLib.DateTime last_cache_update; | 29 | private GLib.DateTime last_cache_update; |
23 | 32 | private uint updates_number = 0U; | 30 | private uint updates_number = 0U; |
24 | 33 | private uint update_cache_timeout_id = 0; | 31 | private uint update_cache_timeout_id = 0; |
25 | @@ -35,73 +33,57 @@ | |||
26 | 35 | 33 | ||
27 | 36 | private const int SECONDS_BETWEEN_REFRESHES = 60*60*24; | 34 | private const int SECONDS_BETWEEN_REFRESHES = 60*60*24; |
28 | 37 | 35 | ||
29 | 36 | private Task client; | ||
30 | 37 | private SuspendControl sc; | ||
31 | 38 | |||
32 | 38 | private Client () { | 39 | private Client () { |
33 | 39 | appstream_pool.get_components ().foreach ((comp) => { | ||
34 | 40 | var package = new AppCenterCore.Package (comp); | ||
35 | 41 | foreach (var pkg_name in comp.get_pkgnames ()) { | ||
36 | 42 | package_list.set (pkg_name, package); | ||
37 | 43 | } | ||
38 | 44 | }); | ||
39 | 45 | } | 40 | } |
40 | 46 | 41 | ||
41 | 47 | construct { | 42 | construct { |
42 | 48 | task_list = new Gee.LinkedList<AppCenter.Task> (); | ||
43 | 49 | task_with_agreement_list = new Gee.LinkedList<AppCenter.Task> (); | ||
44 | 50 | package_list = new Gee.HashMap<string, AppCenterCore.Package> (null, null); | 43 | package_list = new Gee.HashMap<string, AppCenterCore.Package> (null, null); |
46 | 51 | interface_cancellable = new GLib.Cancellable (); | 44 | cancellable = new GLib.Cancellable (); |
47 | 45 | |||
48 | 46 | client = new Task (); | ||
49 | 47 | sc = new SuspendControl (); | ||
50 | 48 | |||
51 | 49 | cancellable = new GLib.Cancellable (); | ||
52 | 52 | last_cache_update = null; | 50 | last_cache_update = null; |
53 | 53 | 51 | ||
54 | 54 | appstream_pool = new AppStream.Pool (); | 52 | appstream_pool = new AppStream.Pool (); |
55 | 53 | |||
56 | 55 | try { | 54 | try { |
57 | 56 | appstream_pool.load (); | 55 | appstream_pool.load (); |
58 | 56 | appstream_pool.get_components ().foreach ((comp) => { | ||
59 | 57 | var package = new AppCenterCore.Package (comp); | ||
60 | 58 | foreach (var pkg_name in comp.get_pkgnames ()) { | ||
61 | 59 | package_list.set (pkg_name, package); | ||
62 | 60 | } | ||
63 | 61 | }); | ||
64 | 57 | } catch (Error e) { | 62 | } catch (Error e) { |
65 | 58 | error (e.message); | 63 | error (e.message); |
66 | 59 | } | 64 | } |
67 | 60 | 65 | ||
68 | 66 | var icon = new AppStream.Icon (); | ||
69 | 67 | icon.set_name ("distributor-logo"); | ||
70 | 68 | icon.set_kind (AppStream.IconKind.STOCK); | ||
71 | 69 | |||
72 | 61 | var os_updates_component = new AppStream.Component (); | 70 | var os_updates_component = new AppStream.Component (); |
73 | 62 | os_updates_component.id = AppCenterCore.Package.OS_UPDATES_ID; | 71 | os_updates_component.id = AppCenterCore.Package.OS_UPDATES_ID; |
74 | 63 | os_updates_component.name = _("Operating System Updates"); | 72 | os_updates_component.name = _("Operating System Updates"); |
75 | 64 | os_updates_component.summary = _("Updates to system components"); | 73 | os_updates_component.summary = _("Updates to system components"); |
76 | 65 | var icon = new AppStream.Icon (); | ||
77 | 66 | icon.set_name ("distributor-logo"); | ||
78 | 67 | icon.set_kind (AppStream.IconKind.STOCK); | ||
79 | 68 | os_updates_component.add_icon (icon); | 74 | os_updates_component.add_icon (icon); |
80 | 75 | |||
81 | 69 | os_updates = new AppCenterCore.Package (os_updates_component); | 76 | os_updates = new AppCenterCore.Package (os_updates_component); |
82 | 70 | } | 77 | } |
83 | 71 | 78 | ||
84 | 72 | public bool has_tasks () { | 79 | public bool has_tasks () { |
111 | 73 | return !task_list.is_empty; | 80 | return task_count > 0; |
86 | 74 | } | ||
87 | 75 | |||
88 | 76 | private AppCenter.Task request_task (bool requires_user_agreement = true) { | ||
89 | 77 | AppCenter.Task task = new AppCenter.Task (); | ||
90 | 78 | task_list.add (task); | ||
91 | 79 | if (requires_user_agreement) { | ||
92 | 80 | if (task_with_agreement_list.size == 0) { | ||
93 | 81 | Pk.polkit_agent_open (); | ||
94 | 82 | } | ||
95 | 83 | task_with_agreement_list.add (task); | ||
96 | 84 | } | ||
97 | 85 | return task; | ||
98 | 86 | } | ||
99 | 87 | |||
100 | 88 | private void release_task (AppCenter.Task task) { | ||
101 | 89 | task_list.remove (task); | ||
102 | 90 | if (task_list.is_empty) { | ||
103 | 91 | tasks_finished (); | ||
104 | 92 | if (task in task_with_agreement_list) { | ||
105 | 93 | task_with_agreement_list.remove (task); | ||
106 | 94 | if (task_with_agreement_list.size == 0) { | ||
107 | 95 | Pk.polkit_agent_close (); | ||
108 | 96 | } | ||
109 | 97 | } | ||
110 | 98 | } | ||
112 | 99 | } | 81 | } |
113 | 100 | 82 | ||
114 | 101 | public async Pk.Exit install_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error { | 83 | public async Pk.Exit install_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error { |
115 | 84 | task_count++; | ||
116 | 85 | |||
117 | 102 | Pk.Exit exit_status = Pk.Exit.UNKNOWN; | 86 | Pk.Exit exit_status = Pk.Exit.UNKNOWN; |
118 | 103 | AppCenter.Task install_task = request_task (); | ||
119 | 104 | AppCenter.Task search_task = request_task (); | ||
120 | 105 | string[] packages_ids = {}; | 87 | string[] packages_ids = {}; |
121 | 106 | foreach (var pkg_name in package.component.get_pkgnames ()) { | 88 | foreach (var pkg_name in package.component.get_pkgnames ()) { |
122 | 107 | packages_ids += pkg_name; | 89 | packages_ids += pkg_name; |
123 | @@ -110,7 +92,7 @@ | |||
124 | 110 | packages_ids += null; | 92 | packages_ids += null; |
125 | 111 | 93 | ||
126 | 112 | try { | 94 | try { |
128 | 113 | var results = yield search_task.resolve_async (Pk.Bitfield.from_enums (Pk.Filter.NEWEST, Pk.Filter.ARCH), packages_ids, cancellable, () => {}); | 95 | var results = yield client.resolve_async (Pk.Bitfield.from_enums (Pk.Filter.NEWEST, Pk.Filter.ARCH), packages_ids, cancellable, () => {}); |
129 | 114 | packages_ids = {}; | 96 | packages_ids = {}; |
130 | 115 | 97 | ||
131 | 116 | results.get_package_array ().foreach ((package) => { | 98 | results.get_package_array ().foreach ((package) => { |
132 | @@ -119,28 +101,24 @@ | |||
133 | 119 | 101 | ||
134 | 120 | packages_ids += null; | 102 | packages_ids += null; |
135 | 121 | 103 | ||
137 | 122 | results = yield install_task.install_packages_async (packages_ids, cancellable, cb); | 104 | results = yield client.install_packages_async (packages_ids, cancellable, cb); |
138 | 123 | exit_status = results.get_exit_code (); | 105 | exit_status = results.get_exit_code (); |
139 | 124 | if (exit_status != Pk.Exit.SUCCESS) { | 106 | if (exit_status != Pk.Exit.SUCCESS) { |
140 | 125 | release_task (search_task); | ||
141 | 126 | release_task (install_task); | ||
142 | 127 | throw new GLib.IOError.FAILED (Pk.Exit.enum_to_string (results.get_exit_code ())); | 107 | throw new GLib.IOError.FAILED (Pk.Exit.enum_to_string (results.get_exit_code ())); |
143 | 128 | } | 108 | } |
144 | 129 | } catch (Error e) { | 109 | } catch (Error e) { |
147 | 130 | release_task (search_task); | 110 | task_count--; |
146 | 131 | release_task (install_task); | ||
148 | 132 | throw e; | 111 | throw e; |
149 | 133 | } | 112 | } |
150 | 134 | 113 | ||
153 | 135 | release_task (search_task); | 114 | task_count--; |
152 | 136 | release_task (install_task); | ||
154 | 137 | return exit_status; | 115 | return exit_status; |
155 | 138 | } | 116 | } |
156 | 139 | 117 | ||
157 | 140 | public async Pk.Exit update_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error { | 118 | public async Pk.Exit update_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error { |
158 | 119 | task_count++; | ||
159 | 120 | |||
160 | 141 | Pk.Exit exit_status = Pk.Exit.UNKNOWN; | 121 | Pk.Exit exit_status = Pk.Exit.UNKNOWN; |
161 | 142 | SuspendControl sc = new SuspendControl (); | ||
162 | 143 | AppCenter.Task update_task = request_task (); | ||
163 | 144 | string[] packages_ids = {}; | 122 | string[] packages_ids = {}; |
164 | 145 | foreach (var pk_package in package.change_information.changes) { | 123 | foreach (var pk_package in package.change_information.changes) { |
165 | 146 | packages_ids += pk_package.get_id (); | 124 | packages_ids += pk_package.get_id (); |
166 | @@ -150,13 +128,14 @@ | |||
167 | 150 | 128 | ||
168 | 151 | try { | 129 | try { |
169 | 152 | sc.inhibit (); | 130 | sc.inhibit (); |
171 | 153 | var results = yield update_task.update_packages_async (packages_ids, cancellable, cb); | 131 | |
172 | 132 | var results = yield client.update_packages_async (packages_ids, cancellable, cb); | ||
173 | 154 | exit_status = results.get_exit_code (); | 133 | exit_status = results.get_exit_code (); |
174 | 155 | } catch (Error e) { | 134 | } catch (Error e) { |
175 | 135 | task_count--; | ||
176 | 156 | throw e; | 136 | throw e; |
177 | 157 | } finally { | 137 | } finally { |
178 | 158 | sc.uninhibit (); | 138 | sc.uninhibit (); |
179 | 159 | release_task (update_task); | ||
180 | 160 | } | 139 | } |
181 | 161 | 140 | ||
182 | 162 | if (exit_status != Pk.Exit.SUCCESS) { | 141 | if (exit_status != Pk.Exit.SUCCESS) { |
183 | @@ -165,64 +144,65 @@ | |||
184 | 165 | package.change_information.clear_update_info (); | 144 | package.change_information.clear_update_info (); |
185 | 166 | } | 145 | } |
186 | 167 | 146 | ||
187 | 147 | task_count--; | ||
188 | 168 | yield refresh_updates (); | 148 | yield refresh_updates (); |
189 | 169 | |||
190 | 170 | return exit_status; | 149 | return exit_status; |
191 | 171 | } | 150 | } |
192 | 172 | 151 | ||
193 | 173 | public async Pk.Exit remove_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error { | 152 | public async Pk.Exit remove_package (Package package, Pk.ProgressCallback cb, GLib.Cancellable cancellable) throws GLib.Error { |
194 | 153 | task_count++; | ||
195 | 154 | |||
196 | 174 | Pk.Exit exit_status = Pk.Exit.UNKNOWN; | 155 | Pk.Exit exit_status = Pk.Exit.UNKNOWN; |
197 | 175 | AppCenter.Task remove_task = request_task (); | ||
198 | 176 | AppCenter.Task search_task = request_task (); | ||
199 | 177 | string[] packages_ids = {}; | 156 | string[] packages_ids = {}; |
200 | 178 | foreach (var pkg_name in package.component.get_pkgnames ()) { | 157 | foreach (var pkg_name in package.component.get_pkgnames ()) { |
201 | 179 | packages_ids += pkg_name; | 158 | packages_ids += pkg_name; |
202 | 180 | } | 159 | } |
203 | 160 | |||
204 | 181 | packages_ids += null; | 161 | packages_ids += null; |
205 | 182 | 162 | ||
206 | 183 | try { | 163 | try { |
208 | 184 | var results = yield search_task.resolve_async (Pk.Bitfield.from_enums (Pk.Filter.INSTALLED, Pk.Filter.NEWEST), packages_ids, cancellable, () => {}); | 164 | var results = yield client.resolve_async (Pk.Bitfield.from_enums (Pk.Filter.INSTALLED, Pk.Filter.NEWEST), packages_ids, cancellable, () => {}); |
209 | 185 | packages_ids = {}; | 165 | packages_ids = {}; |
210 | 186 | results.get_package_array ().foreach ((package) => { | 166 | results.get_package_array ().foreach ((package) => { |
211 | 187 | packages_ids += package.package_id; | 167 | packages_ids += package.package_id; |
212 | 188 | }); | 168 | }); |
213 | 189 | 169 | ||
215 | 190 | results = yield remove_task.remove_packages_async (packages_ids, true, true, cancellable, cb); | 170 | results = yield client.remove_packages_async (packages_ids, true, true, cancellable, cb); |
216 | 191 | exit_status = results.get_exit_code (); | 171 | exit_status = results.get_exit_code (); |
217 | 192 | } catch (Error e) { | 172 | } catch (Error e) { |
220 | 193 | release_task (search_task); | 173 | task_count--; |
219 | 194 | release_task (remove_task); | ||
221 | 195 | throw e; | 174 | throw e; |
222 | 196 | } | 175 | } |
223 | 197 | 176 | ||
224 | 177 | task_count--; | ||
225 | 198 | yield refresh_updates (); | 178 | yield refresh_updates (); |
226 | 199 | release_task (search_task); | ||
227 | 200 | release_task (remove_task); | ||
228 | 201 | return exit_status; | 179 | return exit_status; |
229 | 202 | } | 180 | } |
230 | 203 | 181 | ||
231 | 204 | public async void get_updates () { | 182 | public async void get_updates () { |
234 | 205 | AppCenter.Task update_task = request_task (false); | 183 | task_count++; |
235 | 206 | AppCenter.Task details_task = request_task (false); | 184 | |
236 | 207 | try { | 185 | try { |
238 | 208 | Pk.Results result = yield update_task.get_updates_async (0, interface_cancellable, (t, p) => { }); | 186 | Pk.Results results = yield client.get_updates_async (0, cancellable, (t, p) => { }); |
239 | 209 | string[] packages_array = {}; | 187 | string[] packages_array = {}; |
241 | 210 | result.get_package_array ().foreach ((pk_package) => { | 188 | results.get_package_array ().foreach ((pk_package) => { |
242 | 211 | packages_array += pk_package.get_id (); | 189 | packages_array += pk_package.get_id (); |
243 | 212 | }); | 190 | }); |
244 | 213 | 191 | ||
245 | 214 | // We need a null to show to PackageKit that it's then end of the array. | 192 | // We need a null to show to PackageKit that it's then end of the array. |
246 | 215 | packages_array += null; | 193 | packages_array += null; |
247 | 216 | 194 | ||
250 | 217 | Pk.Results result2 = yield details_task.get_details_async (packages_array , interface_cancellable, (t, p) => { }); | 195 | results = yield client.get_details_async (packages_array , cancellable, (t, p) => { }); |
251 | 218 | result2.get_details_array ().foreach ((pk_detail) => { | 196 | results.get_details_array ().foreach ((pk_detail) => { |
252 | 219 | var pk_package = new Pk.Package (); | 197 | var pk_package = new Pk.Package (); |
253 | 220 | try { | 198 | try { |
254 | 221 | pk_package.set_id (pk_detail.get_package_id ()); | 199 | pk_package.set_id (pk_detail.get_package_id ()); |
255 | 200 | |||
256 | 222 | unowned string pkg_name = pk_package.get_name (); | 201 | unowned string pkg_name = pk_package.get_name (); |
257 | 223 | var package = package_list.get (pkg_name); | 202 | var package = package_list.get (pkg_name); |
258 | 224 | if (package == null) { | 203 | if (package == null) { |
259 | 225 | package = os_updates; | 204 | package = os_updates; |
260 | 205 | |||
261 | 226 | var pkgnames = os_updates.component.pkgnames; | 206 | var pkgnames = os_updates.component.pkgnames; |
262 | 227 | pkgnames += pkg_name; | 207 | pkgnames += pkg_name; |
263 | 228 | os_updates.component.pkgnames = pkgnames; | 208 | os_updates.component.pkgnames = pkgnames; |
264 | @@ -240,17 +220,19 @@ | |||
265 | 240 | if (e.code != 19) { | 220 | if (e.code != 19) { |
266 | 241 | critical (e.message); | 221 | critical (e.message); |
267 | 242 | } | 222 | } |
268 | 223 | |||
269 | 224 | task_count--; | ||
270 | 225 | return; | ||
271 | 243 | } | 226 | } |
272 | 244 | 227 | ||
275 | 245 | release_task (details_task); | 228 | task_count--; |
274 | 246 | release_task (update_task); | ||
276 | 247 | updates_available (); | 229 | updates_available (); |
277 | 248 | } | 230 | } |
278 | 249 | 231 | ||
279 | 250 | public async Gee.Collection<AppCenterCore.Package> get_installed_applications () { | 232 | public async Gee.Collection<AppCenterCore.Package> get_installed_applications () { |
280 | 251 | var packages = new Gee.TreeSet<AppCenterCore.Package> (); | 233 | var packages = new Gee.TreeSet<AppCenterCore.Package> (); |
283 | 252 | var packages_list = yield get_installed_packages (); | 234 | var installed = yield get_installed_packages (); |
284 | 253 | foreach (var pk_package in packages_list) { | 235 | foreach (var pk_package in installed) { |
285 | 254 | var package = package_list.get (pk_package.get_name ()); | 236 | var package = package_list.get (pk_package.get_name ()); |
286 | 255 | if (package != null) { | 237 | if (package != null) { |
287 | 256 | package.installed_packages.add (pk_package); | 238 | package.installed_packages.add (pk_package); |
288 | @@ -300,43 +282,49 @@ | |||
289 | 300 | } | 282 | } |
290 | 301 | 283 | ||
291 | 302 | public Pk.Package? get_app_package (string application, Pk.Bitfield additional_filters = 0) throws GLib.Error { | 284 | public Pk.Package? get_app_package (string application, Pk.Bitfield additional_filters = 0) throws GLib.Error { |
293 | 303 | AppCenter.Task packages_task = request_task (false); | 285 | task_count++; |
294 | 286 | |||
295 | 304 | Pk.Package? package = null; | 287 | Pk.Package? package = null; |
296 | 305 | var filter = Pk.Bitfield.from_enums (Pk.Filter.NEWEST); | 288 | var filter = Pk.Bitfield.from_enums (Pk.Filter.NEWEST); |
297 | 306 | filter |= additional_filters; | 289 | filter |= additional_filters; |
298 | 307 | try { | 290 | try { |
300 | 308 | var results = packages_task.search_names_sync (filter, { application, null }, interface_cancellable, () => {}); | 291 | var results = client.search_names_sync (filter, { application, null }, cancellable, () => {}); |
301 | 309 | var array = results.get_package_array (); | 292 | var array = results.get_package_array (); |
302 | 310 | if (array.length > 0) { | 293 | if (array.length > 0) { |
303 | 311 | package = array.get (0); | 294 | package = array.get (0); |
304 | 312 | } | 295 | } |
305 | 313 | } catch (Error e) { | 296 | } catch (Error e) { |
307 | 314 | release_task (packages_task); | 297 | task_count--; |
308 | 315 | throw e; | 298 | throw e; |
309 | 316 | } | 299 | } |
310 | 317 | 300 | ||
312 | 318 | release_task (packages_task); | 301 | task_count--; |
313 | 319 | return package; | 302 | return package; |
314 | 320 | } | 303 | } |
315 | 321 | 304 | ||
316 | 322 | private async void refresh_updates () { | 305 | private async void refresh_updates () { |
317 | 323 | var update_task = new AppCenter.Task (); | ||
318 | 324 | updating_cache = true; | 306 | updating_cache = true; |
319 | 307 | task_count++; | ||
320 | 325 | 308 | ||
321 | 326 | try { | 309 | try { |
323 | 327 | Pk.Results result = yield update_task.get_updates_async (0, interface_cancellable, (t, p) => {}); | 310 | Pk.Results results = yield client.get_updates_async (0, null, (t, p) => {}); |
324 | 311 | |||
325 | 328 | bool was_empty = updates_number == 0U; | 312 | bool was_empty = updates_number == 0U; |
327 | 329 | updates_number = get_package_count (result.get_package_array ()); | 313 | updates_number = get_package_count (results.get_package_array ()); |
328 | 314 | |||
329 | 315 | var application = Application.get_default (); | ||
330 | 330 | if (was_empty && updates_number != 0U) { | 316 | if (was_empty && updates_number != 0U) { |
331 | 331 | string title = ngettext ("Update Available", "Updates Available", updates_number); | 317 | string title = ngettext ("Update Available", "Updates Available", updates_number); |
332 | 332 | string body = ngettext ("%u update is available for your system", "%u updates are available for your system", updates_number).printf (updates_number); | 318 | string body = ngettext ("%u update is available for your system", "%u updates are available for your system", updates_number).printf (updates_number); |
333 | 319 | |||
334 | 333 | var notification = new Notification (title); | 320 | var notification = new Notification (title); |
335 | 334 | notification.set_body (body); | 321 | notification.set_body (body); |
336 | 335 | notification.set_icon (new ThemedIcon ("system-software-install")); | 322 | notification.set_icon (new ThemedIcon ("system-software-install")); |
337 | 336 | notification.set_default_action ("app.open-application"); | 323 | notification.set_default_action ("app.open-application"); |
339 | 337 | Application.get_default ().send_notification ("updates", notification); | 324 | |
340 | 325 | application.send_notification ("updates", notification); | ||
341 | 338 | } else { | 326 | } else { |
343 | 339 | Application.get_default ().withdraw_notification ("updates"); | 327 | application.withdraw_notification ("updates"); |
344 | 340 | } | 328 | } |
345 | 341 | 329 | ||
346 | 342 | #if HAVE_UNITY | 330 | #if HAVE_UNITY |
347 | @@ -349,12 +337,14 @@ | |||
348 | 349 | } | 337 | } |
349 | 350 | 338 | ||
350 | 351 | updating_cache = false; | 339 | updating_cache = false; |
351 | 340 | task_count--; | ||
352 | 352 | refresh_in_progress = false; | 341 | refresh_in_progress = false; |
353 | 353 | } | 342 | } |
354 | 354 | 343 | ||
355 | 355 | public uint get_package_count (GLib.GenericArray<weak Pk.Package> package_array) { | 344 | public uint get_package_count (GLib.GenericArray<weak Pk.Package> package_array) { |
356 | 356 | bool os_update_found = false; | 345 | bool os_update_found = false; |
357 | 357 | var result_comp = new Gee.TreeSet<AppStream.Component> (); | 346 | var result_comp = new Gee.TreeSet<AppStream.Component> (); |
358 | 347 | |||
359 | 358 | package_array.foreach ((pk_package) => { | 348 | package_array.foreach ((pk_package) => { |
360 | 359 | var comp = package_list.get (pk_package.get_name ()); | 349 | var comp = package_list.get (pk_package.get_name ()); |
361 | 360 | if (comp != null) { | 350 | if (comp != null) { |
362 | @@ -373,7 +363,7 @@ | |||
363 | 373 | } | 363 | } |
364 | 374 | 364 | ||
365 | 375 | public void cancel_updates (bool cancel_timeout) { | 365 | public void cancel_updates (bool cancel_timeout) { |
367 | 376 | interface_cancellable.cancel (); | 366 | cancellable.cancel (); |
368 | 377 | 367 | ||
369 | 378 | if (update_cache_timeout_id > 0 && cancel_timeout) { | 368 | if (update_cache_timeout_id > 0 && cancel_timeout) { |
370 | 379 | Source.remove (update_cache_timeout_id); | 369 | Source.remove (update_cache_timeout_id); |
371 | @@ -381,7 +371,7 @@ | |||
372 | 381 | last_cache_update = null; | 371 | last_cache_update = null; |
373 | 382 | } | 372 | } |
374 | 383 | 373 | ||
376 | 384 | interface_cancellable = new GLib.Cancellable (); | 374 | cancellable = new GLib.Cancellable (); |
377 | 385 | refresh_in_progress = false; | 375 | refresh_in_progress = false; |
378 | 386 | } | 376 | } |
379 | 387 | 377 | ||
380 | @@ -413,21 +403,16 @@ | |||
381 | 413 | /* One cache update a day, keeps the doctor away! */ | 403 | /* One cache update a day, keeps the doctor away! */ |
382 | 414 | if (force || last_cache_update == null || | 404 | if (force || last_cache_update == null || |
383 | 415 | (new DateTime.now_local ()).difference (last_cache_update) / GLib.TimeSpan.SECOND >= SECONDS_BETWEEN_REFRESHES) { | 405 | (new DateTime.now_local ()).difference (last_cache_update) / GLib.TimeSpan.SECOND >= SECONDS_BETWEEN_REFRESHES) { |
384 | 416 | |||
385 | 417 | var nm = NetworkMonitor.get_default (); | 406 | var nm = NetworkMonitor.get_default (); |
388 | 418 | 407 | if (nm.get_network_available ()) { | |
387 | 419 | if (nm.get_network_available()) { | ||
389 | 420 | debug ("New refresh task"); | 408 | debug ("New refresh task"); |
390 | 421 | var refresh_task = new AppCenter.Task (); | ||
391 | 422 | |||
392 | 423 | 409 | ||
393 | 424 | try { | 410 | try { |
396 | 425 | Pk.Results result = yield refresh_task.refresh_cache_async (false, interface_cancellable, (t, p) => { }); | 411 | Pk.Results results = yield client.refresh_cache_async (false, cancellable, (t, p) => { }); |
397 | 426 | success = result.get_exit_code () == Pk.Exit.SUCCESS; | 412 | success = results.get_exit_code () == Pk.Exit.SUCCESS; |
398 | 427 | last_cache_update = new DateTime.now_local (); | 413 | last_cache_update = new DateTime.now_local (); |
399 | 428 | } catch (Error e) { | 414 | } catch (Error e) { |
400 | 429 | critical ("Update_cache: Refesh cache async failed - %s", e.message); | 415 | critical ("Update_cache: Refesh cache async failed - %s", e.message); |
401 | 430 | |||
402 | 431 | } | 416 | } |
403 | 432 | 417 | ||
404 | 433 | if (success) { | 418 | if (success) { |
405 | @@ -454,21 +439,22 @@ | |||
406 | 454 | } | 439 | } |
407 | 455 | 440 | ||
408 | 456 | public async Gee.TreeSet<Pk.Package> get_installed_packages () { | 441 | public async Gee.TreeSet<Pk.Package> get_installed_packages () { |
411 | 457 | var packages_task = request_task (); | 442 | task_count++; |
412 | 458 | var filter = Pk.Bitfield.from_enums (Pk.Filter.INSTALLED, Pk.Filter.NEWEST); | 443 | |
413 | 444 | Pk.Bitfield filter = Pk.Bitfield.from_enums (Pk.Filter.INSTALLED, Pk.Filter.NEWEST); | ||
414 | 459 | var installed = new Gee.TreeSet<Pk.Package> (); | 445 | var installed = new Gee.TreeSet<Pk.Package> (); |
415 | 446 | |||
416 | 460 | try { | 447 | try { |
419 | 461 | Pk.Results result = yield packages_task.get_packages_async (filter, null, (prog, type) => {}); | 448 | Pk.Results results = yield client.get_packages_async (filter, null, (prog, type) => {}); |
420 | 462 | result.get_package_array ().foreach ((pk_package) => { | 449 | results.get_package_array ().foreach ((pk_package) => { |
421 | 463 | installed.add (pk_package); | 450 | installed.add (pk_package); |
422 | 464 | }); | 451 | }); |
423 | 465 | 452 | ||
424 | 466 | release_task (packages_task); | ||
425 | 467 | } catch (Error e) { | 453 | } catch (Error e) { |
426 | 468 | critical (e.message); | 454 | critical (e.message); |
427 | 469 | release_task (packages_task); | ||
428 | 470 | } | 455 | } |
429 | 471 | 456 | ||
430 | 457 | task_count--; | ||
431 | 472 | return installed; | 458 | return installed; |
432 | 473 | } | 459 | } |
433 | 474 | 460 | ||
434 | 475 | 461 | ||
435 | === modified file 'src/Core/Task.vala' | |||
436 | --- src/Core/Task.vala 2016-07-18 21:16:57 +0000 | |||
437 | +++ src/Core/Task.vala 2016-11-06 15:34:19 +0000 | |||
438 | @@ -18,11 +18,7 @@ | |||
439 | 18 | * Authored by: Corentin Noël <corentin@elementary.io> | 18 | * Authored by: Corentin Noël <corentin@elementary.io> |
440 | 19 | */ | 19 | */ |
441 | 20 | 20 | ||
447 | 21 | public class AppCenter.Task : Pk.Task { | 21 | public class AppCenterCore.Task : Pk.Task { |
443 | 22 | public Task () { | ||
444 | 23 | |||
445 | 24 | } | ||
446 | 25 | |||
448 | 26 | public override void untrusted_question (uint request, Pk.Results results) { | 22 | public override void untrusted_question (uint request, Pk.Results results) { |
449 | 27 | user_accepted (request); | 23 | user_accepted (request); |
450 | 28 | } | 24 | } |
451 | 29 | 25 | ||
452 | === modified file 'src/MainWindow.vala' | |||
453 | --- src/MainWindow.vala 2016-10-17 17:27:00 +0000 | |||
454 | +++ src/MainWindow.vala 2016-11-06 15:34:19 +0000 | |||
455 | @@ -171,8 +171,8 @@ | |||
456 | 171 | } | 171 | } |
457 | 172 | 172 | ||
458 | 173 | hide (); | 173 | hide (); |
461 | 174 | task_finished_connection = client.tasks_finished.connect (() => { | 174 | task_finished_connection = client.notify["task-count"].connect (() => { |
462 | 175 | if (!visible) { | 175 | if (!visible && client.task_count == 0) { |
463 | 176 | destroy (); | 176 | destroy (); |
464 | 177 | } | 177 | } |
465 | 178 | }); | 178 | }); |
Works fine here, everything looks sane