123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- /**
- * Copyright (c) Facebook, Inc. and its affiliates.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- *
- * @flow
- * @format
- */
- 'use strict';
- import NativeDeviceEventManager from '../../Libraries/NativeModules/specs/NativeDeviceEventManager';
- import RCTDeviceEventEmitter from '../EventEmitter/RCTDeviceEventEmitter';
- const DEVICE_BACK_EVENT = 'hardwareBackPress';
- type BackPressEventName = 'backPress' | 'hardwareBackPress';
- const _backPressSubscriptions = [];
- RCTDeviceEventEmitter.addListener(DEVICE_BACK_EVENT, function() {
- for (let i = _backPressSubscriptions.length - 1; i >= 0; i--) {
- if (_backPressSubscriptions[i]()) {
- return;
- }
- }
- BackHandler.exitApp();
- });
- /**
- * Detect hardware button presses for back navigation.
- *
- * Android: Detect hardware back button presses, and programmatically invoke the default back button
- * functionality to exit the app if there are no listeners or if none of the listeners return true.
- *
- * tvOS: Detect presses of the menu button on the TV remote. (Still to be implemented:
- * programmatically disable menu button handling
- * functionality to exit the app if there are no listeners or if none of the listeners return true.)
- *
- * iOS: Not applicable.
- *
- * The event subscriptions are called in reverse order (i.e. last registered subscription first),
- * and if one subscription returns true then subscriptions registered earlier will not be called.
- *
- * Example:
- *
- * ```javascript
- * BackHandler.addEventListener('hardwareBackPress', function() {
- * // this.onMainScreen and this.goBack are just examples, you need to use your own implementation here
- * // Typically you would use the navigator here to go to the last state.
- *
- * if (!this.onMainScreen()) {
- * this.goBack();
- * return true;
- * }
- * return false;
- * });
- * ```
- */
- type TBackHandler = {|
- +exitApp: () => void,
- +addEventListener: (
- eventName: BackPressEventName,
- handler: Function,
- ) => {remove: () => void, ...},
- +removeEventListener: (
- eventName: BackPressEventName,
- handler: Function,
- ) => void,
- |};
- const BackHandler: TBackHandler = {
- exitApp: function(): void {
- if (!NativeDeviceEventManager) {
- return;
- }
- NativeDeviceEventManager.invokeDefaultBackPressHandler();
- },
- /**
- * Adds an event handler. Supported events:
- *
- * - `hardwareBackPress`: Fires when the Android hardware back button is pressed or when the
- * tvOS menu button is pressed.
- */
- addEventListener: function(
- eventName: BackPressEventName,
- handler: Function,
- ): {remove: () => void, ...} {
- if (_backPressSubscriptions.indexOf(handler) === -1) {
- _backPressSubscriptions.push(handler);
- }
- return {
- remove: (): void => BackHandler.removeEventListener(eventName, handler),
- };
- },
- /**
- * Removes the event handler.
- */
- removeEventListener: function(
- eventName: BackPressEventName,
- handler: Function,
- ): void {
- if (_backPressSubscriptions.indexOf(handler) !== -1) {
- _backPressSubscriptions.splice(
- _backPressSubscriptions.indexOf(handler),
- 1,
- );
- }
- },
- };
- module.exports = BackHandler;
|