Merge lp:~jonas-drange/ubuntu-system-settings/1319044-carrier-design-dual-sim into lp:ubuntu-system-settings

Proposed by Jonas G. Drange
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
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

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:786
http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-ci/1039/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2364
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/1936
    FAILURE: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-amd64-ci/231/console
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/231
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/231/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-i386-ci/231
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2543
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3583
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3583/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10272
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1623
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2181
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2181/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-system-settings-ci/1039/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:786
http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-ci/1049/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2423
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/1974
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-amd64-ci/241
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/241
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/241/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-i386-ci/241
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2590
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3654
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3654/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10334
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1652
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2224
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2224/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-system-settings-ci/1049/rebuild

review: Approve (continuous-integration)
Revision history for this message
Ken VanDine (ken-vandine) wrote :

Lets remove the debugging output and see my comment inline

review: Needs Fixing
Revision history for this message
Ken VanDine (ken-vandine) wrote :

Please make sure all the lines wrap at 80

review: Needs Fixing
Revision history for this message
Jonas G. Drange (jonas-drange) wrote :

Acking diff comment

Revision history for this message
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

Revision history for this message
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

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:788
http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-ci/1055/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2460
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/1994
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-amd64-ci/247
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/247
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/247/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-i386-ci/247
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2622
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3702
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3702/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10377
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1667
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2244
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2244/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-system-settings-ci/1055/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:789
http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-ci/1056/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2462
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/1995
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-amd64-ci/248
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/248
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/248/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-i386-ci/248
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2624
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3705
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3705/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10381
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1668
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2245
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2245/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-system-settings-ci/1056/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

FAILED: Continuous integration, rev:789
http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-ci/1057/
Executed test runs:
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2472
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/2000
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-amd64-ci/249
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/249
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/249/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-i386-ci/249
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2629
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3715
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3715/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10388
    UNSTABLE: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1672
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2252
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2252/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-system-settings-ci/1057/rebuild

review: Needs Fixing (continuous-integration)
790. By Jonas G. Drange

making sure radio preference changes does not override user selection

Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:789
http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-ci/1063/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2486
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/2011
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-amd64-ci/255
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/255
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/255/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-i386-ci/255
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2641
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3729
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3729/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10407
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1682
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2264
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2264/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-system-settings-ci/1063/rebuild

review: Approve (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:790
http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-ci/1062/
Executed test runs:
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-utopic-touch/2485
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-utopic/2010
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-amd64-ci/254
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/254
        deb: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-armhf-ci/254/artifact/work/output/*zip*/output.zip
    SUCCESS: http://jenkins.qa.ubuntu.com/job/ubuntu-system-settings-utopic-i386-ci/254
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-deb-autopilot-runner-mako/2640
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3728
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-armhf/3728/artifact/work/output/*zip*/output.zip
    SUCCESS: http://s-jenkins.ubuntu-ci:8080/job/touch-flash-device/10404
    SUCCESS: http://jenkins.qa.ubuntu.com/job/autopilot-testrunner-otto-utopic/1683
    SUCCESS: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2263
        deb: http://jenkins.qa.ubuntu.com/job/generic-mediumtests-builder-utopic-amd64/2263/artifact/work/output/*zip*/output.zip

Click here to trigger a rebuild:
http://s-jenkins.ubuntu-ci:8080/job/ubuntu-system-settings-ci/1062/rebuild

review: Approve (continuous-integration)
Revision history for this message
Ken VanDine (ken-vandine) wrote :

Looks good, I tested it on my mako and Tiago tested on his dual sim device.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
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))

Subscribers

People subscribed via source and target branches