Skip to content
This repository has been archived by the owner on Nov 3, 2021. It is now read-only.

Commit

Permalink
Merge pull request #12738 from crdlc/bug-918432-v1.2
Browse files Browse the repository at this point in the history
Bug 918432 - Operator apps are installed at a fixed position even when the SIM wasn't present at first boot
  • Loading branch information
Cristian Rodriguez committed Oct 16, 2013
2 parents ef72bac + 48adfdc commit 5ef3535
Show file tree
Hide file tree
Showing 19 changed files with 608 additions and 51 deletions.
1 change: 1 addition & 0 deletions apps/communications/ftu/index.html
Expand Up @@ -76,6 +76,7 @@
<script defer type="text/javascript" src="/ftu/js/app.js"></script>
<script defer type="text/javascript" src="/ftu/js/variant.js"></script>
<script defer type="text/javascript" src="/contacts/js/utilities/import_sim_contacts.js"></script>
<script defer type="text/javascript" src="/ftu/js/operatorVariant.js"></script>
<!-- Confirm dialogs BB library -->
<script defer type="text/javascript" src="/contacts/js/utilities/confirm.js"></script>
</head>
Expand Down
5 changes: 5 additions & 0 deletions apps/communications/ftu/js/navigation.js
Expand Up @@ -252,6 +252,11 @@ var Navigation = {

manageStep: function n_manageStep() {
var self = this;
//SV - We need remember if phone startup with SIM
if (self.currentStep >= numSteps) {
OperatorVariant.setSIMOnFirstBootState();
}

// Retrieve future location
var futureLocation = steps[self.currentStep];
// There is some locations which need a 'loading'
Expand Down
76 changes: 76 additions & 0 deletions apps/communications/ftu/js/operatorVariant.js
@@ -0,0 +1,76 @@
'use strict';

var OperatorVariant = (function() {
function setIsSIMPresentOnFirstBoot(value) {
var result = navigator.mozSettings.createLock().set(
{ 'ftu.simPresentOnFirstBoot' : value });

result.onerror = function ov_error() {
console.error('An error occurre setting ftu.simPresentOnFirstBoot: ' +
value);
};
};

/**
* If ftu.simPresentOnFirstBoot setting has value do nothing otherwise
* set ftu.simPresentOnFirstBoot = true if
* IccHelper.cardState value is:
* 'pinRequired',
* 'pukRequired',
* 'networkLocked',
* 'corporateLocked',
* 'serviceProviderLocked',
* 'ready'.
* otherwise set to false.
*/
function setSIMOnFirstBootState() {
var cardState;

try {
if (!IccHelper || !IccHelper.enabled || !IccHelper.cardState) {
cardState = undefined;
} else {
cardState = IccHelper.cardState;
}

var settings = navigator.mozSettings;
if (!settings) {
console.log('Settings is not available');
return;
}

var req = settings.createLock().get('ftu.simPresentOnFirstBoot');

req.onsuccess = function ov_onsuccess() {
var currentStatus = req.result['ftu.simPresentOnFirstBoot'];
if (currentStatus === undefined || currentStatus === null) {
switch (cardState) {
case 'pinRequired':
case 'pukRequired':
case 'networkLocked':
case 'corporateLocked':
case 'serviceProviderLocked':
case 'ready':
setIsSIMPresentOnFirstBoot(true);
break;
default:
setIsSIMPresentOnFirstBoot(false);
break;
}
}
cardState = null;
};

req.onerror = function ov_error() {
console.error('Error retrieving ftu.simPresentOnFirstBoot');
};

} catch (e) {
console.error('Error setSIMOnFirstBootState. ' + e);
}
};

return {
setSIMOnFirstBootState: setSIMOnFirstBootState
};
})();
Expand Up @@ -12,6 +12,7 @@
for (var key in obj) {
settings[key] = obj[key];
}
return {};
}

function mns_mLockGet(key) {
Expand Down
5 changes: 5 additions & 0 deletions apps/communications/ftu/test/unit/mock_operatorVariant.js
@@ -0,0 +1,5 @@
'use strict';

var MockOperatorVariant = {
setSIMOnFirstBootState: function() {}
};
4 changes: 3 additions & 1 deletion apps/communications/ftu/test/unit/navigation_test.js
Expand Up @@ -11,6 +11,7 @@ requireApp('communications/ftu/test/unit/mock_tutorial.js');
requireApp('communications/ftu/test/unit/mock_icc_helper.js');
requireApp('communications/ftu/test/unit/mock_wifi_manager.js');
requireApp('communications/ftu/test/unit/mock_utils.js');
requireApp('communications/ftu/test/unit/mock_operatorVariant.js');
requireApp('communications/ftu/js/navigation.js');

mocha.globals(['open']);
Expand All @@ -21,7 +22,8 @@ var mocksHelperForNavigation = new MocksHelper([
'SimManager',
'DataMobile',
'IccHelper',
'Tutorial'
'Tutorial',
'OperatorVariant'
]);
mocksHelperForNavigation.init();

Expand Down
87 changes: 87 additions & 0 deletions apps/communications/ftu/test/unit/operatorVariant_test.js
@@ -0,0 +1,87 @@
'use strict';

requireApp('communications/ftu/test/unit/mock_icc_helper.js');
requireApp('communications/ftu/test/unit/mock_navigator_moz_settings.js');

requireApp('communications/ftu/js/operatorVariant.js');

var mocksHelper = new MocksHelper([
'IccHelper'
]).init();


suite('operatorVariant set First run state >', function() {
const KEY_SIM_ON_1ST_RUN = 'ftu.simPresentOnFirstBoot';
var SAVE_STATE_WAIT_TIMEOUT = 200;
var realSettings;

suiteSetup(function() {
mocksHelper.suiteSetup();
realSettings = navigator.mozSettings;
navigator.mozSettings = MockNavigatorSettings;
});

suiteTeardown(function() {
mocksHelper.suiteTeardown();
navigator.mozSettings = realSettings;
realSettings = null;
});

// helper to change single key-value of mozSettings
function changeSettings(key, value) {
var cset = {};
cset[key] = value;
MockNavigatorSettings.createLock().set(cset);
}


setup(function() {
mocksHelper.setup();
});

var testCases = [
{
'preValSet': undefined,
'expecValSet': false,
'cardState': 'unknown',
'title': 'Operator Variant set first run type - unkown sim'
},
{
'preValSet': undefined,
'expecValSet': true,
'cardState': 'ready',
'title': 'Operator Variant set first run type - sim ready'
},
{
'preValSet': undefined,
'expecValSet': true,
'cardState': 'pinRequired',
'title': 'Operator Variant set first run type - sim pinRequired'
},
{
'preValSet': true,
'expecValSet': true,
'cardState': 'ready',
'title': 'Operator Variant first run type previously set true'
},
{
'preValSet': false,
'expecValSet': false,
'cardState': 'ready',
'title': 'Operator Variant set first run type previously set false'
}
];

testCases.forEach((function(testCase) {
test(testCase.title, function(done) {
MockIccHelper.mProps['cardState'] = testCase.cardState;
changeSettings(KEY_SIM_ON_1ST_RUN, testCase.preValSet);
OperatorVariant.setSIMOnFirstBootState();
setTimeout(function() {
var mSettings = MockNavigatorSettings.mSettings;
assert.equal(mSettings[KEY_SIM_ON_1ST_RUN], testCase.expecValSet);
done();
}, SAVE_STATE_WAIT_TIMEOUT);
});
}));
});
1 change: 0 additions & 1 deletion apps/homescreen/everything.me/js/everything.me.js
Expand Up @@ -103,7 +103,6 @@ var EverythingME = {
'js/api/DoATAPI.js',
'js/helpers/EventHandler.js',
'js/helpers/Idle.js',
'shared/js/settings_listener.js',
'js/plugins/Analytics.js',
'js/plugins/APIStatsEvents.js'];
var css_files = ['shared/style/confirm.css',
Expand Down
2 changes: 1 addition & 1 deletion apps/homescreen/index.html
Expand Up @@ -13,7 +13,7 @@
<script type="text/javascript" src="shared/js/l10n.js"></script>
<script type="text/javascript" defer src="shared/js/screen_layout.js"></script>
<script type="text/javascript" defer src="shared/js/manifest_helper.js"></script>
<!-- <script type="text/javascript" src="shared/js/settings_listener.js"></script> -->
<script type="text/javascript" src="shared/js/settings_listener.js"></script>
<script type="text/javascript" defer src="shared/js/async_storage.js"></script>
<script defer type="text/javascript" src="shared/js/icc_helper.js"></script>
<script type="text/javascript" defer src="shared/js/lazy_loader.js"></script>
Expand Down
29 changes: 28 additions & 1 deletion apps/homescreen/js/configurator.js
Expand Up @@ -9,6 +9,7 @@ var Configurator = (function() {

// Keeps the list of single variant apps, indexed by manifestURL
var singleVariantApps = {};
var simPresentOnFirstBoot = true;

var dummyProvider = {
init: function() {
Expand Down Expand Up @@ -72,6 +73,7 @@ var Configurator = (function() {
}

function loadSingleVariantConf() {
loadSettingSIMPresent();
if (!IccHelper || !IccHelper.enabled) {
console.error('IccHelper isn\'t enabled. SingleVariant configuration' +
' can\'t be loaded');
Expand Down Expand Up @@ -132,6 +134,25 @@ var Configurator = (function() {
}
}

function loadSettingSIMPresent() {
var settings = navigator.mozSettings;
if (!settings) {
console.log('Settings is not available');
return;
}
var req = settings.createLock().get('ftu.simPresentOnFirstBoot');

req.onsuccess = function osv_success(e) {
simPresentOnFirstBoot =
req.result['ftu.simPresentOnFirstBoot'] === undefined ||
req.result['ftu.simPresentOnFirstBoot'];
};

req.onerror = function osv_error(e) {
console.error('Error retrieving ftu.simPresentOnFirstBoot. ' + e);
};
}

function startHomescreenByDefault() {
var searchPage = document.querySelector('div[role="search-page"]');

Expand All @@ -156,6 +177,12 @@ var Configurator = (function() {
return singleVariantApps;
},

load: load
load: load,

get isSimPresentOnFirstBoot() {
return simPresentOnFirstBoot;
},

loadSettingSIMPresent: loadSettingSIMPresent
};
}());
16 changes: 12 additions & 4 deletions apps/homescreen/js/grid.js
Expand Up @@ -643,9 +643,11 @@ var GridManager = (function() {
haveLocale = true;
}

function getFirstPageWithEmptySpace() {
for (var i = numberOfSpecialPages; i < pages.length; i++) {
if (pages[i].getNumIcons() < MAX_ICONS_PER_PAGE) {
function getFirstPageWithEmptySpace(pageOffset) {
pageOffset = pageOffset !== null && pageOffset ? pageOffset :
numberOfSpecialPages;
for (var i = pageOffset, page; page = pages[i]; i++) {
if (page.hasEmptySlot()) {
return i;
}
}
Expand Down Expand Up @@ -1140,11 +1142,17 @@ var GridManager = (function() {
var icon = new Icon(descriptor, app);
rememberIcon(icon);

var index = getFirstPageWithEmptySpace();
var index;
var svApp = getSingleVariantApp(app.manifestURL);
if (svApp && !isPreviouslyInstalled(app.manifestURL)) {
index = svApp.screen;
icon.descriptor.desiredPos = svApp.location;
if (!Configurator.isSimPresentOnFirstBoot && index < pages.length &&
!pages[index].hasEmptySlot()) {
index = getFirstPageWithEmptySpace(index);
}
} else {
index = getFirstPageWithEmptySpace();
}

if (index < pages.length) {
Expand Down
19 changes: 16 additions & 3 deletions apps/homescreen/js/page.js
Expand Up @@ -329,6 +329,11 @@ Icon.prototype = {
// The url that is passed as a parameter to the callback must be revoked
loadRenderedIcon: function icon_loadRenderedIcon(callback) {
var img = this.img;
if (!this.descriptor.renderedIcon) {
callback(this.src);
return;
}

img.src = window.URL.createObjectURL(this.descriptor.renderedIcon);
if (callback) {
img.onload = img.onerror = function done() {
Expand Down Expand Up @@ -913,7 +918,7 @@ Page.prototype = {
* Move the apps in position higher than 'pos' one position ahead if they have
* a desiredPosition lower than their actual position
*/
_moveAhead: function(pos) {
_moveAhead: function pg_moveAhead(pos) {
// When a new sv app is installed, the previously sv apps installed in
// higher positions will have been moved.
// This function restores their previous position if needed
Expand All @@ -928,16 +933,24 @@ Page.prototype = {
}
},

/*
* Return true if the Page has free space, return false otherwise
*/
hasEmptySlot: function pg_hasEmptySlot() {
return this.getNumIcons() < this.maxIcons;
},

/*
* Insert an icon in the page
*/
_insertIcon: function insertIcon(icon) {
_insertIcon: function pg_insertIcon(icon) {
var iconList = this.olist.children;
var container = icon.container;

// Inserts the icon in the closest possible space to its desired position,
// keeping the order of all existing icons with desired position
if (icon.descriptor && icon.descriptor.desiredPos !== undefined) {
if (icon.descriptor && icon.descriptor.desiredPos !== undefined &&
Configurator.isSimPresentOnFirstBoot) {
var desiredPos = icon.descriptor.desiredPos;
var manifest = icon.descriptor.manifestURL;
// Add to the installed SV apps array
Expand Down

0 comments on commit 5ef3535

Please sign in to comment.