From f5502fbda9fe271ff6e1d0da773a3a8ee206a453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Mon, 12 Apr 2021 06:23:53 -0700 Subject: [PATCH] Use native module passed to NativeEventEmitter on Android Summary: ## Context In native modules implementing an event emitter, we can wait for JS to subscribe to an event before making the subscription to the right native API in the native module. This is only supported on iOS at the moment and we want to support it on Android too, so we can manage resources more efficiently and avoid custom code to do this on Android, like this: https://www.internalfb.com/intern/diffusion/FBS/browse/master/xplat/js/RKJSModules/public/Dating/Profile/ProfileView/ProfileGemstoneProfileView.js?commit=165ad219e6bf&lines=302-304 The way this works now is by creating instances of `NativeEventEmitter`, where we pass a reference to the native module that needs to be notified when there are new subscriptions. We have explicit code to ignore this native modules in all platforms except for iOS: https://www.internalfb.com/intern/diffusion/FBS/browsefile/master/xplat/js/react-native-github/Libraries/EventEmitter/NativeEventEmitter.js?commit=5a1e671453465e844dd851c458cb2467a2db5d03&lines=44-52 ## Changes This removes the check for iOS from `NativeEventEmitter` so we also try to use the native module to notify subscriptions on Android. We have migrated all existing code passing a native module to `NativeEventEmtiter` to only pass it on iOS, so we don't change this behavior in existing code. Any other existing code using this API is most likely fine too. It didn't work before so the expectation is that the native module wouldn't be implemented on Android anyway. Changelog: [Android][Changed] - Modified `NativeEventEmitter` to also use the passed native module to report subscriptions on Android Reviewed By: yungsters Differential Revision: D27500994 fbshipit-source-id: ef82da04020fb08cd0ea4f1cfffd1da6453ab0b9 --- Libraries/EventEmitter/NativeEventEmitter.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Libraries/EventEmitter/NativeEventEmitter.js b/Libraries/EventEmitter/NativeEventEmitter.js index bf989b2c72a..908d1e1547b 100644 --- a/Libraries/EventEmitter/NativeEventEmitter.js +++ b/Libraries/EventEmitter/NativeEventEmitter.js @@ -18,12 +18,10 @@ import Platform from '../Utilities/Platform'; import RCTDeviceEventEmitter from './RCTDeviceEventEmitter'; import invariant from 'invariant'; -type NativeModule = $ReadOnly< - interface { - addListener: (eventType: string) => void, - removeListeners: (count: number) => void, - }, ->; +interface NativeModule { + addListener(eventType: string): void; + removeListeners(count: number): void; +} export type {EventSubscription}; @@ -47,8 +45,8 @@ export default class NativeEventEmitter nativeModule != null, '`new NativeEventEmitter()` requires a non-null argument.', ); - this._nativeModule = nativeModule; } + this._nativeModule = nativeModule; } addListener>(