From f737129e9470dc9106b48a91e138b7cb82fa83ab Mon Sep 17 00:00:00 2001 From: Gabriele Svelto Date: Mon, 19 Oct 2015 15:55:42 +0200 Subject: [PATCH] Bug 1199773 - Make the callscreen state coherent with the lockscreen state. r=drs --- apps/callscreen/js/call_screen.js | 74 +++++++----------- apps/callscreen/js/calls_handler.js | 1 + apps/callscreen/test/unit/call_screen_test.js | 75 +++++++++++-------- apps/communications/dialer/js/dialer.js | 8 -- 4 files changed, 75 insertions(+), 83 deletions(-) diff --git a/apps/callscreen/js/call_screen.js b/apps/callscreen/js/call_screen.js index 2aa85426e9d9..afb8f3ced850 100644 --- a/apps/callscreen/js/call_screen.js +++ b/apps/callscreen/js/call_screen.js @@ -57,9 +57,6 @@ var CallScreen = { lockedDate: document.getElementById('lockscreen-date'), statusMessage: document.getElementById('statusMsg'), - configs: { - lockMode: 'incoming-call' - }, showStatusMessage: function cs_showStatusMessage(message) { var STATUS_TIME = 2000; var paragraph = this.statusMessage.querySelector('p'); @@ -160,35 +157,27 @@ var CallScreen = { this.calls.addEventListener('click', CallsHandler.toggleCalls.bind(this)); window.addEventListener('resize', this.resizeHandler.bind(this)); - window.addEventListener('hashchange', this.hashchangeHandler.bind(this)); - this.hashchangeHandler(); SettingsListener.observe('wallpaper.image', null, this._wallpaperImageHandler.bind(this)); + // Interaction with the lockscreen + this._lockScreenLayoutInitialized = false; + navigator.mozSettings.addObserver( + 'lockscreen.locked', this._lockscreenStateChange.bind(this) + ); + this.syncSpeakerEnabled(); }, - _connInfoManagerInitialized: false, initLockScreenConnInfoManager: function cs_initLockScreenConnInfoManager() { - if (this._connInfoManagerInitialized) { - return; - } - /* mobile connection state on lock screen */ if (window.navigator.mozMobileConnections) { new window.LockScreenConnInfoManager(CallScreen.lockscreenConnStates); - CallScreen._connInfoManagerInitialized = true; } }, - _slideInitialized: false, initLockScreenSlide: function cs_initLockScreenSlide() { - if (this._slideInitialized) { - return; - } - this._slideInitialized = true; - // Setup incoming call screen slider this.hangUpIcon = document.getElementById('lockscreen-area-hangup'); this.pickUpIcon = document.getElementById('lockscreen-area-pickup'); @@ -238,6 +227,23 @@ var CallScreen = { }); }, + _lockscreenStateChange: function cs_lockscreenStateChange(event) { + if (event.settingValue) { + if (this.screen.dataset.layout === 'incoming') { + this.initLockScreenLayout(); + this.render('incoming-locked'); + } + + this.initUnlockerEvents(); + } else { + if (this.screen.dataset.layout === 'incoming-locked') { + this.render('incoming'); + } + + this.suspendUnlockerEvents(); + } + }, + _wallpaperImageHandler: function cs_wallpaperImageHandler(image) { this.mainContainer.style.backgroundImage = 'url(' + (typeof image === 'string' ? image : URL.createObjectURL(image)) + ')'; @@ -276,15 +282,14 @@ var CallScreen = { } }, - hashchangeHandler: function cs_hashchangeHandler() { - if (window.location.hash.startsWith('#locked')) { + _lockScreenLayoutInitialized: false, + initLockScreenLayout: function cs_initLockScreenLayout() { + this.showClock(new Date()); + + if (!this._lockScreenLayoutInitialized) { this.initLockScreenConnInfoManager(); - this.showClock(new Date()); this.initLockScreenSlide(); - - if (!this.screen.dataset.layout) { - this.render('incoming-locked'); - } + this._lockScreenLayoutInitialized = true; } }, @@ -550,27 +555,6 @@ var CallScreen = { case 'lockscreenslide-activate-right': CallsHandler.answer(); break; - case 'lockscreen-mode-on': - this.modeSwitch(evt.detail, true); - break; - case 'lockscreen-mode-off': - this.modeSwitch(evt.detail, false); - break; - } - }, - - /** - * @param {boolean} switcher - true if mode is on, false if off. - */ - modeSwitch: function cs_modeSwitch(mode, switcher) { - if (switcher) { - if (mode !== this.configs.lockMode) { - this.suspendUnlockerEvents(); - } - } else { - if (mode !== this.configs.lockMode) { - this.initUnlockerEvents(); - } } }, diff --git a/apps/callscreen/js/calls_handler.js b/apps/callscreen/js/calls_handler.js index 1604d6ae2795..0e7cd245605a 100644 --- a/apps/callscreen/js/calls_handler.js +++ b/apps/callscreen/js/calls_handler.js @@ -197,6 +197,7 @@ var CallsHandler = (function callsHandler() { } else { if (window.location.hash.startsWith('#locked') && (call.state === 'incoming')) { + CallScreen.initLockScreenLayout(); CallScreen.render('incoming-locked'); } else { CallScreen.render(call.state); diff --git a/apps/callscreen/test/unit/call_screen_test.js b/apps/callscreen/test/unit/call_screen_test.js index b1f43c413c75..5e9038c7636c 100644 --- a/apps/callscreen/test/unit/call_screen_test.js +++ b/apps/callscreen/test/unit/call_screen_test.js @@ -1,12 +1,14 @@ /* globals CallScreen, FontSizeManager, l10nAssert, MockCallsHandler, MockHandledCall, MockMozActivity, MockNavigatorMozTelephony, - MockL10n, MocksHelper, MockSettingsListener, Utils, MockMozIntl */ + MockL10n, MocksHelper, MockSettingsListener, Utils, MockMozIntl, + MockNavigatorSettings */ 'use strict'; require('/shared/test/unit/mocks/mock_l10n.js'); require('/shared/test/unit/mocks/mock_moz_intl.js'); require('/shared/test/unit/mocks/mock_moz_activity.js'); +require('/shared/test/unit/mocks/mock_navigator_moz_settings.js'); require('/shared/test/unit/mocks/mock_navigator_moz_telephony.js'); require('/shared/test/unit/mocks/mock_settings_listener.js'); require('/shared/test/unit/mocks/dialer/mock_handled_call.js'); @@ -34,6 +36,7 @@ if (!window.CallScreen) { } suite('call screen', function() { + var realMozSettings; var realMozTelephony; var realMozL10n; var realMozIntl; @@ -66,6 +69,8 @@ suite('call screen', function() { mocksHelperForCallScreen.attachTestHelpers(); suiteSetup(function() { + realMozSettings = navigator.mozSettings; + navigator.mozSettings = MockNavigatorSettings; realMozTelephony = navigator.mozTelephony; navigator.mozTelephony = MockNavigatorMozTelephony; realSettingsListener = window.SettingsListener; @@ -77,6 +82,7 @@ suite('call screen', function() { }); suiteTeardown(function() { + navigator.mozSettings = realMozSettings; MockNavigatorMozTelephony.mSuiteTeardown(); navigator.mozTelephony = realMozTelephony; window.SettingsListener = realSettingsListener; @@ -85,6 +91,8 @@ suite('call screen', function() { }); setup(function(done) { + MockNavigatorSettings.mSetup(); + body = document.body; screen = document.createElement('div'); @@ -200,6 +208,7 @@ suite('call screen', function() { }); teardown(function() { + MockNavigatorSettings.mTeardown(); MockNavigatorMozTelephony.mTeardown(); screen.parentNode.removeChild(screen); }); @@ -220,7 +229,7 @@ suite('call screen', function() { }); }); - test('screen init type other than incoming-locked', function() { + test('regular screen init', function() { CallScreen.init(); sinon.assert.notCalled(CallScreen.showClock); sinon.assert.notCalled(CallScreen.initLockScreenSlide); @@ -229,34 +238,6 @@ suite('call screen', function() { sinon.assert.notCalled(MockCallsHandler.mergeCalls); }); - suite('incoming-locked screen initialize', function() { - var oldHash; - - setup(function() { - oldHash = window.location.hash; - window.location.hash = '#locked?timestamp=0'; - }); - - teardown(function() { - window.location.hash = oldHash; - }); - - test('incoming-locked screen init without layout set', function() { - CallScreen.init(); - sinon.assert.called(CallScreen.showClock); - sinon.assert.called(CallScreen.initLockScreenSlide); - sinon.assert.called(CallScreen.render); - }); - - test('incoming-locked screen init with layout set', function() { - CallScreen.screen.dataset.layout = 'incoming-locked'; - CallScreen.init(); - sinon.assert.called(CallScreen.showClock); - sinon.assert.called(CallScreen.initLockScreenSlide); - sinon.assert.notCalled(CallScreen.render); - }); - }); - suite('button listeners successfully added and notified', function() { var event; @@ -395,6 +376,40 @@ suite('call screen', function() { }); }); + suite('lockscreen state', function() { + setup(function() { + this.sinon.stub(CallScreen, 'initLockScreenConnInfoManager'); + this.sinon.stub(CallScreen, 'initLockScreenSlide'); + this.sinon.stub(CallScreen, 'showClock'); + this.sinon.spy(CallScreen, 'render'); + CallScreen.init(); + }); + + test('unlocking when an incoming call is present', function() { + CallScreen.screen.dataset.layout = 'incoming-locked'; + MockNavigatorSettings.mTriggerObservers('lockscreen.locked', { + settingValue: false + }); + sinon.assert.notCalled(CallScreen.initLockScreenConnInfoManager); + sinon.assert.notCalled(CallScreen.initLockScreenSlide); + sinon.assert.notCalled(CallScreen.showClock); + sinon.assert.calledOnce(CallScreen.render); + sinon.assert.calledWith(CallScreen.render, 'incoming'); + }); + + test('locking when an incoming call is present', function() { + CallScreen.screen.dataset.layout = 'incoming'; + MockNavigatorSettings.mTriggerObservers('lockscreen.locked', { + settingValue: true + }); + sinon.assert.calledOnce(CallScreen.initLockScreenConnInfoManager); + sinon.assert.calledOnce(CallScreen.initLockScreenSlide); + sinon.assert.calledOnce(CallScreen.showClock); + sinon.assert.calledOnce(CallScreen.render); + sinon.assert.calledWith(CallScreen.render, 'incoming-locked'); + }); + }); + suite('background image setter', function() { var fakeBlob = new Blob([], {type: 'image/png'}); var fakeURL = URL.createObjectURL(fakeBlob); diff --git a/apps/communications/dialer/js/dialer.js b/apps/communications/dialer/js/dialer.js index e5b4dbdec812..b8f04f7f4cfc 100644 --- a/apps/communications/dialer/js/dialer.js +++ b/apps/communications/dialer/js/dialer.js @@ -39,7 +39,6 @@ var CallHandler = (function callHandler() { var FB_SYNC_ERROR_PARAM = 'isSyncError'; /* === Settings === */ - var screenState = null; var engineeringModeKey = null; /* === WebActivity === */ @@ -415,13 +414,6 @@ var CallHandler = (function callHandler() { } }); LazyLoader.load('/shared/js/settings_listener.js', function() { - SettingsListener.observe('lockscreen.locked', null, function(value) { - if (value) { - screenState = 'locked'; - } else { - screenState = 'unlocked'; - } - }); SettingsListener.observe('engineering-mode.key', null, function(value) { engineeringModeKey = value || null; });