Merge lp:~lukas-kde/unity8/shellDialogImprovements into lp:unity8
- shellDialogImprovements
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Michael Zanetti |
Approved revision: | 2686 |
Merged at revision: | 2773 |
Proposed branch: | lp:~lukas-kde/unity8/shellDialogImprovements |
Merge into: | lp:unity8 |
Prerequisite: | lp:~aacid/unity8/tab_focus_fence_dialogs |
Diff against target: |
234 lines (+66/-11) 8 files modified
plugins/Utils/tabfocusfence.cpp (+26/-0) plugins/Utils/tabfocusfence.h (+3/-0) qml/Components/Dialogs.qml (+14/-2) qml/Components/ShellDialog.qml (+6/-2) qml/OrientedShell.qml (+2/-1) qml/Shell.qml (+3/-0) tests/qmltests/tst_OrientedShell.qml (+12/-5) tests/qmltests/tst_Shell.qml (+0/-1) |
To merge this branch: | bzr merge lp:~lukas-kde/unity8/shellDialogImprovements |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Unity8 CI Bot | continuous-integration | Approve | |
Michael Zanetti (community) | Approve | ||
Review via email: mp+314061@code.launchpad.net |
This proposal supersedes a proposal from 2016-10-31.
Commit message
Shell dialog improvements (kbd focus, mouse eater)
Description of the change
Shell dialog improvements:
- put a mouse eater behind the shell dialog, prevents interacting/
- with a keyboard, put focus on the first/affirmative action button
- add an alternative Lock screen shortcut (as in u7)
- cleanups
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2609
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
PASSED: Continuous integration, rev:2673
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Michael Zanetti (mzanetti) : Posted in a previous version of this proposal | # |
Lukáš Tinkl (lukas-kde) : Posted in a previous version of this proposal | # |
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2674
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2675
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2676
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
PASSED: Continuous integration, rev:2677
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal | # |
Can you explain why the MouseArea is needed? According to the UITK docs, the Dialog component should be modal and do this on its own already.
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal | # |
> Can you explain why the MouseArea is needed? According to the UITK docs, the
> Dialog component should be modal and do this on its own already.
Yeah the modality of the dialog is fine, I guess it's just the hover/wheel then:
+ hoverEnabled: true
+ onWheel: wheel.accepted = true
Because without this, I can still see the "resize" cursor shape of the window below, thru the dialog
Michael Zanetti (mzanetti) wrote : Posted in a previous version of this proposal | # |
hmmmm... sounds like a bug in the Dialog component then, doesn't it?
If we keep it in here, wouldn't it make sense to move it into Dialogs.qml, perhaps making the root Item in there a MouseArea?
Lukáš Tinkl (lukas-kde) wrote : Posted in a previous version of this proposal | # |
> hmmmm... sounds like a bug in the Dialog component then, doesn't it?
>
> If we keep it in here, wouldn't it make sense to move it into Dialogs.qml,
> perhaps making the root Item in there a MouseArea?
Yeah, that makes sense imo; I'll rebase this branch on top of https:/
Lukáš Tinkl (lukas-kde) wrote : | # |
Done, resubmitted with Dialogs.qml being a MouseArea itself
Unity8 CI Bot (unity8-ci-bot) wrote : Posted in a previous version of this proposal | # |
FAILED: Continuous integration, rev:2679
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2680
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2681. By Lukáš Tinkl
-
design: always focus the first/affirmative action
Lukáš Tinkl (lukas-kde) wrote : | # |
Follow design/UX advice: always pre-focus the first/affirmative action
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2681
https:/
Executed test runs:
SUCCESS: https:/
UNSTABLE: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
- 2682. By Lukáš Tinkl
-
fix hasActiveDialog
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
FAILED: Continuous integration, rev:2682
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
UNSTABLE: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:2682
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Michael Zanetti (mzanetti) wrote : | # |
Seems to work mostly fine.
Atm one can only use the Tab/Backtab keys to navigate the menu. This is different from unity7 where the arrow keys are used. I think it's ok to keep the tab navigation but IMO we should also add arrow navigation to it. Wdyt?
Lukáš Tinkl (lukas-kde) wrote : | # |
> Seems to work mostly fine.
>
> Atm one can only use the Tab/Backtab keys to navigate the menu. This is
> different from unity7 where the arrow keys are used. I think it's ok to keep
> the tab navigation but IMO we should also add arrow navigation to it. Wdyt?
Yup, I will add it
- 2683. By Lukáš Tinkl
-
allow up/down keys to manipulate focus in the fenced focus chain
Lukáš Tinkl (lukas-kde) wrote : | # |
> Seems to work mostly fine.
>
> Atm one can only use the Tab/Backtab keys to navigate the menu. This is
> different from unity7 where the arrow keys are used. I think it's ok to keep
> the tab navigation but IMO we should also add arrow navigation to it. Wdyt?
Yup, added respective focusNext/Prev methods to the fence; it has the advantage you can bind arbitrary keys to it from QML.
- 2684. By Lukáš Tinkl
-
return a bool so that we can accept the event from QML
- 2685. By Lukáš Tinkl
-
use current, don't deref twice
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:2683
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:2685
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Michael Zanetti (mzanetti) wrote : | # |
tested, works fine, code looks good too
IMO a test wouldn't hurt, wdyt?
- 2686. By Lukáš Tinkl
-
test both Tab and Down keys
Michael Zanetti (mzanetti) wrote : | # |
lgtm. top-approving when ci agrees
Unity8 CI Bot (unity8-ci-bot) wrote : | # |
PASSED: Continuous integration, rev:2686
https:/
Executed test runs:
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
SUCCESS: https:/
deb: https:/
Click here to trigger a rebuild:
https:/
Preview Diff
1 | === modified file 'plugins/Utils/tabfocusfence.cpp' |
2 | --- plugins/Utils/tabfocusfence.cpp 2017-01-09 13:02:35 +0000 |
3 | +++ plugins/Utils/tabfocusfence.cpp 2017-01-09 13:02:35 +0000 |
4 | @@ -25,6 +25,32 @@ |
5 | setFlag(ItemIsFocusScope); |
6 | } |
7 | |
8 | +bool TabFocusFenceItem::focusNext() |
9 | +{ |
10 | + QQuickItem * current = scopedFocusItem(); |
11 | + if (current) { |
12 | + QQuickItem * next = current->nextItemInFocusChain(true); |
13 | + if (next) { |
14 | + next->setFocus(true, Qt::TabFocusReason); |
15 | + return true; |
16 | + } |
17 | + } |
18 | + return false; |
19 | +} |
20 | + |
21 | +bool TabFocusFenceItem::focusPrev() |
22 | +{ |
23 | + QQuickItem * current = scopedFocusItem(); |
24 | + if (current) { |
25 | + QQuickItem * prev = current->nextItemInFocusChain(false); |
26 | + if (prev) { |
27 | + prev->setFocus(true, Qt::BacktabFocusReason); |
28 | + return true; |
29 | + } |
30 | + } |
31 | + return false; |
32 | +} |
33 | + |
34 | void TabFocusFenceItem::keyPressEvent(QKeyEvent *event) |
35 | { |
36 | // Needed so we eat Tab keys when there's only one item inside the fence |
37 | |
38 | === modified file 'plugins/Utils/tabfocusfence.h' |
39 | --- plugins/Utils/tabfocusfence.h 2017-01-09 13:02:35 +0000 |
40 | +++ plugins/Utils/tabfocusfence.h 2017-01-09 13:02:35 +0000 |
41 | @@ -28,6 +28,9 @@ |
42 | public: |
43 | TabFocusFenceItem(QQuickItem *parent = nullptr); |
44 | |
45 | + Q_INVOKABLE bool focusNext(); |
46 | + Q_INVOKABLE bool focusPrev(); |
47 | + |
48 | void keyPressEvent(QKeyEvent *event) override; |
49 | void keyReleaseEvent(QKeyEvent *event) override; |
50 | }; |
51 | |
52 | === modified file 'qml/Components/Dialogs.qml' |
53 | --- qml/Components/Dialogs.qml 2017-01-09 13:02:35 +0000 |
54 | +++ qml/Components/Dialogs.qml 2017-01-09 13:02:35 +0000 |
55 | @@ -24,10 +24,13 @@ |
56 | import Utils 0.1 |
57 | import "../Greeter" |
58 | |
59 | -Item { |
60 | +MouseArea { |
61 | id: root |
62 | + acceptedButtons: Qt.AllButtons |
63 | + hoverEnabled: true |
64 | + onWheel: wheel.accepted = true |
65 | |
66 | - readonly property alias hasActiveDialog: dialogLoader.active |
67 | + readonly property bool hasActiveDialog: dialogLoader.active || d.modeSwitchWarningPopup |
68 | |
69 | // to be set from outside, useful mostly for testing purposes |
70 | property var unitySessionService: DBusUnitySessionService |
71 | @@ -42,6 +45,7 @@ |
72 | } |
73 | property string usageScenario |
74 | property size screenSize: Qt.size(Screen.width, Screen.height) |
75 | + property bool hasKeyboard: false |
76 | |
77 | signal powerOffClicked(); |
78 | |
79 | @@ -120,6 +124,11 @@ |
80 | onTriggered: LightDMService.greeter.showGreeter() |
81 | } |
82 | |
83 | + GlobalShortcut { // lock screen |
84 | + shortcut: Qt.MetaModifier|Qt.Key_L |
85 | + onTriggered: LightDMService.greeter.showGreeter() |
86 | + } |
87 | + |
88 | QtObject { |
89 | id: d // private stuff |
90 | objectName: "dialogsPrivate" |
91 | @@ -155,6 +164,7 @@ |
92 | LightDMService.greeter.showGreeter() |
93 | logoutDialog.hide(); |
94 | } |
95 | + Component.onCompleted: if (root.hasKeyboard) forceActiveFocus(Qt.TabFocusReason) |
96 | } |
97 | Button { |
98 | width: parent.width |
99 | @@ -198,6 +208,7 @@ |
100 | rebootDialog.hide(); |
101 | } |
102 | color: theme.palette.normal.negative |
103 | + Component.onCompleted: if (root.hasKeyboard) forceActiveFocus(Qt.TabFocusReason) |
104 | } |
105 | } |
106 | } |
107 | @@ -218,6 +229,7 @@ |
108 | root.powerOffClicked(); |
109 | } |
110 | color: theme.palette.normal.negative |
111 | + Component.onCompleted: if (root.hasKeyboard) forceActiveFocus(Qt.TabFocusReason) |
112 | } |
113 | Button { |
114 | width: parent.width |
115 | |
116 | === modified file 'qml/Components/ShellDialog.qml' |
117 | --- qml/Components/ShellDialog.qml 2017-01-09 13:02:35 +0000 |
118 | +++ qml/Components/ShellDialog.qml 2017-01-09 13:02:35 +0000 |
119 | @@ -37,8 +37,6 @@ |
120 | |
121 | onVisibleChanged: { if (!visible && dialogLoader) { dialogLoader.active = false; } } |
122 | |
123 | - Keys.onEscapePressed: hide() |
124 | - |
125 | focus: true |
126 | |
127 | // FIXME: this is a hack because Dialog subtheming seems broken atm |
128 | @@ -63,5 +61,11 @@ |
129 | width: parent.width |
130 | spacing: units.gu(2) |
131 | } |
132 | + Keys.onDownPressed: { |
133 | + event.accepted = focusNext(); |
134 | + } |
135 | + Keys.onUpPressed: { |
136 | + event.accepted = focusPrev(); |
137 | + } |
138 | } |
139 | } |
140 | |
141 | === modified file 'qml/OrientedShell.qml' |
142 | --- qml/OrientedShell.qml 2016-09-01 07:40:06 +0000 |
143 | +++ qml/OrientedShell.qml 2017-01-09 13:02:35 +0000 |
144 | @@ -260,7 +260,8 @@ |
145 | nativeWidth: root.width |
146 | nativeHeight: root.height |
147 | mode: applicationArguments.mode |
148 | - hasMouse: miceModel.count + touchPadModel.count > 0 |
149 | + hasMouse: pointerInputDevices > 0 |
150 | + hasKeyboard: keyboardsModel.count > 0 |
151 | // TODO: Factor in if the current screen is a touch screen and if the user wants to |
152 | // have multiple keyboards around. For now we only enable one keyboard at a time |
153 | // thus hiding it here if there is a physical one around or if we have a second |
154 | |
155 | === modified file 'qml/Shell.qml' |
156 | --- qml/Shell.qml 2016-12-12 16:45:09 +0000 |
157 | +++ qml/Shell.qml 2017-01-09 13:02:35 +0000 |
158 | @@ -68,6 +68,7 @@ |
159 | stage.updateFocusedAppOrientationAnimated(); |
160 | } |
161 | property bool hasMouse: false |
162 | + property bool hasKeyboard: false |
163 | |
164 | // to be read from outside |
165 | readonly property int mainAppWindowOrientationAngle: stage.mainAppWindowOrientationAngle |
166 | @@ -647,8 +648,10 @@ |
167 | id: dialogs |
168 | objectName: "dialogs" |
169 | anchors.fill: parent |
170 | + visible: hasActiveDialog |
171 | z: overlay.z + 10 |
172 | usageScenario: shell.usageScenario |
173 | + hasKeyboard: shell.hasKeyboard |
174 | onPowerOffClicked: { |
175 | shutdownFadeOutRectangle.enabled = true; |
176 | shutdownFadeOutRectangle.visible = true; |
177 | |
178 | === modified file 'tests/qmltests/tst_OrientedShell.qml' |
179 | --- tests/qmltests/tst_OrientedShell.qml 2017-01-09 13:02:35 +0000 |
180 | +++ tests/qmltests/tst_OrientedShell.qml 2017-01-09 13:02:35 +0000 |
181 | @@ -1559,7 +1559,14 @@ |
182 | return surface.activeFocus; |
183 | } |
184 | |
185 | - function test_tabCyclyingInShutdownDialog() { |
186 | + function test_tabCyclyingInShutdownDialog_data() { |
187 | + return [ |
188 | + {tag: "TAB", key: Qt.Key_Tab}, |
189 | + {tag: "DOWN", key: Qt.Key_Down} |
190 | + ]; |
191 | + } |
192 | + |
193 | + function test_tabCyclyingInShutdownDialog(data) { |
194 | loadShell("mako"); |
195 | |
196 | testCase.showPowerDialog(); |
197 | @@ -1569,13 +1576,13 @@ |
198 | |
199 | tryCompare(buttons[0], "activeFocus", true); |
200 | |
201 | - keyClick(Qt.Key_Tab); |
202 | + keyClick(data.key); |
203 | tryCompare(buttons[1], "activeFocus", true); |
204 | |
205 | - keyClick(Qt.Key_Tab); |
206 | + keyClick(data.key); |
207 | tryCompare(buttons[2], "activeFocus", true); |
208 | |
209 | - keyClick(Qt.Key_Tab); |
210 | + keyClick(data.key); |
211 | tryCompare(buttons[0], "activeFocus", true); |
212 | |
213 | keyClick(Qt.Key_Escape); |
214 | @@ -1584,7 +1591,7 @@ |
215 | tryCompare(dialogLoader, "item", null); |
216 | } |
217 | |
218 | - function test_escColosesShutdownDialog() { |
219 | + function test_escClosesShutdownDialog() { |
220 | loadShell("mako"); |
221 | |
222 | testCase.showPowerDialog(); |
223 | |
224 | === modified file 'tests/qmltests/tst_Shell.qml' |
225 | --- tests/qmltests/tst_Shell.qml 2016-12-12 16:45:09 +0000 |
226 | +++ tests/qmltests/tst_Shell.qml 2017-01-09 13:02:35 +0000 |
227 | @@ -560,7 +560,6 @@ |
228 | // is loaded by default |
229 | tearDown(); |
230 | } |
231 | - |
232 | } |
233 | |
234 | function cleanup() { |
FAILED: Continuous integration, rev:2609 /unity8- jenkins. ubuntu. com/job/ lp-unity8- ci/2144/ /unity8- jenkins. ubuntu. com/job/ build/2819/ console /unity8- jenkins. ubuntu. com/job/ build-0- fetch/2847 /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= vivid+overlay/ 2706/console /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= xenial+ overlay/ 2706/console /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=amd64, release= yakkety/ 2706/console /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= vivid+overlay/ 2706/console /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= xenial+ overlay/ 2706/console /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=armhf, release= yakkety/ 2706/console /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= vivid+overlay/ 2706/console /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= xenial+ overlay/ 2706/console /unity8- jenkins. ubuntu. com/job/ build-2- binpkg/ arch=i386, release= yakkety/ 2706/console
https:/
Executed test runs:
FAILURE: https:/
SUCCESS: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
FAILURE: https:/
Click here to trigger a rebuild: /unity8- jenkins. ubuntu. com/job/ lp-unity8- ci/2144/ rebuild
https:/