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:
parent
de4159f0c2
commit
d05231d76b
@ -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);
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -238,6 +238,7 @@ export type OnPictureInPictureStatusChangedData = Readonly<{
|
|||||||
}>;
|
}>;
|
||||||
|
|
||||||
export type OnReceiveAdEventData = Readonly<{
|
export type OnReceiveAdEventData = Readonly<{
|
||||||
|
data?: Record<string, string>;
|
||||||
event: AdEvent;
|
event: AdEvent;
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
@ -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',
|
||||||
/**
|
/**
|
||||||
|
@ -115,6 +115,7 @@ export type OnPictureInPictureStatusChangedData = Readonly<{
|
|||||||
}>;
|
}>;
|
||||||
|
|
||||||
export type OnReceiveAdEventData = Readonly<{
|
export type OnReceiveAdEventData = Readonly<{
|
||||||
|
data?: Record<string, string>;
|
||||||
event: AdEvent;
|
event: AdEvent;
|
||||||
}>;
|
}>;
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user