@24i/smartapps-bigscreen-rnv-build-engine 0.17.27-alpha.2774 → 0.17.27-alpha.2785

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.
@@ -85,7 +85,7 @@ android {
85
85
  }
86
86
 
87
87
  dependencies {
88
- coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
88
+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
89
89
 
90
90
  implementation fileTree(include: ['*.jar'], dir: 'libs')
91
91
  implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
@@ -97,20 +97,20 @@ dependencies {
97
97
  implementation "androidx.appcompat:appcompat:1.7.0"
98
98
  implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
99
99
 
100
- implementation "com.google.dagger:dagger:2.48.1"
101
- kapt "com.google.dagger:dagger-compiler:2.48.1"
100
+ implementation "com.google.dagger:dagger:2.56.1"
101
+ kapt "com.google.dagger:dagger-compiler:2.56.1"
102
102
 
103
103
  implementation "com.squareup.retrofit2:retrofit:2.9.0"
104
104
  implementation "com.squareup.retrofit2:converter-gson:2.9.0"
105
- implementation "com.squareup.okhttp3:logging-interceptor:4.9.2"
106
- implementation "com.squareup.okhttp3:okhttp:4.9.2"
105
+ implementation "com.squareup.okhttp3:logging-interceptor:4.12.0"
106
+ implementation "com.squareup.okhttp3:okhttp:4.12.0"
107
107
  if (useTheoPlayer) {
108
- compileOnly "com.twentyfouri.player:exoplayer:0.8.0-alpha.15"
109
- implementation "com.twentyfouri.player:theoplayer:0.8.0-alpha.15"
108
+ compileOnly "com.twentyfouri.player:exoplayer:0.8.0-alpha.18"
109
+ implementation "com.twentyfouri.player:theoplayer:0.8.0-alpha.18"
110
110
  implementation "com.theoplayer.theoplayer-sdk-android:core:8.2.0"
111
111
  } else {
112
- implementation "com.twentyfouri.player:exoplayer:0.8.0-alpha.15"
113
- compileOnly "com.twentyfouri.player:theoplayer:0.8.0-alpha.15"
112
+ implementation "com.twentyfouri.player:exoplayer:0.8.0-alpha.18"
113
+ compileOnly "com.twentyfouri.player:theoplayer:0.8.0-alpha.18"
114
114
  compileOnly "com.theoplayer.theoplayer-sdk-android:core:8.2.0"
115
115
  }
116
116
 
@@ -129,5 +129,6 @@ dependencies {
129
129
  }
130
130
 
131
131
  implementation project(':common')
132
- }
133
132
 
133
+ implementation "com.google.android.gms:play-services-ads-identifier:18.2.0"
134
+ }
@@ -8,15 +8,14 @@ import android.webkit.JavascriptInterface
8
8
  import com.google.gson.JsonObject
9
9
  import com.twentyfouri.player.base.TextTrack
10
10
  import com.twentyfouri.player.base.TrackKind
11
- import com.twentyfouri.tvbridge.webview.parser.SourceParser.stringToJson
12
11
  import com.twentyfouri.tvbridge.webview.parser.PlaybackInfoParser.parse
13
- import com.twentyfouri.tvbridge.webview.parser.SourceParser
12
+ import com.twentyfouri.tvbridge.webview.parser.SourceParser.stringToJson
14
13
  import com.twentyfouri.tvbridge.webview.parser.TrackJsonModelParser.audioFromJson
15
14
  import com.twentyfouri.tvbridge.webview.parser.TrackJsonModelParser.textFromJson
16
15
  import com.twentyfouri.tvbridge.webview.parser.TrackJsonModelParser.toJson
17
16
  import com.twentyfouri.tvbridge.webview.viewmodel.WebViewModel
18
17
  import java.text.SimpleDateFormat
19
- import java.util.*
18
+ import java.util.Arrays
20
19
  import java.util.concurrent.CountDownLatch
21
20
  import java.util.concurrent.TimeUnit
22
21
  import kotlin.math.roundToInt
@@ -375,6 +374,18 @@ class BridgeFromJavaScript(
375
374
  return ""
376
375
  }
377
376
 
377
+ /***
378
+ * Bridget JS 2 Android to get advertising id
379
+ */
380
+ @JavascriptInterface
381
+ fun bridgeJavaScriptToAndroid_GetAdId() = viewModel.adId
382
+
383
+ /***
384
+ * Bridget JS 2 Android to get limit ad tracking info
385
+ */
386
+ @JavascriptInterface
387
+ fun bridgeJavaScriptToAndroid_GetLimitAdTracking() = viewModel.limitAdTracking
388
+
378
389
  companion object {
379
390
  const val LOG_TAG = "JavaScriptBridge"
380
391
  val DISABLED_AUDIO_TRACK = JsonObject().apply {
@@ -59,9 +59,9 @@ class BridgeToJavaScript(
59
59
  textTracks: List<TextTrack>
60
60
  ) {
61
61
  val tracksJson = toJson(audioTracks, textTracks)
62
- Log.d(LOG_TAG, tracksJson)
62
+ Log.d(LOG_TAG, "bridgeAndroidToJavaScript_MediaTrackEvent $tracksJson")
63
63
  val mediaEventString = "javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('$mediaEventPrefix$mediaEvent',true,true);evt.tracks='$tracksJson';document.dispatchEvent(evt);})())"
64
- Log.v(LOG_TAG, mediaEventString)
64
+ Log.v(LOG_TAG, "bridgeAndroidToJavaScript_MediaTrackEvent $mediaEventString")
65
65
  executeJavaScript(mediaEventString)
66
66
  }
67
67
 
@@ -74,8 +74,8 @@ class BridgeToJavaScript(
74
74
  val adBreakJson = adBreak?.let { serializer.toPersistentMap(it).toString() } ?: ""
75
75
  val adJson = ad?.let { serializer.toPersistentMap(it).toString() } ?: ""
76
76
 
77
- val mediaEventString = "javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('$mediaEventPrefix$mediaEvent',true,true);evt.adbreak='$adBreakJson';evt.adbreak='$adJson';document.dispatchEvent(evt);})())"
78
- Log.v(LOG_TAG, mediaEventString)
77
+ val mediaEventString = "javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('$mediaEventPrefix$mediaEvent',true,true);evt.adbreak='$adBreakJson';evt.ad='$adJson';document.dispatchEvent(evt);})())"
78
+ Log.v(LOG_TAG, "bridgeAndroidToJavaScript_MediaAdEvent $mediaEventString")
79
79
  executeJavaScript(mediaEventString)
80
80
  }
81
81
 
@@ -87,7 +87,7 @@ class BridgeToJavaScript(
87
87
  val adsJson = JSONArray(timeline.map { serializer.toPersistentMap(it) }).toString()
88
88
 
89
89
  val mediaEventString = "javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('$mediaEventPrefix$mediaEvent',true,true);evt.ads='$adsJson';document.dispatchEvent(evt);})())"
90
- Log.v(LOG_TAG, mediaEventString)
90
+ Log.v(LOG_TAG, "bridgeAndroidToJavaScript_MediaAdEvent $mediaEventString")
91
91
  executeJavaScript(mediaEventString)
92
92
  }
93
93
 
@@ -22,8 +22,9 @@ object MediaEventType {
22
22
  const val TRACKS_CHANGED = "trackschanged"
23
23
  const val AD_BREAK_START = "adbreakbegin"
24
24
  const val AD_BREAK_END = "adbreakend"
25
- const val AD_BREAKS_RESCHEDULED = "admetadata"
25
+ const val AD_BREAKS_RESCHEDULED = "adcuepointschanged"
26
26
  const val AD_STARTED = "adbegin"
27
+ const val AD_ENDED = "adend"
27
28
  const val AD_ERROR = "aderror"
28
29
  const val AD_SKIPPED = "adskip"
29
30
  }
@@ -17,11 +17,9 @@ import android.view.inputmethod.InputMethodManager
17
17
  import android.widget.RelativeLayout
18
18
  import android.widget.Toast
19
19
  import androidx.appcompat.app.AppCompatActivity
20
- import androidx.databinding.DataBindingUtil
21
20
  import androidx.media.AudioAttributesCompat
22
21
  import androidx.media.AudioFocusRequestCompat
23
22
  import androidx.media.AudioManagerCompat
24
- import com.twentyfouri.tvbridge.R
25
23
  import com.twentyfouri.tvbridge.configuration.BridgeConfig
26
24
  import com.twentyfouri.tvbridge.databinding.ActivityWebViewBinding
27
25
  import com.twentyfouri.tvbridge.global.BaseApplication
@@ -6,12 +6,15 @@ import android.content.Intent
6
6
  import android.graphics.Bitmap
7
7
  import android.graphics.Canvas
8
8
  import android.os.Build
9
+ import android.provider.Settings
9
10
  import android.util.Log
10
11
  import android.view.KeyEvent
11
12
  import android.view.View
12
13
  import android.webkit.CookieManager
13
14
  import android.webkit.WebChromeClient
14
15
  import android.webkit.WebView
16
+ import com.google.android.gms.ads.identifier.AdvertisingIdClient
17
+ import com.google.android.gms.common.GooglePlayServicesNotAvailableException
15
18
  import com.google.gson.JsonArray
16
19
  import com.google.gson.JsonObject
17
20
  import com.twentyfouri.player.base.*
@@ -23,7 +26,6 @@ import com.twentyfouri.tvbridge.bridge.BridgeToJavaScript
23
26
  import com.twentyfouri.tvbridge.common.*
24
27
  import com.twentyfouri.tvbridge.configuration.BridgeConfig
25
28
  import com.twentyfouri.tvbridge.global.utils.LocalStorage
26
- import com.twentyfouri.tvbridge.global.utils.PlayerFactoryTheoPlayerCustomized
27
29
  import com.twentyfouri.tvbridge.global.utils.PlayerFactoryVersion
28
30
  import com.twentyfouri.tvbridge.global.utils.SourceDrmOverridden
29
31
  import com.twentyfouri.tvbridge.webview.client.BridgeWebView
@@ -59,6 +61,8 @@ class WebViewModel @Inject constructor(
59
61
 
60
62
  private var source: Source? = null
61
63
 
64
+ private var adStarted: Boolean = false
65
+
62
66
  val audioTrack: AudioTrack?
63
67
  get() = player?.selectedAudioTrack
64
68
  val subtitleTrack: TextTrack?
@@ -283,68 +287,136 @@ class WebViewModel @Inject constructor(
283
287
  when (event) {
284
288
  is ErrorEvent -> {
285
289
  Log.e("AndroidPlayer", "Player error", event.error)
286
- jsBridge.bridgeAndroidToJavaScript_ErrorEvent(MediaEventType.ERROR, "${event.error.message} - ${event.error.nativeCode}")
290
+ jsBridge.bridgeAndroidToJavaScript_ErrorEvent(
291
+ MediaEventType.ERROR,
292
+ "${event.error.message} - ${event.error.nativeCode}"
293
+ )
287
294
  stopPlayer()
288
295
  }
296
+
289
297
  is LoadedMetadataEvent -> {
290
298
  jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.LOADEDMETADATA)
291
- jsBridge.bridgeAndroidToJavaScript_MediaTrackEvent(MediaEventType.TRACKS_CHANGED, player.audioTracks, player.textTracks)
299
+ jsBridge.bridgeAndroidToJavaScript_MediaTrackEvent(
300
+ MediaEventType.TRACKS_CHANGED,
301
+ player.audioTracks,
302
+ player.textTracks
303
+ )
292
304
  }
305
+
293
306
  is LoadedDataEvent -> {
294
307
  jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.LOADEDDATA)
295
308
  }
309
+
296
310
  is CanPlayEvent -> {
297
311
  jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.CANPLAY)
298
312
  }
313
+
299
314
  is EndedEvent -> {
300
315
  jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.ENDED)
301
316
  }
317
+
302
318
  is WaitingEvent -> {
303
319
  jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.WAITING)
304
320
  }
321
+
305
322
  is PlayingEvent -> {
306
323
  view?.setBlackCurtainVisibility(View.GONE)
307
324
  jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.PLAYING)
308
325
  }
326
+
309
327
  is SeekingEvent -> {
310
328
  jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.SEEKING)
311
329
  }
330
+
312
331
  is SeekedEvent -> {
313
332
  jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.SEEKED)
314
333
  }
334
+
315
335
  is TimeUpdateEvent -> {
316
336
  if (player.playing) {
317
337
  jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.TIME_UPDATE)
318
338
  }
319
339
  }
340
+
320
341
  is PauseEvent -> {
321
342
  if (!player.playing) {
322
343
  jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.PAUSE)
323
344
  }
324
345
  }
346
+
325
347
  is AddAudioTrackEvent, is AddTextTrackEvent,
326
348
  is RemoveAudioTrackEvent, is RemoveTextTrackEvent,
327
349
  is ChangeAudioTrackEvent, is ChangeTextTrackEvent -> {
328
350
  Log.d("WebViewModel", "onTrackschanged: audio=$audioTrack subtitle=$subtitleTrack")
329
- jsBridge.bridgeAndroidToJavaScript_MediaTrackEvent(MediaEventType.TRACKS_CHANGED, player.audioTracks, player.textTracks)
351
+ jsBridge.bridgeAndroidToJavaScript_MediaTrackEvent(
352
+ MediaEventType.TRACKS_CHANGED,
353
+ player.audioTracks,
354
+ player.textTracks
355
+ )
330
356
  }
357
+
331
358
  is AdBreaksRescheduledEvent -> {
332
- jsBridge.bridgeAndroidToJavaScript_MediaAdBreaksEvent(MediaEventType.AD_BREAKS_RESCHEDULED, player.timeline)
359
+ jsBridge.bridgeAndroidToJavaScript_MediaAdBreaksEvent(
360
+ MediaEventType.AD_BREAKS_RESCHEDULED,
361
+ player.timeline
362
+ )
333
363
  }
364
+
334
365
  is AdBreakStartedEvent -> {
335
- jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(MediaEventType.AD_BREAK_START, player.currentAdBreak, player.currentAd)
366
+ jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(
367
+ MediaEventType.AD_BREAK_START,
368
+ player.currentAdBreak,
369
+ player.currentAd
370
+ )
336
371
  }
372
+
337
373
  is AdBreakEndedEvent -> {
338
- jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(MediaEventType.AD_BREAK_END, player.currentAdBreak, player.currentAd)
374
+ if (adStarted) {
375
+ jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(
376
+ MediaEventType.AD_ENDED,
377
+ player.currentAdBreak,
378
+ null
379
+ )
380
+ }
381
+ adStarted = false
382
+ jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(
383
+ MediaEventType.AD_BREAK_END,
384
+ player.currentAdBreak,
385
+ player.currentAd
386
+ )
339
387
  }
388
+
340
389
  is AdStartedEvent -> {
341
- jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(MediaEventType.AD_STARTED, player.currentAdBreak, player.currentAd)
390
+ if (adStarted) {
391
+ jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(
392
+ MediaEventType.AD_ENDED,
393
+ player.currentAdBreak,
394
+ null
395
+ )
396
+ } else {
397
+ adStarted = true
398
+ }
399
+ jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(
400
+ MediaEventType.AD_STARTED,
401
+ player.currentAdBreak,
402
+ player.currentAd
403
+ )
342
404
  }
405
+
343
406
  is AdErrorEvent -> {
344
- jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(MediaEventType.AD_ERROR, player.currentAdBreak, player.currentAd)
407
+ jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(
408
+ MediaEventType.AD_ERROR,
409
+ player.currentAdBreak,
410
+ player.currentAd
411
+ )
345
412
  }
413
+
346
414
  is AdSkippedEvent -> {
347
- jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(MediaEventType.AD_SKIPPED, player.currentAdBreak, player.currentAd)
415
+ jsBridge.bridgeAndroidToJavaScript_MediaAdEvent(
416
+ MediaEventType.AD_SKIPPED,
417
+ player.currentAdBreak,
418
+ player.currentAd
419
+ )
348
420
  }
349
421
  }
350
422
  }
@@ -557,6 +629,30 @@ class WebViewModel @Inject constructor(
557
629
  }
558
630
  }
559
631
 
632
+ val adId get() = try {
633
+ // Let's try Google first
634
+ AdvertisingIdClient.getAdvertisingIdInfo(context).id
635
+ } catch (e: GooglePlayServicesNotAvailableException) {
636
+ // Probably Amazon
637
+ try {
638
+ Settings.Secure.getString(context.contentResolver, "advertising_id")
639
+ } catch (snfe: Settings.SettingNotFoundException) {
640
+ null
641
+ }
642
+ }
643
+
644
+ val limitAdTracking get() = try {
645
+ // Let's try Google first
646
+ AdvertisingIdClient.getAdvertisingIdInfo(context).isLimitAdTrackingEnabled
647
+ } catch (e: GooglePlayServicesNotAvailableException) {
648
+ // Probably Amazon
649
+ try {
650
+ Settings.Secure.getInt(context.contentResolver, "limit_ad_tracking") != 0
651
+ } catch (snfe: Settings.SettingNotFoundException) {
652
+ null
653
+ }
654
+ }
655
+
560
656
  private inner class InnerIapCallback : IapCallback {
561
657
  override fun checkNewPurchasesFinished(result: List<IapPurchase>) {
562
658
  // not actually used at the moment
@@ -1,12 +1,12 @@
1
1
  buildscript {
2
- ext.kotlin_version = '1.9.22'
2
+ ext.kotlin_version = '2.1.20'
3
3
 
4
4
  repositories {
5
5
  google()
6
6
  mavenCentral()
7
7
  }
8
8
  dependencies {
9
- classpath 'com.android.tools.build:gradle:8.5.1'
9
+ classpath 'com.android.tools.build:gradle:8.9.1'
10
10
  classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
11
11
  classpath 'com.google.gms:google-services:4.4.2'
12
12
  classpath 'com.google.firebase:firebase-crashlytics-gradle:3.0.2'
@@ -1,6 +1,6 @@
1
- #Thu Jun 02 10:20:44 CEST 2022
1
+ #Tue Apr 08 16:51:49 CEST 2025
2
2
  distributionBase=GRADLE_USER_HOME
3
- distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
4
3
  distributionPath=wrapper/dists
5
- zipStorePath=wrapper/dists
4
+ distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
6
5
  zipStoreBase=GRADLE_USER_HOME
6
+ zipStorePath=wrapper/dists
@@ -13,6 +13,7 @@
13
13
  <tizen:privilege name="http://developer.samsung.com/privilege/productinfo"/>
14
14
  <tizen:privilege name="http://tizen.org/privilege/internet"/>
15
15
  <tizen:privilege name="http://tizen.org/privilege/tv.inputdevice"/>
16
+ <tizen:privilege name="http://developer.samsung.com/privilege/adinfo"/>
16
17
  <tizen:setting screen-orientation="landscape" context-menu="enable" background-support="disable" encryption="disable" install-location="auto" hwkey-event="enable"/>
17
18
  <tizen:metadata key="http://samsung.com/tv/metadata/use.voiceguide" value="false"/>
18
19
  </widget>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@24i/smartapps-bigscreen-rnv-build-engine",
3
- "version": "0.17.27-alpha.2774",
3
+ "version": "0.17.27-alpha.2785",
4
4
  "description": "Package with build engine for SmartApps BIGscreen projects...",
5
5
  "main": "dist/src/index.js",
6
6
  "scripts": {