Merge lp:~ken-vandine/ubuntu-system-settings/update_progress into lp:ubuntu-system-settings

Proposed by Ken VanDine
Status: Merged
Approved by: Ken VanDine
Approved revision: 1078
Merged at revision: 1096
Proposed branch: lp:~ken-vandine/ubuntu-system-settings/update_progress
Merge into: lp:ubuntu-system-settings
Diff against target: 531 lines (+213/-122)
5 files modified
plugins/system-update/PageComponent.qml (+166/-120)
plugins/system-update/system_update.cpp (+2/-0)
plugins/system-update/system_update.h (+1/-0)
plugins/system-update/update_manager.cpp (+40/-2)
plugins/system-update/update_manager.h (+4/-0)
To merge this branch: bzr merge lp:~ken-vandine/ubuntu-system-settings/update_progress
Reviewer Review Type Date Requested Status
Diego Sarmentero (community) Approve
PS Jenkins bot continuous-integration Approve
Matthew Paul Thomas (community) design Abstain
Ubuntu Touch System Settings Pending
Review via email: mp+235199@code.launchpad.net

Commit message

* Fixed handling of the Downloading/Installing label based on actual state.
* Forward updateProgress signals for system updates
* Layout fixes

Description of the change

* Fixed handling of the Downloading/Installing label based on actual state.
* Forward updateProgress signals for system updates
* Layout fixes

To post a comment you must log in.
1062. By Ken VanDine

Forward rebooting signals for system updates

1063. By Ken VanDine

Display the "Restarting" string when we get the Rebooting signal from
system-image-dbus.

Added the spinning animation to the logo per the design.

1064. By Ken VanDine

Make the installingImageUpdate overlay fill the screen

1065. By Ken VanDine

installingImageUpdate shouldn't start out visible

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
1066. By Ken VanDine

Show downloaded sizes in while downloading

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
1067. By Ken VanDine

Display the downloaded size

1068. By Ken VanDine

Change the progress bar to indeterment for installing

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
1069. By Ken VanDine

removed debug output

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
1070. By Ken VanDine

merged trunk

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
1071. By Ken VanDine

Some layout fixes for updates

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
Ken VanDine (ken-vandine) wrote :

@mpt, here are some instructions for trying this branch:

Add silo 1, and install ubuntu-system-settings, libsystemsettings1, and ubuntu-system-settings-wizard from the silo. You can trick it into finding a system-update. Edit /etc/system-image/channel.ini with your favorite editor, reduce build_number by 1. Then kill the system-image-dbus process.

You can also unregister the latest version of a click package so you can see a click update. Run:

    $ click list --all --user=@all

This will list all versions of all click packages installed, find a package that has multiple versions installed, unregister the latest and then register the previous version. For example, I have two versions of com.canonical.payui.

    $ click list --all --user=@all
    com.canonical.payui 0.3.17
    com.canonical.payui 0.3.21
    $ sudo click unregister --user=$USER com.canonical.payui
    $ sudo click register --user=$USER com.canonical.payui 0.3.17

Now you should be able to launch ubuntu-system-settings an find a system-update as well as a click update.

Revision history for this message
Bill Filler (bfiller) wrote :

just tried this, seemed to work but noticed a couple of things:

- After the system update finished downloading, the main button at the top changed to "Pause All" which seemed wrong as there was nothing to pause. If I pressed "Pause All" it toggles to "Install 1 update.." and pressing it again changes to "Pause All". Is this intended?

- the buttons on the right of each item that says "Install..." seem a bit narrow. Was hard to actually press them. Perhaps make them a taller so they look more like buttons?

Revision history for this message
Ken VanDine (ken-vandine) wrote :

> just tried this, seemed to work but noticed a couple of things:
>
> - After the system update finished downloading, the main button at the top
> changed to "Pause All" which seemed wrong as there was nothing to pause. If I
> pressed "Pause All" it toggles to "Install 1 update.." and pressing it again
> changes to "Pause All". Is this intended?

That's a bug, but not a new bug from this branch. It's just more noticeable now that the download and install states are more defined. I'll fix that.

>
> - the buttons on the right of each item that says "Install..." seem a bit
> narrow. Was hard to actually press them. Perhaps make them a taller so they
> look more like buttons?

Yeah, I'll make them larger.

1072. By Ken VanDine

Make the download/update/install button larger

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
1073. By Ken VanDine

merged trunk

Revision history for this message
Matthew Paul Thomas (mpt) wrote :

I'm sorry, I tried for several hours to test this, with lots of help from #ubuntu-touch. Eventually I got stuck trying to save the edited version of /etc/system-image/channel.ini.

review: Abstain (design)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
1074. By Ken VanDine

merged trunk

1075. By Ken VanDine

Ensure the pause/install all button shows the correct state after update is downloaded

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Needs Fixing (continuous-integration)
1076. By Ken VanDine

merged trunk

1077. By Ken VanDine

Control visibility of the installAllButton, not the ListItem

1078. By Ken VanDine

merged trunk

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :
review: Approve (continuous-integration)
1079. By Ken VanDine

merged trunk

Revision history for this message
Diego Sarmentero (diegosarmentero) wrote :

+1

review: Approve
1080. By Ken VanDine

Don't highlight the installAllButton on press

1081. By Ken VanDine

merged trunk

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'plugins/system-update/PageComponent.qml'
2--- plugins/system-update/PageComponent.qml 2014-09-17 13:19:24 +0000
3+++ plugins/system-update/PageComponent.qml 2014-09-29 16:29:38 +0000
4@@ -34,8 +34,8 @@
5 id: root
6 objectName: "systemUpdatesPage"
7
8- title: i18n.tr("Updates")
9- flickable: scrollWidget
10+ title: installingImageUpdate.visible ? "" : i18n.tr("Updates")
11+ flickable: installingImageUpdate.visible ? null : scrollWidget
12
13 property bool installAll: false
14 property bool includeSystemUpdate: false
15@@ -147,7 +147,7 @@
16 State {
17 name: "UPDATE"
18 PropertyChanges { target: updateList; visible: true}
19- PropertyChanges { target: installAllButton; visible: true && root.updatesAvailable > 1}
20+ PropertyChanges { target: installAllButton; visible: root.updatesAvailable > 1}
21 PropertyChanges { target: updateNotification; visible: false}
22 }
23 ]
24@@ -186,10 +186,7 @@
25 }
26
27 onSystemUpdateDownloaded: {
28- if (!root.systemUpdateInProgress && !installingImageUpdate.visible) {
29- root.systemUpdateInProgress = true;
30- PopupUtils.open(dialogInstallComponent);
31- }
32+ root.installAll = false;
33 }
34
35 onSystemUpdateFailed: {
36@@ -199,6 +196,10 @@
37 onUpdateProcessFailed: {
38 root.state = "SYSTEMUPDATEFAILED";
39 }
40+
41+ onRebooting: {
42+ installingImageUpdate.message = i18n.tr("Restarting…");
43+ }
44 }
45 Flickable {
46 id: scrollWidget
47@@ -217,10 +218,12 @@
48
49 Column {
50 id: columnId
51-
52- anchors.left: parent.left
53- anchors.right: parent.right
54-
55+ anchors {
56+ left: parent.left
57+ right: parent.right
58+ }
59+ height: childrenRect.height
60+
61 ListItem.Base {
62 id: checkForUpdatesArea
63 objectName: "checkForUpdatesArea"
64@@ -253,10 +256,11 @@
65 }
66
67 ListItem.SingleControl {
68- id: installAllButton
69- objectName: "installAllButton"
70-
71+ height: installAllButton.visible ? units.gu(8) : units.gu(2)
72+ highlightWhenPressed: false
73 control: Button {
74+ id: installAllButton
75+ objectName: "installAllButton"
76 property string primaryText: includeSystemUpdate ?
77 i18n.tr("Install %1 update…", "Install %1 updates…", root.updatesAvailable).arg(root.updatesAvailable) :
78 i18n.tr("Install %1 update", "Install %1 updates", root.updatesAvailable).arg(root.updatesAvailable)
79@@ -277,6 +281,7 @@
80 }
81 }
82 }
83+ showDivider: false
84 }
85
86 ListView {
87@@ -289,126 +294,155 @@
88 model: UpdateManager.model
89 height: childrenRect.height
90 interactive: false
91+ spacing: units.gu(2)
92
93 delegate: ListItem.Subtitled {
94 id: listItem
95+ anchors {
96+ left: parent.left
97+ right: parent.right
98+ }
99 iconSource: Qt.resolvedUrl(modelData.iconUrl)
100 iconFrame: modelData.systemUpdate ? false : true
101- height: modelData.selected ? units.gu(14) : units.gu(8)
102+ height: textArea.height
103 highlightWhenPressed: false
104 showDivider: false
105
106 property alias actionButton: buttonAppUpdate
107 property alias progressBar: progress
108+ property bool installing: modelData.updateReady || (progressBar.value === progressBar.maximumValue)
109
110- Rectangle {
111+ Column {
112 id: textArea
113 objectName: "textArea"
114- color: "transparent"
115- anchors.fill: parent
116- anchors.topMargin: units.gu(1)
117-
118+ anchors {
119+ left: parent.left
120+ right: parent.right
121+ }
122+ spacing: units.gu(0.5)
123 property string message: modelData.error
124 property bool retry: false
125
126 onMessageChanged: {
127 if(message.length > 0) {
128 labelVersion.text = message;
129- buttonAppUpdate.text = i18n.tr("Retry");
130 modelData.updateState = false;
131 modelData.selected = false;
132 textArea.retry = true;
133 }
134 }
135
136- Button {
137- id: buttonAppUpdate
138- objectName: "buttonAppUpdate"
139- anchors.top: parent.top
140- anchors.right: parent.right
141- anchors.topMargin: units.gu(1)
142- anchors.rightMargin: units.gu(1)
143- height: labelTitle.height
144-
145- property string actionText: modelData.systemUpdate ? i18n.tr("Download") : i18n.tr("Update")
146- property string primaryText: modelData.selected ? i18n.tr("Resume") : actionText
147- property string secondaryText: i18n.tr("Pause")
148-
149- text: modelData.updateState ? secondaryText : primaryText
150-
151- onClicked: {
152- if (textArea.retry) {
153- textArea.retry = false;
154- UpdateManager.retryDownload(modelData.packageName);
155- } else if (modelData.updateReady) {
156- PopupUtils.open(dialogInstallComponent);
157- } else if (modelData.updateState) {
158+ Item {
159+ anchors {
160+ left: parent.left
161+ right: parent.right
162+ }
163+ height: buttonAppUpdate.height
164+
165+ Label {
166+ id: labelTitle
167+ objectName: "labelTitle"
168+ anchors {
169+ left: parent.left
170+ verticalCenter: parent.verticalCenter
171+ }
172+ text: modelData.title
173+ font.bold: true
174+ elide: buttonAppUpdate.visible ? Text.ElideRight : Text.ElideNone
175+ }
176+
177+ Button {
178+ id: buttonAppUpdate
179+ objectName: "buttonAppUpdate"
180+ anchors.right: parent.right
181+ height: labelTitle.height + units.gu(1)
182+ text: {
183+ if (textArea.retry) {
184+ return i18n.tr("Retry");
185+ }
186 if (modelData.systemUpdate) {
187- UpdateManager.pauseDownload(modelData.packageName);
188- } else {
189- modelData.updateState = false;
190- tracker.pause();
191- }
192- } else {
193- if (!modelData.selected || modelData.systemUpdate) {
194- modelData.selected = true;
195- UpdateManager.startDownload(modelData.packageName);
196- } else {
197- modelData.updateState = true;
198- tracker.resume();
199- }
200- }
201- }
202- }
203-
204- Label {
205- id: labelSize
206- objectName: "labelSize"
207- text: convert_bytes_to_size(modelData.binaryFilesize)
208- anchors.bottom: labelVersion.bottom
209- anchors.right: parent.right
210- anchors.rightMargin: units.gu(1)
211- visible: !modelData.selected
212- }
213-
214- Label {
215- id: labelTitle
216- objectName: "labelTitle"
217- anchors {
218- top: parent.top
219- left: parent.left
220- right: buttonAppUpdate.left
221- topMargin: units.gu(1)
222- rightMargin: units.gu(1)
223- }
224- height: units.gu(3)
225- text: modelData.title
226- font.bold: true
227- elide: buttonAppUpdate.visible ? Text.ElideRight : Text.ElideNone
228- }
229-
230- Label {
231+ if (modelData.updateReady) {
232+ return i18n.tr("Install…");
233+ } else if (!modelData.updateState && !modelData.selected) {
234+ return i18n.tr("Download");
235+ }
236+ }
237+ if (modelData.updateState) {
238+ return i18n.tr("Pause");
239+ } else if (modelData.selected) {
240+ return i18n.tr("Resume");
241+ }
242+ return i18n.tr("Update");
243+ }
244+
245+ onClicked: {
246+ if (textArea.retry) {
247+ textArea.retry = false;
248+ UpdateManager.retryDownload(modelData.packageName);
249+ } else if (modelData.updateReady) {
250+ PopupUtils.open(dialogInstallComponent);
251+ } else if (modelData.updateState) {
252+ if (modelData.systemUpdate) {
253+ UpdateManager.pauseDownload(modelData.packageName);
254+ } else {
255+ modelData.updateState = false;
256+ tracker.pause();
257+ }
258+ } else {
259+ if (!modelData.selected || modelData.systemUpdate) {
260+ modelData.selected = true;
261+ UpdateManager.startDownload(modelData.packageName);
262+ } else {
263+ modelData.updateState = true;
264+ tracker.resume();
265+ }
266+ }
267+ }
268+ }
269+ }
270+
271+ Item {
272 id: labelUpdateStatus
273- objectName: "labelUpdateStatus"
274- text: i18n.tr("Installing")
275- anchors.top: labelTitle.bottom
276- anchors.left: parent.left
277- anchors.right: parent.right
278- opacity: modelData.selected ? 1 : 0
279- anchors.bottomMargin: units.gu(1)
280-
281+ anchors {
282+ left: parent.left
283+ right: parent.right
284+ }
285+ height: childrenRect.height
286+ visible: opacity > 0
287+ opacity: modelData.selected && !modelData.updateReady ? 1 : 0
288 Behavior on opacity { PropertyAnimation { duration: UbuntuAnimation.SleepyDuration } }
289+ Label {
290+ objectName: "labelUpdateStatus"
291+ anchors.left: parent.left
292+ fontSize: "small"
293+ text: installing ? i18n.tr("Installing") : i18n.tr("Downloading")
294+ }
295+ Label {
296+ anchors.right: parent.right
297+ visible: !labelSize.visible && !installing
298+ fontSize: "small"
299+ text: {
300+ if (!labelUpdateStatus.visible)
301+ return convert_bytes_to_size(modelData.binaryFilesize);
302+
303+ return i18n.tr("%1 of %2").arg(
304+ convert_bytes_to_size(modelData.binaryFilesize * (progress.value * 0.01))).arg(
305+ convert_bytes_to_size(modelData.binaryFilesize)
306+ );
307+ }
308+ }
309 }
310
311 ProgressBar {
312 id: progress
313 objectName: "progress"
314 height: units.gu(2)
315- anchors.left: parent.left
316- anchors.top: labelUpdateStatus.bottom
317- anchors.topMargin: units.gu(1)
318- anchors.right: parent.right
319- opacity: modelData.selected ? 1 : 0
320+ anchors {
321+ left: parent.left
322+ right: parent.right
323+ }
324+ visible: opacity > 0
325+ opacity: modelData.selected && !modelData.updateReady && !installing ? 1 : 0
326 value: modelData.systemUpdate ? modelData.downloadProgress : tracker.progress
327 minimumValue: 0
328 maximumValue: 100
329@@ -438,20 +472,29 @@
330 Behavior on opacity { PropertyAnimation { duration: UbuntuAnimation.SleepyDuration } }
331 }
332
333- Label {
334- id: labelVersion
335- objectName: "labelVersion"
336+ Item {
337 anchors {
338 left: parent.left
339- right: buttonAppUpdate.right
340- top: (!progress.visible || progress.opacity == 0) ? labelTitle.bottom : progress.bottom
341- topMargin: (!progress.visible || progress.opacity == 0) ? 0 : units.gu(1)
342- bottom: parent.bottom
343- bottomMargin: units.gu(1)
344- }
345- text: modelData.remoteVersion ? i18n.tr("Version: ") + modelData.remoteVersion : ""
346- color: "black"
347- elide: Text.ElideRight
348+ right: parent.right
349+ }
350+ height: childrenRect.height
351+ Label {
352+ id: labelVersion
353+ objectName: "labelVersion"
354+ anchors.left: parent.left
355+ text: modelData.remoteVersion ? i18n.tr("Version: ") + modelData.remoteVersion : ""
356+ elide: Text.ElideRight
357+ fontSize: "small"
358+ }
359+
360+ Label {
361+ id: labelSize
362+ objectName: "labelSize"
363+ anchors.right: parent.right
364+ text: convert_bytes_to_size(modelData.binaryFilesize)
365+ fontSize: "small"
366+ visible: !labelUpdateStatus.visible && !installing
367+ }
368 }
369 }
370 }
371@@ -522,15 +565,11 @@
372 Rectangle {
373 id: installingImageUpdate
374 objectName: "installingImageUpdate"
375- anchors {
376- bottom: configuration.top
377- left: parent.left
378- right: parent.right
379- top: parent.top
380- }
381+ anchors.fill: root
382 visible: false
383-
384+ z: 10
385 color: "#221e1c"
386+ property string message: i18n.tr("Installing update…")
387
388 Column {
389 anchors.centerIn: parent
390@@ -539,6 +578,13 @@
391 Image {
392 source: Qt.resolvedUrl("file:///usr/share/ubuntu/settings/system/icons/distributor-logo.png")
393 anchors.horizontalCenter: parent.horizontalCenter
394+ NumberAnimation on rotation {
395+ from: 0
396+ to: 360
397+ running: installingImageUpdate.visible == true
398+ loops: Animation.Infinite
399+ duration: 2000
400+ }
401 }
402
403 ProgressBar {
404@@ -547,7 +593,7 @@
405 }
406
407 Label {
408- text: i18n.tr("Installing update…")
409+ text: installingImageUpdate.message
410 anchors.horizontalCenter: parent.horizontalCenter
411 }
412 }
413
414=== modified file 'plugins/system-update/system_update.cpp'
415--- plugins/system-update/system_update.cpp 2014-09-22 18:40:18 +0000
416+++ plugins/system-update/system_update.cpp 2014-09-29 16:29:38 +0000
417@@ -67,6 +67,8 @@
418 this, SIGNAL(updateFailed(int, QString)));
419 connect(&m_SystemServiceIface, SIGNAL(SettingChanged(QString, QString)),
420 this, SLOT(ProcessSettingChanged(QString, QString)));
421+ connect(&m_SystemServiceIface, SIGNAL(Rebooting(bool)),
422+ this, SIGNAL(rebooting(bool)));
423
424 setCurrentDetailedVersion();
425 }
426
427=== modified file 'plugins/system-update/system_update.h'
428--- plugins/system-update/system_update.h 2014-07-17 09:51:33 +0000
429+++ plugins/system-update/system_update.h 2014-09-29 16:29:38 +0000
430@@ -69,6 +69,7 @@
431 void downloadModeChanged();
432 void versionChanged();
433 void updateProcessFailed(const QString& reason);
434+ void rebooting(bool status);
435
436 private Q_SLOTS:
437 void updateDownloadProgress(int percentage, double eta);
438
439=== modified file 'plugins/system-update/update_manager.cpp'
440--- plugins/system-update/update_manager.cpp 2014-09-12 15:25:50 +0000
441+++ plugins/system-update/update_manager.cpp 2014-09-29 16:29:38 +0000
442@@ -77,13 +77,17 @@
443 QObject::connect(&m_systemUpdate, SIGNAL(downloadModeChanged()),
444 SIGNAL(downloadModeChanged()));
445 QObject::connect(&m_systemUpdate, SIGNAL(updateDownloaded()),
446- SIGNAL(systemUpdateDownloaded()));
447+ SLOT(updateDownloaded()));
448 QObject::connect(&m_systemUpdate, SIGNAL(updateProcessFailed(const QString&)),
449 SIGNAL(updateProcessFailed(QString)));
450 QObject::connect(&m_systemUpdate, SIGNAL(updateFailed(int, QString)),
451- SIGNAL(systemUpdateFailed(int, QString)));
452+ SLOT(updateFailed(int, QString)));
453 QObject::connect(&m_systemUpdate, SIGNAL(updatePaused(int)),
454 SLOT(systemUpdatePaused(int)));
455+ QObject::connect(&m_systemUpdate, SIGNAL(updateProgress(int, double)),
456+ SLOT(systemUpdateProgress(int, double)));
457+ QObject::connect(&m_systemUpdate, SIGNAL(rebooting(bool)),
458+ SIGNAL(rebooting(bool)));
459 }
460
461 UpdateManager::~UpdateManager()
462@@ -227,12 +231,46 @@
463 reportCheckState();
464 }
465
466+void UpdateManager::updateDownloaded()
467+{
468+ QString packagename(UBUNTU_PACKAGE_NAME);
469+ if (m_apps.contains(packagename)) {
470+ Update *update = m_apps[packagename];
471+ update->setSelected(false);
472+ update->setUpdateState(false);
473+ update->setUpdateReady(true);
474+ Q_EMIT systemUpdateDownloaded();
475+ }
476+}
477+void UpdateManager::updateFailed(int consecutiveFailureCount, QString lastReason)
478+{
479+ QString packagename(UBUNTU_PACKAGE_NAME);
480+ if (m_apps.contains(packagename)) {
481+ Update *update = m_apps[packagename];
482+ update->setSelected(false);
483+ update->setUpdateState(false);
484+ update->setDownloadProgress(0);
485+ Q_EMIT systemUpdateFailed(consecutiveFailureCount, lastReason);
486+ }
487+}
488+
489 void UpdateManager::systemUpdatePaused(int value)
490 {
491 QString packagename(UBUNTU_PACKAGE_NAME);
492 if (m_apps.contains(packagename)) {
493 Update *update = m_apps[packagename];
494 update->setSelected(true);
495+ update->setUpdateState(false);
496+ update->setDownloadProgress(value);
497+ }
498+}
499+
500+void UpdateManager::systemUpdateProgress(int value, double eta)
501+{
502+ Q_UNUSED(eta);
503+ QString packagename(UBUNTU_PACKAGE_NAME);
504+ if (m_apps.contains(packagename)) {
505+ Update *update = m_apps[packagename];
506 update->setDownloadProgress(value);
507 }
508 }
509
510=== modified file 'plugins/system-update/update_manager.h'
511--- plugins/system-update/update_manager.h 2014-09-08 16:42:27 +0000
512+++ plugins/system-update/update_manager.h 2014-09-29 16:29:38 +0000
513@@ -75,6 +75,7 @@
514 void updateProcessFailed(QString message);
515 void systemUpdateFailed(int consecutiveFailureCount, QString lastReason);
516 void versionChanged();
517+ void rebooting(bool status);
518
519 public:
520 explicit UpdateManager(QObject *parent = 0);
521@@ -114,7 +115,10 @@
522
523 private Q_SLOTS:
524 void clickUpdateNotAvailable();
525+ void updateFailed(int consecutiveFailureCount, QString lastReason);
526+ void updateDownloaded();
527 void systemUpdatePaused(int value);
528+ void systemUpdateProgress(int value, double eta);
529 void processOutput();
530 void processUpdates();
531 void downloadUrlObtained(const QString &packagename, const QString &url);

Subscribers

People subscribed via source and target branches