Merge lp:~paulliu/unity8/zoomImage into lp:unity8
- zoomImage
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Albert Astals Cid |
Approved revision: | 754 |
Merged at revision: | 873 |
Proposed branch: | lp:~paulliu/unity8/zoomImage |
Merge into: | lp:unity8 |
Diff against target: |
467 lines (+383/-10) 7 files modified
qml/Components/LazyImage.qml (+1/-0) qml/Components/ZoomableImage.qml (+153/-0) qml/Dash/Previews/PreviewZoomableImage.qml (+4/-7) tests/qmltests/CMakeLists.txt (+1/-0) tests/qmltests/Components/tst_ZoomableImage.qml (+192/-0) tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml (+6/-3) tests/utils/modules/Unity/Test/UnityTestCase.qml (+26/-0) |
To merge this branch: | bzr merge lp:~paulliu/unity8/zoomImage |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Albert Astals Cid (community) | Approve | ||
PS Jenkins bot (community) | continuous-integration | Needs Fixing | |
Andrea Cimitan (community) | Needs Fixing | ||
Michał Sawicz | Needs Information | ||
Review via email: mp+207941@code.launchpad.net |
Commit message
Add Zoomable Image for Preview widgets.
Description of the change
* Are there any related MPs required for this MP to build/function as expected?
No.
* Did you perform an exploratory manual test run of your code change and any related functionality?
Yes
* If you changed the packaging (debian), did you subscribe the ubuntu-unity team to this MP?
N/A
* If you changed the UI, has there been a design review?
N/A
- 736. By Ying-Chun Liu
-
Fix coding style.
PS Jenkins bot (ps-jenkins) wrote : | # |
Michał Sawicz (saviq) wrote : | # |
qml/Dash/
- 737. By Ying-Chun Liu
-
fix whitespace error.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:737
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
FAILURE: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Michał Sawicz (saviq) wrote : | # |
Is AnimatedImage used here for a reason?
Ying-Chun Liu (paulliu) wrote : | # |
No. So should I use LazyImage here?
Michał Sawicz (saviq) wrote : | # |
AnimatedImage is meant for... animated, as in multiple-frame images, which we don't expect to support here. Yes, use LazyImage to maintain the loading transitions.
- 738. By Ying-Chun Liu
-
Use LazyImage instead of AnimatedImage
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:738
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
FAILURE: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Andrea Cimitan (cimi) wrote : | # |
Where did you get all the logic for the pinch to zoom? It does make sense to me to have this zoomable image as a separate component, then integrated into the preview, rather than having it directly here in the previews. I'd then add it to either the SDK or the Components folder in qml/Components unity8. (then more tests for it!)
Ying-Chun Liu (paulliu) wrote : | # |
OK. I'll re-factor it to the Components folder.
Albert Astals Cid (aacid) wrote : | # |
Doesn't merge with current unity8 trunk
- 739. By Ying-Chun Liu
-
Move ZoomableImage to Components.
Add more unit tests. - 740. By Ying-Chun Liu
-
Merge trunk.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:739
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
SUCCESS: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:740
http://
Executed test runs:
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:740
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Andrea Cimitan (cimi) wrote : | # |
I noticed that the code for ZoomableImage comes from http://
that is GPLv2 or GPLv3 (both mentioned in the copyright file)
I'd like to see some clarification on the algorithm used, especially this multiplication for 0.98 in calculateSize
Tests:
- ZoomableImage
I'd also make tests more robust, by checking if the scale is exactly the one expected, and not only if the image zooms in or out.
Adding wait for the pinch action to the mouse events is not optimal, and might not work with jenkins (I'd like a comment from danrader on that).
- Preview
The
58 + wait(3000);
Looks like a mistake, should be replaced with a tryCompare if you need to wait for a partcular state to load.
I'd not replicate (almost) the test of the zoomable image (this is already tested), but just add the bits we need to test on the integration.
- 741. By Ying-Chun Liu
-
Rewrite the zoomable image code.
- 742. By Ying-Chun Liu
-
Remove the tests which are already in ZoomableImage's test.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:741
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:742
http://
Executed test runs:
UNSTABLE: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 743. By Ying-Chun Liu
-
Fix PreviewZoomable
Image unit test. - 744. By Ying-Chun Liu
-
merge trunk
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:744
http://
Executed test runs:
FAILURE: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
- 745. By Ying-Chun Liu
-
Test scale factor.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:745
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
Can you please set widgetData1 as default widget data so when we do
make tryPreviewZooma
and we have merged lp:~mzanetti/unity8/fix-make-trySomething-qt-5.2 we got something?
Albert Astals Cid (aacid) wrote : | # |
Also how did you test this?
- 746. By Ying-Chun Liu
-
Add testing mouse wheel and flickable width and height.
Ying-Chun Liu (paulliu) wrote : | # |
ok. I'll add it. But I'm currently encountering a strange bug.
PinchArea receives nothing again. I'm checking it.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:746
http://
Executed test runs:
UNSTABLE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
- 747. By Ying-Chun Liu
-
Fix PinchArea and tests.
- 748. By Ying-Chun Liu
-
Fix some unit test.
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:747
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: 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:748
http://
Executed test runs:
SUCCESS: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: 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:748
http://
Executed test runs:
UNSTABLE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
- 749. By Ying-Chun Liu
-
Add zoom-out unit test
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:749
http://
Executed test runs:
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
Can you please merge trunk into it? Otherwise it doesn't build.
Albert Astals Cid (aacid) wrote : | # |
testZoomableImage doesn't pass here
tsdgeos_
Scanning dependencies of target testZoomableImage
********* Start testing of qmltestrunner *********
Config: Using QtTest library 5.2.1, Qt 5.2.1
PASS : qmltestrunner:
PASS : qmltestrunner:
PASS : qmltestrunner:
PASS : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
QDEBUG : qmltestrunner:
- 750. By Ying-Chun Liu
-
Merge upstream
[ Albert Astals ]
* Fix last item X position Fixes clicking on the last item sometimes
not working (LP: #1301871)
* Use upstart in ./run Makes it so that you can use the lock button on
the device without getting that nasty hwc crash
* Remove AnimationControllerWithSignals .
* Use the correct delegate base item for the Carousel test
* Some simplification in DashContent Kill the ScopeDelegateMapper in
favour of a simple if (that will eventually go away). Removal of all
the fake scopes in the tests that added nothing of value to the
tests. Removal of movementEnded signal that was unused. Removal of
movementStarted and positionedAtBeginning signals that were being
used as function calls. Rework DashContent tests so they what the
function does what it is supposed to do instead of just making sure
QML signals work .
* Improve Card creation time by adding loaders that make sure only
what's needed is loaded In my computer it goes from RESULT :
qmltestrunner::benchmark_ time:"cardTitle ArtSubtitleMasc otSummaryMode
l": 3.217 msecs per iteration (total: 3,218, iterations: 1000)
RESULT :
qmltestrunner::benchmark_ time:"cardTitle ArtSubtitleMasc otModel" :
1.647 msecs per iteration (total: 1,648, iterations: 1000) RESULT :
qmltestrunner::benchmark_ time:"cardTitle ArtSubtitleMode l": 1.514
msecs per iteration (total: 1,515, iterations: 1000) RESULT :
qmltestrunner::benchmark_ time:"cardTitle ArtModel" : 1.471 msecs per
iteration (total: 1,471, iterations: 1000) RESULT :
qmltestrunner::benchmark_ time:"cardArtMo del": 1.447 msecs per
iteration (total: 1,448, iterations: 1000) RESULT :
qmltestrunner::benchmark_ time:"cardTitle Model": 1.276 msecs per
iteration (total: 1,276, iterations: 1000) to RESULT :
qmltestrunner::benchmark_ time:"cardTitle ArtSubtitleMasc otSummaryMode
l": 2.916 msecs per iteration (total: 2,917, iterations: 1000)
RESULT :
qmltestrunner::benchmark_ time:"cardTitle ArtSubtitleMasc otModel" :
1.504 msecs per iteration (total: 1,504, iterations: 1000) RESULT :
qmltestrunner::benchmark_ time:"cardTitle ArtSubtitleMode l": 1.060
msecs per iteration (total: 1,061, iterations: 1000) RESULT :
qmltestrunner::benchmark_ time:"cardTitle ArtModel" : 1.052 msecs per
iteration (total: 1,053, iterations: 1000) RESULT :
qmltestrunner::benchmark_ time:"cardArtMo del": 0.727 msecs per
iteration (total: 728, iterations: 1000) RESULT :
qmltestrunner::benchmark_ time:"cardTitle Model": 0.817 msecs per
iteration (total: 818, iterations: 1000) (LP: #1297197)
[ Allan LeSage ]
* DashApps emulator get_applications should return a list ordered by
visible y, x.
[ Andrea Cimitan ]
* Workaround for lp1301309 until fixes for palette in ui toolkit (LP:
#1301309)
[ Leo Arias ]
* Reverted the change that returns application cards instead of
titles.
[ Nick Dedekind ]
* Indicator services started by unity8 upstart configuration rather
than manual emmision from indicator manager.
[ Mirco Müller ]
* Fix notification ap-test assertions.
[ Michael Terry ]
* Use new tablet and phone backgrounds from Design.
[ Michael Zanetti ]
* workaround the QTestLogger assertion issue with make tryXyz and our
custom uqmlscene
[ Michael Terry ]
* When an application requests focus, handle it in Shell.qml by hiding
the greeter and stopping any edge demo. (LP: #1227753)
[ Leo Arias ]
* Use subprocess.check_call when caling url-dispatcher, so an error
will be raised if it fails.
* Test application life cycle with fake apps, instead of messaging and
address book.
[ Didier Roche ]
* Resync trunk with previous revert upload
[ Michał Sawicz ]
* Set the Qt.ImhNoPredictiveText flag on wifi password field, fixes
lp:1291575 (LP: #1291575)
[ Albert Astals ]
* Take into account the originY when specifying the delegate ranges
Fixes bug #1300302 (LP: #1300302)
[ CI bot ]
* Resync trunk
[ Allan LeSage ]
* Swiping open an indicator must show its correct title--protect
against lp:1253804 . (LP: #1253804)
[ Alexander Sack ]
* Fix TypeError: issue seen in system_integration autopilot test on
image 279. (LP: #1303685)
[ Bill Filler ]
* Set the Qt.ImhNoPredictiveText flag on wifi password field, fixes
lp:1291575 (LP: #1291575)
[ Leo Arias ]
* Added a search autopilot helper.
[ Michael Terry ]
* Provide a all-in-one script for getting a device to an unlocked
state.
* Revert to previous version as it's linked to latest sdk change which
is making gallery-app AP tests failing on the CI dashboard
[ Albert Astals ]
* Adapt to new TabBar
[ Michael Terry ]
* Re-enable test_networkmanager_integratio n autopilot test on phone
platforms
[ CI bot ]
* Resync trunk
[ Leo Arias ]
* Reverted the open_preview autopilot helper to return a Preview
object.
[ Albert Astals ]
* If not running in Mir load the "fake" application manager (LP:
#1301547)
* Remove unused properties from DashRenderer
[ Michael Zanetti ]
* Fix tests after right edge merge. Drop old stages tests. Fix right
edge tests if someone doesn't have the GRID_UNIT_PX exported. make
GenericScopeView test more robust that broke because the ordering
changed
* add "make xvfbtestSomething" target to run qml tests in xvfb
* make the "make test" commit hook work again
[ Michał Sawicz ]
* Bump version to ensure incompatibility with previous Unity.Application
implementations.
* We'll only have the unity-mir and mock Ubuntu.Application plugins
now, no need for mangling the import paths.
[ Michal Hruby ]
* Remove the albumart image provider. (LP: #1262711)
* Don't reset search string after 2 seconds. (LP: #1297246)
[ James Henstridge ]
* Remove the albumart image provider. (LP: #1262711)
[ Albert Astals ]
* Carousel: Add test to make sure we only create the needed delegates
and not more
* LVWPH: Remove processEvents() call from updatePolish() It causes
some reentrancy issues and in some times you end up in polishItems()
with items that have been deleted because you called processEvents()
This means i need a small tweak in itemGeometryChanged to not
reposition items if we are inside a setContentHeight call and two
small tweaks to tests since now things happen in a different order
and numbers are different (though equivalent) (LP: #1297240)
* Card.qml binding loops are gone. hooray \o/ Also made the aspect
properties readonly
[ Mirco Müller ]
* A potential fix for "Cannot read property 'state' of null"-failure
on Jenkins with the VisualSnapDecisionsQueue QML-test of
notifications.
[ Michael Terry ]
* Pass user's preference for auto-brightness on to powerd. (LP:
#1273174)
[ Michael Zanetti ]
* Registers a dummy QObject as QTestRootObject in uqmlscene in order
to fix make trySomething with Qt 5.2.
* For now, have libunity-private depending on libunity-core-6.0-9 as the
gsettings schema is here. The dependency wasn't direct and dropped from
Touch image #271. Consequently, unity8 didn't start (gsettings
segfaulting).
Proper strategy will be to include the schema in another package to only
pull it. - 751. By Ying-Chun Liu
-
re-factor
- 752. By Ying-Chun Liu
-
fix whitespace
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:752
http://
Executed test runs:
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
Does not seem to work.
How did i test it:
* Set zoomable: true in PreviewZoomable
* Run it on the phone
* Go to the music scope and preview a song from Grooveshark that has the non default image ("Sail" in my case)
* Try to do some zooming around
* Doesn't work
- 753. By Ying-Chun Liu
-
Fix weirdness centering.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:753
http://
Executed test runs:
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
This is the original situation http://
I don't think it makes sense I can pan "past" the image
- 754. By Ying-Chun Liu
-
Fix strange drag out of bound.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:754
http://
Executed test runs:
FAILURE: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
FAILURE: http://
Click here to trigger a rebuild:
http://
Albert Astals Cid (aacid) wrote : | # |
Code looks good, it changes PreviewZoomable
* Did you perform an exploratory manual test run of the code change and any related functionality?
Yes, looks good to me
* Did CI run pass? If not, please explain why.
No, seems mako is stuck in the past or something :/
Albert Astals Cid (aacid) wrote : | # |
since i can't find a case in which it regresses and i've been playing with it a bit in the scenario it made it fail last time we tried using a LazyImage there i'm going to top-approve it
Preview Diff
1 | === modified file 'qml/Components/LazyImage.qml' | |||
2 | --- qml/Components/LazyImage.qml 2014-03-21 10:48:42 +0000 | |||
3 | +++ qml/Components/LazyImage.qml 2014-04-30 13:51:56 +0000 | |||
4 | @@ -36,6 +36,7 @@ | |||
5 | 36 | property alias cache: image.cache | 36 | property alias cache: image.cache |
6 | 37 | property alias horizontalAlignment: image.horizontalAlignment | 37 | property alias horizontalAlignment: image.horizontalAlignment |
7 | 38 | property alias verticalAlignment: image.verticalAlignment | 38 | property alias verticalAlignment: image.verticalAlignment |
8 | 39 | property alias sourceImage: image | ||
9 | 39 | 40 | ||
10 | 40 | state: "default" | 41 | state: "default" |
11 | 41 | 42 | ||
12 | 42 | 43 | ||
13 | === added file 'qml/Components/ZoomableImage.qml' | |||
14 | --- qml/Components/ZoomableImage.qml 1970-01-01 00:00:00 +0000 | |||
15 | +++ qml/Components/ZoomableImage.qml 2014-04-30 13:51:56 +0000 | |||
16 | @@ -0,0 +1,153 @@ | |||
17 | 1 | /* | ||
18 | 2 | * Copyright (C) 2014 Canonical, Ltd. | ||
19 | 3 | * | ||
20 | 4 | * This program is free software; you can redistribute it and/or modify | ||
21 | 5 | * it under the terms of the GNU General Public License as published by | ||
22 | 6 | * the Free Software Foundation; version 3. | ||
23 | 7 | * | ||
24 | 8 | * This program is distributed in the hope that it will be useful, | ||
25 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
26 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
27 | 11 | * GNU General Public License for more details. | ||
28 | 12 | * | ||
29 | 13 | * You should have received a copy of the GNU General Public License | ||
30 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
31 | 15 | */ | ||
32 | 16 | |||
33 | 17 | import QtQuick 2.0 | ||
34 | 18 | import Ubuntu.Components 0.1 | ||
35 | 19 | import "../Components" | ||
36 | 20 | |||
37 | 21 | /*! \brief Zoomable for image. | ||
38 | 22 | |||
39 | 23 | This widget shows image contained in source, | ||
40 | 24 | can be zoomable accordingly with zoomable. | ||
41 | 25 | */ | ||
42 | 26 | |||
43 | 27 | Item { | ||
44 | 28 | id: root | ||
45 | 29 | property alias source: lazyImage.source | ||
46 | 30 | property var zoomable: false | ||
47 | 31 | property alias imageState: lazyImage.state | ||
48 | 32 | property alias scaleTo: lazyImage.scaleTo | ||
49 | 33 | property alias asynchronous: lazyImage.asynchronous | ||
50 | 34 | |||
51 | 35 | Flickable { | ||
52 | 36 | id: flickable | ||
53 | 37 | objectName: "flickable" | ||
54 | 38 | clip: true | ||
55 | 39 | contentHeight: imageContainer.height | ||
56 | 40 | contentWidth: imageContainer.width | ||
57 | 41 | |||
58 | 42 | onHeightChanged: image.resetScale() | ||
59 | 43 | onWidthChanged: image.resetScale() | ||
60 | 44 | anchors.fill: parent | ||
61 | 45 | |||
62 | 46 | Item { | ||
63 | 47 | id: imageContainer | ||
64 | 48 | objectName: "imageContainer" | ||
65 | 49 | width: Math.max(image.width * image.scale, flickable.width) | ||
66 | 50 | height: Math.max(image.height * image.scale, flickable.height) | ||
67 | 51 | |||
68 | 52 | Item { | ||
69 | 53 | id: image | ||
70 | 54 | objectName: "image" | ||
71 | 55 | property alias imageState: lazyImage.state | ||
72 | 56 | property var prevScale | ||
73 | 57 | anchors.centerIn: parent | ||
74 | 58 | |||
75 | 59 | signal imageReloaded | ||
76 | 60 | |||
77 | 61 | LazyImage { | ||
78 | 62 | id: lazyImage | ||
79 | 63 | objectName: "lazyImage" | ||
80 | 64 | smooth: !flickable.movingVertically | ||
81 | 65 | anchors.fill: parent | ||
82 | 66 | fillMode: Image.PreserveAspectFit | ||
83 | 67 | scaleTo: "fit" | ||
84 | 68 | |||
85 | 69 | onStateChanged: { | ||
86 | 70 | if (state == "ready") { | ||
87 | 71 | image.imageReloaded(); | ||
88 | 72 | } | ||
89 | 73 | } | ||
90 | 74 | } | ||
91 | 75 | |||
92 | 76 | onImageReloaded: { | ||
93 | 77 | image.height = lazyImage.sourceImage.implicitHeight | ||
94 | 78 | image.width = lazyImage.sourceImage.implicitWidth | ||
95 | 79 | image.resetScale(); | ||
96 | 80 | } | ||
97 | 81 | |||
98 | 82 | function resetScale() { | ||
99 | 83 | image.scale = Math.min(flickable.width / image.width, flickable.height / image.height); | ||
100 | 84 | pinchArea.minScale = image.scale; | ||
101 | 85 | prevScale = Math.min(image.scale, 1); | ||
102 | 86 | } | ||
103 | 87 | |||
104 | 88 | onScaleChanged: { | ||
105 | 89 | var currentWidth = width * scale | ||
106 | 90 | var currentHeight = height * scale | ||
107 | 91 | var scaleRatio = scale / prevScale | ||
108 | 92 | if (currentWidth > flickable.width) { | ||
109 | 93 | var xpos = flickable.width / 2 + flickable.contentX; | ||
110 | 94 | var xoff = xpos * scaleRatio; | ||
111 | 95 | flickable.contentX = xoff - flickable.width / 2; | ||
112 | 96 | } | ||
113 | 97 | if (currentHeight > flickable.height) { | ||
114 | 98 | var ypos = flickable.height / 2 + flickable.contentY; | ||
115 | 99 | var yoff = ypos * scaleRatio; | ||
116 | 100 | flickable.contentY = yoff - flickable.height / 2; | ||
117 | 101 | } | ||
118 | 102 | prevScale = scale; | ||
119 | 103 | } | ||
120 | 104 | } | ||
121 | 105 | } | ||
122 | 106 | |||
123 | 107 | PinchArea { | ||
124 | 108 | id: pinchArea | ||
125 | 109 | objectName: "pinchArea" | ||
126 | 110 | property real minScale: 1.0 | ||
127 | 111 | anchors.fill: parent | ||
128 | 112 | enabled: zoomable ? zoomable : false | ||
129 | 113 | |||
130 | 114 | pinch.target: image | ||
131 | 115 | pinch.minimumScale: minScale | ||
132 | 116 | pinch.maximumScale: 10 | ||
133 | 117 | |||
134 | 118 | onPinchFinished: flickable.returnToBounds() | ||
135 | 119 | } | ||
136 | 120 | |||
137 | 121 | MouseArea { | ||
138 | 122 | id: mouseArea | ||
139 | 123 | objectName: "mouseArea" | ||
140 | 124 | |||
141 | 125 | anchors.fill: parent | ||
142 | 126 | enabled: zoomable ? zoomable : false | ||
143 | 127 | |||
144 | 128 | onWheel: { | ||
145 | 129 | var startScale = image.scale; | ||
146 | 130 | if (wheel.angleDelta.y > 0) { | ||
147 | 131 | image.scale = startScale + 0.1; | ||
148 | 132 | } else if (wheel.angleDelta.y < 0) { | ||
149 | 133 | if (image.scale > 0.1 && image.scale > pinchArea.minScale) { | ||
150 | 134 | image.scale = startScale - 0.1; | ||
151 | 135 | } | ||
152 | 136 | } | ||
153 | 137 | wheel.accepted = true; | ||
154 | 138 | } | ||
155 | 139 | |||
156 | 140 | onPressed: { | ||
157 | 141 | mouse.accepted = false; | ||
158 | 142 | } | ||
159 | 143 | |||
160 | 144 | onReleased: { | ||
161 | 145 | mouse.accepted = false; | ||
162 | 146 | } | ||
163 | 147 | |||
164 | 148 | onClicked: { | ||
165 | 149 | mouse.accepted = false; | ||
166 | 150 | } | ||
167 | 151 | } | ||
168 | 152 | } | ||
169 | 153 | } | ||
170 | 0 | 154 | ||
171 | === modified file 'qml/Dash/Previews/PreviewZoomableImage.qml' | |||
172 | --- qml/Dash/Previews/PreviewZoomableImage.qml 2014-02-21 18:41:37 +0000 | |||
173 | +++ qml/Dash/Previews/PreviewZoomableImage.qml 2014-04-30 13:51:56 +0000 | |||
174 | @@ -28,14 +28,11 @@ | |||
175 | 28 | id: root | 28 | id: root |
176 | 29 | implicitHeight: units.gu(22) | 29 | implicitHeight: units.gu(22) |
177 | 30 | 30 | ||
179 | 31 | LazyImage { | 31 | ZoomableImage { |
180 | 32 | id: image | ||
181 | 32 | objectName: "image" | 33 | objectName: "image" |
182 | 33 | anchors { | ||
183 | 34 | top: parent.top | ||
184 | 35 | bottom: parent.bottom | ||
185 | 36 | } | ||
186 | 37 | scaleTo: "height" | ||
187 | 38 | source: widgetData["source"] | 34 | source: widgetData["source"] |
189 | 39 | initialWidth: units.gu(13) | 35 | zoomable: widgetData["zoomable"] ? widgetData["zoomable"] : false |
190 | 36 | anchors.fill: parent | ||
191 | 40 | } | 37 | } |
192 | 41 | } | 38 | } |
193 | 42 | 39 | ||
194 | === modified file 'tests/qmltests/CMakeLists.txt' | |||
195 | --- tests/qmltests/CMakeLists.txt 2014-04-22 08:51:33 +0000 | |||
196 | +++ tests/qmltests/CMakeLists.txt 2014-04-30 13:51:56 +0000 | |||
197 | @@ -32,6 +32,7 @@ | |||
198 | 32 | add_qml_test(Components SeeMore) | 32 | add_qml_test(Components SeeMore) |
199 | 33 | add_qml_test(Components Showable) | 33 | add_qml_test(Components Showable) |
200 | 34 | add_qml_test(Components PageHeaderLabel) | 34 | add_qml_test(Components PageHeaderLabel) |
201 | 35 | add_qml_test(Components ZoomableImage) | ||
202 | 35 | add_qml_test(Dash Dash IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}) | 36 | add_qml_test(Dash Dash IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}) |
203 | 36 | add_qml_test(Dash DashContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}) | 37 | add_qml_test(Dash DashContent IMPORT_PATHS ${CMAKE_BINARY_DIR}/plugins ${qmltest_DEFAULT_IMPORT_PATHS}) |
204 | 37 | add_qml_test(Dash Card) | 38 | add_qml_test(Dash Card) |
205 | 38 | 39 | ||
206 | === added file 'tests/qmltests/Components/tst_ZoomableImage.qml' | |||
207 | --- tests/qmltests/Components/tst_ZoomableImage.qml 1970-01-01 00:00:00 +0000 | |||
208 | +++ tests/qmltests/Components/tst_ZoomableImage.qml 2014-04-30 13:51:56 +0000 | |||
209 | @@ -0,0 +1,192 @@ | |||
210 | 1 | /* | ||
211 | 2 | * Copyright 2014 Canonical Ltd. | ||
212 | 3 | * | ||
213 | 4 | * This program is free software; you can redistribute it and/or modify | ||
214 | 5 | * it under the terms of the GNU General Public License as published by | ||
215 | 6 | * the Free Software Foundation; version 3. | ||
216 | 7 | * | ||
217 | 8 | * This program is distributed in the hope that it will be useful, | ||
218 | 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
219 | 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
220 | 11 | * GNU General Public License for more details. | ||
221 | 12 | * | ||
222 | 13 | * You should have received a copy of the GNU General Public License | ||
223 | 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
224 | 15 | */ | ||
225 | 16 | |||
226 | 17 | import QtQuick 2.0 | ||
227 | 18 | import QtTest 1.0 | ||
228 | 19 | import "../../../qml/Components" | ||
229 | 20 | import Unity.Test 0.1 as UT | ||
230 | 21 | |||
231 | 22 | Rectangle { | ||
232 | 23 | id: root | ||
233 | 24 | width: units.gu(30) | ||
234 | 25 | height: units.gu(60) | ||
235 | 26 | color: "lightgrey" | ||
236 | 27 | |||
237 | 28 | property var widgetData0: { | ||
238 | 29 | "source": "", | ||
239 | 30 | "zoomable": false | ||
240 | 31 | } | ||
241 | 32 | |||
242 | 33 | property var widgetData1: { | ||
243 | 34 | "source": "../../../qml/graphics/phone_background.jpg", | ||
244 | 35 | "zoomable": false | ||
245 | 36 | } | ||
246 | 37 | |||
247 | 38 | property var widgetData2: { | ||
248 | 39 | "source": "../../../qml/Dash/graphics/phone/screenshots/gallery@12.png", | ||
249 | 40 | "zoomable": true | ||
250 | 41 | } | ||
251 | 42 | |||
252 | 43 | ZoomableImage { | ||
253 | 44 | id: zoomableImage | ||
254 | 45 | width: parent.width | ||
255 | 46 | anchors.fill: parent | ||
256 | 47 | asynchronous: false | ||
257 | 48 | } | ||
258 | 49 | |||
259 | 50 | SignalSpy { | ||
260 | 51 | id: signalSpy | ||
261 | 52 | } | ||
262 | 53 | |||
263 | 54 | UT.UnityTestCase { | ||
264 | 55 | name: "ZoomableImageTest" | ||
265 | 56 | when: windowShown | ||
266 | 57 | |||
267 | 58 | function test_loadImage() { | ||
268 | 59 | var lazyImage = findChild(zoomableImage, "lazyImage"); | ||
269 | 60 | |||
270 | 61 | zoomableImage.source = widgetData0["source"]; | ||
271 | 62 | zoomableImage.zoomable = widgetData0["zoomable"]; | ||
272 | 63 | waitForRendering(zoomableImage); | ||
273 | 64 | tryCompare(zoomableImage, "imageState", "default"); | ||
274 | 65 | |||
275 | 66 | signalSpy.signalName = "onStateChanged"; | ||
276 | 67 | signalSpy.target = lazyImage; | ||
277 | 68 | signalSpy.clear(); | ||
278 | 69 | |||
279 | 70 | zoomableImage.source = widgetData1["source"]; | ||
280 | 71 | zoomableImage.zoomable = widgetData1["zoomable"]; | ||
281 | 72 | waitForRendering(lazyImage); | ||
282 | 73 | tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(widgetData1["source"]); }, true); | ||
283 | 74 | waitForRendering(zoomableImage); | ||
284 | 75 | tryCompare(zoomableImage, "imageState", "ready"); | ||
285 | 76 | compare (signalSpy.count, 1); | ||
286 | 77 | } | ||
287 | 78 | |||
288 | 79 | function get_filename(a) { | ||
289 | 80 | var wordsA = a.split("/"); | ||
290 | 81 | var filenameA = wordsA[wordsA.length-1]; | ||
291 | 82 | return filenameA; | ||
292 | 83 | } | ||
293 | 84 | |||
294 | 85 | function test_mousewheel() { | ||
295 | 86 | var image = findChild(zoomableImage, "image"); | ||
296 | 87 | var lazyImage = findChild(zoomableImage, "lazyImage"); | ||
297 | 88 | var flickable = findChild(zoomableImage, "flickable"); | ||
298 | 89 | |||
299 | 90 | zoomableImage.source = widgetData2["source"]; | ||
300 | 91 | zoomableImage.zoomable = true; | ||
301 | 92 | waitForRendering(zoomableImage); | ||
302 | 93 | |||
303 | 94 | tryCompare(zoomableImage, "imageState", "ready"); | ||
304 | 95 | tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(widgetData2["source"]); }, true); | ||
305 | 96 | waitForRendering(image); | ||
306 | 97 | |||
307 | 98 | // move mouse to center | ||
308 | 99 | mouseMove(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2); | ||
309 | 100 | |||
310 | 101 | // Test Zoom-in Zoom-out twice. | ||
311 | 102 | for (var c=0; c<2; c++) { | ||
312 | 103 | // zoom in | ||
313 | 104 | for (var i=0; i<10; i++) { | ||
314 | 105 | mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, 10); | ||
315 | 106 | tryCompare(image, "scale", 1.0 + (i + 1) * 0.1); | ||
316 | 107 | compare(flickable.contentWidth, lazyImage.width * image.scale); | ||
317 | 108 | compare(flickable.contentHeight, lazyImage.height * image.scale); | ||
318 | 109 | } | ||
319 | 110 | |||
320 | 111 | // zoom out | ||
321 | 112 | for (var i=0; i<10; i++) { | ||
322 | 113 | mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, -10); | ||
323 | 114 | tryCompare(image, "scale", 2.0 - (i + 1) * 0.1); | ||
324 | 115 | compare(flickable.contentWidth, lazyImage.width * image.scale); | ||
325 | 116 | compare(flickable.contentHeight, lazyImage.height * image.scale); | ||
326 | 117 | } | ||
327 | 118 | } | ||
328 | 119 | } | ||
329 | 120 | |||
330 | 121 | function test_pinch_data() { | ||
331 | 122 | return [ { source:widgetData2["source"], | ||
332 | 123 | zoomable:false, | ||
333 | 124 | answer1: true, | ||
334 | 125 | answer2: false, | ||
335 | 126 | answer3: true, | ||
336 | 127 | answer4: 1.0, | ||
337 | 128 | answer5: 1.0 }, | ||
338 | 129 | { source:widgetData2["source"], | ||
339 | 130 | zoomable:true, | ||
340 | 131 | answer1: false, | ||
341 | 132 | answer2: true, | ||
342 | 133 | answer3: false, | ||
343 | 134 | answer4: 1.7740461882048026, | ||
344 | 135 | answer5: 1.0 } | ||
345 | 136 | ] | ||
346 | 137 | } | ||
347 | 138 | |||
348 | 139 | function test_pinch(data) { | ||
349 | 140 | var image = findChild(zoomableImage, "image"); | ||
350 | 141 | var lazyImage = findChild(zoomableImage, "lazyImage"); | ||
351 | 142 | var flickable = findChild(zoomableImage, "flickable"); | ||
352 | 143 | |||
353 | 144 | signalSpy.signalName = "onScaleChanged"; | ||
354 | 145 | signalSpy.target = image; | ||
355 | 146 | signalSpy.clear(); | ||
356 | 147 | |||
357 | 148 | zoomableImage.source = data.source; | ||
358 | 149 | zoomableImage.zoomable = data.zoomable; | ||
359 | 150 | waitForRendering(zoomableImage); | ||
360 | 151 | |||
361 | 152 | tryCompare(zoomableImage, "imageState", "ready"); | ||
362 | 153 | tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(data.source); }, true); | ||
363 | 154 | waitForRendering(image); | ||
364 | 155 | |||
365 | 156 | var x1Start = zoomableImage.width * 2 / 6; | ||
366 | 157 | var y1Start = zoomableImage.height * 2 / 6; | ||
367 | 158 | var x1End = zoomableImage.width * 1 / 6; | ||
368 | 159 | var y1End = zoomableImage.height * 1 / 6; | ||
369 | 160 | var x2Start = zoomableImage.width * 4 / 6; | ||
370 | 161 | var y2Start = zoomableImage.height * 4 / 6; | ||
371 | 162 | var x2End = zoomableImage.width * 5 / 6; | ||
372 | 163 | var y2End = zoomableImage.height * 5 / 6; | ||
373 | 164 | |||
374 | 165 | var oldScale = image.scale; | ||
375 | 166 | |||
376 | 167 | // move mouse to center | ||
377 | 168 | mouseMove(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2); | ||
378 | 169 | |||
379 | 170 | // Test Zoom-in Zoom-out twice. | ||
380 | 171 | for (var c=0; c<2; c++) { | ||
381 | 172 | wait(3000); // have to delay between two consequent pinch event. | ||
382 | 173 | // pinch zoom-in | ||
383 | 174 | touchPinch(zoomableImage, x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End); | ||
384 | 175 | |||
385 | 176 | tryCompare(image, "scale", data.answer4); | ||
386 | 177 | var newScale = image.scale; | ||
387 | 178 | compare(newScale == oldScale, data.answer1, "scale factor not equal: "+ oldScale + "=?" + newScale); | ||
388 | 179 | compare(newScale > oldScale, data.answer2, "scale factor didn't changed"); | ||
389 | 180 | compare(signalSpy.count == 0, data.answer3, "scale signal count error"); | ||
390 | 181 | compare(newScale, data.answer4, "scale factor error"); | ||
391 | 182 | compare(flickable.contentWidth, lazyImage.width * image.scale); | ||
392 | 183 | compare(flickable.contentHeight, lazyImage.height * image.scale); | ||
393 | 184 | |||
394 | 185 | wait(3000); // have to delay between two consequent pinch event. | ||
395 | 186 | // pinch zoom-out | ||
396 | 187 | touchPinch(zoomableImage, x1End, y1End, x1Start, y1Start, x2End, y2End, x2Start, y2Start); | ||
397 | 188 | tryCompare(image, "scale", data.answer5); | ||
398 | 189 | } | ||
399 | 190 | } | ||
400 | 191 | } | ||
401 | 192 | } | ||
402 | 0 | 193 | ||
403 | === modified file 'tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml' | |||
404 | --- tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml 2014-03-03 10:43:23 +0000 | |||
405 | +++ tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml 2014-04-30 13:51:56 +0000 | |||
406 | @@ -36,7 +36,8 @@ | |||
407 | 36 | 36 | ||
408 | 37 | PreviewZoomableImage { | 37 | PreviewZoomableImage { |
409 | 38 | id: zoomableImage | 38 | id: zoomableImage |
411 | 39 | width: parent.width | 39 | anchors.fill: parent |
412 | 40 | widgetData: widgetData1 | ||
413 | 40 | } | 41 | } |
414 | 41 | 42 | ||
415 | 42 | UT.UnityTestCase { | 43 | UT.UnityTestCase { |
416 | @@ -47,10 +48,12 @@ | |||
417 | 47 | var image = findChild(zoomableImage, "image"); | 48 | var image = findChild(zoomableImage, "image"); |
418 | 48 | 49 | ||
419 | 49 | zoomableImage.widgetData = widgetData0; | 50 | zoomableImage.widgetData = widgetData0; |
421 | 50 | tryCompare(image, "state", "default"); | 51 | waitForRendering(zoomableImage); |
422 | 52 | tryCompare(image, "imageState", "default"); | ||
423 | 51 | 53 | ||
424 | 52 | zoomableImage.widgetData = widgetData1; | 54 | zoomableImage.widgetData = widgetData1; |
426 | 53 | tryCompare(image, "state", "ready"); | 55 | waitForRendering(zoomableImage); |
427 | 56 | tryCompare(image, "imageState", "ready"); | ||
428 | 54 | } | 57 | } |
429 | 55 | } | 58 | } |
430 | 56 | } | 59 | } |
431 | 57 | 60 | ||
432 | === modified file 'tests/utils/modules/Unity/Test/UnityTestCase.qml' | |||
433 | --- tests/utils/modules/Unity/Test/UnityTestCase.qml 2014-02-28 15:15:21 +0000 | |||
434 | +++ tests/utils/modules/Unity/Test/UnityTestCase.qml 2014-04-30 13:51:56 +0000 | |||
435 | @@ -260,6 +260,32 @@ | |||
436 | 260 | } | 260 | } |
437 | 261 | } | 261 | } |
438 | 262 | 262 | ||
439 | 263 | function touchPinch(item, x1Start, y1Start, x1End, y1End, x2Start, y2Start, x2End, y2End) { | ||
440 | 264 | // Make sure the item is rendered | ||
441 | 265 | waitForRendering(item); | ||
442 | 266 | |||
443 | 267 | var event1 = touchEvent(); | ||
444 | 268 | // first finger | ||
445 | 269 | event1.press(0, x1Start, y1Start); | ||
446 | 270 | event1.commit(); | ||
447 | 271 | // second finger | ||
448 | 272 | event1.stationary(0); | ||
449 | 273 | event1.press(1, x2Start, y2Start); | ||
450 | 274 | event1.commit(); | ||
451 | 275 | |||
452 | 276 | // pinch | ||
453 | 277 | for (var i = 0.0; i < 1.0; i += 0.02) { | ||
454 | 278 | event1.move(0, x1Start + (x1End - x1Start) * i, y1Start + (y1End - y1Start) * i); | ||
455 | 279 | event1.move(1, x2Start + (x2End - x2Start) * i, y2Start + (y2End - y2Start) * i); | ||
456 | 280 | event1.commit(); | ||
457 | 281 | } | ||
458 | 282 | |||
459 | 283 | // release | ||
460 | 284 | event1.release(0, x1End, y1End); | ||
461 | 285 | event1.release(1, x2End, y2End); | ||
462 | 286 | event1.commit(); | ||
463 | 287 | } | ||
464 | 288 | |||
465 | 263 | function fetchRootItem(item) { | 289 | function fetchRootItem(item) { |
466 | 264 | if (item.parent) | 290 | if (item.parent) |
467 | 265 | return fetchRootItem(item.parent) | 291 | return fetchRootItem(item.parent) |
FAILED: Continuous integration, rev:736 jenkins. qa.ubuntu. com/job/ unity8- ci/2393/ jenkins. qa.ubuntu. com/job/ generic- mediumtests- trusty/ 3449/console jenkins. qa.ubuntu. com/job/ generic- mediumtests- trusty- touch/3092/ console jenkins. qa.ubuntu. com/job/ unity-phablet- qmluitests- trusty/ 1263/console jenkins. qa.ubuntu. com/job/ unity8- trusty- amd64-ci/ 914/console jenkins. qa.ubuntu. com/job/ unity8- trusty- armhf-ci/ 918/console jenkins. qa.ubuntu. com/job/ unity8- trusty- i386-ci/ 914/console jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- amd64/3452/ console jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- armhf/3094/ console
http://
Executed test runs:
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
FAILURE: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/unity8- ci/2393/ rebuild
http://