diff --git a/Examples/UIExplorer/BackAndroidExample.js b/Examples/UIExplorer/BackAndroidExample.js deleted file mode 100644 index 3643f76f6..000000000 --- a/Examples/UIExplorer/BackAndroidExample.js +++ /dev/null @@ -1,66 +0,0 @@ -/** - * The examples provided by Facebook are for non-commercial testing and - * evaluation purposes only. - * - * Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN - * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * - */ - -'use strict'; - -var React = require('react-native'); -var { - Text, - View, - BackAndroid, -} = React; - -var BackAndroidExample = React.createClass({ - - getInitialState: function() { - return { - defaultBackHandler: false - }; - }, - - componentDidMount: function() { - BackAndroid.addEventListener('hardwareBackPress', this._handleBackButton); - }, - - componentWillUnmount: function() { - BackAndroid.removeEventListener('hardwareBackPress', this._handleBackButton); - }, - - _handleBackButton: function() { - if (!this.state.defaultBackHandler) { - this.setState({defaultBackHandler: true}); - return true; - } - - return false; - }, - - render: function() { - return ( - - {this.state.defaultBackHandler ? 'Ok, I\'ll quit.' : 'I won\'t quit.'} - - ); - }, -}); - -exports.title = 'BackAndroid'; -exports.description = 'Custom back button handler'; -exports.examples = [ - { - title: 'Custom back button handler', - render(): ReactElement { return ; } - } -]; diff --git a/Examples/UIExplorer/UIExplorerList.android.js b/Examples/UIExplorer/UIExplorerList.android.js index c8c8408c7..bb5b13a81 100644 --- a/Examples/UIExplorer/UIExplorerList.android.js +++ b/Examples/UIExplorer/UIExplorerList.android.js @@ -102,10 +102,6 @@ const APIExamples = [ key: 'AppStateExample', module: require('./AppStateExample'), }, - { - key: 'BackAndroidExample', - module: require('./BackAndroidExample'), - }, { key: 'BorderExample', module: require('./BorderExample'), diff --git a/Libraries/Utilities/BackAndroid.android.js b/Libraries/Utilities/BackAndroid.android.js index b8c997869..795380448 100644 --- a/Libraries/Utilities/BackAndroid.android.js +++ b/Libraries/Utilities/BackAndroid.android.js @@ -20,19 +20,17 @@ type BackPressEventName = $Enum<{ backPress: string; }>; -var _backPressSubscriptions = []; +var _backPressSubscriptions = new Set(); RCTDeviceEventEmitter.addListener(DEVICE_BACK_EVENT, function() { - var propagate = true; - for (var i = _backPressSubscriptions.length - 1; i >= 0; i--) { - var subscription = _backPressSubscriptions[i]; + var backPressSubscriptions = new Set(_backPressSubscriptions); + var invokeDefault = true; + backPressSubscriptions.forEach((subscription) => { if (subscription()) { - propagate = false; - break; + invokeDefault = false; } - } - - if (propagate) { + }); + if (invokeDefault) { BackAndroid.exitApp(); } }); @@ -62,18 +60,18 @@ var BackAndroid = { addEventListener: function ( eventName: BackPressEventName, handler: Function - ): void { - _backPressSubscriptions.push(handler); + ): {remove: () => void} { + _backPressSubscriptions.add(handler); + return { + remove: () => BackAndroid.removeEventListener(eventName, handler), + }; }, removeEventListener: function( eventName: BackPressEventName, handler: Function ): void { - var index = _backPressSubscriptions.indexOf(handler); - if (index !== -1) { - _backPressSubscriptions.splice(index, 1); - } + _backPressSubscriptions.delete(handler); }, };