Merge lp:~mterry/unity8/greeter-ux-fixes into lp:unity8
- greeter-ux-fixes
- Merge into trunk
Status: | Merged | ||||||||
---|---|---|---|---|---|---|---|---|---|
Approved by: | Michał Sawicz | ||||||||
Approved revision: | 784 | ||||||||
Merged at revision: | 861 | ||||||||
Proposed branch: | lp:~mterry/unity8/greeter-ux-fixes | ||||||||
Merge into: | lp:unity8 | ||||||||
Diff against target: |
612 lines (+247/-174) 8 files modified
po/unity8.pot (+7/-3) qml/Greeter/Greeter.qml (+124/-51) qml/Greeter/GreeterContent.qml (+1/-10) qml/Greeter/Infographics.qml (+3/-0) qml/Hud/Hud.qml (+1/-1) qml/Shell.qml (+65/-51) tests/qmltests/Greeter/tst_Phone.qml (+10/-50) tests/qmltests/Greeter/tst_Tablet.qml (+36/-8) |
||||||||
To merge this branch: | bzr merge lp:~mterry/unity8/greeter-ux-fixes | ||||||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Michał Sawicz | Approve | ||
PS Jenkins bot (community) | continuous-integration | Needs Fixing | |
Albert Astals Cid (community) | Approve | ||
Review via email: mp+210042@code.launchpad.net |
Commit message
Make swipe teases in the greeter more helpful and obvious
Description of the change
Make swipe teases in the greeter more helpful and obvious.
This branch tries to implement a new design spec [1] for responding to some user feedback about the obviousness of swiping the greeter away.
Jouni, Christina, and John have said they like the current state of this branch, so once code reviewers are happy, we're good to land this.
[1] https:/
== Checklist ==
* Are there any related MPs required for this MP to build/function as expected? Please list.
- 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?
- Yes. Jouni, Christina, and John Lea approved.
PS Jenkins bot (ps-jenkins) wrote : | # |
Michał Sawicz (saviq) wrote : | # |
Hmm swiping the infographic was meant to allow switching between different infographic images (waiting for new infographic backend), did that approach change?
Michael Terry (mterry) wrote : | # |
Saviq, double-pressing does that.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:758
http://
Executed test runs:
UNSTABLE: http://
FAILURE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
deb: http://
FAILURE: http://
SUCCESS: http://
Click here to trigger a rebuild:
http://
Michał Sawicz (saviq) wrote : | # |
That's *now*, new design was just swipe through them on the welcome screen. Can you please verify that this is thought of?
Albert Astals Cid (aacid) wrote : | # |
Doesn't merge with trunk:
Text conflict in qml/Shell.qml
Michael Terry (mterry) wrote : | # |
Saviq, can you point me at the design doc for that swipe behavior? I'm just working off [1] which doesn't mention a change in infographics.
[1] https:/
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:759
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
UNSTABLE: 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://
Michael Terry (mterry) wrote : | # |
JohnLea: "...lets leave it as double tap for now (swipe has possible conflicts with the unlock gesture)"
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:760
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://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:767
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://
Michał Sawicz (saviq) wrote : | # |
Checklist, please.
Michael Terry (mterry) wrote : | # |
Gah, I always forget that. Checklist added, Saviq!
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:769
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://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:771
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://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:772
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://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:772
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:773
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://
Albert Astals Cid (aacid) wrote : | # |
Text conflict in qml/Shell.qml
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:774
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://
Michael Terry (mterry) wrote : | # |
Fixed conflict.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:774
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:775
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://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:774
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 : | # |
When swiping the greeter the Dash doesn't have the scale animation anymore, is that on purpose?
Albert Astals Cid (aacid) wrote : | # |
When initiating a valid unlock drag of the greeter, the panel always makes the hinting animation. This is specially weird when you're dragging the greeter to the right, since for a split second there's something that follows the greeter and then goes back.
Is this on purpose?
Albert Astals Cid (aacid) wrote : | # |
and in the previous comment panel means launcher
Albert Astals Cid (aacid) wrote : | # |
If you drag from the left edge and after dragging the Launcher you keep dragging the greeter starts moving but the Dash you reveal beneath is empty. We should either make the greeter not be dragged when dragging the Launcher or show the stuff in the Dash.
Michael Terry (mterry) wrote : | # |
> When swiping the greeter the Dash doesn't have the scale animation anymore, is that on purpose?
Yes.
> When initiating a valid unlock drag of the greeter, the panel always makes the hinting animation.
> This is specially weird when you're dragging the greeter to the right, since for a split second
> there's something that follows the greeter and then goes back.
>
> Is this on purpose?
Yes.
> If you drag from the left edge and after dragging the Launcher you keep dragging the greeter
> starts moving but the Dash you reveal beneath is empty. We should either make the greeter not
> be dragged when dragging the Launcher or show the stuff in the Dash.
Fixed, thanks!
Albert Astals Cid (aacid) wrote : | # |
As discussed on IRC there is a weird effect happening when you pull from left, get the launcher out, and finish the "login" movement in the greeter, the darkening of the Dash is jumpy and inconsistent
Albert Astals Cid (aacid) wrote : | # |
Run make pot_file in the builddir to update the pot file with the new contents of the Swipe label
Michael Terry (mterry) wrote : | # |
> As discussed on IRC there is a weird effect happening
> when you pull from left, get the launcher out, and finish
> the "login" movement in the greeter, the darkening of the
> Dash is jumpy and inconsistent
Fixed.
> Run make pot_file in the builddir to update the pot file
> with the new contents of the Swipe label
Done.
Albert Astals Cid (aacid) wrote : | # |
Looks good to me :)
* Did you perform an exploratory manual test run of the code change and any related functionality?
Yes
* Did CI run pass? If not, please explain why.
No, seems otto got upset with something else, but besides that everything passed.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:777
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://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:777
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://
Michał Sawicz (saviq) wrote : | # |
Please strip tags, you can use the script:
http://
Pass lp:~mterry/unity8/greeter-ux-fixes as an argument.
Michał Sawicz (saviq) wrote : | # |
Two issues reported by QA: bug #1308475, bug #1308477
Michał Sawicz (saviq) wrote : | # |
One more issue: on tablet, short-swipe from the left does not give you the launcher.
- 782. By Michael Terry
-
After finishing hiding, put the greeter back on the left for reliably showing
Michael Terry (mterry) wrote : | # |
OK, fixed the "greeter warps from right to left" which as an effect, I kind of loved. But obviously a bug.
The "shouldn't tease launcher on swipe" issue is known and how design wanted it last time I talked to them. I've assigned the bug to Jouni for comment.
The can't-open-
- 783. By Michael Terry
-
Re-enable launcher in tablet greeter
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:781
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://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:783
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://
- 784. By Michael Terry
-
Merge from trunk
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:784
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
UNSTABLE: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild:
http://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:784
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://
Michael Terry (mterry) wrote : | # |
So this is ready btw. The only open question is bug 1308477, assigned to Jouni. But the current behavior I had already confirmed with him when design gave me the spec for this stuff. So I'm not sure if you all want that to be a blocker for this merge or just a follow-up issue for the future.
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:784
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://
Michał Sawicz (saviq) wrote : | # |
Design confirmed this is the current wanted behaviour.
Michał Sawicz (saviq) wrote : | # |
Yup.
* Did you perform an exploratory manual test run of the code change and any related functionality?
Yes
* Did CI run pass? If not, please explain why.
Known qml test failures.
Preview Diff
1 | === modified file 'po/unity8.pot' |
2 | --- po/unity8.pot 2014-03-25 15:49:30 +0000 |
3 | +++ po/unity8.pot 2014-04-17 15:43:48 +0000 |
4 | @@ -8,7 +8,7 @@ |
5 | msgstr "" |
6 | "Project-Id-Version: unity8\n" |
7 | "Report-Msgid-Bugs-To: \n" |
8 | -"POT-Creation-Date: 2014-03-25 16:48+0100\n" |
9 | +"POT-Creation-Date: 2014-04-10 11:13-0400\n" |
10 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
11 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
12 | "Language-Team: LANGUAGE <LL@li.org>\n" |
13 | @@ -84,7 +84,7 @@ |
14 | msgid "See less" |
15 | msgstr "" |
16 | |
17 | -#: qml/Dash/DashApps.qml:38 |
18 | +#: qml/Dash/DashApps.qml:37 |
19 | msgid "Recent" |
20 | msgstr "" |
21 | |
22 | @@ -113,6 +113,10 @@ |
23 | msgid "Send" |
24 | msgstr "" |
25 | |
26 | +#: qml/Greeter/Greeter.qml:151 |
27 | +msgid "Swipe to unlock" |
28 | +msgstr "" |
29 | + |
30 | #: qml/Greeter/Lockscreen.qml:149 |
31 | msgid "Emergency Call" |
32 | msgstr "" |
33 | @@ -158,7 +162,7 @@ |
34 | msgid "Search" |
35 | msgstr "" |
36 | |
37 | -#: qml/Shell.qml:417 |
38 | +#: qml/Shell.qml:348 |
39 | #, qt-format |
40 | msgid "Please enter %1" |
41 | msgstr "" |
42 | |
43 | === modified file 'qml/Greeter/Greeter.qml' |
44 | --- qml/Greeter/Greeter.qml 2014-03-05 08:06:19 +0000 |
45 | +++ qml/Greeter/Greeter.qml 2014-04-17 15:43:48 +0000 |
46 | @@ -28,10 +28,10 @@ |
47 | property url defaultBackground |
48 | |
49 | // 1 when fully shown and 0 when fully hidden |
50 | - property real showProgress: MathUtils.clamp((width + x) / width, 0, 1) |
51 | + property real showProgress: MathUtils.clamp((width - Math.abs(x)) / width, 0, 1) |
52 | |
53 | showAnimation: StandardAnimation { property: "x"; to: 0 } |
54 | - hideAnimation: StandardAnimation { property: "x"; to: -width } |
55 | + hideAnimation: __leftHideAnimation |
56 | |
57 | property alias dragHandleWidth: dragHandle.width |
58 | property alias model: greeterContentLoader.model |
59 | @@ -40,19 +40,81 @@ |
60 | readonly property bool narrowMode: !multiUser && height > width |
61 | readonly property bool multiUser: LightDM.Users.count > 1 |
62 | |
63 | - readonly property bool leftTeaserPressed: greeterContentLoader.status == Loader.Ready && |
64 | - greeterContentLoader.item.leftTeaserPressed |
65 | - readonly property bool rightTeaserPressed: greeterContentLoader.status == Loader.Ready && |
66 | - greeterContentLoader.item.rightTeaserPressed |
67 | - |
68 | readonly property int currentIndex: greeterContentLoader.currentIndex |
69 | |
70 | + property var __leftHideAnimation: StandardAnimation { property: "x"; to: -width } |
71 | + property var __rightHideAnimation: StandardAnimation { property: "x"; to: width } |
72 | + |
73 | signal selected(int uid) |
74 | signal unlocked(int uid) |
75 | - |
76 | - onRightTeaserPressedChanged: { |
77 | - if (rightTeaserPressed && (!locked || narrowMode) && x == 0) { |
78 | - teasingTimer.start(); |
79 | + signal tease() |
80 | + |
81 | + function hideRight() { |
82 | + if (shown) { |
83 | + hideAnimation = __rightHideAnimation |
84 | + hide() |
85 | + } |
86 | + } |
87 | + |
88 | + onRequiredChanged: { |
89 | + // Reset hide animation to default once we're finished with it |
90 | + if (!required) { |
91 | + // Put back on left for reliable show direction and so that |
92 | + // if normal hide() is called, we don't animate from right. |
93 | + x = -width |
94 | + hideAnimation = __leftHideAnimation |
95 | + } |
96 | + } |
97 | + |
98 | + // Bi-directional revealer |
99 | + DraggingArea { |
100 | + id: dragHandle |
101 | + anchors.fill: parent |
102 | + enabled: greeter.narrowMode || !greeter.locked |
103 | + orientation: Qt.Horizontal |
104 | + propagateComposedEvents: true |
105 | + |
106 | + Component.onCompleted: { |
107 | + // set evaluators to baseline of dragValue == 0 |
108 | + leftEvaluator.reset() |
109 | + rightEvaluator.reset() |
110 | + } |
111 | + |
112 | + function maybeTease() { |
113 | + if (!greeter.locked || greeter.narrowMode) |
114 | + greeter.tease(); |
115 | + } |
116 | + |
117 | + onClicked: maybeTease() |
118 | + onDragStart: maybeTease() |
119 | + onPressAndHold: {} // eat event, but no need to tease, as drag will cover it |
120 | + |
121 | + onDragEnd: { |
122 | + if (rightEvaluator.shouldAutoComplete()) |
123 | + greeter.hideRight() |
124 | + else if (leftEvaluator.shouldAutoComplete()) |
125 | + greeter.hide(); |
126 | + else |
127 | + greeter.show(); // undo drag |
128 | + } |
129 | + |
130 | + onDragValueChanged: { |
131 | + // dragValue is kept as a "step" value since we do this x adjusting on the fly |
132 | + greeter.x += dragValue |
133 | + } |
134 | + |
135 | + EdgeDragEvaluator { |
136 | + id: rightEvaluator |
137 | + trackedPosition: dragHandle.dragValue + greeter.x |
138 | + maxDragDistance: parent.width |
139 | + direction: Direction.Rightwards |
140 | + } |
141 | + |
142 | + EdgeDragEvaluator { |
143 | + id: leftEvaluator |
144 | + trackedPosition: dragHandle.dragValue + greeter.x |
145 | + maxDragDistance: parent.width |
146 | + direction: Direction.Leftwards |
147 | } |
148 | } |
149 | |
150 | @@ -82,45 +144,56 @@ |
151 | } |
152 | } |
153 | |
154 | - Timer { |
155 | - id: teasingTimer |
156 | - interval: 200 |
157 | - } |
158 | - |
159 | - states: [ |
160 | - State { |
161 | - name: "teasing" |
162 | - when: teasingTimer.running |
163 | - PropertyChanges { |
164 | - target: greeter |
165 | - x: -dragHandle.hintDisplacement |
166 | - } |
167 | - } |
168 | - ] |
169 | - transitions: [ |
170 | - Transition { |
171 | - from: "*" |
172 | - to: "*" |
173 | - NumberAnimation { |
174 | - target: greeter |
175 | - property: "x" |
176 | - duration: 300 |
177 | - easing.type: Easing.OutCubic |
178 | - } |
179 | - } |
180 | - ] |
181 | - |
182 | - DragHandle { |
183 | - id: dragHandle |
184 | - |
185 | - anchors.top: parent.top |
186 | - anchors.bottom: parent.bottom |
187 | - anchors.right: parent.right |
188 | - |
189 | - hintDisplacement: units.gu(2) |
190 | - |
191 | - enabled: greeter.narrowMode || !greeter.locked |
192 | - |
193 | - direction: Direction.Leftwards |
194 | + onTease: showLabelAnimation.start() |
195 | + |
196 | + Label { |
197 | + id: swipeHint |
198 | + visible: greeter.shown |
199 | + property real baseOpacity: 0.5 |
200 | + opacity: 0.0 |
201 | + anchors.horizontalCenter: parent.horizontalCenter |
202 | + anchors.bottom: parent.bottom |
203 | + anchors.bottomMargin: units.gu(5) |
204 | + text: i18n.tr("Swipe to unlock") |
205 | + color: "white" |
206 | + font.weight: Font.Light |
207 | + |
208 | + SequentialAnimation on opacity { |
209 | + id: showLabelAnimation |
210 | + running: false |
211 | + loops: 2 |
212 | + |
213 | + StandardAnimation { |
214 | + from: 0.0 |
215 | + to: swipeHint.baseOpacity |
216 | + duration: UbuntuAnimation.SleepyDuration |
217 | + } |
218 | + PauseAnimation { duration: UbuntuAnimation.BriskDuration } |
219 | + StandardAnimation { |
220 | + from: swipeHint.baseOpacity |
221 | + to: 0.0 |
222 | + duration: UbuntuAnimation.SleepyDuration |
223 | + } |
224 | + } |
225 | + } |
226 | + |
227 | + // right side shadow |
228 | + Image { |
229 | + anchors.left: parent.right |
230 | + anchors.top: parent.top |
231 | + anchors.bottom: parent.bottom |
232 | + visible: parent.required |
233 | + fillMode: Image.Tile |
234 | + source: "../graphics/dropshadow_right.png" |
235 | + } |
236 | + |
237 | + // left side shadow |
238 | + Image { |
239 | + anchors.right: parent.left |
240 | + anchors.top: parent.top |
241 | + anchors.bottom: parent.bottom |
242 | + visible: parent.required |
243 | + fillMode: Image.Tile |
244 | + source: "../graphics/dropshadow_left.png" |
245 | } |
246 | } |
247 | |
248 | === modified file 'qml/Greeter/GreeterContent.qml' |
249 | --- qml/Greeter/GreeterContent.qml 2014-04-14 16:29:30 +0000 |
250 | +++ qml/Greeter/GreeterContent.qml 2014-04-17 15:43:48 +0000 |
251 | @@ -20,15 +20,11 @@ |
252 | import LightDM 0.1 as LightDM |
253 | import "../Components" |
254 | |
255 | -MouseArea { |
256 | +Item { |
257 | id: root |
258 | anchors.fill: parent |
259 | |
260 | property bool ready: background.source == "" || background.status == Image.Ready || background.status == Image.Error |
261 | - property bool leftTeaserPressed: teasingMouseArea.pressed && |
262 | - teasingMouseArea.mouseX < teasingMouseArea.width / 2 |
263 | - property bool rightTeaserPressed: teasingMouseArea.pressed && |
264 | - teasingMouseArea.mouseX > teasingMouseArea.width / 2 |
265 | |
266 | signal selected(int uid) |
267 | signal unlocked(int uid) |
268 | @@ -74,11 +70,6 @@ |
269 | opacity: 0.4 |
270 | } |
271 | |
272 | - MouseArea { |
273 | - id: teasingMouseArea |
274 | - anchors.fill: parent |
275 | - } |
276 | - |
277 | Loader { |
278 | id: loginLoader |
279 | objectName: "loginLoader" |
280 | |
281 | === modified file 'qml/Greeter/Infographics.qml' |
282 | --- qml/Greeter/Infographics.qml 2013-10-11 16:17:18 +0000 |
283 | +++ qml/Greeter/Infographics.qml 2014-04-17 15:43:48 +0000 |
284 | @@ -457,5 +457,8 @@ |
285 | !circleGrowAnimTimer.running) |
286 | infographic.model.nextDataSource() |
287 | } |
288 | + |
289 | + onClicked: mouse.accepted = false |
290 | + onPressed: mouse.accepted = false |
291 | } |
292 | } |
293 | |
294 | === modified file 'qml/Hud/Hud.qml' |
295 | --- qml/Hud/Hud.qml 2013-06-05 22:03:08 +0000 |
296 | +++ qml/Hud/Hud.qml 2014-04-17 15:43:48 +0000 |
297 | @@ -491,6 +491,6 @@ |
298 | anchors.top: hudContentClipper.top |
299 | anchors.bottom: hudContentClipper.bottom |
300 | fillMode: Image.Tile |
301 | - source: "graphics/dropshadow_right.png" |
302 | + source: "../graphics/dropshadow_right.png" |
303 | } |
304 | } |
305 | |
306 | === modified file 'qml/Shell.qml' |
307 | --- qml/Shell.qml 2014-04-08 16:06:14 +0000 |
308 | +++ qml/Shell.qml 2014-04-17 15:43:48 +0000 |
309 | @@ -148,8 +148,8 @@ |
310 | |
311 | available: !greeter.shown && !lockscreen.shown |
312 | hides: [stages, launcher, panel.indicators] |
313 | - shown: disappearingAnimationProgress !== 1.0 |
314 | - enabled: disappearingAnimationProgress === 0.0 && edgeDemo.dashEnabled |
315 | + shown: disappearingAnimationProgress !== 1.0 && greeterWrapper.showProgress !== 1.0 |
316 | + enabled: disappearingAnimationProgress === 0.0 && greeterWrapper.showProgress === 0.0 && edgeDemo.dashEnabled |
317 | |
318 | anchors { |
319 | fill: parent |
320 | @@ -159,18 +159,14 @@ |
321 | contentScale: 1.0 - 0.2 * disappearingAnimationProgress |
322 | opacity: 1.0 - disappearingAnimationProgress |
323 | property real disappearingAnimationProgress: { |
324 | - if (greeter.shown) { |
325 | - return greeter.showProgress; |
326 | + if (stages.overlayMode) { |
327 | + return 0; |
328 | } else { |
329 | - if (stages.overlayMode) { |
330 | - return 0; |
331 | - } |
332 | return stages.showProgress |
333 | } |
334 | } |
335 | |
336 | - // FIXME: only necessary because stages.showProgress and |
337 | - // greeterRevealer.animatedProgress are not animated |
338 | + // FIXME: only necessary because stages.showProgress is not animated |
339 | Behavior on disappearingAnimationProgress { SmoothedAnimation { velocity: 5 }} |
340 | } |
341 | } |
342 | @@ -362,52 +358,66 @@ |
343 | } |
344 | } |
345 | |
346 | - Greeter { |
347 | - id: greeter |
348 | - objectName: "greeter" |
349 | - |
350 | - available: true |
351 | - hides: [launcher, panel.indicators, hud] |
352 | - shown: true |
353 | - |
354 | - defaultBackground: shell.background |
355 | - |
356 | + Rectangle { |
357 | + anchors.fill: parent |
358 | + color: "black" |
359 | + opacity: greeterWrapper.showProgress * 0.8 |
360 | + } |
361 | + |
362 | + Item { |
363 | + // Just a tiny wrapper to adjust greeter's x without messing with its own dragging |
364 | + id: greeterWrapper |
365 | + x: launcher.progress |
366 | y: panel.panelHeight |
367 | width: parent.width |
368 | height: parent.height - panel.panelHeight |
369 | |
370 | - dragHandleWidth: shell.edgeSize |
371 | - |
372 | - onShownChanged: { |
373 | - if (shown) { |
374 | - lockscreen.reset(); |
375 | - // If there is only one user, we start authenticating with that one here. |
376 | - // If there are more users, the Greeter will handle that |
377 | - if (LightDM.Users.count == 1) { |
378 | - LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole)); |
379 | + Behavior on x {SmoothedAnimation{velocity: 600}} |
380 | + |
381 | + readonly property real showProgress: MathUtils.clamp((1 - x/width) + greeter.showProgress - 1, 0, 1) |
382 | + |
383 | + Greeter { |
384 | + id: greeter |
385 | + objectName: "greeter" |
386 | + |
387 | + available: true |
388 | + hides: [launcher, panel.indicators, hud] |
389 | + shown: true |
390 | + |
391 | + defaultBackground: shell.background |
392 | + |
393 | + width: parent.width |
394 | + height: parent.height |
395 | + |
396 | + dragHandleWidth: shell.edgeSize |
397 | + |
398 | + onShownChanged: { |
399 | + if (shown) { |
400 | + lockscreen.reset(); |
401 | + // If there is only one user, we start authenticating with that one here. |
402 | + // If there are more users, the Greeter will handle that |
403 | + if (LightDM.Users.count == 1) { |
404 | + LightDM.Greeter.authenticate(LightDM.Users.data(0, LightDM.UserRoles.NameRole)); |
405 | + } |
406 | + greeter.forceActiveFocus(); |
407 | } |
408 | - greeter.forceActiveFocus(); |
409 | - } |
410 | - } |
411 | - |
412 | - onUnlocked: greeter.hide() |
413 | - onSelected: { |
414 | - // Update launcher items for new user |
415 | - var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole); |
416 | - AccountsService.user = user; |
417 | - LauncherModel.setUser(user); |
418 | - } |
419 | - |
420 | - onLeftTeaserPressedChanged: { |
421 | - if (leftTeaserPressed) { |
422 | - launcher.tease(); |
423 | - } |
424 | - } |
425 | - |
426 | - Binding { |
427 | - target: ApplicationManager |
428 | - property: "suspended" |
429 | - value: greeter.shown && greeter.showProgress == 1 |
430 | + } |
431 | + |
432 | + onUnlocked: greeter.hide() |
433 | + onSelected: { |
434 | + // Update launcher items for new user |
435 | + var user = LightDM.Users.data(uid, LightDM.UserRoles.NameRole); |
436 | + AccountsService.user = user; |
437 | + LauncherModel.setUser(user); |
438 | + } |
439 | + |
440 | + onTease: launcher.tease() |
441 | + |
442 | + Binding { |
443 | + target: ApplicationManager |
444 | + property: "suspended" |
445 | + value: greeter.shown && greeterWrapper.showProgress == 1 |
446 | + } |
447 | } |
448 | } |
449 | |
450 | @@ -538,7 +548,7 @@ |
451 | anchors.bottom: parent.bottom |
452 | width: parent.width |
453 | dragAreaWidth: shell.edgeSize |
454 | - available: (!greeter.shown || greeter.narrowMode) && edgeDemo.launcherEnabled |
455 | + available: edgeDemo.launcherEnabled |
456 | |
457 | onShowDashHome: { |
458 | if (edgeDemo.running) |
459 | @@ -553,6 +563,10 @@ |
460 | launcher.hide(); |
461 | } |
462 | } |
463 | + if (greeter.shown) { |
464 | + greeter.hideRight(); |
465 | + launcher.hide(); |
466 | + } |
467 | } |
468 | onDashSwipeChanged: if (dashSwipe && stages.shown) dash.setCurrentScope("clickscope", false, true) |
469 | onLauncherApplicationSelected: { |
470 | |
471 | === added file 'qml/graphics/dropshadow_left@20.png' |
472 | Binary files qml/graphics/dropshadow_left@20.png 1970-01-01 00:00:00 +0000 and qml/graphics/dropshadow_left@20.png 2014-04-17 15:43:48 +0000 differ |
473 | === renamed file 'qml/Hud/graphics/dropshadow_right@20.png' => 'qml/graphics/dropshadow_right@20.png' |
474 | === modified file 'tests/qmltests/Greeter/tst_Phone.qml' |
475 | --- tests/qmltests/Greeter/tst_Phone.qml 2014-02-20 20:14:40 +0000 |
476 | +++ tests/qmltests/Greeter/tst_Phone.qml 2014-04-17 15:43:48 +0000 |
477 | @@ -61,6 +61,12 @@ |
478 | signalName: "unlocked" |
479 | } |
480 | |
481 | + SignalSpy { |
482 | + id: teaseSpy |
483 | + target: greeter |
484 | + signalName: "tease" |
485 | + } |
486 | + |
487 | UT.UnityTestCase { |
488 | name: "Greeter" |
489 | when: windowShown |
490 | @@ -82,56 +88,10 @@ |
491 | } |
492 | |
493 | function test_teasingArea(data) { |
494 | - tryCompare(greeter, "leftTeaserPressed", false) |
495 | - tryCompare(greeter, "rightTeaserPressed", false) |
496 | - mousePress(greeter, data.posX, greeter.height - units.gu(1)) |
497 | - tryCompare(greeter, "leftTeaserPressed", data.leftPressed) |
498 | - tryCompare(greeter, "rightTeaserPressed", data.rightPressed) |
499 | - mouseRelease(greeter, data.posX, greeter.height - units.gu(1)) |
500 | - tryCompare(greeter, "leftTeaserPressed", false) |
501 | - tryCompare(greeter, "rightTeaserPressed", false) |
502 | - } |
503 | - |
504 | - function test_teaseLockedUnlocked_data() { |
505 | - return [ |
506 | - {tag: "unlocked", locked: false, moved: false}, |
507 | - {tag: "locked", locked: true, moved: false}, |
508 | - {tag: "moved", locked: false, moved: true} |
509 | - ]; |
510 | - } |
511 | - |
512 | - function test_teaseLockedUnlocked(data) { |
513 | - tryCompare(greeter, "rightTeaserPressed", false); |
514 | - tryCompare(greeter, "x", 0); |
515 | - greeter.locked = data.locked; |
516 | - |
517 | - // simulate greeter being in the middle of a swipe |
518 | - if (data.moved) { |
519 | - greeter.x = -units.gu(4); |
520 | - tryCompare(greeter, "x", -units.gu(4)); |
521 | - } |
522 | - |
523 | - mouseClick(greeter, greeter.width - units.gu(5), greeter.height - units.gu(1)); |
524 | - greeter.minX = 0; // This is needed because the transition actually makes x jump once before animating |
525 | - |
526 | - if (!data.moved) { |
527 | - // Check if it has been moved over by 2 GUs. Give it a 2 pixel grace area |
528 | - // because animation duration and teaseTimer are the same duration and |
529 | - // might cause slight offsets |
530 | - tryCompareFunction(function() { return greeter.minX <= -units.gu(2) + 2}, true); |
531 | - } else { |
532 | - // waiting 100ms to make sure nothing moves |
533 | - wait(100); |
534 | - compare(greeter.minX, 0, "Greeter teasing not disabled even though it's locked or moving."); |
535 | - } |
536 | - |
537 | - // Restore position in case we moved it for the test |
538 | - if (data.moved) { |
539 | - greeter.x = 0; |
540 | - } |
541 | - |
542 | - // Wait until we're back to 0 |
543 | - tryCompareFunction(function() { return greeter.x;}, 0); |
544 | + teaseSpy.clear() |
545 | + mouseClick(greeter, data.posX, greeter.height - units.gu(1)) |
546 | + teaseSpy.wait() |
547 | + tryCompare(teaseSpy, "count", 1) |
548 | } |
549 | |
550 | function test_statsWelcomeScreen() { |
551 | |
552 | === modified file 'tests/qmltests/Greeter/tst_Tablet.qml' |
553 | --- tests/qmltests/Greeter/tst_Tablet.qml 2014-02-20 20:14:40 +0000 |
554 | +++ tests/qmltests/Greeter/tst_Tablet.qml 2014-04-17 15:43:48 +0000 |
555 | @@ -54,6 +54,12 @@ |
556 | signalName: "selected" |
557 | } |
558 | |
559 | + SignalSpy { |
560 | + id: teaseSpy |
561 | + target: greeter |
562 | + signalName: "tease" |
563 | + } |
564 | + |
565 | UT.UnityTestCase { |
566 | name: "Greeter" |
567 | when: windowShown |
568 | @@ -325,14 +331,36 @@ |
569 | } |
570 | |
571 | function test_teasingArea(data) { |
572 | - tryCompare(greeter, "leftTeaserPressed", false) |
573 | - tryCompare(greeter, "rightTeaserPressed", false) |
574 | - mousePress(greeter, data.posX, greeter.height - units.gu(1)) |
575 | - tryCompare(greeter, "leftTeaserPressed", data.leftPressed) |
576 | - tryCompare(greeter, "rightTeaserPressed", data.rightPressed) |
577 | - mouseRelease(greeter, data.posX, greeter.height - units.gu(1)) |
578 | - tryCompare(greeter, "leftTeaserPressed", false) |
579 | - tryCompare(greeter, "rightTeaserPressed", false) |
580 | + teaseSpy.clear() |
581 | + mouseClick(greeter, data.posX, greeter.height - units.gu(1)) |
582 | + teaseSpy.wait() |
583 | + tryCompare(teaseSpy, "count", 1) |
584 | + } |
585 | + |
586 | + function test_teaseLockedUnlocked_data() { |
587 | + return [ |
588 | + {tag: "unlocked", locked: false, narrow: false}, |
589 | + {tag: "locked", locked: true, narrow: false}, |
590 | + ]; |
591 | + } |
592 | + |
593 | + function test_teaseLockedUnlocked(data) { |
594 | + teaseSpy.clear() |
595 | + greeter.locked = data.locked; |
596 | + |
597 | + mouseClick(greeter, greeter.width - units.gu(5), greeter.height - units.gu(1)); |
598 | + |
599 | + if (!data.locked || data.narrow) { |
600 | + teaseSpy.wait() |
601 | + tryCompare(teaseSpy, "count", 1); |
602 | + } else { |
603 | + // waiting 100ms to make sure nothing happens |
604 | + wait(100); |
605 | + compare(teaseSpy.count, 0, "Greeter teasing not disabled even though it's locked."); |
606 | + } |
607 | + |
608 | + // Reset value |
609 | + greeter.locked = false; |
610 | } |
611 | |
612 | function test_dbus_set_active_entry() { |
FAILED: Continuous integration, rev:757 jenkins. qa.ubuntu. com/job/ unity8- ci/2459/ jenkins. qa.ubuntu. com/job/ generic- mediumtests- trusty/ 3764 jenkins. qa.ubuntu. com/job/ generic- mediumtests- trusty- touch/3352/ console jenkins. qa.ubuntu. com/job/ unity-phablet- qmluitests- trusty/ 1329 jenkins. qa.ubuntu. com/job/ unity8- trusty- amd64-ci/ 980 jenkins. qa.ubuntu. com/job/ unity8- trusty- armhf-ci/ 984 jenkins. qa.ubuntu. com/job/ unity8- trusty- armhf-ci/ 984/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ unity8- trusty- i386-ci/ 980 jenkins. qa.ubuntu. com/job/ autopilot- testrunner- otto-trusty/ 3310 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- amd64/3772 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- amd64/3772/ artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- armhf/3354 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- trusty- armhf/3354/ artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ generic- mediumtests- runner- mako/5723/ console s-jenkins. ubuntu- ci:8080/ job/touch- flash-device/ 4598
http://
Executed test runs:
SUCCESS: http://
FAILURE: http://
UNSTABLE: 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: s-jenkins. ubuntu- ci:8080/ job/unity8- ci/2459/ rebuild
http://