Skip to content
This repository was archived by the owner on Mar 15, 2018. It is now read-only.

Commit bab2d97

Browse files
committed
add dual SIM support for detecting MCC/MNC for region/carrier (bug 942355)
1 parent a859d4c commit bab2d97

2 files changed

Lines changed: 181 additions & 38 deletions

File tree

hearth/media/js/mobilenetwork.js

Lines changed: 107 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@ define('mobilenetwork',
235235
};
236236

237237
function getNetwork(mcc, mnc) {
238+
console.tagged('getNetwork').log('Trying MCC = ' + mcc + ', MNC = ' + mnc);
239+
238240
// Look up region and carrier from MCC (Mobile Country Code)
239241
// and MNC (Mobile Network Code).
240242

@@ -297,6 +299,7 @@ define('mobilenetwork',
297299
}
298300

299301
function detectMobileNetwork(navigator, fake) {
302+
var consoleFunc = console.tagged('detectMobileNetwork');
300303
navigator = navigator || window.navigator;
301304

302305
var newSettings = {};
@@ -306,30 +309,89 @@ define('mobilenetwork',
306309
// Get mobile region and carrier information passed via querystring.
307310
var mcc = GET.mcc;
308311
var mnc = GET.mnc;
312+
var mccs = [];
313+
try {
314+
mccs = JSON.parse(GET.mccs || '[]');
315+
} catch(e) {
316+
}
309317

310318
var carrier = GET.carrier || user.get_setting('carrier') || null;
311319

312320
try {
321+
// navigator.mozMobileConnections is the new API.
322+
// navigator.mozMobileConnection is the legacy API.
323+
313324
// When Fireplace is served as a privileged packaged app (and not
314325
// served via Yulelog) our JS will have direct access to this API.
315-
var conn = navigator.mozMobileConnection;
316-
if (conn) {
317-
// `MCC`: Mobile Country Code
318-
// `MNC`: Mobile Network Code
319-
// `lastKnownHomeNetwork`: `{MCC}-{MNC}` (SIM's origin)
320-
// `lastKnownNetwork`: `{MCC}-{MNC}` (could be different network if roaming)
321-
var lastNetwork = (conn.lastKnownHomeNetwork || conn.lastKnownNetwork || '-').split('-');
322-
mcc = lastNetwork[0];
323-
mnc = lastNetwork[1];
324-
console.log('lastKnownNetwork', conn.lastKnownNetwork);
325-
console.log('lastKnownHomeNetwork', conn.lastKnownHomeNetwork);
326-
console.log('MCC = ' + mcc + ', MNC = ' + mnc);
326+
// Assignment not comparison below.
327+
if (conn = navigator.mozMobileConnections) {
328+
consoleFunc.log('navigator.mozMobileConnections available');
329+
/*
330+
Example format:
331+
332+
[
333+
{
334+
data: {
335+
network: {
336+
mcc: '260',
337+
mnc: '02'
338+
}
339+
}
340+
},
341+
{
342+
data: {
343+
network: {
344+
mcc: '734',
345+
mnc: '04'
346+
}
347+
}
348+
}
349+
]
350+
351+
*/
352+
353+
if (mccs.length) {
354+
consoleFunc.log('Using hardcoded MCCs:', JSON.stringify(mccs));
355+
} else {
356+
// If we haven't hardcoded a MCC...
357+
mccs = [];
358+
var connData;
359+
for (var i = 0; i < conn.length; i++) {
360+
console.log('navigator.mozMobileConnections[' + i + ']:', conn[i]);
361+
connData = conn[i].data;
362+
if (connData && connData.network) {
363+
mccs.push({mcc: connData.network.mcc,
364+
mnc: connData.network.mnc});
365+
}
366+
}
367+
consoleFunc.log('Using SIM MCCs:', JSON.stringify(mccs));
368+
}
327369
} else {
328-
console.warn('navigator.mozMobileConnection unavailable');
370+
consoleFunc.log('navigator.mozMobileConnections unavailable');
371+
372+
var conn = navigator.mozMobileConnection;
373+
if (conn) {
374+
consoleFunc.log('navigator.mozMobileConnection available');
375+
// `MCC`: Mobile Country Code
376+
// `MNC`: Mobile Network Code
377+
// `lastKnownHomeNetwork`: `{MCC}-{MNC}` (SIM's origin)
378+
// `lastKnownNetwork`: `{MCC}-{MNC}` (could be different network if roaming)
379+
var lastNetwork = (conn.lastKnownHomeNetwork || conn.lastKnownNetwork || '-').split('-');
380+
mcc = lastNetwork[0];
381+
mnc = lastNetwork[1];
382+
consoleFunc.log('navigator.mozMobileConnection.lastKnownNetwork:',
383+
conn.lastKnownNetwork);
384+
consoleFunc.log('navigator.mozMobileConnection.lastKnownHomeNetwork:',
385+
conn.lastKnownHomeNetwork);
386+
consoleFunc.log('MCC:', mcc, ', MNC:', mnc);
387+
} else {
388+
consoleFunc.log('navigator.mozMobileConnection unavailable');
389+
}
329390
}
330391
} catch(e) {
331-
// Fail gracefully if `navigator.mozMobileConnection` gives us problems.
332-
console.warn('Error accessing navigator.mozMobileConnection:', e);
392+
// Fail gracefully if `navigator.mozMobileConnection(s)`
393+
// gives us problems.
394+
consoleFunc.warn('Error accessing navigator.mozMobileConnection:', e);
333395
}
334396

335397
newSettings.sim_carrier = GET.carrier;
@@ -340,15 +402,39 @@ define('mobilenetwork',
340402
// and MNC (Mobile Network Code).
341403
var network = getNetwork(mcc, mnc);
342404

343-
newSettings.sim_carrier = network.carrier;
344-
newSettings.sim_region = network.region;
345-
346-
region = network.region;
405+
region = newSettings.sim_region = network.region;
406+
carrier = newSettings.sim_carrier = network.carrier;
347407

348408
if (carrier !== network.carrier) {
349-
persistent_console.log('Carrier changed by SIM:', carrier, '→', network.carrier);
409+
persistent_console.log(
410+
'Carrier changed by SIM:', carrier, '→', network.carrier);
411+
}
412+
}
413+
414+
if (mccs.length) {
415+
var pair;
416+
for (var i = 0; i < mccs.length; i++) {
417+
pair = mccs[i];
418+
consoleFunc.log('mccs[' + i + ']:', pair);
419+
420+
// Look up region and carrier from MCC (Mobile Country Code)
421+
// and MNC (Mobile Network Code).
422+
network = getNetwork(pair.mcc, pair.mnc);
423+
424+
region = newSettings.sim_region = network.region;
425+
carrier = newSettings.sim_carrier = network.carrier;
426+
427+
if (carrier !== network.carrier) {
428+
persistent_console.log(
429+
'Carrier changed by SIM:', carrier,
430+
'→', network.carrier);
431+
}
432+
433+
// If there's a region, stop looking.
434+
if (region) {
435+
break;
436+
}
350437
}
351-
carrier = network.carrier;
352438
}
353439

354440
var lastRegion = user.get_setting('last_region');

yulelog/main.js

Lines changed: 74 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,25 +33,82 @@
3333
};
3434
}
3535

36-
var qs = '';
37-
try {
38-
var conn = navigator.mozMobileConnection;
39-
if (conn) {
40-
// `MCC`: Mobile Country Code
41-
// `MNC`: Mobile Network Code
42-
// `lastKnownHomeNetwork`: `{MCC}-{MNC}` (SIM's origin)
43-
// `lastKnownNetwork`: `{MCC}-{MNC}` (could be different network if roaming)
44-
var network = (conn.lastKnownHomeNetwork || conn.lastKnownNetwork || '-').split('-');
45-
qs = '?mcc=' + (network[0] || '') + '&mnc=' + (network[1] || '');
46-
log('lastKnownNetwork', conn.lastKnownNetwork);
47-
log('lastKnownHomeNetwork', conn.lastKnownHomeNetwork);
48-
log('MCC: "' + network[0] + '"');
49-
log('MNC: "' + network[1] + '"');
36+
function buildQS() {
37+
var qs = '';
38+
39+
try {
40+
// navigator.mozMobileConnections is the new API.
41+
// navigator.mozMobileConnection is the legacy API.
42+
var conn = navigator.mozMobileConnections;
43+
if (conn) {
44+
log('navigator.mozMobileConnections available');
45+
/*
46+
Example format:
47+
48+
[
49+
{
50+
data: {
51+
network: {
52+
mcc: '260',
53+
mnc: '02'
54+
}
55+
}
56+
},
57+
{
58+
data: {
59+
network: {
60+
mcc: '734',
61+
mnc: '04'
62+
}
63+
}
64+
}
65+
]
66+
67+
*/
68+
conn = navigator.mozMobileConnections;
69+
var mccs = [];
70+
var connData;
71+
for (var i = 0; i < conn.length; i++) {
72+
log('navigator.mozMobileConnections[' + i + ']:', conn[i]);
73+
connData = conn[i].data;
74+
if (connData && connData.network) {
75+
mccs.push({mcc: connData.network.mcc,
76+
mnc: connData.network.mnc});
77+
}
78+
}
79+
mccs = JSON.stringify(mccs);
80+
qs = '?mccs=' + mccs;
81+
log('MCCs: ' + mccs);
82+
} else {
83+
log('navigator.mozMobileConnections unavailable');
84+
85+
// Yes. This should be assignment not comparison.
86+
if (conn = navigator.mozMobileConnection) {
87+
log('navigator.mozMobileConnection available');
88+
// `MCC`: Mobile Country Code
89+
// `MNC`: Mobile Network Code
90+
// `lastKnownHomeNetwork`: `{MCC}-{MNC}` (SIM's origin)
91+
// `lastKnownNetwork`: `{MCC}-{MNC}` (could be different network if roaming)
92+
var network = (conn.lastKnownHomeNetwork || conn.lastKnownNetwork || '-').split('-');
93+
qs = '?mcc=' + (network[0] || '') + '&mnc=' + (network[1] || '');
94+
log('navigator.mozMobileConnection.lastKnownNetwork:',
95+
conn.lastKnownNetwork);
96+
log('navigator.mozMobileConnection.lastKnownHomeNetwork:',
97+
conn.lastKnownHomeNetwork);
98+
log('MCC: "' + network[0] + '", MNC: "' + network[1] + '"');
99+
} else {
100+
log('navigator.mozMobileConnection unavailable');
101+
}
102+
}
103+
} catch(e) {
104+
// Fail gracefully if `navigator.mozMobileConnection(s)`
105+
// gives us problems.
50106
}
51-
} catch(e) {
52-
// Fail gracefully if `navigator.mozMobileConnection` gives us problems.
107+
108+
return qs;
53109
}
54-
var iframeSrc = MKT_URL + '/' + qs;
110+
111+
var iframeSrc = MKT_URL + '/' + buildQS();
55112
var i = document.createElement('iframe');
56113
i.seamless = true;
57114
i.onerror = function() {

0 commit comments

Comments
 (0)