Merge lp:~ken-vandine/ubuntu-system-settings/custom_ringtone into lp:ubuntu-system-settings
- custom_ringtone
- Merge into trunk
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Jonas G. Drange | ||||
Approved revision: | 1562 | ||||
Merged at revision: | 1564 | ||||
Proposed branch: | lp:~ken-vandine/ubuntu-system-settings/custom_ringtone | ||||
Merge into: | lp:ubuntu-system-settings | ||||
Diff against target: |
355 lines (+202/-50) 4 files modified
plugins/background/MainPage.qml (+1/-1) plugins/sound/SoundsList.qml (+176/-49) plugins/sound/sound.cpp (+19/-0) plugins/sound/sound.h (+6/-0) |
||||
To merge this branch: | bzr merge lp:~ken-vandine/ubuntu-system-settings/custom_ringtone | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot | continuous-integration | Needs Fixing | |
Jonas G. Drange (community) | Approve | ||
Review via email: mp+277576@code.launchpad.net |
Commit message
Allow setting custom ringtone with content-hub
Description of the change
Allow setting custom ringtone with content-hub
PS Jenkins bot (ps-jenkins) wrote : | # |
- 1557. By Ken VanDine
-
delete custom ringtone when it's no longer used
- 1558. By Ken VanDine
-
don't remove custom ringtone if it's still being used for other messages
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:1558
http://
Executed test runs:
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
- 1559. By Ken VanDine
-
Updated visuals of the stop playback control to match design
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:1559
http://
Executed test runs:
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:1559
http://
Executed test runs:
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 1560. By Ken VanDine
-
Don't specifically set the height on the ItemSelector
Jonas G. Drange (jonas-drange) wrote : | # |
Two issues:
* There's a bug in the flickable. I'm unable to scroll to the end. Let me create some steps to repro
* double header http://
Otherwise it works well and looks good!
Jonas G. Drange (jonas-drange) wrote : | # |
Steps to repro:
1. USS -> Sound -> Ringtone
2. Quickly swipe down in the list
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:1560
http://
Executed test runs:
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 1561. By Ken VanDine
-
Fixes in the SoundsList flickable
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:1561
http://
Executed test runs:
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 1562. By Ken VanDine
-
Don't show the page title in the peer picker and use progression to indicate the peer picker is a page
Jonas G. Drange (jonas-drange) wrote : | # |
Looks good and works well. Thanks!
- 1563. By Ken VanDine
-
Only show the custom ringtone picker for incoming calls
- 1564. By Ken VanDine
-
merged trunk
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:1562
http://
Executed test runs:
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 1565. By Ken VanDine
-
Don't include the custom ringtone for messages
Preview Diff
1 | === modified file 'plugins/background/MainPage.qml' | |||
2 | --- plugins/background/MainPage.qml 2015-08-10 13:31:45 +0000 | |||
3 | +++ plugins/background/MainPage.qml 2015-11-20 13:12:56 +0000 | |||
4 | @@ -21,7 +21,7 @@ | |||
5 | 21 | import QtQuick 2.4 | 21 | import QtQuick 2.4 |
6 | 22 | import GSettings 1.0 | 22 | import GSettings 1.0 |
7 | 23 | import SystemSettings 1.0 | 23 | import SystemSettings 1.0 |
9 | 24 | import Ubuntu.Content 0.1 | 24 | import Ubuntu.Content 1.3 |
10 | 25 | import Ubuntu.Components 1.3 | 25 | import Ubuntu.Components 1.3 |
11 | 26 | import Ubuntu.Components.ListItems 1.3 as ListItem | 26 | import Ubuntu.Components.ListItems 1.3 as ListItem |
12 | 27 | import Ubuntu.Components.Popups 1.3 | 27 | import Ubuntu.Components.Popups 1.3 |
13 | 28 | 28 | ||
14 | === modified file 'plugins/sound/SoundsList.qml' | |||
15 | --- plugins/sound/SoundsList.qml 2015-10-16 13:42:50 +0000 | |||
16 | +++ plugins/sound/SoundsList.qml 2015-11-20 13:12:56 +0000 | |||
17 | @@ -2,6 +2,7 @@ | |||
18 | 2 | import QtQuick 2.4 | 2 | import QtQuick 2.4 |
19 | 3 | import QtMultimedia 5.0 | 3 | import QtMultimedia 5.0 |
20 | 4 | import SystemSettings 1.0 | 4 | import SystemSettings 1.0 |
21 | 5 | import Ubuntu.Content 1.3 | ||
22 | 5 | import Ubuntu.Components 1.3 | 6 | import Ubuntu.Components 1.3 |
23 | 6 | import Ubuntu.Components.ListItems 1.3 as ListItem | 7 | import Ubuntu.Components.ListItems 1.3 as ListItem |
24 | 7 | import Ubuntu.SystemSettings.Sound 1.0 | 8 | import Ubuntu.SystemSettings.Sound 1.0 |
25 | @@ -12,13 +13,25 @@ | |||
26 | 12 | ItemPage { | 13 | ItemPage { |
27 | 13 | property variant soundDisplayNames: | 14 | property variant soundDisplayNames: |
28 | 14 | Utilities.buildSoundValues(soundFileNames) | 15 | Utilities.buildSoundValues(soundFileNames) |
31 | 15 | property variant soundFileNames: backendInfo.listSounds( | 16 | property variant soundFileNames: refreshSoundFileNames() |
30 | 16 | [soundsDir, "/custom" + soundsDir]) | ||
32 | 17 | property bool showStopButton: false | 17 | property bool showStopButton: false |
33 | 18 | property int soundType // 0: ringtone, 1: message | 18 | property int soundType // 0: ringtone, 1: message |
34 | 19 | property string soundsDir | 19 | property string soundsDir |
35 | 20 | property var activeTransfer | ||
36 | 21 | |||
37 | 22 | onSoundFileNamesChanged: { | ||
38 | 23 | soundDisplayNames = Utilities.buildSoundValues(soundFileNames) | ||
39 | 24 | updateSelectedIndex() | ||
40 | 25 | } | ||
41 | 20 | 26 | ||
42 | 21 | id: soundsPage | 27 | id: soundsPage |
43 | 28 | flickable: scrollWidget | ||
44 | 29 | |||
45 | 30 | function refreshSoundFileNames() { | ||
46 | 31 | if (soundType === 0) | ||
47 | 32 | return backendInfo.listSounds([soundsDir, "/custom" + soundsDir, backendInfo.customRingtonePath]) | ||
48 | 33 | return backendInfo.listSounds([soundsDir, "/custom" + soundsDir]) | ||
49 | 34 | } | ||
50 | 22 | 35 | ||
51 | 23 | UbuntuSoundPanel { | 36 | UbuntuSoundPanel { |
52 | 24 | id: backendInfo | 37 | id: backendInfo |
53 | @@ -55,52 +68,166 @@ | |||
54 | 55 | audioRole: MediaPlayer.alert | 68 | audioRole: MediaPlayer.alert |
55 | 56 | } | 69 | } |
56 | 57 | 70 | ||
70 | 58 | Column { | 71 | function setRingtone(path) { |
71 | 59 | id: columnId | 72 | if (soundType == 0) { |
72 | 60 | anchors.left: parent.left | 73 | soundSettings.incomingCallSound = path |
73 | 61 | anchors.right: parent.right | 74 | backendInfo.incomingCallSound = path |
74 | 62 | 75 | } else if (soundType == 1) { | |
75 | 63 | ListItem.SingleControl { | 76 | soundSettings.incomingMessageSound = path |
76 | 64 | id: listId | 77 | backendInfo.incomingMessageSound = path |
77 | 65 | control: Button { | 78 | } |
78 | 66 | text: i18n.tr("Stop playing") | 79 | soundFileNames = refreshSoundFileNames() |
79 | 67 | width: parent.width - units.gu(4) | 80 | soundEffect.source = path |
80 | 68 | onClicked: | 81 | soundEffect.play() |
81 | 69 | soundEffect.stop() | 82 | } |
82 | 70 | } | 83 | |
83 | 84 | function updateSelectedIndex() { | ||
84 | 85 | if (soundType == 0) | ||
85 | 86 | soundSelector.selectedIndex = | ||
86 | 87 | Utilities.indexSelectedFile(soundFileNames, | ||
87 | 88 | backendInfo.incomingCallSound) | ||
88 | 89 | else if (soundType == 1) | ||
89 | 90 | soundSelector.selectedIndex = | ||
90 | 91 | Utilities.indexSelectedFile(soundFileNames, | ||
91 | 92 | backendInfo.incomingMessageSound) | ||
92 | 93 | } | ||
93 | 94 | |||
94 | 95 | Flickable { | ||
95 | 96 | id: scrollWidget | ||
96 | 97 | anchors.fill: parent | ||
97 | 98 | contentWidth: parent.width | ||
98 | 99 | contentHeight: selectorColumn.height + stopItem.height | ||
99 | 100 | boundsBehavior: (contentHeight > height) ? | ||
100 | 101 | Flickable.DragAndOvershootBounds : | ||
101 | 102 | Flickable.StopAtBounds | ||
102 | 103 | /* Set the direction to workaround https://bugreports.qt-project.org/browse/QTBUG-31905 | ||
103 | 104 | otherwise the UI might end up in a situation where scrolling doesn't work */ | ||
104 | 105 | flickableDirection: Flickable.VerticalFlick | ||
105 | 106 | |||
106 | 107 | Column { | ||
107 | 108 | id: selectorColumn | ||
108 | 109 | anchors.left: parent.left | ||
109 | 110 | anchors.right: parent.right | ||
110 | 111 | |||
111 | 112 | ListItem.ItemSelector { | ||
112 | 113 | id: soundSelector | ||
113 | 114 | expanded: true | ||
114 | 115 | model: soundDisplayNames | ||
115 | 116 | selectedIndex: { | ||
116 | 117 | updateSelectedIndex() | ||
117 | 118 | } | ||
118 | 119 | onDelegateClicked: { | ||
119 | 120 | setRingtone(soundFileNames[index]) | ||
120 | 121 | } | ||
121 | 122 | } | ||
122 | 123 | |||
123 | 124 | ListItem.Standard { | ||
124 | 125 | id: customRingtone | ||
125 | 126 | text: i18n.tr("Custom Ringtone") | ||
126 | 127 | visible: soundType === 0 | ||
127 | 128 | progression: true | ||
128 | 129 | onClicked: { | ||
129 | 130 | pageStack.push(picker); | ||
130 | 131 | } | ||
131 | 132 | } | ||
132 | 133 | } | ||
133 | 134 | } | ||
134 | 135 | |||
135 | 136 | ListItem.SingleControl { | ||
136 | 137 | id: stopItem | ||
137 | 138 | anchors.bottom: parent.bottom | ||
138 | 139 | control: AbstractButton { | ||
139 | 140 | id: stopButton | ||
140 | 141 | anchors.verticalCenter: parent.verticalCenter | ||
141 | 142 | anchors.horizontalCenter: parent.horizontalCenter | ||
142 | 143 | focus: false | ||
143 | 144 | width: height | ||
144 | 145 | height: units.gu(4) | ||
145 | 71 | enabled: soundEffect.playbackState == Audio.PlayingState | 146 | enabled: soundEffect.playbackState == Audio.PlayingState |
180 | 72 | visible: showStopButton | 147 | visible: enabled |
181 | 73 | } | 148 | |
182 | 74 | } | 149 | onClicked: soundEffect.stop() |
183 | 75 | 150 | ||
184 | 76 | ListItem.ItemSelector { | 151 | Rectangle { |
185 | 77 | id: soundSelector | 152 | anchors.fill: parent |
186 | 78 | anchors.top: columnId.bottom | 153 | radius: width * 0.5 |
187 | 79 | anchors.bottom: soundsPage.bottom | 154 | border.color: UbuntuColors.warmGrey |
188 | 80 | containerHeight: height | 155 | border.width: 1 |
189 | 81 | 156 | } | |
190 | 82 | expanded: true | 157 | |
191 | 83 | model: soundDisplayNames | 158 | Rectangle { |
192 | 84 | selectedIndex: { | 159 | width: parent.height * 0.4 |
193 | 85 | if (soundType == 0) | 160 | height: width |
194 | 86 | soundSelector.selectedIndex = | 161 | smooth: true |
195 | 87 | Utilities.indexSelectedFile(soundFileNames, | 162 | anchors { |
196 | 88 | backendInfo.incomingCallSound) | 163 | verticalCenter: parent.verticalCenter |
197 | 89 | else if (soundType == 1) | 164 | horizontalCenter: parent.horizontalCenter |
198 | 90 | soundSelector.selectedIndex = | 165 | } |
199 | 91 | Utilities.indexSelectedFile(soundFileNames, | 166 | color: UbuntuColors.warmGrey |
200 | 92 | backendInfo.incomingMessageSound) | 167 | } |
201 | 93 | } | 168 | } |
202 | 94 | onDelegateClicked: { | 169 | Rectangle { |
203 | 95 | if (soundType == 0) { | 170 | anchors.fill: parent |
204 | 96 | soundSettings.incomingCallSound = soundFileNames[index] | 171 | z: parent.z - 1 |
205 | 97 | backendInfo.incomingCallSound = soundFileNames[index] | 172 | visible: stopButton.visible |
206 | 98 | } else if (soundType == 1) { | 173 | color: Theme.palette.normal.background |
207 | 99 | soundSettings.incomingMessageSound = soundFileNames[index] | 174 | } |
208 | 100 | backendInfo.incomingMessageSound = soundFileNames[index] | 175 | } |
209 | 101 | } | 176 | |
210 | 102 | soundEffect.source = soundFileNames[index] | 177 | Connections { |
211 | 103 | soundEffect.play() | 178 | id: contentHubConnection |
212 | 104 | } | 179 | property var ringtoneCallback |
213 | 105 | } | 180 | target: activeTransfer ? activeTransfer : null |
214 | 181 | onStateChanged: { | ||
215 | 182 | if (activeTransfer.state === ContentTransfer.Charged) { | ||
216 | 183 | if (activeTransfer.items.length > 0) { | ||
217 | 184 | var toneUri = activeTransfer.items[0].url; | ||
218 | 185 | ringtoneCallback(toneUri); | ||
219 | 186 | } | ||
220 | 187 | } | ||
221 | 188 | } | ||
222 | 189 | } | ||
223 | 190 | |||
224 | 191 | Page { | ||
225 | 192 | id: picker | ||
226 | 193 | visible: false | ||
227 | 194 | |||
228 | 195 | ContentStore { | ||
229 | 196 | id: appStore | ||
230 | 197 | scope: ContentScope.App | ||
231 | 198 | } | ||
232 | 199 | |||
233 | 200 | ContentPeerPicker { | ||
234 | 201 | id: peerPicker | ||
235 | 202 | visible: parent.visible | ||
236 | 203 | handler: ContentHandler.Source | ||
237 | 204 | contentType: ContentType.Music | ||
238 | 205 | showTitle: false | ||
239 | 206 | |||
240 | 207 | onPeerSelected: { | ||
241 | 208 | pageStack.pop(); | ||
242 | 209 | // requests an active transfer from peer | ||
243 | 210 | function startContentTransfer(callback) { | ||
244 | 211 | if (callback) | ||
245 | 212 | contentHubConnection.ringtoneCallback = callback | ||
246 | 213 | var transfer = peer.request(appStore); | ||
247 | 214 | if (transfer !== null) { | ||
248 | 215 | soundsPage.activeTransfer = transfer; | ||
249 | 216 | } | ||
250 | 217 | } | ||
251 | 218 | peer.selectionType = ContentTransfer.Single; | ||
252 | 219 | startContentTransfer(function(uri) { | ||
253 | 220 | setRingtone(uri.toString().replace("file:///", "/")); | ||
254 | 221 | }); | ||
255 | 222 | } | ||
256 | 223 | |||
257 | 224 | onCancelPressed: pageStack.pop(); | ||
258 | 225 | } | ||
259 | 226 | } | ||
260 | 227 | |||
261 | 228 | ContentTransferHint { | ||
262 | 229 | anchors.fill: parent | ||
263 | 230 | activeTransfer: soundsPage.activeTransfer | ||
264 | 231 | } | ||
265 | 232 | |||
266 | 106 | } | 233 | } |
267 | 107 | 234 | ||
268 | === modified file 'plugins/sound/sound.cpp' | |||
269 | --- plugins/sound/sound.cpp 2015-01-28 11:37:35 +0000 | |||
270 | +++ plugins/sound/sound.cpp 2015-11-20 13:12:56 +0000 | |||
271 | @@ -21,6 +21,8 @@ | |||
272 | 21 | #include "sound.h" | 21 | #include "sound.h" |
273 | 22 | 22 | ||
274 | 23 | #include <QDir> | 23 | #include <QDir> |
275 | 24 | #include <QFile> | ||
276 | 25 | #include <QStandardPaths> | ||
277 | 24 | #include <unistd.h> | 26 | #include <unistd.h> |
278 | 25 | 27 | ||
279 | 26 | #define AS_INTERFACE "com.ubuntu.touch.AccountsService.Sound" | 28 | #define AS_INTERFACE "com.ubuntu.touch.AccountsService.Sound" |
280 | @@ -88,10 +90,16 @@ | |||
281 | 88 | if (sound == getIncomingCallSound()) | 90 | if (sound == getIncomingCallSound()) |
282 | 89 | return; | 91 | return; |
283 | 90 | 92 | ||
284 | 93 | QString prevSound = getIncomingCallSound(); | ||
285 | 94 | |||
286 | 91 | m_accountsService.setUserProperty(AS_INTERFACE, | 95 | m_accountsService.setUserProperty(AS_INTERFACE, |
287 | 92 | "IncomingCallSound", | 96 | "IncomingCallSound", |
288 | 93 | QVariant::fromValue(sound)); | 97 | QVariant::fromValue(sound)); |
289 | 94 | Q_EMIT(incomingCallSoundChanged()); | 98 | Q_EMIT(incomingCallSoundChanged()); |
290 | 99 | |||
291 | 100 | if (prevSound.startsWith(QString(QStandardPaths::writableLocation(QStandardPaths::DataLocation))) && | ||
292 | 101 | prevSound != getIncomingMessageSound()) | ||
293 | 102 | QFile(prevSound).remove(); | ||
294 | 95 | } | 103 | } |
295 | 96 | 104 | ||
296 | 97 | QString Sound::getIncomingMessageSound() | 105 | QString Sound::getIncomingMessageSound() |
297 | @@ -105,10 +113,16 @@ | |||
298 | 105 | if (sound == getIncomingMessageSound()) | 113 | if (sound == getIncomingMessageSound()) |
299 | 106 | return; | 114 | return; |
300 | 107 | 115 | ||
301 | 116 | QString prevSound = getIncomingMessageSound(); | ||
302 | 117 | |||
303 | 108 | m_accountsService.setUserProperty(AS_INTERFACE, | 118 | m_accountsService.setUserProperty(AS_INTERFACE, |
304 | 109 | "IncomingMessageSound", | 119 | "IncomingMessageSound", |
305 | 110 | QVariant::fromValue(sound)); | 120 | QVariant::fromValue(sound)); |
306 | 121 | |||
307 | 111 | Q_EMIT(incomingMessageSoundChanged()); | 122 | Q_EMIT(incomingMessageSoundChanged()); |
308 | 123 | if (prevSound.startsWith(QString(QStandardPaths::writableLocation(QStandardPaths::DataLocation))) && | ||
309 | 124 | prevSound != getIncomingCallSound()) | ||
310 | 125 | QFile(prevSound).remove(); | ||
311 | 112 | } | 126 | } |
312 | 113 | 127 | ||
313 | 114 | bool Sound::getIncomingCallVibrate() | 128 | bool Sound::getIncomingCallVibrate() |
314 | @@ -213,6 +227,11 @@ | |||
315 | 213 | Q_EMIT(dialpadSoundsEnabledChanged()); | 227 | Q_EMIT(dialpadSoundsEnabledChanged()); |
316 | 214 | } | 228 | } |
317 | 215 | 229 | ||
318 | 230 | QString Sound::customRingtonePath() | ||
319 | 231 | { | ||
320 | 232 | return QString(QStandardPaths::writableLocation(QStandardPaths::DataLocation) + "/Music"); | ||
321 | 233 | } | ||
322 | 234 | |||
323 | 216 | QStringList soundsListFromDir(const QString &dirString) | 235 | QStringList soundsListFromDir(const QString &dirString) |
324 | 217 | { | 236 | { |
325 | 218 | QDir soundsDir(dirString); | 237 | QDir soundsDir(dirString); |
326 | 219 | 238 | ||
327 | === modified file 'plugins/sound/sound.h' | |||
328 | --- plugins/sound/sound.h 2015-01-28 11:37:35 +0000 | |||
329 | +++ plugins/sound/sound.h 2015-11-20 13:12:56 +0000 | |||
330 | @@ -67,6 +67,10 @@ | |||
331 | 67 | WRITE setDialpadSoundsEnabled | 67 | WRITE setDialpadSoundsEnabled |
332 | 68 | NOTIFY dialpadSoundsEnabledChanged) | 68 | NOTIFY dialpadSoundsEnabledChanged) |
333 | 69 | 69 | ||
334 | 70 | Q_PROPERTY (QString customRingtonePath | ||
335 | 71 | READ customRingtonePath | ||
336 | 72 | NOTIFY customRingtonePathChanged) | ||
337 | 73 | |||
338 | 70 | 74 | ||
339 | 71 | public Q_SLOTS: | 75 | public Q_SLOTS: |
340 | 72 | void slotChanged(QString, QString); | 76 | void slotChanged(QString, QString); |
341 | @@ -81,6 +85,7 @@ | |||
342 | 81 | void incomingMessageVibrateSilentModeChanged(); | 85 | void incomingMessageVibrateSilentModeChanged(); |
343 | 82 | void otherVibrateChanged(); | 86 | void otherVibrateChanged(); |
344 | 83 | void dialpadSoundsEnabledChanged(); | 87 | void dialpadSoundsEnabledChanged(); |
345 | 88 | void customRingtonePathChanged(); | ||
346 | 84 | 89 | ||
347 | 85 | private: | 90 | private: |
348 | 86 | AccountsService m_accountsService; | 91 | AccountsService m_accountsService; |
349 | @@ -101,6 +106,7 @@ | |||
350 | 101 | void setOtherVibrate(bool enabled); | 106 | void setOtherVibrate(bool enabled); |
351 | 102 | bool getDialpadSoundsEnabled(); | 107 | bool getDialpadSoundsEnabled(); |
352 | 103 | void setDialpadSoundsEnabled(bool enabled); | 108 | void setDialpadSoundsEnabled(bool enabled); |
353 | 109 | QString customRingtonePath(); | ||
354 | 104 | 110 | ||
355 | 105 | }; | 111 | }; |
356 | 106 | 112 |
FAILED: Continuous integration, rev:1556 jenkins. qa.ubuntu. com/job/ ubuntu- system- settings- ci/2481/ jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- vivid-touch/ 5172/console jenkins. qa.ubuntu. com/job/ ubuntu- system- settings- vivid-amd64- ci/256 jenkins. qa.ubuntu. com/job/ ubuntu- system- settings- vivid-i386- ci/665 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- vivid-armhf/ 5186 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- vivid-armhf/ 5186/artifact/ work/output/ *zip*/output. zip
http://
Executed test runs:
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/ubuntu- system- settings- ci/2481/ rebuild
http://