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:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							de4159f0c2
						
					
				
				
					commit
					d05231d76b
				
			@@ -18,6 +18,7 @@ import java.io.StringWriter;
 | 
			
		||||
import java.lang.annotation.Retention;
 | 
			
		||||
import java.lang.annotation.RetentionPolicy;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public class VideoEventEmitter {
 | 
			
		||||
 | 
			
		||||
@@ -413,6 +414,19 @@ public class VideoEventEmitter {
 | 
			
		||||
        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) {
 | 
			
		||||
        WritableMap map = Arguments.createMap();
 | 
			
		||||
        map.putString("event", event);
 | 
			
		||||
 
 | 
			
		||||
@@ -2100,6 +2100,10 @@ public class ReactExoplayerView extends FrameLayout implements
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void onAdEvent(AdEvent adEvent) {
 | 
			
		||||
        eventEmitter.receiveAdEvent(adEvent.getType().name());
 | 
			
		||||
        if (adEvent.getAdData() != null) {
 | 
			
		||||
            eventEmitter.receiveAdEvent(adEvent.getType().name(), adEvent.getAdData());
 | 
			
		||||
        } else {
 | 
			
		||||
            eventEmitter.receiveAdEvent(adEvent.getType().name());
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,11 @@ package com.google.ads.interactivemedia.v3.api;
 | 
			
		||||
 | 
			
		||||
import androidx.annotation.InspectableProperty;
 | 
			
		||||
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
 | 
			
		||||
public abstract class AdEvent {
 | 
			
		||||
    public abstract InspectableProperty getType();
 | 
			
		||||
    public abstract Map<String, String> getAdData();
 | 
			
		||||
 | 
			
		||||
    public interface AdEventListener {
 | 
			
		||||
        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_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_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.                                                                        |
 | 
			
		||||
| `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_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).                                                                                                                                      |
 | 
			
		||||
@@ -395,14 +395,18 @@ Enum `AdEvent` possible values for [Android](https://developers.google.com/inter
 | 
			
		||||
 | 
			
		||||
Payload:
 | 
			
		||||
 | 
			
		||||
| Property | Type    | Description           |
 | 
			
		||||
|----------|---------|-----------------------|
 | 
			
		||||
|  event   | AdEvent | The ad event received |
 | 
			
		||||
| Property | Type                                | Description           |
 | 
			
		||||
|----------|-------------------------------------|-----------------------|
 | 
			
		||||
| event    | AdEvent                             | The ad event received |
 | 
			
		||||
| data     | Record<string, string> \| undefined | The ad event data     |
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
```javascript
 | 
			
		||||
```json
 | 
			
		||||
{
 | 
			
		||||
  "event": "LOADED"
 | 
			
		||||
  "data": {
 | 
			
		||||
    "key": "value"
 | 
			
		||||
  },
 | 
			
		||||
  "event": "LOG"
 | 
			
		||||
}
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -98,10 +98,18 @@ class RCTIMAAdsManager: NSObject, IMAAdsLoaderDelegate, IMAAdsManagerDelegate, I
 | 
			
		||||
        if _video.onReceiveAdEvent != nil {
 | 
			
		||||
            let type = convertEventToString(event: event.type)
 | 
			
		||||
 | 
			
		||||
            _video.onReceiveAdEvent?([
 | 
			
		||||
                "event": type,
 | 
			
		||||
                "target": _video.reactTag!
 | 
			
		||||
            ]);
 | 
			
		||||
            if (event.adData != nil) {
 | 
			
		||||
                _video.onReceiveAdEvent?([
 | 
			
		||||
                    "event": type,
 | 
			
		||||
                    "data": event.adData ?? [String](),
 | 
			
		||||
                    "target": _video.reactTag!
 | 
			
		||||
                ]);
 | 
			
		||||
            } else {
 | 
			
		||||
                _video.onReceiveAdEvent?([
 | 
			
		||||
                    "event": type,
 | 
			
		||||
                    "target": _video.reactTag!
 | 
			
		||||
                ]);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -238,6 +238,7 @@ export type OnPictureInPictureStatusChangedData = Readonly<{
 | 
			
		||||
}>;
 | 
			
		||||
 | 
			
		||||
export type OnReceiveAdEventData = Readonly<{
 | 
			
		||||
  data?: Record<string, string>;
 | 
			
		||||
  event: AdEvent;
 | 
			
		||||
}>;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,7 @@ export enum AdEvent {
 | 
			
		||||
   */
 | 
			
		||||
  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',
 | 
			
		||||
  /**
 | 
			
		||||
 
 | 
			
		||||
@@ -115,6 +115,7 @@ export type OnPictureInPictureStatusChangedData = Readonly<{
 | 
			
		||||
}>;
 | 
			
		||||
 | 
			
		||||
export type OnReceiveAdEventData = Readonly<{
 | 
			
		||||
  data?: Record<string, string>;
 | 
			
		||||
  event: AdEvent;
 | 
			
		||||
}>;
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -174,7 +174,7 @@ export interface ReactVideoProps extends ReactVideoEvents {
 | 
			
		||||
  source?: ReactVideoSource;
 | 
			
		||||
  drm?: Drm;
 | 
			
		||||
  style?: StyleProp<ViewStyle>;
 | 
			
		||||
  adTagUrl?: string; // iOS
 | 
			
		||||
  adTagUrl?: string;
 | 
			
		||||
  audioOnly?: boolean;
 | 
			
		||||
  automaticallyWaitsToMinimizeStalling?: boolean; // iOS
 | 
			
		||||
  backBufferDurationMs?: number; // Android
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user