@24i/smartapps-bigscreen-rnv-build-engine 0.17.6-alpha.8 → 0.17.6

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 (58) hide show
  1. package/README.md +16 -12
  2. package/dist/src/constants/buildProductionPackages.js +1 -0
  3. package/dist/src/constants/delopyLivePlatforms.js +2 -1
  4. package/dist/src/constants/platforms.js +2 -0
  5. package/dist/src/engine.js +10 -0
  6. package/dist/src/resolvers/index.js +3 -1
  7. package/dist/src/resolvers/resolveBaseUrl.js +5 -24
  8. package/dist/src/resolvers/resolveProductionZipFileRelativePath.js +1 -2
  9. package/dist/src/resolvers/resolveS3BucketAppPath.js +15 -0
  10. package/dist/src/resolvers/shared/constructFullUrl.js +25 -0
  11. package/dist/src/scripts/buildAllWithSchemes.js +23 -4
  12. package/dist/src/scripts/release/appCenter/deployProductionPackagesToAppCenter.js +20 -10
  13. package/dist/src/scripts/release/urlsMarkdown.js +2 -0
  14. package/dist/src/scripts/releaseAllWithSchemes.js +3 -2
  15. package/dist/src/sdks/index.js +1 -0
  16. package/dist/src/sdks/sdk-androidtv/sdkAndroidtv.js +25 -9
  17. package/dist/src/sdks/sdk-tizen/sdkTizen.js +2 -0
  18. package/dist/src/sdks/sdk-webos/sdkWebos.js +2 -0
  19. package/dist/src/sdks/sdk-webpack/sdkWebpack.js +2 -0
  20. package/dist/src/tasks/deploy/aswS3/deployS3.js +3 -10
  21. package/dist/src/tasks/deploy/aswS3/distToLiveS3.js +4 -5
  22. package/dist/src/tasks/deploy/hbbtv/deployHbbtv.js +1 -1
  23. package/dist/src/tasks/task.rnv.build.js +16 -6
  24. package/dist/src/tasks/task.rnv.configure.js +2 -0
  25. package/dist/src/tasks/task.rnv.deploy.js +2 -0
  26. package/dist/src/tasks/task.rnv.platform.configure.js +33 -1
  27. package/dist/src/tasks/task.rnv.start.js +2 -0
  28. package/dist/src/utils/copyTheoPlayerLibs.js +48 -0
  29. package/dist/src/utils/zipStagingProdBuildsByPlatforms.js +3 -3
  30. package/dist/templates/platforms/androidtv/project/amazoniap/build.gradle +2 -2
  31. package/dist/templates/platforms/androidtv/project/app/build.gradle +17 -21
  32. package/dist/templates/platforms/androidtv/project/app/proguard-rules.pro +15 -0
  33. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/raw/configuration.json +1 -2
  34. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/bridge/BridgeFromJavaScript.kt +4 -58
  35. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/bridge/BridgeToJavaScript.kt +15 -0
  36. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/BridgeConfig.kt +2 -1
  37. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ActivityModule.kt +0 -3
  38. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ApplicationModule.kt +2 -2
  39. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/PerActivity.kt +0 -0
  40. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/PlayerFactoryConfigured.kt +33 -0
  41. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/PlayerFactoryExoPlayerCustomized.kt +7 -1
  42. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/PlayerFactoryTheoPlayerCustomized.kt +14 -0
  43. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/PlayerFactoryVersion.kt +27 -0
  44. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/SourceDrmOverridden.kt +42 -0
  45. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/MediaEventType.kt +3 -0
  46. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/SourceParser.kt +89 -0
  47. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/Mainview.kt +0 -3
  48. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/PlayerCache.kt +2 -2
  49. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/WebViewActivity.kt +24 -83
  50. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/viewmodel/WebViewModel.kt +48 -111
  51. package/dist/templates/platforms/androidtv/project/app/src/main/res/layout/activity_web_view.xml +23 -71
  52. package/dist/templates/platforms/androidtv/project/common/build.gradle +2 -2
  53. package/dist/templates/platforms/androidtv/project/googleiap/build.gradle +2 -2
  54. package/package.json +1 -1
  55. package/renative.engine.json +2 -0
  56. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/jump/JumpAnalytics.kt +0 -211
  57. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/ContentModelParser.kt +0 -16
  58. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/DeviceInfoParser.kt +0 -22
@@ -1,7 +1,11 @@
1
1
  package com.twentyfouri.tvbridge.global.utils
2
2
 
3
+ import com.twentyfouri.player.base.Source
3
4
  import com.twentyfouri.player.base.SourceAuthorization
4
5
  import com.twentyfouri.player.base.SourceDrm
6
+ import com.twentyfouri.player.base.SourceDrmPlayready
7
+ import com.twentyfouri.player.base.SourceDrmWidevine
8
+ import com.twentyfouri.player.base.buildUpon
5
9
  import java.net.URI
6
10
 
7
11
  open class SourceDrmOverridden protected constructor(
@@ -33,6 +37,17 @@ open class SourceDrmOverridden protected constructor(
33
37
  var forceLicenseServer: Boolean = false
34
38
  var authorization: SourceAuthorization? = null
35
39
 
40
+ open fun applyFrom(source: SourceDrm) {
41
+ when (source) {
42
+ is SourceDrmOverridden -> applyFrom(source)
43
+ is SourceDrmWidevine -> applyFrom(source)
44
+ is SourceDrmPlayready -> applyFrom(source)
45
+ else -> {
46
+ packageName = source.packageName
47
+ }
48
+ }
49
+ }
50
+
36
51
  open fun applyFrom(source: SourceDrmOverridden) {
37
52
  packageName = source.packageName
38
53
  licenseServer = source.licenseServer
@@ -40,9 +55,36 @@ open class SourceDrmOverridden protected constructor(
40
55
  authorization = source.authorization
41
56
  }
42
57
 
58
+ open fun applyFrom(source: SourceDrmWidevine) {
59
+ packageName = source.packageName
60
+ licenseServer = source.licenseServer
61
+ forceLicenseServer = source.forceLicenseServer
62
+ authorization = source.authorization
63
+ }
64
+
65
+ open fun applyFrom(source: SourceDrmPlayready) {
66
+ packageName = source.packageName
67
+ licenseServer = source.licenseServer
68
+ forceLicenseServer = source.forceLicenseServer
69
+ authorization = source.authorization
70
+ }
71
+
43
72
  override fun build() =
44
73
  SourceDrmOverridden(this)
45
74
  }
75
+
76
+ companion object {
77
+ fun replaceSource(source: Source): Source {
78
+ if (source.drm.isEmpty()) return source
79
+ return source.buildUpon {
80
+ drm = drm.mapTo(mutableListOf()) { sourceDrm ->
81
+ SourceDrmOverridden {
82
+ applyFrom(sourceDrm)
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
46
88
  }
47
89
 
48
90
  inline fun SourceDrmOverridden(block: SourceDrmOverridden.Builder.() -> Unit) =
@@ -19,4 +19,7 @@ object MediaEventType {
19
19
  const val KEY_UP = "keyup"
20
20
  const val KEY_DOWN = "keydown"
21
21
  const val TRACKS_CHANGED = "tracksChanged"
22
+ const val AD_BREAK_START = "adbreakstart"
23
+ const val AD_BREAK_END = "adbreakend"
24
+ const val AD_BREAKS_RESCHEDULED = "adbreaksrescheduled"
22
25
  }
@@ -0,0 +1,89 @@
1
+ package com.twentyfouri.tvbridge.webview.parser
2
+
3
+ import com.twentyfouri.player.base.*
4
+ import com.twentyfouri.tvbridge.global.utils.SourceDrmOverridden
5
+ import org.json.JSONException
6
+ import org.json.JSONObject
7
+ import java.net.URI
8
+ import java.util.UUID
9
+
10
+ object SourceParser {
11
+ private val sourceSerializer = DefaultSourceSerializer()
12
+
13
+ fun stringToJson(jsonString: String?): Source? {
14
+ if (jsonString.isNullOrEmpty()) return null
15
+ if (jsonString.startsWith("http://") || jsonString.startsWith("https://")) {
16
+ return Source {
17
+ url = URI(jsonString)
18
+ }
19
+ }
20
+
21
+ try {
22
+ val jsonSource = JSONObject(jsonString)
23
+ if (jsonSource.has("streamUrl")) {
24
+ return parseContentModel(jsonSource)
25
+ }
26
+ return sourceSerializer.toSource(jsonSource)
27
+
28
+ } catch (e: JSONException) {
29
+ return null
30
+ }
31
+ }
32
+
33
+ private fun parseContentModel(jsonSource: JSONObject): Source? {
34
+ return Source {
35
+ val streamUrl = jsonSource.getString("streamUrl", null)
36
+ if (streamUrl.isNullOrEmpty()) return null
37
+ url = URI(streamUrl)
38
+
39
+ mimeType = jsonSource.getString("streamType", null)
40
+ ?.let { MimeType.parse(it) }
41
+
42
+ jsonSource.getObject("drmConfig") { parseDrmModel(it) }
43
+ ?.also { drm.add(it) }
44
+ }
45
+ }
46
+
47
+ private fun parseDrmModel(jsonDrm: JSONObject): SourceDrm? {
48
+ val drmSchemeUuid = jsonDrm.getString("drmSchemeUuid", null)
49
+ val drmLicenseUri = jsonDrm.getString("drmLicenseUrl", null)
50
+ ?.let { URI(it) }
51
+ val drmCustomData = jsonDrm.getObject("drmCustomData") { parseSourceAuthorization (it) }
52
+ val overrideDrmCallback = jsonDrm.getBoolean("overrideDrmCallback")
53
+
54
+ return if (overrideDrmCallback) {
55
+ SourceDrmOverridden {
56
+ packageName = when (drmSchemeUuid) {
57
+ "widevine", WIDEVINE_UUID -> DrmWidevine.packageName
58
+ "playready", PLAYREADY_UUID -> DrmPlayready.packageName
59
+ else -> null
60
+ }
61
+ licenseServer = drmLicenseUri
62
+ authorization = drmCustomData
63
+ }
64
+ } else {
65
+ when (drmSchemeUuid) {
66
+ "widevine", WIDEVINE_UUID -> SourceDrmWidevine {
67
+ licenseServer = drmLicenseUri
68
+ authorization = drmCustomData
69
+ }
70
+ "playready", PLAYREADY_UUID -> SourceDrmPlayready {
71
+ licenseServer = drmLicenseUri
72
+ authorization = drmCustomData
73
+ }
74
+ else -> null
75
+ }
76
+ }
77
+ }
78
+
79
+ private fun parseSourceAuthorization(jsonMap: JSONObject): SourceAuthorization? {
80
+ return SourceAuthorizationHeaders {
81
+ jsonMap.keys().forEach { key ->
82
+ headers[key] = jsonMap.getString(key)
83
+ }
84
+ }
85
+ }
86
+
87
+ val WIDEVINE_UUID = "edef8ba9-79d6-4ace-a3c8-27dcd51d21ed"
88
+ val PLAYREADY_UUID = "9a04f079-9840-4286-ab92-e65be0885f95"
89
+ }
@@ -1,7 +1,5 @@
1
1
  package com.twentyfouri.tvbridge.webview.view
2
2
 
3
- import com.twentyfouri.player.base.PlayerBase
4
-
5
3
  /**
6
4
  * Created by destivar on 15/02/16.
7
5
  */
@@ -9,7 +7,6 @@ interface Mainview {
9
7
  fun loadUrl(url: String?)
10
8
  fun goFullscreen()
11
9
  fun exitFullscreen(width: Int, height: Int, left: Int, top: Int)
12
- fun setUrlToView(urlString: String?)
13
10
  fun setBlackCurtainVisibility(visibility: Int)
14
11
  fun showMessage(message: String?)
15
12
  fun requestAudioFocus(): Int
@@ -1,6 +1,6 @@
1
1
  package com.twentyfouri.tvbridge.webview.view
2
2
 
3
- import com.twentyfouri.tvbridge.webview.model.ContentModel
3
+ import com.twentyfouri.player.base.Source
4
4
 
5
5
  class PlayerCache {
6
6
  enum class PlayerState {
@@ -11,5 +11,5 @@ class PlayerCache {
11
11
  var savedPlayerPosition: Double = 0.0
12
12
  var savedPlayerDuration: Double = 0.0
13
13
  var savedPlayerState: PlayerState? = null
14
- var savedContentModel: ContentModel? = null
14
+ var savedSource: Source? = null
15
15
  }
@@ -2,9 +2,6 @@ package com.twentyfouri.tvbridge.webview.view
2
2
 
3
3
  import android.annotation.SuppressLint
4
4
  import android.app.Activity
5
- import android.content.Intent
6
- import android.graphics.Bitmap
7
- import android.graphics.Canvas
8
5
  import android.graphics.Point
9
6
  import android.media.AudioManager
10
7
  import android.media.AudioManager.OnAudioFocusChangeListener
@@ -14,10 +11,9 @@ import android.text.TextWatcher
14
11
  import android.util.Log
15
12
  import android.view.KeyEvent
16
13
  import android.view.View
14
+ import android.view.View.MeasureSpec
17
15
  import android.view.WindowManager
18
16
  import android.view.inputmethod.InputMethodManager
19
- import android.webkit.WebChromeClient
20
- import android.webkit.WebView
21
17
  import android.widget.RelativeLayout
22
18
  import android.widget.Toast
23
19
  import androidx.appcompat.app.AppCompatActivity
@@ -25,7 +21,6 @@ import androidx.databinding.DataBindingUtil
25
21
  import androidx.media.AudioAttributesCompat
26
22
  import androidx.media.AudioFocusRequestCompat
27
23
  import androidx.media.AudioManagerCompat
28
- import com.twentyfouri.tvbridge.BuildConfig
29
24
  import com.twentyfouri.tvbridge.R
30
25
  import com.twentyfouri.tvbridge.configuration.BridgeConfig
31
26
  import com.twentyfouri.tvbridge.databinding.ActivityWebViewBinding
@@ -76,36 +71,14 @@ class WebViewActivity : AppCompatActivity(), Mainview {
76
71
  CookieHandler.setDefault(defaultCookieManager)
77
72
  }
78
73
 
79
- binding = DataBindingUtil.setContentView(this, R.layout.activity_web_view)
80
- binding.viewModel = viewModel
81
- binding.exoplayerView.playerFactory = viewModel.playerFactory
74
+ binding = ActivityWebViewBinding.inflate(layoutInflater)
75
+ setContentView(binding.root)
76
+ binding.playerView.playerFactory = viewModel.playerFactory
82
77
  viewModel.attachView(this)
83
78
  viewModel.configureWebView(binding.webview)
84
- viewModel.player = binding.exoplayerView.player
79
+ viewModel.player = binding.playerView.player
85
80
 
86
- binding.url.addTextChangedListener(object : TextWatcher {
87
- override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
88
- override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {
89
- viewModel.appUrl = s.toString()
90
- }
91
-
92
- override fun afterTextChanged(s: Editable) {}
93
- })
94
-
95
- val appUrl = config.baseUrl
96
- if (config.customizableUrl) {
97
- viewModel.urlSetterVisible = true
98
- viewModel.appUrl = appUrl
99
- setUrlToView(appUrl)
100
- } else {
101
- viewModel.urlSetterVisible = false
102
- loadUrl(appUrl)
103
- }
104
-
105
- binding.root.viewTreeObserver.addOnGlobalFocusChangeListener { oldFocus: View, newFocus: View ->
106
- Log.v("FOCUS", "global focus changed old = $oldFocus")
107
- Log.v("FOCUS", "global focus changed new = $newFocus")
108
- }
81
+ loadUrl(config.baseUrl)
109
82
 
110
83
  initialized = true
111
84
  }
@@ -170,13 +143,12 @@ class WebViewActivity : AppCompatActivity(), Mainview {
170
143
  public override fun onDestroy() {
171
144
  if (initialized) {
172
145
  viewModel.releasePlayer()
173
- binding.unbind()
174
146
  }
175
147
  super.onDestroy()
176
148
  }
177
149
 
178
150
  override fun goFullscreen() {
179
- val layoutParams = binding.exoplayerView.layoutParams as RelativeLayout.LayoutParams
151
+ val layoutParams = binding.playerView.layoutParams as RelativeLayout.LayoutParams
180
152
  layoutParams.width = -1
181
153
  layoutParams.height = -1
182
154
  layoutParams.leftMargin = 0
@@ -187,8 +159,12 @@ class WebViewActivity : AppCompatActivity(), Mainview {
187
159
  display.getSize(size)
188
160
  val width = size.x
189
161
  val height = size.y
190
- binding.exoplayerView.layoutParams = layoutParams
191
- binding.exoplayerView.layout(width, height, 0, 0)
162
+ binding.playerView.layoutParams = layoutParams
163
+ binding.playerView.measure(
164
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
165
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
166
+ )
167
+ binding.playerView.layout(width, height, 0, 0)
192
168
  }
193
169
 
194
170
  override fun launchIapPurchase(sku: String) {
@@ -196,37 +172,22 @@ class WebViewActivity : AppCompatActivity(), Mainview {
196
172
  }
197
173
 
198
174
  override fun exitFullscreen(width: Int, height: Int, left: Int, top: Int) {
199
- val layoutParams = binding.exoplayerView.layoutParams as RelativeLayout.LayoutParams
175
+ val layoutParams = binding.playerView.layoutParams as RelativeLayout.LayoutParams
200
176
  layoutParams.width = width
201
177
  layoutParams.height = height
202
178
  layoutParams.leftMargin = left
203
179
  layoutParams.topMargin = top
204
180
 
205
181
  //set the layout inner and outer sizes
206
- binding.exoplayerView.layoutParams = layoutParams
207
- binding.exoplayerView.layout(width, height, left, top)
208
- }
209
-
210
- override fun setUrlToView(urlString: String?) {
211
- binding.url.requestFocus()
212
- binding.url.setText(urlString)
213
- binding.url.setSelection(urlString?.length ?: 0)
182
+ binding.playerView.layoutParams = layoutParams
183
+ binding.playerView.layout(width, height, left, top)
214
184
  }
215
185
 
216
186
  override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
217
187
  when (event.keyCode) {
218
- KeyEvent.KEYCODE_DPAD_RIGHT, KeyEvent.KEYCODE_DPAD_LEFT -> changeFocus()
219
188
  KeyEvent.KEYCODE_DPAD_CENTER -> goToUrl()
220
- KeyEvent.KEYCODE_BACK, KeyEvent.KEYCODE_BUTTON_B, KeyEvent.KEYCODE_BUTTON_A, KeyEvent.KEYCODE_MENU, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, KeyEvent.KEYCODE_MEDIA_PLAY, KeyEvent.KEYCODE_MEDIA_PAUSE, KeyEvent.KEYCODE_MEDIA_FAST_FORWARD, KeyEvent.KEYCODE_MEDIA_REWIND -> {
221
- if (!binding.url.hasFocus() && !binding.buttonGo.hasFocus()) {
222
- // Send these key presses to the WebView, through a JavaScript bridge.
223
- viewModel.sendKeyCode(event.keyCode, MediaEventType.KEY_DOWN)
224
- }
225
- }
226
189
  else -> {
227
- if (!binding.url.hasFocus() && !binding.buttonGo.hasFocus()) {
228
- viewModel.sendKeyCode(event.keyCode, MediaEventType.KEY_DOWN)
229
- }
190
+ viewModel.sendKeyCode(event.keyCode, MediaEventType.KEY_DOWN)
230
191
  }
231
192
  }
232
193
  return super.onKeyDown(keyCode, event)
@@ -254,35 +215,19 @@ class WebViewActivity : AppCompatActivity(), Mainview {
254
215
  }
255
216
 
256
217
  private fun goToUrl() {
257
- if (binding.buttonGo.hasFocus()) {
258
- viewModel.onClickGo()
259
- }
260
- }
261
-
262
- private fun changeFocus() {
263
- if (binding.url.hasFocus()) {
264
- binding.buttonGo.requestFocus()
265
- } else if (binding.buttonGo.hasFocus()) {
266
- binding.url.requestFocus()
267
- }
218
+ viewModel.onClickGo()
268
219
  }
269
220
 
270
221
  override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
271
- if (!binding.url.hasFocus() && !binding.buttonGo.hasFocus()) {
272
- // Send these key presses to the WebView, through a JavaScript bridge.
273
- viewModel.sendKeyCode(event.keyCode, MediaEventType.KEY_UP)
274
- return true
275
- }
276
- return super.onKeyUp(keyCode, event)
222
+ // Send these key presses to the WebView, through a JavaScript bridge.
223
+ viewModel.sendKeyCode(event.keyCode, MediaEventType.KEY_UP)
224
+ return true
277
225
  }
278
226
 
279
227
  override fun onKeyLongPress(keyCode: Int, event: KeyEvent): Boolean {
280
- if (!binding.url.hasFocus() && !binding.buttonGo.hasFocus()) {
281
- // Send these key presses to the WebView, through a JavaScript bridge.
282
- viewModel.sendKeyCode(event.keyCode, MediaEventType.KEY_PRESS)
283
- return true
284
- }
285
- return super.onKeyLongPress(keyCode, event)
228
+ // Send these key presses to the WebView, through a JavaScript bridge.
229
+ viewModel.sendKeyCode(event.keyCode, MediaEventType.KEY_PRESS)
230
+ return true
286
231
  }
287
232
 
288
233
  override fun loadUrl(url: String?) {
@@ -294,10 +239,6 @@ class WebViewActivity : AppCompatActivity(), Mainview {
294
239
  }
295
240
  }
296
241
 
297
- override fun onBackPressed() {
298
- super.onBackPressed()
299
- }
300
-
301
242
  companion object {
302
243
  private val defaultCookieManager: CookieManager = CookieManager().apply {
303
244
  setCookiePolicy(CookiePolicy.ACCEPT_ALL)