Merge lp:~jonas-drange/ubuntu-system-settings/1319044-carrier-design-dual-sim into lp:ubuntu-system-settings
- 1319044-carrier-design-dual-sim
- Merge into trunk
Status: | Merged |
---|---|
Approved by: | Ken VanDine |
Approved revision: | 790 |
Merged at revision: | 833 |
Proposed branch: | lp:~jonas-drange/ubuntu-system-settings/1319044-carrier-design-dual-sim |
Merge into: | lp:ubuntu-system-settings |
Diff against target: |
1612 lines (+997/-320) 11 files modified
plugins/cellular/CMakeLists.txt (+5/-3) plugins/cellular/Components/CMakeLists.txt (+7/-0) plugins/cellular/Components/CellularDualSim.qml (+154/-0) plugins/cellular/Components/CellularSingleSim.qml (+100/-0) plugins/cellular/Components/Sim.qml (+61/-0) plugins/cellular/Components/data-helpers.js (+22/-90) plugins/cellular/PageChooseCarrier.qml (+70/-52) plugins/cellular/PageChooseCarriers.qml (+77/-0) plugins/cellular/PageComponent.qml (+92/-104) tests/autopilot/ubuntu_system_settings/tests/__init__.py (+110/-38) tests/autopilot/ubuntu_system_settings/tests/test_cellular.py (+299/-33) |
To merge this branch: | bzr merge lp:~jonas-drange/ubuntu-system-settings/1319044-carrier-design-dual-sim |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Ken VanDine | Approve | ||
PS Jenkins bot | continuous-integration | Approve | |
Review via email: mp+227318@code.launchpad.net |
Commit message
Cellular panel changes: new carrier design. Carrier selection for two sims (individual selection). Using either sim1 or sim2 for cellular data. Data technology preference selection refactor to work for dual sim scenario as well.
Description of the change
Hi,
this branch lands a way to deal nicely with single and dual sim situations, as well as:
* new carrier selection designs
* carrier selection for dual sim
* refactoring data technology preference code to be more static (using Bindings and Connections)
* data technology preference works for single and dual sim situations
Thanks
PS Jenkins bot (ps-jenkins) wrote : | # |
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:786
http://
Executed test runs:
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://
Ken VanDine (ken-vandine) wrote : | # |
Lets remove the debugging output and see my comment inline
Ken VanDine (ken-vandine) wrote : | # |
Please make sure all the lines wrap at 80
Jonas G. Drange (jonas-drange) wrote : | # |
Acking diff comment
Ken VanDine (ken-vandine) wrote : | # |
See inline comment for single sim
- 787. By Jonas G. Drange
-
remove debug, do netreg in SIM
- 788. By Jonas G. Drange
-
fix connman error
Jonas G. Drange (jonas-drange) wrote : | # |
- ran test_code, which passed
- fixed connMan error (thanks Ken)
- removed debug statements, all except where we actually need to know what failed (?)
- moved netReg to Sim.qml where it is created along with all other relevant ofono objects
- 789. By Jonas G. Drange
-
remove test test
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:788
http://
Executed test runs:
UNSTABLE: http://
UNSTABLE: 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://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:789
http://
Executed test runs:
UNSTABLE: http://
UNSTABLE: 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://
PS Jenkins bot (ps-jenkins) wrote : | # |
FAILED: Continuous integration, rev:789
http://
Executed test runs:
UNSTABLE: http://
UNSTABLE: 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://
- 790. By Jonas G. Drange
-
making sure radio preference changes does not override user selection
PS Jenkins bot (ps-jenkins) wrote : | # |
PASSED: Continuous integration, rev:789
http://
Executed test runs:
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 : | # |
PASSED: Continuous integration, rev:790
http://
Executed test runs:
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://
Ken VanDine (ken-vandine) wrote : | # |
Looks good, I tested it on my mako and Tiago tested on his dual sim device.
Preview Diff
1 | === modified file 'plugins/cellular/CMakeLists.txt' |
2 | --- plugins/cellular/CMakeLists.txt 2014-07-09 13:09:38 +0000 |
3 | +++ plugins/cellular/CMakeLists.txt 2014-07-25 08:32:52 +0000 |
4 | @@ -1,12 +1,14 @@ |
5 | +add_subdirectory(Components) |
6 | + |
7 | install(FILES cellular.settings DESTINATION ${PLUGIN_MANIFEST_DIR}) |
8 | install(FILES settings-cellular.svg DESTINATION ${PLUGIN_MANIFEST_DIR}/icons) |
9 | |
10 | set(QML_SOURCES |
11 | - ChooseCarrier.qml |
12 | + PageChooseCarrier.qml |
13 | + PageChooseCarriers.qml |
14 | + PageComponent.qml |
15 | Hotspot.qml |
16 | HotspotSetup.qml |
17 | - PageComponent.qml |
18 | - rdosettings-helpers.js |
19 | ) |
20 | |
21 | |
22 | |
23 | === added directory 'plugins/cellular/Components' |
24 | === added file 'plugins/cellular/Components/CMakeLists.txt' |
25 | --- plugins/cellular/Components/CMakeLists.txt 1970-01-01 00:00:00 +0000 |
26 | +++ plugins/cellular/Components/CMakeLists.txt 2014-07-25 08:32:52 +0000 |
27 | @@ -0,0 +1,7 @@ |
28 | +set(QML_SOURCES |
29 | + CellularSingleSim.qml |
30 | + data-helpers.js |
31 | + CellularDualSim.qml |
32 | + Sim.qml |
33 | +) |
34 | +install(FILES ${QML_SOURCES} DESTINATION ${PLUGIN_QML_DIR}/cellular/Components) |
35 | |
36 | === added file 'plugins/cellular/Components/CellularDualSim.qml' |
37 | --- plugins/cellular/Components/CellularDualSim.qml 1970-01-01 00:00:00 +0000 |
38 | +++ plugins/cellular/Components/CellularDualSim.qml 2014-07-25 08:32:52 +0000 |
39 | @@ -0,0 +1,154 @@ |
40 | +/* |
41 | + * Copyright (C) 2014 Canonical Ltd |
42 | + * |
43 | + * This program is free software: you can redistribute it and/or modify |
44 | + * it under the terms of the GNU General Public License version 3 as |
45 | + * published by the Free Software Foundation. |
46 | + * |
47 | + * This program is distributed in the hope that it will be useful, |
48 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
49 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
50 | + * GNU General Public License for more details. |
51 | + * |
52 | + * You should have received a copy of the GNU General Public License |
53 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. |
54 | + * |
55 | + * Authors: |
56 | + * Jonas G. Drange <jonas.drange@canonical.com> |
57 | + * |
58 | +*/ |
59 | +import QtQuick 2.0 |
60 | +import Ubuntu.Components 0.1 |
61 | +import Ubuntu.Components.ListItems 0.1 as ListItem |
62 | +import "data-helpers.js" as DataHelpers |
63 | + |
64 | +Column { |
65 | + id: root |
66 | + property var sim1 |
67 | + property var sim2 |
68 | + property var selector: selector |
69 | + property var prefMap: ['gsm', 'any'] |
70 | + |
71 | + function getUsedSim () { |
72 | + if (state === "sim1") { |
73 | + return sim1; |
74 | + } else if (state === "sim2") { |
75 | + return sim2; |
76 | + } else { |
77 | + return null; |
78 | + } |
79 | + } |
80 | + |
81 | + height: childrenRect.height |
82 | + states: [ |
83 | + State { |
84 | + name: "sim1" |
85 | + when: sim1.connMan.powered && !sim2.connMan.powered |
86 | + }, |
87 | + State { |
88 | + name: "sim2" |
89 | + when: sim2.connMan.powered && !sim1.connMan.powered |
90 | + }, |
91 | + State { |
92 | + name: "bothOnline" |
93 | + when: sim1.connMan.powered && sim2.connMan.powered |
94 | + StateChangeScript { script: { |
95 | + sim2.connMan.powered = false; |
96 | + }} |
97 | + } |
98 | + ] |
99 | + |
100 | + ListItem.ItemSelector { |
101 | + id: use |
102 | + objectName: "use" |
103 | + text: i18n.tr("Cellular data:") |
104 | + expanded: true |
105 | + model: ["Off", "sim1", "sim2"] |
106 | + delegate: OptionSelectorDelegate { text: { |
107 | + var t; |
108 | + if (modelData === "sim1") { |
109 | + t = sim1.title |
110 | + } else if (modelData === "sim2") { |
111 | + t = sim2.title |
112 | + } else { |
113 | + t = i18n.tr(modelData); |
114 | + } |
115 | + return t; |
116 | + }} |
117 | + selectedIndex: [true, sim1.connMan.powered, sim2.connMan.powered].lastIndexOf(true) |
118 | + onDelegateClicked: { |
119 | + sim1.connMan.powered = (index === 1) |
120 | + sim2.connMan.powered = (index === 2) |
121 | + } |
122 | + } |
123 | + |
124 | + Connections { |
125 | + target: sim1.connMan |
126 | + onPoweredChanged: { |
127 | + if (powered) { |
128 | + use.selectedIndex = 1; |
129 | + } |
130 | + } |
131 | + } |
132 | + |
133 | + Connections { |
134 | + target: sim2.connMan |
135 | + onPoweredChanged: { |
136 | + if (powered) { |
137 | + use.selectedIndex = 2; |
138 | + } |
139 | + } |
140 | + } |
141 | + |
142 | + ListItem.ItemSelector { |
143 | + id: selector |
144 | + objectName: "technologyPreferenceSelector" |
145 | + expanded: true |
146 | + model: [i18n.tr("2G only (saves battery)"), i18n.tr("2G/3G/4G (faster)")] |
147 | + enabled: use.selectedIndex !== 0 |
148 | + onDelegateClicked: getUsedSim().radioSettings.technologyPreference = prefMap[index]; |
149 | + } |
150 | + |
151 | + Connections { |
152 | + target: sim1.radioSettings |
153 | + onTechnologyPreferenceChanged: { |
154 | + if (sim1.connMan.powered) { |
155 | + selector.selectedIndex = DataHelpers.dualSimKeyToIndex(preference); |
156 | + } |
157 | + } |
158 | + } |
159 | + |
160 | + Connections { |
161 | + target: sim2.radioSettings |
162 | + onTechnologyPreferenceChanged: { |
163 | + if (sim2.connMan.powered) { |
164 | + selector.selectedIndex = DataHelpers.dualSimKeyToIndex(preference); |
165 | + } |
166 | + } |
167 | + } |
168 | + |
169 | + Binding { |
170 | + target: selector |
171 | + property: "enabled" |
172 | + value: getUsedSim() && (getUsedSim().radioSettings.technologyPreference !== "") |
173 | + when: getUsedSim() |
174 | + } |
175 | + |
176 | + ListItem.Standard { |
177 | + id: dataRoamingItem |
178 | + objectName: "dataRoamingSwitch" |
179 | + text: i18n.tr("Data roaming") |
180 | + enabled: use.selectedIndex !== 0 |
181 | + control: Switch { |
182 | + id: dataRoamingControl |
183 | + onClicked: getUsedSim().connMan.roamingAllowed = checked |
184 | + } |
185 | + } |
186 | + |
187 | + Binding { |
188 | + target: dataRoamingControl |
189 | + property: "checked" |
190 | + value: getUsedSim() && getUsedSim().connMan.roamingAllowed |
191 | + when: getUsedSim() |
192 | + } |
193 | +} |
194 | |
195 | === added file 'plugins/cellular/Components/CellularSingleSim.qml' |
196 | --- plugins/cellular/Components/CellularSingleSim.qml 1970-01-01 00:00:00 +0000 |
197 | +++ plugins/cellular/Components/CellularSingleSim.qml 2014-07-25 08:32:52 +0000 |
198 | @@ -0,0 +1,100 @@ |
199 | +/* |
200 | + * Copyright (C) 2014 Canonical Ltd |
201 | + * |
202 | + * This program is free software: you can redistribute it and/or modify |
203 | + * it under the terms of the GNU General Public License version 3 as |
204 | + * published by the Free Software Foundation. |
205 | + * |
206 | + * This program is distributed in the hope that it will be useful, |
207 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
208 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
209 | + * GNU General Public License for more details. |
210 | + * |
211 | + * You should have received a copy of the GNU General Public License |
212 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. |
213 | + * |
214 | + * Authors: |
215 | + * Jonas G. Drange <jonas.drange@canonical.com> |
216 | + * |
217 | +*/ |
218 | +import QtQuick 2.0 |
219 | +import Ubuntu.Components 0.1 |
220 | +import Ubuntu.Components.ListItems 0.1 as ListItem |
221 | +import "data-helpers.js" as DataHelpers |
222 | + |
223 | +Column { |
224 | + height: childrenRect.height |
225 | + |
226 | + property var sim1 |
227 | + property var selector: selector |
228 | + |
229 | + ListItem.ItemSelector { |
230 | + id: selector |
231 | + objectName: "technologyPreferenceSelector" |
232 | + text: i18n.tr("Cellular data:") |
233 | + expanded: true |
234 | + enabled: sim1.radioSettings.technologyPreference !== "" |
235 | + model: [i18n.tr("Off"), i18n.tr("2G only (saves battery)"), i18n.tr("2G/3G/4G (faster)")] |
236 | + selectedIndex: { |
237 | + if (sim1.connMan.powered) { |
238 | + return DataHelpers.singleSimKeyToIndex(sim1.radioSettings.technologyPreference); |
239 | + } else { |
240 | + return 0; |
241 | + } |
242 | + } |
243 | + } |
244 | + |
245 | + ListItem.Standard { |
246 | + id: dataRoamingItem |
247 | + objectName: "dataRoamingSwitch" |
248 | + text: i18n.tr("Data roaming") |
249 | + enabled: sim1.connMan.powered |
250 | + control: Switch { |
251 | + id: dataRoamingControl |
252 | + checked: sim1.connMan.roamingAllowed |
253 | + onClicked: sim1.connMan.roamingAllowed = checked |
254 | + } |
255 | + } |
256 | + |
257 | + Connections { |
258 | + target: sim1.connMan |
259 | + onPoweredChanged: { |
260 | + if (powered) { |
261 | + selector.selectedIndex = DataHelpers.singleSimKeyToIndex(sim1.radioSettings.technologyPreference); |
262 | + } else { |
263 | + selector.selectedIndex = 0; |
264 | + } |
265 | + } |
266 | + } |
267 | + |
268 | + Connections { |
269 | + target: sim1.radioSettings |
270 | + onTechnologyPreferenceChanged: { |
271 | + var selIndex = selector.selectedIndex; |
272 | + if (selIndex > 0) { |
273 | + sim1.radioSettings.technologyPreference = DataHelpers.singleSimIndexToKey(selIndex); |
274 | + } |
275 | + } |
276 | + } |
277 | + |
278 | + Binding { |
279 | + target: sim1.connMan |
280 | + property: "powered" |
281 | + value: selector.selectedIndex !== 0 |
282 | + } |
283 | + |
284 | + Binding { |
285 | + target: sim1.radioSettings |
286 | + property: "technologyPreference" |
287 | + value: { |
288 | + var i = selector.selectedIndex; |
289 | + if (i === 1) { |
290 | + return 'gsm'; |
291 | + } else if (i === 2) { |
292 | + return 'any'; |
293 | + } else { |
294 | + return sim1.radioSettings.technologyPreference |
295 | + } |
296 | + } |
297 | + } |
298 | +} |
299 | |
300 | === added file 'plugins/cellular/Components/Sim.qml' |
301 | --- plugins/cellular/Components/Sim.qml 1970-01-01 00:00:00 +0000 |
302 | +++ plugins/cellular/Components/Sim.qml 2014-07-25 08:32:52 +0000 |
303 | @@ -0,0 +1,61 @@ |
304 | +/* |
305 | + * Copyright (C) 2014 Canonical Ltd |
306 | + * |
307 | + * This program is free software: you can redistribute it and/or modify |
308 | + * it under the terms of the GNU General Public License version 3 as |
309 | + * published by the Free Software Foundation. |
310 | + * |
311 | + * This program is distributed in the hope that it will be useful, |
312 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
313 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
314 | + * GNU General Public License for more details. |
315 | + * |
316 | + * You should have received a copy of the GNU General Public License |
317 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. |
318 | + * |
319 | + * Authors: |
320 | + * Jonas G. Drange <jonas.drange@canonical.com> |
321 | + * |
322 | +*/ |
323 | +import QtQuick 2.0 |
324 | +import MeeGo.QOfono 0.2 |
325 | + |
326 | +Item { |
327 | + property alias modem: modem |
328 | + property alias netReg: netReg |
329 | + property alias radioSettings: radioSettings |
330 | + property alias simMng: simMng |
331 | + property alias connMan: connMan |
332 | + |
333 | + property string name |
334 | + property string title: { |
335 | + var number = simMng.subscriberNumbers[0] || simMng.subscriberIdentity; |
336 | + return name + (number ? " (" + number + ")" : ""); |
337 | + } |
338 | + property string path |
339 | + |
340 | + OfonoModem { |
341 | + id: modem |
342 | + modemPath: path |
343 | + } |
344 | + |
345 | + OfonoNetworkRegistration { |
346 | + id: netReg |
347 | + modemPath: path |
348 | + } |
349 | + |
350 | + OfonoRadioSettings { |
351 | + id: radioSettings |
352 | + modemPath: path |
353 | + } |
354 | + |
355 | + OfonoSimManager { |
356 | + id: simMng |
357 | + modemPath: path |
358 | + } |
359 | + |
360 | + OfonoConnMan { |
361 | + id: connMan |
362 | + modemPath: path |
363 | + } |
364 | +} |
365 | |
366 | === renamed file 'plugins/cellular/rdosettings-helpers.js' => 'plugins/cellular/Components/data-helpers.js' |
367 | --- plugins/cellular/rdosettings-helpers.js 2014-07-10 10:24:20 +0000 |
368 | +++ plugins/cellular/Components/data-helpers.js 2014-07-25 08:32:52 +0000 |
369 | @@ -1,90 +1,22 @@ |
370 | - |
371 | -/* return index of key k using data in techPrefModel */ |
372 | -function keyToIndex (k) { |
373 | - console.warn('keyToIndex key:', k) |
374 | - for (var i=0; i < techPrefModel.count; i++) { |
375 | - if (indexToKey(i) === k) { |
376 | - return i; |
377 | - } |
378 | - } |
379 | - // we did not find a suitable ui item |
380 | - console.warn('keyToIndex did not find matching index for key', k); |
381 | - return -1; |
382 | -} |
383 | - |
384 | -/* return key of index i using data in techPrefModel */ |
385 | -function indexToKey (i) { |
386 | - return techPrefModel.get(i).key; |
387 | -} |
388 | - |
389 | -/* return currently selected key or null if none selected */ |
390 | -function getSelectedKey () { |
391 | - var i = techPrefSelector.selectedIndex; |
392 | - var model = techPrefModel.get(i); |
393 | - return model ? model.key : null; |
394 | -} |
395 | - |
396 | -/* return key or 'any' if key matches 'lte' or 'umts' |
397 | -The UI currently does not support umts/lte only |
398 | -*/ |
399 | -function normalizeKey (k) { |
400 | - if (k === 'lte' || k === 'umts') { |
401 | - console.warn("normalizeKey saw", k); |
402 | - return 'any'; |
403 | - } else { |
404 | - return k; |
405 | - } |
406 | -} |
407 | - |
408 | -/* handler for when RadioSettings TechnologyPreference changes */ |
409 | -function preferenceChanged (preference) { |
410 | - var i = techPrefSelector.selectedIndex; |
411 | - var rdoKey = rdoSettings.technologyPreference; |
412 | - var selKey = getSelectedKey(); |
413 | - |
414 | - // if preference changes, but the user has chosen one already, |
415 | - // make sure the user's setting is respected |
416 | - if (i > 0) { |
417 | - console.warn('Overriding RadioSettings TechnologyPreference signal', preference, 'with user selection', selKey); |
418 | - rdoSettings.technologyPreference = selKey; |
419 | - return; |
420 | - } |
421 | - |
422 | - // if the pref changes and the modem is on, |
423 | - // normlize and update the UI |
424 | - if (connMan.powered) { |
425 | - techPrefSelector.selectedIndex = keyToIndex(normalizeKey(rdoKey)); |
426 | - } else { |
427 | - // if the modem is off, |
428 | - // just normalize |
429 | - rdoSettings.technologyPreference = normalizeKey(rdoKey); |
430 | - } |
431 | - console.warn('Modem', connMan.powered ? 'online' : 'offline', 'TechnologyPreference', rdoKey); |
432 | -} |
433 | - |
434 | -/* handler for when ConnectionManager powered changes */ |
435 | -function poweredChanged (powered) { |
436 | - var rdoKey = rdoSettings.technologyPreference; |
437 | - if (powered) { |
438 | - if (rdoKey === '') { |
439 | - console.warn('Modem came online but TechnologyPreference is empty'); |
440 | - return; |
441 | - } else { |
442 | - console.warn('Modem came online, TechnologyPreference', rdoKey); |
443 | - techPrefSelector.selectedIndex = keyToIndex(normalizeKey(rdoKey)); |
444 | - } |
445 | - } else { |
446 | - console.warn('Modem went offline'); |
447 | - techPrefSelector.selectedIndex = 0; |
448 | - } |
449 | -} |
450 | - |
451 | -/* handler for when user clicks the TechnologyPreference item selector */ |
452 | -function delegateClicked (index) { |
453 | - console.warn('delegateClicked', index); |
454 | - // if the user selects a TechnologyPreference, update RadioSettings |
455 | - if (index > 0) { |
456 | - rdoSettings.technologyPreference = indexToKey(index); |
457 | - console.warn('delegateClicked setting TechnologyPreference to', indexToKey(index)); |
458 | - } |
459 | -} |
460 | +function singleSimKeyToIndex (k) { |
461 | + if (k === 'gsm') { |
462 | + return 1; |
463 | + } else if (k === 'any' || k === 'lte' || k === 'umts') { |
464 | + return 2; |
465 | + } else { |
466 | + return -1; |
467 | + } |
468 | +} |
469 | + |
470 | +function singleSimIndexToKey (i) { |
471 | + return i === 1 ? 'gsm' : 'any'; |
472 | +} |
473 | + |
474 | +function dualSimKeyToIndex (k) { |
475 | + if (k === 'gsm') { |
476 | + return 0; |
477 | + } else { |
478 | + return 1; |
479 | + } |
480 | +} |
481 | + |
482 | |
483 | === renamed file 'plugins/cellular/ChooseCarrier.qml' => 'plugins/cellular/PageChooseCarrier.qml' |
484 | --- plugins/cellular/ChooseCarrier.qml 2014-07-08 21:23:20 +0000 |
485 | +++ plugins/cellular/PageChooseCarrier.qml 2014-07-25 08:32:52 +0000 |
486 | @@ -25,7 +25,7 @@ |
487 | import MeeGo.QOfono 0.2 |
488 | |
489 | ItemPage { |
490 | - title: i18n.tr("Carrier") |
491 | + title: title |
492 | objectName: "chooseCarrierPage" |
493 | |
494 | property var netReg |
495 | @@ -39,7 +39,6 @@ |
496 | Connections { |
497 | target: netReg |
498 | onStatusChanged: { |
499 | - console.warn("onStatusChanged: " + netReg.status); |
500 | if (netReg.status === "registered") |
501 | buildLists(); |
502 | } |
503 | @@ -75,11 +74,9 @@ |
504 | id: netOp |
505 | OfonoNetworkOperator { |
506 | onRegisterComplete: { |
507 | - if (error === OfonoNetworkOperator.NoError) |
508 | - console.warn("registerComplete: SUCCESS"); |
509 | - else if (error === OfonoNetworkOperator.InProgressError) |
510 | + if (error === OfonoNetworkOperator.InProgressError) { |
511 | console.warn("registerComplete failed with error: " + errorString); |
512 | - else { |
513 | + } else if (error !== OfonoNetworkOperator.NoError) { |
514 | console.warn("registerComplete failed with error: " + errorString + " Falling back to default"); |
515 | netReg.registration(); |
516 | } |
517 | @@ -87,51 +84,72 @@ |
518 | } |
519 | } |
520 | |
521 | - ListItem.ItemSelector { |
522 | - id: carrierSelector |
523 | - objectName: "carrierSelector" |
524 | - expanded: true |
525 | - /* FIXME: This is disabled since it is currently a |
526 | - * read-only setting |
527 | - * enabled: cellularDataControl.checked |
528 | - */ |
529 | - enabled: true |
530 | - model: operatorNames |
531 | - onSelectedIndexChanged: { |
532 | - if ((selectedIndex !== curOp) && operators[selectedIndex]) { |
533 | - console.warn("onSelectedIndexChanged status: " + operators[selectedIndex].status); |
534 | - operators[selectedIndex].registerOperator(); |
535 | - } |
536 | - } |
537 | - } |
538 | - |
539 | - ListItem.SingleControl { |
540 | - anchors.bottom: parent.bottom |
541 | - control: Button { |
542 | - objectName: "refreshButton" |
543 | - width: parent.width - units.gu(4) |
544 | - text: i18n.tr("Refresh") |
545 | - enabled: (netReg.status !== "searching") && (netReg.status !== "denied") |
546 | - onTriggered: { |
547 | - scanning = true; |
548 | - netReg.scan(); |
549 | - } |
550 | - } |
551 | - } |
552 | - |
553 | - ActivityIndicator { |
554 | - id: activityIndicator |
555 | - anchors.centerIn: parent |
556 | - running: scanning |
557 | - } |
558 | - |
559 | - Label { |
560 | - anchors { |
561 | - top: activityIndicator.bottom |
562 | - topMargin: units.gu(2) |
563 | - horizontalCenter: activityIndicator.horizontalCenter |
564 | - } |
565 | - text: i18n.tr("Searching") |
566 | - visible: activityIndicator.running |
567 | + Flickable { |
568 | + anchors.fill: parent |
569 | + contentWidth: parent.width |
570 | + contentHeight: parent.height |
571 | + boundsBehavior: (contentHeight > parent.height) ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds |
572 | + |
573 | + Column { |
574 | + anchors.left: parent.left |
575 | + anchors.right: parent.right |
576 | + |
577 | + ListItem.ItemSelector { |
578 | + id: chooseCarrier |
579 | + objectName: "autoChooseCarrierSelector" |
580 | + expanded: true |
581 | + enabled: netReg.mode !== "auto-only" |
582 | + text: i18n.tr("Choose carrier:") |
583 | + model: [i18n.tr("Automatically"), i18n.tr("Manually")] |
584 | + selectedIndex: netReg.mode === "manual" ? 1 : 0 |
585 | + onSelectedIndexChanged: { |
586 | + if (selectedIndex === 0) |
587 | + netReg.registration(); |
588 | + } |
589 | + } |
590 | + |
591 | + ListItem.ItemSelector { |
592 | + id: carrierSelector |
593 | + objectName: "carrierSelector" |
594 | + expanded: enabled |
595 | + enabled: chooseCarrier.selectedIndex === 1 |
596 | + model: operatorNames |
597 | + onSelectedIndexChanged: { |
598 | + if ((selectedIndex !== curOp) && operators[selectedIndex]) { |
599 | + operators[selectedIndex].registerOperator(); |
600 | + } |
601 | + } |
602 | + } |
603 | + } |
604 | + |
605 | + ListItem.SingleControl { |
606 | + anchors.bottom: parent.bottom |
607 | + control: Button { |
608 | + objectName: "refreshButton" |
609 | + width: parent.width - units.gu(4) |
610 | + text: i18n.tr("Refresh") |
611 | + enabled: (netReg.status !== "searching") && (netReg.status !== "denied") |
612 | + onTriggered: { |
613 | + scanning = true; |
614 | + netReg.scan(); |
615 | + } |
616 | + } |
617 | + } |
618 | + |
619 | + ActivityIndicator { |
620 | + id: activityIndicator |
621 | + anchors.centerIn: parent |
622 | + running: scanning |
623 | + } |
624 | + |
625 | + Label { |
626 | + anchors { |
627 | + top: activityIndicator.bottom |
628 | + topMargin: units.gu(2) |
629 | + horizontalCenter: activityIndicator.horizontalCenter |
630 | + } |
631 | + text: i18n.tr("Searching") |
632 | + visible: activityIndicator.running |
633 | + } |
634 | } |
635 | } |
636 | |
637 | === added file 'plugins/cellular/PageChooseCarriers.qml' |
638 | --- plugins/cellular/PageChooseCarriers.qml 1970-01-01 00:00:00 +0000 |
639 | +++ plugins/cellular/PageChooseCarriers.qml 2014-07-25 08:32:52 +0000 |
640 | @@ -0,0 +1,77 @@ |
641 | +/* |
642 | + * Copyright (C) 2014 Canonical Ltd |
643 | + * |
644 | + * This program is free software: you can redistribute it and/or modify |
645 | + * it under the terms of the GNU General Public License version 3 as |
646 | + * published by the Free Software Foundation. |
647 | + * |
648 | + * This program is distributed in the hope that it will be useful, |
649 | + * but WITHOUT ANY WARRANTY; without even the implied warranty of |
650 | + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
651 | + * GNU General Public License for more details. |
652 | + * |
653 | + * You should have received a copy of the GNU General Public License |
654 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. |
655 | + * |
656 | + * Authors: |
657 | + * Jonas G. Drange <jonas.drange@canonical.com> |
658 | + * |
659 | +*/ |
660 | +import QtQuick 2.0 |
661 | +import SystemSettings 1.0 |
662 | +import Ubuntu.Components 0.1 |
663 | +import Ubuntu.Components.ListItems 0.1 as ListItem |
664 | +import MeeGo.QOfono 0.2 |
665 | + |
666 | +ItemPage { |
667 | + id: root |
668 | + title: i18n.tr("Carriers") |
669 | + objectName: "chooseCarriersPage" |
670 | + |
671 | + property var sim1 |
672 | + property var sim2 |
673 | + |
674 | + Flickable { |
675 | + anchors.fill: parent |
676 | + contentWidth: parent.width |
677 | + contentHeight: contentItem.childrenRect.height |
678 | + boundsBehavior: (contentHeight > root.height) ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds |
679 | + |
680 | + Column { |
681 | + anchors.left: parent.left |
682 | + anchors.right: parent.right |
683 | + |
684 | + ListItem.Standard { |
685 | + text: sim1.title |
686 | + } |
687 | + |
688 | + ListItem.SingleValue { |
689 | + objectName: "chooseCarrierSim1" |
690 | + value: sim1.netReg.name ? sim1.netReg.name : i18n.tr("N/A") |
691 | + progression: true |
692 | + onClicked: { |
693 | + pageStack.push(Qt.resolvedUrl("PageChooseCarrier.qml"), { |
694 | + netReg: sim1.netReg, |
695 | + title: sim1.title |
696 | + }) |
697 | + } |
698 | + } |
699 | + |
700 | + ListItem.Standard { |
701 | + text: sim2.title |
702 | + } |
703 | + |
704 | + ListItem.SingleValue { |
705 | + objectName: "chooseCarrierSim2" |
706 | + value: sim2.netReg.name ? sim2.netReg.name : i18n.tr("N/A") |
707 | + progression: true |
708 | + onClicked: { |
709 | + pageStack.push(Qt.resolvedUrl("PageChooseCarrier.qml"), { |
710 | + netReg: sim2.netReg, |
711 | + title: sim2.title |
712 | + }) |
713 | + } |
714 | + } |
715 | + } |
716 | + } |
717 | +} |
718 | |
719 | === modified file 'plugins/cellular/PageComponent.qml' |
720 | --- plugins/cellular/PageComponent.qml 2014-07-09 14:52:19 +0000 |
721 | +++ plugins/cellular/PageComponent.qml 2014-07-25 08:32:52 +0000 |
722 | @@ -24,18 +24,47 @@ |
723 | import Ubuntu.Components.ListItems 0.1 as ListItem |
724 | import MeeGo.QOfono 0.2 |
725 | import QMenuModel 0.1 |
726 | -import "rdosettings-helpers.js" as RSHelpers |
727 | +import "Components" |
728 | |
729 | ItemPage { |
730 | id: root |
731 | title: i18n.tr("Cellular") |
732 | objectName: "cellularPage" |
733 | |
734 | - OfonoRadioSettings { |
735 | - id: rdoSettings |
736 | - modemPath: manager.modems[0] |
737 | - onTechnologyPreferenceChanged: RSHelpers.preferenceChanged(preference); |
738 | - } |
739 | + // pointers to sim 1 and 2, lazy loaded |
740 | + property alias sim1: simOneLoader.item |
741 | + property alias sim2: simTwoLoader.item |
742 | + |
743 | + states: [ |
744 | + State { |
745 | + name: "singleSim" |
746 | + StateChangeScript { |
747 | + name: "loadSim" |
748 | + script: simOneLoader.setSource("Components/Sim.qml", { |
749 | + path: manager.modems[0], |
750 | + name: "SIM 1" |
751 | + }) |
752 | + } |
753 | + }, |
754 | + State { |
755 | + name: "dualSim" |
756 | + StateChangeScript { |
757 | + name: "loadSecondSim" |
758 | + script: { |
759 | + // the ordering is completely depending on manager |
760 | + // TODO: proper sim names (from gsettings?) |
761 | + simOneLoader.setSource("Components/Sim.qml", { |
762 | + path: manager.modems[0], |
763 | + name: "SIM 1" |
764 | + }); |
765 | + simTwoLoader.setSource("Components/Sim.qml", { |
766 | + path: manager.modems[1], |
767 | + name: "SIM 2" |
768 | + }); |
769 | + } |
770 | + } |
771 | + } |
772 | + ] |
773 | |
774 | QDBusActionGroup { |
775 | id: actionGroup |
776 | @@ -52,38 +81,39 @@ |
777 | |
778 | OfonoManager { |
779 | id: manager |
780 | - } |
781 | - |
782 | - OfonoSimManager { |
783 | - id: sim |
784 | - modemPath: manager.modems[0] |
785 | - } |
786 | - |
787 | - OfonoNetworkRegistration { |
788 | - id: netReg |
789 | - modemPath: manager.modems[0] |
790 | - onStatusChanged: { |
791 | - console.warn ("onStatusChanged: " + netReg.status); |
792 | - } |
793 | - onModeChanged: { |
794 | - console.warn ("onModeChanged: " + mode); |
795 | - if (mode === "manual") |
796 | - chooseCarrier.selectedIndex = 1; |
797 | - else |
798 | - chooseCarrier.selectedIndex = 0; |
799 | - } |
800 | - } |
801 | - |
802 | - OfonoConnMan { |
803 | - id: connMan |
804 | - modemPath: manager.modems[0] |
805 | - powered: techPrefSelector.selectedIndex !== 0 |
806 | - onPoweredChanged: RSHelpers.poweredChanged(powered); |
807 | - } |
808 | - |
809 | - OfonoModem { |
810 | - id: modem |
811 | - modemPath: manager.modems[0] |
812 | + Component.onCompleted: { |
813 | + console.warn('Manager complete with', modems.length, 'sims.'); |
814 | + if (modems.length === 1) { |
815 | + root.state = "singleSim"; |
816 | + } else if (modems.length === 2) { |
817 | + root.state = "dualSim"; |
818 | + } |
819 | + } |
820 | + } |
821 | + |
822 | + Loader { |
823 | + id: simOneLoader |
824 | + onLoaded: { |
825 | + if (parent.state === "singleSim") { |
826 | + cellData.setSource("Components/CellularSingleSim.qml", { |
827 | + sim1: sim1 |
828 | + }); |
829 | + } |
830 | + console.warn('sim1 loaded, loading CellularSingleSim.qml into cellData'); |
831 | + } |
832 | + } |
833 | + |
834 | + Loader { |
835 | + id: simTwoLoader |
836 | + onLoaded: { |
837 | + // unload any single sim setup |
838 | + cellData.source = ""; |
839 | + cellData.setSource("Components/CellularDualSim.qml", { |
840 | + sim1: sim1, |
841 | + sim2: sim2 |
842 | + }); |
843 | + console.warn('sim2 loaded, loading CellularDualSim.qml into cellData'); |
844 | + } |
845 | } |
846 | |
847 | Flickable { |
848 | @@ -96,53 +126,10 @@ |
849 | anchors.left: parent.left |
850 | anchors.right: parent.right |
851 | |
852 | - ListModel { |
853 | - id: techPrefModel |
854 | - ListElement { name: "Off"; key: "off" } |
855 | - ListElement { name: "2G only (saves battery)"; key: "gsm"; } |
856 | - ListElement { name: "2G/3G/4G (faster)"; key: "any"; } |
857 | - } |
858 | - |
859 | - Component { |
860 | - id: techPrefDelegate |
861 | - OptionSelectorDelegate { text: i18n.tr(name); } |
862 | - } |
863 | - |
864 | - ListItem.ItemSelector { |
865 | - id: techPrefSelector |
866 | - objectName: "technologyPreferenceSelector" |
867 | - expanded: true |
868 | - delegate: techPrefDelegate |
869 | - model: techPrefModel |
870 | - text: i18n.tr("Cellular data:") |
871 | - |
872 | - // technologyPreference "" is not valid, assume sim locked or data unavailable |
873 | - enabled: rdoSettings.technologyPreference !== "" |
874 | - selectedIndex: { |
875 | - var pref = rdoSettings.technologyPreference; |
876 | - // make nothing selected if the string from OfonoRadioSettings is empty |
877 | - if (pref === "") { |
878 | - console.warn("Disabling TechnologyPreference item selector due to empty TechnologyPreference"); |
879 | - return -1; |
880 | - } else { |
881 | - // normalizeKey turns "lte" and "umts" into "any" |
882 | - return RSHelpers.keyToIndex(RSHelpers.normalizeKey(pref)); |
883 | - } |
884 | - } |
885 | - onDelegateClicked: RSHelpers.delegateClicked(index) |
886 | - } |
887 | - |
888 | - ListItem.Standard { |
889 | - id: dataRoamingItem |
890 | - objectName: "dataRoamingSwitch" |
891 | - text: i18n.tr("Data roaming") |
892 | - // sensitive to data type, and disabled if "Off" is selected |
893 | - enabled: techPrefSelector.selectedIndex !== 0 |
894 | - control: Switch { |
895 | - id: dataRoamingControl |
896 | - checked: connMan.roamingAllowed |
897 | - onClicked: connMan.roamingAllowed = checked |
898 | - } |
899 | + Loader { |
900 | + id: cellData |
901 | + anchors.left: parent.left |
902 | + anchors.right: parent.right |
903 | } |
904 | |
905 | ListItem.SingleValue { |
906 | @@ -166,32 +153,33 @@ |
907 | visible: showAllUI |
908 | } |
909 | |
910 | - ListItem.ItemSelector { |
911 | + ListItem.SingleValue { |
912 | + text: i18n.tr("Carrier", "Carriers", manager.modems.length); |
913 | id: chooseCarrier |
914 | - objectName: "autoChooseCarrierSelector" |
915 | - expanded: true |
916 | - enabled: netReg.mode !== "auto-only" |
917 | - text: i18n.tr("Choose carrier:") |
918 | - model: [i18n.tr("Automatically"), i18n.tr("Manually")] |
919 | - selectedIndex: netReg.mode === "manual" ? 1 : 0 |
920 | - onSelectedIndexChanged: { |
921 | - if (selectedIndex === 0) |
922 | - netReg.registration(); |
923 | - } |
924 | - } |
925 | - |
926 | - ListItem.SingleValue { |
927 | - text: i18n.tr("Carrier") |
928 | objectName: "chooseCarrier" |
929 | - value: netReg.name ? netReg.name : i18n.tr("N/A") |
930 | - property bool enabled: chooseCarrier.selectedIndex === 1 // Manually |
931 | progression: enabled |
932 | onClicked: { |
933 | - if (enabled) |
934 | - pageStack.push(Qt.resolvedUrl("ChooseCarrier.qml"), {netReg: netReg}) |
935 | + if (root.state === 'singleSim') { |
936 | + pageStack.push(Qt.resolvedUrl("PageChooseCarrier.qml"), { |
937 | + netReg: sim1.netReg, |
938 | + title: i18n.tr("Carrier") |
939 | + }) |
940 | + } else if (root.state === 'dualSim') { |
941 | + pageStack.push(Qt.resolvedUrl("PageChooseCarriers.qml"), { |
942 | + sim1: sim1, |
943 | + sim2: sim2 |
944 | + }); |
945 | + } |
946 | } |
947 | } |
948 | |
949 | + Binding { |
950 | + target: chooseCarrier |
951 | + property: "value" |
952 | + value: sim1.netReg.name || i18n.tr("N/A") |
953 | + when: (simOneLoader.status === Loader.Ready) && root.state === "singleSim" |
954 | + } |
955 | + |
956 | ListItem.Standard { |
957 | text: i18n.tr("APN") |
958 | progression: true |
959 | |
960 | === modified file 'tests/autopilot/ubuntu_system_settings/tests/__init__.py' |
961 | --- tests/autopilot/ubuntu_system_settings/tests/__init__.py 2014-07-22 18:29:46 +0000 |
962 | +++ tests/autopilot/ubuntu_system_settings/tests/__init__.py 2014-07-25 08:32:52 +0000 |
963 | @@ -30,6 +30,8 @@ |
964 | MODEM_IFACE = 'org.ofono.Modem' |
965 | CONNMAN_IFACE = 'org.ofono.ConnectionManager' |
966 | RDO_IFACE = 'org.ofono.RadioSettings' |
967 | +SIM_IFACE = 'org.ofono.SimManager' |
968 | +NETREG_IFACE = 'org.ofono.NetworkRegistration' |
969 | |
970 | |
971 | class UbuntuSystemSettingsTestCase( |
972 | @@ -89,17 +91,34 @@ |
973 | |
974 | class UbuntuSystemSettingsOfonoTestCase(UbuntuSystemSettingsTestCase, |
975 | dbusmock.DBusTestCase): |
976 | - """ Class for cellular tests which sets up an Ofono mock """ |
977 | + """Class for cellular tests which sets up an Ofono mock """ |
978 | |
979 | - modem_powered = True |
980 | technology_preference = 'gsm' |
981 | - |
982 | - def mock_connection_manager(self): |
983 | - self.modem_0.AddProperty(CONNMAN_IFACE, 'Powered', |
984 | - self.modem_powered) |
985 | - self.modem_0.AddProperty(MODEM_IFACE, 'Serial', '1234567890') |
986 | - |
987 | - self.modem_0.AddMethods( |
988 | + use_sims = 1 |
989 | + |
990 | + @property |
991 | + def choose_carrier_page(self): |
992 | + """Return carrier selection page""" |
993 | + return self.system_settings.main_view.select_single( |
994 | + objectName='chooseCarrierPage' |
995 | + ) |
996 | + |
997 | + @property |
998 | + def choose_carriers_page(self): |
999 | + """Return carriers selection page""" |
1000 | + return self.system_settings.main_view.select_single( |
1001 | + objectName='chooseCarriersPage' |
1002 | + ) |
1003 | + |
1004 | + # TODO: remove this when it has been fixed in dbusmock |
1005 | + def get_all_operators(self, name): |
1006 | + return 'ret = [(m, objects[m].GetAll("org.ofono.NetworkOperator")) ' \ |
1007 | + 'for m in objects if "%s/operator/" in m]' % name |
1008 | + |
1009 | + def mock_connection_manager(self, modem): |
1010 | + modem.AddProperty(CONNMAN_IFACE, 'Powered', True) |
1011 | + modem.AddProperty(CONNMAN_IFACE, 'RoamingAllowed', False) |
1012 | + modem.AddMethods( |
1013 | CONNMAN_IFACE, |
1014 | [ |
1015 | ( |
1016 | @@ -112,9 +131,9 @@ |
1017 | [args[0], args[1]])'.replace("IFACE", CONNMAN_IFACE)), |
1018 | ]) |
1019 | |
1020 | - def mock_carriers(self): |
1021 | + def mock_carriers(self, name): |
1022 | self.dbusmock.AddObject( |
1023 | - '/ril_0/operator/op2', |
1024 | + '/%s/operator/op2' % name, |
1025 | 'org.ofono.NetworkOperator', |
1026 | { |
1027 | 'Name': 'my.cool.telco', |
1028 | @@ -131,7 +150,7 @@ |
1029 | ) |
1030 | # Add a forbidden carrier |
1031 | self.dbusmock.AddObject( |
1032 | - '/ril_0/operator/op3', |
1033 | + '/%s/operator/op3' % name, |
1034 | 'org.ofono.NetworkOperator', |
1035 | { |
1036 | 'Name': 'my.bad.telco', |
1037 | @@ -147,26 +166,85 @@ |
1038 | ] |
1039 | ) |
1040 | |
1041 | - def mock_radio_settings(self): |
1042 | - modem_interfaces = self.modem_0.GetProperties()['Interfaces'] |
1043 | + def mock_radio_settings(self, modem): |
1044 | + modem_interfaces = modem.GetProperties()['Interfaces'] |
1045 | modem_interfaces.append(RDO_IFACE) |
1046 | - self.modem_0.AddProperty( |
1047 | + modem.AddProperty( |
1048 | RDO_IFACE, 'TechnologyPreference', self.technology_preference) |
1049 | - self.modem_0.SetProperty('Interfaces', modem_interfaces) |
1050 | - self.modem_0.AddMethods( |
1051 | + modem.SetProperty('Interfaces', modem_interfaces) |
1052 | + modem.AddMethods( |
1053 | RDO_IFACE, |
1054 | - [ |
1055 | - ( |
1056 | - 'GetProperties', '', 'a{sv}', |
1057 | - 'ret = self.GetAll("%s")' |
1058 | - % RDO_IFACE), |
1059 | - ( |
1060 | - 'SetProperty', 'sv', '', |
1061 | - 'self.Set("IFACE", args[0], args[1]); ' |
1062 | - 'self.EmitSignal("IFACE",\ |
1063 | - "PropertyChanged", "sv", [args[0], args[1]])'.replace( |
1064 | - 'IFACE', RDO_IFACE)), |
1065 | - ]) |
1066 | + [('GetProperties', '', 'a{sv}', |
1067 | + 'ret = self.GetAll("%s")' % RDO_IFACE), |
1068 | + ('SetProperty', 'sv', '', |
1069 | + 'self.Set("IFACE", args[0], args[1]); ' |
1070 | + 'self.EmitSignal("IFACE",\ |
1071 | + "PropertyChanged", "sv", [args[0], args[1]])' |
1072 | + .replace('IFACE', RDO_IFACE)), ]) |
1073 | + |
1074 | + def mock_sim_manager(self, modem, properties=None): |
1075 | + if not properties: |
1076 | + properties = { |
1077 | + 'SubscriberNumbers': ['123456', '234567'] |
1078 | + } |
1079 | + modem_interfaces = modem.GetProperties()['Interfaces'] |
1080 | + modem_interfaces.append(SIM_IFACE) |
1081 | + modem.AddProperties(SIM_IFACE, properties) |
1082 | + modem.SetProperty('Interfaces', modem_interfaces) |
1083 | + modem.AddMethods( |
1084 | + SIM_IFACE, |
1085 | + [('GetProperties', '', 'a{sv}', |
1086 | + 'ret = self.GetAll("%s")' % SIM_IFACE), |
1087 | + ('SetProperty', 'sv', '', |
1088 | + 'self.Set("IFACE", args[0], args[1]); ' |
1089 | + 'self.EmitSignal("IFACE",\ |
1090 | + "PropertyChanged", "sv", [args[0], args[1]])' |
1091 | + .replace('IFACE', SIM_IFACE)), ]) |
1092 | + |
1093 | + def add_sim1(self): |
1094 | + # create modem_0 proxy |
1095 | + self.modem_0 = self.dbus_con.get_object('org.ofono', '/ril_0') |
1096 | + |
1097 | + # Add an available carrier |
1098 | + self.mock_carriers('ril_0') |
1099 | + |
1100 | + self.mock_radio_settings(self.modem_0) |
1101 | + |
1102 | + self.mock_connection_manager(self.modem_0) |
1103 | + |
1104 | + self.mock_sim_manager(self.modem_0) |
1105 | + |
1106 | + self.modem_0.AddMethods('org.ofono.NetworkRegistration', [ |
1107 | + ('GetProperties', '', 'a{sv}', |
1108 | + 'ret = self.GetAll("org.ofono.NetworkRegistration")'), |
1109 | + ('Register', '', '', ''), |
1110 | + ('GetOperators', '', 'a(oa{sv})', self.get_all_operators('ril_0')), |
1111 | + ('Scan', '', 'a(oa{sv})', self.get_all_operators('ril_0')), |
1112 | + ]) |
1113 | + |
1114 | + def add_sim2(self): |
1115 | + '''Mock two modems/sims for the dual sim story''' |
1116 | + second_modem = 'ril_1' |
1117 | + |
1118 | + self.dbusmock.AddModem(second_modem, {'Powered': True}) |
1119 | + self.modem_1 = self.dbus_con.get_object( |
1120 | + 'org.ofono', '/%s' % second_modem) |
1121 | + self.modem_1.AddMethods(NETREG_IFACE, [ |
1122 | + ('GetProperties', '', 'a{sv}', |
1123 | + 'ret = self.GetAll("org.ofono.NetworkRegistration")'), |
1124 | + ('Register', '', '', ''), |
1125 | + ('GetOperators', '', 'a(oa{sv})', |
1126 | + self.get_all_operators(second_modem)), |
1127 | + ('Scan', '', 'a(oa{sv})', |
1128 | + self.get_all_operators(second_modem)), |
1129 | + ]) |
1130 | + self.mock_carriers(second_modem) |
1131 | + self.mock_radio_settings(self.modem_1) |
1132 | + self.mock_connection_manager(self.modem_1) |
1133 | + |
1134 | + self.mock_sim_manager(self.modem_1, { |
1135 | + 'SubscriberNumbers': ['08123', '938762783'] |
1136 | + }) |
1137 | |
1138 | @classmethod |
1139 | def setUpClass(cls): |
1140 | @@ -180,15 +258,9 @@ |
1141 | def setUp(self, panel=None): |
1142 | self.obj_ofono.Reset() |
1143 | |
1144 | - # create modem_0 proxy |
1145 | - self.modem_0 = self.dbus_con.get_object('org.ofono', '/ril_0') |
1146 | - |
1147 | - # Add an available carrier |
1148 | - self.mock_carriers() |
1149 | - |
1150 | - self.mock_radio_settings() |
1151 | - |
1152 | - self.mock_connection_manager() |
1153 | + self.add_sim1() |
1154 | + if self.use_sims == 2: |
1155 | + self.add_sim2() |
1156 | |
1157 | super(UbuntuSystemSettingsOfonoTestCase, self).setUp(panel) |
1158 | |
1159 | |
1160 | === modified file 'tests/autopilot/ubuntu_system_settings/tests/test_cellular.py' |
1161 | --- tests/autopilot/ubuntu_system_settings/tests/test_cellular.py 2014-07-18 13:07:32 +0000 |
1162 | +++ tests/autopilot/ubuntu_system_settings/tests/test_cellular.py 2014-07-25 08:32:52 +0000 |
1163 | @@ -9,7 +9,9 @@ |
1164 | from time import sleep |
1165 | |
1166 | from autopilot.introspection.dbus import StateNotFoundError |
1167 | +from autopilot.matchers import Eventually |
1168 | from testtools.matchers import Equals, NotEquals, raises |
1169 | +from unittest import skip |
1170 | |
1171 | from ubuntu_system_settings.tests import ( |
1172 | CellularBaseTestCase, CONNMAN_IFACE, RDO_IFACE) |
1173 | @@ -21,6 +23,9 @@ |
1174 | PREFERENCE_2G = '2G only (saves battery)' |
1175 | PREFERENCE_ANY = '2G/3G/4G (faster)' |
1176 | PREFERENCE_OFF = 'Off' |
1177 | +LABEL_SIM_1 = 'SIM 1 (08123)' |
1178 | +LABEL_SIM_2 = 'SIM 2 (123456)' |
1179 | +LABEL_OFF = 'Off' |
1180 | |
1181 | |
1182 | class CellularTestCase(CellularBaseTestCase): |
1183 | @@ -51,10 +56,16 @@ |
1184 | """Helper method asserting that the selected data technology preference |
1185 | is that of index""" |
1186 | self.assertThat(self.data_preference_selector.selectedIndex, |
1187 | - Equals(index)) |
1188 | + Eventually(Equals(index))) |
1189 | + |
1190 | + def navigate_to_carrier_page(self): |
1191 | + selector = self.system_settings.main_view.cellular_page.select_single( |
1192 | + objectName="chooseCarrier" |
1193 | + ) |
1194 | + self.system_settings.main_view.scroll_to_and_click(selector) |
1195 | |
1196 | def navigate_to_manual(self): |
1197 | - selector = self.system_settings.main_view.cellular_page.select_single( |
1198 | + selector = self.choose_carrier_page.select_single( |
1199 | toolkit_emulators.ItemSelector, |
1200 | objectName="autoChooseCarrierSelector" |
1201 | ) |
1202 | @@ -82,6 +93,7 @@ |
1203 | |
1204 | def test_current_network(self): |
1205 | """ Tests whether the current network is visible and selected """ |
1206 | + self.navigate_to_carrier_page() |
1207 | self.navigate_to_manual() |
1208 | carriers = self.system_settings.main_view.choose_page.select_single( |
1209 | toolkit_emulators.ItemSelector, |
1210 | @@ -95,6 +107,7 @@ |
1211 | |
1212 | def test_alt_network(self): |
1213 | """ Tests whether an alternative available network is displayed """ |
1214 | + self.navigate_to_carrier_page() |
1215 | self.navigate_to_manual() |
1216 | carriers = self.system_settings.main_view.choose_page.select_single( |
1217 | toolkit_emulators.ItemSelector, |
1218 | @@ -105,6 +118,7 @@ |
1219 | |
1220 | def test_no_forbidden_network(self): |
1221 | """ Ensures that a forbidden network is not shown """ |
1222 | + self.navigate_to_carrier_page() |
1223 | self.navigate_to_manual() |
1224 | carriers = self.system_settings.main_view.choose_page.select_single( |
1225 | toolkit_emulators.ItemSelector, |
1226 | @@ -115,53 +129,62 @@ |
1227 | raises(StateNotFoundError) |
1228 | ) |
1229 | |
1230 | - def test_set_modem_offline(self): |
1231 | + def test_set_sim_offline(self): |
1232 | self.select_preference(PREFERENCE_OFF) |
1233 | |
1234 | - sleep(1) |
1235 | + sleep(0.7) |
1236 | |
1237 | self.assertEqual(False, self.modem_0.Get(CONNMAN_IFACE, 'Powered')) |
1238 | |
1239 | - def test_set_modem_online(self): |
1240 | + def test_set_sim_online(self): |
1241 | self.select_preference(PREFERENCE_OFF) |
1242 | - sleep(1) |
1243 | + sleep(0.7) |
1244 | self.assertEqual(False, self.modem_0.Get(CONNMAN_IFACE, 'Powered')) |
1245 | |
1246 | self.select_preference(PREFERENCE_ANY) |
1247 | - sleep(1) |
1248 | + sleep(0.7) |
1249 | self.assertEqual(True, self.modem_0.Get(CONNMAN_IFACE, 'Powered')) |
1250 | |
1251 | - def test_modem_online_status_toggles_data_roaming_switch(self): |
1252 | + def test_roaming_switch(self): |
1253 | """Test that switching off cellular data disables roaming switch""" |
1254 | roaming_switch = self.system_settings.main_view.select_single( |
1255 | - '*', objectName="dataRoamingSwitch" |
1256 | + objectName="dataRoamingSwitch" |
1257 | ) |
1258 | - |
1259 | # select 2G only |
1260 | self.select_preference(PREFERENCE_2G) |
1261 | + |
1262 | # assert that roaming_switch is enabled |
1263 | - self.assertTrue(roaming_switch.get_properties()['enabled']) |
1264 | + self.assertThat( |
1265 | + roaming_switch.get_properties()['enabled'], |
1266 | + Eventually(Equals(True))) |
1267 | |
1268 | # click off |
1269 | self.select_preference(PREFERENCE_OFF) |
1270 | # assert roaming_switch is disabled |
1271 | - self.assertFalse(roaming_switch.get_properties()['enabled']) |
1272 | - |
1273 | - def test_data_preference_change_is_reflected_by_dbus(self): |
1274 | + self.assertThat( |
1275 | + roaming_switch.get_properties()['enabled'], |
1276 | + Eventually(Equals(False))) |
1277 | + |
1278 | + def test_allow_roaming(self): |
1279 | + roaming_switch = self.system_settings.main_view.select_single( |
1280 | + objectName="dataRoamingSwitch" |
1281 | + ) |
1282 | + self.system_settings.main_view.scroll_to_and_click(roaming_switch) |
1283 | + sleep(2) |
1284 | + self.assertEqual( |
1285 | + True, self.modem_0.Get(CONNMAN_IFACE, 'RoamingAllowed')) |
1286 | + |
1287 | + def test_change_data_preference(self): |
1288 | self.select_preference(PREFERENCE_2G) |
1289 | - |
1290 | - sleep(1) |
1291 | + sleep(0.7) |
1292 | self.assertEqual('gsm', self.modem_0.Get(RDO_IFACE, |
1293 | 'TechnologyPreference')) |
1294 | - |
1295 | self.select_preference(PREFERENCE_ANY) |
1296 | - |
1297 | - sleep(1) |
1298 | - |
1299 | + sleep(0.7) |
1300 | self.assertEqual('any', self.modem_0.Get(RDO_IFACE, |
1301 | 'TechnologyPreference')) |
1302 | |
1303 | - def test_modem_online_status_insensitive_to_radio_preference(self): |
1304 | + def test_sim_online_status_insensitive_to_radio_preference(self): |
1305 | # turn off cellular data |
1306 | self.select_preference(PREFERENCE_OFF) |
1307 | |
1308 | @@ -172,17 +195,14 @@ |
1309 | 'sv', |
1310 | ['TechnologyPreference', dbus.String('any', variant_level=1)]) |
1311 | |
1312 | - # TODO: use 'eventually' instead |
1313 | - sleep(1) |
1314 | - |
1315 | # assert that "Off" has not changed |
1316 | self.assert_selected_preference(0) |
1317 | |
1318 | - def test_ui_reacts_to_modem_set_coming_online(self): |
1319 | + def test_ui_reacts_to_sim_set_coming_online(self): |
1320 | self.select_preference(PREFERENCE_2G) |
1321 | self.select_preference(PREFERENCE_OFF) |
1322 | |
1323 | - sleep(1) |
1324 | + sleep(0.7) |
1325 | |
1326 | self.modem_0.EmitSignal( |
1327 | CONNMAN_IFACE, |
1328 | @@ -190,8 +210,6 @@ |
1329 | 'sv', |
1330 | ['Powered', 'true']) |
1331 | |
1332 | - sleep(1) |
1333 | - |
1334 | # assert that 2G is selected |
1335 | self.assert_selected_preference(1) |
1336 | |
1337 | @@ -204,15 +222,13 @@ |
1338 | 'sv', |
1339 | ['TechnologyPreference', dbus.String('lte', variant_level=1)]) |
1340 | |
1341 | - sleep(1) |
1342 | - |
1343 | self.assertEqual('gsm', self.modem_0.Get(RDO_IFACE, |
1344 | 'TechnologyPreference')) |
1345 | |
1346 | # assert that the preference is any |
1347 | self.assert_selected_preference(1) |
1348 | |
1349 | - def test_ui_if_sim_was_unlocked_on_opening(self): |
1350 | + def test_unlocking_sim(self): |
1351 | '''Like it would if the sim was locked, e.g.''' |
1352 | self.modem_0.Set(RDO_IFACE, 'TechnologyPreference', |
1353 | dbus.String('', variant_level=1)) |
1354 | @@ -232,6 +248,256 @@ |
1355 | 'sv', |
1356 | ['TechnologyPreference', dbus.String('lte', variant_level=1)]) |
1357 | |
1358 | - sleep(1) |
1359 | - |
1360 | self.assert_selected_preference(2) |
1361 | + |
1362 | + |
1363 | +class DualSimCellularTestCase(CellularBaseTestCase): |
1364 | + |
1365 | + use_sims = 2 |
1366 | + |
1367 | + def navigate_to_carriers_page(self): |
1368 | + selector = self.system_settings.main_view.cellular_page.select_single( |
1369 | + objectName="chooseCarrier" |
1370 | + ) |
1371 | + self.system_settings.main_view.scroll_to_and_click(selector) |
1372 | + |
1373 | + def navigate_to_carrier_page_for_sim(self, n): |
1374 | + selector = self.choose_carriers_page.select_single( |
1375 | + objectName="chooseCarrierSim%d" % n |
1376 | + ) |
1377 | + self.system_settings.main_view.scroll_to_and_click(selector) |
1378 | + |
1379 | + def navigate_to_manual(self): |
1380 | + selector = self.choose_carrier_page.select_single( |
1381 | + toolkit_emulators.ItemSelector, |
1382 | + objectName="autoChooseCarrierSelector" |
1383 | + ) |
1384 | + manual = selector.select_single('Label', text=_("Manually")) |
1385 | + self.system_settings.main_view.scroll_to_and_click(manual) |
1386 | + choosecarrier = self.system_settings.main_view.cellular_page.\ |
1387 | + select_single(objectName="chooseCarrier") |
1388 | + self.system_settings.main_view.scroll_to_and_click(choosecarrier) |
1389 | + self.assertThat( |
1390 | + self.system_settings.main_view.choose_page.title, |
1391 | + Equals(_("Carrier")) |
1392 | + ) |
1393 | + |
1394 | + @property |
1395 | + def data_preference_selector(self): |
1396 | + """Return data_preference_selector""" |
1397 | + try: |
1398 | + self._pref_selector.get_properties() |
1399 | + except: |
1400 | + self._pref_selector = \ |
1401 | + self.system_settings.main_view.cellular_page.select_single( |
1402 | + toolkit_emulators.ItemSelector, |
1403 | + objectName="technologyPreferenceSelector" |
1404 | + ) |
1405 | + return self._pref_selector |
1406 | + |
1407 | + def select_preference(self, label): |
1408 | + """Helper method that clicks a preference |
1409 | + that matches provided label""" |
1410 | + pref = self.data_preference_selector.select_single('Label', text=label) |
1411 | + self.system_settings.main_view.scroll_to_and_click(pref) |
1412 | + |
1413 | + def assert_selected_preference(self, index): |
1414 | + """Helper method asserting that the selected |
1415 | + data technology preference is that of index""" |
1416 | + self.assertThat( |
1417 | + self.data_preference_selector.selectedIndex, |
1418 | + Eventually(Equals(index))) |
1419 | + |
1420 | + def use_selector(self, label): |
1421 | + obj = self.system_settings.main_view.cellular_page.select_single( |
1422 | + objectName="use" |
1423 | + ).select_single('Label', text=label) |
1424 | + self.system_settings.main_view.scroll_to_and_click(obj) |
1425 | + |
1426 | + def assert_used(self, index): |
1427 | + obj = self.system_settings.main_view.cellular_page.select_single( |
1428 | + objectName="use" |
1429 | + ) |
1430 | + self.assertThat( |
1431 | + obj.selectedIndex, Eventually(Equals(index))) |
1432 | + |
1433 | + def test_use_sim_1(self): |
1434 | + self.use_selector(LABEL_OFF) |
1435 | + self.use_selector(LABEL_SIM_1) |
1436 | + sleep(0.7) |
1437 | + self.assertEqual(True, self.modem_1.Get(CONNMAN_IFACE, 'Powered')) |
1438 | + self.assertEqual(False, self.modem_0.Get(CONNMAN_IFACE, 'Powered')) |
1439 | + |
1440 | + def test_use_sim_2(self): |
1441 | + self.use_selector(LABEL_OFF) |
1442 | + self.use_selector(LABEL_SIM_2) |
1443 | + sleep(0.7) |
1444 | + self.assertEqual(True, self.modem_0.Get(CONNMAN_IFACE, 'Powered')) |
1445 | + self.assertEqual(False, self.modem_1.Get(CONNMAN_IFACE, 'Powered')) |
1446 | + |
1447 | + def test_turn_off_both_sims(self): |
1448 | + self.use_selector(LABEL_OFF) |
1449 | + sleep(0.7) |
1450 | + self.assertEqual(False, self.modem_0.Get(CONNMAN_IFACE, 'Powered')) |
1451 | + self.assertEqual(False, self.modem_1.Get(CONNMAN_IFACE, 'Powered')) |
1452 | + |
1453 | + def test_use_gsm_for_sim_1(self): |
1454 | + self.use_selector(LABEL_SIM_1) |
1455 | + self.select_preference(PREFERENCE_2G) |
1456 | + sleep(0.7) |
1457 | + self.assertEqual( |
1458 | + 'gsm', self.modem_1.Get(RDO_IFACE, 'TechnologyPreference')) |
1459 | + |
1460 | + def test_use_any_for_sim_1(self): |
1461 | + self.use_selector(LABEL_SIM_1) |
1462 | + self.select_preference(PREFERENCE_ANY) |
1463 | + sleep(0.7) |
1464 | + self.assertEqual( |
1465 | + 'any', self.modem_1.Get(RDO_IFACE, 'TechnologyPreference')) |
1466 | + |
1467 | + def test_use_gsm_for_sim_2(self): |
1468 | + self.use_selector(LABEL_SIM_1) |
1469 | + self.select_preference(PREFERENCE_2G) |
1470 | + sleep(0.7) |
1471 | + self.assertEqual( |
1472 | + 'gsm', self.modem_1.Get(RDO_IFACE, 'TechnologyPreference')) |
1473 | + |
1474 | + def test_use_any_for_sim_2(self): |
1475 | + self.use_selector(LABEL_SIM_1) |
1476 | + self.select_preference(PREFERENCE_ANY) |
1477 | + sleep(1) |
1478 | + self.assertEqual( |
1479 | + 'any', self.modem_1.Get(RDO_IFACE, 'TechnologyPreference')) |
1480 | + |
1481 | + def test_when_sim_1_comes_online_ui_is_correct(self): |
1482 | + self.use_selector(LABEL_SIM_1) |
1483 | + self.select_preference(PREFERENCE_ANY) |
1484 | + self.use_selector(LABEL_OFF) |
1485 | + sleep(0.7) |
1486 | + self.modem_1.Set(CONNMAN_IFACE, 'Powered', True) |
1487 | + self.modem_1.EmitSignal( |
1488 | + CONNMAN_IFACE, |
1489 | + 'PropertyChanged', |
1490 | + 'sv', |
1491 | + ['Powered', 'true']) |
1492 | + |
1493 | + self.assertEqual( |
1494 | + 'any', self.modem_1.Get(RDO_IFACE, 'TechnologyPreference')) |
1495 | + self.assert_used(1) |
1496 | + self.assert_selected_preference(1) |
1497 | + |
1498 | + def test_when_sim_2_comes_online_ui_is_correct(self): |
1499 | + self.use_selector(LABEL_SIM_2) |
1500 | + self.select_preference(PREFERENCE_ANY) |
1501 | + self.use_selector(LABEL_OFF) |
1502 | + sleep(0.7) |
1503 | + self.modem_0.Set(CONNMAN_IFACE, 'Powered', True) |
1504 | + self.modem_0.EmitSignal( |
1505 | + CONNMAN_IFACE, |
1506 | + 'PropertyChanged', |
1507 | + 'sv', |
1508 | + ['Powered', 'true']) |
1509 | + |
1510 | + self.assertEqual( |
1511 | + 'any', self.modem_0.Get(RDO_IFACE, 'TechnologyPreference')) |
1512 | + self.assert_used(2) |
1513 | + self.assert_selected_preference(1) |
1514 | + |
1515 | + def test_both_sims_comes_online(self): |
1516 | + self.use_selector(LABEL_OFF) |
1517 | + sleep(2) |
1518 | + self.modem_0.Set(CONNMAN_IFACE, 'Powered', True) |
1519 | + self.modem_0.EmitSignal( |
1520 | + CONNMAN_IFACE, |
1521 | + 'PropertyChanged', |
1522 | + 'sv', |
1523 | + ['Powered', 'true']) |
1524 | + |
1525 | + self.modem_1.Set(CONNMAN_IFACE, 'Powered', True) |
1526 | + self.modem_1.EmitSignal( |
1527 | + CONNMAN_IFACE, |
1528 | + 'PropertyChanged', |
1529 | + 'sv', |
1530 | + ['Powered', 'true']) |
1531 | + self.assert_used(1) |
1532 | + self.assert_selected_preference(0) |
1533 | + |
1534 | + def test_roaming_switch(self): |
1535 | + roaming_switch = self.system_settings.main_view.select_single( |
1536 | + objectName="dataRoamingSwitch" |
1537 | + ) |
1538 | + # assert that roaming_switch is enabled |
1539 | + self.assertTrue(roaming_switch.get_properties()['enabled']) |
1540 | + |
1541 | + # click off |
1542 | + self.use_selector(LABEL_OFF) |
1543 | + |
1544 | + # assert roaming_switch is disabled |
1545 | + self.assertThat( |
1546 | + roaming_switch.get_properties()['enabled'], |
1547 | + Eventually(Equals(False))) |
1548 | + |
1549 | + def test_allow_roaming(self): |
1550 | + self.use_selector(LABEL_SIM_1) |
1551 | + self.assertEqual( |
1552 | + False, self.modem_1.Get(CONNMAN_IFACE, 'RoamingAllowed')) |
1553 | + roaming_switch = self.system_settings.main_view.select_single( |
1554 | + objectName="dataRoamingSwitch" |
1555 | + ) |
1556 | + self.system_settings.main_view.scroll_to_and_click(roaming_switch) |
1557 | + sleep(2) |
1558 | + self.assertEqual( |
1559 | + True, self.modem_1.Get(CONNMAN_IFACE, 'RoamingAllowed')) |
1560 | + |
1561 | + def test_no_radio_preference(self): |
1562 | + self.select_preference(PREFERENCE_ANY) |
1563 | + self.use_selector(LABEL_OFF) |
1564 | + |
1565 | + self.modem_1.Set(RDO_IFACE, 'TechnologyPreference', '') |
1566 | + self.modem_1.EmitSignal( |
1567 | + CONNMAN_IFACE, |
1568 | + 'PropertyChanged', |
1569 | + 'sv', |
1570 | + ['TechnologyPreference', '']) |
1571 | + |
1572 | + self.assertThat( |
1573 | + self.data_preference_selector.get_properties()['enabled'], |
1574 | + Eventually(Equals(False))) |
1575 | + |
1576 | + def test_radio_preference_changes(self): |
1577 | + self.use_selector(LABEL_SIM_1) |
1578 | + |
1579 | + self.modem_1.Set(RDO_IFACE, 'TechnologyPreference', 'any') |
1580 | + self.modem_1.EmitSignal( |
1581 | + RDO_IFACE, |
1582 | + 'PropertyChanged', |
1583 | + 'sv', |
1584 | + ['TechnologyPreference', 'any']) |
1585 | + |
1586 | + self.assert_selected_preference(1) |
1587 | + |
1588 | + # see |
1589 | + # https://gitorious.org/python-dbusmock/python-dbusmock/merge_requests/3 |
1590 | + @skip('skipped due to bug in dbusmock') |
1591 | + def test_change_op_sim_1(self): |
1592 | + self.navigate_to_carriers_page() |
1593 | + self.navigate_to_carrier_page_for_sim(1) |
1594 | + carriers = self.system_settings.main_view.choose_page.select_single( |
1595 | + toolkit_emulators.ItemSelector, |
1596 | + objectName="carrierSelector" |
1597 | + ) |
1598 | + manual = carriers.select_single('Label', text="my.cool.telco") |
1599 | + self.assertThat(manual, NotEquals(None)) |
1600 | + |
1601 | + # see |
1602 | + # https://gitorious.org/python-dbusmock/python-dbusmock/merge_requests/3 |
1603 | + @skip('skipped due to bug in dbusmock') |
1604 | + def test_change_op_sim_2(self): |
1605 | + self.navigate_to_carriers_page() |
1606 | + self.navigate_to_carrier_page_for_sim(2) |
1607 | + carriers = self.system_settings.main_view.choose_page.select_single( |
1608 | + toolkit_emulators.ItemSelector, |
1609 | + objectName="carrierSelector" |
1610 | + ) |
1611 | + manual = carriers.select_single('Label', text="my.cool.telco") |
1612 | + self.assertThat(manual, NotEquals(None)) |
FAILED: Continuous integration, rev:786 jenkins. qa.ubuntu. com/job/ ubuntu- system- settings- ci/1039/ jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- utopic- touch/2364 jenkins. qa.ubuntu. com/job/ generic- mediumtests- utopic/ 1936 jenkins. qa.ubuntu. com/job/ ubuntu- system- settings- utopic- amd64-ci/ 231/console jenkins. qa.ubuntu. com/job/ ubuntu- system- settings- utopic- armhf-ci/ 231 jenkins. qa.ubuntu. com/job/ ubuntu- system- settings- utopic- armhf-ci/ 231/artifact/ work/output/ *zip*/output. zip jenkins. qa.ubuntu. com/job/ ubuntu- system- settings- utopic- i386-ci/ 231 jenkins. qa.ubuntu. com/job/ generic- deb-autopilot- runner- mako/2543 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- utopic- armhf/3583 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- utopic- armhf/3583/ artifact/ work/output/ *zip*/output. zip s-jenkins. ubuntu- ci:8080/ job/touch- flash-device/ 10272 jenkins. qa.ubuntu. com/job/ autopilot- testrunner- otto-utopic/ 1623 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- utopic- amd64/2181 jenkins. qa.ubuntu. com/job/ generic- mediumtests- builder- utopic- amd64/2181/ artifact/ work/output/ *zip*/output. zip
http://
Executed test runs:
UNSTABLE: http://
SUCCESS: http://
FAILURE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
UNSTABLE: http://
SUCCESS: http://
deb: http://
SUCCESS: http://
SUCCESS: http://
SUCCESS: http://
deb: http://
Click here to trigger a rebuild: s-jenkins. ubuntu- ci:8080/ job/ubuntu- system- settings- ci/1039/ rebuild
http://