teads-react-native 6.0.1-0.alpha.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +93 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeRNGestureHandlerModuleSpec.java +66 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSafeAreaContextSpec.java +65 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerDelegate.java +26 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerInterface.java +17 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerDelegate.java +36 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerInterface.java +20 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +60 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +27 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerDelegate.java +26 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerInterface.java +17 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TeadsAdPlacementFeedManagerDelegate.java +62 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TeadsAdPlacementFeedManagerInterface.java +28 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TeadsAdPlacementMediaManagerDelegate.java +44 -0
- package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TeadsAdPlacementMediaManagerInterface.java +22 -0
- package/android/app/build/generated/source/codegen/jni/CMakeLists.txt +36 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ComponentDescriptors.cpp +23 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ComponentDescriptors.h +25 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/EventEmitters.cpp +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/EventEmitters.h +30 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/Props.cpp +46 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/Props.h +51 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ShadowNodes.cpp +18 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ShadowNodes.h +43 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/States.cpp +16 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/States.h +41 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/ComponentDescriptors.cpp +23 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/ComponentDescriptors.h +25 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/EventEmitters.cpp +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/EventEmitters.h +30 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/Props.cpp +41 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/Props.h +47 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/ShadowNodes.cpp +18 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/ShadowNodes.h +43 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/States.cpp +16 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/States.h +41 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/rngesturehandler_codegenJSI-generated.cpp +86 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/rngesturehandler_codegenJSI.h +134 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ComponentDescriptors.cpp +22 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ComponentDescriptors.h +24 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/EventEmitters.cpp +40 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/EventEmitters.h +47 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/Props.cpp +33 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/Props.h +85 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ShadowNodes.cpp +17 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ShadowNodes.h +32 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/States.cpp +16 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/States.h +29 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/safeareacontextJSI-generated.cpp +26 -0
- package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/safeareacontextJSI.h +71 -0
- package/android/app/build/generated/source/codegen/jni/rngesturehandler_codegen-generated.cpp +74 -0
- package/android/app/build/generated/source/codegen/jni/rngesturehandler_codegen.h +31 -0
- package/android/app/build/generated/source/codegen/jni/safeareacontext-generated.cpp +32 -0
- package/android/app/build/generated/source/codegen/jni/safeareacontext.h +31 -0
- package/android/build.gradle +107 -0
- package/android/generated/java/com/facebook/react/viewmanagers/TeadsAdPlacementFeedManagerDelegate.java +62 -0
- package/android/generated/java/com/facebook/react/viewmanagers/TeadsAdPlacementFeedManagerInterface.java +28 -0
- package/android/generated/java/com/facebook/react/viewmanagers/TeadsAdPlacementMediaManagerDelegate.java +44 -0
- package/android/generated/java/com/facebook/react/viewmanagers/TeadsAdPlacementMediaManagerInterface.java +22 -0
- package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ComponentDescriptors.cpp +23 -0
- package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ComponentDescriptors.h +25 -0
- package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/EventEmitters.cpp +17 -0
- package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/EventEmitters.h +30 -0
- package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/Props.cpp +46 -0
- package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/Props.h +51 -0
- package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ShadowNodes.cpp +18 -0
- package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ShadowNodes.h +43 -0
- package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/States.cpp +16 -0
- package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/States.h +41 -0
- package/android/gradle.properties +5 -0
- package/android/src/main/AndroidManifest.xml +3 -0
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/tv/teads/reactnative/SFWidgetContainer.java +19 -0
- package/android/src/main/java/tv/teads/reactnative/TeadsAdPlacementFeedManager.java +109 -0
- package/android/src/main/java/tv/teads/reactnative/TeadsFeedPackage.java +26 -0
- package/android/src/main/java/tv/teads/reactnative/TeadsMediaPlacementManager.java +76 -0
- package/android/src/main/java/tv/teads/reactnative/TeadsPlacementContainer.java +329 -0
- package/android/src/main/java/tv/teads/reactnative/Utils.java +65 -0
- package/android/src/main/jni/CMakeLists.txt +44 -0
- package/ios/RCTTeadsAdPlacementFeed.h +22 -0
- package/ios/RCTTeadsAdPlacementFeed.mm +114 -0
- package/ios/RCTTeadsAdPlacementMedia.h +23 -0
- package/ios/RCTTeadsAdPlacementMedia.mm +91 -0
- package/ios/TeadsAdContainer.swift +212 -0
- package/ios/TeadsEventModule.h +16 -0
- package/ios/TeadsEventModule.mm +52 -0
- package/ios/TeadsReactNative.h +8 -0
- package/lib/commonjs/DefaultTeadsWidgetHandler.js +21 -0
- package/lib/commonjs/DefaultTeadsWidgetHandler.js.map +1 -0
- package/lib/commonjs/TeadsAdPlacementFeed.js +131 -0
- package/lib/commonjs/TeadsAdPlacementFeed.js.map +1 -0
- package/lib/commonjs/TeadsAdPlacementMedia.js +115 -0
- package/lib/commonjs/TeadsAdPlacementMedia.js.map +1 -0
- package/lib/commonjs/TeadsInAppBrowser.js +48 -0
- package/lib/commonjs/TeadsInAppBrowser.js.map +1 -0
- package/lib/commonjs/TeadsMediaNativeComponent.ts +15 -0
- package/lib/commonjs/WebViewNativeComponent.ts +21 -0
- package/lib/commonjs/constants.js +9 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/index.js +20 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/types.d.js +2 -0
- package/lib/commonjs/types.d.js.map +1 -0
- package/lib/commonjs/version.js +8 -0
- package/lib/commonjs/version.js.map +1 -0
- package/lib/module/DefaultTeadsWidgetHandler.js +17 -0
- package/lib/module/DefaultTeadsWidgetHandler.js.map +1 -0
- package/lib/module/TeadsAdPlacementFeed.js +126 -0
- package/lib/module/TeadsAdPlacementFeed.js.map +1 -0
- package/lib/module/TeadsAdPlacementMedia.js +110 -0
- package/lib/module/TeadsAdPlacementMedia.js.map +1 -0
- package/lib/module/TeadsInAppBrowser.js +44 -0
- package/lib/module/TeadsInAppBrowser.js.map +1 -0
- package/lib/module/TeadsMediaNativeComponent.ts +15 -0
- package/lib/module/WebViewNativeComponent.ts +21 -0
- package/lib/module/constants.js +5 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/index.js +5 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/types.d.js +2 -0
- package/lib/module/types.d.js.map +1 -0
- package/lib/module/version.js +4 -0
- package/lib/module/version.js.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/src/DefaultTeadsWidgetHandler.d.ts +4 -0
- package/lib/typescript/commonjs/src/DefaultTeadsWidgetHandler.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TeadsAdPlacementFeed.d.ts +3 -0
- package/lib/typescript/commonjs/src/TeadsAdPlacementFeed.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TeadsAdPlacementMedia.d.ts +3 -0
- package/lib/typescript/commonjs/src/TeadsAdPlacementMedia.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TeadsInAppBrowser.d.ts +4 -0
- package/lib/typescript/commonjs/src/TeadsInAppBrowser.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/TeadsMediaNativeComponent.d.ts +12 -0
- package/lib/typescript/commonjs/src/TeadsMediaNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/WebViewNativeComponent.d.ts +18 -0
- package/lib/typescript/commonjs/src/WebViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/constants.d.ts +3 -0
- package/lib/typescript/commonjs/src/constants.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/index.d.ts +4 -0
- package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/version.d.ts +2 -0
- package/lib/typescript/commonjs/src/version.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/src/DefaultTeadsWidgetHandler.d.ts +4 -0
- package/lib/typescript/module/src/DefaultTeadsWidgetHandler.d.ts.map +1 -0
- package/lib/typescript/module/src/TeadsAdPlacementFeed.d.ts +3 -0
- package/lib/typescript/module/src/TeadsAdPlacementFeed.d.ts.map +1 -0
- package/lib/typescript/module/src/TeadsAdPlacementMedia.d.ts +3 -0
- package/lib/typescript/module/src/TeadsAdPlacementMedia.d.ts.map +1 -0
- package/lib/typescript/module/src/TeadsInAppBrowser.d.ts +4 -0
- package/lib/typescript/module/src/TeadsInAppBrowser.d.ts.map +1 -0
- package/lib/typescript/module/src/TeadsMediaNativeComponent.d.ts +12 -0
- package/lib/typescript/module/src/TeadsMediaNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/WebViewNativeComponent.d.ts +18 -0
- package/lib/typescript/module/src/WebViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/module/src/constants.d.ts +3 -0
- package/lib/typescript/module/src/constants.d.ts.map +1 -0
- package/lib/typescript/module/src/index.d.ts +4 -0
- package/lib/typescript/module/src/index.d.ts.map +1 -0
- package/lib/typescript/module/src/version.d.ts +2 -0
- package/lib/typescript/module/src/version.d.ts.map +1 -0
- package/package.json +232 -0
- package/react-native.config.js +17 -0
- package/src/DefaultTeadsWidgetHandler.ts +17 -0
- package/src/TeadsAdPlacementFeed.tsx +142 -0
- package/src/TeadsAdPlacementMedia.tsx +127 -0
- package/src/TeadsInAppBrowser.ts +42 -0
- package/src/TeadsMediaNativeComponent.ts +15 -0
- package/src/WebViewNativeComponent.ts +21 -0
- package/src/constants.ts +11 -0
- package/src/index.tsx +9 -0
- package/src/types.d.ts +32 -0
- package/src/version.ts +1 -0
- package/teads-react-native.podspec +40 -0
package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ShadowNodes.h
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
+
* once the code is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GenerateShadowNodeH.js
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#pragma once
|
|
12
|
+
|
|
13
|
+
#include "EventEmitters.h"
|
|
14
|
+
#include "Props.h"
|
|
15
|
+
#include "States.h"
|
|
16
|
+
#include <react/renderer/components/view/ConcreteViewShadowNode.h>
|
|
17
|
+
#include <jsi/jsi.h>
|
|
18
|
+
|
|
19
|
+
namespace facebook::react {
|
|
20
|
+
|
|
21
|
+
JSI_EXPORT extern const char TeadsAdPlacementMediaComponentName[];
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* `ShadowNode` for <TeadsAdPlacementMedia> component.
|
|
25
|
+
*/
|
|
26
|
+
using TeadsAdPlacementMediaShadowNode = ConcreteViewShadowNode<
|
|
27
|
+
TeadsAdPlacementMediaComponentName,
|
|
28
|
+
TeadsAdPlacementMediaProps,
|
|
29
|
+
TeadsAdPlacementMediaEventEmitter,
|
|
30
|
+
TeadsAdPlacementMediaState>;
|
|
31
|
+
|
|
32
|
+
JSI_EXPORT extern const char TeadsAdPlacementFeedComponentName[];
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
* `ShadowNode` for <TeadsAdPlacementFeed> component.
|
|
36
|
+
*/
|
|
37
|
+
using TeadsAdPlacementFeedShadowNode = ConcreteViewShadowNode<
|
|
38
|
+
TeadsAdPlacementFeedComponentName,
|
|
39
|
+
TeadsAdPlacementFeedProps,
|
|
40
|
+
TeadsAdPlacementFeedEventEmitter,
|
|
41
|
+
TeadsAdPlacementFeedState>;
|
|
42
|
+
|
|
43
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
|
|
2
|
+
/**
|
|
3
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
+
*
|
|
5
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
+
* once the code is regenerated.
|
|
7
|
+
*
|
|
8
|
+
* @generated by codegen project: GenerateStateCpp.js
|
|
9
|
+
*/
|
|
10
|
+
#include "States.h"
|
|
11
|
+
|
|
12
|
+
namespace facebook::react {
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
3
|
+
*
|
|
4
|
+
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
5
|
+
* once the code is regenerated.
|
|
6
|
+
*
|
|
7
|
+
* @generated by codegen project: GenerateStateH.js
|
|
8
|
+
*/
|
|
9
|
+
#pragma once
|
|
10
|
+
|
|
11
|
+
#ifdef ANDROID
|
|
12
|
+
#include <folly/dynamic.h>
|
|
13
|
+
#endif
|
|
14
|
+
|
|
15
|
+
namespace facebook::react {
|
|
16
|
+
|
|
17
|
+
class TeadsAdPlacementMediaState {
|
|
18
|
+
public:
|
|
19
|
+
TeadsAdPlacementMediaState() = default;
|
|
20
|
+
|
|
21
|
+
#ifdef ANDROID
|
|
22
|
+
TeadsAdPlacementMediaState(TeadsAdPlacementMediaState const &previousState, folly::dynamic data){};
|
|
23
|
+
folly::dynamic getDynamic() const {
|
|
24
|
+
return {};
|
|
25
|
+
};
|
|
26
|
+
#endif
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
class TeadsAdPlacementFeedState {
|
|
30
|
+
public:
|
|
31
|
+
TeadsAdPlacementFeedState() = default;
|
|
32
|
+
|
|
33
|
+
#ifdef ANDROID
|
|
34
|
+
TeadsAdPlacementFeedState(TeadsAdPlacementFeedState const &previousState, folly::dynamic data){};
|
|
35
|
+
folly::dynamic getDynamic() const {
|
|
36
|
+
return {};
|
|
37
|
+
};
|
|
38
|
+
#endif
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
} // namespace facebook::react
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
package tv.teads.reactnative;
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint;
|
|
4
|
+
import com.facebook.react.bridge.ReactContext;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Internal alias for TeadsPlacementContainer to maintain backward compatibility with the SDK.
|
|
8
|
+
* The SDK's visibility handler looks for a class named "SFWidgetContainer" to properly
|
|
9
|
+
* calculate visibility in React Native's view hierarchy.
|
|
10
|
+
*
|
|
11
|
+
* This class is package-private (not part of public API) and will be removed
|
|
12
|
+
* once the SDK is updated to recognize TeadsPlacementContainer directly.
|
|
13
|
+
*/
|
|
14
|
+
@SuppressLint("ViewConstructor")
|
|
15
|
+
class SFWidgetContainer extends TeadsPlacementContainer {
|
|
16
|
+
SFWidgetContainer(ReactContext context) {
|
|
17
|
+
super(context);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
package tv.teads.reactnative;
|
|
2
|
+
|
|
3
|
+
import android.util.Log;
|
|
4
|
+
|
|
5
|
+
import com.facebook.react.module.annotations.ReactModule;
|
|
6
|
+
import com.facebook.react.uimanager.SimpleViewManager;
|
|
7
|
+
import com.facebook.react.uimanager.ThemedReactContext;
|
|
8
|
+
import com.facebook.react.uimanager.ViewManagerDelegate;
|
|
9
|
+
|
|
10
|
+
// Codegen generated files matching the spec given component
|
|
11
|
+
import com.facebook.react.viewmanagers.TeadsAdPlacementFeedManagerInterface;
|
|
12
|
+
import com.facebook.react.viewmanagers.TeadsAdPlacementFeedManagerDelegate;
|
|
13
|
+
|
|
14
|
+
@ReactModule(name = TeadsAdPlacementFeedManager.REACT_CLASS)
|
|
15
|
+
public class TeadsAdPlacementFeedManager extends SimpleViewManager<TeadsPlacementContainer> implements TeadsAdPlacementFeedManagerInterface<TeadsPlacementContainer> {
|
|
16
|
+
// Codegen component name
|
|
17
|
+
public static final String REACT_CLASS = "TeadsAdPlacementFeed";
|
|
18
|
+
// uses the Codegen generated delegate
|
|
19
|
+
private final TeadsAdPlacementFeedManagerDelegate<TeadsPlacementContainer, TeadsAdPlacementFeedManager> delegate =
|
|
20
|
+
new TeadsAdPlacementFeedManagerDelegate<>(this);
|
|
21
|
+
|
|
22
|
+
@Override
|
|
23
|
+
public ViewManagerDelegate<TeadsPlacementContainer> getDelegate() {
|
|
24
|
+
return delegate;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@Override
|
|
28
|
+
public String getName() {
|
|
29
|
+
return REACT_CLASS;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@Override
|
|
33
|
+
public TeadsPlacementContainer createViewInstance(ThemedReactContext context) {
|
|
34
|
+
// Use SFWidgetContainer (extends TeadsPlacementContainer) so SDK's visibility handler can find it by class name
|
|
35
|
+
return new SFWidgetContainer(context);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ViewManager needs to define how all the React's components props will update the native view
|
|
39
|
+
@Override
|
|
40
|
+
public void setWidgetId(TeadsPlacementContainer view, String value) {
|
|
41
|
+
view.getInitParams().putString("widgetId", value);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@Override
|
|
45
|
+
public void setWidgetRandomId(TeadsPlacementContainer view, int value) {
|
|
46
|
+
view.getInitParams().putInt("widgetRandomId", value);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@Override
|
|
50
|
+
public void setWidgetIndex(TeadsPlacementContainer view, int value) {
|
|
51
|
+
view.getInitParams().putInt("widgetIndex", value);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@Override
|
|
55
|
+
public void setUrl(TeadsPlacementContainer view, String value) {
|
|
56
|
+
view.getInitParams().putString("articleUrl", value);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@Override
|
|
60
|
+
public void setInstallationKey(TeadsPlacementContainer view, String value) {
|
|
61
|
+
view.getInitParams().putString("partnerKey", value);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@Override
|
|
65
|
+
public void setPackageVersion(TeadsPlacementContainer view, String value) {
|
|
66
|
+
view.getInitParams().putString("packageVersion", value);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
@Override
|
|
70
|
+
public void setDarkMode(TeadsPlacementContainer view, boolean value) {
|
|
71
|
+
view.getInitParams().putBoolean("darkMode", value);
|
|
72
|
+
view.toggleDarkMode(value);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@Override
|
|
76
|
+
public void setExtId(TeadsPlacementContainer view, String value) {
|
|
77
|
+
view.getInitParams().putString("extId", value);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@Override
|
|
81
|
+
public void setExtSecondaryId(TeadsPlacementContainer view, String value) {
|
|
82
|
+
view.getInitParams().putString("extSecondaryId", value);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
@Override
|
|
86
|
+
public void setPubImpId(TeadsPlacementContainer view, String value) {
|
|
87
|
+
view.getInitParams().putString("pubImpId", value);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// If userId is required in native:
|
|
91
|
+
@Override
|
|
92
|
+
public void setUserId(TeadsPlacementContainer view, String value) {
|
|
93
|
+
view.getInitParams().putString("userId", value);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
@Override
|
|
97
|
+
public void onAfterUpdateTransaction(TeadsPlacementContainer view) {
|
|
98
|
+
super.onAfterUpdateTransaction(view);
|
|
99
|
+
view.initialize(view.getInitParams());
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
@Override
|
|
103
|
+
public void onDropViewInstance(TeadsPlacementContainer view) {
|
|
104
|
+
Log.d("TeadsAdPlacementFeedManager", "onDropViewInstance called");
|
|
105
|
+
view.cleanup();
|
|
106
|
+
super.onDropViewInstance(view);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
package tv.teads.reactnative;
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.ReactPackage;
|
|
4
|
+
import com.facebook.react.bridge.NativeModule;
|
|
5
|
+
import com.facebook.react.bridge.ReactApplicationContext;
|
|
6
|
+
import com.facebook.react.uimanager.ViewManager;
|
|
7
|
+
|
|
8
|
+
import java.util.Arrays;
|
|
9
|
+
import java.util.Collections;
|
|
10
|
+
import java.util.List;
|
|
11
|
+
|
|
12
|
+
public class TeadsFeedPackage implements ReactPackage {
|
|
13
|
+
|
|
14
|
+
@Override
|
|
15
|
+
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
|
16
|
+
return Arrays.asList(
|
|
17
|
+
new TeadsAdPlacementFeedManager(),
|
|
18
|
+
new TeadsMediaPlacementManager()
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@Override
|
|
23
|
+
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
|
24
|
+
return Collections.emptyList();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
package tv.teads.reactnative;
|
|
2
|
+
|
|
3
|
+
import android.util.Log;
|
|
4
|
+
|
|
5
|
+
import com.facebook.react.module.annotations.ReactModule;
|
|
6
|
+
import com.facebook.react.uimanager.SimpleViewManager;
|
|
7
|
+
import com.facebook.react.uimanager.ThemedReactContext;
|
|
8
|
+
import com.facebook.react.uimanager.ViewManagerDelegate;
|
|
9
|
+
|
|
10
|
+
// Codegen generated files matching the spec given component
|
|
11
|
+
import com.facebook.react.viewmanagers.TeadsAdPlacementMediaManagerDelegate;
|
|
12
|
+
import com.facebook.react.viewmanagers.TeadsAdPlacementMediaManagerInterface;
|
|
13
|
+
|
|
14
|
+
@ReactModule(name = TeadsMediaPlacementManager.REACT_CLASS)
|
|
15
|
+
public class TeadsMediaPlacementManager extends SimpleViewManager<TeadsPlacementContainer> implements TeadsAdPlacementMediaManagerInterface<TeadsPlacementContainer> {
|
|
16
|
+
// Codegen component name
|
|
17
|
+
public static final String REACT_CLASS = "TeadsAdPlacementMedia";
|
|
18
|
+
// uses the Codegen generated delegate
|
|
19
|
+
private final TeadsAdPlacementMediaManagerDelegate<TeadsPlacementContainer, TeadsMediaPlacementManager> delegate =
|
|
20
|
+
new TeadsAdPlacementMediaManagerDelegate<>(this);
|
|
21
|
+
|
|
22
|
+
@Override
|
|
23
|
+
public ViewManagerDelegate<TeadsPlacementContainer> getDelegate() {
|
|
24
|
+
return delegate;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
@Override
|
|
28
|
+
public String getName() {
|
|
29
|
+
return REACT_CLASS;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
@Override
|
|
33
|
+
public TeadsPlacementContainer createViewInstance(ThemedReactContext context) {
|
|
34
|
+
// Use SFWidgetContainer (extends TeadsPlacementContainer) so SDK's visibility handler can find it by class name
|
|
35
|
+
return new SFWidgetContainer(context);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ViewManager needs to define how all the React's components props will update the native view
|
|
39
|
+
@Override
|
|
40
|
+
public void setPid(TeadsPlacementContainer view, String value) {
|
|
41
|
+
view.getInitParams().putString("pid", value);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@Override
|
|
45
|
+
public void setWidgetRandomId(TeadsPlacementContainer view, int value) {
|
|
46
|
+
view.getInitParams().putInt("widgetRandomId", value);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
@Override
|
|
50
|
+
public void setUrl(TeadsPlacementContainer view, String value) {
|
|
51
|
+
view.getInitParams().putString("articleUrl", value);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@Override
|
|
55
|
+
public void setInstallationKey(TeadsPlacementContainer view, String value) {
|
|
56
|
+
view.getInitParams().putString("partnerKey", value);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
@Override
|
|
60
|
+
public void setPackageVersion(TeadsPlacementContainer view, String value) {
|
|
61
|
+
view.getInitParams().putString("packageVersion", value);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@Override
|
|
65
|
+
public void onAfterUpdateTransaction(TeadsPlacementContainer view) {
|
|
66
|
+
super.onAfterUpdateTransaction(view);
|
|
67
|
+
view.initialize(view.getInitParams());
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
@Override
|
|
71
|
+
public void onDropViewInstance(TeadsPlacementContainer view) {
|
|
72
|
+
Log.d("TeadsMediaPlacementManager", "onDropViewInstance called");
|
|
73
|
+
view.cleanup();
|
|
74
|
+
super.onDropViewInstance(view);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
package tv.teads.reactnative;
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint;
|
|
4
|
+
import android.graphics.Rect;
|
|
5
|
+
import android.net.Uri;
|
|
6
|
+
import android.util.Log;
|
|
7
|
+
import android.view.View;
|
|
8
|
+
import android.view.ViewGroup;
|
|
9
|
+
import android.view.ViewTreeObserver;
|
|
10
|
+
import android.widget.FrameLayout;
|
|
11
|
+
|
|
12
|
+
import androidx.annotation.NonNull;
|
|
13
|
+
import androidx.annotation.Nullable;
|
|
14
|
+
|
|
15
|
+
import com.facebook.react.bridge.Arguments;
|
|
16
|
+
import com.facebook.react.bridge.ReactContext;
|
|
17
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
18
|
+
import com.facebook.react.bridge.WritableMap;
|
|
19
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule;
|
|
20
|
+
import com.facebook.react.uimanager.ThemedReactContext;
|
|
21
|
+
import com.facebook.react.views.view.ReactViewGroup;
|
|
22
|
+
|
|
23
|
+
import java.util.Map;
|
|
24
|
+
|
|
25
|
+
import tv.teads.sdk.AdRatio;
|
|
26
|
+
import tv.teads.sdk.TeadsSDK;
|
|
27
|
+
import tv.teads.sdk.combinedsdk.TeadsAdPlacementEventName;
|
|
28
|
+
import tv.teads.sdk.combinedsdk.adplacement.TeadsAdPlacementFeed;
|
|
29
|
+
import tv.teads.sdk.combinedsdk.adplacement.TeadsAdPlacementMedia;
|
|
30
|
+
import tv.teads.sdk.combinedsdk.adplacement.config.TeadsAdPlacementFeedConfig;
|
|
31
|
+
import tv.teads.sdk.combinedsdk.adplacement.config.TeadsAdPlacementMediaConfig;
|
|
32
|
+
import tv.teads.sdk.combinedsdk.adplacement.interfaces.TeadsAdPlacementEventsDelegate;
|
|
33
|
+
import tv.teads.sdk.combinedsdk.adplacement.interfaces.core.TeadsAdPlacement;
|
|
34
|
+
import tv.teads.sdk.framework.WrapperFrameworkInfo;
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
@SuppressLint("ViewConstructor")
|
|
38
|
+
public class TeadsPlacementContainer extends ReactViewGroup implements TeadsAdPlacementEventsDelegate {
|
|
39
|
+
/**
|
|
40
|
+
* this class has two main functions:
|
|
41
|
+
* 1. connect the React Native native view interface with the Teads ad view
|
|
42
|
+
* 2. implement event handling and propagating the events up to RN
|
|
43
|
+
**/
|
|
44
|
+
|
|
45
|
+
TeadsAdPlacementFeed teadsAdPlacementFeed;
|
|
46
|
+
TeadsAdPlacementMedia teadsAdPlacementMedia;
|
|
47
|
+
FrameLayout widgetLayout;
|
|
48
|
+
ReactContext context;
|
|
49
|
+
String widgetId;
|
|
50
|
+
String pid;
|
|
51
|
+
Uri articleUrl;
|
|
52
|
+
int widgetRandomId;
|
|
53
|
+
boolean isTeadsVideoPlacement = false;
|
|
54
|
+
private volatile boolean isCleanedUp = false;
|
|
55
|
+
|
|
56
|
+
private final WritableMap initParams = Arguments.createMap();
|
|
57
|
+
|
|
58
|
+
public TeadsPlacementContainer(ReactContext context) {
|
|
59
|
+
super(context);
|
|
60
|
+
this.context = context;
|
|
61
|
+
setBackgroundColor(android.graphics.Color.TRANSPARENT);
|
|
62
|
+
configureComponent();
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
private void configureComponent() {
|
|
66
|
+
this.setLayoutParams(new ViewGroup.LayoutParams(
|
|
67
|
+
ViewGroup.LayoutParams.MATCH_PARENT,
|
|
68
|
+
ViewGroup.LayoutParams.MATCH_PARENT
|
|
69
|
+
));
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
public void initialize(ReadableMap args) {
|
|
73
|
+
this.isTeadsVideoPlacement = args.hasKey("pid");
|
|
74
|
+
Log.i("TeadsFeedContainer", "inside initialize(): " + (isTeadsVideoPlacement ? "Teads Video Placement" : "Teads Feed Placement"));
|
|
75
|
+
if (!this.isTeadsVideoPlacement && teadsAdPlacementFeed == null) {
|
|
76
|
+
initializeTeadsFeedPlacement(args);
|
|
77
|
+
} else if (this.isTeadsVideoPlacement && teadsAdPlacementMedia == null) {
|
|
78
|
+
initializeTeadsVideoPlacement(args);
|
|
79
|
+
} else {
|
|
80
|
+
Log.d("TeadsFeedContainer", "Widget already exists — skipping creation");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
private void initializeTeadsFeedPlacement(ReadableMap args) {
|
|
85
|
+
if (teadsAdPlacementFeed == null) {
|
|
86
|
+
Log.i("TeadsFeedContainer", "Initializing Feed placement with params: " + args.toString());
|
|
87
|
+
this.widgetId = args.getString("widgetId");
|
|
88
|
+
int widgetIndex = args.getInt("widgetIndex");
|
|
89
|
+
this.widgetRandomId = args.getInt("widgetRandomId");
|
|
90
|
+
String articleUrlString = args.getString("articleUrl");
|
|
91
|
+
this.articleUrl = Uri.parse(articleUrlString);
|
|
92
|
+
String installationKey = args.getString("partnerKey");
|
|
93
|
+
boolean darkMode = args.hasKey("darkMode") && args.getBoolean("darkMode");
|
|
94
|
+
String extId = args.hasKey("extId") ? args.getString("extId") : null;
|
|
95
|
+
String extSecondaryId = args.hasKey("extSecondaryId") ? args.getString("extSecondaryId") : null;
|
|
96
|
+
String pubImpId = args.hasKey("pubImpId") ? args.getString("pubImpId") : null;
|
|
97
|
+
String RN_packageVersion = args.getString("packageVersion");
|
|
98
|
+
|
|
99
|
+
initTeadsSDK(installationKey);
|
|
100
|
+
TeadsAdPlacementFeedConfig feedConfig = new TeadsAdPlacementFeedConfig(
|
|
101
|
+
this.articleUrl,
|
|
102
|
+
this.widgetId,
|
|
103
|
+
installationKey,
|
|
104
|
+
widgetIndex, // TODO: currently 2 widgets on the same page can work only if widgetIndex is 0 for both (that's a bug in the SDK)
|
|
105
|
+
null, // userId
|
|
106
|
+
darkMode, // darkMode
|
|
107
|
+
false, // testDisplay
|
|
108
|
+
extId, // extId
|
|
109
|
+
extSecondaryId, // extSecondaryId
|
|
110
|
+
pubImpId // obPubImpl
|
|
111
|
+
);
|
|
112
|
+
teadsAdPlacementFeed = new TeadsAdPlacementFeed(context, feedConfig,this);
|
|
113
|
+
this.widgetLayout = teadsAdPlacementFeed.loadAd();
|
|
114
|
+
commonSetupLayout();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
private void initializeTeadsVideoPlacement(ReadableMap args) {
|
|
119
|
+
if (teadsAdPlacementMedia == null) {
|
|
120
|
+
try {
|
|
121
|
+
Log.i("TeadsFeedContainer", "Initializing Video placement widget with params: " + args.toString());
|
|
122
|
+
this.pid = args.getString("pid");
|
|
123
|
+
this.widgetRandomId = args.getInt("widgetRandomId");
|
|
124
|
+
String articleUrlString = args.getString("articleUrl");
|
|
125
|
+
this.articleUrl = Uri.parse(articleUrlString);
|
|
126
|
+
String installationKey = args.getString("partnerKey");
|
|
127
|
+
String RN_packageVersion = args.getString("packageVersion");
|
|
128
|
+
|
|
129
|
+
// TeadsSDK.INSTANCE.setTestMode(true);
|
|
130
|
+
TeadsSDK.INSTANCE.setWrapperFrameworkInfo(WrapperFrameworkInfo.reactNative(RN_packageVersion));
|
|
131
|
+
|
|
132
|
+
TeadsAdPlacementMediaConfig mediaConfig = new TeadsAdPlacementMediaConfig(
|
|
133
|
+
Integer.parseInt(this.pid), // test video ad placement ID
|
|
134
|
+
this.articleUrl,
|
|
135
|
+
false
|
|
136
|
+
);
|
|
137
|
+
teadsAdPlacementMedia = new TeadsAdPlacementMedia(context, mediaConfig, this);
|
|
138
|
+
this.widgetLayout = teadsAdPlacementMedia.loadAd();
|
|
139
|
+
commonSetupLayout();
|
|
140
|
+
} catch (Exception e) {
|
|
141
|
+
Log.e("TeadsFeedContainer", "Exception in initializeTeadsVideoPlacement: " + e.getLocalizedMessage());
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private void commonSetupLayout() {
|
|
147
|
+
this.widgetLayout.setLayoutParams(new ViewGroup.LayoutParams(
|
|
148
|
+
LayoutParams.MATCH_PARENT,
|
|
149
|
+
ViewGroup.LayoutParams.WRAP_CONTENT
|
|
150
|
+
));
|
|
151
|
+
|
|
152
|
+
post(() -> {
|
|
153
|
+
addView(this.widgetLayout);
|
|
154
|
+
this.widgetLayout.requestLayout();
|
|
155
|
+
requestLayout();
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
private void initTeadsSDK(String installationKey) {
|
|
160
|
+
try {
|
|
161
|
+
TeadsSDK.INSTANCE.configure(this.context.getApplicationContext(), installationKey);
|
|
162
|
+
if (BuildConfig.DEBUG) {
|
|
163
|
+
TeadsSDK.INSTANCE.setTestMode(true);
|
|
164
|
+
}
|
|
165
|
+
} catch (Exception e) {
|
|
166
|
+
Log.e("TeadsFeedContainer", "Error configuring TeadsSDK: " + e.getMessage());
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
public void emitEvent(String eventName, ReadableMap params) {
|
|
171
|
+
context.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
|
|
172
|
+
.emit(eventName, params);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
@Override
|
|
176
|
+
protected void onLayout(boolean changed, int l, int t, int r, int b) {
|
|
177
|
+
// Layout the child view
|
|
178
|
+
if (this.widgetLayout != null) {
|
|
179
|
+
this.widgetLayout.layout(0, 0, getWidth(), getHeight());
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
@Override
|
|
184
|
+
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
185
|
+
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
|
186
|
+
if (this.widgetLayout != null) {
|
|
187
|
+
this.widgetLayout.measure(widthMeasureSpec, heightMeasureSpec);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
@Override
|
|
192
|
+
public void requestLayout() {
|
|
193
|
+
super.requestLayout();
|
|
194
|
+
post(() -> {
|
|
195
|
+
measure(
|
|
196
|
+
MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
|
|
197
|
+
MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY)
|
|
198
|
+
);
|
|
199
|
+
layout(getLeft(), getTop(), getRight(), getBottom());
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
public void toggleDarkMode(boolean darkMode) {
|
|
204
|
+
if (this.teadsAdPlacementFeed != null) {
|
|
205
|
+
this.teadsAdPlacementFeed.toggleDarkMode(darkMode);
|
|
206
|
+
} else {
|
|
207
|
+
Log.w("TeadsFeedContainer", "Widget is not initialized, cannot toggle dark mode");
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
public WritableMap getInitParams() {
|
|
212
|
+
return initParams;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Clean up resources when the view is detached from the window
|
|
217
|
+
*/
|
|
218
|
+
@Override
|
|
219
|
+
protected void onDetachedFromWindow() {
|
|
220
|
+
super.onDetachedFromWindow();
|
|
221
|
+
Log.d("TeadsFeedContainer", "onDetachedFromWindow() - widgetRandomId: " + widgetRandomId);
|
|
222
|
+
// Don't cleanup here - cleanup is handled by ViewManager.onDropViewInstance()
|
|
223
|
+
// when React actually unmounts the component. Cleaning up here causes the feed
|
|
224
|
+
// to go blank when navigating away and back (the view is detached but not unmounted).
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
@Override
|
|
228
|
+
protected void onWindowVisibilityChanged(int visibility) {
|
|
229
|
+
super.onWindowVisibilityChanged(visibility);
|
|
230
|
+
// When the window becomes invisible (GONE or INVISIBLE), the SDK should stop visibility checks
|
|
231
|
+
Log.d("TeadsFeedContainer", "onWindowVisibilityChanged() - visibility: " + visibility + ", widgetRandomId: " + widgetRandomId);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
@Override
|
|
236
|
+
protected void onAttachedToWindow() {
|
|
237
|
+
super.onAttachedToWindow();
|
|
238
|
+
Log.d("TeadsFeedContainer", "onAttachedToWindow() - widgetRandomId: " + widgetRandomId);
|
|
239
|
+
if (widgetLayout != null) {
|
|
240
|
+
widgetLayout.requestLayout();
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Clean up TeadsSDK placements and resources
|
|
246
|
+
*/
|
|
247
|
+
public void cleanup() {
|
|
248
|
+
Log.d("TeadsFeedContainer", "cleanup() called - widgetRandomId: " + widgetRandomId);
|
|
249
|
+
isCleanedUp = true;
|
|
250
|
+
|
|
251
|
+
// Clean up SDK placements first (this stops internal polling/visibility tracking)
|
|
252
|
+
if (teadsAdPlacementMedia != null) {
|
|
253
|
+
teadsAdPlacementMedia.clean();
|
|
254
|
+
teadsAdPlacementMedia = null;
|
|
255
|
+
}
|
|
256
|
+
if (teadsAdPlacementFeed != null) {
|
|
257
|
+
// TeadsAdPlacementFeed doesn't have a clean() method
|
|
258
|
+
teadsAdPlacementFeed = null;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Remove the widget layout to break SDK's internal references
|
|
262
|
+
if (widgetLayout != null) {
|
|
263
|
+
widgetLayout.removeAllViews();
|
|
264
|
+
removeView(widgetLayout);
|
|
265
|
+
widgetLayout = null;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Remove all child views from this container
|
|
269
|
+
removeAllViews();
|
|
270
|
+
|
|
271
|
+
widgetRandomId = -1;
|
|
272
|
+
widgetId = null;
|
|
273
|
+
pid = null;
|
|
274
|
+
articleUrl = null;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
@Override
|
|
278
|
+
public void onPlacementEvent(@NonNull TeadsAdPlacement<?, ?> teadsAdPlacement, @NonNull TeadsAdPlacementEventName teadsAdPlacementEventName, @Nullable Map<String, ?> map) {
|
|
279
|
+
// Guard against events after cleanup
|
|
280
|
+
if (isCleanedUp) {
|
|
281
|
+
Log.d("TeadsFeedContainer", "Ignoring event after cleanup: " + teadsAdPlacementEventName.name());
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (teadsAdPlacementEventName == TeadsAdPlacementEventName.CLICKED) {
|
|
285
|
+
Log.d("TeadsFeedContainer", "Teads Ad Placement Clicked - widgetId: " + widgetId);
|
|
286
|
+
WritableMap params = Arguments.createMap();
|
|
287
|
+
String url = map != null && map.get("url") instanceof String ? (String) map.get("url") : "";
|
|
288
|
+
emitClickEvent("onRecClick", url);
|
|
289
|
+
} else if (teadsAdPlacementEventName == TeadsAdPlacementEventName.CLICKED_ORGANIC) {
|
|
290
|
+
Log.d("TeadsFeedContainer", "Teads Ad Placement Clicked Organic - widgetId: " + widgetId);
|
|
291
|
+
WritableMap params = Arguments.createMap();
|
|
292
|
+
String url = map != null && map.get("url") instanceof String ? (String) map.get("url") : "";
|
|
293
|
+
// prepare JS parameters to send with the event
|
|
294
|
+
emitClickEvent("onOrganicClick", url);
|
|
295
|
+
} else if (teadsAdPlacementEventName == TeadsAdPlacementEventName.HEIGHT_UPDATED) {
|
|
296
|
+
Log.d("TeadsFeedContainer", "Teads Ad Placement Height Updated; map: " + (map != null ? map.toString() : "null"));
|
|
297
|
+
int newHeight = 0;
|
|
298
|
+
if (map != null && map.get("adRatio") instanceof AdRatio) {
|
|
299
|
+
AdRatio adRatio = (AdRatio) map.get("adRatio");
|
|
300
|
+
int widthDP = (int)(this.widgetLayout.getWidth() / getResources().getDisplayMetrics().density);
|
|
301
|
+
newHeight = adRatio.calculateHeight(widthDP);
|
|
302
|
+
Log.d("TeadsFeedContainer", "Teads Ad Placement Height Updated - ad ratio: calculateHeight: " + newHeight + ", width: " + widthDP + ", widgetId: " + widgetId);
|
|
303
|
+
}
|
|
304
|
+
if (map != null && map.get("height") instanceof Integer) {
|
|
305
|
+
newHeight = (Integer) map.get("height");
|
|
306
|
+
Log.d("TeadsFeedContainer", "Teads Ad Placement Height Updated - new height: " + newHeight + ", widgetId: " + widgetId);
|
|
307
|
+
}
|
|
308
|
+
if (newHeight > 0) {
|
|
309
|
+
WritableMap params = Arguments.createMap();
|
|
310
|
+
params.putString("widgetId", widgetId);
|
|
311
|
+
params.putInt("widgetRandomId", widgetRandomId);
|
|
312
|
+
params.putInt("height", newHeight);
|
|
313
|
+
emitEvent("didChangeHeight", params);
|
|
314
|
+
}
|
|
315
|
+
} else {
|
|
316
|
+
Log.d("TeadsFeedContainer", "Teads Ad Placement Event: " + teadsAdPlacementEventName.name() + ", params: " + (map != null ? map.toString() : "null"));
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
private void emitClickEvent(String eventName, String clickUrl) {
|
|
322
|
+
WritableMap params = Arguments.createMap();
|
|
323
|
+
params.putString("widgetId", widgetId);
|
|
324
|
+
params.putInt("widgetRandomId", widgetRandomId);
|
|
325
|
+
params.putString("url", clickUrl);
|
|
326
|
+
emitEvent(eventName, params);
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|