feat(ad): add data to onReceiveAdEvent (#3378)

* feat(ad): add adData to onReceiveAdEvent
* fix: remove adData from response if empty
* fix: add getAdData to stub file
* chore: fix build without IMA
* fix: rename `adData` to `data`

---------

Co-authored-by: olivier <olivier.bouillet@ifeelsmart.com>
This commit is contained in:
Axel Vencatareddy 2023-11-27 21:43:30 +01:00 committed by GitHub
parent de4159f0c2
commit d05231d76b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 50 additions and 15 deletions

View File

@ -18,6 +18,7 @@ import java.io.StringWriter;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Map;
public class VideoEventEmitter { public class VideoEventEmitter {
@ -413,6 +414,19 @@ public class VideoEventEmitter {
receiveEvent(EVENT_AUDIO_BECOMING_NOISY, null); receiveEvent(EVENT_AUDIO_BECOMING_NOISY, null);
} }
public void receiveAdEvent(String event, Map<String, String> data) {
WritableMap map = Arguments.createMap();
map.putString("event", event);
WritableMap dataMap = Arguments.createMap();
for (Map.Entry<String, String> entry : data.entrySet()) {
dataMap.putString(entry.getKey(), entry.getValue());
}
map.putMap("data", dataMap);
receiveEvent(EVENT_ON_RECEIVE_AD_EVENT, map);
}
public void receiveAdEvent(String event) { public void receiveAdEvent(String event) {
WritableMap map = Arguments.createMap(); WritableMap map = Arguments.createMap();
map.putString("event", event); map.putString("event", event);

View File

@ -2100,6 +2100,10 @@ public class ReactExoplayerView extends FrameLayout implements
@Override @Override
public void onAdEvent(AdEvent adEvent) { public void onAdEvent(AdEvent adEvent) {
if (adEvent.getAdData() != null) {
eventEmitter.receiveAdEvent(adEvent.getType().name(), adEvent.getAdData());
} else {
eventEmitter.receiveAdEvent(adEvent.getType().name()); eventEmitter.receiveAdEvent(adEvent.getType().name());
} }
}
} }

View File

@ -2,8 +2,11 @@ package com.google.ads.interactivemedia.v3.api;
import androidx.annotation.InspectableProperty; import androidx.annotation.InspectableProperty;
import java.util.Map;
public abstract class AdEvent { public abstract class AdEvent {
public abstract InspectableProperty getType(); public abstract InspectableProperty getType();
public abstract Map<String, String> getAdData();
public interface AdEventListener { public interface AdEventListener {
public void onAdEvent(AdEvent adEvent); public void onAdEvent(AdEvent adEvent);

View File

@ -362,10 +362,10 @@ Enum `AdEvent` possible values for [Android](https://developers.google.com/inter
| `AD_METADATA` | Android | Fires when an ads list is loaded. | | `AD_METADATA` | Android | Fires when an ads list is loaded. |
| `AD_PERIOD_ENDED` | iOS | Fired every time the stream switches from advertising or slate to content. This will be fired even when an ad is played a second time or when seeking into an ad (only used for dynamic ad insertion). | | `AD_PERIOD_ENDED` | iOS | Fired every time the stream switches from advertising or slate to content. This will be fired even when an ad is played a second time or when seeking into an ad (only used for dynamic ad insertion). |
| `AD_PERIOD_STARTED` | iOS | Fired every time the stream switches from content to advertising or slate. This will be fired even when an ad is played a second time or when seeking into an ad (only used for dynamic ad insertion). | | `AD_PERIOD_STARTED` | iOS | Fired every time the stream switches from content to advertising or slate. This will be fired even when an ad is played a second time or when seeking into an ad (only used for dynamic ad insertion). |
| `AD_PROGRESS` | Android | Fires when the ad's current time value changes. Calling getAdData() on this event will return an AdProgressData object. | | `AD_PROGRESS` | Android | Fires when the ad's current time value changes. The event `data` will be populated with an AdProgressData object. |
| `ALL_ADS_COMPLETED` | Android, iOS | Fires when the ads manager is done playing all the valid ads in the ads response, or when the response doesn't return any valid ads. | | `ALL_ADS_COMPLETED` | Android, iOS | Fires when the ads manager is done playing all the valid ads in the ads response, or when the response doesn't return any valid ads. |
| `CLICK` | Android, iOS | Fires when the ad is clicked. | | `CLICK` | Android, iOS | Fires when the ad is clicked. |
| `COMPLETE` | Android, iOS | Fires when the ad completes playing. | | `COMPLETED` | Android, iOS | Fires when the ad completes playing. |
| `CONTENT_PAUSE_REQUESTED` | Android | Fires when content should be paused. This usually happens right before an ad is about to cover the content. | | `CONTENT_PAUSE_REQUESTED` | Android | Fires when content should be paused. This usually happens right before an ad is about to cover the content. |
| `CONTENT_RESUME_REQUESTED` | Android | Fires when content should be resumed. This usually happens when an ad finishes or collapses. | | `CONTENT_RESUME_REQUESTED` | Android | Fires when content should be resumed. This usually happens when an ad finishes or collapses. |
| `CUEPOINTS_CHANGED` | iOS | Cuepoints changed for VOD stream (only used for dynamic ad insertion). | | `CUEPOINTS_CHANGED` | iOS | Cuepoints changed for VOD stream (only used for dynamic ad insertion). |
@ -396,13 +396,17 @@ Enum `AdEvent` possible values for [Android](https://developers.google.com/inter
Payload: Payload:
| Property | Type | Description | | Property | Type | Description |
|----------|---------|-----------------------| |----------|-------------------------------------|-----------------------|
| event | AdEvent | The ad event received | | event | AdEvent | The ad event received |
| data | Record<string, string> \| undefined | The ad event data |
Example: Example:
```javascript ```json
{ {
"event": "LOADED" "data": {
"key": "value"
},
"event": "LOG"
} }
``` ```

View File

@ -98,12 +98,20 @@ class RCTIMAAdsManager: NSObject, IMAAdsLoaderDelegate, IMAAdsManagerDelegate, I
if _video.onReceiveAdEvent != nil { if _video.onReceiveAdEvent != nil {
let type = convertEventToString(event: event.type) let type = convertEventToString(event: event.type)
if (event.adData != nil) {
_video.onReceiveAdEvent?([
"event": type,
"data": event.adData ?? [String](),
"target": _video.reactTag!
]);
} else {
_video.onReceiveAdEvent?([ _video.onReceiveAdEvent?([
"event": type, "event": type,
"target": _video.reactTag! "target": _video.reactTag!
]); ]);
} }
} }
}
func adsManager(_ adsManager: IMAAdsManager, didReceive error: IMAAdError) { func adsManager(_ adsManager: IMAAdsManager, didReceive error: IMAAdError) {
if error.message != nil { if error.message != nil {

View File

@ -238,6 +238,7 @@ export type OnPictureInPictureStatusChangedData = Readonly<{
}>; }>;
export type OnReceiveAdEventData = Readonly<{ export type OnReceiveAdEventData = Readonly<{
data?: Record<string, string>;
event: AdEvent; event: AdEvent;
}>; }>;

View File

@ -32,7 +32,7 @@ export enum AdEvent {
*/ */
AD_PERIOD_STARTED = 'AD_PERIOD_STARTED', AD_PERIOD_STARTED = 'AD_PERIOD_STARTED',
/** /**
* Android only: Fires when the ad's current time value changes. Calling getAdData() on this event will return an AdProgressData object. * Android only: Fires when the ad's current time value changes. The event `data` will be populated with an AdProgressData object.
*/ */
AD_PROGRESS = 'AD_PROGRESS', AD_PROGRESS = 'AD_PROGRESS',
/** /**

View File

@ -115,6 +115,7 @@ export type OnPictureInPictureStatusChangedData = Readonly<{
}>; }>;
export type OnReceiveAdEventData = Readonly<{ export type OnReceiveAdEventData = Readonly<{
data?: Record<string, string>;
event: AdEvent; event: AdEvent;
}>; }>;

View File

@ -174,7 +174,7 @@ export interface ReactVideoProps extends ReactVideoEvents {
source?: ReactVideoSource; source?: ReactVideoSource;
drm?: Drm; drm?: Drm;
style?: StyleProp<ViewStyle>; style?: StyleProp<ViewStyle>;
adTagUrl?: string; // iOS adTagUrl?: string;
audioOnly?: boolean; audioOnly?: boolean;
automaticallyWaitsToMinimizeStalling?: boolean; // iOS automaticallyWaitsToMinimizeStalling?: boolean; // iOS
backBufferDurationMs?: number; // Android backBufferDurationMs?: number; // Android