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.
Files changed (177) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +93 -0
  3. package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeRNGestureHandlerModuleSpec.java +66 -0
  4. package/android/app/build/generated/source/codegen/java/com/facebook/fbreact/specs/NativeSafeAreaContextSpec.java +65 -0
  5. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerDelegate.java +26 -0
  6. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaProviderManagerInterface.java +17 -0
  7. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerDelegate.java +36 -0
  8. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNCSafeAreaViewManagerInterface.java +20 -0
  9. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerDelegate.java +60 -0
  10. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNGestureHandlerButtonManagerInterface.java +27 -0
  11. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerDelegate.java +26 -0
  12. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/RNGestureHandlerRootViewManagerInterface.java +17 -0
  13. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TeadsAdPlacementFeedManagerDelegate.java +62 -0
  14. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TeadsAdPlacementFeedManagerInterface.java +28 -0
  15. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TeadsAdPlacementMediaManagerDelegate.java +44 -0
  16. package/android/app/build/generated/source/codegen/java/com/facebook/react/viewmanagers/TeadsAdPlacementMediaManagerInterface.java +22 -0
  17. package/android/app/build/generated/source/codegen/jni/CMakeLists.txt +36 -0
  18. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ComponentDescriptors.cpp +23 -0
  19. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ComponentDescriptors.h +25 -0
  20. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/EventEmitters.cpp +17 -0
  21. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/EventEmitters.h +30 -0
  22. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/Props.cpp +46 -0
  23. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/Props.h +51 -0
  24. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ShadowNodes.cpp +18 -0
  25. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ShadowNodes.h +43 -0
  26. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/States.cpp +16 -0
  27. package/android/app/build/generated/source/codegen/jni/react/renderer/components/RNTeadsReactNativeViewSpec/States.h +41 -0
  28. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/ComponentDescriptors.cpp +23 -0
  29. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/ComponentDescriptors.h +25 -0
  30. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/EventEmitters.cpp +17 -0
  31. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/EventEmitters.h +30 -0
  32. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/Props.cpp +41 -0
  33. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/Props.h +47 -0
  34. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/ShadowNodes.cpp +18 -0
  35. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/ShadowNodes.h +43 -0
  36. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/States.cpp +16 -0
  37. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/States.h +41 -0
  38. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/rngesturehandler_codegenJSI-generated.cpp +86 -0
  39. package/android/app/build/generated/source/codegen/jni/react/renderer/components/rngesturehandler_codegen/rngesturehandler_codegenJSI.h +134 -0
  40. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ComponentDescriptors.cpp +22 -0
  41. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ComponentDescriptors.h +24 -0
  42. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/EventEmitters.cpp +40 -0
  43. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/EventEmitters.h +47 -0
  44. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/Props.cpp +33 -0
  45. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/Props.h +85 -0
  46. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ShadowNodes.cpp +17 -0
  47. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/ShadowNodes.h +32 -0
  48. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/States.cpp +16 -0
  49. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/States.h +29 -0
  50. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/safeareacontextJSI-generated.cpp +26 -0
  51. package/android/app/build/generated/source/codegen/jni/react/renderer/components/safeareacontext/safeareacontextJSI.h +71 -0
  52. package/android/app/build/generated/source/codegen/jni/rngesturehandler_codegen-generated.cpp +74 -0
  53. package/android/app/build/generated/source/codegen/jni/rngesturehandler_codegen.h +31 -0
  54. package/android/app/build/generated/source/codegen/jni/safeareacontext-generated.cpp +32 -0
  55. package/android/app/build/generated/source/codegen/jni/safeareacontext.h +31 -0
  56. package/android/build.gradle +107 -0
  57. package/android/generated/java/com/facebook/react/viewmanagers/TeadsAdPlacementFeedManagerDelegate.java +62 -0
  58. package/android/generated/java/com/facebook/react/viewmanagers/TeadsAdPlacementFeedManagerInterface.java +28 -0
  59. package/android/generated/java/com/facebook/react/viewmanagers/TeadsAdPlacementMediaManagerDelegate.java +44 -0
  60. package/android/generated/java/com/facebook/react/viewmanagers/TeadsAdPlacementMediaManagerInterface.java +22 -0
  61. package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ComponentDescriptors.cpp +23 -0
  62. package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ComponentDescriptors.h +25 -0
  63. package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/EventEmitters.cpp +17 -0
  64. package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/EventEmitters.h +30 -0
  65. package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/Props.cpp +46 -0
  66. package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/Props.h +51 -0
  67. package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ShadowNodes.cpp +18 -0
  68. package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/ShadowNodes.h +43 -0
  69. package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/States.cpp +16 -0
  70. package/android/generated/jni/react/renderer/components/RNTeadsReactNativeViewSpec/States.h +41 -0
  71. package/android/gradle.properties +5 -0
  72. package/android/src/main/AndroidManifest.xml +3 -0
  73. package/android/src/main/AndroidManifestNew.xml +2 -0
  74. package/android/src/main/java/tv/teads/reactnative/SFWidgetContainer.java +19 -0
  75. package/android/src/main/java/tv/teads/reactnative/TeadsAdPlacementFeedManager.java +109 -0
  76. package/android/src/main/java/tv/teads/reactnative/TeadsFeedPackage.java +26 -0
  77. package/android/src/main/java/tv/teads/reactnative/TeadsMediaPlacementManager.java +76 -0
  78. package/android/src/main/java/tv/teads/reactnative/TeadsPlacementContainer.java +329 -0
  79. package/android/src/main/java/tv/teads/reactnative/Utils.java +65 -0
  80. package/android/src/main/jni/CMakeLists.txt +44 -0
  81. package/ios/RCTTeadsAdPlacementFeed.h +22 -0
  82. package/ios/RCTTeadsAdPlacementFeed.mm +114 -0
  83. package/ios/RCTTeadsAdPlacementMedia.h +23 -0
  84. package/ios/RCTTeadsAdPlacementMedia.mm +91 -0
  85. package/ios/TeadsAdContainer.swift +212 -0
  86. package/ios/TeadsEventModule.h +16 -0
  87. package/ios/TeadsEventModule.mm +52 -0
  88. package/ios/TeadsReactNative.h +8 -0
  89. package/lib/commonjs/DefaultTeadsWidgetHandler.js +21 -0
  90. package/lib/commonjs/DefaultTeadsWidgetHandler.js.map +1 -0
  91. package/lib/commonjs/TeadsAdPlacementFeed.js +131 -0
  92. package/lib/commonjs/TeadsAdPlacementFeed.js.map +1 -0
  93. package/lib/commonjs/TeadsAdPlacementMedia.js +115 -0
  94. package/lib/commonjs/TeadsAdPlacementMedia.js.map +1 -0
  95. package/lib/commonjs/TeadsInAppBrowser.js +48 -0
  96. package/lib/commonjs/TeadsInAppBrowser.js.map +1 -0
  97. package/lib/commonjs/TeadsMediaNativeComponent.ts +15 -0
  98. package/lib/commonjs/WebViewNativeComponent.ts +21 -0
  99. package/lib/commonjs/constants.js +9 -0
  100. package/lib/commonjs/constants.js.map +1 -0
  101. package/lib/commonjs/index.js +20 -0
  102. package/lib/commonjs/index.js.map +1 -0
  103. package/lib/commonjs/package.json +1 -0
  104. package/lib/commonjs/types.d.js +2 -0
  105. package/lib/commonjs/types.d.js.map +1 -0
  106. package/lib/commonjs/version.js +8 -0
  107. package/lib/commonjs/version.js.map +1 -0
  108. package/lib/module/DefaultTeadsWidgetHandler.js +17 -0
  109. package/lib/module/DefaultTeadsWidgetHandler.js.map +1 -0
  110. package/lib/module/TeadsAdPlacementFeed.js +126 -0
  111. package/lib/module/TeadsAdPlacementFeed.js.map +1 -0
  112. package/lib/module/TeadsAdPlacementMedia.js +110 -0
  113. package/lib/module/TeadsAdPlacementMedia.js.map +1 -0
  114. package/lib/module/TeadsInAppBrowser.js +44 -0
  115. package/lib/module/TeadsInAppBrowser.js.map +1 -0
  116. package/lib/module/TeadsMediaNativeComponent.ts +15 -0
  117. package/lib/module/WebViewNativeComponent.ts +21 -0
  118. package/lib/module/constants.js +5 -0
  119. package/lib/module/constants.js.map +1 -0
  120. package/lib/module/index.js +5 -0
  121. package/lib/module/index.js.map +1 -0
  122. package/lib/module/package.json +1 -0
  123. package/lib/module/types.d.js +2 -0
  124. package/lib/module/types.d.js.map +1 -0
  125. package/lib/module/version.js +4 -0
  126. package/lib/module/version.js.map +1 -0
  127. package/lib/typescript/commonjs/package.json +1 -0
  128. package/lib/typescript/commonjs/src/DefaultTeadsWidgetHandler.d.ts +4 -0
  129. package/lib/typescript/commonjs/src/DefaultTeadsWidgetHandler.d.ts.map +1 -0
  130. package/lib/typescript/commonjs/src/TeadsAdPlacementFeed.d.ts +3 -0
  131. package/lib/typescript/commonjs/src/TeadsAdPlacementFeed.d.ts.map +1 -0
  132. package/lib/typescript/commonjs/src/TeadsAdPlacementMedia.d.ts +3 -0
  133. package/lib/typescript/commonjs/src/TeadsAdPlacementMedia.d.ts.map +1 -0
  134. package/lib/typescript/commonjs/src/TeadsInAppBrowser.d.ts +4 -0
  135. package/lib/typescript/commonjs/src/TeadsInAppBrowser.d.ts.map +1 -0
  136. package/lib/typescript/commonjs/src/TeadsMediaNativeComponent.d.ts +12 -0
  137. package/lib/typescript/commonjs/src/TeadsMediaNativeComponent.d.ts.map +1 -0
  138. package/lib/typescript/commonjs/src/WebViewNativeComponent.d.ts +18 -0
  139. package/lib/typescript/commonjs/src/WebViewNativeComponent.d.ts.map +1 -0
  140. package/lib/typescript/commonjs/src/constants.d.ts +3 -0
  141. package/lib/typescript/commonjs/src/constants.d.ts.map +1 -0
  142. package/lib/typescript/commonjs/src/index.d.ts +4 -0
  143. package/lib/typescript/commonjs/src/index.d.ts.map +1 -0
  144. package/lib/typescript/commonjs/src/version.d.ts +2 -0
  145. package/lib/typescript/commonjs/src/version.d.ts.map +1 -0
  146. package/lib/typescript/module/package.json +1 -0
  147. package/lib/typescript/module/src/DefaultTeadsWidgetHandler.d.ts +4 -0
  148. package/lib/typescript/module/src/DefaultTeadsWidgetHandler.d.ts.map +1 -0
  149. package/lib/typescript/module/src/TeadsAdPlacementFeed.d.ts +3 -0
  150. package/lib/typescript/module/src/TeadsAdPlacementFeed.d.ts.map +1 -0
  151. package/lib/typescript/module/src/TeadsAdPlacementMedia.d.ts +3 -0
  152. package/lib/typescript/module/src/TeadsAdPlacementMedia.d.ts.map +1 -0
  153. package/lib/typescript/module/src/TeadsInAppBrowser.d.ts +4 -0
  154. package/lib/typescript/module/src/TeadsInAppBrowser.d.ts.map +1 -0
  155. package/lib/typescript/module/src/TeadsMediaNativeComponent.d.ts +12 -0
  156. package/lib/typescript/module/src/TeadsMediaNativeComponent.d.ts.map +1 -0
  157. package/lib/typescript/module/src/WebViewNativeComponent.d.ts +18 -0
  158. package/lib/typescript/module/src/WebViewNativeComponent.d.ts.map +1 -0
  159. package/lib/typescript/module/src/constants.d.ts +3 -0
  160. package/lib/typescript/module/src/constants.d.ts.map +1 -0
  161. package/lib/typescript/module/src/index.d.ts +4 -0
  162. package/lib/typescript/module/src/index.d.ts.map +1 -0
  163. package/lib/typescript/module/src/version.d.ts +2 -0
  164. package/lib/typescript/module/src/version.d.ts.map +1 -0
  165. package/package.json +232 -0
  166. package/react-native.config.js +17 -0
  167. package/src/DefaultTeadsWidgetHandler.ts +17 -0
  168. package/src/TeadsAdPlacementFeed.tsx +142 -0
  169. package/src/TeadsAdPlacementMedia.tsx +127 -0
  170. package/src/TeadsInAppBrowser.ts +42 -0
  171. package/src/TeadsMediaNativeComponent.ts +15 -0
  172. package/src/WebViewNativeComponent.ts +21 -0
  173. package/src/constants.ts +11 -0
  174. package/src/index.tsx +9 -0
  175. package/src/types.d.ts +32 -0
  176. package/src/version.ts +1 -0
  177. package/teads-react-native.podspec +40 -0
@@ -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,5 @@
1
+ TeadsReactNative_kotlinVersion=2.0.21
2
+ TeadsReactNative_minSdkVersion=24
3
+ TeadsReactNative_targetSdkVersion=35
4
+ TeadsReactNative_compileSdkVersion=35
5
+ TeadsReactNative_ndkversion=27.1.12297006
@@ -0,0 +1,3 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+ package="tv.teads.reactnative">
3
+ </manifest>
@@ -0,0 +1,2 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+ </manifest>
@@ -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
+