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 #18313 from allstarschh/Bug995101
Browse files Browse the repository at this point in the history
Bug 995101 - NFC: Don't use nfc-hardware-state-change event to enable/disable NFC. r=alive
  • Loading branch information
allstarschh committed Apr 18, 2014
2 parents 9ce3fa5 + 4443306 commit acc4913
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 17 deletions.
61 changes: 45 additions & 16 deletions apps/system/js/nfc_manager.js
Expand Up @@ -41,8 +41,6 @@ var NfcManager = {

init: function nm_init() {
this._debug('Initializing NFC Message');
// Initialize nfc-dom so that it is ready to receive H/W state changes
var nfcdom = window.navigator.mozNfc;

window.navigator.mozSetMessageHandler(
'nfc-manager-tech-discovered',
Expand All @@ -56,11 +54,11 @@ var NfcManager = {
var self = this;
SettingsListener.observe('nfc.enabled', false, function(enabled) {
var state = enabled ?
(LockScreen.locked ?
(lockScreen.locked ?
self.NFC_HW_STATE_DISABLE_DISCOVERY :
self.NFC_HW_STATE_ON) :
self.NFC_HW_STATE_OFF;
self.dispatchHardwareChangeEvt(state);
self.changeHardwareState(state);
});
},

Expand All @@ -73,17 +71,35 @@ var NfcManager = {
}
},

dispatchHardwareChangeEvt: function nm_dispatchHardwareChangeEvt(state) {
this._debug('dispatchHardwareChangeEvt - state : ' + state);
changeHardwareState: function nm_changeHardwareState(state) {
this._debug('changeHardwareState - state : ' + state);
this.hwState = state;
var detail = {
type: 'nfc-hardware-state-change',
nfcHardwareState: state
var nfcdom = window.navigator.mozNfc;
if (!nfcdom) {
return;
}

var req;
switch (state) {
case this.NFC_HW_STATE_OFF:
req = nfcdom.powerOff();
break;
case this.NFC_HW_STATE_DISABLE_DISCOVERY:
req = nfcdom.stopPoll();
break;
case this.NFC_HW_STATE_ON:
case this.NFC_HW_STATE_ENABLE_DISCOVERY:
req = nfcdom.startPoll();
break;
}

var self = this;
req.onsuccess = function() {
self._debug('changeHardwareState ' + state + ' success');
};
req.onerror = function() {
self._debug('changeHardwareState ' + state + ' error ' + req.error.name);
};
// Create the state-change event and dispatch
var event = document.createEvent('customEvent');
event.initCustomEvent('mozContentEvent', true, true, detail);
window.dispatchEvent(event);
},

handleEvent: function nm_handleEvent(evt) {
Expand All @@ -101,7 +117,7 @@ var NfcManager = {
if (state == this.hwState) {
return;
}
this.dispatchHardwareChangeEvt(state);
this.changeHardwareState(state);
break;
case 'shrinking-sent':
window.removeEventListener('shrinking-sent', this);
Expand Down Expand Up @@ -170,6 +186,9 @@ var NfcManager = {

var connected = false;
var nfcdom = window.navigator.mozNfc;
if (!nfcdom) {
return;
}

var token = session;
var nfctag = nfcdom.getNFCTag(token);
Expand Down Expand Up @@ -232,7 +251,12 @@ var NfcManager = {

checkP2PRegistration:
function nm_checkP2PRegistration(manifestURL) {
var status = window.navigator.mozNfc.checkP2PRegistration(manifestURL);
var nfcdom = window.navigator.mozNfc;
if (!nfcdom) {
return;
}

var status = nfcdom.checkP2PRegistration(manifestURL);
var self = this;
status.onsuccess = function() {
// Top visible application's manifest Url is registered;
Expand All @@ -248,7 +272,12 @@ var NfcManager = {
},

dispatchP2PUserResponse: function nm_dispatchP2PUserResponse(manifestURL) {
window.navigator.mozNfc.notifyUserAcceptedP2P(manifestURL);
var nfcdom = window.navigator.mozNfc;
if (!nfcdom) {
return;
}

nfcdom.notifyUserAcceptedP2P(manifestURL);
},

fireTagDiscovered: function nm_fireTagDiscovered(command) {
Expand Down
11 changes: 11 additions & 0 deletions apps/system/test/unit/mock_nfc.js
@@ -0,0 +1,11 @@
'use strict';
(function(exports) {

var MockNfc = {
startPoll: function() { return {}; },
stopPoll: function() { return {}; },
powerOff: function() { return {}; }
};

exports.MockNfc = MockNfc;
})(window);
33 changes: 32 additions & 1 deletion apps/system/test/unit/nfc_manager_test.js
Expand Up @@ -2,7 +2,7 @@

mocha.globals(['NfcManager', 'ScreenManager']);

/* globals MocksHelper,
/* globals MockNfc, MocksHelper,
MozNDEFRecord, NfcBuffer, NDEF, NfcUtils, NfcManagerUtils,
NfcManager */

Expand All @@ -11,6 +11,7 @@ require('/shared/test/unit/mocks/mock_settings_listener.js');
require('/shared/js/nfc_utils.js');
require('/test/unit/mock_screen_manager.js');
requireApp('system/test/unit/mock_activity.js');
requireApp('system/test/unit/mock_nfc.js');
requireApp('system/test/unit/mock_screen_manager.js');
requireApp('system/test/unit/mock_settingslistener_installer.js');
requireApp('system/js/nfc_manager_utils.js');
Expand Down Expand Up @@ -277,4 +278,34 @@ suite('Nfc Manager Functions', function() {

});

suite('NFC Manager changeHardwareState test', function () {
var realNfc = navigator.mozNfc;

setup(function() {
navigator.mozNfc = MockNfc;
});

teardown(function() {
navigator.mozNfc = realNfc;
});

test('NFC Manager startPoll', function() {
var stubStartPoll = sinon.spy(MockNfc, 'startPoll');
var stubStopPoll = sinon.spy(MockNfc, 'stopPoll');
var stubPowerOff = sinon.spy(MockNfc, 'powerOff');

NfcManager.changeHardwareState(NfcManager.NFC_HW_STATE_OFF);
assert.isTrue(stubPowerOff.calledOnce);

NfcManager.changeHardwareState(NfcManager.NFC_HW_STATE_ON);
assert.isTrue(stubStartPoll.calledOnce);

NfcManager.changeHardwareState(NfcManager.NFC_HW_STATE_ENABLE_DISCOVERY);
assert.isTrue(stubStartPoll.calledTwice);

NfcManager.changeHardwareState(NfcManager.NFC_HW_STATE_DISABLE_DISCOVERY);
assert.isTrue(stubStopPoll.calledOnce);
});
});

});

0 comments on commit acc4913

Please sign in to comment.