Merge lp:~unity-api-team/indicator-network/connectivity-api-mobile-data-management-tests into lp:indicator-network

Proposed by Pete Woods
Status: Merged
Approved by: Pete Woods
Approved revision: 637
Merged at revision: 602
Proposed branch: lp:~unity-api-team/indicator-network/connectivity-api-mobile-data-management-tests
Merge into: lp:indicator-network
Prerequisite: lp:~unity-api-team/indicator-network/mobile-switch
Diff against target: 3470 lines (+1677/-332)
33 files modified
data/com.ubuntu.connectivity1.Sim.xml (+1/-0)
debian/control (+1/-1)
src/connectivity-api/connectivity-qt/connectivityqt/connectivity.cpp (+3/-0)
src/connectivity-api/connectivity-qt/connectivityqt/modem.cpp (+4/-4)
src/connectivity-api/connectivity-qt/connectivityqt/modems-list-model.cpp (+4/-1)
src/connectivity-api/connectivity-qt/connectivityqt/modems-list-model.h (+2/-0)
src/connectivity-api/connectivity-qt/connectivityqt/sim.cpp (+11/-6)
src/connectivity-api/connectivity-qt/connectivityqt/sim.h (+11/-8)
src/connectivity-api/connectivity-qt/connectivityqt/sims-list-model.cpp (+28/-4)
src/connectivity-api/connectivity-qt/connectivityqt/sims-list-model.h (+5/-8)
src/indicator/connectivity-service/connectivity-service.cpp (+51/-25)
src/indicator/connectivity-service/dbus-modem.cpp (+1/-1)
src/indicator/connectivity-service/dbus-sim.cpp (+30/-1)
src/indicator/connectivity-service/dbus-sim.h (+7/-0)
src/indicator/factory.cpp (+2/-2)
src/indicator/nmofono/connectivity-service-settings.cpp (+31/-21)
src/indicator/nmofono/connectivity-service-settings.h (+2/-2)
src/indicator/nmofono/manager-impl.cpp (+106/-56)
src/indicator/nmofono/wwan/modem.cpp (+27/-0)
src/indicator/nmofono/wwan/qofono-sim-wrapper.cpp (+21/-112)
src/indicator/nmofono/wwan/qofono-sim-wrapper.h (+1/-4)
src/indicator/nmofono/wwan/sim-manager.cpp (+36/-36)
src/indicator/nmofono/wwan/sim-manager.h (+3/-1)
src/indicator/nmofono/wwan/sim.cpp (+104/-14)
src/indicator/nmofono/wwan/sim.h (+22/-6)
src/qdbus-stubs/dbus-types.h (+6/-4)
tests/integration/CMakeLists.txt (+2/-0)
tests/integration/indicator-network-test-base.cpp (+40/-9)
tests/integration/indicator-network-test-base.h (+32/-3)
tests/integration/test-connectivity-api-modem.cpp (+322/-0)
tests/integration/test-connectivity-api-sim.cpp (+375/-0)
tests/integration/test-connectivity-api.cpp (+124/-0)
tests/integration/test-indicator.cpp (+262/-3)
To merge this branch: bzr merge lp:~unity-api-team/indicator-network/connectivity-api-mobile-data-management-tests
Reviewer Review Type Date Requested Status
PS Jenkins bot continuous-integration Pending
Indicator Applet Developers Pending
Review via email: mp+295939@code.launchpad.net

This proposal supersedes a proposal from 2016-05-27.

Commit message

New Connectivity Service Private API for managing mobile data and SIM cards. Tests.

Description of the change

New Connectivity Service Private API for managing mobile data and SIM cards. Tests.

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote : Posted in a previous version of this proposal
review: Needs Fixing (continuous-integration)
604. By Pete Woods

Use a sequence for generating DBus paths

605. By Pete Woods

Create our own modem

606. By Pete Woods

Start implementing the modem model tests

607. By Pete Woods

Init the Sims model before we use it

608. By Pete Woods

Remove phone numbers property

609. By Pete Woods

Get more ModemsListModel tests working

610. By Antti Kaijanmäki

add a test for mobile data switch.

611. By Antti Kaijanmäki

more indicator tests.

612. By Antti Kaijanmäki

merge.

613. By Antti Kaijanmäki

no macros

614. By Antti Kaijanmäki

fix cellular2

615. By Antti Kaijanmäki

merge

616. By Pete Woods

Start making a test for mobile data selector

617. By Antti Kaijanmäki

first try of initial mobile data heuristics.

618. By Antti Kaijanmäki

debug tests

619. By Antti Kaijanmäki

make tests pass.

620. By Antti Kaijanmäki

fix build on vivid.

621. By Antti Kaijanmäki

fix build on vivid 2.

622. By Antti Kaijanmäki

Switch from IMSI to ICCID

623. By Antti Kaijanmäki

Fix rest of the tests.

624. By Antti Kaijanmäki

remove sim_general.xml

625. By Antti Kaijanmäki

foofix

626. By Antti Kaijanmäki

DISABLE TESTS

627. By Antti Kaijanmäki

add IMSI to SIM interface.

628. By Antti Kaijanmäki

indicator: check that simForMobileData is also present before enabling the switch.

629. By Antti Kaijanmäki

fix small bugs.

630. By Antti Kaijanmäki

whoopsie

631. By Antti Kaijanmäki

remove debugging stuff

632. By Antti Kaijanmäki

augment tests and visual cleanup.

633. By Antti Kaijanmäki

Fix a bug where mobile data is not restored properly on startup.

634. By Antti Kaijanmäki

RE-ENABLE TESTS

635. By Antti Kaijanmäki

make "hotplugged" SIMs work.

636. By Antti Kaijanmäki

fix initial imsi

637. By Antti Kaijanmäki

do not wait on MCC and MNC

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'data/com.ubuntu.connectivity1.Sim.xml'
--- data/com.ubuntu.connectivity1.Sim.xml 2016-06-22 09:42:47 +0000
+++ data/com.ubuntu.connectivity1.Sim.xml 2016-06-22 09:42:47 +0000
@@ -2,6 +2,7 @@
22
3<node>3<node>
4 <interface name="com.ubuntu.connectivity1.Sim">4 <interface name="com.ubuntu.connectivity1.Sim">
5 <property name="Iccid" type="s" access="read" />
5 <property name="Imsi" type="s" access="read" />6 <property name="Imsi" type="s" access="read" />
6 <property name="PrimaryPhoneNumber" type="s" access="read" />7 <property name="PrimaryPhoneNumber" type="s" access="read" />
7 <property name="Locked" type="b" access="read" />8 <property name="Locked" type="b" access="read" />
89
=== modified file 'debian/control'
--- debian/control 2016-02-15 09:31:38 +0000
+++ debian/control 2016-06-22 09:42:47 +0000
@@ -12,7 +12,7 @@
12 graphviz,12 graphviz,
13 intltool,13 intltool,
14 libglib2.0-dev,14 libglib2.0-dev,
15 libgmenuharness-dev,15 libgmenuharness-dev (>= 0.1.1),
16 libqofono-dev,16 libqofono-dev,
17 libqofono-qt5-0,17 libqofono-qt5-0,
18 libqtdbusmock1-dev (>= 0.4),18 libqtdbusmock1-dev (>= 0.4),
1919
=== modified file 'src/connectivity-api/connectivity-qt/connectivityqt/connectivity.cpp'
--- src/connectivity-api/connectivity-qt/connectivityqt/connectivity.cpp 2016-06-22 09:42:47 +0000
+++ src/connectivity-api/connectivity-qt/connectivityqt/connectivity.cpp 2016-06-22 09:42:47 +0000
@@ -180,6 +180,7 @@
180 else if (name == "SimForMobileData")180 else if (name == "SimForMobileData")
181 {181 {
182 auto path = value.value<QDBusObjectPath>();182 auto path = value.value<QDBusObjectPath>();
183 p.sims();
183 auto sim = m_simsModel->getSimByPath(path);184 auto sim = m_simsModel->getSimByPath(path);
184 p.setSimForMobileData(sim.get());185 p.setSimForMobileData(sim.get());
185 }186 }
@@ -188,6 +189,7 @@
188 void simsUpdated()189 void simsUpdated()
189 {190 {
190 auto path = m_writePropertyCache->get("SimForMobileData").value<QDBusObjectPath>();191 auto path = m_writePropertyCache->get("SimForMobileData").value<QDBusObjectPath>();
192 p.sims();
191 auto sim = m_simsModel->getSimByPath(path);193 auto sim = m_simsModel->getSimByPath(path);
192 p.setSimForMobileData(sim.get());194 p.setSimForMobileData(sim.get());
193 }195 }
@@ -424,6 +426,7 @@
424426
425Sim *Connectivity::simForMobileData() const427Sim *Connectivity::simForMobileData() const
426{428{
429 sims();
427 return d->m_simForMobileData.get();430 return d->m_simForMobileData.get();
428}431}
429432
430433
=== modified file 'src/connectivity-api/connectivity-qt/connectivityqt/modem.cpp'
--- src/connectivity-api/connectivity-qt/connectivityqt/modem.cpp 2016-06-22 09:42:47 +0000
+++ src/connectivity-api/connectivity-qt/connectivityqt/modem.cpp 2016-06-22 09:42:47 +0000
@@ -43,14 +43,14 @@
43 {43 {
44 if (name == "Sim")44 if (name == "Sim")
45 {45 {
46 auto sim = m_sims->getSimByPath(value.value<QDBusObjectPath>());46 simsUpdated();
47 setSim(sim);
48 }47 }
49 }48 }
5049
51 void simsUpdated()50 void simsUpdated()
52 {51 {
53 auto sim = m_sims->getSimByPath(m_propertyCache->get("Sim").value<QDBusObjectPath>());52 auto path = m_propertyCache->get("Sim").value<QDBusObjectPath>();
53 auto sim = m_sims->getSimByPath(path);
54 setSim(sim);54 setSim(sim);
55 }55 }
5656
@@ -96,7 +96,7 @@
96 &internal::DBusPropertyCache::propertyChanged, d.get(),96 &internal::DBusPropertyCache::propertyChanged, d.get(),
97 &Priv::propertyChanged);97 &Priv::propertyChanged);
9898
99 d->m_sim = d->m_sims->getSimByPath(d->m_propertyCache->get("Sim").value<QDBusObjectPath>());99 d->simsUpdated();
100100
101 connect(d->m_sims.get(), &SimsListModel::simsUpdated, d.get(), &Priv::simsUpdated);101 connect(d->m_sims.get(), &SimsListModel::simsUpdated, d.get(), &Priv::simsUpdated);
102}102}
103103
=== modified file 'src/connectivity-api/connectivity-qt/connectivityqt/modems-list-model.cpp'
--- src/connectivity-api/connectivity-qt/connectivityqt/modems-list-model.cpp 2016-06-22 09:42:47 +0000
+++ src/connectivity-api/connectivity-qt/connectivityqt/modems-list-model.cpp 2016-06-22 09:42:47 +0000
@@ -77,7 +77,7 @@
77 p.beginInsertRows(QModelIndex(), m_modems.size(), m_modems.size() + toAdd.size() - 1);77 p.beginInsertRows(QModelIndex(), m_modems.size(), m_modems.size() + toAdd.size() - 1);
78 for (const auto& path: toAdd)78 for (const auto& path: toAdd)
79 {79 {
80 auto modem = std::make_shared<Modem>(path, m_propertyCache->connection(), m_sims, nullptr);80 auto modem = std::make_shared<Modem>(path, m_propertyCache->connection(), m_sims);
81 m_objectOwner(modem.get());81 m_objectOwner(modem.get());
82 m_modems << modem;82 m_modems << modem;
83 connect(modem.get(), &Modem::simChanged, this, &Priv::simChanged);83 connect(modem.get(), &Modem::simChanged, this, &Priv::simChanged);
@@ -178,6 +178,9 @@
178 case Roles::RoleSerial:178 case Roles::RoleSerial:
179 return modem->serial();179 return modem->serial();
180 break;180 break;
181 case Roles::RoleModem:
182 return QVariant::fromValue<Modem*>(modem.get());
183 break;
181 case Roles::RoleSim:184 case Roles::RoleSim:
182 return QVariant::fromValue<Sim*>(modem->sim());185 return QVariant::fromValue<Sim*>(modem->sim());
183 break;186 break;
184187
=== modified file 'src/connectivity-api/connectivity-qt/connectivityqt/modems-list-model.h'
--- src/connectivity-api/connectivity-qt/connectivityqt/modems-list-model.h 2016-06-22 09:42:47 +0000
+++ src/connectivity-api/connectivity-qt/connectivityqt/modems-list-model.h 2016-06-22 09:42:47 +0000
@@ -49,6 +49,7 @@
49 {49 {
50 RoleIndex = Qt::UserRole + 1,50 RoleIndex = Qt::UserRole + 1,
51 RoleSerial,51 RoleSerial,
52 RoleModem,
52 RoleSim53 RoleSim
53 };54 };
5455
@@ -67,6 +68,7 @@
67 QHash<int, QByteArray> roles;68 QHash<int, QByteArray> roles;
68 roles[RoleIndex] = "Index";69 roles[RoleIndex] = "Index";
69 roles[RoleSerial] = "Serial";70 roles[RoleSerial] = "Serial";
71 roles[RoleModem] = "Modem";
70 roles[RoleSim] = "Sim";72 roles[RoleSim] = "Sim";
71 return roles;73 return roles;
72 }74 }
7375
=== modified file 'src/connectivity-api/connectivity-qt/connectivityqt/sim.cpp'
--- src/connectivity-api/connectivity-qt/connectivityqt/sim.cpp 2016-06-22 09:42:47 +0000
+++ src/connectivity-api/connectivity-qt/connectivityqt/sim.cpp 2016-06-22 09:42:47 +0000
@@ -50,11 +50,16 @@
50 } else if (name == "DataRoamingEnabled")50 } else if (name == "DataRoamingEnabled")
51 {51 {
52 Q_EMIT p.dataRoamingEnabledChanged(value.toBool());52 Q_EMIT p.dataRoamingEnabledChanged(value.toBool());
53 } else if (name == "Imsi")
54 {
55 Q_EMIT p.imsiChanged(value.toString());
56 } else if (name == "PrimaryPhoneNumber")
57 {
58 Q_EMIT p.primaryPhoneNumberChanged(value.toString());
53 } else {59 } else {
54 qWarning() << "connectivityqt::Sim::Priv::propertyChanged(): "60 qWarning() << "connectivityqt::Sim::Priv::propertyChanged(): "
55 << "Unexpected property: " << name;61 << "Unexpected property: " << name;
56 }62 }
57
58 }63 }
5964
60public:65public:
@@ -92,6 +97,11 @@
92 return QDBusObjectPath(d->m_simInterface->path());97 return QDBusObjectPath(d->m_simInterface->path());
93}98}
9499
100QString Sim::iccid() const
101{
102 return d->m_propertyCache->get("Iccid").toString();
103}
104
95QString Sim::imsi() const105QString Sim::imsi() const
96{106{
97 return d->m_propertyCache->get("Imsi").toString();107 return d->m_propertyCache->get("Imsi").toString();
@@ -102,11 +112,6 @@
102 return d->m_propertyCache->get("PrimaryPhoneNumber").toString();112 return d->m_propertyCache->get("PrimaryPhoneNumber").toString();
103}113}
104114
105QList<QString> Sim::phoneNumbers() const
106{
107 return d->m_propertyCache->get("PhoneNumbers").toStringList();
108}
109
110bool Sim::locked() const115bool Sim::locked() const
111{116{
112 return d->m_propertyCache->get("Locked").toBool();117 return d->m_propertyCache->get("Locked").toBool();
113118
=== modified file 'src/connectivity-api/connectivity-qt/connectivityqt/sim.h'
--- src/connectivity-api/connectivity-qt/connectivityqt/sim.h 2016-06-22 09:42:47 +0000
+++ src/connectivity-api/connectivity-qt/connectivityqt/sim.h 2016-06-22 09:42:47 +0000
@@ -42,25 +42,25 @@
42 Q_PROPERTY(QDBusObjectPath path READ path)42 Q_PROPERTY(QDBusObjectPath path READ path)
43 QDBusObjectPath path() const;43 QDBusObjectPath path() const;
4444
45 Q_PROPERTY(QString Imsi READ imsi CONSTANT)45 Q_PROPERTY(QString Iccid READ iccid CONSTANT)
46 QString iccid() const;
47
48 Q_PROPERTY(QString Imsi READ imsi NOTIFY imsiChanged)
46 QString imsi() const;49 QString imsi() const;
4750
48 Q_PROPERTY(QString PrimaryPhoneNumber READ primaryPhoneNumber CONSTANT)51 Q_PROPERTY(QString PrimaryPhoneNumber READ primaryPhoneNumber NOTIFY primaryPhoneNumberChanged)
49 QString primaryPhoneNumber() const;52 QString primaryPhoneNumber() const;
5053
51 Q_PROPERTY(QList<QString> PhoneNumbers READ phoneNumbers CONSTANT)
52 QList<QString> phoneNumbers() const;
53
54 Q_PROPERTY(bool Locked READ locked NOTIFY lockedChanged)54 Q_PROPERTY(bool Locked READ locked NOTIFY lockedChanged)
55 bool locked() const;55 bool locked() const;
5656
57 Q_PROPERTY(bool Present READ present NOTIFY presentChanged)57 Q_PROPERTY(bool Present READ present NOTIFY presentChanged)
58 bool present() const;58 bool present() const;
5959
60 Q_PROPERTY(QString Mcc READ mcc CONSTANT)60 Q_PROPERTY(QString Mcc READ mcc NOTIFY mccChanged)
61 QString mcc() const;61 QString mcc() const;
6262
63 Q_PROPERTY(QString Mnc READ mnc CONSTANT)63 Q_PROPERTY(QString Mnc READ mnc NOTIFY mncChanged)
64 QString mnc() const;64 QString mnc() const;
6565
66 Q_PROPERTY(QList<QString> PreferredLanguages READ preferredLanguages CONSTANT)66 Q_PROPERTY(QList<QString> PreferredLanguages READ preferredLanguages CONSTANT)
@@ -78,7 +78,10 @@
78 void lockedChanged(bool value);78 void lockedChanged(bool value);
79 void presentChanged(bool value);79 void presentChanged(bool value);
80 void dataRoamingEnabledChanged(bool value);80 void dataRoamingEnabledChanged(bool value);
8181 void imsiChanged(const QString &value);
82 void primaryPhoneNumberChanged(const QString &value);
83 void mccChanged(const QString &value);
84 void mncChanged(const QString &value);
8285
83protected:86protected:
84 class Priv;87 class Priv;
8588
=== modified file 'src/connectivity-api/connectivity-qt/connectivityqt/sims-list-model.cpp'
--- src/connectivity-api/connectivity-qt/connectivityqt/sims-list-model.cpp 2016-06-22 09:42:47 +0000
+++ src/connectivity-api/connectivity-qt/connectivityqt/sims-list-model.cpp 2016-06-22 09:42:47 +0000
@@ -82,6 +82,10 @@
82 connect(sim.get(), &Sim::lockedChanged, this, &Priv::lockedChanged);82 connect(sim.get(), &Sim::lockedChanged, this, &Priv::lockedChanged);
83 connect(sim.get(), &Sim::presentChanged, this, &Priv::presentChanged);83 connect(sim.get(), &Sim::presentChanged, this, &Priv::presentChanged);
84 connect(sim.get(), &Sim::dataRoamingEnabledChanged, this, &Priv::dataRoamingEnabledChanged);84 connect(sim.get(), &Sim::dataRoamingEnabledChanged, this, &Priv::dataRoamingEnabledChanged);
85 connect(sim.get(), &Sim::imsiChanged, this, &Priv::imsiChanged);
86 connect(sim.get(), &Sim::primaryPhoneNumberChanged, this, &Priv::primaryPhoneNumberChanged);
87 connect(sim.get(), &Sim::mccChanged, this, &Priv::mccChanged);
88 connect(sim.get(), &Sim::mncChanged, this, &Priv::mncChanged);
85 }89 }
86 p.endInsertRows();90 p.endInsertRows();
87 }91 }
@@ -119,6 +123,26 @@
119 auto idx = findSim(sender());123 auto idx = findSim(sender());
120 p.dataChanged(idx, idx, {SimsListModel::Roles::RoleDataRoamingEnabled});124 p.dataChanged(idx, idx, {SimsListModel::Roles::RoleDataRoamingEnabled});
121 }125 }
126 void imsiChanged()
127 {
128 auto idx = findSim(sender());
129 p.dataChanged(idx, idx, {SimsListModel::Roles::RoleImsi});
130 }
131 void primaryPhoneNumberChanged()
132 {
133 auto idx = findSim(sender());
134 p.dataChanged(idx, idx, {SimsListModel::Roles::RolePrimaryPhoneNumber});
135 }
136 void mccChanged()
137 {
138 auto idx = findSim(sender());
139 p.dataChanged(idx, idx, {SimsListModel::Roles::RoleMcc});
140 }
141 void mncChanged()
142 {
143 auto idx = findSim(sender());
144 p.dataChanged(idx, idx, {SimsListModel::Roles::RoleMnc});
145 }
122146
123 void propertyChanged(const QString& name, const QVariant& value)147 void propertyChanged(const QString& name, const QVariant& value)
124 {148 {
@@ -183,15 +207,15 @@
183207
184 switch (role)208 switch (role)
185 {209 {
210 case Roles::RoleIccid:
211 return sim->iccid();
212 break;
186 case Roles::RoleImsi:213 case Roles::RoleImsi:
187 return sim->imsi();214 return sim->imsi();
188 break;215 break;
189 case Roles::RolePrimaryPhoneNumber:216 case Roles::RolePrimaryPhoneNumber:
190 return sim->primaryPhoneNumber();217 return sim->primaryPhoneNumber();
191 break;218 break;
192 case Roles::RolePhoneNumbers:
193 return QVariant::fromValue<QStringList>(sim->phoneNumbers());
194 break;
195 case RoleLocked:219 case RoleLocked:
196 return sim->locked();220 return sim->locked();
197 break;221 break;
@@ -209,7 +233,7 @@
209 case Roles::RoleDataRoamingEnabled:233 case Roles::RoleDataRoamingEnabled:
210 return sim->dataRoamingEnabled();234 return sim->dataRoamingEnabled();
211 break;235 break;
212 case Roles::RoleSimObject:236 case Roles::RoleSim:
213 return QVariant::fromValue<Sim*>(sim.get());237 return QVariant::fromValue<Sim*>(sim.get());
214 break;238 break;
215 }239 }
216240
=== modified file 'src/connectivity-api/connectivity-qt/connectivityqt/sims-list-model.h'
--- src/connectivity-api/connectivity-qt/connectivityqt/sims-list-model.h 2016-06-22 09:42:47 +0000
+++ src/connectivity-api/connectivity-qt/connectivityqt/sims-list-model.h 2016-06-22 09:42:47 +0000
@@ -47,16 +47,16 @@
4747
48 enum Roles48 enum Roles
49 {49 {
50 RoleImsi = Qt::UserRole + 1,50 RoleIccid = Qt::UserRole + 1,
51 RoleImsi,
51 RolePrimaryPhoneNumber,52 RolePrimaryPhoneNumber,
52 RolePhoneNumbers,
53 RoleLocked,53 RoleLocked,
54 RolePresent,54 RolePresent,
55 RoleMcc,55 RoleMcc,
56 RoleMnc,56 RoleMnc,
57 RolePreferredLanguages,57 RolePreferredLanguages,
58 RoleDataRoamingEnabled,58 RoleDataRoamingEnabled,
59 RoleSimObject59 RoleSim
60 };60 };
6161
62 SimsListModel(const internal::SimsListModelParameters& parameters);62 SimsListModel(const internal::SimsListModelParameters& parameters);
@@ -72,25 +72,22 @@
72 QHash<int, QByteArray> roleNames() const override72 QHash<int, QByteArray> roleNames() const override
73 {73 {
74 QHash<int, QByteArray> roles;74 QHash<int, QByteArray> roles;
75 roles[RoleIccid] = "Iccid";
75 roles[RoleImsi] = "Imsi";76 roles[RoleImsi] = "Imsi";
76 roles[RolePrimaryPhoneNumber] = "PrimaryPhoneNumber";77 roles[RolePrimaryPhoneNumber] = "PrimaryPhoneNumber";
77 roles[RolePhoneNumbers] = "PhoneNumbers";
78 roles[RoleLocked] = "Locked";78 roles[RoleLocked] = "Locked";
79 roles[RolePresent] = "Present";79 roles[RolePresent] = "Present";
80 roles[RoleMcc] = "Mcc";80 roles[RoleMcc] = "Mcc";
81 roles[RoleMnc] = "Mnc";81 roles[RoleMnc] = "Mnc";
82 roles[RolePreferredLanguages] = "PreferredLanguages";82 roles[RolePreferredLanguages] = "PreferredLanguages";
83 roles[RoleDataRoamingEnabled] = "DataRoamingEnabled";83 roles[RoleDataRoamingEnabled] = "DataRoamingEnabled";
84 roles[RoleSimObject] = "SimObject";84 roles[RoleSim] = "Sim";
85 return roles;85 return roles;
86 }86 }
8787
88 Sim::SPtr getSimByPath(const QDBusObjectPath &path) const;88 Sim::SPtr getSimByPath(const QDBusObjectPath &path) const;
8989
90public Q_SLOTS:
91
92Q_SIGNALS:90Q_SIGNALS:
93
94 void simsUpdated();91 void simsUpdated();
9592
96protected:93protected:
9794
=== modified file 'src/indicator/connectivity-service/connectivity-service.cpp'
--- src/indicator/connectivity-service/connectivity-service.cpp 2016-06-22 09:42:47 +0000
+++ src/indicator/connectivity-service/connectivity-service.cpp 2016-06-22 09:42:47 +0000
@@ -188,32 +188,37 @@
188188
189 void updateSims()189 void updateSims()
190 {190 {
191 auto current_imsis = m_sims.keys().toSet();191 auto current_iccids = m_sims.keys().toSet();
192
192 QMap<QString, nmofono::wwan::Sim::Ptr> sims;193 QMap<QString, nmofono::wwan::Sim::Ptr> sims;
193 for (auto i : m_manager->sims())194 for (auto i : m_manager->sims())
194 {195 {
195 sims[i->imsi()] = i;196 sims[i->iccid()] = i;
196 }197 }
197 auto toAdd(sims.keys().toSet());198 auto toAdd(sims.keys().toSet());
198 toAdd.subtract(current_imsis);199 toAdd.subtract(current_iccids);
199200
200 auto toRemove(current_imsis);201 auto toRemove(current_iccids);
201 toRemove.subtract(sims.keys().toSet());202 toRemove.subtract(sims.keys().toSet());
202203
203 for (auto imsi : toRemove)204 for (auto iccid : toRemove)
204 {205 {
205 m_sims.remove(imsi);206 m_sims.remove(iccid);
206 }207 }
207208
208 for (auto imsi : toAdd)209 for (auto iccid : toAdd)
209 {210 {
210 DBusSim::SPtr dbussim = make_shared<DBusSim>(sims[imsi], m_connection);211 DBusSim::SPtr dbussim = make_shared<DBusSim>(sims[iccid], m_connection);
211 m_sims[imsi] = dbussim;212 m_sims[iccid] = dbussim;
212 }213 }
213214
214 notifyPrivateProperties({215 if (!toRemove.isEmpty() || !toAdd.isEmpty())
215 "Sims"216 {
216 });217 notifyPrivateProperties({
218 "Sims"
219 });
220 flushProperties();
221 }
217 }222 }
218223
219 void updateModems()224 void updateModems()
@@ -244,9 +249,14 @@
244 updateModemSimPath(dbusmodem, m->sim());249 updateModemSimPath(dbusmodem, m->sim());
245 connect(m.get(), &wwan::Modem::simUpdated, this, &Private::modemSimUpdated);250 connect(m.get(), &wwan::Modem::simUpdated, this, &Private::modemSimUpdated);
246 }251 }
247 notifyPrivateProperties({252
248 "Modems"253 if (!toRemove.isEmpty() || !toAdd.isEmpty())
249 });254 {
255 notifyPrivateProperties({
256 "Modems"
257 });
258 flushProperties();
259 }
250 }260 }
251261
252 void modemSimUpdated()262 void modemSimUpdated()
@@ -259,11 +269,20 @@
259 {269 {
260 if (!sim)270 if (!sim)
261 {271 {
262 modem->setSim(QDBusObjectPath("/"));272 modem->setSim(QDBusObjectPath ("/"));
263 }273 }
264 else274 else
265 {275 {
266 modem->setSim(m_sims[sim->imsi()]->path());276 if (m_sims.contains (sim->iccid()))
277 {
278 auto dbusSim = m_sims[sim->iccid()];
279 modem->setSim(dbusSim->path());
280 }
281 else
282 {
283 qWarning() << "Could not find SIM with ICCID:"
284 << sim->iccid();
285 }
267 }286 }
268 }287 }
269288
@@ -634,8 +653,15 @@
634 return QDBusObjectPath("/");653 return QDBusObjectPath("/");
635 }654 }
636655
637 Q_ASSERT(p.d->m_sims.contains(sim->imsi()));656 if (p.d->m_sims.contains(sim->iccid()))
638 return p.d->m_sims[sim->imsi()]->path();657 {
658 return p.d->m_sims[sim->iccid()]->path();
659 }
660 else
661 {
662 qWarning() << "Could not find SIM for ICCID:" << sim->iccid();
663 return QDBusObjectPath("/");
664 }
639}665}
640666
641void PrivateService::setSimForMobileData(const QDBusObjectPath &path)667void PrivateService::setSimForMobileData(const QDBusObjectPath &path)
642668
=== modified file 'src/indicator/connectivity-service/dbus-modem.cpp'
--- src/indicator/connectivity-service/dbus-modem.cpp 2016-06-22 09:42:47 +0000
+++ src/indicator/connectivity-service/dbus-modem.cpp 2016-06-22 09:42:47 +0000
@@ -33,7 +33,7 @@
33 m_modem(modem),33 m_modem(modem),
34 m_connection(connection)34 m_connection(connection)
35{35{
36 m_path.setPath(DBusTypes::modemPath(m_modem->serial()));36 m_path.setPath(DBusTypes::modemPath());
3737
38 new ModemAdaptor(this);38 new ModemAdaptor(this);
3939
4040
=== modified file 'src/indicator/connectivity-service/dbus-sim.cpp'
--- src/indicator/connectivity-service/dbus-sim.cpp 2016-06-22 09:42:47 +0000
+++ src/indicator/connectivity-service/dbus-sim.cpp 2016-06-22 09:42:47 +0000
@@ -35,7 +35,7 @@
35 m_sim(sim),35 m_sim(sim),
36 m_connection(connection)36 m_connection(connection)
37{37{
38 m_path.setPath(DBusTypes::simPath(m_sim->imsi()));38 m_path.setPath(DBusTypes::simPath());
3939
40 new SimAdaptor(this);40 new SimAdaptor(this);
4141
@@ -44,6 +44,10 @@
44 connect(sim.get(), &Sim::lockedChanged, this, &DBusSim::lockedChanged);44 connect(sim.get(), &Sim::lockedChanged, this, &DBusSim::lockedChanged);
45 connect(sim.get(), &Sim::presentChanged, this, &DBusSim::presentChanged);45 connect(sim.get(), &Sim::presentChanged, this, &DBusSim::presentChanged);
46 connect(sim.get(), &Sim::dataRoamingEnabledChanged, this, &DBusSim::dataRoamingEnabledChanged);46 connect(sim.get(), &Sim::dataRoamingEnabledChanged, this, &DBusSim::dataRoamingEnabledChanged);
47 connect(sim.get(), &Sim::imsiChanged, this, &DBusSim::imsiChanged);
48 connect(sim.get(), &Sim::primaryPhoneNumberChanged, this, &DBusSim::primaryPhoneNumberChanged);
49 connect(sim.get(), &Sim::mccChanged, this, &DBusSim::mccChanged);
50 connect(sim.get(), &Sim::mncChanged, this, &DBusSim::mncChanged);
47}51}
4852
49DBusSim::~DBusSim()53DBusSim::~DBusSim()
@@ -74,6 +78,11 @@
74 );78 );
75}79}
7680
81QString DBusSim::iccid() const
82{
83 return m_sim->iccid();
84}
85
77QString DBusSim::imsi() const86QString DBusSim::imsi() const
78{87{
79 return m_sim->imsi();88 return m_sim->imsi();
@@ -139,6 +148,26 @@
139 notifyProperties({"DataRoamingEnabled"});148 notifyProperties({"DataRoamingEnabled"});
140}149}
141150
151void DBusSim::imsiChanged()
152{
153 notifyProperties({"Imsi"});
154}
155
156void DBusSim::primaryPhoneNumberChanged()
157{
158 notifyProperties({"PrimaryPhoneNumber"});
159}
160
161void DBusSim::mccChanged()
162{
163 notifyProperties({"Mcc"});
164}
165
166void DBusSim::mncChanged()
167{
168 notifyProperties({"Mnc"});
169}
170
142nmofono::wwan::Sim::Ptr DBusSim::sim() const171nmofono::wwan::Sim::Ptr DBusSim::sim() const
143{172{
144 return m_sim;173 return m_sim;
145174
=== modified file 'src/indicator/connectivity-service/dbus-sim.h'
--- src/indicator/connectivity-service/dbus-sim.h 2016-06-22 09:42:47 +0000
+++ src/indicator/connectivity-service/dbus-sim.h 2016-06-22 09:42:47 +0000
@@ -48,6 +48,9 @@
4848
49 virtual ~DBusSim();49 virtual ~DBusSim();
5050
51 Q_PROPERTY(QString Iccid READ iccid)
52 QString iccid() const;
53
51 Q_PROPERTY(QString Imsi READ imsi)54 Q_PROPERTY(QString Imsi READ imsi)
52 QString imsi() const;55 QString imsi() const;
5356
@@ -86,6 +89,10 @@
86 void lockedChanged();89 void lockedChanged();
87 void presentChanged();90 void presentChanged();
88 void dataRoamingEnabledChanged();91 void dataRoamingEnabledChanged();
92 void imsiChanged();
93 void primaryPhoneNumberChanged();
94 void mccChanged();
95 void mncChanged();
8996
90private:97private:
91 void notifyProperties(const QStringList& propertyNames);98 void notifyProperties(const QStringList& propertyNames);
9299
=== modified file 'src/indicator/factory.cpp'
--- src/indicator/factory.cpp 2016-06-22 09:42:47 +0000
+++ src/indicator/factory.cpp 2016-06-22 09:42:47 +0000
@@ -216,10 +216,10 @@
216 auto switch_r = s.get();216 auto switch_r = s.get();
217 auto manager_r = manager.get();217 auto manager_r = manager.get();
218 QObject::connect(manager_r, &nmofono::Manager::flightModeUpdated, switch_r, [manager_r, switch_r](bool value) {218 QObject::connect(manager_r, &nmofono::Manager::flightModeUpdated, switch_r, [manager_r, switch_r](bool value) {
219 switch_r->setEnabled(!value && manager_r->simForMobileData());219 switch_r->setEnabled(!value && manager_r->simForMobileData() && manager_r->simForMobileData()->present());
220 });220 });
221 QObject::connect(manager_r, &nmofono::Manager::simForMobileDataChanged, switch_r, [manager_r, switch_r]() {221 QObject::connect(manager_r, &nmofono::Manager::simForMobileDataChanged, switch_r, [manager_r, switch_r]() {
222 switch_r->setEnabled(!manager_r->flightMode() && manager_r->simForMobileData());222 switch_r->setEnabled(!manager_r->flightMode() && manager_r->simForMobileData() && manager_r->simForMobileData()->present());
223 });223 });
224224
225 return s;225 return s;
226226
=== modified file 'src/indicator/nmofono/connectivity-service-settings.cpp'
--- src/indicator/nmofono/connectivity-service-settings.cpp 2016-06-22 09:42:47 +0000
+++ src/indicator/nmofono/connectivity-service-settings.cpp 2016-06-22 09:42:47 +0000
@@ -19,6 +19,7 @@
1919
20#include <nmofono/connectivity-service-settings.h>20#include <nmofono/connectivity-service-settings.h>
2121
22using namespace std;
22using namespace nmofono;23using namespace nmofono;
2324
24class ConnectivityServiceSettings::Private : public QObject25class ConnectivityServiceSettings::Private : public QObject
@@ -27,16 +28,11 @@
27public:28public:
2829
29 ConnectivityServiceSettings &p;30 ConnectivityServiceSettings &p;
30 QSettings *m_settings;31 unique_ptr<QSettings> m_settings;
3132
32 Private(ConnectivityServiceSettings &parent)33 Private(ConnectivityServiceSettings &parent)
33 : p(parent)34 : p(parent)
34 {35 {
35 m_settings = new QSettings(QSettings::IniFormat,
36 QSettings::UserScope,
37 "Ubuntu",
38 "connectivityservice",
39 this);
40 }36 }
4137
42 virtual ~Private()38 virtual ~Private()
@@ -54,7 +50,19 @@
54 : QObject(parent),50 : QObject(parent),
55 d{new Private(*this)}51 d{new Private(*this)}
56{52{
5753 if (qEnvironmentVariableIsSet("INDICATOR_NETWORK_SETTINGS_PATH"))
54 {
55 // For testing only
56 QString path = QString::fromUtf8(qgetenv("INDICATOR_NETWORK_SETTINGS_PATH")) + "/config.ini";
57 d->m_settings = make_unique<QSettings>(path, QSettings::IniFormat);
58 }
59 else
60 {
61 d->m_settings = make_unique<QSettings>(QSettings::IniFormat,
62 QSettings::UserScope,
63 "connectivity-service",
64 "config");
65 }
58}66}
5967
60ConnectivityServiceSettings::~ConnectivityServiceSettings()68ConnectivityServiceSettings::~ConnectivityServiceSettings()
@@ -66,20 +74,20 @@
66{74{
67 return d->m_settings->value("MobileDataEnabled");75 return d->m_settings->value("MobileDataEnabled");
68}76}
77
69void ConnectivityServiceSettings::setMobileDataEnabled(bool value)78void ConnectivityServiceSettings::setMobileDataEnabled(bool value)
70{79{
71 d->m_settings->setValue("MobileDataEnabled", value);80 d->m_settings->setValue("MobileDataEnabled", value);
72 d->m_settings->sync();
73}81}
7482
75QVariant ConnectivityServiceSettings::simForMobileData()83QVariant ConnectivityServiceSettings::simForMobileData()
76{84{
77 return d->m_settings->value("SimForMobileData");85 return d->m_settings->value("SimForMobileData");
78}86}
79void ConnectivityServiceSettings::setSimForMobileData(const QString &imsi)87
88void ConnectivityServiceSettings::setSimForMobileData(const QString &iccid)
80{89{
81 d->m_settings->setValue("SimForMobileData", imsi);90 d->m_settings->setValue("SimForMobileData", iccid);
82 d->m_settings->sync();
83}91}
8492
85QStringList ConnectivityServiceSettings::knownSims()93QStringList ConnectivityServiceSettings::knownSims()
@@ -100,12 +108,12 @@
100void ConnectivityServiceSettings::setKnownSims(const QStringList &list)108void ConnectivityServiceSettings::setKnownSims(const QStringList &list)
101{109{
102 d->m_settings->setValue("KnownSims", QVariant(list));110 d->m_settings->setValue("KnownSims", QVariant(list));
103 d->m_settings->sync();
104}111}
105112
106wwan::Sim::Ptr ConnectivityServiceSettings::createSimFromSettings(const QString &imsi)113wwan::Sim::Ptr ConnectivityServiceSettings::createSimFromSettings(const QString &iccid)
107{114{
108 d->m_settings->beginGroup(QString("Sims/%1/").arg(imsi));115 d->m_settings->beginGroup(QString("Sims/%1/").arg(iccid));
116 QVariant imsi_var = d->m_settings->value("Imsi");
109 QVariant primaryPhoneNumber_var = d->m_settings->value("PrimaryPhoneNumber");117 QVariant primaryPhoneNumber_var = d->m_settings->value("PrimaryPhoneNumber");
110 QVariant mcc_var = d->m_settings->value("Mcc");118 QVariant mcc_var = d->m_settings->value("Mcc");
111 QVariant mnc_var = d->m_settings->value("Mnc");119 QVariant mnc_var = d->m_settings->value("Mnc");
@@ -113,19 +121,21 @@
113 QVariant dataRoamingEnabled_var = d->m_settings->value("DataRoamingEnabled");121 QVariant dataRoamingEnabled_var = d->m_settings->value("DataRoamingEnabled");
114 d->m_settings->endGroup();122 d->m_settings->endGroup();
115123
116 if (imsi.isNull() ||124 if (iccid.isNull() ||
125 imsi_var.isNull() ||
117 primaryPhoneNumber_var.isNull() ||126 primaryPhoneNumber_var.isNull() ||
118 mcc_var.isNull() ||127 mcc_var.isNull() ||
119 mnc_var.isNull() ||128 mnc_var.isNull() ||
120 preferredLanguages_var.isNull() ||129 preferredLanguages_var.isNull() ||
121 dataRoamingEnabled_var.isNull())130 dataRoamingEnabled_var.isNull())
122 {131 {
123 qWarning() << "Corrupt settings for SIM: " << imsi;132 qWarning() << "Corrupt settings for SIM: " << iccid;
124 d->m_settings->remove(QString("Sims/%1/").arg(imsi));133 d->m_settings->remove(QString("Sims/%1/").arg(iccid));
125 return wwan::Sim::Ptr();134 return wwan::Sim::Ptr();
126 }135 }
127136
128 return wwan::Sim::Ptr(new wwan::Sim(imsi,137 return wwan::Sim::Ptr(new wwan::Sim(iccid,
138 imsi_var.toString(),
129 primaryPhoneNumber_var.toString(),139 primaryPhoneNumber_var.toString(),
130 mcc_var.toString(),140 mcc_var.toString(),
131 mnc_var.toString(),141 mnc_var.toString(),
@@ -135,14 +145,14 @@
135145
136void ConnectivityServiceSettings::saveSimToSettings(wwan::Sim::Ptr sim)146void ConnectivityServiceSettings::saveSimToSettings(wwan::Sim::Ptr sim)
137{147{
138 d->m_settings->beginGroup(QString("Sims/%1/").arg(sim->imsi()));148 d->m_settings->beginGroup(QString("Sims/%1/").arg(sim->iccid()));
139 d->m_settings->setValue("PrimaryPhoneNumber", QVariant(sim->primaryPhoneNumber()));149 d->m_settings->setValue("Imsi", sim->imsi());
150 d->m_settings->setValue("PrimaryPhoneNumber", sim->primaryPhoneNumber());
140 d->m_settings->setValue("Mcc", sim->mcc());151 d->m_settings->setValue("Mcc", sim->mcc());
141 d->m_settings->setValue("Mnc", sim->mnc());152 d->m_settings->setValue("Mnc", sim->mnc());
142 d->m_settings->setValue("PreferredLanguages", QVariant(sim->preferredLanguages()));153 d->m_settings->setValue("PreferredLanguages", QVariant(sim->preferredLanguages()));
143 d->m_settings->setValue("DataRoamingEnabled", sim->dataRoamingEnabled());154 d->m_settings->setValue("DataRoamingEnabled", sim->dataRoamingEnabled());
144 d->m_settings->endGroup();155 d->m_settings->endGroup();
145 d->m_settings->sync();
146}156}
147157
148#include "connectivity-service-settings.moc"158#include "connectivity-service-settings.moc"
149159
=== modified file 'src/indicator/nmofono/connectivity-service-settings.h'
--- src/indicator/nmofono/connectivity-service-settings.h 2016-06-22 09:42:47 +0000
+++ src/indicator/nmofono/connectivity-service-settings.h 2016-06-22 09:42:47 +0000
@@ -50,12 +50,12 @@
50 void setMobileDataEnabled(bool value);50 void setMobileDataEnabled(bool value);
5151
52 QVariant simForMobileData();52 QVariant simForMobileData();
53 void setSimForMobileData(const QString &imsi);53 void setSimForMobileData(const QString &iccid);
5454
55 QStringList knownSims();55 QStringList knownSims();
56 void setKnownSims(const QStringList &list);56 void setKnownSims(const QStringList &list);
5757
58 wwan::Sim::Ptr createSimFromSettings(const QString &imsi);58 wwan::Sim::Ptr createSimFromSettings(const QString &iccid);
59 void saveSimToSettings(wwan::Sim::Ptr sim);59 void saveSimToSettings(wwan::Sim::Ptr sim);
6060
61public Q_SLOTS:61public Q_SLOTS:
6262
=== modified file 'src/indicator/nmofono/manager-impl.cpp'
--- src/indicator/nmofono/manager-impl.cpp 2016-06-22 09:42:47 +0000
+++ src/indicator/nmofono/manager-impl.cpp 2016-06-22 09:42:47 +0000
@@ -96,58 +96,11 @@
96 Private(Manager& parent) :96 Private(Manager& parent) :
97 p(parent)97 p(parent)
98 {98 {
99 m_settings = std::make_shared<ConnectivityServiceSettings>();
100
101 m_simManager = make_shared<wwan::SimManager>(m_settings);
102 m_sims = m_simManager->knownSims();
103 connect(m_simManager.get(), &wwan::SimManager::simAdded, this, &Private::simAdded);
104
105 QVariant ret = m_settings->mobileDataEnabled();
106 if (ret.isNull())
107 {
108 /* This is the first time we are running on a system.
109 *
110 * We need to figure out the status of mobile data from looking
111 * at the individual modems.
112 */
113 m_mobileDataEnabledPending = true;
114 m_settings->setMobileDataEnabled(false);
115 }
116 else
117 {
118 m_mobileDataEnabled = ret.toBool();
119 }
120
121 ret = m_settings->simForMobileData();
122 if (ret.isNull())
123 {
124 /* This is the first time we are running on a system.
125 *
126 * We need to figure out the SIM used for mobile data
127 * from the individual modems.
128 */
129 m_simForMobileDataPending = true;
130 m_settings->setSimForMobileData(QString());
131 }
132 else
133 {
134 QString imsi = ret.toString();
135 wwan::Sim::Ptr sim;
136 for(auto i = m_sims.begin(); i != m_sims.end(); i++)
137 {
138 if ((*i)->imsi() == imsi) {
139 sim = *i;
140 break;
141 }
142 }
143 m_simForMobileData = sim;
144 }
145
146 }99 }
147100
148 void matchModemsAndSims()101 void matchModemsAndSims()
149 {102 {
150 for (wwan::Modem::Ptr modem: m_modems)103 for (wwan::Modem::Ptr modem: m_ofonoLinks)
151 {104 {
152 bool match = false;105 bool match = false;
153 for(wwan::Sim::Ptr sim : m_sims)106 for(wwan::Sim::Ptr sim : m_sims)
@@ -169,8 +122,31 @@
169 void simAdded(wwan::Sim::Ptr sim)122 void simAdded(wwan::Sim::Ptr sim)
170 {123 {
171 m_sims.append(sim);124 m_sims.append(sim);
172 matchModemsAndSims();125 connect(sim.get(), &wwan::Sim::presentChanged, this, &Private::matchModemsAndSims);
173 Q_EMIT p.simsChanged();126 Q_EMIT p.simsChanged();
127 matchModemsAndSims();
128 }
129
130 void initialDataOnSet()
131 {
132 wwan::Sim *sim_raw = qobject_cast<wwan::Sim*>(sender());
133 if (!sim_raw)
134 {
135 Q_ASSERT(0);
136 return;
137 }
138 wwan::Sim::Ptr sim = sim_raw->shared_from_this();
139
140 if (!m_mobileDataEnabledPending && !m_simForMobileDataPending)
141 {
142 return;
143 }
144
145 if (sim->initialDataOn())
146 {
147 setMobileDataEnabled(true);
148 setSimForMobileData(sim);
149 }
174 }150 }
175151
176 void modemReady()152 void modemReady()
@@ -181,8 +157,21 @@
181 Q_ASSERT(0);157 Q_ASSERT(0);
182 return;158 return;
183 }159 }
184 m_modems.append(m_ofonoLinks[modem_raw->name()]);160 auto modem = m_ofonoLinks[modem_raw->name()];
185 matchModemsAndSims();161 if (!modem->sim())
162 {
163 matchModemsAndSims();
164 }
165
166 if (m_mobileDataEnabledPending || m_simForMobileDataPending)
167 {
168 connect(modem->sim().get(), &wwan::Sim::initialDataOnSet, this, &Private::initialDataOnSet);
169 if (modem->sim()->initialDataOn())
170 {
171 modem->sim()->initialDataOnSet();
172 }
173 }
174 m_modems.append(modem);
186 Q_EMIT p.modemsChanged();175 Q_EMIT p.modemsChanged();
187 }176 }
188177
@@ -197,6 +186,50 @@
197 Q_EMIT p.unstoppableOperationHappeningUpdated(m_unstoppableOperationHappening);186 Q_EMIT p.unstoppableOperationHappeningUpdated(m_unstoppableOperationHappening);
198 }187 }
199188
189 void loadSettings()
190 {
191 QVariant ret = m_settings->mobileDataEnabled();
192 if (ret.isNull())
193 {
194 /* This is the first time we are running on a system.
195 *
196 * We need to figure out the status of mobile data from looking
197 * at the individual modems.
198 */
199 m_mobileDataEnabledPending = true;
200 m_settings->setMobileDataEnabled(false);
201 }
202 else
203 {
204 setMobileDataEnabled(ret.toBool());
205 }
206
207 ret = m_settings->simForMobileData();
208 if (ret.isNull())
209 {
210 /* This is the first time we are running on a system.
211 *
212 * We need to figure out the SIM used for mobile data
213 * from the individual modems.
214 */
215 m_simForMobileDataPending = true;
216 m_settings->setSimForMobileData(QString());
217 }
218 else
219 {
220 QString iccid = ret.toString();
221 wwan::Sim::Ptr sim;
222 for(auto i = m_sims.begin(); i != m_sims.end(); i++)
223 {
224 if ((*i)->iccid() == iccid) {
225 sim = *i;
226 break;
227 }
228 }
229 setSimForMobileData(sim);
230 }
231 }
232
200public Q_SLOTS:233public Q_SLOTS:
201 void updateHasWifi()234 void updateHasWifi()
202 {235 {
@@ -316,7 +349,6 @@
316 m_ofonoLinks[path] = modem;349 m_ofonoLinks[path] = modem;
317 connect(modem.get(), &wwan::Modem::readyToUnlock, this, &Private::modemReadyToUnlock);350 connect(modem.get(), &wwan::Modem::readyToUnlock, this, &Private::modemReadyToUnlock);
318 connect(modem.get(), &wwan::Modem::ready, this, &Private::modemReady);351 connect(modem.get(), &wwan::Modem::ready, this, &Private::modemReady);
319 matchModemsAndSims();
320 }352 }
321353
322 Q_EMIT p.linksUpdated();354 Q_EMIT p.linksUpdated();
@@ -326,10 +358,11 @@
326 }358 }
327359
328 void setMobileDataEnabled(bool value) {360 void setMobileDataEnabled(bool value) {
329 if (m_mobileDataEnabled == value)361 if (m_mobileDataEnabled == value && !m_mobileDataEnabledPending)
330 {362 {
331 return;363 return;
332 }364 }
365 m_mobileDataEnabledPending = false;
333366
334 m_settings->setMobileDataEnabled(value);367 m_settings->setMobileDataEnabled(value);
335 m_mobileDataEnabled = value;368 m_mobileDataEnabled = value;
@@ -357,10 +390,14 @@
357 }390 }
358391
359 void setSimForMobileData(wwan::Sim::Ptr sim) {392 void setSimForMobileData(wwan::Sim::Ptr sim) {
360 if (m_simForMobileData == sim)393 if (m_simForMobileData == sim && !m_simForMobileDataPending)
361 {394 {
362 return;395 return;
363 }396 }
397 if (m_simForMobileDataPending) {
398 m_simForMobileDataPending = false;
399 setMobileDataEnabled(m_mobileDataEnabled);
400 }
364401
365 if (m_simForMobileData)402 if (m_simForMobileData)
366 {403 {
@@ -373,14 +410,14 @@
373 }410 }
374 else411 else
375 {412 {
376 m_settings->setSimForMobileData(sim->imsi());413 m_settings->setSimForMobileData(sim->iccid());
377 }414 }
378415
379416
380 m_simForMobileData = sim;417 m_simForMobileData = sim;
381 if (m_simForMobileData)418 if (m_simForMobileData)
382 {419 {
383 m_simForMobileData->setMobileDataEnabled(p.mobileDataEnabled());420 m_simForMobileData->setMobileDataEnabled(m_mobileDataEnabled);
384 }421 }
385422
386 Q_EMIT p.simForMobileDataChanged();423 Q_EMIT p.simForMobileDataChanged();
@@ -428,6 +465,17 @@
428 connect(d->m_unlockDialog.get(), &SimUnlockDialog::ready, d.get(), &Private::sim_unlock_ready);465 connect(d->m_unlockDialog.get(), &SimUnlockDialog::ready, d.get(), &Private::sim_unlock_ready);
429466
430 d->m_ofono = make_shared<QOfonoManager>();467 d->m_ofono = make_shared<QOfonoManager>();
468
469 // Load the SIM manager before we connect to the signals
470 d->m_settings = make_shared<ConnectivityServiceSettings>();
471 d->m_simManager = make_shared<wwan::SimManager>(d->m_ofono, d->m_settings);
472 connect(d->m_simManager.get(), &wwan::SimManager::simAdded, d.get(), &Private::simAdded);
473 d->m_sims = d->m_simManager->knownSims();
474 for (auto sim : d->m_sims)
475 {
476 connect(sim.get(), &wwan::Sim::presentChanged, d.get(), &Private::matchModemsAndSims);
477 }
478
431 connect(d->m_ofono.get(), &QOfonoManager::modemsChanged, d.get(), &Private::modems_changed);479 connect(d->m_ofono.get(), &QOfonoManager::modemsChanged, d.get(), &Private::modems_changed);
432 d->modems_changed(d->m_ofono->modems());480 d->modems_changed(d->m_ofono->modems());
433481
@@ -460,6 +508,8 @@
460 /// @todo set by the default connections.508 /// @todo set by the default connections.
461 d->m_characteristics = Link::Characteristics::empty;509 d->m_characteristics = Link::Characteristics::empty;
462510
511 d->loadSettings();
512
463 d->updateHasWifi();513 d->updateHasWifi();
464}514}
465515
466516
=== modified file 'src/indicator/nmofono/wwan/modem.cpp'
--- src/indicator/nmofono/wwan/modem.cpp 2016-06-22 09:42:47 +0000
+++ src/indicator/nmofono/wwan/modem.cpp 2016-06-22 09:42:47 +0000
@@ -99,6 +99,8 @@
9999
100 QString m_serial;100 QString m_serial;
101 bool m_serialSet = false;101 bool m_serialSet = false;
102 bool m_presentSet = false;
103 bool m_present = false;
102 bool m_readyFired = false;104 bool m_readyFired = false;
103105
104 QString m_operatorName;106 QString m_operatorName;
@@ -169,6 +171,19 @@
169171
170 if (m_serialSet && !m_readyFired)172 if (m_serialSet && !m_readyFired)
171 {173 {
174 if (!m_simManager)
175 {
176 return;
177 }
178
179 if (!m_sim)
180 {
181 if (!m_presentSet)
182 {
183 return;
184 }
185 }
186
172 m_readyFired = true;187 m_readyFired = true;
173 Q_EMIT p.ready();188 Q_EMIT p.ready();
174 }189 }
@@ -267,11 +282,22 @@
267 connect(m_simManager.get(),282 connect(m_simManager.get(),
268 &QOfonoSimManager::resetPinComplete, this,283 &QOfonoSimManager::resetPinComplete, this,
269 &Private::resetPinComplete);284 &Private::resetPinComplete);
285
286 connect(m_simManager.get(),
287 &QOfonoSimManager::presenceChanged, this,
288 &Private::presentChanged);
270 }289 }
271290
272 update();291 update();
273 }292 }
274293
294 void presentChanged()
295 {
296 m_presentSet = true;
297 m_present = m_simManager->present();
298 update();
299 }
300
275 void update()301 void update()
276 {302 {
277 setOnline(m_ofonoModem->online());303 setOnline(m_ofonoModem->online());
@@ -781,6 +807,7 @@
781 }807 }
782 d->m_sim = sim;808 d->m_sim = sim;
783 Q_EMIT simUpdated();809 Q_EMIT simUpdated();
810 d->update();
784}811}
785812
786QString813QString
787814
=== modified file 'src/indicator/nmofono/wwan/qofono-sim-wrapper.cpp'
--- src/indicator/nmofono/wwan/qofono-sim-wrapper.cpp 2016-06-22 09:42:47 +0000
+++ src/indicator/nmofono/wwan/qofono-sim-wrapper.cpp 2016-06-22 09:42:47 +0000
@@ -41,18 +41,12 @@
41 QOfonoSimWrapper& p;41 QOfonoSimWrapper& p;
42 shared_ptr<QOfonoSimManager> m_simManager;42 shared_ptr<QOfonoSimManager> m_simManager;
4343
44 QString m_imsi;44 QString m_iccid;
45 QStringList m_phoneNumbers;
46 QString m_mcc;
47 QString m_mnc;
48 QStringList m_preferredLanguages;45 QStringList m_preferredLanguages;
4946
50 bool m_present = false;47 bool m_present = false;
5148
52 bool m_imsiSet = false;49 bool m_iccidSet = false;
53 bool m_phoneNumbersSet = false;
54 bool m_mccSet = false;
55 bool m_mncSet = false;
56 bool m_preferredLanguagesSet = false;50 bool m_preferredLanguagesSet = false;
5751
5852
@@ -60,10 +54,7 @@
60 : p(parent), m_simManager{simmgr}54 : p(parent), m_simManager{simmgr}
61 {55 {
62 connect(simmgr.get(), &QOfonoSimManager::presenceChanged, this, &Private::presentChanged);56 connect(simmgr.get(), &QOfonoSimManager::presenceChanged, this, &Private::presentChanged);
63 connect(simmgr.get(), &QOfonoSimManager::subscriberIdentityChanged, this, &Private::imsiChanged);57 connect(simmgr.get(), &QOfonoSimManager::cardIdentifierChanged, this, &Private::iccidChanged);
64 connect(simmgr.get(), &QOfonoSimManager::mobileCountryCodeChanged, this, &Private::mccChanged);
65 connect(simmgr.get(), &QOfonoSimManager::mobileNetworkCodeChanged, this, &Private::mncChanged);
66 connect(simmgr.get(), &QOfonoSimManager::subscriberNumbersChanged, this, &Private::phoneNumbersChanged);
67 connect(simmgr.get(), &QOfonoSimManager::preferredLanguagesChanged, this, &Private::preferredLanguagesChanged);58 connect(simmgr.get(), &QOfonoSimManager::preferredLanguagesChanged, this, &Private::preferredLanguagesChanged);
68 }59 }
6960
@@ -78,92 +69,27 @@
78 m_present = value;69 m_present = value;
79 if (!m_present)70 if (!m_present)
80 {71 {
81 m_imsiSet = false;72 m_iccidSet = false;
82 m_phoneNumbersSet = false;
83 m_mccSet = false;
84 m_mncSet = false;
85 m_preferredLanguagesSet = false;73 m_preferredLanguagesSet = false;
86 Q_EMIT p.readyChanged(false);74 Q_EMIT p.readyChanged(false);
87 }75 }
88 Q_EMIT p.presentChanged(value);76 Q_EMIT p.presentChanged(value);
89 }77 }
9078
91 void imsiChanged(const QString &value)79 void iccidChanged(const QString &value)
92 {80 {
93 if (value.isEmpty())81 if (value.isEmpty())
94 {82 {
95 return;83 return;
96 }84 }
9785
98 if (m_imsiSet)86 if (m_iccidSet)
99 {87 {
100 qWarning() << "Unexpected update on IMSI: " << m_imsi << ", " << value;88 qWarning() << "Unexpected update on ICCID: " << m_iccid << ", " << value;
101 }89 }
10290
103 m_imsi = value;91 m_iccid = value;
104 m_imsiSet = true;92 m_iccidSet = true;
105 if (p.ready())
106 {
107 Q_EMIT p.readyChanged(true);
108 }
109 }
110
111 void mccChanged(const QString &value)
112 {
113 if (value.isEmpty())
114 {
115 return;
116 }
117
118 if (m_mccSet)
119 {
120 qWarning() << "Unexpected update on MCC: " << m_mcc << ", " << value;
121 }
122
123
124 m_mcc = value;
125 m_mccSet = true;
126 if (p.ready())
127 {
128 Q_EMIT p.readyChanged(true);
129 }
130 }
131
132 void mncChanged(const QString &value)
133 {
134 if (value.isEmpty())
135 {
136 return;
137 }
138
139 if (m_mncSet)
140 {
141 qWarning() << "Unexpected update on MNC: " << m_mnc << ", " << value;
142 }
143
144 m_mnc = value;
145 m_mncSet = true;
146 if (p.ready())
147 {
148 Q_EMIT p.readyChanged(true);
149 }
150 }
151
152 void phoneNumbersChanged(const QStringList &value)
153 {
154 if (value.isEmpty())
155 {
156 return;
157 }
158
159 if (m_phoneNumbersSet)
160 {
161 qWarning() << "Unexpected update on Phone Numbers: " << m_phoneNumbers << ", " << value;
162 }
163
164
165 m_phoneNumbers = value;
166 m_phoneNumbersSet = true;
167 if (p.ready())93 if (p.ready())
168 {94 {
169 Q_EMIT p.readyChanged(true);95 Q_EMIT p.readyChanged(true);
@@ -202,9 +128,9 @@
202QOfonoSimWrapper::~QOfonoSimWrapper()128QOfonoSimWrapper::~QOfonoSimWrapper()
203{}129{}
204130
205QString QOfonoSimWrapper::imsi() const131QString QOfonoSimWrapper::iccid() const
206{132{
207 return d->m_imsi;133 return d->m_iccid;
208}134}
209135
210bool QOfonoSimWrapper::present() const136bool QOfonoSimWrapper::present() const
@@ -212,20 +138,6 @@
212 return d->m_present;138 return d->m_present;
213}139}
214140
215QString QOfonoSimWrapper::mcc() const
216{
217 return d->m_mcc;
218}
219
220QString QOfonoSimWrapper::mnc() const
221{
222 return d->m_mnc;
223}
224
225QStringList QOfonoSimWrapper::phoneNumbers() const
226{
227 return d->m_phoneNumbers;
228}
229141
230QStringList QOfonoSimWrapper::preferredLanguages() const142QStringList QOfonoSimWrapper::preferredLanguages() const
231{143{
@@ -233,10 +145,7 @@
233}145}
234146
235bool QOfonoSimWrapper::ready() const {147bool QOfonoSimWrapper::ready() const {
236 return d->m_imsiSet &&148 return d->m_iccidSet &&
237 d->m_phoneNumbersSet &&
238 d->m_mccSet &&
239 d->m_mncSet &&
240 d->m_preferredLanguagesSet;149 d->m_preferredLanguagesSet;
241}150}
242151
243152
=== modified file 'src/indicator/nmofono/wwan/qofono-sim-wrapper.h'
--- src/indicator/nmofono/wwan/qofono-sim-wrapper.h 2016-06-22 09:42:47 +0000
+++ src/indicator/nmofono/wwan/qofono-sim-wrapper.h 2016-06-22 09:42:47 +0000
@@ -56,11 +56,8 @@
56 QOfonoSimWrapper(std::shared_ptr<QOfonoSimManager> simmgr);56 QOfonoSimWrapper(std::shared_ptr<QOfonoSimManager> simmgr);
57 ~QOfonoSimWrapper();57 ~QOfonoSimWrapper();
5858
59 QString imsi() const;59 QString iccid() const;
60 bool present() const;60 bool present() const;
61 QString mcc() const;
62 QString mnc() const;
63 QStringList phoneNumbers() const;
64 QStringList preferredLanguages() const;61 QStringList preferredLanguages() const;
65 bool ready() const;62 bool ready() const;
6663
6764
=== modified file 'src/indicator/nmofono/wwan/sim-manager.cpp'
--- src/indicator/nmofono/wwan/sim-manager.cpp 2016-06-22 09:42:47 +0000
+++ src/indicator/nmofono/wwan/sim-manager.cpp 2016-06-22 09:42:47 +0000
@@ -55,24 +55,9 @@
5555
56 ConnectivityServiceSettings::Ptr m_settings;56 ConnectivityServiceSettings::Ptr m_settings;
5757
58 Private(SimManager& parent, ConnectivityServiceSettings::Ptr settings)58 Private(SimManager& parent)
59 : p(parent),59 : p(parent)
60 m_settings(settings)
61 {60 {
62 QStringList imsis = m_settings->knownSims();
63 for(auto imsi : imsis) {
64 auto sim = m_settings->createSimFromSettings(imsi);
65 connect(sim.get(), &Sim::dataRoamingEnabledChanged, this, &Private::simDataRoamingEnabledChanged);
66 if (!sim)
67 {
68 continue;
69 }
70 m_knownSims[sim->imsi()] = sim;
71 }
72
73 m_ofono = make_shared<QOfonoManager>();
74 connect(m_ofono.get(), &QOfonoManager::modemsChanged, this, &Private::modemsChanged);
75 modemsChanged(m_ofono->modems());
76 }61 }
7762
78public Q_SLOTS:63public Q_SLOTS:
@@ -99,9 +84,9 @@
99 if (m_wrappers.contains(path))84 if (m_wrappers.contains(path))
100 {85 {
101 auto wrapper = m_wrappers[path];86 auto wrapper = m_wrappers[path];
102 if (m_knownSims.contains(wrapper->imsi()))87 if (m_knownSims.contains(wrapper->iccid()))
103 {88 {
104 auto sim = m_knownSims[wrapper->imsi()];89 auto sim = m_knownSims[wrapper->iccid()];
105 sim->setOfonoSimManager(std::shared_ptr<QOfonoSimManager>());90 sim->setOfonoSimManager(std::shared_ptr<QOfonoSimManager>());
106 }91 }
107 m_wrappers.remove(path);92 m_wrappers.remove(path);
@@ -153,9 +138,9 @@
153 if (m_wrappers.contains(modem->modemPath()))138 if (m_wrappers.contains(modem->modemPath()))
154 {139 {
155 auto wrapper = m_wrappers[modem->modemPath()];140 auto wrapper = m_wrappers[modem->modemPath()];
156 if (m_knownSims.contains(wrapper->imsi()))141 if (m_knownSims.contains(wrapper->iccid()))
157 {142 {
158 auto sim = m_knownSims[wrapper->imsi()];143 auto sim = m_knownSims[wrapper->iccid()];
159 sim->setOfonoSimManager(std::shared_ptr<QOfonoSimManager>());144 sim->setOfonoSimManager(std::shared_ptr<QOfonoSimManager>());
160 }145 }
161 m_wrappers.remove(modem->modemPath());146 m_wrappers.remove(modem->modemPath());
@@ -174,9 +159,9 @@
174159
175 if (!present)160 if (!present)
176 {161 {
177 if (m_knownSims.contains(wrapper->imsi()))162 if (m_knownSims.contains(wrapper->iccid()))
178 {163 {
179 auto sim = m_knownSims[wrapper->imsi()];164 auto sim = m_knownSims[wrapper->iccid()];
180 sim->setOfonoSimManager(std::shared_ptr<QOfonoSimManager>());165 sim->setOfonoSimManager(std::shared_ptr<QOfonoSimManager>());
181 }166 }
182 }167 }
@@ -200,7 +185,7 @@
200 bool found = false;185 bool found = false;
201 for (auto i : m_knownSims.values())186 for (auto i : m_knownSims.values())
202 {187 {
203 if (wrapper->imsi() == i->imsi())188 if (wrapper->iccid() == i->iccid())
204 {189 {
205 found = true;190 found = true;
206 i->setOfonoSimManager(wrapper->ofonoSimManager());191 i->setOfonoSimManager(wrapper->ofonoSimManager());
@@ -212,7 +197,7 @@
212 auto sim = Sim::fromQOfonoSimWrapper(wrapper);197 auto sim = Sim::fromQOfonoSimWrapper(wrapper);
213 connect(sim.get(), &Sim::dataRoamingEnabledChanged, this, &Private::simDataRoamingEnabledChanged);198 connect(sim.get(), &Sim::dataRoamingEnabledChanged, this, &Private::simDataRoamingEnabledChanged);
214 m_settings->saveSimToSettings(sim);199 m_settings->saveSimToSettings(sim);
215 m_knownSims[sim->imsi()] = sim;200 m_knownSims[sim->iccid()] = sim;
216 m_settings->setKnownSims(m_knownSims.keys());201 m_settings->setKnownSims(m_knownSims.keys());
217 Q_EMIT p.simAdded(sim);202 Q_EMIT p.simAdded(sim);
218 }203 }
@@ -228,22 +213,37 @@
228 Q_ASSERT(0);213 Q_ASSERT(0);
229 return;214 return;
230 }215 }
231 auto sim = m_knownSims[sim_raw->imsi()];216 if (!m_knownSims.contains(sim_raw->iccid()))
217 {
218 Q_ASSERT(0);
219 return;
220 }
221 m_settings->saveSimToSettings(m_knownSims[sim_raw->iccid()]);
222 }
223
224};
225
226
227
228SimManager::SimManager(shared_ptr<QOfonoManager> ofono, ConnectivityServiceSettings::Ptr settings)
229 : d{new Private(*this)}
230{
231 d->m_ofono = ofono;
232 d->m_settings = settings;
233
234 QStringList iccids = d->m_settings->knownSims();
235 for(auto iccid : iccids) {
236 auto sim = d->m_settings->createSimFromSettings(iccid);
237 connect(sim.get(), &Sim::dataRoamingEnabledChanged, d.get(), &Private::simDataRoamingEnabledChanged);
232 if (!sim)238 if (!sim)
233 {239 {
234 Q_ASSERT(0);240 continue;
235 return;
236 }241 }
237 m_settings->saveSimToSettings(sim);242 d->m_knownSims[sim->iccid()] = sim;
238 }243 }
239244
240};245 connect(d->m_ofono.get(), &QOfonoManager::modemsChanged, d.get(), &Private::modemsChanged);
241246 d->modemsChanged(d->m_ofono->modems());
242
243
244SimManager::SimManager(ConnectivityServiceSettings::Ptr settings)
245 : d{new Private(*this, settings)}
246{
247}247}
248248
249SimManager::~SimManager()249SimManager::~SimManager()
250250
=== modified file 'src/indicator/nmofono/wwan/sim-manager.h'
--- src/indicator/nmofono/wwan/sim-manager.h 2016-06-22 09:42:47 +0000
+++ src/indicator/nmofono/wwan/sim-manager.h 2016-06-22 09:42:47 +0000
@@ -27,6 +27,8 @@
27#include "sim.h"27#include "sim.h"
28#include <nmofono/connectivity-service-settings.h>28#include <nmofono/connectivity-service-settings.h>
2929
30class QOfonoManager;
31
30namespace nmofono32namespace nmofono
31{33{
32namespace wwan34namespace wwan
@@ -44,7 +46,7 @@
44 typedef std::shared_ptr<SimManager> Ptr;46 typedef std::shared_ptr<SimManager> Ptr;
45 typedef std::weak_ptr<SimManager> WeakPtr;47 typedef std::weak_ptr<SimManager> WeakPtr;
4648
47 SimManager(ConnectivityServiceSettings::Ptr settings);49 SimManager(std::shared_ptr<QOfonoManager> ofono, ConnectivityServiceSettings::Ptr settings);
48 ~SimManager();50 ~SimManager();
4951
50 QList<Sim::Ptr> knownSims() const;52 QList<Sim::Ptr> knownSims() const;
5153
=== modified file 'src/indicator/nmofono/wwan/sim.cpp'
--- src/indicator/nmofono/wwan/sim.cpp 2016-06-22 09:42:47 +0000
+++ src/indicator/nmofono/wwan/sim.cpp 2016-06-22 09:42:47 +0000
@@ -38,10 +38,11 @@
3838
39Sim::Ptr Sim::fromQOfonoSimWrapper(const QOfonoSimWrapper *wrapper)39Sim::Ptr Sim::fromQOfonoSimWrapper(const QOfonoSimWrapper *wrapper)
40{40{
41 auto sim = Sim::Ptr(new Sim(wrapper->imsi(),41 auto sim = Sim::Ptr(new Sim(wrapper->iccid(),
42 wrapper->phoneNumbers().first(), // default to the first number42 "",
43 wrapper->mcc(),43 "",
44 wrapper->mnc(),44 "",
45 "",
45 wrapper->preferredLanguages(),46 wrapper->preferredLanguages(),
46 false));47 false));
47 sim->setOfonoSimManager(wrapper->ofonoSimManager());48 sim->setOfonoSimManager(wrapper->ofonoSimManager());
@@ -65,16 +66,21 @@
6566
66 QSet<QString> m_interfaces;67 QSet<QString> m_interfaces;
6768
69 QString m_iccid;
68 QString m_imsi;70 QString m_imsi;
71 QStringList m_phoneNumbers;
69 QString m_primaryPhoneNumber;72 QString m_primaryPhoneNumber;
70 QString m_mcc;73 QString m_mcc;
71 QString m_mnc;74 QString m_mnc;
72 QStringList m_preferredLanguages;75 QStringList m_preferredLanguages;
73 bool m_dataRoamingEnabled;76 bool m_dataRoamingEnabled = false;
74 bool m_mobileDataEnabled = false;77 bool m_mobileDataEnabled = false;
7578
76 bool m_locked = false;79 bool m_locked = false;
7780
81 bool m_initialData = false;
82 bool m_initialDataSet = false;
83
78 Private(Sim &parent)84 Private(Sim &parent)
79 : p(parent)85 : p(parent)
80 {86 {
@@ -104,12 +110,81 @@
104 }110 }
105111
106 m_simManager = simmgr;112 m_simManager = simmgr;
113
114 if (simmgr)
115 {
116 connect(simmgr.get(), &QOfonoSimManager::subscriberIdentityChanged, this, &Private::imsiChanged);
117 connect(simmgr.get(), &QOfonoSimManager::subscriberNumbersChanged, this, &Private::phoneNumbersChanged);
118 connect(simmgr.get(), &QOfonoSimManager::mobileCountryCodeChanged, this, &Private::mccChanged);
119 connect(simmgr.get(), &QOfonoSimManager::mobileNetworkCodeChanged, this, &Private::mncChanged);
120 imsiChanged(simmgr->subscriberIdentity());
121 phoneNumbersChanged(simmgr->subscriberNumbers());
122 mccChanged(simmgr->mobileCountryCode());
123 mncChanged(simmgr->mobileNetworkCode());
124 }
107 update();125 update();
108126
109 Q_EMIT p.presentChanged(m_simManager.get() != nullptr);127 Q_EMIT p.presentChanged(m_simManager.get() != nullptr);
110 }128 }
111129
112 void connManagerChanged(shared_ptr<QOfonoConnectionManager> connmgr)130 void phoneNumbersChanged(const QStringList &value)
131 {
132 if (value.isEmpty())
133 {
134 return;
135 }
136
137 m_phoneNumbers = value;
138 m_primaryPhoneNumber = value[0];
139 Q_EMIT p.primaryPhoneNumberChanged(m_primaryPhoneNumber);
140 }
141
142 void imsiChanged(const QString &value)
143 {
144 if (value.isEmpty())
145 {
146 return;
147 }
148
149 m_imsi = value;
150 Q_EMIT p.imsiChanged(m_imsi);
151 }
152
153 void mccChanged(const QString &value)
154 {
155 if (value.isEmpty())
156 {
157 return;
158 }
159
160 m_mcc = value;
161 Q_EMIT p.mccChanged(m_mcc);
162 }
163
164 void mncChanged(const QString &value)
165 {
166 if (value.isEmpty())
167 {
168 return;
169 }
170
171 m_mnc = value;
172 Q_EMIT p.mncChanged(m_mnc);
173 }
174
175 void poweredChanged()
176 {
177 if (!m_initialDataSet)
178 {
179 m_initialDataSet = true;
180 m_initialData = m_connManager->powered();
181 Q_EMIT p.initialDataOnSet();
182 m_connManager->setPowered(m_mobileDataEnabled);
183 }
184 update();
185 }
186
187 void setConnManager(shared_ptr<QOfonoConnectionManager> connmgr)
113 {188 {
114 if (m_connManager == connmgr)189 if (m_connManager == connmgr)
115 {190 {
@@ -121,7 +196,7 @@
121 {196 {
122 connect(m_connManager.get(),197 connect(m_connManager.get(),
123 &QOfonoConnectionManager::poweredChanged, this,198 &QOfonoConnectionManager::poweredChanged, this,
124 &Private::update);199 &Private::poweredChanged);
125 connect(m_connManager.get(),200 connect(m_connManager.get(),
126 &QOfonoConnectionManager::roamingAllowedChanged, this,201 &QOfonoConnectionManager::roamingAllowedChanged, this,
127 &Private::update);202 &Private::update);
@@ -170,26 +245,26 @@
170 Q_EMIT p.simIdentifierUpdated(m_simIdentifier);245 Q_EMIT p.simIdentifierUpdated(m_simIdentifier);
171 }246 }
172247
173 void setOfono(std::shared_ptr<QOfonoSimManager> simmgr)248 void setOfono(shared_ptr<QOfonoSimManager> simmgr)
174 {249 {
175 simManagerChanged(simmgr);250 simManagerChanged(simmgr);
176 if (simmgr)251 if (simmgr)
177 {252 {
178 m_connManager = std::make_shared<QOfonoConnectionManager>(this);253 auto connManager = make_shared<QOfonoConnectionManager>(this);
179 m_connManager->setModemPath(simmgr->modemPath());254 connManager->setModemPath(simmgr->modemPath());
180 connManagerChanged(m_connManager);255 setConnManager(connManager);
181 }256 }
182 else257 else
183 {258 {
184 m_connManager = std::shared_ptr<QOfonoConnectionManager>();259 setConnManager(shared_ptr<QOfonoConnectionManager>());
185 connManagerChanged(m_connManager);
186 }260 }
187 }261 }
188262
189263
190};264};
191265
192Sim::Sim(const QString &imsi,266Sim::Sim(const QString &iccid,
267 const QString &imsi,
193 const QString &primaryPhoneNumber,268 const QString &primaryPhoneNumber,
194 const QString &mcc,269 const QString &mcc,
195 const QString &mnc,270 const QString &mnc,
@@ -197,6 +272,7 @@
197 bool dataRoamingEnabled)272 bool dataRoamingEnabled)
198 : d{new Private(*this)}273 : d{new Private(*this)}
199{274{
275 d->m_iccid = iccid;
200 d->m_imsi = imsi;276 d->m_imsi = imsi;
201 d->m_primaryPhoneNumber = primaryPhoneNumber;277 d->m_primaryPhoneNumber = primaryPhoneNumber;
202 d->m_mcc = mcc;278 d->m_mcc = mcc;
@@ -214,6 +290,11 @@
214 return d->m_simIdentifier;290 return d->m_simIdentifier;
215}291}
216292
293QString Sim::iccid() const
294{
295 return d->m_iccid;
296}
297
217QString Sim::imsi() const298QString Sim::imsi() const
218{299{
219 return d->m_imsi;300 return d->m_imsi;
@@ -261,6 +342,10 @@
261 return;342 return;
262 }343 }
263 d->m_dataRoamingEnabled = value;344 d->m_dataRoamingEnabled = value;
345 if (d->m_connManager)
346 {
347 d->m_connManager->setRoamingAllowed(d->m_dataRoamingEnabled);
348 }
264 Q_EMIT dataRoamingEnabledChanged(value);349 Q_EMIT dataRoamingEnabledChanged(value);
265}350}
266351
@@ -302,6 +387,11 @@
302 d->setOfono(simmgr);387 d->setOfono(simmgr);
303}388}
304389
390bool Sim::initialDataOn() const
391{
392 return d->m_initialData;
393}
394
305395
306}396}
307}397}
308398
=== modified file 'src/indicator/nmofono/wwan/sim.h'
--- src/indicator/nmofono/wwan/sim.h 2016-06-22 09:42:47 +0000
+++ src/indicator/nmofono/wwan/sim.h 2016-06-22 09:42:47 +0000
@@ -41,7 +41,7 @@
41namespace wwan41namespace wwan
42{42{
4343
44class Sim : public QObject44class Sim : public QObject, public std::enable_shared_from_this<Sim>
45{45{
46 Q_OBJECT46 Q_OBJECT
4747
@@ -60,7 +60,8 @@
60 static Sim::Ptr fromQOfonoSimWrapper(const QOfonoSimWrapper *wrapper);60 static Sim::Ptr fromQOfonoSimWrapper(const QOfonoSimWrapper *wrapper);
6161
62private:62private:
63 Sim(const QString &imsi,63 Sim(const QString &iccid,
64 const QString &imsi,
64 const QString &primaryPhoneNumber,65 const QString &primaryPhoneNumber,
65 const QString &mcc,66 const QString &mcc,
66 const QString &mnc,67 const QString &mnc,
@@ -74,10 +75,13 @@
74 Q_PROPERTY(QString simIdentifier READ simIdentifier NOTIFY simIdentifierUpdated)75 Q_PROPERTY(QString simIdentifier READ simIdentifier NOTIFY simIdentifierUpdated)
75 const QString &simIdentifier() const;76 const QString &simIdentifier() const;
7677
77 Q_PROPERTY(QString imsi READ imsi CONSTANT)78 Q_PROPERTY(QString iccid READ iccid CONSTANT)
79 QString iccid() const;
80
81 Q_PROPERTY(QString imsi READ imsi NOTIFY imsiChanged)
78 QString imsi() const;82 QString imsi() const;
7983
80 Q_PROPERTY(QString primaryPhoneNumber READ primaryPhoneNumber CONSTANT)84 Q_PROPERTY(QString primaryPhoneNumber READ primaryPhoneNumber NOTIFY primaryPhoneNumberChanged)
81 QString primaryPhoneNumber() const;85 QString primaryPhoneNumber() const;
8286
83 Q_PROPERTY(bool locked READ locked NOTIFY lockedChanged)87 Q_PROPERTY(bool locked READ locked NOTIFY lockedChanged)
@@ -86,10 +90,10 @@
86 Q_PROPERTY(bool present READ present NOTIFY presentChanged)90 Q_PROPERTY(bool present READ present NOTIFY presentChanged)
87 bool present() const;91 bool present() const;
8892
89 Q_PROPERTY(QString mcc READ mcc CONSTANT)93 Q_PROPERTY(QString mcc READ mcc NOTIFY mccChanged)
90 QString mcc() const;94 QString mcc() const;
9195
92 Q_PROPERTY(QString mnc READ mnc CONSTANT)96 Q_PROPERTY(QString mnc READ mnc NOTIFY mncChanged)
93 QString mnc() const;97 QString mnc() const;
9498
95 Q_PROPERTY(QList<QString> preferredLanguages READ preferredLanguages CONSTANT)99 Q_PROPERTY(QList<QString> preferredLanguages READ preferredLanguages CONSTANT)
@@ -105,6 +109,8 @@
105109
106 QString ofonoPath() const;110 QString ofonoPath() const;
107111
112 bool initialDataOn() const;
113
108public Q_SLOTS:114public Q_SLOTS:
109 void unlock();115 void unlock();
110116
@@ -112,6 +118,14 @@
112118
113 void simIdentifierUpdated(const QString &);119 void simIdentifierUpdated(const QString &);
114120
121 void imsiChanged(const QString &);
122
123 void primaryPhoneNumberChanged(const QString &);
124
125 void mccChanged(const QString &);
126
127 void mncChanged(const QString &);
128
115 void lockedChanged(bool value);129 void lockedChanged(bool value);
116130
117 void presentChanged(bool value);131 void presentChanged(bool value);
@@ -119,6 +133,8 @@
119 void dataRoamingEnabledChanged(bool value);133 void dataRoamingEnabledChanged(bool value);
120134
121 void mobileDataEnabledChanged(bool value);135 void mobileDataEnabledChanged(bool value);
136
137 void initialDataOnSet();
122};138};
123139
124}140}
125141
=== modified file 'src/qdbus-stubs/dbus-types.h'
--- src/qdbus-stubs/dbus-types.h 2016-06-22 09:42:47 +0000
+++ src/qdbus-stubs/dbus-types.h 2016-06-22 09:42:47 +0000
@@ -47,16 +47,18 @@
47 return path.arg(counter++);47 return path.arg(counter++);
48 }48 }
4949
50 inline QString modemPath(const QString &serial)50 inline QString modemPath()
51 {51 {
52 static int counter {0};
52 static QString path{"/com/ubuntu/connectivity1/modem/%1"};53 static QString path{"/com/ubuntu/connectivity1/modem/%1"};
53 return path.arg(serial);54 return path.arg(counter++);
54 }55 }
5556
56 inline QString simPath(const QString &imsi)57 inline QString simPath()
57 {58 {
59 static int counter {0};
58 static QString path{"/com/ubuntu/connectivity1/sim/%1"};60 static QString path{"/com/ubuntu/connectivity1/sim/%1"};
59 return path.arg(imsi);61 return path.arg(counter++);
60 }62 }
6163
6264
6365
=== modified file 'tests/integration/CMakeLists.txt'
--- tests/integration/CMakeLists.txt 2015-10-20 10:20:17 +0000
+++ tests/integration/CMakeLists.txt 2016-06-22 09:42:47 +0000
@@ -13,6 +13,8 @@
13 test-indicator.cpp13 test-indicator.cpp
14 test-indicator-vpn.cpp14 test-indicator-vpn.cpp
15 test-connectivity-api.cpp15 test-connectivity-api.cpp
16 test-connectivity-api-modem.cpp
17 test-connectivity-api-sim.cpp
16 test-connectivity-api-vpn.cpp18 test-connectivity-api-vpn.cpp
17)19)
1820
1921
=== modified file 'tests/integration/indicator-network-test-base.cpp'
--- tests/integration/indicator-network-test-base.cpp 2015-11-20 13:14:50 +0000
+++ tests/integration/indicator-network-test-base.cpp 2016-06-22 09:42:47 +0000
@@ -42,14 +42,16 @@
4242
43void IndicatorNetworkTestBase::SetUp()43void IndicatorNetworkTestBase::SetUp()
44{44{
45 qputenv("INDICATOR_NETWORK_SETTINGS_PATH", temporaryDir.path().toUtf8().constData());
46
45 if (qEnvironmentVariableIsSet("TEST_WITH_BUSTLE"))47 if (qEnvironmentVariableIsSet("TEST_WITH_BUSTLE"))
46 {48 {
49 QDir::temp().mkpath("indicator-network-tests");
50 QDir testDir(QDir::temp().filePath("indicator-network-tests"));
51
47 const TestInfo* const test_info =52 const TestInfo* const test_info =
48 UnitTest::GetInstance()->current_test_info();53 UnitTest::GetInstance()->current_test_info();
4954
50 QDir::temp().mkpath("indicator-network-tests");
51 QDir testDir(QDir::temp().filePath("indicator-network-tests"));
52
53 dbusTestRunner.registerService(55 dbusTestRunner.registerService(
54 DBusServicePtr(56 DBusServicePtr(
55 new QProcessDBusService(57 new QProcessDBusService(
@@ -67,7 +69,7 @@
67 dbusMock.registerNetworkManager();69 dbusMock.registerNetworkManager();
68 dbusMock.registerNotificationDaemon();70 dbusMock.registerNotificationDaemon();
69 // By default the ofono mock starts with one modem71 // By default the ofono mock starts with one modem
70 dbusMock.registerOfono();72 dbusMock.registerOfono({{"no_modem", true}});
71 dbusMock.registerURfkill();73 dbusMock.registerURfkill();
7274
73 dbusMock.registerCustomMock(75 dbusMock.registerCustomMock(
@@ -142,11 +144,8 @@
142 ""144 ""
143 ).waitForFinished();145 ).waitForFinished();
144146
145 // mock service creates ril_0 automatically147
146 // Initial ConnectionManager properties are insane, fix them here148 modem = createModem("ril_0");
147 setConnectionManagerProperty(firstModem(), "Bearer", "none");
148 setConnectionManagerProperty(firstModem(), "Powered", false);
149 setConnectionManagerProperty(firstModem(), "Attached", false);
150149
151 // Identify the test when looking at Bustle logs150 // Identify the test when looking at Bustle logs
152 QDBusConnection systemConnection = dbusTestRunner.systemConnection();151 QDBusConnection systemConnection = dbusTestRunner.systemConnection();
@@ -422,6 +421,17 @@
422 }421 }
423}422}
424423
424QVariantMap IndicatorNetworkTestBase::getConnectionManagerProperties(const QString& path)
425{
426 auto& ofono(dbusMock.ofonoConnectionManagerInterface(path));
427 auto reply = ofono.GetProperties();
428 reply.waitForFinished();
429 if (reply.isError()) {
430 EXPECT_FALSE(reply.isError()) << reply.error().message().toStdString();
431 }
432 return reply;
433}
434
425void IndicatorNetworkTestBase::setNetworkRegistrationProperty(const QString& path, const QString& propertyName, const QVariant& value)435void IndicatorNetworkTestBase::setNetworkRegistrationProperty(const QString& path, const QString& propertyName, const QVariant& value)
426{436{
427 auto& ofono(dbusMock.ofonoNetworkRegistrationInterface(path));437 auto& ofono(dbusMock.ofonoNetworkRegistrationInterface(path));
@@ -483,6 +493,14 @@
483 .toggled(toggled);493 .toggled(toggled);
484}494}
485495
496mh::MenuItemMatcher IndicatorNetworkTestBase::mobileDataSwitch(bool toggled)
497{
498 return mh::MenuItemMatcher::checkbox()
499 .label("Cellular data")
500 .action("indicator.mobiledata.enabled")
501 .toggled(toggled);
502}
503
486mh::MenuItemMatcher IndicatorNetworkTestBase::accessPoint(const string& ssid, Secure secure,504mh::MenuItemMatcher IndicatorNetworkTestBase::accessPoint(const string& ssid, Secure secure,
487 ApMode apMode, ConnectionStatus connectionStatus, uchar strength)505 ApMode apMode, ConnectionStatus connectionStatus, uchar strength)
488{506{
@@ -637,3 +655,16 @@
637 .themed_icon("icon", {"network-vpn"})655 .themed_icon("icon", {"network-vpn"})
638 .toggled(connected == ConnectionStatus::connected);656 .toggled(connected == ConnectionStatus::connected);
639}657}
658
659unique_ptr<QSortFilterProxyModel> IndicatorNetworkTestBase::getSortedModems(Connectivity& connectivity)
660{
661 auto modems = connectivity.modems();
662
663 auto sortedModems = make_unique<QSortFilterProxyModel>();
664 sortedModems->setSortRole(ModemsListModel::RoleIndex);
665 sortedModems->sort(0);
666
667 sortedModems->setSourceModel(modems);
668
669 return sortedModems;
670}
640671
=== modified file 'tests/integration/indicator-network-test-base.h'
--- tests/integration/indicator-network-test-base.h 2015-11-20 13:14:50 +0000
+++ tests/integration/indicator-network-test-base.h 2016-06-22 09:42:47 +0000
@@ -19,6 +19,8 @@
19#pragma once19#pragma once
2020
21#include <connectivityqt/connectivity.h>21#include <connectivityqt/connectivity.h>
22#include <connectivityqt/modems-list-model.h>
23
2224
23#include <dbus-types.h>25#include <dbus-types.h>
2426
@@ -77,9 +79,18 @@
77{\79{\
78 while (signalSpy.size() < signalsExpected)\80 while (signalSpy.size() < signalsExpected)\
79 {\81 {\
80 ASSERT_TRUE(signalSpy.wait());\82 ASSERT_TRUE(signalSpy.wait()) << "Waiting for " << signalsExpected << " signals, got " << signalSpy.size();\
81 }\83 }\
82 ASSERT_EQ(signalsExpected, signalSpy.size());\84 ASSERT_EQ(signalsExpected, signalSpy.size()) << "Waiting for " << signalsExpected << " signals, got " << signalSpy.size();\
85}
86
87#define WAIT_FOR_ROW_COUNT(signalSpy, model, expectedRowCount)\
88{\
89 while (model->rowCount() < expectedRowCount)\
90 {\
91 ASSERT_TRUE(signalSpy.wait()) << "Waiting for model to have " << expectedRowCount << " rows, got " << model->rowCount();\
92 }\
93 ASSERT_EQ(expectedRowCount, model->rowCount()) << "Waiting for model to have " << expectedRowCount << " rows, got " << model->rowCount();\
83}94}
8495
85#define CHECK_METHOD_CALL(signalSpy, signalIndex, methodName, ...)\96#define CHECK_METHOD_CALL(signalSpy, signalIndex, methodName, ...)\
@@ -168,6 +179,8 @@
168179
169 void setConnectionManagerProperty(const QString& path, const QString& propertyName, const QVariant& value);180 void setConnectionManagerProperty(const QString& path, const QString& propertyName, const QVariant& value);
170181
182 QVariantMap getConnectionManagerProperties(const QString& path);
183
171 void setNetworkRegistrationProperty(const QString& path, const QString& propertyName, const QVariant& value);184 void setNetworkRegistrationProperty(const QString& path, const QString& propertyName, const QVariant& value);
172185
173 OrgFreedesktopDBusMockInterface& notificationsMockInterface();186 OrgFreedesktopDBusMockInterface& notificationsMockInterface();
@@ -200,6 +213,7 @@
200 static QString firstModem();213 static QString firstModem();
201214
202 static unity::gmenuharness::MenuItemMatcher flightModeSwitch(bool toggled = false);215 static unity::gmenuharness::MenuItemMatcher flightModeSwitch(bool toggled = false);
216 static unity::gmenuharness::MenuItemMatcher mobileDataSwitch(bool toggled = false);
203217
204 static unity::gmenuharness::MenuItemMatcher accessPoint(const std::string& ssid, Secure secure,218 static unity::gmenuharness::MenuItemMatcher accessPoint(const std::string& ssid, Secure secure,
205 ApMode apMode, ConnectionStatus connectionStatus, uchar strength = 100);219 ApMode apMode, ConnectionStatus connectionStatus, uchar strength = 100);
@@ -220,9 +234,24 @@
220234
221 static unity::gmenuharness::MenuItemMatcher vpnConnection(const std::string& name, ConnectionStatus connected = ConnectionStatus::disconnected);235 static unity::gmenuharness::MenuItemMatcher vpnConnection(const std::string& name, ConnectionStatus connected = ConnectionStatus::disconnected);
222236
237 static connectivityqt::Sim* getModemSim(const QAbstractItemModel& model, int idx)
238 {
239 auto sim = model.data(model.index(idx,0),
240 connectivityqt::ModemsListModel::RoleSim)
241 .value<connectivityqt::Sim*>();
242 EXPECT_TRUE(sim);
243 return sim;
244 }
245
246 static std::unique_ptr<QSortFilterProxyModel> getSortedModems(connectivityqt::Connectivity& connectivity);
247
223 QtDBusTest::DBusTestRunner dbusTestRunner;248 QtDBusTest::DBusTestRunner dbusTestRunner;
224249
225 QtDBusMock::DBusMock dbusMock;250 QtDBusMock::DBusMock dbusMock;
226251
227 QtDBusTest::DBusServicePtr indicator;252 QtDBusTest::DBusServicePtr indicator;
253
254 QString modem;
255
256 QTemporaryDir temporaryDir;
228};257};
229258
=== added directory 'tests/integration/qml'
=== added file 'tests/integration/test-connectivity-api-modem.cpp'
--- tests/integration/test-connectivity-api-modem.cpp 1970-01-01 00:00:00 +0000
+++ tests/integration/test-connectivity-api-modem.cpp 2016-06-22 09:42:47 +0000
@@ -0,0 +1,322 @@
1/*
2 * Copyright (C) 2016 Canonical, Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 3, as published
6 * by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranties of
10 * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11 * PURPOSE. See the GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authors:
17 * Antti Kaijanmäki <antti.kaijanmaki@canonical.com>
18 * Pete Woods <pete.woods@canonical.com>
19 */
20
21#include <connectivityqt/modem.h>
22#include <connectivityqt/modems-list-model.h>
23#include <indicator-network-test-base.h>
24#include <dbus-types.h>
25#include <NetworkManagerSettingsInterface.h>
26
27#include <QDebug>
28#include <QTestEventLoop>
29
30#define DEFINE_MODEL_LISTENERS \
31 QSignalSpy rowsAboutToBeRemovedSpy(modems.get(), SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)));\
32 QSignalSpy rowsRemovedSpy(modems.get(), SIGNAL(rowsRemoved(const QModelIndex &, int, int)));\
33 QSignalSpy rowsAboutToBeInsertedSpy(modems.get(), SIGNAL(rowsAboutToBeInserted(const QModelIndex &, int, int)));\
34 QSignalSpy rowsInsertedSpy(modems.get(), SIGNAL(rowsInserted(const QModelIndex &, int, int)));\
35 QSignalSpy dataChangedSpy(modems.get(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &, const QVector<int> &)));\
36
37#define CLEAR_MODEL_LISTENERS \
38 rowsAboutToBeRemovedSpy.clear();\
39 rowsRemovedSpy.clear();\
40 rowsAboutToBeInsertedSpy.clear();\
41 rowsInsertedSpy.clear();\
42 dataChangedSpy.clear();
43
44struct SS {
45 QString iccid;
46 QString imsi;
47 QString primaryPhoneNumber;
48 bool locked;
49 bool present;
50 QString mcc;
51 QString mnc;
52 QList<QString> preferredLanguages;
53
54 bool operator==(const SS& other) const
55 {
56 return iccid == other.iccid
57 && imsi == other.imsi
58 && primaryPhoneNumber == other.primaryPhoneNumber
59 && locked == other.locked && present == other.present
60 && mcc == other.mcc && mnc == other.mnc
61 && preferredLanguages == other.preferredLanguages;
62 }
63};
64typedef QPair<int, SS> MS;
65typedef QList<MS> MSL;
66
67inline void PrintTo (const SS& simState, std::ostream* os)
68{
69 *os << "SS("
70 << "ICCID: " << simState.iccid.toStdString () << ", "
71 << "IMSI: " << simState.imsi.toStdString () << ", "
72 << "Phone #: " << simState.primaryPhoneNumber.toStdString () << ", "
73 << "Locked: " << (simState.locked ? "y" : "n") << ", "
74 << "Present: " << (simState.present ? "y" : "n") << ", "
75 << "MCC: " << simState.mcc.toStdString () << ", "
76 << "MNC: " << simState.mnc.toStdString () << ", "
77 << "Langs: " << QStringList(simState.preferredLanguages).join (",").toStdString () << ")";
78}
79
80inline void PrintTo(const MS& modemState, std::ostream* os) {
81 *os << "MS(" << modemState.first << ", " ;
82 PrintTo(modemState.second, os);
83 *os << ")";
84}
85
86using namespace std;
87using namespace testing;
88using namespace connectivityqt;
89
90namespace
91{
92
93class TestConnectivityApiModem: public IndicatorNetworkTestBase
94{
95protected:
96 static void SetUpTestCase()
97 {
98 Connectivity::registerMetaTypes();
99 }
100
101 MSL modemList(QAbstractItemModel& model)
102 {
103 MSL modemStates;
104 int rowCount(model.rowCount());
105 for (int i = 0; i < rowCount; ++i)
106 {
107 auto idx = model.index(i, 0);
108 MS modemState;
109 modemState.first = model.data(idx, ModemsListModel::Roles::RoleIndex).toInt();
110 EXPECT_FALSE(model.data(idx, ModemsListModel::Roles::RoleSerial).toString().isEmpty());
111
112 SS simState;
113 auto sim = qvariant_cast<Sim*>(model.data(idx, ModemsListModel::Roles::RoleSim));
114
115 if (sim)
116 {
117 simState.iccid = sim->iccid ();
118 simState.imsi = sim->imsi();
119 simState.primaryPhoneNumber = sim->primaryPhoneNumber ();
120 simState.locked = sim->locked ();
121 simState.present = sim->present ();
122 simState.mcc = sim->mcc ();
123 simState.mnc = sim->mnc ();
124 simState.preferredLanguages = sim->preferredLanguages ();
125
126 modemState.second = simState;
127 }
128 else
129 {
130 EXPECT_TRUE(sim) << "Could not get a SIM at index " << i
131 << " from ModemModel";
132 }
133
134 modemStates << modemState;
135 }
136 return modemStates;
137 }
138};
139
140TEST_F(TestConnectivityApiModem, SingleModemAtStartup)
141{
142 // Add a physical device to use for the connection
143 setGlobalConnectedState(NM_STATE_CONNECTED_GLOBAL);
144 createWiFiDevice(NM_DEVICE_STATE_ACTIVATED);
145
146 // Start the indicator
147 ASSERT_NO_THROW(startIndicator());
148
149 // Connect the the service
150 auto connectivity(newConnectivity());
151
152 // Get the modems model
153 auto modems = getSortedModems(*connectivity);
154
155 DEFINE_MODEL_LISTENERS
156
157 WAIT_FOR_ROW_COUNT(rowsInsertedSpy, modems, 1)
158 EXPECT_TRUE(rowsAboutToBeRemovedSpy.isEmpty ());
159 EXPECT_TRUE(rowsRemovedSpy.isEmpty ());
160 EXPECT_TRUE(dataChangedSpy.isEmpty ());
161
162 EXPECT_EQ(MSL({
163 MS{1, SS{
164 "893581234000000000000",
165 "310150000000000",
166 "123456789",
167 false,
168 true,
169 "310",
170 "150",
171 {"en"}
172 }}
173 }), modemList(*modems));
174}
175
176TEST_F(TestConnectivityApiModem, TwoModemsAtStartup)
177{
178 createModem("ril_1");
179
180 // Add a physical device to use for the connection
181 setGlobalConnectedState(NM_STATE_CONNECTED_GLOBAL);
182 createWiFiDevice(NM_DEVICE_STATE_ACTIVATED);
183
184 // Start the indicator
185 ASSERT_NO_THROW(startIndicator());
186
187 // Connect the the service
188 auto connectivity(newConnectivity());
189
190 // Get the modems model
191 auto modems = getSortedModems(*connectivity);
192
193 DEFINE_MODEL_LISTENERS
194
195 WAIT_FOR_ROW_COUNT(rowsInsertedSpy, modems, 2)
196 EXPECT_TRUE(rowsAboutToBeRemovedSpy.isEmpty ());
197 EXPECT_TRUE(rowsRemovedSpy.isEmpty ());
198 EXPECT_TRUE(dataChangedSpy.isEmpty ());
199
200 EXPECT_EQ(MSL({
201 MS{1, SS{
202 "893581234000000000000",
203 "310150000000000",
204 "123456789",
205 false,
206 true,
207 "310",
208 "150",
209 {"en"}
210 }},
211 MS{2, SS{
212 "893581234000000000001",
213 "310150000000001",
214 "123456789",
215 false,
216 true,
217 "310",
218 "150",
219 {"en"}
220 }}
221 }), modemList(*modems));
222}
223
224TEST_F(TestConnectivityApiModem, AddAModem)
225{
226 // Add a physical device to use for the connection
227 setGlobalConnectedState(NM_STATE_CONNECTED_GLOBAL);
228 createWiFiDevice(NM_DEVICE_STATE_ACTIVATED);
229
230 // Start the indicator
231 ASSERT_NO_THROW(startIndicator());
232
233 // Connect the the service
234 auto connectivity(newConnectivity());
235
236 // Get the modems model
237 auto modems = getSortedModems(*connectivity);
238
239 DEFINE_MODEL_LISTENERS
240
241 WAIT_FOR_ROW_COUNT(rowsInsertedSpy, modems, 1)
242 EXPECT_TRUE(rowsAboutToBeRemovedSpy.isEmpty ());
243 EXPECT_TRUE(rowsRemovedSpy.isEmpty ());
244 EXPECT_TRUE(dataChangedSpy.isEmpty ());
245
246 EXPECT_EQ(MSL({
247 MS{1, SS{
248 "893581234000000000000",
249 "310150000000000",
250 "123456789",
251 false,
252 true,
253 "310",
254 "150",
255 {"en"}
256 }}
257 }), modemList(*modems));
258
259 CLEAR_MODEL_LISTENERS
260
261 createModem("ril_1");
262
263 WAIT_FOR_ROW_COUNT(rowsInsertedSpy, modems, 2)
264 EXPECT_TRUE(rowsAboutToBeRemovedSpy.isEmpty ());
265 EXPECT_TRUE(rowsRemovedSpy.isEmpty ());
266 EXPECT_TRUE(dataChangedSpy.isEmpty ());
267
268 EXPECT_EQ(MSL({
269 MS{1, SS{
270 "893581234000000000000",
271 "310150000000000",
272 "123456789",
273 false,
274 true,
275 "310",
276 "150",
277 {"en"}
278 }},
279 MS{2, SS{
280 "893581234000000000001",
281 "310150000000001",
282 "123456789",
283 false,
284 true,
285 "310",
286 "150",
287 {"en"}
288 }}
289 }), modemList(*modems));
290
291 CLEAR_MODEL_LISTENERS
292}
293
294TEST_F(TestConnectivityApiModem, ModemProperties)
295{
296 // Add a physical device to use for the connection
297 setGlobalConnectedState(NM_STATE_CONNECTED_GLOBAL);
298 createWiFiDevice(NM_DEVICE_STATE_ACTIVATED);
299
300 // Start the indicator
301 ASSERT_NO_THROW(startIndicator());
302
303 // Connect the the service
304 auto connectivity(newConnectivity());
305
306 // Get the modems model
307 auto modems = getSortedModems(*connectivity);
308
309 DEFINE_MODEL_LISTENERS
310
311 WAIT_FOR_ROW_COUNT(rowsInsertedSpy, modems, 1)
312 EXPECT_TRUE(rowsAboutToBeRemovedSpy.isEmpty ());
313 EXPECT_TRUE(rowsRemovedSpy.isEmpty ());
314
315 auto modem = qvariant_cast<Modem*>(modems->data(modems->index(0, 0), ModemsListModel::Roles::RoleModem));
316
317 EXPECT_EQ(1, modem->index());
318 EXPECT_EQ("12345678-1234-1234-1234-000000000000", modem->serial().toStdString());
319 EXPECT_TRUE(modem->sim());
320}
321
322}
0323
=== added file 'tests/integration/test-connectivity-api-sim.cpp'
--- tests/integration/test-connectivity-api-sim.cpp 1970-01-01 00:00:00 +0000
+++ tests/integration/test-connectivity-api-sim.cpp 2016-06-22 09:42:47 +0000
@@ -0,0 +1,375 @@
1/*
2 * Copyright (C) 2016 Canonical, Ltd.
3 *
4 * This program is free software: you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 3, as published
6 * by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranties of
10 * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
11 * PURPOSE. See the GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * Authors:
17 * Antti Kaijanmäki <antti.kaijanmaki@canonical.com>
18 * Pete Woods <pete.woods@canonical.com>
19 */
20
21#include <connectivityqt/sim.h>
22#include <connectivityqt/sims-list-model.h>
23#include <indicator-network-test-base.h>
24#include <dbus-types.h>
25#include <NetworkManagerSettingsInterface.h>
26
27#include <QDebug>
28#include <QTestEventLoop>
29
30#define DEFINE_MODEL_LISTENERS \
31 QSignalSpy rowsAboutToBeRemovedSpy(sims.get(), SIGNAL(rowsAboutToBeRemoved(const QModelIndex &, int, int)));\
32 QSignalSpy rowsRemovedSpy(sims.get(), SIGNAL(rowsRemoved(const QModelIndex &, int, int)));\
33 QSignalSpy rowsAboutToBeInsertedSpy(sims.get(), SIGNAL(rowsAboutToBeInserted(const QModelIndex &, int, int)));\
34 QSignalSpy rowsInsertedSpy(sims.get(), SIGNAL(rowsInserted(const QModelIndex &, int, int)));\
35 QSignalSpy dataChangedSpy(sims.get(), SIGNAL(dataChanged(const QModelIndex &, const QModelIndex &, const QVector<int> &)));\
36
37#define CLEAR_MODEL_LISTENERS \
38 rowsAboutToBeRemovedSpy.clear();\
39 rowsRemovedSpy.clear();\
40 rowsAboutToBeInsertedSpy.clear();\
41 rowsInsertedSpy.clear();\
42 dataChangedSpy.clear();
43
44struct SS {
45 QString iccid;
46 QString imsi;
47 QString primaryPhoneNumber;
48 bool locked;
49 bool present;
50 QString mcc;
51 QString mnc;
52 QList<QString> preferredLanguages;
53 bool dataRoamingEnabled;
54
55 bool operator==(const SS& other) const
56 {
57 return iccid == other.iccid
58 && imsi == other.imsi
59 && primaryPhoneNumber == other.primaryPhoneNumber
60 && locked == other.locked && present == other.present
61 && mcc == other.mcc && mnc == other.mnc
62 && preferredLanguages == other.preferredLanguages
63 && dataRoamingEnabled == other.dataRoamingEnabled;
64 }
65};
66typedef QList<SS> SSL;
67
68inline void PrintTo (const SS& simState, std::ostream* os)
69{
70 *os << "SS("
71 << "ICCID: " << simState.iccid.toStdString () << ", "
72 << "IMSI: " << simState.imsi.toStdString () << ", "
73 << "Phone #: " << simState.primaryPhoneNumber.toStdString () << ", "
74 << "Locked: " << (simState.locked ? "y" : "n") << ", "
75 << "Present: " << (simState.present ? "y" : "n") << ", "
76 << "MCC: " << simState.mcc.toStdString () << ", "
77 << "MNC: " << simState.mnc.toStdString () << ", "
78 << "Langs: " << QStringList(simState.preferredLanguages).join (",").toStdString ()
79 << "Roaming: " << (simState.dataRoamingEnabled ? "y" : "n")
80 << ")";
81}
82
83using namespace std;
84using namespace testing;
85using namespace connectivityqt;
86
87namespace
88{
89
90class TestConnectivityApiSim: public IndicatorNetworkTestBase
91{
92protected:
93 static void SetUpTestCase()
94 {
95 Connectivity::registerMetaTypes();
96 }
97
98 unique_ptr<QSortFilterProxyModel> getSortedSims(Connectivity& connectivity)
99 {
100 auto sims = connectivity.sims();
101
102 auto sortedSims = make_unique<QSortFilterProxyModel>();
103 sortedSims->setSortRole(SimsListModel::RoleIccid);
104 sortedSims->sort(0);
105
106 sortedSims->setSourceModel(sims);
107
108 return sortedSims;
109 }
110
111 connectivityqt::Sim* getSim(const QAbstractItemModel& model, int idx)
112 {
113 auto sim = model.data(model.index(idx,0),
114 connectivityqt::SimsListModel::RoleSim)
115 .value<connectivityqt::Sim*>();
116 EXPECT_TRUE(sim);
117 return sim;
118 }
119
120 SSL simList(QAbstractItemModel& model)
121 {
122 SSL simStates;
123 int rowCount(model.rowCount());
124 for (int i = 0; i < rowCount; ++i)
125 {
126 auto idx = model.index(i, 0);
127
128 SS simState;
129 simState.iccid = model.data(idx, SimsListModel::RoleIccid).toString();
130 simState.imsi = model.data(idx, SimsListModel::RoleImsi).toString();
131 simState.primaryPhoneNumber = model.data(idx, SimsListModel::RolePrimaryPhoneNumber).toString();
132 simState.locked = model.data(idx, SimsListModel::RoleLocked).toBool();
133 simState.present = model.data(idx, SimsListModel::RolePresent).toBool();
134 simState.mcc = model.data(idx, SimsListModel::RoleMcc).toString();
135 simState.mnc = model.data(idx, SimsListModel::RoleMnc).toString();
136 simState.preferredLanguages = model.data(idx, SimsListModel::RolePreferredLanguages).toStringList();
137 simState.dataRoamingEnabled = model.data(idx, SimsListModel::RoleDataRoamingEnabled).toBool();
138
139 simStates << simState;
140 }
141 return simStates;
142 }
143};
144
145TEST_F(TestConnectivityApiSim, SingleSimAtStartup)
146{
147 // Add a physical device to use for the connection
148 setGlobalConnectedState(NM_STATE_CONNECTED_GLOBAL);
149 auto device = createWiFiDevice(NM_DEVICE_STATE_ACTIVATED);
150
151 // Start the indicator
152 ASSERT_NO_THROW(startIndicator());
153
154 // Connect the the service
155 auto connectivity(newConnectivity());
156
157 // Get the SIMs model
158 auto sims = getSortedSims(*connectivity);
159
160 DEFINE_MODEL_LISTENERS
161
162 WAIT_FOR_ROW_COUNT(rowsInsertedSpy, sims, 1)
163 EXPECT_TRUE(rowsAboutToBeRemovedSpy.isEmpty ());
164 EXPECT_TRUE(rowsRemovedSpy.isEmpty ());
165
166 auto sim = getSim(*sims, 0);
167 while (sim->imsi().isEmpty() || sim->primaryPhoneNumber().isEmpty())
168 {
169 EXPECT_TRUE(dataChangedSpy.wait());
170 }
171
172 EXPECT_EQ(SSL({
173 SS{
174 "893581234000000000000",
175 "310150000000000",
176 "123456789",
177 false,
178 true,
179 "310",
180 "150",
181 {"en"},
182 false
183 }
184 }), simList(*sims));
185}
186
187TEST_F(TestConnectivityApiSim, TwoSimsAtStartup)
188{
189 createModem("ril_1");
190
191 // Add a physical device to use for the connection
192 setGlobalConnectedState(NM_STATE_CONNECTED_GLOBAL);
193 auto device = createWiFiDevice(NM_DEVICE_STATE_ACTIVATED);
194
195 // Start the indicator
196 ASSERT_NO_THROW(startIndicator());
197
198 // Connect the the service
199 auto connectivity(newConnectivity());
200
201 // Get the SIMs model
202 auto sims = getSortedSims(*connectivity);
203
204 DEFINE_MODEL_LISTENERS
205
206 WAIT_FOR_ROW_COUNT(rowsInsertedSpy, sims, 2)
207 EXPECT_TRUE(rowsAboutToBeRemovedSpy.isEmpty ());
208 EXPECT_TRUE(rowsRemovedSpy.isEmpty ());
209 EXPECT_TRUE(dataChangedSpy.isEmpty ());
210
211 auto sim = getSim(*sims, 0);
212 while (sim->imsi().isEmpty() || sim->primaryPhoneNumber().isEmpty())
213 {
214 EXPECT_TRUE(dataChangedSpy.wait());
215 }
216 auto sim2 = getSim(*sims, 1);
217 while (sim2->imsi().isEmpty() || sim2->primaryPhoneNumber().isEmpty())
218 {
219 EXPECT_TRUE(dataChangedSpy.wait());
220 }
221
222 EXPECT_EQ(SSL({
223 SS{
224 "893581234000000000000",
225 "310150000000000",
226 "123456789",
227 false,
228 true,
229 "310",
230 "150",
231 {"en"},
232 false
233 },
234 SS{
235 "893581234000000000001",
236 "310150000000001",
237 "123456789",
238 false,
239 true,
240 "310",
241 "150",
242 {"en"},
243 false
244 }
245 }), simList(*sims));
246}
247
248TEST_F(TestConnectivityApiSim, AddASim)
249{
250 // Add a physical device to use for the connection
251 setGlobalConnectedState(NM_STATE_CONNECTED_GLOBAL);
252 auto device = createWiFiDevice(NM_DEVICE_STATE_ACTIVATED);
253
254 // Start the indicator
255 ASSERT_NO_THROW(startIndicator());
256
257 // Connect the the service
258 auto connectivity(newConnectivity());
259
260 // Get the SIMs model
261 auto sims = getSortedSims(*connectivity);
262
263 DEFINE_MODEL_LISTENERS
264
265 WAIT_FOR_ROW_COUNT(rowsInsertedSpy, sims, 1)
266 EXPECT_TRUE(rowsAboutToBeRemovedSpy.isEmpty ());
267 EXPECT_TRUE(rowsRemovedSpy.isEmpty ());
268 EXPECT_TRUE(dataChangedSpy.isEmpty ());
269
270 auto sim = getSim(*sims, 0);
271 while (sim->imsi().isEmpty() || sim->primaryPhoneNumber().isEmpty())
272 {
273 EXPECT_TRUE(dataChangedSpy.wait());
274 }
275
276 EXPECT_EQ(SSL({
277 SS{
278 "893581234000000000000",
279 "310150000000000",
280 "123456789",
281 false,
282 true,
283 "310",
284 "150",
285 {"en"},
286 false
287 }
288 }), simList(*sims));
289
290 CLEAR_MODEL_LISTENERS
291
292 createModem("ril_1");
293
294 WAIT_FOR_ROW_COUNT(rowsInsertedSpy, sims, 2)
295 EXPECT_TRUE(rowsAboutToBeRemovedSpy.isEmpty ());
296 EXPECT_TRUE(rowsRemovedSpy.isEmpty ());
297
298 auto sim2 = getSim(*sims, 1);
299 while (sim2->imsi().isEmpty() || sim2->primaryPhoneNumber().isEmpty())
300 {
301 EXPECT_TRUE(dataChangedSpy.wait());
302 }
303
304 EXPECT_EQ(SSL({
305 SS{
306 "893581234000000000000",
307 "310150000000000",
308 "123456789",
309 false,
310 true,
311 "310",
312 "150",
313 {"en"},
314 false
315 },
316 SS{
317 "893581234000000000001",
318 "310150000000001",
319 "123456789",
320 false,
321 true,
322 "310",
323 "150",
324 {"en"},
325 false
326 }
327 }), simList(*sims));
328}
329
330TEST_F(TestConnectivityApiSim, SimProperties)
331{
332 // Add a physical device to use for the connection
333 setGlobalConnectedState(NM_STATE_CONNECTED_GLOBAL);
334 auto device = createWiFiDevice(NM_DEVICE_STATE_ACTIVATED);
335
336 // Start the indicator
337 ASSERT_NO_THROW(startIndicator());
338
339 // Connect the the service
340 auto connectivity(newConnectivity());
341
342 // Get the SIMs model
343 auto sims = getSortedSims(*connectivity);
344
345 DEFINE_MODEL_LISTENERS
346
347 WAIT_FOR_ROW_COUNT(rowsInsertedSpy, sims, 1)
348 EXPECT_TRUE(rowsAboutToBeRemovedSpy.isEmpty ());
349 EXPECT_TRUE(rowsRemovedSpy.isEmpty ());
350 EXPECT_TRUE(dataChangedSpy.isEmpty ());
351
352 auto sim = qvariant_cast<Sim*>(sims->data(sims->index(0, 0), SimsListModel::Roles::RoleSim));
353 ASSERT_TRUE(sim);
354 while (sim->imsi().isEmpty() || sim->primaryPhoneNumber().isEmpty())
355 {
356 EXPECT_TRUE(dataChangedSpy.wait());
357 }
358
359 EXPECT_EQ("893581234000000000000", sim->iccid().toStdString());
360 EXPECT_EQ("310150000000000", sim->imsi().toStdString());
361 EXPECT_EQ("123456789", sim->primaryPhoneNumber().toStdString());
362 EXPECT_FALSE(sim->locked());
363 EXPECT_TRUE(sim->present());
364 EXPECT_EQ("310", sim->mcc().toStdString());
365 EXPECT_EQ("150", sim->mnc().toStdString());
366 EXPECT_EQ(QStringList{"en"}, sim->preferredLanguages());
367}
368
369TEST_F(TestConnectivityApiSim, RoamingAllowed)
370{
371// test that roaming allowed has an effect.
372}
373
374
375}
0376
=== modified file 'tests/integration/test-connectivity-api.cpp'
--- tests/integration/test-connectivity-api.cpp 2016-01-14 13:38:38 +0000
+++ tests/integration/test-connectivity-api.cpp 2016-06-22 09:42:47 +0000
@@ -764,4 +764,128 @@
764764
765 EXPECT_TRUE(connectivity->modemAvailable());765 EXPECT_TRUE(connectivity->modemAvailable());
766}766}
767
768TEST_F(TestConnectivityApi, MobileDataDisablePowersOffAllSims)
769{
770 auto modem2 = createModem("ril_1");
771 setConnectionManagerProperty(modem2, "Powered", true);
772
773 setGlobalConnectedState(NM_STATE_DISCONNECTED);
774 auto device = createWiFiDevice(NM_DEVICE_STATE_DISCONNECTED);
775
776 // Start the indicator
777 ASSERT_NO_THROW(startIndicator());
778
779 // Connect the the service
780 auto connectivity(newConnectivity());
781
782 QSignalSpy mobileDataEnabledSpy(connectivity.get(), SIGNAL(mobileDataEnabledUpdated(bool)));
783 QSignalSpy simForMobileDataSpy(connectivity.get(), SIGNAL(simForMobileDataUpdated(Sim*)));
784
785 // One of the modems was started and we had no settings.
786 // So we start by assuming mobile data was enabled.
787 if (!connectivity->mobileDataEnabled())
788 {
789 WAIT_FOR_SIGNALS(mobileDataEnabledSpy, 1)
790 }
791 mobileDataEnabledSpy.clear();
792 EXPECT_TRUE(connectivity->mobileDataEnabled());
793
794 if (!connectivity->simForMobileData())
795 {
796 WAIT_FOR_SIGNALS(simForMobileDataSpy, 1)
797 }
798 simForMobileDataSpy.clear();
799 EXPECT_TRUE(connectivity->simForMobileData() != nullptr);
800
801
802 QSignalSpy simsModelRowsInsertedSpy(connectivity->sims(), SIGNAL(rowsInserted(const QModelIndex &, int, int)));
803 QSignalSpy modemsModelRowsInsertedSpy(connectivity->modems(), SIGNAL(rowsInserted(const QModelIndex &, int, int)));
804 WAIT_FOR_ROW_COUNT(simsModelRowsInsertedSpy, connectivity->sims(), 2)
805 WAIT_FOR_ROW_COUNT(modemsModelRowsInsertedSpy, connectivity->modems(), 2)
806
807 auto modems = getSortedModems(*connectivity);
808 auto simForMobileData = connectivity->simForMobileData();
809 auto secondSim = getModemSim(*modems, 1);
810
811 ASSERT_TRUE(simForMobileData);
812 ASSERT_TRUE(secondSim);
813 // These should be the exact same object.
814 EXPECT_TRUE(simForMobileData == secondSim);
815
816 // Only the second modem should be powered
817 EXPECT_FALSE(getConnectionManagerProperties(modem)["Powered"].toBool());
818 EXPECT_TRUE(getConnectionManagerProperties(modem2)["Powered"].toBool());
819
820 auto& connectionManager(dbusMock.ofonoConnectionManagerInterface(modem2));
821 QSignalSpy connectionManagerPropertyChangedSpy(
822 &connectionManager,
823 SIGNAL(PropertyChanged(const QString &, const QDBusVariant &)));
824
825 // Disable all mobile data.
826 connectivity->setMobileDataEnabled(false);
827
828 WAIT_FOR_SIGNALS(connectionManagerPropertyChangedSpy, 1)
829
830 // Both modems should by un-powered
831 EXPECT_FALSE(getConnectionManagerProperties(modem)["Powered"].toBool());
832 EXPECT_FALSE(getConnectionManagerProperties(modem2)["Powered"].toBool());
833
834 if (connectivity->mobileDataEnabled())
835 {
836 WAIT_FOR_SIGNALS(mobileDataEnabledSpy, 1)
837 }
838 EXPECT_FALSE(connectivity->mobileDataEnabled());
839}
840
841TEST_F(TestConnectivityApi, SettingsRestoredOnStartup)
842{
843
844 QString path = temporaryDir.path() + "/config.ini";
845 auto settings = make_unique<QSettings>(path, QSettings::IniFormat);
846
847 settings->beginGroup("Sims/893581234000000000000/");
848 settings->setValue("Imsi", "310150000000000");
849 settings->setValue("PrimaryPhoneNumber", "123456789");
850 settings->setValue("Mcc", "310");
851 settings->setValue("Mnc", "150");
852 settings->setValue("PreferredLanguages", QVariant(QList<QString>({"en"})));
853 settings->setValue("DataRoamingEnabled", true);
854 settings->endGroup();
855
856 settings->beginGroup("Sims/893581234000000000001/");
857 settings->setValue("Imsi", "310150000000001");
858 settings->setValue("PrimaryPhoneNumber", "123456789");
859 settings->setValue("Mcc", "310");
860 settings->setValue("Mnc", "150");
861 settings->setValue("PreferredLanguages", QVariant(QList<QString>({"en"})));
862 settings->setValue("DataRoamingEnabled", false);
863 settings->endGroup();
864
865 settings->setValue("KnownSims", QVariant(QList<QString>({"893581234000000000000", "893581234000000000001"})));
866 settings->setValue("SimForMobileData", "893581234000000000001");
867 settings->setValue("MobileDataEnabled", true);
868 settings->sync();
869
870 setConnectionManagerProperty(modem, "Powered", true);
871 setConnectionManagerProperty(modem, "RoamingAllowed", false);
872
873 auto modem2 = createModem("ril_1");
874 setConnectionManagerProperty(modem2, "Powered", false);
875 setConnectionManagerProperty(modem2, "RoamingAllowed", true);
876
877
878 // Start the indicator
879 ASSERT_NO_THROW(startIndicator());
880
881
882 // Check that settings are restored on startup
883
884 EXPECT_FALSE(getConnectionManagerProperties(modem)["Powered"].toBool());
885 EXPECT_TRUE(getConnectionManagerProperties(modem)["RoamingAllowed"].toBool());
886
887 EXPECT_TRUE(getConnectionManagerProperties(modem2)["Powered"].toBool());
888 EXPECT_FALSE(getConnectionManagerProperties(modem2)["RoamingAllowed"].toBool());
889}
890
767}891}
768892
=== modified file 'tests/integration/test-indicator.cpp'
--- tests/integration/test-indicator.cpp 2015-11-20 10:25:10 +0000
+++ tests/integration/test-indicator.cpp 2016-06-22 09:42:47 +0000
@@ -24,6 +24,7 @@
2424
25using namespace std;25using namespace std;
26using namespace testing;26using namespace testing;
27using namespace connectivityqt;
27namespace mh = unity::gmenuharness;28namespace mh = unity::gmenuharness;
2829
29namespace30namespace
@@ -44,9 +45,10 @@
44 .state_icons({"gsm-3g-full", "nm-no-connection"})45 .state_icons({"gsm-3g-full", "nm-no-connection"})
45 .mode(mh::MenuItemMatcher::Mode::all)46 .mode(mh::MenuItemMatcher::Mode::all)
46 .submenu()47 .submenu()
47 .item(flightModeSwitch())48 .item(flightModeSwitch())
48 .item(mh::MenuItemMatcher()49 .item(mh::MenuItemMatcher()
49 .section()50 .section()
51 .item(mobileDataSwitch(false))
50 .item(modemInfo("", "fake.tel", "gsm-3g-full"))52 .item(modemInfo("", "fake.tel", "gsm-3g-full"))
51 .item(cellularSettings())53 .item(cellularSettings())
52 )54 )
@@ -195,6 +197,7 @@
195 .item(flightModeSwitch())197 .item(flightModeSwitch())
196 .item(mh::MenuItemMatcher()198 .item(mh::MenuItemMatcher()
197 .section()199 .section()
200 .item(mobileDataSwitch())
198 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))201 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
199 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-full"))202 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-full"))
200 .item(cellularSettings())203 .item(cellularSettings())
@@ -285,6 +288,8 @@
285 .mode(mh::MenuItemMatcher::Mode::starts_with)288 .mode(mh::MenuItemMatcher::Mode::starts_with)
286 .item(flightModeSwitch())289 .item(flightModeSwitch())
287 .item(mh::MenuItemMatcher()290 .item(mh::MenuItemMatcher()
291 .section()
292 .item(mobileDataSwitch(false))
288 .item(modemInfo("", "No SIM", "no-simcard"))293 .item(modemInfo("", "No SIM", "no-simcard"))
289 .item(cellularSettings())294 .item(cellularSettings())
290 )295 )
@@ -311,6 +316,8 @@
311 .mode(mh::MenuItemMatcher::Mode::starts_with)316 .mode(mh::MenuItemMatcher::Mode::starts_with)
312 .item(flightModeSwitch())317 .item(flightModeSwitch())
313 .item(mh::MenuItemMatcher()318 .item(mh::MenuItemMatcher()
319 .section()
320 .item(mobileDataSwitch(false))
314 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))321 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
315 .item(modemInfo("SIM 2", "No SIM", "no-simcard"))322 .item(modemInfo("SIM 2", "No SIM", "no-simcard"))
316 .item(cellularSettings())323 .item(cellularSettings())
@@ -338,6 +345,8 @@
338 .mode(mh::MenuItemMatcher::Mode::starts_with)345 .mode(mh::MenuItemMatcher::Mode::starts_with)
339 .item(flightModeSwitch())346 .item(flightModeSwitch())
340 .item(mh::MenuItemMatcher()347 .item(mh::MenuItemMatcher()
348 .section()
349 .item(mobileDataSwitch(false))
341 .item(modemInfo("", "SIM Locked", "simcard-locked", true)350 .item(modemInfo("", "SIM Locked", "simcard-locked", true)
342 .string_attribute("x-canonical-modem-locked-action", "indicator.modem.1::locked")351 .string_attribute("x-canonical-modem-locked-action", "indicator.modem.1::locked")
343 )352 )
@@ -356,6 +365,8 @@
356 .mode(mh::MenuItemMatcher::Mode::starts_with)365 .mode(mh::MenuItemMatcher::Mode::starts_with)
357 .item(flightModeSwitch())366 .item(flightModeSwitch())
358 .item(mh::MenuItemMatcher()367 .item(mh::MenuItemMatcher()
368 .section()
369 .item(mobileDataSwitch())
359 .item(modemInfo("", "fake.tel", "gsm-3g-full"))370 .item(modemInfo("", "fake.tel", "gsm-3g-full"))
360 .item(cellularSettings())371 .item(cellularSettings())
361 )372 )
@@ -383,6 +394,8 @@
383 .mode(mh::MenuItemMatcher::Mode::starts_with)394 .mode(mh::MenuItemMatcher::Mode::starts_with)
384 .item(flightModeSwitch())395 .item(flightModeSwitch())
385 .item(mh::MenuItemMatcher()396 .item(mh::MenuItemMatcher()
397 .section()
398 .item(mobileDataSwitch())
386 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))399 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
387 .item(modemInfo("SIM 2", "SIM Locked", "simcard-locked", true))400 .item(modemInfo("SIM 2", "SIM Locked", "simcard-locked", true))
388 .item(cellularSettings())401 .item(cellularSettings())
@@ -400,6 +413,8 @@
400 .mode(mh::MenuItemMatcher::Mode::starts_with)413 .mode(mh::MenuItemMatcher::Mode::starts_with)
401 .item(flightModeSwitch())414 .item(flightModeSwitch())
402 .item(mh::MenuItemMatcher()415 .item(mh::MenuItemMatcher()
416 .section()
417 .item(mobileDataSwitch())
403 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))418 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
404 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-full"))419 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-full"))
405 .item(cellularSettings())420 .item(cellularSettings())
@@ -426,6 +441,8 @@
426 .mode(mh::MenuItemMatcher::Mode::starts_with)441 .mode(mh::MenuItemMatcher::Mode::starts_with)
427 .item(flightModeSwitch())442 .item(flightModeSwitch())
428 .item(mh::MenuItemMatcher()443 .item(mh::MenuItemMatcher()
444 .section()
445 .item(mobileDataSwitch())
429 .item(modemInfo("", "No Signal", "gsm-3g-no-service"))446 .item(modemInfo("", "No Signal", "gsm-3g-no-service"))
430 .item(cellularSettings())447 .item(cellularSettings())
431 )448 )
@@ -442,6 +459,8 @@
442 .mode(mh::MenuItemMatcher::Mode::starts_with)459 .mode(mh::MenuItemMatcher::Mode::starts_with)
443 .item(flightModeSwitch())460 .item(flightModeSwitch())
444 .item(mh::MenuItemMatcher()461 .item(mh::MenuItemMatcher()
462 .section()
463 .item(mobileDataSwitch())
445 .item(modemInfo("", "Searching", "gsm-3g-disabled"))464 .item(modemInfo("", "Searching", "gsm-3g-disabled"))
446 .item(cellularSettings())465 .item(cellularSettings())
447 )466 )
@@ -461,6 +480,8 @@
461 .mode(mh::MenuItemMatcher::Mode::starts_with)480 .mode(mh::MenuItemMatcher::Mode::starts_with)
462 .item(flightModeSwitch())481 .item(flightModeSwitch())
463 .item(mh::MenuItemMatcher()482 .item(mh::MenuItemMatcher()
483 .section()
484 .item(mobileDataSwitch())
464 .item(modemInfo("", "fake.tel", "gsm-3g-none"))485 .item(modemInfo("", "fake.tel", "gsm-3g-none"))
465 .item(cellularSettings())486 .item(cellularSettings())
466 )487 )
@@ -477,6 +498,8 @@
477 .mode(mh::MenuItemMatcher::Mode::starts_with)498 .mode(mh::MenuItemMatcher::Mode::starts_with)
478 .item(flightModeSwitch())499 .item(flightModeSwitch())
479 .item(mh::MenuItemMatcher()500 .item(mh::MenuItemMatcher()
501 .section()
502 .item(mobileDataSwitch())
480 .item(modemInfo("", "fake.tel", "gsm-3g-low"))503 .item(modemInfo("", "fake.tel", "gsm-3g-low"))
481 .item(cellularSettings())504 .item(cellularSettings())
482 )505 )
@@ -493,6 +516,8 @@
493 .mode(mh::MenuItemMatcher::Mode::starts_with)516 .mode(mh::MenuItemMatcher::Mode::starts_with)
494 .item(flightModeSwitch())517 .item(flightModeSwitch())
495 .item(mh::MenuItemMatcher()518 .item(mh::MenuItemMatcher()
519 .section()
520 .item(mobileDataSwitch())
496 .item(modemInfo("", "fake.tel", "gsm-3g-medium"))521 .item(modemInfo("", "fake.tel", "gsm-3g-medium"))
497 .item(cellularSettings())522 .item(cellularSettings())
498 )523 )
@@ -509,6 +534,8 @@
509 .mode(mh::MenuItemMatcher::Mode::starts_with)534 .mode(mh::MenuItemMatcher::Mode::starts_with)
510 .item(flightModeSwitch())535 .item(flightModeSwitch())
511 .item(mh::MenuItemMatcher()536 .item(mh::MenuItemMatcher()
537 .section()
538 .item(mobileDataSwitch())
512 .item(modemInfo("", "fake.tel", "gsm-3g-high"))539 .item(modemInfo("", "fake.tel", "gsm-3g-high"))
513 .item(cellularSettings())540 .item(cellularSettings())
514 )541 )
@@ -525,6 +552,8 @@
525 .mode(mh::MenuItemMatcher::Mode::starts_with)552 .mode(mh::MenuItemMatcher::Mode::starts_with)
526 .item(flightModeSwitch())553 .item(flightModeSwitch())
527 .item(mh::MenuItemMatcher()554 .item(mh::MenuItemMatcher()
555 .section()
556 .item(mobileDataSwitch())
528 .item(modemInfo("", "fake.tel", "gsm-3g-full"))557 .item(modemInfo("", "fake.tel", "gsm-3g-full"))
529 .item(cellularSettings())558 .item(cellularSettings())
530 )559 )
@@ -551,6 +580,8 @@
551 .mode(mh::MenuItemMatcher::Mode::starts_with)580 .mode(mh::MenuItemMatcher::Mode::starts_with)
552 .item(flightModeSwitch())581 .item(flightModeSwitch())
553 .item(mh::MenuItemMatcher()582 .item(mh::MenuItemMatcher()
583 .section()
584 .item(mobileDataSwitch())
554 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))585 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
555 .item(modemInfo("SIM 2", "No Signal", "gsm-3g-no-service"))586 .item(modemInfo("SIM 2", "No Signal", "gsm-3g-no-service"))
556 .item(cellularSettings())587 .item(cellularSettings())
@@ -568,6 +599,8 @@
568 .mode(mh::MenuItemMatcher::Mode::starts_with)599 .mode(mh::MenuItemMatcher::Mode::starts_with)
569 .item(flightModeSwitch())600 .item(flightModeSwitch())
570 .item(mh::MenuItemMatcher()601 .item(mh::MenuItemMatcher()
602 .section()
603 .item(mobileDataSwitch())
571 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))604 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
572 .item(modemInfo("SIM 2", "Searching", "gsm-3g-disabled"))605 .item(modemInfo("SIM 2", "Searching", "gsm-3g-disabled"))
573 .item(cellularSettings())606 .item(cellularSettings())
@@ -588,6 +621,8 @@
588 .mode(mh::MenuItemMatcher::Mode::starts_with)621 .mode(mh::MenuItemMatcher::Mode::starts_with)
589 .item(flightModeSwitch())622 .item(flightModeSwitch())
590 .item(mh::MenuItemMatcher()623 .item(mh::MenuItemMatcher()
624 .section()
625 .item(mobileDataSwitch())
591 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))626 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
592 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-none"))627 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-none"))
593 .item(cellularSettings())628 .item(cellularSettings())
@@ -605,6 +640,8 @@
605 .mode(mh::MenuItemMatcher::Mode::starts_with)640 .mode(mh::MenuItemMatcher::Mode::starts_with)
606 .item(flightModeSwitch())641 .item(flightModeSwitch())
607 .item(mh::MenuItemMatcher()642 .item(mh::MenuItemMatcher()
643 .section()
644 .item(mobileDataSwitch())
608 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))645 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
609 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-low"))646 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-low"))
610 .item(cellularSettings())647 .item(cellularSettings())
@@ -622,6 +659,8 @@
622 .mode(mh::MenuItemMatcher::Mode::starts_with)659 .mode(mh::MenuItemMatcher::Mode::starts_with)
623 .item(flightModeSwitch())660 .item(flightModeSwitch())
624 .item(mh::MenuItemMatcher()661 .item(mh::MenuItemMatcher()
662 .section()
663 .item(mobileDataSwitch())
625 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))664 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
626 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-medium"))665 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-medium"))
627 .item(cellularSettings())666 .item(cellularSettings())
@@ -639,6 +678,8 @@
639 .mode(mh::MenuItemMatcher::Mode::starts_with)678 .mode(mh::MenuItemMatcher::Mode::starts_with)
640 .item(flightModeSwitch())679 .item(flightModeSwitch())
641 .item(mh::MenuItemMatcher()680 .item(mh::MenuItemMatcher()
681 .section()
682 .item(mobileDataSwitch())
642 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))683 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
643 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-high"))684 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-high"))
644 .item(cellularSettings())685 .item(cellularSettings())
@@ -656,6 +697,8 @@
656 .mode(mh::MenuItemMatcher::Mode::starts_with)697 .mode(mh::MenuItemMatcher::Mode::starts_with)
657 .item(flightModeSwitch())698 .item(flightModeSwitch())
658 .item(mh::MenuItemMatcher()699 .item(mh::MenuItemMatcher()
700 .section()
701 .item(mobileDataSwitch())
659 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))702 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
660 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-full"))703 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-full"))
661 .item(cellularSettings())704 .item(cellularSettings())
@@ -688,6 +731,8 @@
688 .mode(mh::MenuItemMatcher::Mode::starts_with)731 .mode(mh::MenuItemMatcher::Mode::starts_with)
689 .item(flightModeSwitch(false))732 .item(flightModeSwitch(false))
690 .item(mh::MenuItemMatcher()733 .item(mh::MenuItemMatcher()
734 .section()
735 .item(mobileDataSwitch())
691 .item(modemInfo("", "No SIM", "no-simcard"))736 .item(modemInfo("", "No SIM", "no-simcard"))
692 .item(cellularSettings())737 .item(cellularSettings())
693 )738 )
@@ -728,6 +773,8 @@
728 .mode(mh::MenuItemMatcher::Mode::starts_with)773 .mode(mh::MenuItemMatcher::Mode::starts_with)
729 .item(flightModeSwitch(true))774 .item(flightModeSwitch(true))
730 .item(mh::MenuItemMatcher()775 .item(mh::MenuItemMatcher()
776 .section()
777 .item(mobileDataSwitch())
731 .item(modemInfo("", "No SIM", "no-simcard"))778 .item(modemInfo("", "No SIM", "no-simcard"))
732 .item(cellularSettings())779 .item(cellularSettings())
733 )780 )
@@ -761,6 +808,8 @@
761 .mode(mh::MenuItemMatcher::Mode::starts_with)808 .mode(mh::MenuItemMatcher::Mode::starts_with)
762 .item(flightModeSwitch(false))809 .item(flightModeSwitch(false))
763 .item(mh::MenuItemMatcher()810 .item(mh::MenuItemMatcher()
811 .section()
812 .item(mobileDataSwitch())
764 .item(modemInfo("", "No SIM", "no-simcard"))813 .item(modemInfo("", "No SIM", "no-simcard"))
765 .item(cellularSettings())814 .item(cellularSettings())
766 )815 )
@@ -793,6 +842,8 @@
793 .mode(mh::MenuItemMatcher::Mode::starts_with)842 .mode(mh::MenuItemMatcher::Mode::starts_with)
794 .item(flightModeSwitch(false))843 .item(flightModeSwitch(false))
795 .item(mh::MenuItemMatcher()844 .item(mh::MenuItemMatcher()
845 .section()
846 .item(mobileDataSwitch())
796 .item(modemInfo("", "SIM Locked", "simcard-locked", true))847 .item(modemInfo("", "SIM Locked", "simcard-locked", true))
797 .item(cellularSettings())848 .item(cellularSettings())
798 )849 )
@@ -832,6 +883,8 @@
832 .mode(mh::MenuItemMatcher::Mode::starts_with)883 .mode(mh::MenuItemMatcher::Mode::starts_with)
833 .item(flightModeSwitch(true))884 .item(flightModeSwitch(true))
834 .item(mh::MenuItemMatcher()885 .item(mh::MenuItemMatcher()
886 .section()
887 .item(mobileDataSwitch())
835 .item(modemInfo("", "SIM Locked", "simcard-locked", true))888 .item(modemInfo("", "SIM Locked", "simcard-locked", true))
836 .item(cellularSettings())889 .item(cellularSettings())
837 )890 )
@@ -865,6 +918,8 @@
865 .mode(mh::MenuItemMatcher::Mode::starts_with)918 .mode(mh::MenuItemMatcher::Mode::starts_with)
866 .item(flightModeSwitch(false))919 .item(flightModeSwitch(false))
867 .item(mh::MenuItemMatcher()920 .item(mh::MenuItemMatcher()
921 .section()
922 .item(mobileDataSwitch())
868 .item(modemInfo("", "SIM Locked", "simcard-locked", true))923 .item(modemInfo("", "SIM Locked", "simcard-locked", true))
869 .item(cellularSettings())924 .item(cellularSettings())
870 )925 )
@@ -908,6 +963,8 @@
908 .mode(mh::MenuItemMatcher::Mode::starts_with)963 .mode(mh::MenuItemMatcher::Mode::starts_with)
909 .item(flightModeSwitch(false))964 .item(flightModeSwitch(false))
910 .item(mh::MenuItemMatcher()965 .item(mh::MenuItemMatcher()
966 .section()
967 .item(mobileDataSwitch(false))
911 .item(modemInfo("", "fake.tel", "gsm-3g-high"))968 .item(modemInfo("", "fake.tel", "gsm-3g-high"))
912 .item(cellularSettings())969 .item(cellularSettings())
913 )970 )
@@ -959,6 +1016,8 @@
959 .mode(mh::MenuItemMatcher::Mode::starts_with)1016 .mode(mh::MenuItemMatcher::Mode::starts_with)
960 .item(flightModeSwitch(false))1017 .item(flightModeSwitch(false))
961 .item(mh::MenuItemMatcher()1018 .item(mh::MenuItemMatcher()
1019 .section()
1020 .item(mobileDataSwitch(false))
962 .item(modemInfo("", "fake.tel", "gsm-3g-high"))1021 .item(modemInfo("", "fake.tel", "gsm-3g-high"))
963 .item(cellularSettings())1022 .item(cellularSettings())
964 )1023 )
@@ -988,6 +1047,8 @@
988 .mode(mh::MenuItemMatcher::Mode::starts_with)1047 .mode(mh::MenuItemMatcher::Mode::starts_with)
989 .item(flightModeSwitch(true))1048 .item(flightModeSwitch(true))
990 .item(mh::MenuItemMatcher()1049 .item(mh::MenuItemMatcher()
1050 .section()
1051 .item(mobileDataSwitch(false))
991 .item(modemInfo("", "Offline", "gsm-3g-disabled"))1052 .item(modemInfo("", "Offline", "gsm-3g-disabled"))
992 .item(cellularSettings())1053 .item(cellularSettings())
993 )1054 )
@@ -1022,6 +1083,8 @@
1022 .mode(mh::MenuItemMatcher::Mode::starts_with)1083 .mode(mh::MenuItemMatcher::Mode::starts_with)
1023 .item(flightModeSwitch(false))1084 .item(flightModeSwitch(false))
1024 .item(mh::MenuItemMatcher()1085 .item(mh::MenuItemMatcher()
1086 .section()
1087 .item(mobileDataSwitch(true))
1025 .item(modemInfo("", "fake.tel", "gsm-3g-high", false, "network-cellular-pre-edge"))1088 .item(modemInfo("", "fake.tel", "gsm-3g-high", false, "network-cellular-pre-edge"))
1026 .item(cellularSettings())1089 .item(cellularSettings())
1027 )1090 )
@@ -1068,6 +1131,8 @@
1068 .mode(mh::MenuItemMatcher::Mode::starts_with)1131 .mode(mh::MenuItemMatcher::Mode::starts_with)
1069 .item(flightModeSwitch(false))1132 .item(flightModeSwitch(false))
1070 .item(mh::MenuItemMatcher()1133 .item(mh::MenuItemMatcher()
1134 .section()
1135 .item(mobileDataSwitch())
1071 .item(modemInfo("", "fake.tel", "gsm-3g-low"))1136 .item(modemInfo("", "fake.tel", "gsm-3g-low"))
1072 .item(cellularSettings())1137 .item(cellularSettings())
1073 )1138 )
@@ -1116,6 +1181,8 @@
1116 .mode(mh::MenuItemMatcher::Mode::starts_with)1181 .mode(mh::MenuItemMatcher::Mode::starts_with)
1117 .item(flightModeSwitch(true))1182 .item(flightModeSwitch(true))
1118 .item(mh::MenuItemMatcher()1183 .item(mh::MenuItemMatcher()
1184 .section()
1185 .item(mobileDataSwitch())
1119 .item(modemInfo("", "Offline", "gsm-3g-disabled"))1186 .item(modemInfo("", "Offline", "gsm-3g-disabled"))
1120 .item(cellularSettings())1187 .item(cellularSettings())
1121 )1188 )
@@ -1162,6 +1229,8 @@
1162 .mode(mh::MenuItemMatcher::Mode::starts_with)1229 .mode(mh::MenuItemMatcher::Mode::starts_with)
1163 .item(flightModeSwitch(true))1230 .item(flightModeSwitch(true))
1164 .item(mh::MenuItemMatcher()1231 .item(mh::MenuItemMatcher()
1232 .section()
1233 .item(mobileDataSwitch())
1165 .item(modemInfo("", "Offline", "gsm-3g-disabled"))1234 .item(modemInfo("", "Offline", "gsm-3g-disabled"))
1166 .item(cellularSettings())1235 .item(cellularSettings())
1167 )1236 )
@@ -1199,6 +1268,8 @@
1199 .mode(mh::MenuItemMatcher::Mode::starts_with)1268 .mode(mh::MenuItemMatcher::Mode::starts_with)
1200 .item(flightModeSwitch(false))1269 .item(flightModeSwitch(false))
1201 .item(mh::MenuItemMatcher()1270 .item(mh::MenuItemMatcher()
1271 .section()
1272 .item(mobileDataSwitch())
1202 .item(modemInfo("", "fake.tel", "gsm-3g-low"))1273 .item(modemInfo("", "fake.tel", "gsm-3g-low"))
1203 .item(cellularSettings())1274 .item(cellularSettings())
1204 )1275 )
@@ -1347,6 +1418,8 @@
1347 .mode(mh::MenuItemMatcher::Mode::starts_with)1418 .mode(mh::MenuItemMatcher::Mode::starts_with)
1348 .item(flightModeSwitch(false))1419 .item(flightModeSwitch(false))
1349 .item(mh::MenuItemMatcher()1420 .item(mh::MenuItemMatcher()
1421 .section()
1422 .item(mobileDataSwitch())
1350 .item(modemInfo("", "fake.tel", "gsm-3g-full"))1423 .item(modemInfo("", "fake.tel", "gsm-3g-full"))
1351 .item(cellularSettings())1424 .item(cellularSettings())
1352 )1425 )
@@ -1392,6 +1465,8 @@
1392 .mode(mh::MenuItemMatcher::Mode::starts_with)1465 .mode(mh::MenuItemMatcher::Mode::starts_with)
1393 .item(flightModeSwitch(false))1466 .item(flightModeSwitch(false))
1394 .item(mh::MenuItemMatcher()1467 .item(mh::MenuItemMatcher()
1468 .section()
1469 .item(mobileDataSwitch())
1395 .item(modemInfo("", "No SIM", "no-simcard"))1470 .item(modemInfo("", "No SIM", "no-simcard"))
1396 .item(cellularSettings())1471 .item(cellularSettings())
1397 )1472 )
@@ -1431,6 +1506,8 @@
1431 .mode(mh::MenuItemMatcher::Mode::starts_with)1506 .mode(mh::MenuItemMatcher::Mode::starts_with)
1432 .item(flightModeSwitch(false))1507 .item(flightModeSwitch(false))
1433 .item(mh::MenuItemMatcher()1508 .item(mh::MenuItemMatcher()
1509 .section()
1510 .item(mobileDataSwitch())
1434 .item(modemInfo("", "No SIM", "no-simcard"))1511 .item(modemInfo("", "No SIM", "no-simcard"))
1435 .item(cellularSettings())1512 .item(cellularSettings())
1436 )1513 )
@@ -1607,6 +1684,8 @@
1607 .mode(mh::MenuItemMatcher::Mode::starts_with)1684 .mode(mh::MenuItemMatcher::Mode::starts_with)
1608 .item(flightModeSwitch(false))1685 .item(flightModeSwitch(false))
1609 .item(mh::MenuItemMatcher()1686 .item(mh::MenuItemMatcher()
1687 .section()
1688 .item(mobileDataSwitch())
1610 .item(modemInfo("", "No SIM", "no-simcard"))1689 .item(modemInfo("", "No SIM", "no-simcard"))
1611 .item(cellularSettings())1690 .item(cellularSettings())
1612 )1691 )
@@ -1764,6 +1843,8 @@
1764 .mode(mh::MenuItemMatcher::Mode::starts_with)1843 .mode(mh::MenuItemMatcher::Mode::starts_with)
1765 .item(flightModeSwitch(false))1844 .item(flightModeSwitch(false))
1766 .item(mh::MenuItemMatcher()1845 .item(mh::MenuItemMatcher()
1846 .section()
1847 .item(mobileDataSwitch())
1767 .item(modemInfo("", "No SIM", "no-simcard"))1848 .item(modemInfo("", "No SIM", "no-simcard"))
1768 .item(cellularSettings())1849 .item(cellularSettings())
1769 )1850 )
@@ -1792,6 +1873,8 @@
1792 .mode(mh::MenuItemMatcher::Mode::starts_with)1873 .mode(mh::MenuItemMatcher::Mode::starts_with)
1793 .item(flightModeSwitch(false))1874 .item(flightModeSwitch(false))
1794 .item(mh::MenuItemMatcher()1875 .item(mh::MenuItemMatcher()
1876 .section()
1877 .item(mobileDataSwitch())
1795 .item(modemInfo("", "No SIM", "no-simcard"))1878 .item(modemInfo("", "No SIM", "no-simcard"))
1796 .item(cellularSettings())1879 .item(cellularSettings())
1797 )1880 )
@@ -1821,6 +1904,8 @@
1821 .mode(mh::MenuItemMatcher::Mode::starts_with)1904 .mode(mh::MenuItemMatcher::Mode::starts_with)
1822 .item(flightModeSwitch(false))1905 .item(flightModeSwitch(false))
1823 .item(mh::MenuItemMatcher()1906 .item(mh::MenuItemMatcher()
1907 .section()
1908 .item(mobileDataSwitch())
1824 .item(modemInfo("", "No SIM", "no-simcard"))1909 .item(modemInfo("", "No SIM", "no-simcard"))
1825 .item(cellularSettings())1910 .item(cellularSettings())
1826 )1911 )
@@ -1849,6 +1934,8 @@
1849 .mode(mh::MenuItemMatcher::Mode::starts_with)1934 .mode(mh::MenuItemMatcher::Mode::starts_with)
1850 .item(flightModeSwitch(false))1935 .item(flightModeSwitch(false))
1851 .item(mh::MenuItemMatcher()1936 .item(mh::MenuItemMatcher()
1937 .section()
1938 .item(mobileDataSwitch())
1852 .item(modemInfo("", "No SIM", "no-simcard"))1939 .item(modemInfo("", "No SIM", "no-simcard"))
1853 .item(cellularSettings())1940 .item(cellularSettings())
1854 )1941 )
@@ -1897,6 +1984,8 @@
1897 .mode(mh::MenuItemMatcher::Mode::starts_with)1984 .mode(mh::MenuItemMatcher::Mode::starts_with)
1898 .item(flightModeSwitch(false))1985 .item(flightModeSwitch(false))
1899 .item(mh::MenuItemMatcher()1986 .item(mh::MenuItemMatcher()
1987 .section()
1988 .item(mobileDataSwitch())
1900 .item(modemInfo("", "No SIM", "no-simcard"))1989 .item(modemInfo("", "No SIM", "no-simcard"))
1901 .item(cellularSettings())1990 .item(cellularSettings())
1902 )1991 )
@@ -1954,6 +2043,8 @@
1954 .mode(mh::MenuItemMatcher::Mode::starts_with)2043 .mode(mh::MenuItemMatcher::Mode::starts_with)
1955 .item(flightModeSwitch())2044 .item(flightModeSwitch())
1956 .item(mh::MenuItemMatcher()2045 .item(mh::MenuItemMatcher()
2046 .section()
2047 .item(mobileDataSwitch(true))
1957 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-high", false, "network-cellular-hspa"))2048 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-high", false, "network-cellular-hspa"))
1958 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-low"))2049 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-low"))
1959 .item(cellularSettings())2050 .item(cellularSettings())
@@ -1971,6 +2062,8 @@
1971 .mode(mh::MenuItemMatcher::Mode::starts_with)2062 .mode(mh::MenuItemMatcher::Mode::starts_with)
1972 .item(flightModeSwitch())2063 .item(flightModeSwitch())
1973 .item(mh::MenuItemMatcher()2064 .item(mh::MenuItemMatcher()
2065 .section()
2066 .item(mobileDataSwitch(true))
1974 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-high", false, "network-cellular-edge"))2067 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-high", false, "network-cellular-edge"))
1975 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-low"))2068 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-low"))
1976 .item(cellularSettings())2069 .item(cellularSettings())
@@ -1979,8 +2072,10 @@
1979 ).match());2072 ).match());
19802073
1981 // Set second SIM as the active data connection2074 // Set second SIM as the active data connection
1982 setConnectionManagerProperty(firstModem(), "Powered", false);2075 auto connectivity = newConnectivity();
1983 setConnectionManagerProperty(secondModem, "Powered", true);2076 auto modems = getSortedModems(*connectivity);
2077 auto sim2 = getModemSim(*modems, 1);
2078 connectivity->setSimForMobileData(sim2);
19842079
1985 // Now we should have a 3G icon2080 // Now we should have a 3G icon
1986 EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())2081 EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
@@ -1989,6 +2084,8 @@
1989 .mode(mh::MenuItemMatcher::Mode::starts_with)2084 .mode(mh::MenuItemMatcher::Mode::starts_with)
1990 .item(flightModeSwitch())2085 .item(flightModeSwitch())
1991 .item(mh::MenuItemMatcher()2086 .item(mh::MenuItemMatcher()
2087 .section()
2088 .item(mobileDataSwitch(true))
1992 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-high"))2089 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-high"))
1993 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-low", false, "network-cellular-3g"))2090 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-low", false, "network-cellular-3g"))
1994 .item(cellularSettings())2091 .item(cellularSettings())
@@ -2028,6 +2125,8 @@
2028 .mode(mh::MenuItemMatcher::Mode::starts_with)2125 .mode(mh::MenuItemMatcher::Mode::starts_with)
2029 .item(flightModeSwitch())2126 .item(flightModeSwitch())
2030 .item(mh::MenuItemMatcher()2127 .item(mh::MenuItemMatcher()
2128 .section()
2129 .item(mobileDataSwitch(false))
2031 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-low"))2130 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-low"))
2032 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-high"))2131 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-high"))
2033 .item(cellularSettings())2132 .item(cellularSettings())
@@ -2048,6 +2147,8 @@
2048 .mode(mh::MenuItemMatcher::Mode::starts_with)2147 .mode(mh::MenuItemMatcher::Mode::starts_with)
2049 .item(flightModeSwitch())2148 .item(flightModeSwitch())
2050 .item(mh::MenuItemMatcher()2149 .item(mh::MenuItemMatcher()
2150 .section()
2151 .item(mobileDataSwitch(true))
2051 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-low"))2152 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-low"))
2052 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-high", false, "network-cellular-3g"))2153 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-high", false, "network-cellular-3g"))
2053 .item(cellularSettings())2154 .item(cellularSettings())
@@ -2071,6 +2172,8 @@
2071 .mode(mh::MenuItemMatcher::Mode::starts_with)2172 .mode(mh::MenuItemMatcher::Mode::starts_with)
2072 .item(flightModeSwitch())2173 .item(flightModeSwitch())
2073 .item(mh::MenuItemMatcher()2174 .item(mh::MenuItemMatcher()
2175 .section()
2176 .item(mobileDataSwitch(true))
2074 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-low"))2177 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-low"))
2075 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-high", false, "network-cellular-3g"))2178 .item(modemInfo("SIM 2", "fake.tel", "gsm-3g-high", false, "network-cellular-3g"))
2076 .item(cellularSettings())2179 .item(cellularSettings())
@@ -2110,6 +2213,8 @@
2110 .mode(mh::MenuItemMatcher::Mode::starts_with)2213 .mode(mh::MenuItemMatcher::Mode::starts_with)
2111 .item(flightModeSwitch())2214 .item(flightModeSwitch())
2112 .item(mh::MenuItemMatcher()2215 .item(mh::MenuItemMatcher()
2216 .section()
2217 .item(mobileDataSwitch())
2113 .item(modemInfo("", "SIM Locked", "simcard-locked", true)2218 .item(modemInfo("", "SIM Locked", "simcard-locked", true)
2114 .pass_through_activate("x-canonical-modem-locked-action")2219 .pass_through_activate("x-canonical-modem-locked-action")
2115 )2220 )
@@ -2201,6 +2306,8 @@
2201 .mode(mh::MenuItemMatcher::Mode::starts_with)2306 .mode(mh::MenuItemMatcher::Mode::starts_with)
2202 .item(flightModeSwitch())2307 .item(flightModeSwitch())
2203 .item(mh::MenuItemMatcher()2308 .item(mh::MenuItemMatcher()
2309 .section()
2310 .item(mobileDataSwitch())
2204 .item(modemInfo("", "SIM Locked", "simcard-locked", true)2311 .item(modemInfo("", "SIM Locked", "simcard-locked", true)
2205 .pass_through_activate("x-canonical-modem-locked-action")2312 .pass_through_activate("x-canonical-modem-locked-action")
2206 )2313 )
@@ -2256,6 +2363,8 @@
2256 .mode(mh::MenuItemMatcher::Mode::starts_with)2363 .mode(mh::MenuItemMatcher::Mode::starts_with)
2257 .item(flightModeSwitch())2364 .item(flightModeSwitch())
2258 .item(mh::MenuItemMatcher()2365 .item(mh::MenuItemMatcher()
2366 .section()
2367 .item(mobileDataSwitch())
2259 .item(modemInfo("", "SIM Locked", "simcard-locked", true)2368 .item(modemInfo("", "SIM Locked", "simcard-locked", true)
2260 .pass_through_activate("x-canonical-modem-locked-action")2369 .pass_through_activate("x-canonical-modem-locked-action")
2261 )2370 )
@@ -2322,6 +2431,8 @@
2322 .mode(mh::MenuItemMatcher::Mode::starts_with)2431 .mode(mh::MenuItemMatcher::Mode::starts_with)
2323 .item(flightModeSwitch())2432 .item(flightModeSwitch())
2324 .item(mh::MenuItemMatcher()2433 .item(mh::MenuItemMatcher()
2434 .section()
2435 .item(mobileDataSwitch())
2325 .item(modemInfo("SIM 1", "SIM Locked", "simcard-locked", true)2436 .item(modemInfo("SIM 1", "SIM Locked", "simcard-locked", true)
2326 .pass_through_activate("x-canonical-modem-locked-action")2437 .pass_through_activate("x-canonical-modem-locked-action")
2327 )2438 )
@@ -2378,6 +2489,8 @@
2378 .mode(mh::MenuItemMatcher::Mode::starts_with)2489 .mode(mh::MenuItemMatcher::Mode::starts_with)
2379 .item(flightModeSwitch())2490 .item(flightModeSwitch())
2380 .item(mh::MenuItemMatcher()2491 .item(mh::MenuItemMatcher()
2492 .section()
2493 .item(mobileDataSwitch())
2381 .item(modemInfo("SIM 1", "SIM Locked", "simcard-locked", true))2494 .item(modemInfo("SIM 1", "SIM Locked", "simcard-locked", true))
2382 .item(modemInfo("SIM 2", "SIM Locked", "simcard-locked", true)2495 .item(modemInfo("SIM 2", "SIM Locked", "simcard-locked", true)
2383 .pass_through_activate("x-canonical-modem-locked-action")2496 .pass_through_activate("x-canonical-modem-locked-action")
@@ -2444,6 +2557,8 @@
2444 .mode(mh::MenuItemMatcher::Mode::starts_with)2557 .mode(mh::MenuItemMatcher::Mode::starts_with)
2445 .item(flightModeSwitch())2558 .item(flightModeSwitch())
2446 .item(mh::MenuItemMatcher()2559 .item(mh::MenuItemMatcher()
2560 .section()
2561 .item(mobileDataSwitch())
2447 .item(modemInfo("", "SIM Locked", "simcard-locked", true)2562 .item(modemInfo("", "SIM Locked", "simcard-locked", true)
2448 .pass_through_activate("x-canonical-modem-locked-action")2563 .pass_through_activate("x-canonical-modem-locked-action")
2449 )2564 )
@@ -2527,6 +2642,8 @@
2527 .mode(mh::MenuItemMatcher::Mode::starts_with)2642 .mode(mh::MenuItemMatcher::Mode::starts_with)
2528 .item(flightModeSwitch())2643 .item(flightModeSwitch())
2529 .item(mh::MenuItemMatcher()2644 .item(mh::MenuItemMatcher()
2645 .section()
2646 .item(mobileDataSwitch())
2530 .item(modemInfo("", "SIM Locked", "simcard-locked", true)2647 .item(modemInfo("", "SIM Locked", "simcard-locked", true)
2531 .pass_through_activate("x-canonical-modem-locked-action")2648 .pass_through_activate("x-canonical-modem-locked-action")
2532 )2649 )
@@ -2809,6 +2926,8 @@
2809 .mode(mh::MenuItemMatcher::Mode::starts_with)2926 .mode(mh::MenuItemMatcher::Mode::starts_with)
2810 .item(flightModeSwitch())2927 .item(flightModeSwitch())
2811 .item(mh::MenuItemMatcher()2928 .item(mh::MenuItemMatcher()
2929 .section()
2930 .item(mobileDataSwitch())
2812 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))2931 .item(modemInfo("SIM 1", "fake.tel", "gsm-3g-full"))
2813 .item(modemInfo("SIM 2", "SIM Locked", "simcard-locked", true)2932 .item(modemInfo("SIM 2", "SIM Locked", "simcard-locked", true)
2814 .pass_through_activate("x-canonical-modem-locked-action")2933 .pass_through_activate("x-canonical-modem-locked-action")
@@ -3068,4 +3187,144 @@
3068 notificationsSpy.clear();3187 notificationsSpy.clear();
3069}3188}
30703189
3190TEST_F(TestIndicator, CellularData_1)
3191{
3192 auto con = newConnectivity();
3193
3194 ASSERT_NO_THROW(startIndicator());
3195
3196 // Check that the indicator switch is enabled when we are not in flightmode
3197 // and there is a SIM for mobile data set.
3198
3199 con->setMobileDataEnabled(true);
3200 con->setFlightMode(false);
3201 con->setSimForMobileData(getModemSim(*con->modems(), 0));
3202
3203 EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
3204 .item(mh::MenuItemMatcher()
3205 .mode(mh::MenuItemMatcher::Mode::starts_with)
3206 .submenu()
3207 .item(flightModeSwitch())
3208 .item(mh::MenuItemMatcher()
3209 .mode(mh::MenuItemMatcher::Mode::starts_with)
3210 .section()
3211 .item(mobileDataSwitch(true)
3212 .enabled(true)
3213 )
3214 )
3215 ).match());
3216
3217 // Check that the indicator switch is disabled when we are in flightmode
3218 con->setFlightMode(true);
3219 EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
3220 .item(mh::MenuItemMatcher()
3221 .mode(mh::MenuItemMatcher::Mode::starts_with)
3222 .submenu()
3223 .item(flightModeSwitch())
3224 .item(mh::MenuItemMatcher()
3225 .mode(mh::MenuItemMatcher::Mode::starts_with)
3226 .section()
3227 .item(mobileDataSwitch(true)
3228 .enabled(false)
3229 )
3230 )
3231 ).match());
3232
3233 // Check that the indicator switch is disabled when there is no SIM for mobile data set.
3234 con->setFlightMode(false);
3235 con->setSimForMobileData(nullptr);
3236 EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
3237 .item(mh::MenuItemMatcher()
3238 .mode(mh::MenuItemMatcher::Mode::starts_with)
3239 .submenu()
3240 .item(flightModeSwitch())
3241 .item(mh::MenuItemMatcher()
3242 .mode(mh::MenuItemMatcher::Mode::starts_with)
3243 .section()
3244 .item(mobileDataSwitch(true)
3245 .enabled(false)
3246 )
3247 )
3248 ).match());
3249}
3250
3251TEST_F(TestIndicator, CellularData_2)
3252{
3253 auto con = newConnectivity();
3254
3255 ASSERT_NO_THROW(startIndicator());
3256
3257 // Check that Connectivity::mobileDataEnabled follows the indicator switch
3258
3259 con->setMobileDataEnabled(true);
3260 con->setFlightMode(false);
3261 con->setSimForMobileData(getModemSim(*con->modems(), 0));
3262 QTest::qWait(250);
3263 QSignalSpy spy(con.get(), SIGNAL(mobileDataEnabledUpdated(bool)));
3264
3265 EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
3266 .item(mh::MenuItemMatcher()
3267 .mode(mh::MenuItemMatcher::Mode::starts_with)
3268 .submenu()
3269 .item(flightModeSwitch())
3270 .item(mh::MenuItemMatcher()
3271 .mode(mh::MenuItemMatcher::Mode::starts_with)
3272 .section()
3273 .item(mobileDataSwitch(true)
3274 .activate()
3275 )
3276 )
3277 ).match());
3278
3279 WAIT_FOR_SIGNALS(spy, 1);
3280 EXPECT_EQ(spy[0], QVariantList() << QVariant(false));
3281 spy.clear();
3282
3283 EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
3284 .item(mh::MenuItemMatcher()
3285 .mode(mh::MenuItemMatcher::Mode::starts_with)
3286 .submenu()
3287 .item(flightModeSwitch())
3288 .item(mh::MenuItemMatcher()
3289 .mode(mh::MenuItemMatcher::Mode::starts_with)
3290 .section()
3291 .item(mobileDataSwitch(false)
3292 .activate()
3293 )
3294 )
3295 ).match());
3296
3297 WAIT_FOR_SIGNALS(spy, 1);
3298 EXPECT_EQ(spy[0], QVariantList() << QVariant(true));
3299
3300
3301 // Check that indicator switch follows the Connectivity::mobileDataEnabled
3302
3303 con->setMobileDataEnabled(true);
3304 EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
3305 .item(mh::MenuItemMatcher()
3306 .mode(mh::MenuItemMatcher::Mode::starts_with)
3307 .submenu()
3308 .item(flightModeSwitch())
3309 .item(mh::MenuItemMatcher()
3310 .mode(mh::MenuItemMatcher::Mode::starts_with)
3311 .section()
3312 .item(mobileDataSwitch(true))
3313 )
3314 ).match());
3315
3316 con->setMobileDataEnabled(false);
3317 EXPECT_MATCHRESULT(mh::MenuMatcher(phoneParameters())
3318 .item(mh::MenuItemMatcher()
3319 .mode(mh::MenuItemMatcher::Mode::starts_with)
3320 .submenu()
3321 .item(flightModeSwitch())
3322 .item(mh::MenuItemMatcher()
3323 .mode(mh::MenuItemMatcher::Mode::starts_with)
3324 .section()
3325 .item(mobileDataSwitch(false))
3326 )
3327 ).match());
3328}
3329
3071} // namespace3330} // namespace

Subscribers

People subscribed via source and target branches