Merge lp:~fboucault/camera-app/sdcard into lp:camera-app
- sdcard
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Bill Filler |
Approved revision: | 436 |
Merged at revision: | 451 |
Proposed branch: | lp:~fboucault/camera-app/sdcard |
Merge into: | lp:camera-app |
Diff against target: |
285 lines (+136/-17) 6 files modified
GalleryView.qml (+3/-1) ViewFinderOverlay.qml (+36/-0) camera-apparmor.json (+1/-1) cameraapplication.cpp (+58/-0) cameraapplication.h (+11/-0) po/camera-app.pot (+27/-15) |
To merge this branch: | bzr merge lp:~fboucault/camera-app/sdcard |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
PS Jenkins bot | continuous-integration | Needs Fixing | |
Ubuntu Phablet Team | Pending | ||
Review via email: mp+241971@code.launchpad.net |
Commit message
Add an option to save photos and videos to external SD card.
Adapted bottom edge UI to accomodate for more than 3 settings.
Description of the change
PS Jenkins bot (ps-jenkins) wrote : | # |
- 427. By Florian Boucault
-
Blurred viewfinder is now darker making bottom edge more readable.
- 428. By Florian Boucault
-
Less opaque blur.
- 429. By Florian Boucault
-
Merged trunk
- 430. By Florian Boucault
-
Show/hide SD card option when an SD card is present/not present.
- 431. By Florian Boucault
-
Update pot
- 432. By Florian Boucault
-
Better backend code.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:431
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:432
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
Florian Boucault (fboucault) wrote : | # |
Pending two security fixes:
1) https:/
2) creation of Pictures and Videos directories on the SD card when plugged in (sergiusens taking care of it)
Florian Boucault (fboucault) wrote : | # |
> 2) creation of Pictures and Videos directories on the SD card when plugged in
> (sergiusens taking care of it)
Link: https:/
- 433. By Florian Boucault
-
Removed unwanted write/read paths from apparmor profile.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:433
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
UNSTABLE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
- 434. By Florian Boucault
-
Merged from trunk
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:434
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
- 435. By Florian Boucault
-
Merged from trunk
- 436. By Florian Boucault
-
Added bug
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:435
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
ABORTED: http://
UNSTABLE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:436
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
UNSTABLE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
Preview Diff
1 | === modified file 'GalleryView.qml' | |||
2 | --- GalleryView.qml 2014-12-03 12:37:15 +0000 | |||
3 | +++ GalleryView.qml 2014-12-11 16:55:23 +0000 | |||
4 | @@ -29,7 +29,9 @@ | |||
5 | 29 | property bool userSelectionMode: false | 29 | property bool userSelectionMode: false |
6 | 30 | property Item currentView: state == "GRID" ? photogridView : slideshowView | 30 | property Item currentView: state == "GRID" ? photogridView : slideshowView |
7 | 31 | property var model: FoldersModel { | 31 | property var model: FoldersModel { |
9 | 32 | folders: [application.picturesLocation, application.videosLocation] | 32 | folders: [application.picturesLocation, application.videosLocation, |
10 | 33 | application.removableStoragePicturesLocation, | ||
11 | 34 | application.removableStorageVideosLocation] | ||
12 | 33 | typeFilters: !main.contentExportMode ? [ "image", "video" ] | 35 | typeFilters: !main.contentExportMode ? [ "image", "video" ] |
13 | 34 | : [MimeTypeMapper.contentTypeToMimeType(main.transferContentType)] | 36 | : [MimeTypeMapper.contentTypeToMimeType(main.transferContentType)] |
14 | 35 | singleSelectionOnly: main.transfer.selectionType === ContentTransfer.Single | 37 | singleSelectionOnly: main.transfer.selectionType === ContentTransfer.Single |
15 | 36 | 38 | ||
16 | === modified file 'ViewFinderOverlay.qml' | |||
17 | --- ViewFinderOverlay.qml 2014-12-09 21:48:11 +0000 | |||
18 | +++ ViewFinderOverlay.qml 2014-12-11 16:55:23 +0000 | |||
19 | @@ -46,6 +46,7 @@ | |||
20 | 46 | property int selfTimerDelay: 0 | 46 | property int selfTimerDelay: 0 |
21 | 47 | property int encodingQuality: 2 // QMultimedia.NormalQuality | 47 | property int encodingQuality: 2 // QMultimedia.NormalQuality |
22 | 48 | property bool gridEnabled: false | 48 | property bool gridEnabled: false |
23 | 49 | property bool preferRemovableStorage: false | ||
24 | 49 | } | 50 | } |
25 | 50 | 51 | ||
26 | 51 | Binding { | 52 | Binding { |
27 | @@ -296,9 +297,39 @@ | |||
28 | 296 | label: QT_TR_NOOP("Off") | 297 | label: QT_TR_NOOP("Off") |
29 | 297 | value: false | 298 | value: false |
30 | 298 | } | 299 | } |
31 | 300 | }, | ||
32 | 301 | ListModel { | ||
33 | 302 | id: removableStorageOptionsModel | ||
34 | 303 | |||
35 | 304 | property string settingsProperty: "preferRemovableStorage" | ||
36 | 305 | property string icon: "" | ||
37 | 306 | property string label: i18n.tr("SD") | ||
38 | 307 | property bool isToggle: true | ||
39 | 308 | property int selectedIndex: bottomEdge.indexForValue(removableStorageOptionsModel, settings.preferRemovableStorage) | ||
40 | 309 | property bool available: application.removableStoragePresent | ||
41 | 310 | property bool visible: available | ||
42 | 311 | |||
43 | 312 | ListElement { | ||
44 | 313 | icon: "" | ||
45 | 314 | label: QT_TR_NOOP("Save to SD Card") | ||
46 | 315 | value: true | ||
47 | 316 | } | ||
48 | 317 | ListElement { | ||
49 | 318 | icon: "" | ||
50 | 319 | label: QT_TR_NOOP("Save internally") | ||
51 | 320 | value: false | ||
52 | 321 | } | ||
53 | 299 | } | 322 | } |
54 | 300 | ] | 323 | ] |
55 | 301 | 324 | ||
56 | 325 | /* FIXME: application.removableStoragePresent is not updated dynamically. | ||
57 | 326 | Workaround that by reading it when the bottom edge is opened/closed. | ||
58 | 327 | */ | ||
59 | 328 | Connections { | ||
60 | 329 | target: bottomEdge | ||
61 | 330 | onOpenedChanged: removableStorageOptionsModel.available = application.removableStoragePresent | ||
62 | 331 | } | ||
63 | 332 | |||
64 | 302 | function indexForValue(model, value) { | 333 | function indexForValue(model, value) { |
65 | 303 | var i; | 334 | var i; |
66 | 304 | var element; | 335 | var element; |
67 | @@ -418,6 +449,9 @@ | |||
68 | 418 | } | 449 | } |
69 | 419 | 450 | ||
70 | 420 | if (camera.captureMode == Camera.CaptureVideo) { | 451 | if (camera.captureMode == Camera.CaptureVideo) { |
71 | 452 | if (application.removableStoragePresent && settings.preferRemovableStorage) { | ||
72 | 453 | camera.videoRecorder.outputLocation = application.removableStorageVideosLocation; | ||
73 | 454 | } | ||
74 | 421 | if (camera.videoRecorder.recorderState == CameraRecorder.StoppedState) { | 455 | if (camera.videoRecorder.recorderState == CameraRecorder.StoppedState) { |
75 | 422 | camera.videoRecorder.setMetadata("Orientation", orientation); | 456 | camera.videoRecorder.setMetadata("Orientation", orientation); |
76 | 423 | camera.videoRecorder.record(); | 457 | camera.videoRecorder.record(); |
77 | @@ -441,6 +475,8 @@ | |||
78 | 441 | } | 475 | } |
79 | 442 | if (main.contentExportMode) { | 476 | if (main.contentExportMode) { |
80 | 443 | camera.imageCapture.captureToLocation(application.temporaryLocation); | 477 | camera.imageCapture.captureToLocation(application.temporaryLocation); |
81 | 478 | } else if (application.removableStoragePresent && settings.preferRemovableStorage) { | ||
82 | 479 | camera.imageCapture.captureToLocation(application.removableStoragePicturesLocation); | ||
83 | 444 | } else { | 480 | } else { |
84 | 445 | camera.imageCapture.captureToLocation(application.picturesLocation); | 481 | camera.imageCapture.captureToLocation(application.picturesLocation); |
85 | 446 | } | 482 | } |
86 | 447 | 483 | ||
87 | === modified file 'camera-apparmor.json' | |||
88 | --- camera-apparmor.json 2014-07-31 18:41:17 +0000 | |||
89 | +++ camera-apparmor.json 2014-12-11 16:55:23 +0000 | |||
90 | @@ -11,4 +11,4 @@ | |||
91 | 11 | "location" | 11 | "location" |
92 | 12 | ], | 12 | ], |
93 | 13 | "policy_version": 1.2 | 13 | "policy_version": 1.2 |
94 | 14 | } | ||
95 | 15 | \ No newline at end of file | 14 | \ No newline at end of file |
96 | 15 | } | ||
97 | 16 | 16 | ||
98 | === modified file 'cameraapplication.cpp' | |||
99 | --- cameraapplication.cpp 2014-09-03 18:51:53 +0000 | |||
100 | +++ cameraapplication.cpp 2014-12-11 16:55:23 +0000 | |||
101 | @@ -147,3 +147,61 @@ | |||
102 | 147 | dir.mkpath(location); | 147 | dir.mkpath(location); |
103 | 148 | return location; | 148 | return location; |
104 | 149 | } | 149 | } |
105 | 150 | |||
106 | 151 | bool CameraApplication::removableStoragePresent() const | ||
107 | 152 | { | ||
108 | 153 | return !removableStorageLocation().isEmpty(); | ||
109 | 154 | } | ||
110 | 155 | |||
111 | 156 | QString CameraApplication::removableStorageLocation() const | ||
112 | 157 | { | ||
113 | 158 | /* FIXME: when Qt5.4 is available, switch to using newly introduced | ||
114 | 159 | * QStorageInfo API. | ||
115 | 160 | * Ref.: http://doc-snapshot.qt-project.org/qt5-5.4/qstorageinfo.html | ||
116 | 161 | */ | ||
117 | 162 | QString userName = qgetenv("USER"); | ||
118 | 163 | QDir media("/media/" + userName); | ||
119 | 164 | QStringList mediaDirs = media.entryList(QDir::Dirs | QDir::NoDotAndDotDot); | ||
120 | 165 | |||
121 | 166 | if (mediaDirs.size() > 0) { | ||
122 | 167 | return QString("/media/" + userName + "/" + mediaDirs.at(0)); | ||
123 | 168 | } else { | ||
124 | 169 | return QString(); | ||
125 | 170 | } | ||
126 | 171 | } | ||
127 | 172 | |||
128 | 173 | QString CameraApplication::removableStoragePicturesLocation() const | ||
129 | 174 | { | ||
130 | 175 | QString storageLocation = removableStorageLocation(); | ||
131 | 176 | if (storageLocation.isEmpty()) { | ||
132 | 177 | return QString(); | ||
133 | 178 | } | ||
134 | 179 | |||
135 | 180 | QStringList locations = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation); | ||
136 | 181 | QString pictureDir = QString(locations.at(0)).split("/").value(3); | ||
137 | 182 | if (pictureDir.isEmpty()){ | ||
138 | 183 | return QString(); | ||
139 | 184 | } | ||
140 | 185 | QString location = storageLocation + "/" + pictureDir; | ||
141 | 186 | QDir dir; | ||
142 | 187 | dir.mkpath(location); | ||
143 | 188 | return location; | ||
144 | 189 | } | ||
145 | 190 | |||
146 | 191 | QString CameraApplication::removableStorageVideosLocation() const | ||
147 | 192 | { | ||
148 | 193 | QString storageLocation = removableStorageLocation(); | ||
149 | 194 | if (storageLocation.isEmpty()) { | ||
150 | 195 | return QString(); | ||
151 | 196 | } | ||
152 | 197 | |||
153 | 198 | QStringList locations = QStandardPaths::standardLocations(QStandardPaths::MoviesLocation); | ||
154 | 199 | QString movieDir = QString(locations.at(0)).split("/").value(3); | ||
155 | 200 | if (movieDir.isEmpty()){ | ||
156 | 201 | return QString(); | ||
157 | 202 | } | ||
158 | 203 | QString location = storageLocation + "/" + movieDir; | ||
159 | 204 | QDir dir; | ||
160 | 205 | dir.mkpath(location); | ||
161 | 206 | return location; | ||
162 | 207 | } | ||
163 | 150 | 208 | ||
164 | === modified file 'cameraapplication.h' | |||
165 | --- cameraapplication.h 2014-07-31 18:41:17 +0000 | |||
166 | +++ cameraapplication.h 2014-12-11 16:55:23 +0000 | |||
167 | @@ -32,6 +32,10 @@ | |||
168 | 32 | Q_PROPERTY(QString picturesLocation READ picturesLocation CONSTANT) | 32 | Q_PROPERTY(QString picturesLocation READ picturesLocation CONSTANT) |
169 | 33 | Q_PROPERTY(QString videosLocation READ videosLocation CONSTANT) | 33 | Q_PROPERTY(QString videosLocation READ videosLocation CONSTANT) |
170 | 34 | Q_PROPERTY(QString temporaryLocation READ temporaryLocation CONSTANT) | 34 | Q_PROPERTY(QString temporaryLocation READ temporaryLocation CONSTANT) |
171 | 35 | Q_PROPERTY(bool removableStoragePresent READ removableStoragePresent NOTIFY removableStoragePresentChanged) | ||
172 | 36 | Q_PROPERTY(QString removableStorageLocation READ removableStorageLocation CONSTANT) | ||
173 | 37 | Q_PROPERTY(QString removableStoragePicturesLocation READ removableStoragePicturesLocation CONSTANT) | ||
174 | 38 | Q_PROPERTY(QString removableStorageVideosLocation READ removableStorageVideosLocation CONSTANT) | ||
175 | 35 | 39 | ||
176 | 36 | public: | 40 | public: |
177 | 37 | CameraApplication(int &argc, char **argv); | 41 | CameraApplication(int &argc, char **argv); |
178 | @@ -41,6 +45,13 @@ | |||
179 | 41 | QString picturesLocation() const; | 45 | QString picturesLocation() const; |
180 | 42 | QString videosLocation() const; | 46 | QString videosLocation() const; |
181 | 43 | QString temporaryLocation() const; | 47 | QString temporaryLocation() const; |
182 | 48 | bool removableStoragePresent() const; | ||
183 | 49 | QString removableStorageLocation() const; | ||
184 | 50 | QString removableStoragePicturesLocation() const; | ||
185 | 51 | QString removableStorageVideosLocation() const; | ||
186 | 52 | |||
187 | 53 | Q_SIGNALS: | ||
188 | 54 | void removableStoragePresentChanged(); | ||
189 | 44 | 55 | ||
190 | 45 | private: | 56 | private: |
191 | 46 | QScopedPointer<QQuickView> m_view; | 57 | QScopedPointer<QQuickView> m_view; |
192 | 47 | 58 | ||
193 | === modified file 'po/camera-app.pot' | |||
194 | --- po/camera-app.pot 2014-12-08 11:49:38 +0000 | |||
195 | +++ po/camera-app.pot 2014-12-11 16:55:23 +0000 | |||
196 | @@ -8,7 +8,7 @@ | |||
197 | 8 | msgstr "" | 8 | msgstr "" |
198 | 9 | "Project-Id-Version: camera-app\n" | 9 | "Project-Id-Version: camera-app\n" |
199 | 10 | "Report-Msgid-Bugs-To: \n" | 10 | "Report-Msgid-Bugs-To: \n" |
201 | 11 | "POT-Creation-Date: 2014-12-08 09:47-0200\n" | 11 | "POT-Creation-Date: 2014-12-11 10:23-0200\n" |
202 | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
203 | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | 13 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
204 | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" | 14 | "Language-Team: LANGUAGE <LL@li.org>\n" |
205 | @@ -29,7 +29,7 @@ | |||
206 | 29 | msgid "Cancel" | 29 | msgid "Cancel" |
207 | 30 | msgstr "" | 30 | msgstr "" |
208 | 31 | 31 | ||
210 | 32 | #: ../GalleryView.qml:180 | 32 | #: ../GalleryView.qml:182 |
211 | 33 | msgid "No media available." | 33 | msgid "No media available." |
212 | 34 | msgstr "" | 34 | msgstr "" |
213 | 35 | 35 | ||
214 | @@ -49,46 +49,58 @@ | |||
215 | 49 | msgid "Share" | 49 | msgid "Share" |
216 | 50 | msgstr "" | 50 | msgstr "" |
217 | 51 | 51 | ||
221 | 52 | #: ../ViewFinderOverlay.qml:140 ../ViewFinderOverlay.qml:163 | 52 | #: ../ViewFinderOverlay.qml:141 ../ViewFinderOverlay.qml:164 |
222 | 53 | #: ../ViewFinderOverlay.qml:191 ../ViewFinderOverlay.qml:214 | 53 | #: ../ViewFinderOverlay.qml:192 ../ViewFinderOverlay.qml:215 |
223 | 54 | #: ../ViewFinderOverlay.qml:291 | 54 | #: ../ViewFinderOverlay.qml:292 |
224 | 55 | msgid "On" | 55 | msgid "On" |
225 | 56 | msgstr "" | 56 | msgstr "" |
226 | 57 | 57 | ||
230 | 58 | #: ../ViewFinderOverlay.qml:145 ../ViewFinderOverlay.qml:173 | 58 | #: ../ViewFinderOverlay.qml:146 ../ViewFinderOverlay.qml:174 |
231 | 59 | #: ../ViewFinderOverlay.qml:196 ../ViewFinderOverlay.qml:219 | 59 | #: ../ViewFinderOverlay.qml:197 ../ViewFinderOverlay.qml:220 |
232 | 60 | #: ../ViewFinderOverlay.qml:238 ../ViewFinderOverlay.qml:296 | 60 | #: ../ViewFinderOverlay.qml:239 ../ViewFinderOverlay.qml:297 |
233 | 61 | msgid "Off" | 61 | msgid "Off" |
234 | 62 | msgstr "" | 62 | msgstr "" |
235 | 63 | 63 | ||
237 | 64 | #: ../ViewFinderOverlay.qml:168 | 64 | #: ../ViewFinderOverlay.qml:169 |
238 | 65 | msgid "Auto" | 65 | msgid "Auto" |
239 | 66 | msgstr "" | 66 | msgstr "" |
240 | 67 | 67 | ||
242 | 68 | #: ../ViewFinderOverlay.qml:205 | 68 | #: ../ViewFinderOverlay.qml:206 |
243 | 69 | msgid "HDR" | 69 | msgid "HDR" |
244 | 70 | msgstr "" | 70 | msgstr "" |
245 | 71 | 71 | ||
247 | 72 | #: ../ViewFinderOverlay.qml:243 | 72 | #: ../ViewFinderOverlay.qml:244 |
248 | 73 | msgid "5 seconds" | 73 | msgid "5 seconds" |
249 | 74 | msgstr "" | 74 | msgstr "" |
250 | 75 | 75 | ||
252 | 76 | #: ../ViewFinderOverlay.qml:248 | 76 | #: ../ViewFinderOverlay.qml:249 |
253 | 77 | msgid "15 seconds" | 77 | msgid "15 seconds" |
254 | 78 | msgstr "" | 78 | msgstr "" |
255 | 79 | 79 | ||
257 | 80 | #: ../ViewFinderOverlay.qml:265 | 80 | #: ../ViewFinderOverlay.qml:266 |
258 | 81 | msgid "Fine Quality" | 81 | msgid "Fine Quality" |
259 | 82 | msgstr "" | 82 | msgstr "" |
260 | 83 | 83 | ||
262 | 84 | #: ../ViewFinderOverlay.qml:269 | 84 | #: ../ViewFinderOverlay.qml:270 |
263 | 85 | msgid "Normal Quality" | 85 | msgid "Normal Quality" |
264 | 86 | msgstr "" | 86 | msgstr "" |
265 | 87 | 87 | ||
267 | 88 | #: ../ViewFinderOverlay.qml:273 | 88 | #: ../ViewFinderOverlay.qml:274 |
268 | 89 | msgid "Basic Quality" | 89 | msgid "Basic Quality" |
269 | 90 | msgstr "" | 90 | msgstr "" |
270 | 91 | 91 | ||
271 | 92 | #: ../ViewFinderOverlay.qml:306 | ||
272 | 93 | msgid "SD" | ||
273 | 94 | msgstr "" | ||
274 | 95 | |||
275 | 96 | #: ../ViewFinderOverlay.qml:314 | ||
276 | 97 | msgid "Save to SD Card" | ||
277 | 98 | msgstr "" | ||
278 | 99 | |||
279 | 100 | #: ../ViewFinderOverlay.qml:319 | ||
280 | 101 | msgid "Save internally" | ||
281 | 102 | msgstr "" | ||
282 | 103 | |||
283 | 92 | #: ../camera-app.qml:36 | 104 | #: ../camera-app.qml:36 |
284 | 93 | msgid "Flash" | 105 | msgid "Flash" |
285 | 94 | msgstr "" | 106 | msgstr "" |
FAILED: Continuous integration, rev:426 jenkins. qa.ubuntu. com/job/ camera- app-ci/ 309/ jenkins. qa.ubuntu. com/job/ camera- app-vivid- amd64-ci/ 5 jenkins. qa.ubuntu. com/job/ camera- app-vivid- armhf-ci/ 5 jenkins. qa.ubuntu. com/job/ camera- app-vivid- armhf-ci/ 5/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ camera- app-vivid- i386-ci/ 5 jenkins. qa.ubuntu. com/job/ generic- click-autopilot -vivid- touch/16 jenkins. qa.ubuntu. com/job/ generic- mediumtests- vivid/156 jenkins. qa.ubuntu. com/job/ generic- click-autopilot -runner- mako/659 jenkins. qa.ubuntu. com/job/ generic- click-builder- vivid-armhf/ 33 s-jenkins. ubuntu- ci:8080/ job/touch- flash-device/ 15893 jenkins. qa.ubuntu. com/job/ autopilot- testrunner- otto-vivid/ 135 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- vivid-amd64/ 160 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- vivid-amd64/ 160/artifact/ work/output/ *zip*/output. zip
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
UNSTABLE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/camera- app-ci/ 309/rebuild
http://