react-native-firework-sdk 2.12.1 → 2.14.0

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 (117) hide show
  1. package/android/.idea/codeStyles/Project.xml +124 -0
  2. package/android/.idea/codeStyles/codeStyleConfig.xml +5 -0
  3. package/android/build.gradle +3 -2
  4. package/android/gradle.properties +4 -3
  5. package/android/src/main/AndroidManifest.xml +14 -0
  6. package/android/src/main/java/com/fireworksdk/bridge/FWInitializationProvider.kt +4 -0
  7. package/android/src/main/java/com/fireworksdk/bridge/components/storyblock/StoryBlockFragment.kt +1 -2
  8. package/android/src/main/java/com/fireworksdk/bridge/models/FWLiveStreamEventDetailsModel.kt +1 -0
  9. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedConfigModel.kt +1 -0
  10. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedConfigModelDeserializer.kt +3 -0
  11. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoFeedConfigModelSerializer.kt +2 -0
  12. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerLogoConfigurationModel.kt +1 -0
  13. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerLogoConfigurationModelDeserializer.kt +3 -0
  14. package/android/src/main/java/com/fireworksdk/bridge/models/FWVideoPlayerLogoConfigurationModelSerializer.kt +2 -0
  15. package/android/src/main/java/com/fireworksdk/bridge/models/enums/FWDataTrackingLevel.kt +7 -0
  16. package/android/src/main/java/com/fireworksdk/bridge/models/enums/FWEventName.kt +2 -1
  17. package/android/src/main/java/com/fireworksdk/bridge/models/enums/FWSwitchLanguageBehavior.kt +6 -0
  18. package/android/src/main/java/com/fireworksdk/bridge/reactnative/FWReactNativeSDK.kt +19 -7
  19. package/android/src/main/java/com/fireworksdk/bridge/reactnative/models/FWNavigatorInterface.kt +2 -0
  20. package/android/src/main/java/com/fireworksdk/bridge/reactnative/models/FireworkSDKInterface.kt +1 -0
  21. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWLiveStreamModule.kt +6 -4
  22. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWNavigatorModule.kt +26 -0
  23. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FWVideoShoppingModule.kt +29 -19
  24. package/android/src/main/java/com/fireworksdk/bridge/reactnative/module/FireworkSDKModule.kt +43 -19
  25. package/android/src/main/java/com/fireworksdk/bridge/reactnative/utils/FWEventUtils.kt +25 -13
  26. package/android/src/main/java/com/fireworksdk/bridge/utils/FWConfigUtil.kt +25 -2
  27. package/android/src/main/java/com/fireworksdk/bridge/utils/FWGlobalDataUtil.kt +5 -0
  28. package/android/src/main/java/com/fireworksdk/bridge/utils/FWLanguageUtil.kt +57 -15
  29. package/android/src/main/java/com/fireworksdk/bridge/utils/FWModelUtils.kt +16 -8
  30. package/ios/Components/StoryBlock.swift +5 -8
  31. package/ios/Components/VideoFeed.swift +1 -5
  32. package/ios/FireworkSdk.xcodeproj/project.pbxproj +4 -0
  33. package/ios/Models/NativeToRN/FireworkEventName.swift +1 -0
  34. package/ios/Models/NativeToRN/FireworkSDK+Json.swift +6 -2
  35. package/ios/Models/RNToNative/RCTConvert+FireworkSDKModule.swift +13 -0
  36. package/ios/Modules/FireworkSDKModule/FireworkSDKModule+CTA.swift +8 -16
  37. package/ios/Modules/FireworkSDKModule/FireworkSDKModule+EventTracking.swift +9 -1
  38. package/ios/Modules/FireworkSDKModule/FireworkSDKModule.m +1 -0
  39. package/ios/Modules/FireworkSDKModule/FireworkSDKModule.swift +96 -31
  40. package/ios/Modules/Shopping/ShoppingModule.swift +12 -3
  41. package/ios/Utils/Extensions/NumberFormatter+AppLanguage.swift +27 -0
  42. package/lib/commonjs/FireworkSDK.js +66 -12
  43. package/lib/commonjs/FireworkSDK.js.map +1 -1
  44. package/lib/commonjs/VideoShopping.js +15 -0
  45. package/lib/commonjs/VideoShopping.js.map +1 -1
  46. package/lib/commonjs/components/StoryBlock.js +6 -0
  47. package/lib/commonjs/components/StoryBlock.js.map +1 -1
  48. package/lib/commonjs/components/VideoFeed.js +29 -12
  49. package/lib/commonjs/components/VideoFeed.js.map +1 -1
  50. package/lib/commonjs/index.js +14 -6
  51. package/lib/commonjs/index.js.map +1 -1
  52. package/lib/commonjs/models/DataTrackingLevel.js +2 -0
  53. package/lib/commonjs/models/DataTrackingLevel.js.map +1 -0
  54. package/lib/commonjs/models/FWComponentType.js +14 -0
  55. package/lib/commonjs/models/FWComponentType.js.map +1 -0
  56. package/lib/commonjs/models/FWEventName.js +1 -0
  57. package/lib/commonjs/models/FWEventName.js.map +1 -1
  58. package/lib/commonjs/models/VideoPlayerLivestreamCountdownTimerTheme.js +2 -0
  59. package/lib/commonjs/models/VideoPlayerLivestreamCountdownTimerTheme.js.map +1 -0
  60. package/lib/commonjs/modules/FireworkSDKModule.js.map +1 -1
  61. package/lib/commonjs/utils/FWGlobalState.js +2 -0
  62. package/lib/commonjs/utils/FWGlobalState.js.map +1 -1
  63. package/lib/module/FireworkSDK.js +64 -11
  64. package/lib/module/FireworkSDK.js.map +1 -1
  65. package/lib/module/VideoShopping.js +15 -0
  66. package/lib/module/VideoShopping.js.map +1 -1
  67. package/lib/module/components/StoryBlock.js +5 -0
  68. package/lib/module/components/StoryBlock.js.map +1 -1
  69. package/lib/module/components/VideoFeed.js +28 -11
  70. package/lib/module/components/VideoFeed.js.map +1 -1
  71. package/lib/module/index.js +6 -5
  72. package/lib/module/index.js.map +1 -1
  73. package/lib/module/models/DataTrackingLevel.js +2 -0
  74. package/lib/module/models/DataTrackingLevel.js.map +1 -0
  75. package/lib/module/models/FWComponentType.js +7 -0
  76. package/lib/module/models/FWComponentType.js.map +1 -0
  77. package/lib/module/models/FWEventName.js +1 -0
  78. package/lib/module/models/FWEventName.js.map +1 -1
  79. package/lib/module/models/VideoPlayerLivestreamCountdownTimerTheme.js +2 -0
  80. package/lib/module/models/VideoPlayerLivestreamCountdownTimerTheme.js.map +1 -0
  81. package/lib/module/modules/FireworkSDKModule.js.map +1 -1
  82. package/lib/module/utils/FWGlobalState.js +2 -0
  83. package/lib/module/utils/FWGlobalState.js.map +1 -1
  84. package/lib/typescript/FireworkSDK.d.ts +22 -1
  85. package/lib/typescript/VideoShopping.d.ts +8 -1
  86. package/lib/typescript/index.d.ts +16 -13
  87. package/lib/typescript/models/DataTrackingLevel.d.ts +1 -0
  88. package/lib/typescript/models/FWComponentType.d.ts +4 -0
  89. package/lib/typescript/models/FWEventName.d.ts +2 -1
  90. package/lib/typescript/models/FWEvents.d.ts +18 -1
  91. package/lib/typescript/models/FeedItemDetails.d.ts +0 -1
  92. package/lib/typescript/models/LiveStreamEventDetails.d.ts +1 -0
  93. package/lib/typescript/models/ReplayBadgeConfiguration.d.ts +1 -1
  94. package/lib/typescript/models/StoryBlockConfiguration.d.ts +0 -2
  95. package/lib/typescript/models/VideoFeedConfiguration.d.ts +0 -1
  96. package/lib/typescript/models/VideoPlayerLivestreamCountdownTimerTheme.d.ts +1 -0
  97. package/lib/typescript/modules/FireworkSDKModule.d.ts +2 -0
  98. package/lib/typescript/utils/FWGlobalState.d.ts +2 -0
  99. package/package.json +1 -1
  100. package/react-native-firework-sdk.podspec +4 -3
  101. package/src/FireworkSDK.ts +59 -14
  102. package/src/VideoShopping.ts +24 -0
  103. package/src/components/StoryBlock.tsx +8 -0
  104. package/src/components/VideoFeed.tsx +24 -7
  105. package/src/index.ts +40 -30
  106. package/src/models/DataTrackingLevel.ts +1 -0
  107. package/src/models/FWComponentType.ts +4 -0
  108. package/src/models/FWEventName.ts +1 -0
  109. package/src/models/FWEvents.ts +19 -1
  110. package/src/models/FeedItemDetails.ts +0 -1
  111. package/src/models/LiveStreamEventDetails.ts +1 -0
  112. package/src/models/ReplayBadgeConfiguration.ts +1 -1
  113. package/src/models/StoryBlockConfiguration.ts +0 -2
  114. package/src/models/VideoFeedConfiguration.ts +0 -1
  115. package/src/models/VideoPlayerLivestreamCountdownTimerTheme.ts +1 -0
  116. package/src/modules/FireworkSDKModule.ts +2 -0
  117. package/src/utils/FWGlobalState.ts +3 -0
@@ -0,0 +1,124 @@
1
+ <component name="ProjectCodeStyleConfiguration">
2
+ <code_scheme name="Project" version="173">
3
+ <codeStyleSettings language="XML">
4
+ <option name="FORCE_REARRANGE_MODE" value="1" />
5
+ <indentOptions>
6
+ <option name="CONTINUATION_INDENT_SIZE" value="4" />
7
+ </indentOptions>
8
+ <arrangement>
9
+ <rules>
10
+ <section>
11
+ <rule>
12
+ <match>
13
+ <AND>
14
+ <NAME>xmlns:android</NAME>
15
+ <XML_ATTRIBUTE />
16
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
17
+ </AND>
18
+ </match>
19
+ </rule>
20
+ </section>
21
+ <section>
22
+ <rule>
23
+ <match>
24
+ <AND>
25
+ <NAME>xmlns:.*</NAME>
26
+ <XML_ATTRIBUTE />
27
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
28
+ </AND>
29
+ </match>
30
+ <order>BY_NAME</order>
31
+ </rule>
32
+ </section>
33
+ <section>
34
+ <rule>
35
+ <match>
36
+ <AND>
37
+ <NAME>.*:id</NAME>
38
+ <XML_ATTRIBUTE />
39
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
40
+ </AND>
41
+ </match>
42
+ </rule>
43
+ </section>
44
+ <section>
45
+ <rule>
46
+ <match>
47
+ <AND>
48
+ <NAME>.*:name</NAME>
49
+ <XML_ATTRIBUTE />
50
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
51
+ </AND>
52
+ </match>
53
+ </rule>
54
+ </section>
55
+ <section>
56
+ <rule>
57
+ <match>
58
+ <AND>
59
+ <NAME>name</NAME>
60
+ <XML_ATTRIBUTE />
61
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
62
+ </AND>
63
+ </match>
64
+ </rule>
65
+ </section>
66
+ <section>
67
+ <rule>
68
+ <match>
69
+ <AND>
70
+ <NAME>style</NAME>
71
+ <XML_ATTRIBUTE />
72
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
73
+ </AND>
74
+ </match>
75
+ </rule>
76
+ </section>
77
+ <section>
78
+ <rule>
79
+ <match>
80
+ <AND>
81
+ <NAME>.*</NAME>
82
+ <XML_ATTRIBUTE />
83
+ <XML_NAMESPACE>^$</XML_NAMESPACE>
84
+ </AND>
85
+ </match>
86
+ <order>BY_NAME</order>
87
+ </rule>
88
+ </section>
89
+ <section>
90
+ <rule>
91
+ <match>
92
+ <AND>
93
+ <NAME>.*</NAME>
94
+ <XML_ATTRIBUTE />
95
+ <XML_NAMESPACE>http://schemas.android.com/apk/res/android</XML_NAMESPACE>
96
+ </AND>
97
+ </match>
98
+ <order>ANDROID_ATTRIBUTE_ORDER</order>
99
+ </rule>
100
+ </section>
101
+ <section>
102
+ <rule>
103
+ <match>
104
+ <AND>
105
+ <NAME>.*</NAME>
106
+ <XML_ATTRIBUTE />
107
+ <XML_NAMESPACE>.*</XML_NAMESPACE>
108
+ </AND>
109
+ </match>
110
+ <order>BY_NAME</order>
111
+ </rule>
112
+ </section>
113
+ </rules>
114
+ </arrangement>
115
+ </codeStyleSettings>
116
+ <codeStyleSettings language="kotlin">
117
+ <indentOptions>
118
+ <option name="INDENT_SIZE" value="2" />
119
+ <option name="CONTINUATION_INDENT_SIZE" value="2" />
120
+ <option name="TAB_SIZE" value="2" />
121
+ </indentOptions>
122
+ </codeStyleSettings>
123
+ </code_scheme>
124
+ </component>
@@ -0,0 +1,5 @@
1
+ <component name="ProjectCodeStyleConfiguration">
2
+ <state>
3
+ <option name="USE_PER_PROJECT_SETTINGS" value="true" />
4
+ </state>
5
+ </component>
@@ -5,7 +5,6 @@ buildscript {
5
5
  repositories {
6
6
  google()
7
7
  mavenCentral()
8
- mavenLocal()
9
8
  }
10
9
 
11
10
  dependencies {
@@ -35,6 +34,7 @@ android {
35
34
  defaultConfig {
36
35
  minSdkVersion getExtOrIntegerDefault('minSdkVersion')
37
36
  targetSdkVersion getExtOrIntegerDefault('targetSdkVersion')
37
+ manifestPlaceholders["fw_player_launch_mode"] = getExtOrDefault('fwPlayerLaunchMode')
38
38
  }
39
39
 
40
40
  // LOG_LEVEL: VERBOSE(2), DEBUG(3), INFO(4), WARN(5), ERROR(6), ASSERT(7)
@@ -61,9 +61,9 @@ android {
61
61
  }
62
62
 
63
63
  repositories {
64
+ mavenLocal()
64
65
  mavenCentral()
65
66
  google()
66
- mavenLocal()
67
67
 
68
68
  maven {
69
69
  setUrl("https://s01.oss.sonatype.org/content/repositories/snapshots/")
@@ -144,5 +144,6 @@ dependencies {
144
144
  def fireworkSdkVersion = getExtOrDefault('fwNativeVersion')
145
145
  implementation "com.firework:sdk:$fireworkSdkVersion"
146
146
  implementation "com.firework.feature:uiKit:$fireworkSdkVersion"
147
+ implementation "com.firework.feature.player:pager:$fireworkSdkVersion"
147
148
  }
148
149
 
@@ -1,8 +1,9 @@
1
- android.useAndroidX=true
2
1
  android.enableJetifier=true
2
+ android.useAndroidX=true
3
3
  org.gradle.jvmargs=-Xmx1536M
4
- FireworkSDK_kotlinVersion=1.6.10
4
+ FireworkSDK_kotlinVersion=1.8.22
5
5
  FireworkSDK_minSdkVersion=21
6
6
  FireworkSDK_compileSdkVersion=33
7
7
  FireworkSDK_targetSdkVersion=33
8
- FireworkSDK_fwNativeVersion=6.9.3
8
+ FireworkSDK_fwPlayerLaunchMode=singleTask
9
+ FireworkSDK_fwNativeVersion=6.11.0
@@ -1,4 +1,5 @@
1
1
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
+ xmlns:tools="http://schemas.android.com/tools"
2
3
  package="com.fireworksdk.bridge">
3
4
 
4
5
  <uses-permission android:name="android.permission.INTERNET" />
@@ -23,6 +24,19 @@
23
24
  android:name="Firework:RecyclerViewRequestLayoutEnable"
24
25
  android:value="true" />
25
26
 
27
+ <activity
28
+ android:name="com.firework.player.pager.PlayerActivity"
29
+ android:autoRemoveFromRecents="true"
30
+ android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
31
+ android:exported="true"
32
+ android:launchMode="${fw_player_launch_mode}"
33
+ android:screenOrientation="portrait"
34
+ android:supportsPictureInPicture="true"
35
+ android:theme="@style/FwPlayerPagerPlayerActivity"
36
+ android:windowSoftInputMode="adjustPan"
37
+ tools:replace="android:launchMode"
38
+ tools:targetApi="n" />
39
+
26
40
  </application>
27
41
 
28
42
  </manifest>
@@ -14,6 +14,7 @@ class FWInitializationProvider: ContentProvider() {
14
14
 
15
15
  var application: Application? = null
16
16
  var resumedActivity by weakProperty<Activity?>()
17
+ var mainActivity by weakProperty<Activity?>()
17
18
 
18
19
  override fun onCreate(): Boolean {
19
20
  sInstance = this
@@ -36,6 +37,9 @@ class FWInitializationProvider: ContentProvider() {
36
37
 
37
38
  override fun onActivityResumed(activity: Activity) {
38
39
  resumedActivity = activity
40
+ if (mainActivity == null) { // only set once
41
+ mainActivity = activity
42
+ }
39
43
  }
40
44
 
41
45
  override fun onActivityPaused(activity: Activity) {
@@ -119,8 +119,7 @@ class StoryBlockFragment : FWBaseFragment() {
119
119
  childFragmentManager,
120
120
  viewLifecycleOwner,
121
121
  viewOptionsBuilder.build(),
122
- FWGlobalDataUtil.pauseWhenNotVisible,
123
- videoFeedPropsModel?.videoPlayerConfiguration?.countdownTimerConfiguration?.isHidden == false
122
+ FWGlobalDataUtil.pauseWhenNotVisible
124
123
  )
125
124
  isStoryBlockInitializer = true
126
125
 
@@ -2,4 +2,5 @@ package com.fireworksdk.bridge.models
2
2
 
3
3
  data class FWLiveStreamEventDetailsModel(
4
4
  val id: String? = null,
5
+ val feedId: String? = null,
5
6
  )
@@ -18,6 +18,7 @@ data class FWVideoFeedConfigModel(
18
18
  val hidden: Boolean? = null,
19
19
  val textColor: String? = null,
20
20
  val fontSize: Int? = null,
21
+ val numberOfLines: Int? = null,
21
22
  val fontInfo: FWFontInfoModel? = null,
22
23
  val backgroundColor: String? = null,
23
24
  val gradientDrawable: FWGradientDrawableModel? = null,
@@ -18,6 +18,7 @@ object FWVideoFeedConfigModelDeserializer {
18
18
  private const val HIDDEN_KEY = "hidden"
19
19
  private const val TEXT_COLOR_KEY = "textColor"
20
20
  private const val FONT_SIZE_KEY = "fontSize"
21
+ private const val NUMBER_OF_LINES = "numberOfLines"
21
22
  private const val FONT_INFO_KEY = "androidFontInfo"
22
23
  private const val GRADIENT_DRAWABLE_KEY = "gradientDrawable"
23
24
 
@@ -55,6 +56,7 @@ object FWVideoFeedConfigModelDeserializer {
55
56
  val hidden = if (titleJson.has(HIDDEN_KEY)) titleJson.optBoolean(HIDDEN_KEY) else null
56
57
  val textColor = if (titleJson.has(TEXT_COLOR_KEY)) titleJson.optString(TEXT_COLOR_KEY) else null
57
58
  val fontSize = if (titleJson.has(FONT_SIZE_KEY)) titleJson.optInt(FONT_SIZE_KEY) else null
59
+ val numberOfLines = if (titleJson.has(NUMBER_OF_LINES)) titleJson.optInt(NUMBER_OF_LINES) else null
58
60
  val fontInfo = FWFontInfoModelDeserializer.deserialize(titleJson.optJSONObject(FONT_INFO_KEY))
59
61
  val backgroundColor = if (titleJson.has(BACKGROUND_COLOR_KEY)) titleJson.optString(BACKGROUND_COLOR_KEY) else null
60
62
  val gradientDrawable = FWGradientDrawableModelDeserializer.deserialize(titleJson.optJSONObject(GRADIENT_DRAWABLE_KEY))
@@ -63,6 +65,7 @@ object FWVideoFeedConfigModelDeserializer {
63
65
  hidden = hidden,
64
66
  textColor = textColor,
65
67
  fontSize = fontSize,
68
+ numberOfLines = numberOfLines,
66
69
  fontInfo = fontInfo,
67
70
  backgroundColor = backgroundColor,
68
71
  gradientDrawable = gradientDrawable,
@@ -18,6 +18,7 @@ object FWVideoFeedConfigModelSerializer {
18
18
  private const val HIDDEN_KEY = "hidden"
19
19
  private const val TEXT_COLOR_KEY = "textColor"
20
20
  private const val FONT_SIZE_KEY = "fontSize"
21
+ private const val NUMBER_OF_LINES = "numberOfLines"
21
22
  private const val FONT_INFO_KEY = "androidFontInfo"
22
23
  private const val GRADIENT_DRAWABLE_KEY = "gradientDrawable"
23
24
 
@@ -44,6 +45,7 @@ object FWVideoFeedConfigModelSerializer {
44
45
  jsonObject.put(HIDDEN_KEY, model.hidden)
45
46
  jsonObject.put(TEXT_COLOR_KEY, model.textColor)
46
47
  jsonObject.put(FONT_SIZE_KEY, model.fontSize)
48
+ jsonObject.put(NUMBER_OF_LINES, model.numberOfLines)
47
49
  jsonObject.put(FONT_INFO_KEY, FWFontInfoModelSerializer.serialize(model.fontInfo))
48
50
  jsonObject.put(GRADIENT_DRAWABLE_KEY, FWGradientDrawableModelSerializer.serialize(model.gradientDrawable))
49
51
  return jsonObject
@@ -5,4 +5,5 @@ import com.fireworksdk.bridge.models.enums.FWVideoPlayerLogoOption
5
5
  data class FWVideoPlayerLogoConfigurationModel(
6
6
  val option: FWVideoPlayerLogoOption?,
7
7
  val encodedId: String?,
8
+ val isClickable: Boolean?
8
9
  )
@@ -7,16 +7,19 @@ object FWVideoPlayerLogoConfigurationModelDeserializer {
7
7
 
8
8
  private const val OPTION_KEY = "option"
9
9
  private const val ENCODED_ID_KEY = "encodedId"
10
+ private const val IS_CLICKABLE = "isClickable"
10
11
 
11
12
  fun deserialize(responseJson: JSONObject?): FWVideoPlayerLogoConfigurationModel? {
12
13
  responseJson ?: return null
13
14
 
14
15
  val option = if (responseJson.has(OPTION_KEY)) responseJson.optString(OPTION_KEY) else null
15
16
  val encodedId = if (responseJson.has(ENCODED_ID_KEY)) responseJson.optString(ENCODED_ID_KEY) else null
17
+ val isClickable = if (responseJson.has(IS_CLICKABLE)) responseJson.optBoolean(IS_CLICKABLE) else null
16
18
 
17
19
  return FWVideoPlayerLogoConfigurationModel(
18
20
  option = if (!option.isNullOrBlank()) FWVideoPlayerLogoOption.deserialize(option) else null,
19
21
  encodedId = encodedId,
22
+ isClickable = isClickable
20
23
  )
21
24
  }
22
25
 
@@ -7,12 +7,14 @@ object FWVideoPlayerLogoConfigurationModelSerializer {
7
7
 
8
8
  private const val OPTION_KEY = "option"
9
9
  private const val ENCODED_ID_KEY = "encodedId"
10
+ private const val IS_CLICKABLE = "isClickable"
10
11
 
11
12
  fun serialize(model: FWVideoPlayerLogoConfigurationModel?): JSONObject? {
12
13
  model ?: return null
13
14
  val jsonObject = JSONObject()
14
15
  jsonObject.put(OPTION_KEY, FWVideoPlayerLogoOption.serialize(model.option))
15
16
  jsonObject.put(ENCODED_ID_KEY, model.encodedId)
17
+ jsonObject.put(IS_CLICKABLE, model.isClickable)
16
18
  return jsonObject
17
19
  }
18
20
  }
@@ -0,0 +1,7 @@
1
+ package com.fireworksdk.bridge.models.enums
2
+
3
+ enum class FWDataTrackingLevel(val rawValue: String) {
4
+ ALL("all"),
5
+ ESSENTIAL_ONLY("essentialOnly"),
6
+ NONE("none")
7
+ }
@@ -1,7 +1,7 @@
1
1
  package com.fireworksdk.bridge.models.enums
2
2
 
3
3
  enum class FWEventName(val rawValue: String) {
4
- SDKIni("fw:sdk-init"),
4
+ SDKInit("fw:sdk-init"),
5
5
  CustomCTAClick("fw:custom-cta-click"),
6
6
  VideoPlayback("fw:video-playback"),
7
7
  VideoFeedClick("fw:video-feed-click"),
@@ -42,6 +42,7 @@ enum class FWVideoShoppingEventName(val rawValue: String) {
42
42
  WillDisplayProduct("fw:shopping:will-display-product"),
43
43
  CustomLinkButtonClick("fw:shopping:custom-link-button-click"),
44
44
  CustomProductCardTap("fw:shopping:custom-product-card-tap"),
45
+ ProductClick("fw:shopping:product-click"),
45
46
  }
46
47
 
47
48
  enum class FWLiveStreamEventName(val rawValue: String) {
@@ -0,0 +1,6 @@
1
+ package com.fireworksdk.bridge.models.enums
2
+
3
+ enum class FWSwitchLanguageBehavior {
4
+ RestartingActivity,
5
+ NotRestartingActivity
6
+ }
@@ -1,11 +1,8 @@
1
1
  package com.fireworksdk.bridge.reactnative
2
2
 
3
- import android.annotation.SuppressLint
4
3
  import android.app.Activity
5
4
  import android.content.Context
6
5
  import android.content.pm.PackageManager
7
- import android.provider.Settings
8
- import android.util.Base64
9
6
  import com.firework.imageloading.ImageLoader
10
7
  import com.firework.livestream.LivestreamPlayerInitializer
11
8
  import com.firework.sdk.FireworkSdk
@@ -13,13 +10,12 @@ import com.firework.sdk.FireworkSdkConfig
13
10
  import com.fireworksdk.bridge.models.FWSDKInitOptionsModel
14
11
  import com.fireworksdk.bridge.models.FWSdkInitResultModel
15
12
  import com.fireworksdk.bridge.models.enums.FWPlayerLaunchBehavior
13
+ import com.fireworksdk.bridge.models.enums.FWSwitchLanguageBehavior
16
14
  import com.fireworksdk.bridge.utils.FWGlobalDataUtil
17
15
  import com.fireworksdk.bridge.utils.FWImageLoaderUtil
18
16
  import com.fireworksdk.bridge.utils.FWLanguageUtil
19
17
  import com.fireworksdk.bridge.utils.FWLiveStreamUtil
20
18
  import com.fireworksdk.bridge.utils.FWLogUtils
21
- import java.nio.charset.StandardCharsets
22
- import java.security.MessageDigest
23
19
 
24
20
  object FWReactNativeSDK {
25
21
 
@@ -36,11 +32,13 @@ object FWReactNativeSDK {
36
32
  success = false,
37
33
  reason = it
38
34
  )
35
+ FWGlobalDataUtil.initCompletedListener?.invoke()
39
36
  }, onSuccess = {
40
37
  FWGlobalDataUtil.sdkInitResultModel = FWSdkInitResultModel(
41
38
  success = true,
42
39
  reason = null
43
40
  )
41
+ FWGlobalDataUtil.initCompletedListener?.invoke()
44
42
  })
45
43
  }
46
44
 
@@ -56,8 +54,21 @@ object FWReactNativeSDK {
56
54
  return FWLanguageUtil.getInstance(context).updateBaseContextLocale(context)
57
55
  }
58
56
 
59
- fun changeLanguage(localeString: String, activity: Activity) {
60
- FWLanguageUtil.getInstance(activity).changeLanguage(localeString, activity)
57
+ fun changeLanguage(localeString: String?, context: Context): Boolean {
58
+ val isSameLanguageWithCache = FWLanguageUtil.getInstance(context).isSameLanguageWithCache(localeString)
59
+ return if (!isSameLanguageWithCache) {
60
+ // execute change language behavior
61
+ val changeLanguageResult = FWLanguageUtil.getInstance(context).changeLanguage(localeString)
62
+ // change language success, execute rest of logic
63
+ if (changeLanguageResult && context is Activity && FWGlobalDataUtil.switchLanguageBehavior == FWSwitchLanguageBehavior.RestartingActivity) {
64
+ // restart activity
65
+ FWLanguageUtil.getInstance(context).restartActivity(context)
66
+ }
67
+ changeLanguageResult
68
+ } else {
69
+ // no need to change language, return true means change successfully
70
+ true
71
+ }
61
72
  }
62
73
 
63
74
  fun initSdkInternal(
@@ -95,6 +106,7 @@ object FWReactNativeSDK {
95
106
  FWPlayerLaunchBehavior.MuteOnFirstLaunch -> {
96
107
  configBuilder.muteOnLaunch(true)
97
108
  }
109
+
98
110
  else -> {}
99
111
  }
100
112
 
@@ -11,4 +11,6 @@ interface FWNavigatorInterface {
11
11
  fun canPopNativeContainer(promise: Promise)
12
12
  fun startFloatingPlayer(promise: Promise)
13
13
  fun stopFloatingPlayer(promise: Promise)
14
+ fun bringRNContainerToTop(promise: Promise)
15
+ fun bringRNContainerToBottom(promise: Promise)
14
16
  }
@@ -15,4 +15,5 @@ interface FireworkSDKInterface {
15
15
  fun changeAppLanguage(language: String?, promise: Promise)
16
16
  fun restart(promise: Promise)
17
17
  fun trackPurchase(config: ReadableMap?, promise: Promise)
18
+ fun setDataTrackingLevel(level: String?, promise: Promise)
18
19
  }
@@ -13,6 +13,7 @@ import com.fireworksdk.bridge.models.enums.FWLiveStreamEventName
13
13
  import com.fireworksdk.bridge.reactnative.models.FWLiveStreamInterface
14
14
  import com.fireworksdk.bridge.reactnative.utils.FWEventUtils
15
15
  import com.fireworksdk.bridge.utils.FWLogUtils
16
+ import com.fireworksdk.bridge.utils.FWModelUtils
16
17
 
17
18
 
18
19
  class FWLiveStreamModule(
@@ -27,6 +28,7 @@ class FWLiveStreamModule(
27
28
  @Keep
28
29
  @FwAnalyticCallable
29
30
  fun onLivestreamEvent(event: LivestreamAnalyticEvent) {
31
+ val liveStreamEventDetailsModel = FWModelUtils.convertVideoInfo2LivestreamDetails(event.videoInfo)
30
32
  when (event) {
31
33
  is LivestreamAnalyticEvent.UserSentChatMessage -> {
32
34
  FWLogUtils.d { "userSentChat: $event" }
@@ -34,7 +36,7 @@ class FWLiveStreamModule(
34
36
  reactApplicationContext,
35
37
  FWLiveStreamEventName.UserSendChat.rawValue,
36
38
  FWLiveStreamMessageDetailsModel(event.messageId, event.username, event.messageText),
37
- FWLiveStreamEventDetailsModel(event.livestreamId)
39
+ liveStreamEventDetailsModel
38
40
  )
39
41
  }
40
42
  is LivestreamAnalyticEvent.UserJoined -> {
@@ -42,7 +44,7 @@ class FWLiveStreamModule(
42
44
  FWEventUtils.sendLiveStreamEvent(
43
45
  reactApplicationContext,
44
46
  FWLiveStreamEventName.UserJoin.rawValue,
45
- FWLiveStreamEventDetailsModel(event.livestreamId)
47
+ liveStreamEventDetailsModel
46
48
  )
47
49
  }
48
50
  is LivestreamAnalyticEvent.UserLeft -> {
@@ -50,7 +52,7 @@ class FWLiveStreamModule(
50
52
  FWEventUtils.sendLiveStreamEvent(
51
53
  reactApplicationContext,
52
54
  FWLiveStreamEventName.UserLeave.rawValue,
53
- FWLiveStreamEventDetailsModel(event.livestreamId)
55
+ liveStreamEventDetailsModel
54
56
  )
55
57
  }
56
58
  is LivestreamAnalyticEvent.UserSentLike -> {
@@ -58,7 +60,7 @@ class FWLiveStreamModule(
58
60
  FWEventUtils.sendLiveStreamEvent(
59
61
  reactApplicationContext,
60
62
  FWLiveStreamEventName.UserSendLike.rawValue,
61
- FWLiveStreamEventDetailsModel(event.livestreamId)
63
+ liveStreamEventDetailsModel
62
64
  )
63
65
  }
64
66
  }
@@ -1,7 +1,9 @@
1
1
  package com.fireworksdk.bridge.reactnative.module
2
2
 
3
3
  import android.app.Activity
4
+ import android.content.Intent
4
5
  import com.facebook.react.bridge.*
6
+ import com.firework.player.pager.PlayerActivity
5
7
  import com.firework.sdk.FireworkSdk
6
8
  import com.fireworksdk.bridge.FWInitializationProvider
7
9
  import com.fireworksdk.bridge.reactnative.models.FWNavigatorInterface
@@ -85,6 +87,30 @@ class FWNavigatorModule(
85
87
  promise.resolve(true)
86
88
  }
87
89
 
90
+ @ReactMethod
91
+ override fun bringRNContainerToTop(promise: Promise) {
92
+ // reorder MainActivity to front
93
+ val mainActivity = FWInitializationProvider.INSTANCE.mainActivity
94
+ mainActivity?.let { mActivity ->
95
+ val resumedActivity = FWInitializationProvider.INSTANCE.resumedActivity
96
+ resumedActivity?.let { rActivity ->
97
+ rActivity.startActivity(
98
+ Intent(rActivity, mActivity::class.java)
99
+ .addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT)
100
+ )
101
+ }
102
+ }
103
+ }
104
+
105
+ @ReactMethod
106
+ override fun bringRNContainerToBottom(promise: Promise) {
107
+ // reorder PlayerActivity to front
108
+ val mainActivity = FWInitializationProvider.INSTANCE.mainActivity
109
+ mainActivity?.let {
110
+ it.startActivity(PlayerActivity.getIntentForReorderToFront(it))
111
+ }
112
+ }
113
+
88
114
  @ReactMethod
89
115
  fun addListener(eventName: String?, promise: Promise) {
90
116
  // Set up any upstream listeners or background tasks as necessary
@@ -34,11 +34,13 @@ class FWVideoShoppingModule(
34
34
  private var ctaHandler: Triple<Int, String, String>? = null
35
35
  private val updateProductHandler: HashMap<String, List<Product>> = HashMap()
36
36
  private val updateProductHydratorHandler: HashMap<String, ProductHydrator> = HashMap()
37
+ private var isCustomProductCardEnabled = false
37
38
 
38
39
  @ReactMethod
39
40
  override fun init() {
40
41
  cartListener()
41
42
  productListener()
43
+ productCardListener()
42
44
  }
43
45
 
44
46
  @ReactMethod
@@ -344,13 +346,27 @@ class FWVideoShoppingModule(
344
346
 
345
347
  @ReactMethod
346
348
  override fun setCustomTapProductCardEnabled(value: Boolean?, promise: Promise) {
349
+ isCustomProductCardEnabled = value ?: false
350
+ promise.resolve(true)
351
+ }
347
352
 
348
- if (value == true) {
349
- FireworkSdk.shopping.setOnProductCardClickListener { productId, unitId, productWebUrl, videoInfo ->
350
- FWLogUtils.d { "FWVideoShoppingModule productCardClick $productId $unitId $productWebUrl" }
353
+ @ReactMethod
354
+ fun addListener(eventName: String?) {
355
+ // Set up any upstream listeners or background tasks as necessary
356
+ FWLogUtils.d { "addListener: $eventName" }
357
+ }
351
358
 
352
- val videoPlaybackDetails = FWModelUtils.convertVideoInfo2PlaybackDetails(videoInfo)
359
+ @ReactMethod
360
+ fun removeListeners(count: Int?) {
361
+ // Remove upstream listeners, stop unnecessary background tasks
362
+ FWLogUtils.d { "removeListeners: $count" }
363
+ }
353
364
 
365
+ private fun productCardListener() {
366
+ FireworkSdk.shopping.setOnProductCardClickListener { productId, unitId, productWebUrl, videoInfo ->
367
+ FWLogUtils.d { "FWVideoShoppingModule productCardClick $productId $unitId $productWebUrl" }
368
+ val videoPlaybackDetails = FWModelUtils.convertVideoInfo2PlaybackDetails(videoInfo)
369
+ if (isCustomProductCardEnabled) {
354
370
  FWEventUtils.sendProductCardClickEvent(
355
371
  reactApplicationContext,
356
372
  productWebUrl,
@@ -360,25 +376,19 @@ class FWVideoShoppingModule(
360
376
  callbackId
361
377
  )
362
378
  }
363
- } else {
364
- FireworkSdk.shopping.setOnProductCardClickListener(null)
379
+ // send onClickProduct
380
+ FWEventUtils.sendProductClickEvent(
381
+ reactApplicationContext,
382
+ productWebUrl,
383
+ productId,
384
+ unitId,
385
+ videoPlaybackDetails
386
+ )
387
+ isCustomProductCardEnabled
365
388
  }
366
-
367
-
368
- promise.resolve(true)
369
389
  }
370
390
 
371
- @ReactMethod
372
- fun addListener(eventName: String?) {
373
- // Set up any upstream listeners or background tasks as necessary
374
- FWLogUtils.d { "addListener: $eventName" }
375
- }
376
391
 
377
- @ReactMethod
378
- fun removeListeners(count: Int?) {
379
- // Remove upstream listeners, stop unnecessary background tasks
380
- FWLogUtils.d { "removeListeners: $count" }
381
- }
382
392
 
383
393
  override fun getName(): String {
384
394
  return "ShoppingModule"