diff --git a/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsMediaViewManager.kt b/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsMediaViewManager.kt index 42669b08..64baa293 100644 --- a/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsMediaViewManager.kt +++ b/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsMediaViewManager.kt @@ -27,9 +27,7 @@ import com.facebook.react.viewmanagers.RNGoogleMobileAdsMediaViewManagerDelegate import com.facebook.react.viewmanagers.RNGoogleMobileAdsMediaViewManagerInterface @ReactModule(name = ReactNativeGoogleMobileAdsMediaViewManager.NAME) -class ReactNativeGoogleMobileAdsMediaViewManager( - reactContext: ReactApplicationContext -) : ViewGroupManager(reactContext), +class ReactNativeGoogleMobileAdsMediaViewManager : ViewGroupManager(), RNGoogleMobileAdsMediaViewManagerInterface { private val delegate: ViewManagerDelegate = RNGoogleMobileAdsMediaViewManagerDelegate(this) diff --git a/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsNativeAdViewManager.kt b/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsNativeAdViewManager.kt index 5ae43917..8cbbd9d8 100644 --- a/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsNativeAdViewManager.kt +++ b/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsNativeAdViewManager.kt @@ -18,7 +18,6 @@ package io.invertase.googlemobileads */ import android.view.View -import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactMethod import com.facebook.react.module.annotations.ReactModule import com.facebook.react.uimanager.ThemedReactContext @@ -29,9 +28,7 @@ import com.facebook.react.viewmanagers.RNGoogleMobileAdsNativeViewManagerDelegat import com.facebook.react.viewmanagers.RNGoogleMobileAdsNativeViewManagerInterface @ReactModule(name = ReactNativeGoogleMobileAdsNativeAdViewManager.NAME) -class ReactNativeGoogleMobileAdsNativeAdViewManager( - reactContext: ReactApplicationContext -) : ViewGroupManager(reactContext), +class ReactNativeGoogleMobileAdsNativeAdViewManager : ViewGroupManager(), RNGoogleMobileAdsNativeViewManagerInterface { private val delegate: ViewManagerDelegate = RNGoogleMobileAdsNativeViewManagerDelegate(this) diff --git a/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsNativeModule.kt b/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsNativeModule.kt index f1fb2194..71f2299f 100644 --- a/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsNativeModule.kt +++ b/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsNativeModule.kt @@ -22,6 +22,7 @@ import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactMethod import com.facebook.react.bridge.ReadableMap +import com.facebook.react.bridge.WritableMap import com.facebook.react.module.annotations.ReactModule import com.google.android.gms.ads.AdListener import com.google.android.gms.ads.AdLoader @@ -30,8 +31,10 @@ import com.google.android.gms.ads.VideoController.VideoLifecycleCallbacks import com.google.android.gms.ads.VideoOptions import com.google.android.gms.ads.nativead.NativeAd import com.google.android.gms.ads.nativead.NativeAdOptions +import io.invertase.googlemobileads.common.ReactNativeEventEmitter +import io.invertase.googlemobileads.interfaces.NativeEvent -@ReactModule(ReactNativeGoogleMobileAdsNativeModule.NAME) +@ReactModule(name = ReactNativeGoogleMobileAdsNativeModule.NAME) class ReactNativeGoogleMobileAdsNativeModule( reactContext: ReactApplicationContext ) : NativeGoogleMobileAdsNativeModuleSpec(reactContext) { @@ -201,7 +204,12 @@ class ReactNativeGoogleMobileAdsNativeModule( val payload = Arguments.createMap() payload.putString("responseId", nativeAd.responseInfo?.responseId) payload.putString("type", type) - this@ReactNativeGoogleMobileAdsNativeModule.emitOnAdEvent(payload) + + val emitter = ReactNativeEventEmitter.getSharedInstance() + emitter.sendEvent(object : NativeEvent { + override fun getEventName() = "RNGMANativeAdEvent" + override fun getEventBody() = payload + }) } } diff --git a/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsPackage.kt b/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsPackage.kt index 5ba01fc1..6eaec803 100644 --- a/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsPackage.kt +++ b/android/src/main/java/io/invertase/googlemobileads/ReactNativeGoogleMobileAdsPackage.kt @@ -31,8 +31,8 @@ class ReactNativeGoogleMobileAdsPackage : TurboReactPackage() { ): List> { return listOf( ReactNativeGoogleMobileAdsBannerAdViewManager(), - ReactNativeGoogleMobileAdsNativeAdViewManager(reactContext), - ReactNativeGoogleMobileAdsMediaViewManager(reactContext) + ReactNativeGoogleMobileAdsNativeAdViewManager(), + ReactNativeGoogleMobileAdsMediaViewManager() ) } diff --git a/android/src/oldarch/io/invertase/googlemobileads/NativeGoogleMobileAdsNativeModuleSpec.kt b/android/src/oldarch/io/invertase/googlemobileads/NativeGoogleMobileAdsNativeModuleSpec.kt index d44c4656..bef18343 100644 --- a/android/src/oldarch/io/invertase/googlemobileads/NativeGoogleMobileAdsNativeModuleSpec.kt +++ b/android/src/oldarch/io/invertase/googlemobileads/NativeGoogleMobileAdsNativeModuleSpec.kt @@ -4,15 +4,8 @@ import com.facebook.react.bridge.Promise import com.facebook.react.bridge.ReactApplicationContext import com.facebook.react.bridge.ReactContextBaseJavaModule import com.facebook.react.bridge.ReadableMap -import com.facebook.react.modules.core.DeviceEventManagerModule abstract class NativeGoogleMobileAdsNativeModuleSpec(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) { abstract fun load(adUnitId: String, requestOptions: ReadableMap, promise: Promise) abstract fun destroy(responseId: String) - - fun emitOnAdEvent(params: ReadableMap) { - reactApplicationContext - .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java) - .emit("RNGMANativeAdEvent", params) - } } diff --git a/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenAd.mm b/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenAd.mm index 23741e70..312c1395 100644 --- a/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenAd.mm +++ b/ios/RNGoogleMobileAds/RNGoogleMobileAdsFullScreenAd.mm @@ -217,4 +217,4 @@ - (void)showWithRequestId:(int)requestId @end -#endif \ No newline at end of file +#endif diff --git a/ios/RNGoogleMobileAds/RNGoogleMobileAdsNativeModule.h b/ios/RNGoogleMobileAds/RNGoogleMobileAdsNativeModule.h index b3c2de29..eaf9e4cc 100644 --- a/ios/RNGoogleMobileAds/RNGoogleMobileAdsNativeModule.h +++ b/ios/RNGoogleMobileAds/RNGoogleMobileAdsNativeModule.h @@ -25,9 +25,8 @@ : NativeGoogleMobileAdsNativeModuleSpecBase #else #import -#import -@interface RNGoogleMobileAdsNativeModule : RCTEventEmitter +@interface RNGoogleMobileAdsNativeModule : NSObject #endif - (GADNativeAd *)nativeAdForResponseId:(NSString *)responseId; diff --git a/ios/RNGoogleMobileAds/RNGoogleMobileAdsNativeModule.mm b/ios/RNGoogleMobileAds/RNGoogleMobileAdsNativeModule.mm index 217b970b..4ae1e813 100644 --- a/ios/RNGoogleMobileAds/RNGoogleMobileAdsNativeModule.mm +++ b/ios/RNGoogleMobileAds/RNGoogleMobileAdsNativeModule.mm @@ -19,6 +19,7 @@ #import "RNGoogleMobileAdsNativeModule.h" #import "RNGoogleMobileAdsCommon.h" +#import "common/RNRCTEventEmitter.h" typedef void (^RNGMANativeAdLoadCompletionHandler)(GADNativeAd *_Nullable nativeAd, NSError *_Nullable error); @@ -53,10 +54,6 @@ - (dispatch_queue_t)methodQueue { (const facebook::react::ObjCTurboModule::InitParams &)params { return std::make_shared(params); } -#else -- (NSArray *)supportedEvents { - return @[ @"RNGMANativeAdEvent" ]; -} #endif - (instancetype)init { @@ -278,11 +275,7 @@ - (void)emitAdEvent:(NSString *)type { } NSDictionary *payload = @{@"responseId" : _nativeAd.responseInfo.responseIdentifier, @"type" : type}; -#ifdef RCT_NEW_ARCH_ENABLED - [_nativeModule emitOnAdEvent:payload]; -#else - [_nativeModule sendEventWithName:@"RNGMANativeAdEvent" body:payload]; -#endif + [[RNRCTEventEmitter shared] sendEventWithName:@"RNGMANativeAdEvent" body:payload]; } @end diff --git a/src/MobileAds.ts b/src/MobileAds.ts index c10a021a..f100e552 100644 --- a/src/MobileAds.ts +++ b/src/MobileAds.ts @@ -25,9 +25,12 @@ class MobileAdsModule implements MobileAdsModuleInterface { subscribeToNativeModuleEvent(eventName: string) { if (!NATIVE_MODULE_EVENT_SUBSCRIPTIONS[eventName]) { - GoogleMobileAdsNativeEventEmitter.addListener(eventName, event => { - SharedEventEmitter.emit(`${eventName}:${event.adUnitId}:${event.requestId}`, event); - }); + GoogleMobileAdsNativeEventEmitter.addListener<{ adUnitId: string; requestId: number }>( + eventName, + event => { + SharedEventEmitter.emit(`${eventName}:${event.adUnitId}:${event.requestId}`, event); + }, + ); NATIVE_MODULE_EVENT_SUBSCRIPTIONS[eventName] = true; } diff --git a/src/ads/native-ad/NativeAd.ts b/src/ads/native-ad/NativeAd.ts index 6f22829e..0728d070 100644 --- a/src/ads/native-ad/NativeAd.ts +++ b/src/ads/native-ad/NativeAd.ts @@ -15,7 +15,7 @@ * */ -import { EventSubscription, NativeEventEmitter, Platform } from 'react-native'; +import { EventSubscription } from 'react-native'; import EventEmitter from 'react-native/Libraries/vendor/emitter/EventEmitter'; import { NativeAdEventType } from '../../NativeAdEventType'; @@ -28,6 +28,7 @@ import NativeGoogleMobileAdsNativeModule, { } from '../../specs/modules/NativeGoogleMobileAdsNativeModule'; import { NativeAdRequestOptions } from '../../types'; import { validateAdRequestOptions } from '../../validateAdRequestOptions'; +import { GoogleMobileAdsNativeEventEmitter } from '../../internal/GoogleMobileAdsNativeEventEmitter'; /** * A class for loading Native Ads. @@ -65,22 +66,17 @@ export class NativeAd { this.mediaContent = props.mediaContent; this.extras = props.extras as Record; - if ('onAdEvent' in NativeGoogleMobileAdsNativeModule) { - this.nativeEventSubscription = NativeGoogleMobileAdsNativeModule.onAdEvent( - this.onNativeAdEvent.bind(this), - ); - } else { - let eventEmitter; - if (Platform.OS === 'ios') { - eventEmitter = new NativeEventEmitter(NativeGoogleMobileAdsNativeModule); - } else { - eventEmitter = new NativeEventEmitter(); - } - this.nativeEventSubscription = eventEmitter.addListener( - 'RNGMANativeAdEvent', - this.onNativeAdEvent.bind(this), - ); - } + // Codegen EventEmitter was introduced in RN 0.76.2, so we can't apply it for now, due to backward compatibility. + // if ('onAdEvent' in NativeGoogleMobileAdsNativeModule) { + // this.nativeEventSubscription = NativeGoogleMobileAdsNativeModule.onAdEvent( + // this.onNativeAdEvent.bind(this), + // ); + // } + + this.nativeEventSubscription = GoogleMobileAdsNativeEventEmitter.addListener( + 'RNGMANativeAdEvent', + this.onNativeAdEvent.bind(this), + ); this.eventEmitter = new EventEmitter(); } diff --git a/src/internal/GoogleMobileAdsNativeEventEmitter.ts b/src/internal/GoogleMobileAdsNativeEventEmitter.ts index e92b304a..b4ce01d4 100644 --- a/src/internal/GoogleMobileAdsNativeEventEmitter.ts +++ b/src/internal/GoogleMobileAdsNativeEventEmitter.ts @@ -27,9 +27,9 @@ class GANativeEventEmitter extends NativeEventEmitter { this.ready = false; } - addListener( + addListener( eventType: string, - listener: (event: { adUnitId: string; requestId: number }) => void, + listener: (event: T) => void, context?: Record, ) { if (!this.ready) { diff --git a/src/specs/modules/NativeGoogleMobileAdsNativeModule.ts b/src/specs/modules/NativeGoogleMobileAdsNativeModule.ts index 46c98ec5..cb47ac7c 100644 --- a/src/specs/modules/NativeGoogleMobileAdsNativeModule.ts +++ b/src/specs/modules/NativeGoogleMobileAdsNativeModule.ts @@ -17,12 +17,7 @@ import type { TurboModule } from 'react-native'; import { TurboModuleRegistry } from 'react-native'; -import type { - Double, - Float, - UnsafeObject, - EventEmitter, -} from 'react-native/Libraries/Types/CodegenTypes'; +import type { Double, Float, UnsafeObject } from 'react-native/Libraries/Types/CodegenTypes'; export type NativeAdProps = { responseId: string; @@ -58,7 +53,8 @@ export type NativeAdEventPayload = { export interface Spec extends TurboModule { load(adUnitId: string, requestOptions: UnsafeObject): Promise; destroy(responseId: string): void; - readonly onAdEvent: EventEmitter; + // Codegen EventEmitter was introduced in RN 0.76.2, so we can't apply it for now, due to backward compatibility. + // readonly onAdEvent: EventEmitter; } export default TurboModuleRegistry.getEnforcing('RNGoogleMobileAdsNativeModule');