Merge lp:~ken-vandine/ubuntu-system-settings/rtm-1378812 into lp:ubuntu-system-settings/rtm-14.09

Proposed by Ken VanDine
Status: Merged
Approved by: Ken VanDine
Approved revision: 940
Merged at revision: 948
Proposed branch: lp:~ken-vandine/ubuntu-system-settings/rtm-1378812
Merge into: lp:ubuntu-system-settings/rtm-14.09
Diff against target: 1909 lines (+582/-884)
15 files modified
plugins/cellular/Components/CMakeLists.txt (+5/-5)
plugins/cellular/Components/CellularSingleSim.qml (+0/-117)
plugins/cellular/Components/DataMultiSim.qml (+8/-119)
plugins/cellular/Components/MultiSim.qml (+52/-10)
plugins/cellular/Components/NoSim.qml (+5/-12)
plugins/cellular/Components/RadioSingleSim.qml (+57/-0)
plugins/cellular/Components/SimEditor.qml (+31/-14)
plugins/cellular/Components/SingleSim.qml (+34/-4)
plugins/cellular/PageChooseCarrier.qml (+3/-2)
plugins/cellular/PageChooseCarriers.qml (+2/-2)
plugins/cellular/PageComponent.qml (+2/-2)
plugins/cellular/sims.js (+10/-0)
tests/autopilot/ubuntu_system_settings/__init__.py (+164/-1)
tests/autopilot/ubuntu_system_settings/tests/__init__.py (+7/-3)
tests/autopilot/ubuntu_system_settings/tests/test_cellular.py (+202/-593)
To merge this branch: bzr merge lp:~ken-vandine/ubuntu-system-settings/rtm-1378812
Reviewer Review Type Date Requested Status
Jonas G. Drange (community) Approve
Review via email: mp+242124@code.launchpad.net

Commit message

[cellular] split "Cellular Data" and "Connection type" into two separate pieces in the UI for both single and multi SIM

Description of the change

[cellular] split "Cellular Data" and "Connection type" into two separate pieces in the UI for both single and multi SIM

To post a comment you must log in.
Revision history for this message
Jonas G. Drange (jonas-drange) wrote :

WFM, thanks!

Ran through test plan as well as functional testing on desktop.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'plugins/cellular/Components/CMakeLists.txt'
2--- plugins/cellular/Components/CMakeLists.txt 2014-08-29 14:32:28 +0000
3+++ plugins/cellular/Components/CMakeLists.txt 2014-11-18 20:15:26 +0000
4@@ -1,12 +1,12 @@
5 set(QML_SOURCES
6+ DataMultiSim.qml
7+ DefaultSim.qml
8+ MultiSim.qml
9 NoSim.qml
10- SingleSim.qml
11- MultiSim.qml
12- CellularSingleSim.qml
13- CellularMultiSim.qml
14- DefaultSim.qml
15+ RadioSingleSim.qml
16 Sim.qml
17 SimEditor.qml
18+ SingleSim.qml
19 )
20 install(FILES ${QML_SOURCES} DESTINATION ${PLUGIN_QML_DIR}/cellular/Components)
21
22
23=== removed file 'plugins/cellular/Components/CellularSingleSim.qml'
24--- plugins/cellular/Components/CellularSingleSim.qml 2014-11-12 16:17:17 +0000
25+++ plugins/cellular/Components/CellularSingleSim.qml 1970-01-01 00:00:00 +0000
26@@ -1,117 +0,0 @@
27-/*
28- * Copyright (C) 2014 Canonical Ltd
29- *
30- * This program is free software: you can redistribute it and/or modify
31- * it under the terms of the GNU General Public License version 3 as
32- * published by the Free Software Foundation.
33- *
34- * This program is distributed in the hope that it will be useful,
35- * but WITHOUT ANY WARRANTY; without even the implied warranty of
36- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
37- * GNU General Public License for more details.
38- *
39- * You should have received a copy of the GNU General Public License
40- * along with this program. If not, see <http://www.gnu.org/licenses/>.
41- *
42- * Authors:
43- * Jonas G. Drange <jonas.drange@canonical.com>
44- *
45-*/
46-import QtQuick 2.0
47-import Ubuntu.Components 0.1
48-import Ubuntu.Components.ListItems 0.1 as ListItem
49-
50-Column {
51- height: childrenRect.height
52-
53- property var selector: selector
54-
55- ListItem.ItemSelector {
56- id: selector
57- objectName: "technologyPreferenceSelector"
58- text: i18n.tr("Cellular data:")
59- expanded: true
60-
61- // an empty string is not a valid preference, which means
62- // we disregard the interace and disable the selector
63- enabled: sim.radioSettings.technologyPreference !== ""
64-
65- // model for this selector is modemTechnologies, with
66- // 'off' prepended
67- model: {
68- var m = sim.radioSettings.modemTechnologies.slice(0);
69- m.unshift("off");
70- return m;
71- }
72-
73- delegate: OptionSelectorDelegate {
74- text: {
75- return {
76- 'off': i18n.tr("Off"),
77- 'gsm': i18n.tr("2G only (saves battery)"),
78- 'umts': i18n.tr("2G/3G (faster)"),
79- 'lte': i18n.tr("2G/3G/4G (faster)")
80- }[modelData]
81- }
82- }
83- selectedIndex: {
84- if (sim.connMan.powered) {
85- // will return -1 if empty, which will select nothing.
86- // Makes sense, since the SIM is online, but the
87- // radioSettings interface is not ready yet (sim locked?)
88- return model.indexOf(sim.radioSettings.technologyPreference);
89- } else {
90- return 0;
91- }
92- }
93- }
94-
95- ListItem.Standard {
96- id: dataRoamingItem
97- objectName: "dataRoamingSwitch"
98- text: i18n.tr("Data roaming")
99- enabled: sim.connMan.powered
100- control: Switch {
101- id: dataRoamingControl
102- property bool serverChecked: sim.connMan.roamingAllowed
103- onServerCheckedChanged: checked = serverChecked
104- Component.onCompleted: checked = serverChecked
105- onTriggered: sim.connMan.roamingAllowed = checked
106- }
107- }
108-
109- Connections {
110- target: sim.connMan
111- onPoweredChanged: {
112- if (powered) {
113- // restore the tech preference
114- selector.selectedIndex = selector
115- .model.indexOf(sim.radioSettings.technologyPreference)
116- } else {
117- selector.selectedIndex = 0;
118- }
119- }
120- }
121-
122- // binds the SIM online state to the UI
123- Binding {
124- target: sim.connMan
125- property: "powered"
126- value: selector.selectedIndex !== 0
127- }
128-
129- // binds the tech preference to the UI
130- Binding {
131- target: sim.radioSettings
132- property: "technologyPreference"
133- value: {
134- var i = selector.selectedIndex;
135- if (i > 0) {
136- return selector.model[i]
137- } else {
138- // if the modem is off, disregard the selector
139- return sim.radioSettings.technologyPreference;
140- }
141- }
142- }
143-}
144
145=== renamed file 'plugins/cellular/Components/CellularMultiSim.qml' => 'plugins/cellular/Components/DataMultiSim.qml'
146--- plugins/cellular/Components/CellularMultiSim.qml 2014-11-12 16:17:17 +0000
147+++ plugins/cellular/Components/DataMultiSim.qml 2014-11-18 20:15:26 +0000
148@@ -22,8 +22,6 @@
149 import Ubuntu.Components.ListItems 0.1 as ListItem
150
151 Column {
152- id: root
153- property var selector: selector
154
155 function getNameFromIndex (index) {
156 if (index === 0) {
157@@ -33,49 +31,11 @@
158 }
159 }
160
161- function getOnlineSim () {
162- if (state === "sim1Online") {
163- return sims[0];
164- } else if (state === "sim2Online") {
165- return sims[1];
166- } else {
167- return null;
168- }
169- }
170-
171 height: childrenRect.height
172
173- states: [
174- State {
175- name: "sim1Online"
176- when: sims[0].connMan.powered && !sims[1].connMan.powered
177- StateChangeScript { script: {
178- selector.selectedIndex =
179- selector.model.indexOf(
180- sims[0].radioSettings.technologyPreference)
181- }}
182- },
183- State {
184- name: "sim2Online"
185- when: sims[1].connMan.powered && !sims[0].connMan.powered
186- StateChangeScript { script: {
187- selector.selectedIndex =
188- selector.model.indexOf(
189- sims[1].radioSettings.technologyPreference)
190- }}
191- },
192- State {
193- name: "bothOnline"
194- when: sims[0].connMan.powered && sims[1].connMan.powered
195- StateChangeScript { script: {
196- sims[1].connMan.powered = false;
197- }}
198- }
199- ]
200-
201 ListItem.ItemSelector {
202 id: use
203- objectName: "use"
204+ objectName: "data"
205 text: i18n.tr("Cellular data:")
206 expanded: true
207 model: {
208@@ -92,6 +52,7 @@
209 }
210 selectedIndex: [true, sims[0].connMan.powered, sims[1].connMan.powered]
211 .lastIndexOf(true)
212+
213 onDelegateClicked: {
214 // power all sims on or off
215 sims.forEach(function (sim) {
216@@ -100,95 +61,23 @@
217 }
218 }
219
220- Connections {
221- target: sims[0].connMan
222- onPoweredChanged: {
223- if (powered) {
224- use.selectedIndex = 1;
225- }
226- }
227- }
228-
229- Connections {
230- target: sims[1].connMan
231- onPoweredChanged: {
232- if (powered) {
233- use.selectedIndex = 2;
234- }
235- }
236- }
237-
238- ListItem.ItemSelector {
239- id: selector
240- objectName: "technologyPreferenceSelector"
241- expanded: true
242- model: {
243- var sim = getOnlineSim();
244- if (sim) {
245- return sim.radioSettings.modemTechnologies;
246- } else {
247- return [];
248- }
249- }
250- delegate: OptionSelectorDelegate {
251- text: {
252- return {
253- 'gsm': i18n.tr("2G only (saves battery)"),
254- 'umts': i18n.tr("2G/3G (faster)"),
255- 'lte': i18n.tr("2G/3G/4G (faster)")
256- }[modelData]
257- }
258- }
259- visible: use.selectedIndex !== 0
260- onDelegateClicked: {
261- var sim = getOnlineSim();
262- if (sim) {
263- sim.radioSettings.technologyPreference = model[index];
264- }
265- }
266- }
267-
268- Binding {
269- target: selector
270- property: "enabled"
271- value: getOnlineSim() &&
272- (getOnlineSim().radioSettings.technologyPreference !== "")
273- when: getOnlineSim()
274- }
275-
276- Connections {
277- target: sims[0].radioSettings
278- onTechnologyPreferenceChanged: {
279- if (sims[0].connMan.powered) {
280- selector.selectedIndex = selector.model.indexOf(preference);
281- }
282- }
283- }
284-
285- Connections {
286- target: sims[1].radioSettings
287- onTechnologyPreferenceChanged: {
288- if (sims[1].connMan.powered) {
289- selector.selectedIndex = selector.model.indexOf(preference);
290- }
291- }
292- }
293-
294 ListItem.Standard {
295 id: dataRoamingItem
296- objectName: "dataRoamingSwitch"
297 text: i18n.tr("Data roaming")
298 enabled: use.selectedIndex !== 0
299 control: Switch {
300 id: dataRoamingControl
301- property bool serverChecked: getOnlineSim() && getOnlineSim().connMan.roamingAllowed
302+ objectName: "roaming"
303+
304+ property bool serverChecked: poweredSim && poweredSim.connMan.roamingAllowed
305 onServerCheckedChanged: checked = serverChecked
306 Component.onCompleted: checked = serverChecked
307 onTriggered: {
308- if (getOnlineSim()) {
309- getOnlineSim().connMan.roamingAllowed = checked;
310+ if (poweredSim) {
311+ poweredSim.connMan.roamingAllowed = checked;
312 }
313 }
314 }
315+ showDivider: false
316 }
317 }
318
319=== modified file 'plugins/cellular/Components/MultiSim.qml'
320--- plugins/cellular/Components/MultiSim.qml 2014-10-06 19:38:06 +0000
321+++ plugins/cellular/Components/MultiSim.qml 2014-11-18 20:15:26 +0000
322@@ -23,21 +23,26 @@
323 import Ubuntu.Components.ListItems 0.1 as ListItem
324
325 Column {
326-
327 objectName: "multiSim"
328
329 property var sims
330+ property var poweredSim: {
331+ var s = null;
332+ sims.forEach(function (sim) {
333+ if (sim.connMan.powered === true) {
334+ s = sim;
335+ }
336+ });
337+ return s;
338+ }
339 property var modems
340-
341 // make settings available to all children of root
342 property var settings: phoneSettings
343
344- CellularMultiSim {
345- anchors { left: parent.left; right: parent.right }
346+ DataMultiSim {
347+ anchors { left: parent.left; right: parent.right }
348 }
349
350- ListItem.Divider {}
351-
352 ListItem.SingleValue {
353 text : i18n.tr("Hotspot disabled because Wi-Fi is off.")
354 visible: showAllUI && !hotspotItem.visible
355@@ -60,15 +65,14 @@
356 visible: showAllUI
357 }
358
359- ListItem.Divider {
360- visible: hotspotItem.visible || dataUsage.visible
361- }
362+ ListItem.Divider {}
363
364 ListItem.SingleValue {
365 text: i18n.tr("Carriers")
366 id: chooseCarrier
367- objectName: "chooseCarrier"
368+ objectName: "carriers"
369 progression: enabled
370+ showDivider: false
371 onClicked: {
372 pageStack.push(Qt.resolvedUrl("../PageChooseCarriers.qml"), {
373 sims: sims
374@@ -88,6 +92,44 @@
375 anchors { left: parent.left; right: parent.right }
376 }
377
378+ ListItem.Divider {}
379+
380+ function techToString (tech) {
381+ return {
382+ 'gsm': i18n.tr("2G only (saves battery)"),
383+ 'umts': i18n.tr("2G/3G (faster)"),
384+ 'lte': i18n.tr("2G/3G/4G (faster)")
385+ }[tech]
386+ }
387+
388+ ListItem.ItemSelector {
389+ id: radio
390+ expanded: true
391+ text: i18n.tr("Connection type:")
392+ model: poweredSim ? poweredSim.radioSettings.modemTechnologies : []
393+ delegate: OptionSelectorDelegate {
394+ objectName: poweredSim.path + "_radio_" + modelData
395+ text: techToString(modelData)
396+ }
397+ enabled: poweredSim ?
398+ (poweredSim.radioSettings.technologyPreference !== "") : false
399+ visible: poweredSim
400+ selectedIndex: poweredSim ?
401+ model.indexOf(poweredSim.radioSettings.technologyPreference) : -1
402+ onDelegateClicked: {
403+ poweredSim.radioSettings.technologyPreference = model[index];
404+ }
405+ }
406+
407+ Connections {
408+ target: poweredSim ? poweredSim.radioSettings : null
409+ onTechnologyPreferenceChanged: {
410+ radio.selectedIndex =
411+ poweredSim.radioSettings.modemTechnologies.indexOf(preference)
412+ }
413+ ignoreUnknownSignals: true
414+ }
415+
416 GSettings {
417 id: phoneSettings
418 schema.id: "com.ubuntu.phone"
419
420=== modified file 'plugins/cellular/Components/NoSim.qml'
421--- plugins/cellular/Components/NoSim.qml 2014-08-19 10:58:01 +0000
422+++ plugins/cellular/Components/NoSim.qml 2014-11-18 20:15:26 +0000
423@@ -25,27 +25,20 @@
424
425 objectName: "noSim"
426
427- ListItem.ItemSelector {
428+ ListItem.Standard {
429 text: i18n.tr("Cellular data:")
430- expanded: true
431 enabled: false
432- model: [i18n.tr("Off"), i18n.tr("2G only (saves battery)"), i18n.tr("2G/3G/4G (faster)")]
433- selectedIndex: -1
434+ control: Switch {
435+ checked: false
436+ }
437 }
438
439 ListItem.Standard {
440 text: i18n.tr("Data roaming")
441 enabled: false
442+ showDivider: false
443 control: Switch {
444 checked: false
445 }
446 }
447-
448- ListItem.Divider {}
449-
450- ListItem.SingleValue {
451- text: i18n.tr("Carrier");
452- value: i18n.tr("N/A")
453- enabled: false
454- }
455 }
456
457=== added file 'plugins/cellular/Components/RadioSingleSim.qml'
458--- plugins/cellular/Components/RadioSingleSim.qml 1970-01-01 00:00:00 +0000
459+++ plugins/cellular/Components/RadioSingleSim.qml 2014-11-18 20:15:26 +0000
460@@ -0,0 +1,57 @@
461+/*
462+ * Copyright (C) 2014 Canonical Ltd
463+ *
464+ * This program is free software: you can redistribute it and/or modify
465+ * it under the terms of the GNU General Public License version 3 as
466+ * published by the Free Software Foundation.
467+ *
468+ * This program is distributed in the hope that it will be useful,
469+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
470+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
471+ * GNU General Public License for more details.
472+ *
473+ * You should have received a copy of the GNU General Public License
474+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
475+ *
476+ * Authors:
477+ * Jonas G. Drange <jonas.drange@canonical.com>
478+ *
479+*/
480+import QtQuick 2.0
481+import Ubuntu.Components 0.1
482+import Ubuntu.Components.ListItems 0.1 as ListItem
483+
484+Column {
485+ height: childrenRect.height
486+
487+ property alias selector: selector
488+
489+ ListItem.ItemSelector {
490+ id: selector
491+ text: i18n.tr("Connection type:")
492+ showDivider: false
493+ expanded: true
494+
495+ // an empty string is not a valid preference, which means
496+ // we disregard the interace and disable the selector
497+ enabled: sim.radioSettings.technologyPreference !== ""
498+ model: sim.radioSettings.modemTechnologies
499+
500+ delegate: OptionSelectorDelegate {
501+ objectName: sim.path + "_radio_" + modelData
502+ text: {
503+ return {
504+ 'gsm': i18n.tr("2G only (saves battery)"),
505+ 'umts': i18n.tr("2G/3G (faster)"),
506+ 'lte': i18n.tr("2G/3G/4G (faster)")
507+ }[modelData]
508+ }
509+ showDivider: false
510+ }
511+ selectedIndex: model.indexOf(sim.radioSettings.technologyPreference)
512+ onDelegateClicked: {
513+ sim.radioSettings.technologyPreference = model[index];
514+ }
515+ }
516+
517+}
518
519=== modified file 'plugins/cellular/Components/SimEditor.qml'
520--- plugins/cellular/Components/SimEditor.qml 2014-08-20 13:48:58 +0000
521+++ plugins/cellular/Components/SimEditor.qml 2014-11-18 20:15:26 +0000
522@@ -22,15 +22,9 @@
523 import Ubuntu.Components.ListItems 0.1 as ListItem
524
525 Column {
526-
527 id: simList
528 objectName: "simEditor"
529
530- anchors {
531- left: parent.left
532- right: parent.right
533- }
534-
535 states: [
536 State {
537 name: "editing"
538@@ -73,7 +67,25 @@
539 }
540 ]
541
542+ NumberAnimation {
543+ id: scrollerAnimation
544+ duration: UbuntuAnimation.SnapDuration
545+ easing: UbuntuAnimation.StandardEasing
546+ target: root.flickable
547+ property: "contentY"
548+ }
549+
550+ function openedEditor () {
551+ var flickable = scrollerAnimation.target;
552+ var maxFlick = Math.max(0, flickable.contentHeight - root.height);
553+ scrollerAnimation.from = flickable.contentY;
554+ scrollerAnimation.to = Math.min(y, maxFlick) - units.gu(9); // header
555+ scrollerAnimation.start();
556+ nameField.forceActiveFocus();
557+ }
558+
559 ListItem.Standard {
560+ id: std
561 text: i18n.tr("Edit SIM Name")
562 }
563
564@@ -83,12 +95,14 @@
565 right: parent.right
566 }
567 height: expandedItem ?
568- childrenRect.height + editor.height : childrenRect.height
569+ expandedItem.expandedHeight : childrenRect.height
570+
571+ boundsBehavior: Flickable.StopAtBounds
572
573 ListItem.Expandable {
574 id: sim1Exp
575 expandedHeight: sim1Col.height
576- objectName: "editSim1"
577+ objectName: "edit_name_" + sims[0].path
578 Column {
579 id: sim1Col
580 anchors {
581@@ -102,7 +116,7 @@
582 }
583 height: sim1Exp.collapsedHeight
584 Label {
585- objectName: "simLabel1"
586+ objectName: "label_" + sims[0].path
587 anchors {
588 left: parent.left
589 right: parent.right
590@@ -117,14 +131,15 @@
591 }
592 onClicked: {
593 simList.state = "editingSim1";
594- nameField.forceActiveFocus();
595+ simList.openedEditor();
596 }
597 }
598
599 ListItem.Expandable {
600 id: sim2Exp
601 expandedHeight: sim2Col.height
602- objectName: "editSim2"
603+ objectName: "edit_name_" + sims[1].path
604+ showDivider: false
605 Column {
606 id: sim2Col
607 anchors {
608@@ -138,7 +153,7 @@
609 }
610 height: sim2Exp.collapsedHeight
611 Label {
612- objectName: "simLabel2"
613+ objectName: "label_" + sims[1].path
614 anchors {
615 left: parent.left
616 right: parent.right
617@@ -153,7 +168,7 @@
618 }
619 onClicked: {
620 simList.state = "editingSim2";
621- nameField.forceActiveFocus();
622+ simList.openedEditor();
623 }
624 }
625 }
626@@ -182,6 +197,8 @@
627
628 spacing: units.gu(2)
629
630+ height: cancel.height + rename.height
631+
632 Button {
633 id: cancel
634 objectName: "cancelRename"
635@@ -204,7 +221,7 @@
636 }
637
638 Item {
639- height: units.gu(1)
640+ height: units.gu(2)
641 width: parent.width
642 }
643
644
645=== modified file 'plugins/cellular/Components/SingleSim.qml'
646--- plugins/cellular/Components/SingleSim.qml 2014-10-02 09:50:11 +0000
647+++ plugins/cellular/Components/SingleSim.qml 2014-11-18 20:15:26 +0000
648@@ -27,11 +27,29 @@
649
650 property var sim
651
652- CellularSingleSim {
653- anchors { left: parent.left; right: parent.right }
654+ ListItem.Standard {
655+ id: selector
656+ text: i18n.tr("Cellular data:")
657+ control: Switch {
658+ id: dataControl
659+ objectName: 'data'
660+ checked: sim.connMan.powered
661+ onClicked: sim.connMan.powered = checked
662+ }
663 }
664
665- ListItem.Divider {}
666+ ListItem.Standard {
667+ id: dataRoamingItem
668+ text: i18n.tr("Data roaming")
669+ enabled: sim.connMan.powered
670+ showDivider: false
671+ control: Switch {
672+ id: dataRoamingControl
673+ objectName: "roaming"
674+ checked: sim.connMan.roamingAllowed
675+ onClicked: sim.connMan.roamingAllowed = checked
676+ }
677+ }
678
679 ListItem.SingleValue {
680 text : i18n.tr("Hotspot disabled because Wi-Fi is off.")
681@@ -54,10 +72,22 @@
682 visible: showAllUI
683 }
684
685+ ListItem.Divider {
686+ visible: radio.selector.model.length
687+ }
688+
689+ RadioSingleSim {
690+ id: radio
691+ anchors { left: parent.left; right: parent.right }
692+ visible: radio.selector.model.length
693+ }
694+
695+ ListItem.Divider {}
696+
697 ListItem.SingleValue {
698 text: i18n.tr("Carrier");
699 id: chooseCarrier
700- objectName: "chooseCarrier"
701+ objectName: "carrier"
702 progression: enabled
703 value: sim.netReg.name || i18n.tr("N/A")
704 enabled: sim.netReg.status !== ""
705
706=== modified file 'plugins/cellular/PageChooseCarrier.qml'
707--- plugins/cellular/PageChooseCarrier.qml 2014-10-06 12:56:18 +0000
708+++ plugins/cellular/PageChooseCarrier.qml 2014-11-18 20:15:26 +0000
709@@ -149,7 +149,7 @@
710
711 ListItem.ItemSelector {
712 id: chooseCarrier
713- objectName: "autoChooseCarrierSelector"
714+ objectName: "mode"
715 expanded: true
716 enabled: sim.netReg.mode !== "auto-only"
717 text: i18n.tr("Choose carrier:")
718@@ -171,6 +171,7 @@
719 }
720 }
721 }
722+
723 ListItem.SingleControl {
724 enabled: chooseCarrier.selectedIndex === 1
725 anchors {
726@@ -198,7 +199,7 @@
727 }
728 ListItem.ItemSelector {
729 id: carrierSelector
730- objectName: "carrierSelector"
731+ objectName: "carriers"
732 expanded: true
733 enabled: sim.netReg.status !== "searching" && chooseCarrier.selectedIndex === 1
734 // work around ItemSelector not having a visual change depending on being disabled
735
736=== modified file 'plugins/cellular/PageChooseCarriers.qml'
737--- plugins/cellular/PageChooseCarriers.qml 2014-10-06 19:38:06 +0000
738+++ plugins/cellular/PageChooseCarriers.qml 2014-11-18 20:15:26 +0000
739@@ -44,7 +44,7 @@
740 }
741
742 ListItem.SingleValue {
743- objectName: "chooseCarrierSim1"
744+ objectName: sims[0].path + "_carriers"
745 value: sims[0].netReg.name ? sims[0].netReg.name : i18n.tr("N/A")
746 enabled: sims[0].netReg.status !== ""
747 progression: true
748@@ -61,7 +61,7 @@
749 }
750
751 ListItem.SingleValue {
752- objectName: "chooseCarrierSim2"
753+ objectName: sims[1].path + "_carriers"
754 value: sims[1].netReg.name ? sims[1].netReg.name : i18n.tr("N/A")
755 enabled: sims[1].netReg.status !== ""
756 progression: true
757
758=== modified file 'plugins/cellular/PageComponent.qml'
759--- plugins/cellular/PageComponent.qml 2014-10-17 14:57:17 +0000
760+++ plugins/cellular/PageComponent.qml 2014-11-18 20:15:26 +0000
761@@ -94,15 +94,15 @@
762 start()
763 }
764 }
765+
766 Flickable {
767+ id: flick
768 anchors.fill: parent
769 contentWidth: parent.width
770 contentHeight: contentItem.childrenRect.height
771 boundsBehavior: (contentHeight > root.height) ? Flickable.DragAndOvershootBounds : Flickable.StopAtBounds
772-
773 Column {
774 anchors { left: parent.left; right: parent.right }
775-
776 Loader {
777 id: loader
778 anchors { left: parent.left; right: parent.right }
779
780=== modified file 'plugins/cellular/sims.js'
781--- plugins/cellular/sims.js 2014-10-03 14:08:08 +0000
782+++ plugins/cellular/sims.js 2014-11-18 20:15:26 +0000
783@@ -17,6 +17,16 @@
784 return getPresent()[0];
785 }
786
787+function getFirstOnline () {
788+ var online = null;
789+ getPresent().forEach(function (sim) {
790+ if (sim.connMan.powered === true) {
791+ online = sim;
792+ }
793+ });
794+ return online;
795+}
796+
797 function getCount () {
798 return getAll().length;
799 }
800
801=== modified file 'tests/autopilot/ubuntu_system_settings/__init__.py'
802--- tests/autopilot/ubuntu_system_settings/__init__.py 2014-09-26 12:52:31 +0000
803+++ tests/autopilot/ubuntu_system_settings/__init__.py 2014-11-18 20:15:26 +0000
804@@ -1,3 +1,4 @@
805+
806 # -*- Mode: Python; coding: utf-8; indent-tabs-mode: nil; tab-width: 4 -*-
807 #
808 # Copyright (C) 2014 Canonical Ltd.
809@@ -114,6 +115,10 @@
810 def go_to_wifi_page(self):
811 return self._go_to_page('entryComponent-wifi', 'wifiPage')
812
813+ @autopilot.logging.log_action(logger.debug)
814+ def go_to_cellular_page(self):
815+ return self._go_to_page('entryComponent-cellular', 'cellularPage')
816+
817 def _go_to_page(self, item_object_name, page_object_name):
818 self.click_item(item_object_name)
819 page = self.wait_select_single(objectName=page_object_name)
820@@ -202,7 +207,7 @@
821 self._orientation_lock_switch.uncheck()
822
823
824-class CelullarPage(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
825+class CellularPage(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
826
827 """Autopilot helper for the Sound page."""
828
829@@ -214,6 +219,164 @@
830 return True
831 return False
832
833+ @autopilot.logging.log_action(logger.debug)
834+ def enable_data(self):
835+ self._set_data(True)
836+
837+ @autopilot.logging.log_action(logger.debug)
838+ def disable_data(self):
839+ self._set_data(False)
840+
841+ def disable_datas(self):
842+ self.select_sim_for_data('off')
843+
844+ @autopilot.logging.log_action(logger.debug)
845+ def _set_data(self, data):
846+ chk = self.select_single(objectName='data')
847+ if data:
848+ chk.check()
849+ else:
850+ chk.uncheck()
851+
852+ @autopilot.logging.log_action(logger.debug)
853+ def get_data(self):
854+ return self.select_single(objectName='data').checked
855+
856+ @autopilot.logging.log_action(logger.debug)
857+ def enable_roaming(self, timeout=10):
858+ self._set_roaming(True, timeout=timeout)
859+
860+ @autopilot.logging.log_action(logger.debug)
861+ def disable_roaming(self, timeout=10):
862+ self._set_roaming(False, timeout=timeout)
863+
864+ @autopilot.logging.log_action(logger.debug)
865+ def _set_roaming(self, roaming, timeout):
866+ chk = self.select_single(objectName='roaming')
867+ if roaming:
868+ chk.check(timeout=timeout)
869+ else:
870+ chk.uncheck(timeout=timeout)
871+
872+ @autopilot.logging.log_action(logger.debug)
873+ def set_connection_type(self, radio_type, sim='/ril_0',
874+ scroll_to_and_click=None):
875+ self._set_connection_type(radio_type, sim, scroll_to_and_click)
876+
877+ @autopilot.logging.log_action(logger.debug)
878+ def _set_connection_type(self, radio_type, sim, scroll_to_and_click):
879+ t = self.wait_select_single(
880+ 'OptionSelectorDelegate',
881+ objectName='%s_radio_%s' % (sim, radio_type))
882+ if scroll_to_and_click:
883+ scroll_to_and_click(t)
884+ else:
885+ t.swipe_into_view()
886+
887+ self.pointing_device.click_object(t)
888+
889+ @autopilot.logging.log_action(logger.debug)
890+ def change_carrier(self, carrier, sim=None):
891+ if sim:
892+ carriersPage = self._click_carriers()
893+ carrierPage = carriersPage.select_sim(sim)
894+ else:
895+ carrierPage = self._click_carrier()
896+
897+ carrierPage.set_manual()
898+ carrierPage.set_carrier(carrier)
899+
900+ @autopilot.logging.log_action(logger.debug)
901+ def _click_carrier(self):
902+ item = self.select_single(objectName='carrier')
903+ self.pointing_device.click_object(item)
904+ return self.get_root_instance().wait_select_single(
905+ objectName='chooseCarrierPage')
906+
907+ @autopilot.logging.log_action(logger.debug)
908+ def _click_carriers(self):
909+ item = self.select_single(objectName='carriers')
910+ self.pointing_device.click_object(item)
911+ return self.get_root_instance().wait_select_single(
912+ objectName='chooseCarriersPage')
913+
914+ @autopilot.logging.log_action(logger.debug)
915+ def select_sim_for_data(self, sim):
916+ self._select_sim_for_data(sim)
917+
918+ @autopilot.logging.log_action(logger.debug)
919+ def _select_sim_for_data(self, sim):
920+ item = self.select_single(objectName='use%s' % sim)
921+ self.pointing_device.click_object(item)
922+
923+ @autopilot.logging.log_action(logger.debug)
924+ def select_sim_for_calls(self, sim):
925+ pass
926+
927+ @autopilot.logging.log_action(logger.debug)
928+ def select_sim_for_messages(self):
929+ pass
930+
931+ @autopilot.logging.log_action(logger.debug)
932+ def set_name(self, sim, name):
933+ self._set_name(sim, name)
934+
935+ def get_name(self, sim):
936+ obj = self.select_single(
937+ objectName="label_%s" % sim)
938+ return obj.text
939+
940+ def _set_name(self, sim, name):
941+ obj = self.select_single(
942+ objectName="edit_name_%s" % sim)
943+ self.pointing_device.click_object(obj)
944+
945+ # wait for animation
946+ sleep(1)
947+ ok = self.select_single('Button', objectName="doRename")
948+
949+ field = self.select_single('TextField', objectName="nameField")
950+ field.write(name)
951+ self.pointing_device.click_object(ok)
952+
953+
954+class PageChooseCarriers(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
955+
956+ """Autopilot helper for carrier selection page (multisim)."""
957+
958+ @autopilot.logging.log_action(logger.debug)
959+ def select_sim(self, sim):
960+ return self._select_sim(sim)
961+
962+ @autopilot.logging.log_action(logger.debug)
963+ def _select_sim(self, sim):
964+ item = self.select_single(objectName='%s_carriers' % sim)
965+ self.pointing_device.click_object(item)
966+ return self.get_root_instance().wait_select_single(
967+ objectName='chooseCarrierPage')
968+
969+
970+class PageChooseCarrier(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
971+
972+ """Autopilot helper for carrier selection page (singlesim)."""
973+
974+ @autopilot.logging.log_action(logger.debug)
975+ def set_manual(self):
976+ item = self.select_single(text='Manually')
977+ self.pointing_device.click_object(item)
978+
979+ @autopilot.logging.log_action(logger.debug)
980+ def set_automatic(self):
981+ item = self.select_single(text='Automatically')
982+ self.pointing_device.click_object(item)
983+
984+ def set_carrier(self, carrier):
985+ # wait for animation, since page.animationRunning.wait_for(False)
986+ # does not work?
987+ sleep(0.5)
988+ item = self.select_single(text=carrier)
989+ self.pointing_device.click_object(item)
990+
991
992 class TimeAndDatePage(ubuntuuitoolkit.UbuntuUIToolkitCustomProxyObjectBase):
993
994
995=== modified file 'tests/autopilot/ubuntu_system_settings/tests/__init__.py'
996--- tests/autopilot/ubuntu_system_settings/tests/__init__.py 2014-10-22 21:34:08 +0000
997+++ tests/autopilot/ubuntu_system_settings/tests/__init__.py 2014-11-18 20:15:26 +0000
998@@ -33,6 +33,7 @@
999 RDO_IFACE = 'org.ofono.RadioSettings'
1000 SIM_IFACE = 'org.ofono.SimManager'
1001 NETREG_IFACE = 'org.ofono.NetworkRegistration'
1002+NETOP_IFACE = 'org.ofono.NetworkOperator'
1003 CALL_FWD_IFACE = 'org.ofono.CallForwarding'
1004 CALL_SETTINGS_IFACE = 'org.ofono.CallSettings'
1005 SYSTEM_IFACE = 'com.canonical.SystemImage'
1006@@ -150,7 +151,7 @@
1007 def mock_carriers(self, name):
1008 self.dbusmock.AddObject(
1009 '/%s/operator/op2' % name,
1010- 'org.ofono.NetworkOperator',
1011+ NETOP_IFACE,
1012 {
1013 'Name': 'my.cool.telco',
1014 'Status': 'available',
1015@@ -167,7 +168,7 @@
1016 # Add a forbidden carrier
1017 self.dbusmock.AddObject(
1018 '/%s/operator/op3' % name,
1019- 'org.ofono.NetworkOperator',
1020+ NETOP_IFACE,
1021 {
1022 'Name': 'my.bad.telco',
1023 'Status': 'forbidden',
1024@@ -311,9 +312,12 @@
1025
1026
1027 class CellularBaseTestCase(UbuntuSystemSettingsOfonoTestCase):
1028+
1029 def setUp(self):
1030 """ Go to Cellular page """
1031- super(CellularBaseTestCase, self).setUp('cellular')
1032+ super(CellularBaseTestCase, self).setUp()
1033+ self.cellular_page = self.system_settings.\
1034+ main_view.go_to_cellular_page()
1035
1036
1037 class PhoneOfonoBaseTestCase(UbuntuSystemSettingsOfonoTestCase):
1038
1039=== modified file 'tests/autopilot/ubuntu_system_settings/tests/test_cellular.py'
1040--- tests/autopilot/ubuntu_system_settings/tests/test_cellular.py 2014-10-09 14:09:38 +0000
1041+++ tests/autopilot/ubuntu_system_settings/tests/test_cellular.py 2014-11-18 20:15:26 +0000
1042@@ -5,537 +5,217 @@
1043 # under the terms of the GNU General Public License version 3, as published
1044 # by the Free Software Foundation.
1045
1046-import dbus
1047 from gi.repository import Gio, GLib
1048 from time import sleep
1049
1050 from autopilot.introspection.dbus import StateNotFoundError
1051 from autopilot.matchers import Eventually
1052-from testtools.matchers import Equals, NotEquals, raises
1053-from unittest import skip
1054+from testtools.matchers import Equals, raises, StartsWith
1055
1056 from ubuntu_system_settings.tests import (
1057- CellularBaseTestCase, CONNMAN_IFACE, RDO_IFACE, SIM_IFACE)
1058-from ubuntu_system_settings.utils.i18n import ugettext as _
1059-
1060-from ubuntuuitoolkit import emulators as toolkit_emulators
1061-
1062-
1063-PREFERENCE_2G = '2G only (saves battery)'
1064-PREFERENCE_UMTS = '2G/3G (faster)'
1065-PREFERENCE_LTE = '2G/3G/4G (faster)'
1066-PREFERENCE_OFF = 'Off'
1067-USE_OFF = "useoff"
1068-USE_SIM_1 = "use/ril_0"
1069-USE_SIM_2 = "use/ril_1"
1070+ CellularBaseTestCase, CONNMAN_IFACE, RDO_IFACE, NETREG_IFACE)
1071
1072
1073 class CellularTestCase(CellularBaseTestCase):
1074- """ Tests for cellular Page """
1075-
1076- """Caches the technology preference selector"""
1077- _pref_selector = None
1078-
1079- @property
1080- def data_preference_selector(self):
1081- """Return data_preference_selector"""
1082- try:
1083- self._pref_selector.get_properties()
1084- except:
1085- self._pref_selector = \
1086- self.system_settings.main_view.cellular_page.select_single(
1087- toolkit_emulators.ItemSelector,
1088- objectName="technologyPreferenceSelector"
1089- )
1090- return self._pref_selector
1091-
1092- def select_preference(self, label):
1093- """Helper method to click a preference which matches provided label"""
1094- pref = self.data_preference_selector.select_single('Label', text=label)
1095- self.system_settings.main_view.pointing_device.click_object(pref)
1096-
1097- def assert_selected_preference(self, index):
1098- """Helper method asserting that the selected data technology preference
1099- is that of index"""
1100- self.assertThat(self.data_preference_selector.selectedIndex,
1101- Eventually(Equals(index)))
1102-
1103- def navigate_to_carrier_page(self):
1104- selector = self.system_settings.main_view.cellular_page.select_single(
1105- objectName="chooseCarrier"
1106- )
1107- self.system_settings.main_view.scroll_to_and_click(selector)
1108-
1109- def navigate_to_manual(self):
1110- selector = self.choose_carrier_page.select_single(
1111- toolkit_emulators.ItemSelector,
1112- objectName="autoChooseCarrierSelector"
1113- )
1114- manual = selector.select_single('Label', text=_("Manually"))
1115- self.system_settings.main_view.pointing_device.click_object(manual)
1116- choosecarrier = self.system_settings.main_view.cellular_page.\
1117- select_single(objectName="chooseCarrier")
1118- self.system_settings.main_view.pointing_device.click_object(
1119- choosecarrier)
1120- self.assertThat(
1121- self.system_settings.main_view.choose_page.title,
1122- Equals(_("Carrier"))
1123- )
1124-
1125- def test_cellular_page(self):
1126- """ Checks whether Cellular page is available """
1127- self.assertThat(
1128- self.system_settings.main_view.cellular_page,
1129- NotEquals(None)
1130- )
1131- self.assertThat(
1132- self.system_settings.main_view.cellular_page.title,
1133- Equals(_('Cellular'))
1134- )
1135-
1136- def test_single_sim_layout(self):
1137- self.system_settings.main_view.cellular_page.\
1138- select_single(objectName="singleSim")
1139- self.assertThat(lambda: self.system_settings.main_view.select_single(
1140- objectName='multiSim'), raises(StateNotFoundError))
1141- self.assertThat(lambda: self.system_settings.main_view.select_single(
1142- objectName='noSim'), raises(StateNotFoundError))
1143-
1144- def test_current_network(self):
1145- """ Tests whether the current network is visible and selected """
1146- self.navigate_to_carrier_page()
1147- self.navigate_to_manual()
1148- carriers = self.system_settings.main_view.choose_page.select_single(
1149- toolkit_emulators.ItemSelector,
1150- objectName="carrierSelector"
1151- )
1152- # TODO: Once there is a proper ItemSelector emulator, get the items
1153- # from it and check 'fake.tel' is the selected one.
1154- selected_delegate = carriers.select_single(
1155- 'OptionSelectorDelegate', selected=True)
1156- selected_delegate.select_single('Label', text="fake.tel")
1157-
1158- def test_alt_network(self):
1159- """ Tests whether an alternative available network is displayed """
1160- self.navigate_to_carrier_page()
1161- self.navigate_to_manual()
1162- carriers = self.system_settings.main_view.choose_page.select_single(
1163- toolkit_emulators.ItemSelector,
1164- objectName="carrierSelector"
1165- )
1166- manual = carriers.select_single('Label', text="my.cool.telco")
1167- self.assertThat(manual, NotEquals(None))
1168+
1169+ def test_enable_data(self):
1170+ self.cellular_page.enable_data()
1171+ self.assertThat(
1172+ lambda: self.modem_0.Get(CONNMAN_IFACE, 'Powered'),
1173+ Eventually(Equals(True))
1174+ )
1175+
1176+ def test_disable_data(self):
1177+ self.cellular_page.disable_data()
1178+ self.assertThat(
1179+ lambda: self.modem_0.Get(CONNMAN_IFACE, 'Powered'),
1180+ Eventually(Equals(False))
1181+ )
1182+
1183+ def test_remote_manipulation_of_data(self):
1184+ self.modem_0.EmitSignal(
1185+ CONNMAN_IFACE,
1186+ 'PropertyChanged',
1187+ 'sv',
1188+ ['Powered', 'true'])
1189+
1190+ self.assertThat(lambda: self.cellular_page.get_data(),
1191+ Eventually(Equals(True)))
1192+
1193+ self.modem_0.EmitSignal(
1194+ CONNMAN_IFACE,
1195+ 'PropertyChanged',
1196+ 'sv',
1197+ ['Powered', 'false'])
1198+
1199+ self.assertThat(lambda: self.cellular_page.get_data(),
1200+ Eventually(Equals(False)))
1201+
1202+ def test_enable_roaming(self):
1203+ self.cellular_page.enable_roaming()
1204+ self.assertThat(
1205+ lambda: self.modem_0.Get(CONNMAN_IFACE, 'RoamingAllowed'),
1206+ Eventually(Equals(True))
1207+ )
1208+
1209+ def test_disable_roaming(self):
1210+ self.cellular_page.disable_roaming()
1211+ self.assertThat(
1212+ lambda: self.modem_0.Get(CONNMAN_IFACE, 'RoamingAllowed'),
1213+ Eventually(Equals(False))
1214+ )
1215+
1216+ def test_connection_type(self):
1217+ get_pref = lambda: self.modem_0.Get(RDO_IFACE, 'TechnologyPreference')
1218+ for pref in ['lte', 'umts', 'gsm']:
1219+ self.cellular_page.set_connection_type(pref)
1220+ self.assertThat(get_pref, Eventually(Equals(pref)))
1221+
1222+ def test_current_carrier(self):
1223+ self.assertThat(lambda: self.modem_0.Get(NETREG_IFACE, 'Name'),
1224+ Eventually(Equals('fake.tel')))
1225+
1226+ def test_change_carrier(self):
1227+ self.cellular_page.change_carrier('my.cool.telco')
1228
1229 def test_no_forbidden_network(self):
1230 """ Ensures that a forbidden network is not shown """
1231- self.navigate_to_carrier_page()
1232- self.navigate_to_manual()
1233- carriers = self.system_settings.main_view.choose_page.select_single(
1234- toolkit_emulators.ItemSelector,
1235- objectName="carrierSelector"
1236- )
1237 self.assertThat(
1238- lambda: carriers.select_single('Label', text="my.bad.telco"),
1239+ lambda: self.cellular_page.change_carrier('my.bad.telco'),
1240 raises(StateNotFoundError)
1241 )
1242
1243- def test_set_sim_offline(self):
1244- self.select_preference(PREFERENCE_OFF)
1245-
1246- sleep(0.7)
1247-
1248- self.assertEqual(False, self.modem_0.Get(CONNMAN_IFACE, 'Powered'))
1249-
1250- def test_set_sim_online(self):
1251- self.select_preference(PREFERENCE_OFF)
1252- sleep(0.7)
1253- self.assertEqual(False, self.modem_0.Get(CONNMAN_IFACE, 'Powered'))
1254-
1255- self.select_preference(PREFERENCE_UMTS)
1256- sleep(0.7)
1257- self.assertEqual(True, self.modem_0.Get(CONNMAN_IFACE, 'Powered'))
1258-
1259- def test_roaming_switch(self):
1260- """Test that switching off cellular data disables roaming switch"""
1261- roaming_switch = self.system_settings.main_view.select_single(
1262- objectName="dataRoamingSwitch"
1263- )
1264- # select 2G only
1265- self.select_preference(PREFERENCE_2G)
1266-
1267- # assert that roaming_switch is enabled
1268- self.assertThat(
1269- roaming_switch.get_properties()['enabled'],
1270- Eventually(Equals(True)))
1271-
1272- # click off
1273- self.select_preference(PREFERENCE_OFF)
1274- # assert roaming_switch is disabled
1275- self.assertThat(
1276- roaming_switch.get_properties()['enabled'],
1277- Eventually(Equals(False)))
1278-
1279- def test_allow_roaming(self):
1280- roaming_switch = self.system_settings.main_view.select_single(
1281- objectName="dataRoamingSwitch"
1282- )
1283- self.system_settings.main_view.scroll_to_and_click(roaming_switch)
1284- sleep(1.5)
1285- self.assertEqual(
1286- True, self.modem_0.Get(CONNMAN_IFACE, 'RoamingAllowed'))
1287-
1288- def test_change_data_preference(self):
1289- self.select_preference(PREFERENCE_2G)
1290- sleep(0.7)
1291- self.assertEqual('gsm', self.modem_0.Get(RDO_IFACE,
1292- 'TechnologyPreference'))
1293- self.select_preference(PREFERENCE_UMTS)
1294- sleep(0.7)
1295- self.assertEqual('umts', self.modem_0.Get(RDO_IFACE,
1296- 'TechnologyPreference'))
1297-
1298- def test_sim_online_status_insensitive_to_radio_preference(self):
1299- # turn off cellular data
1300- self.select_preference(PREFERENCE_OFF)
1301-
1302- # fake dbus signal, changing to umts
1303- self.modem_0.EmitSignal(
1304- 'org.ofono.RadioSettings',
1305- 'PropertyChanged',
1306- 'sv',
1307- ['TechnologyPreference', dbus.String('umts', variant_level=1)])
1308-
1309- # assert that "Off" has not changed
1310- self.assert_selected_preference(0)
1311-
1312- def test_ui_reacts_to_sim_set_coming_online(self):
1313- self.select_preference(PREFERENCE_2G)
1314- self.select_preference(PREFERENCE_OFF)
1315-
1316- sleep(0.7)
1317-
1318- self.modem_0.EmitSignal(
1319- CONNMAN_IFACE,
1320- 'PropertyChanged',
1321- 'sv',
1322- ['Powered', 'true'])
1323-
1324- # assert that 2G is selected
1325- self.assert_selected_preference(1)
1326-
1327- def test_unlocking_sim(self):
1328- '''Like it would if the sim was locked, e.g.'''
1329- self.modem_0.Set(RDO_IFACE, 'TechnologyPreference',
1330- dbus.String('', variant_level=1))
1331-
1332- self.system_settings.main_view.go_back()
1333-
1334- self.system_settings.main_view.pointing_device.click_object(
1335- self.system_settings.main_view.select_single(
1336- objectName='entryComponent-cellular'))
1337-
1338- self.assert_selected_preference(-1)
1339- self.assertFalse(self.data_preference_selector.enabled)
1340-
1341- self.modem_0.EmitSignal(
1342- 'org.ofono.RadioSettings',
1343- 'PropertyChanged',
1344- 'sv',
1345- ['TechnologyPreference', dbus.String('lte', variant_level=1)])
1346-
1347- self.assert_selected_preference(3)
1348-
1349
1350 class DualSimCellularTestCase(CellularBaseTestCase):
1351
1352 use_sims = 2
1353
1354- def navigate_to_carriers_page(self):
1355- selector = self.system_settings.main_view.cellular_page.select_single(
1356- objectName="chooseCarrier"
1357- )
1358- self.system_settings.main_view.scroll_to_and_click(selector)
1359-
1360- def navigate_to_carrier_page_for_sim(self, n):
1361- selector = self.choose_carriers_page.select_single(
1362- objectName="chooseCarrierSim%d" % n
1363- )
1364- self.system_settings.main_view.scroll_to_and_click(selector)
1365-
1366- def navigate_to_manual(self):
1367- selector = self.choose_carrier_page.select_single(
1368- toolkit_emulators.ItemSelector,
1369- objectName="autoChooseCarrierSelector"
1370- )
1371- manual = selector.select_single('Label', text=_("Manually"))
1372- self.system_settings.main_view.scroll_to_and_click(manual)
1373- choosecarrier = self.system_settings.main_view.cellular_page.\
1374- select_single(objectName="chooseCarrier")
1375- self.system_settings.main_view.scroll_to_and_click(choosecarrier)
1376- self.assertThat(
1377- self.system_settings.main_view.choose_page.title,
1378- Equals(_("Carrier"))
1379- )
1380-
1381- @property
1382- def data_preference_selector(self):
1383- """Return data_preference_selector"""
1384+ def test_data_off(self):
1385+ self.cellular_page.disable_datas()
1386+ self.assertThat(
1387+ lambda: self.modem_0.Get(CONNMAN_IFACE, 'Powered'),
1388+ Eventually(Equals(False))
1389+ )
1390+ self.assertThat(
1391+ lambda: self.modem_1.Get(CONNMAN_IFACE, 'Powered'),
1392+ Eventually(Equals(False))
1393+ )
1394+
1395+ def test_sim1_online(self):
1396+ self.cellular_page.select_sim_for_data('/ril_0')
1397+ self.assertThat(
1398+ lambda: self.modem_0.Get(CONNMAN_IFACE, 'Powered'),
1399+ Eventually(Equals(True))
1400+ )
1401+ self.assertThat(
1402+ lambda: self.modem_1.Get(CONNMAN_IFACE, 'Powered'),
1403+ Eventually(Equals(False))
1404+ )
1405+
1406+ def test_sim2_online(self):
1407+ self.cellular_page.select_sim_for_data('/ril_1')
1408+ self.assertThat(
1409+ lambda: self.modem_0.Get(CONNMAN_IFACE, 'Powered'),
1410+ Eventually(Equals(False))
1411+ )
1412+ self.assertThat(
1413+ lambda: self.modem_1.Get(CONNMAN_IFACE, 'Powered'),
1414+ Eventually(Equals(True))
1415+ )
1416+
1417+ def test_connection_type_on_sim1(self):
1418+ sim = '/ril_0'
1419+ stac = self.system_settings.main_view.scroll_to_and_click
1420+ self.cellular_page.select_sim_for_data(sim)
1421+ get_pref = lambda: self.modem_0.Get(RDO_IFACE, 'TechnologyPreference')
1422+ for pref in ['lte', 'umts', 'gsm']:
1423+ self.cellular_page.set_connection_type(
1424+ pref, sim=sim, scroll_to_and_click=stac)
1425+ self.assertThat(get_pref, Eventually(Equals(pref)))
1426+
1427+ def test_connection_type_on_sim2(self):
1428+ sim = '/ril_1'
1429+ stac = self.system_settings.main_view.scroll_to_and_click
1430+ self.cellular_page.select_sim_for_data(sim)
1431+ get_pref = lambda: self.modem_1.Get(RDO_IFACE, 'TechnologyPreference')
1432+ for pref in ['gsm']:
1433+ self.cellular_page.set_connection_type(
1434+ pref, sim=sim, scroll_to_and_click=stac)
1435+ self.assertThat(get_pref, Eventually(Equals(pref)))
1436+
1437+ def test_current_carrier_sim1(self):
1438+ self.assertThat(lambda: self.modem_0.Get(NETREG_IFACE, 'Name'),
1439+ Eventually(Equals('fake.tel')))
1440+
1441+ def test_change_carrier_sim1(self):
1442+ sim = '/ril_0'
1443+ self.cellular_page.change_carrier('my.cool.telco', sim=sim)
1444+
1445+ def test_current_carrier_sim2(self):
1446+ self.assertThat(lambda: self.modem_1.Get(NETREG_IFACE, 'Name'),
1447+ Eventually(Equals('fake.tel')))
1448+
1449+ def test_change_carrier_sim2(self):
1450+ sim = '/ril_1'
1451+ self.cellular_page.change_carrier('my.cool.telco', sim=sim)
1452+
1453+ def test_change_sim1_name(self):
1454+ gsettings = Gio.Settings.new('com.ubuntu.phone')
1455+ sim = '/ril_0'
1456 try:
1457- self._pref_selector.get_properties()
1458+ old_name = gsettings.get_value('sim-names')[sim]
1459 except:
1460- self._pref_selector = \
1461- self.system_settings.main_view.cellular_page.select_single(
1462- toolkit_emulators.ItemSelector,
1463- objectName="technologyPreferenceSelector"
1464- )
1465- return self._pref_selector
1466-
1467- def select_preference(self, label):
1468- """Helper method that clicks a preference
1469- that matches provided label"""
1470- pref = self.data_preference_selector.select_single('Label', text=label)
1471- self.system_settings.main_view.scroll_to_and_click(pref)
1472-
1473- def assert_selected_preference(self, index):
1474- """Helper method asserting that the selected
1475- data technology preference is that of index"""
1476- self.assertThat(
1477- self.data_preference_selector.selectedIndex,
1478- Eventually(Equals(index)))
1479-
1480- def use_selector(self, label):
1481- obj = self.system_settings.main_view.cellular_page.select_single(
1482- objectName="use"
1483- ).select_single(objectName=label)
1484- self.system_settings.main_view.scroll_to_and_click(obj)
1485-
1486- def assert_used(self, index):
1487- obj = self.system_settings.main_view.cellular_page.select_single(
1488- objectName="use"
1489- )
1490- self.assertThat(
1491- obj.selectedIndex, Eventually(Equals(index)))
1492-
1493- def get_sim_name(self, num):
1494- obj = self.system_settings.main_view.cellular_page.select_single(
1495- objectName="simLabel%d" % num)
1496- return obj.get_properties()['text']
1497-
1498- def rename_sim(self, num, new_name):
1499- obj = self.system_settings.main_view.cellular_page.select_single(
1500- objectName="simEditor"
1501- ).select_single(objectName="editSim%d" % num)
1502- self.system_settings.main_view.scroll_to_and_click(obj)
1503- field = self.system_settings.main_view.cellular_page.select_single(
1504- objectName="nameField"
1505- )
1506- self.system_settings.main_view.scroll_to_and_click(field)
1507- self.system_settings.main_view.scroll_to_and_click(
1508- field.select_single(objectName="clear_button"))
1509- self.keyboard.type(new_name)
1510- self.system_settings.main_view.scroll_to_and_click(
1511- self.system_settings.main_view.cellular_page.select_single(
1512- objectName="doRename"))
1513-
1514- def test_use_sim_1(self):
1515- self.use_selector(USE_OFF)
1516- self.use_selector(USE_SIM_1)
1517- sleep(0.7)
1518- self.assertEqual(True, self.modem_0.Get(CONNMAN_IFACE, 'Powered'))
1519- self.assertEqual(False, self.modem_1.Get(CONNMAN_IFACE, 'Powered'))
1520-
1521- def test_use_sim_2(self):
1522- self.use_selector(USE_OFF)
1523- self.use_selector(USE_SIM_2)
1524- sleep(0.7)
1525- self.assertEqual(False, self.modem_0.Get(CONNMAN_IFACE, 'Powered'))
1526- self.assertEqual(True, self.modem_1.Get(CONNMAN_IFACE, 'Powered'))
1527-
1528- def test_turn_off_both_sims(self):
1529- self.use_selector(USE_OFF)
1530- sleep(0.7)
1531- self.assertEqual(False, self.modem_0.Get(CONNMAN_IFACE, 'Powered'))
1532- self.assertEqual(False, self.modem_1.Get(CONNMAN_IFACE, 'Powered'))
1533-
1534- def test_use_gsm_for_sim_1(self):
1535- self.use_selector(USE_SIM_1)
1536- self.select_preference(PREFERENCE_2G)
1537- sleep(0.7)
1538- self.assertEqual(
1539- 'gsm', self.modem_0.Get(RDO_IFACE, 'TechnologyPreference'))
1540-
1541- def test_use_umts_for_sim_1(self):
1542- self.use_selector(USE_SIM_1)
1543- self.select_preference(PREFERENCE_UMTS)
1544- sleep(0.7)
1545- self.assertEqual(
1546- 'umts', self.modem_0.Get(RDO_IFACE, 'TechnologyPreference'))
1547-
1548- def test_use_gsm_for_sim_2(self):
1549- self.use_selector(USE_SIM_1)
1550- self.select_preference(PREFERENCE_2G)
1551- sleep(0.7)
1552- self.assertEqual(
1553- 'gsm', self.modem_0.Get(RDO_IFACE, 'TechnologyPreference'))
1554-
1555- def test_when_sim_1_comes_online_ui_is_correct(self):
1556- self.use_selector(USE_SIM_1)
1557- self.select_preference(PREFERENCE_UMTS)
1558- self.use_selector(USE_OFF)
1559- sleep(0.7)
1560- self.modem_0.Set(CONNMAN_IFACE, 'Powered', True)
1561- self.modem_0.EmitSignal(
1562- CONNMAN_IFACE,
1563- 'PropertyChanged',
1564- 'sv',
1565- ['Powered', 'true'])
1566-
1567- self.assertEqual(
1568- 'umts', self.modem_0.Get(RDO_IFACE, 'TechnologyPreference'))
1569- self.assert_used(1)
1570- self.assert_selected_preference(1)
1571-
1572- def test_when_sim_2_comes_online_ui_is_correct(self):
1573- self.use_selector(USE_SIM_2)
1574- self.select_preference(PREFERENCE_2G)
1575- self.use_selector(USE_OFF)
1576- sleep(2)
1577- self.modem_1.Set(CONNMAN_IFACE, 'Powered', True)
1578- self.modem_1.EmitSignal(
1579- CONNMAN_IFACE,
1580- 'PropertyChanged',
1581- 'sv',
1582- ['Powered', 'true'])
1583-
1584- self.assertEqual(
1585- 'gsm', self.modem_1.Get(RDO_IFACE, 'TechnologyPreference'))
1586- self.assert_used(2)
1587- self.assert_selected_preference(0)
1588-
1589- def test_roaming_switch(self):
1590- roaming_switch = self.system_settings.main_view.select_single(
1591- objectName="dataRoamingSwitch"
1592- )
1593- # assert that roaming_switch is enabled
1594- self.assertTrue(roaming_switch.get_properties()['enabled'])
1595-
1596- # click off
1597- self.use_selector(USE_OFF)
1598-
1599- # assert roaming_switch is disabled
1600- self.assertThat(
1601- roaming_switch.get_properties()['enabled'],
1602- Eventually(Equals(False)))
1603-
1604- def test_allow_roaming(self):
1605- self.use_selector(USE_SIM_1)
1606- self.assertEqual(
1607- False, self.modem_0.Get(CONNMAN_IFACE, 'RoamingAllowed'))
1608- roaming_switch = self.system_settings.main_view.select_single(
1609- objectName="dataRoamingSwitch"
1610- )
1611- self.system_settings.main_view.scroll_to_and_click(roaming_switch)
1612- sleep(1.5)
1613- self.assertEqual(
1614- True, self.modem_0.Get(CONNMAN_IFACE, 'RoamingAllowed'))
1615-
1616- def test_no_radio_preference(self):
1617- self.select_preference(PREFERENCE_UMTS)
1618- self.use_selector(USE_OFF)
1619-
1620- self.modem_0.Set(RDO_IFACE, 'TechnologyPreference', '')
1621- self.modem_0.EmitSignal(
1622- CONNMAN_IFACE,
1623- 'PropertyChanged',
1624- 'sv',
1625- ['TechnologyPreference', ''])
1626-
1627- self.assertThat(
1628- self.data_preference_selector.get_properties()['visible'],
1629- Eventually(Equals(False)))
1630-
1631- # see
1632- # https://gitorious.org/python-dbusmock/python-dbusmock/merge_requests/3
1633- @skip('skipped due to bug in dbusmock')
1634- def test_change_op_sim_1(self):
1635- self.navigate_to_carriers_page()
1636- self.navigate_to_carrier_page_for_sim(1)
1637- carriers = self.system_settings.main_view.choose_page.select_single(
1638- toolkit_emulators.ItemSelector, objectName="carrierSelector")
1639- manual = carriers.select_single('Label', text="my.cool.telco")
1640- self.assertThat(manual, NotEquals(None))
1641-
1642- # see
1643- # https://gitorious.org/python-dbusmock/python-dbusmock/merge_requests/3
1644- @skip('skipped due to bug in dbusmock')
1645- def test_change_op_sim_2(self):
1646- self.navigate_to_carriers_page()
1647- self.navigate_to_carrier_page_for_sim(2)
1648- carriers = self.system_settings.main_view.choose_page.select_single(
1649- toolkit_emulators.ItemSelector, objectName="carrierSelector")
1650- manual = carriers.select_single('Label', text="my.cool.telco")
1651- self.assertThat(manual, NotEquals(None))
1652-
1653- def test_radio_preference_changes(self):
1654- self.use_selector(USE_SIM_1)
1655-
1656- self.modem_0.Set(RDO_IFACE, 'TechnologyPreference', 'umts')
1657- self.modem_0.EmitSignal(
1658- RDO_IFACE,
1659- 'PropertyChanged',
1660- 'sv',
1661- ['TechnologyPreference', 'umts'])
1662-
1663- self.assert_selected_preference(1)
1664-
1665- def test_changing_sim1_name(self):
1666- gsettings = Gio.Settings.new('com.ubuntu.phone')
1667- old_name = gsettings.get_value('sim-names')['/ril_0']
1668+ old_name = 'SIM 1'
1669 new_name = 'FOO BAR'
1670- self.rename_sim(1, new_name)
1671+ self.cellular_page.set_name(sim, new_name)
1672
1673- # wait for gsettings
1674- sleep(1)
1675 try:
1676- self.assertEqual(
1677- new_name, gsettings.get_value('sim-names')['/ril_0'])
1678+ self.assertThat(
1679+ lambda: gsettings.get_value('sim-names')[sim],
1680+ Eventually(Equals(new_name)))
1681 except Exception as e:
1682 raise e
1683 finally:
1684- self.rename_sim(1, old_name)
1685+ self.cellular_page.set_name(sim, old_name)
1686+ # wait for gsettings
1687 sleep(1)
1688
1689- def test_changing_sim2_name(self):
1690+ def test_change_sim2_name(self):
1691 gsettings = Gio.Settings.new('com.ubuntu.phone')
1692- old_name = gsettings.get_value('sim-names')['/ril_1']
1693+ sim = '/ril_1'
1694+
1695+ try:
1696+ old_name = gsettings.get_value('sim-names')[sim]
1697+ except:
1698+ old_name = 'SIM 2'
1699+
1700 new_name = 'BAR BAZ'
1701- self.rename_sim(2, new_name)
1702+ self.cellular_page.set_name(sim, new_name)
1703
1704- # wait for gsettings
1705- sleep(1)
1706 try:
1707- self.assertEqual(
1708- new_name, gsettings.get_value('sim-names')['/ril_1'])
1709+ self.assertThat(
1710+ lambda: gsettings.get_value('sim-names')[sim],
1711+ Eventually(Equals(new_name)))
1712 except Exception as e:
1713 raise e
1714 finally:
1715- self.rename_sim(2, old_name)
1716+ self.cellular_page.set_name(sim, old_name)
1717 # wait for gsettings
1718 sleep(1)
1719
1720- def test_changes_to_sim_names_in_gsettings_are_reflected_in_ui(self):
1721+ def test_remote_manipulation_of_name(self):
1722 gsettings = Gio.Settings.new('com.ubuntu.phone')
1723 old_names = gsettings.get_value('sim-names')
1724-
1725+ sim = '/ril_0'
1726+ name = 'BAS QUX'
1727 new_names = old_names.unpack()
1728- new_names['/ril_0'] = 'BAS QUX'
1729+ new_names[sim] = name
1730 new_names = GLib.Variant('a{ss}', new_names)
1731 gsettings.set_value('sim-names', new_names)
1732-
1733- # wait for gsettings
1734- sleep(1)
1735 try:
1736- self.assertIn(new_names['/ril_0'], self.get_sim_name(1))
1737+ self.assertThat(
1738+ lambda: self.cellular_page.get_name(sim),
1739+ Eventually(StartsWith(name)))
1740 except Exception as e:
1741 raise e
1742 finally:
1743@@ -543,6 +223,36 @@
1744 # wait for gsettings
1745 sleep(1)
1746
1747+ def test_roaming_switch(self):
1748+ self.cellular_page.disable_datas()
1749+ # assert roaming_switch is disabled
1750+ self.assertThat(
1751+ lambda: self.cellular_page.enable_roaming(timeout=1),
1752+ raises(AssertionError)
1753+ )
1754+
1755+ def test_allow_roaming_sim_1(self):
1756+ sim = '/ril_0'
1757+ self.cellular_page.select_sim_for_data(sim)
1758+
1759+ self.assertEqual(
1760+ False, self.modem_0.Get(CONNMAN_IFACE, 'RoamingAllowed'))
1761+ self.cellular_page.enable_roaming()
1762+ self.assertThat(
1763+ lambda: self.modem_0.Get(CONNMAN_IFACE, 'RoamingAllowed'),
1764+ Eventually(Equals(True)))
1765+
1766+ def test_allow_roaming_sim_2(self):
1767+ sim = '/ril_1'
1768+ self.cellular_page.select_sim_for_data(sim)
1769+
1770+ self.assertEqual(
1771+ False, self.modem_1.Get(CONNMAN_IFACE, 'RoamingAllowed'))
1772+ self.cellular_page.enable_roaming()
1773+ self.assertThat(
1774+ lambda: self.modem_1.Get(CONNMAN_IFACE, 'RoamingAllowed'),
1775+ Eventually(Equals(True)))
1776+
1777 def test_changing_default_sim_for_calls(self):
1778 gsettings = Gio.Settings.new('com.ubuntu.phone')
1779 default = gsettings.get_value('default-sim-for-calls')
1780@@ -556,11 +266,10 @@
1781 # click first sim
1782 self.system_settings.main_view.scroll_to_and_click(
1783 self.get_default_sim_for_calls_selector('/ril_0'))
1784- # wait for gsettings
1785- sleep(1)
1786- self.assertEqual(
1787- gsettings.get_value('default-sim-for-calls').get_string(),
1788- '/ril_0')
1789+
1790+ self.assertThat(
1791+ lambda: gsettings.get_value('default-sim-for-calls').get_string(),
1792+ Eventually(Equals('/ril_0')))
1793
1794 def test_changing_default_sim_for_messages(self):
1795 gsettings = Gio.Settings.new('com.ubuntu.phone')
1796@@ -574,108 +283,8 @@
1797 # click second sim
1798 self.system_settings.main_view.scroll_to_and_click(
1799 self.get_default_sim_for_messages_selector('/ril_1'))
1800- # wait for gsettings
1801- sleep(1)
1802- self.assertEqual(
1803- gsettings.get_value('default-sim-for-messages').get_string(),
1804- '/ril_1')
1805-
1806- def test_multi_sim_layout(self):
1807- self.system_settings.main_view.cellular_page.\
1808- select_single(objectName="multiSim")
1809- self.assertThat(lambda: self.system_settings.main_view.select_single(
1810- objectName='singleSim'), raises(StateNotFoundError))
1811- self.assertThat(lambda: self.system_settings.main_view.select_single(
1812- objectName='noSim'), raises(StateNotFoundError))
1813-
1814- def test_remove_one_sim(self):
1815- self.modem_0.EmitSignal(
1816- SIM_IFACE,
1817- 'PropertyChanged',
1818- 'sv',
1819- ['Present', 'False'])
1820-
1821- self.system_settings.main_view.cellular_page.\
1822- select_single(objectName="singleSim")
1823- self.assertThat(lambda: self.system_settings.main_view.select_single(
1824- objectName='multiSim'), raises(StateNotFoundError))
1825- self.assertThat(lambda: self.system_settings.main_view.select_single(
1826- objectName='noSim'), raises(StateNotFoundError))
1827-
1828- def test_remove_two_sims(self):
1829- self.modem_0.EmitSignal(
1830- SIM_IFACE,
1831- 'PropertyChanged',
1832- 'sv',
1833- ['Present', 'False'])
1834-
1835- self.modem_1.EmitSignal(
1836- SIM_IFACE,
1837- 'PropertyChanged',
1838- 'sv',
1839- ['Present', 'False'])
1840-
1841- self.system_settings.main_view.cellular_page.\
1842- wait_select_single(objectName="noSim")
1843- self.assertThat(
1844- lambda: self.system_settings.main_view.select_single(
1845- objectName='multiSim'), raises(StateNotFoundError))
1846- self.assertThat(
1847- lambda: self.system_settings.main_view.select_single(
1848- objectName='singleSim'), raises(StateNotFoundError))
1849-
1850- def test_remove_and_insert_sims(self):
1851- self.modem_0.EmitSignal(
1852- SIM_IFACE,
1853- 'PropertyChanged',
1854- 'sv',
1855- ['Present', 'False'])
1856-
1857- self.modem_1.EmitSignal(
1858- SIM_IFACE,
1859- 'PropertyChanged',
1860- 'sv',
1861- ['Present', 'False'])
1862-
1863- self.system_settings.main_view.cellular_page.\
1864- wait_select_single(objectName="noSim")
1865- self.assertThat(
1866- lambda: self.system_settings.main_view.select_single(
1867- objectName='multiSim'), raises(StateNotFoundError))
1868- self.assertThat(
1869- lambda: self.system_settings.main_view.select_single(
1870- objectName='singleSim'), raises(StateNotFoundError))
1871-
1872- self.modem_0.EmitSignal(
1873- SIM_IFACE,
1874- 'PropertyChanged',
1875- 'sv',
1876- ['Present', 'True'])
1877-
1878- self.modem_1.EmitSignal(
1879- SIM_IFACE,
1880- 'PropertyChanged',
1881- 'sv',
1882- ['Present', 'True'])
1883-
1884- self.system_settings.main_view.cellular_page.\
1885- wait_select_single(objectName="multiSim")
1886- self.assertThat(
1887- lambda: self.system_settings.main_view.select_single(
1888- objectName='noSim'), raises(StateNotFoundError))
1889- self.assertThat(
1890- lambda: self.system_settings.main_view.select_single(
1891- objectName='singleSim'), raises(StateNotFoundError))
1892-
1893- # regression test for 1375832
1894- # tests that the second slot only exposes gsm, which
1895- # the testdata indicates
1896- def test_slot_two(self):
1897- self.modem_0.EmitSignal(
1898- SIM_IFACE,
1899- 'PropertyChanged',
1900- 'sv',
1901- ['Present', 'False'])
1902- self.select_preference(PREFERENCE_2G)
1903- self.assertRaises(StateNotFoundError,
1904- self.select_preference, PREFERENCE_UMTS)
1905+
1906+ self.assertThat(
1907+ lambda:
1908+ gsettings.get_value('default-sim-for-messages').get_string(),
1909+ Eventually(Equals('/ril_1')))

Subscribers

People subscribed via source and target branches