@24i/smartapps-bigscreen-rnv-build-engine 0.17.2-alpha.2163 → 0.17.2-alpha.2164

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 (39) hide show
  1. package/dist/templates/platforms/androidtv/project/amazoniap/build.gradle +1 -3
  2. package/dist/templates/platforms/androidtv/project/app/build.gradle +50 -28
  3. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/drawable/banner.png +0 -0
  4. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/raw/configuration.json +4 -1
  5. package/dist/templates/platforms/androidtv/project/app/src/kan/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  6. package/dist/templates/platforms/androidtv/project/app/src/kan/res/drawable/banner.png +0 -0
  7. package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-hdpi/ic_launcher.png +0 -0
  8. package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-mdpi/ic_launcher.png +0 -0
  9. package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-xhdpi/ic_launcher.png +0 -0
  10. package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  11. package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  12. package/dist/templates/platforms/androidtv/project/app/src/kan/res/raw/configuration.json +9 -0
  13. package/dist/templates/platforms/androidtv/project/app/src/main/AndroidManifest.xml +8 -2
  14. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/bridge/BridgeFromJavaScript.kt +19 -13
  15. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/bridge/BridgeToJavaScript.kt +32 -14
  16. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/BridgeConfig.kt +7 -0
  17. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ActivityModule.kt +5 -3
  18. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/LoggingDrmCallback.kt +15 -23
  19. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/OverriddenHttpMediaDrmCallback.kt +134 -0
  20. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/PlayerFactoryExoPlayerCustomized.kt +84 -0
  21. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/SourceDrmOverridden.kt +49 -0
  22. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/jump/JumpAnalytics.kt +4 -2
  23. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/client/BridgeWebView.kt +2 -0
  24. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/MediaEventType.kt +3 -0
  25. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/TrackJsonModelParser.kt +37 -55
  26. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/Mainview.kt +1 -3
  27. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/PlayerCache.kt +2 -2
  28. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/WebViewActivity.kt +40 -18
  29. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/viewmodel/WebViewModel.kt +173 -171
  30. package/dist/templates/platforms/androidtv/project/app/src/main/res/layout/activity_web_view.xml +2 -4
  31. package/dist/templates/platforms/androidtv/project/app/src/main/res/values/styles.xml +1 -0
  32. package/dist/templates/platforms/androidtv/project/build.gradle +5 -9
  33. package/dist/templates/platforms/androidtv/project/common/build.gradle +1 -3
  34. package/dist/templates/platforms/androidtv/project/googleiap/build.gradle +1 -3
  35. package/dist/templates/platforms/androidtv/project/gradle/wrapper/gradle-wrapper.properties +3 -3
  36. package/dist/templates/platforms/androidtv/project/gradle.properties +1 -2
  37. package/dist/templates/platforms/androidtv/project/keystore/kan11_applicaster.keystore +0 -0
  38. package/dist/templates/platforms/androidtv/project/local.properties +8 -0
  39. package/package.json +1 -1
@@ -1,10 +1,8 @@
1
1
  apply plugin: 'com.android.library'
2
2
  apply plugin: 'kotlin-android'
3
- apply plugin: 'kotlin-android-extensions'
4
3
 
5
4
  android {
6
- compileSdkVersion 30
7
- buildToolsVersion "30.0.2"
5
+ compileSdkVersion 31
8
6
 
9
7
  compileOptions {
10
8
  sourceCompatibility JavaVersion.VERSION_1_8
@@ -1,22 +1,29 @@
1
1
  apply plugin: 'com.android.application'
2
2
  apply plugin: 'kotlin-android'
3
- apply plugin: 'kotlin-android-extensions'
4
3
  apply plugin: 'kotlin-kapt'
5
4
  apply plugin: 'com.google.gms.google-services'
6
5
  apply plugin: 'com.google.firebase.crashlytics'
7
6
 
8
7
  android {
9
- compileSdkVersion 30
10
- buildToolsVersion "30.0.2"
8
+ compileSdkVersion 31
11
9
 
12
10
  compileOptions {
13
11
  sourceCompatibility JavaVersion.VERSION_1_8
14
12
  targetCompatibility JavaVersion.VERSION_1_8
15
13
  }
16
14
 
15
+ kotlinOptions {
16
+ jvmTarget = '1.8'
17
+ freeCompilerArgs = ['-Xjvm-default=compatibility']
18
+ }
19
+
20
+ packagingOptions {
21
+ exclude 'META-INF/*.kotlin_module'
22
+ }
23
+
17
24
  defaultConfig {
18
25
  minSdkVersion 21
19
- targetSdkVersion 30
26
+ targetSdkVersion 31
20
27
 
21
28
  applicationId 'com.twentyfouri.tvbridge'
22
29
  versionCode 1
@@ -44,11 +51,19 @@ android {
44
51
  v1SigningEnabled true
45
52
  v2SigningEnabled true
46
53
  }
47
- bbg {
54
+ /*bbg {
48
55
  storeFile file('/Users/matus/StudioProjects/Keystores/pureflix.jks')
49
56
  storePassword 'freddie12'
50
57
  keyPassword 'freddie12'
51
58
  keyAlias 'iamflix-app'
59
+ }*/
60
+ kan {
61
+ keyAlias 'ireshet'
62
+ keyPassword 'applicaster'
63
+ storeFile file('../keystore/kan11_applicaster.keystore')
64
+ storePassword 'applicaster'
65
+ v1SigningEnabled true
66
+ v2SigningEnabled true
52
67
  }
53
68
  }
54
69
 
@@ -60,7 +75,6 @@ android {
60
75
  release {
61
76
  minifyEnabled true
62
77
  proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
63
- signingConfig signingConfigs.pureflix
64
78
  }
65
79
  }
66
80
 
@@ -234,10 +248,19 @@ android {
234
248
  bigscreenAppstage {
235
249
  // X.Y.Z XXYYZZUU -> version 1.2.3 will be 01020300, 5th update of 1.2.3 will be 01020305
236
250
  dimension "bridge"
237
- versionCode {{APP_VERSION_CODE}}
238
- versionName "{{APP_VERSION_NAME}}"
239
- applicationId "{{APP_ID}}"
240
- resValue "string", "app_name", "{{configProps.appName}}"
251
+ versionCode 1000100
252
+ versionName "1.0.1"
253
+ applicationId "com.twentyfouri.app.appstagebigscreen"
254
+ resValue "string", "app_name", "Appstage BIGscreen"
255
+ }
256
+ kan {
257
+ // X.Y.Z XXYYZZUU -> version 1.2.3 will be 01020300, 5th update of 1.2.3 will be 01020305
258
+ dimension "bridge"
259
+ versionCode 5407
260
+ versionName "54.0.7"
261
+ applicationId "com.applicaster.il.ch1"
262
+ resValue "string", "app_name", "כאן BOX"
263
+ signingConfig signingConfigs.kan
241
264
  }
242
265
  pureflix {
243
266
  // X.Y.Z XXYYZZUU -> version 1.2.3 will be 01020300, 5th update of 1.2.3 will be 01020305
@@ -320,29 +343,28 @@ android.applicationVariants.all { variant ->
320
343
 
321
344
  dependencies {
322
345
  implementation fileTree(include: ['*.jar'], dir: 'libs')
323
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
346
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
324
347
  api "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
325
- api "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3"
348
+ api "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.2"
326
349
 
327
350
  compileOnly "javax.annotation:jsr250-api:1.0"
328
- implementation "androidx.appcompat:appcompat:1.2.0"
351
+ implementation "androidx.appcompat:appcompat:1.4.2"
329
352
  implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"
330
- implementation "androidx.recyclerview:recyclerview:1.1.0"
331
- implementation 'com.google.firebase:firebase-crashlytics:18.2.0'
332
- implementation 'com.google.firebase:firebase-analytics:19.0.0'
353
+ implementation "androidx.recyclerview:recyclerview:1.2.1"
354
+ implementation 'com.google.firebase:firebase-crashlytics:18.2.11'
355
+ implementation 'com.google.firebase:firebase-analytics:21.0.0'
333
356
 
334
- implementation "com.google.dagger:dagger:2.29"
335
- kapt "com.google.dagger:dagger-compiler:2.29"
357
+ implementation "com.google.dagger:dagger:2.42"
358
+ kapt "com.google.dagger:dagger-compiler:2.42"
336
359
 
337
360
  implementation "com.squareup.retrofit2:retrofit:2.9.0"
338
361
  implementation "com.squareup.retrofit2:converter-gson:2.5.0"
339
- implementation "com.squareup.okhttp3:logging-interceptor:3.12.0"
340
- implementation "com.squareup.okhttp3:okhttp:3.12.11"
362
+ implementation "com.squareup.okhttp3:logging-interceptor:4.9.2"
363
+ implementation "com.squareup.okhttp3:okhttp:4.9.2"
364
+ implementation "com.twentyfouri.player:exoplayer:0.6.0-alpha.23"
365
+ implementation 'com.google.android.exoplayer:extension-okhttp:2.17.1'
341
366
  implementation "com.jumptvs.jumpkit:jumpkit-exoplayer:2.6.5"
342
367
 
343
- implementation "com.twentyfouri.smartexoplayer:smartexoplayer:4.0.23"
344
- implementation "com.twentyfouri.androidcore:chromecast:2.1.5"
345
-
346
368
  implementation project(':common')
347
369
  portalImplementation project(':amazoniap')
348
370
  portalImplementation project(':googleiap')
@@ -355,11 +377,11 @@ dependencies {
355
377
  androidTestImplementation "com.squareup.retrofit2:retrofit-mock:2.5.0"
356
378
  androidTestImplementation "com.squareup.okhttp:mockwebserver:2.7.0"
357
379
  androidTestImplementation "com.squareup.spoon:spoon-client:1.2.0"
358
- androidTestImplementation "androidx.test:runner:1.3.0"
359
- androidTestImplementation "androidx.test:rules:1.3.0"
360
- androidTestImplementation 'androidx.test.ext:junit:1.1.2'
361
- androidTestImplementation "androidx.test.espresso:espresso-core:3.3.0"
362
- androidTestImplementation "androidx.test.espresso:espresso-web:3.3.0"
380
+ androidTestImplementation "androidx.test:runner:1.4.0"
381
+ androidTestImplementation "androidx.test:rules:1.4.0"
382
+ androidTestImplementation 'androidx.test.ext:junit:1.1.3'
383
+ androidTestImplementation "androidx.test.espresso:espresso-core:3.4.0"
384
+ androidTestImplementation "androidx.test.espresso:espresso-web:3.4.0"
363
385
  androidTestImplementation('com.github.andrzejchm.RESTMock:android:0.3.1') {
364
386
  exclude module: 'support-annotations'
365
387
  }
@@ -1,5 +1,8 @@
1
1
  {
2
- "baseUrl": "{{APP_URL}}",
2
+ "baseUrl": "http://appstage-bigscreen.kan.24imedia.com.s3.amazonaws.com/builds/androidtv/animated_1080/dist/v0.0.9/public/index.html",
3
+ "customizableUrl": false,
4
+ "mediaEventPrefix": "player:",
5
+ "startWithHighVideoQuality": true,
3
6
  "drm": {
4
7
  "overrideDrmCallback": true
5
8
  }
@@ -0,0 +1,5 @@
1
+ package com.twentyfouri.tvbridge
2
+
3
+ class Flavor: FlavorBase() {
4
+
5
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "baseUrl": "http://appstage-bigscreen.kan.24imedia.com.s3.amazonaws.com/builds/androidtv/animated_1080/live/public/index.html",
3
+ "customizableUrl": false,
4
+ "mediaEventPrefix": "player:",
5
+ "startWithHighVideoQuality": true,
6
+ "drm": {
7
+ "overrideDrmCallback": true
8
+ }
9
+ }
@@ -15,6 +15,9 @@
15
15
 
16
16
  <uses-permission android:name="android.permission.WAKE_LOCK" />
17
17
 
18
+ <uses-permission android:name="com.google.android.assistant.READ_HOTWORD_STATE" />
19
+ <uses-permission android:name="com.google.android.assistant.WRITE_HOTWORD_STATE" />
20
+
18
21
  <application
19
22
  android:name=".global.BaseApplication"
20
23
  android:allowBackup="true"
@@ -27,7 +30,9 @@
27
30
  android:theme="@style/AppTheme">
28
31
  <activity
29
32
  android:name=".webview.view.WebViewActivity"
30
- android:label="@string/app_name">
33
+ android:hardwareAccelerated="true"
34
+ android:label="@string/app_name"
35
+ android:exported="true">
31
36
  <intent-filter>
32
37
  <action android:name="android.intent.action.MAIN" />
33
38
 
@@ -36,7 +41,8 @@
36
41
  </intent-filter>
37
42
  </activity>
38
43
  <receiver android:name="com.amazon.device.iap.ResponseReceiver"
39
- android:permission="com.amazon.inapp.purchasing.Permission.NOTIFY">
44
+ android:permission="com.amazon.inapp.purchasing.Permission.NOTIFY"
45
+ android:exported="true">
40
46
  <intent-filter>
41
47
  <action
42
48
  android:name="com.amazon.inapp.purchasing.NOTIFY" />
@@ -6,18 +6,20 @@ import android.os.Looper
6
6
  import android.util.Log
7
7
  import android.webkit.JavascriptInterface
8
8
  import com.google.gson.JsonObject
9
- import com.twentyfouri.smartexoplayer.tracks.TrackInfo
10
- import com.twentyfouri.smartexoplayer.tracks.TrackPreference
9
+ import com.twentyfouri.player.base.TextTrack
10
+ import com.twentyfouri.player.base.TrackKind
11
11
  import com.twentyfouri.tvbridge.webview.parser.ContentModelParser.stringToJson
12
12
  import com.twentyfouri.tvbridge.webview.parser.DeviceInfoParser.deviceInfoParsed
13
13
  import com.twentyfouri.tvbridge.webview.parser.PlaybackInfoParser.parse
14
- import com.twentyfouri.tvbridge.webview.parser.TrackJsonModelParser.fromJson
14
+ import com.twentyfouri.tvbridge.webview.parser.TrackJsonModelParser.audioFromJson
15
+ import com.twentyfouri.tvbridge.webview.parser.TrackJsonModelParser.textFromJson
15
16
  import com.twentyfouri.tvbridge.webview.parser.TrackJsonModelParser.toJson
16
17
  import com.twentyfouri.tvbridge.webview.viewmodel.WebViewModel
17
18
  import java.text.SimpleDateFormat
18
19
  import java.util.*
19
20
  import java.util.concurrent.CountDownLatch
20
21
  import java.util.concurrent.TimeUnit
22
+ import kotlin.math.roundToInt
21
23
 
22
24
  @SuppressWarnings("unused")
23
25
  class BridgeFromJavaScript(
@@ -67,6 +69,7 @@ class BridgeFromJavaScript(
67
69
  fun bridgeJavaScriptToAndroid_SetVideoPath(jsonString: String, mimeType: String?) = launch {
68
70
  Log.d(LOG_TAG, "bridgeJavaScriptToAndroid_SetVideoPath = $jsonString")
69
71
  try {
72
+ viewModel.stopPlayer()
70
73
  val contentModel = stringToJson(jsonString)
71
74
  contentModel?.streamType = mimeType?.let {
72
75
  when {
@@ -136,7 +139,7 @@ class BridgeFromJavaScript(
136
139
  */
137
140
  @JavascriptInterface
138
141
  fun bridgeJavaScriptToAndroid_GetCurrentTime(): Int = runBlocking("bridgeJavaScriptToAndroid_GetCurrentTime") {
139
- viewModel.currentPosition / 1000
142
+ viewModel.currentPosition.roundToInt() / 1000
140
143
  } ?: 0
141
144
 
142
145
  /*
@@ -144,7 +147,7 @@ class BridgeFromJavaScript(
144
147
  */
145
148
  @JavascriptInterface
146
149
  fun bridgeJavaScriptToAndroid_GetCurrentTimeFloat(): Float = runBlocking("bridgeJavaScriptToAndroid_GetCurrentTimeFloat") {
147
- viewModel.currentPosition.toFloat() / 1000f
150
+ viewModel.currentPosition.toFloat() / 1000
148
151
  } ?: 0f
149
152
 
150
153
  /*
@@ -163,7 +166,7 @@ class BridgeFromJavaScript(
163
166
  */
164
167
  @JavascriptInterface
165
168
  fun bridgeJavaScriptToAndroid_GetTotalTime(): Int = runBlocking("bridgeJavaScriptToAndroid_GetTotalTime") {
166
- viewModel.duration / 1000
169
+ viewModel.duration.roundToInt() / 1000
167
170
  } ?: 0
168
171
 
169
172
  /*
@@ -173,7 +176,7 @@ class BridgeFromJavaScript(
173
176
  @JavascriptInterface
174
177
  fun bridgeJavaScriptToAndroid_SeekTo(seconds: Int) = launch {
175
178
  Log.d(LOG_TAG, "bridgeJavaScriptToAndroid_SeekTo($seconds)")
176
- viewModel.seekToPosition(seconds * 1000)
179
+ viewModel.seekToPosition(1000 * seconds.toDouble())
177
180
  }
178
181
 
179
182
  /*
@@ -234,13 +237,16 @@ class BridgeFromJavaScript(
234
237
  fun bridgeJavaScriptToAndroid_SetTrack(trackJson: String) = launch {
235
238
  if (trackJson == "") {
236
239
  Log.d(LOG_TAG, "bridgeJavaScriptToAndroid_SetTrack empty => DEFAULT")
237
- viewModel.setSubtitleTrack(TrackPreference.DEFAULT)
240
+ viewModel.setSubtitleTrack(null)
238
241
  } else if (trackJson == "false") {
239
242
  Log.d(LOG_TAG, "bridgeJavaScriptToAndroid_SetTrack false => DISABLED")
240
- viewModel.setSubtitleTrack(TrackPreference.DISABLED)
243
+ viewModel.setSubtitleTrack(TextTrack {
244
+ id = "text_off"
245
+ kind = TrackKind.EMPTY
246
+ })
241
247
  } else {
242
248
  Log.d(LOG_TAG, "bridgeJavaScriptToAndroid_SetTrack $trackJson")
243
- viewModel.setSubtitleTrack(fromJson(trackJson))
249
+ viewModel.setSubtitleTrack(textFromJson(trackJson))
244
250
  }
245
251
  }
246
252
 
@@ -250,7 +256,7 @@ class BridgeFromJavaScript(
250
256
  @JavascriptInterface
251
257
  fun bridgeJavaScriptToAndroid_SetAudioTrack(trackJson: String?) = launch {
252
258
  Log.d(LOG_TAG, "bridgeJavaScriptToAndroid_SetAudioTrack ${trackJson ?: "(none)"}")
253
- viewModel.setAudioTrack(fromJson(trackJson))
259
+ viewModel.setAudioTrack(audioFromJson(trackJson))
254
260
  }
255
261
 
256
262
  /*
@@ -370,10 +376,10 @@ class BridgeFromJavaScript(
370
376
  companion object {
371
377
  const val LOG_TAG = "JavaScriptBridge"
372
378
  val DISABLED_AUDIO_TRACK = JsonObject().apply {
373
- addProperty("type", TrackInfo.TYPE_AUDIO)
379
+ addProperty("type", "audio")
374
380
  }.toString()
375
381
  val DISABLED_SUBTITLE_TRACK = JsonObject().apply {
376
- addProperty("type", TrackInfo.TYPE_SUBTITLES)
382
+ addProperty("type", "subtitles")
377
383
  }.toString()
378
384
  }
379
385
  }
@@ -1,13 +1,20 @@
1
1
  package com.twentyfouri.tvbridge.bridge
2
2
 
3
3
  import android.util.Log
4
- import com.twentyfouri.smartexoplayer.tracks.TrackInfo
4
+ import com.twentyfouri.player.base.AudioTrack
5
+ import com.twentyfouri.player.base.TextTrack
5
6
  import com.twentyfouri.tvbridge.bridge.BridgeFromJavaScript.Companion.LOG_TAG
7
+ import com.twentyfouri.tvbridge.configuration.BridgeConfig
6
8
  import com.twentyfouri.tvbridge.webview.parser.TrackJsonModelParser.toJson
7
9
 
8
10
  class BridgeToJavaScript(
9
- private val executeJavaScript: (String) -> Unit
11
+ config: BridgeConfig,
12
+ private val executeJavaScript: (String) -> Unit
10
13
  ) {
14
+ private val keyEventPrefix: String = config.keyEventPrefix
15
+ private val mediaEventPrefix: String = config.mediaEventPrefix
16
+ private val iapEventPrefix: String = config.iapEventPrefix
17
+
11
18
  /**
12
19
  * Android 2 JavaScript keyevent Event. Dispatch key custom event to the page document element
13
20
  *
@@ -16,7 +23,7 @@ class BridgeToJavaScript(
16
23
  */
17
24
  fun bridgeAndroidToJavaScript_KeyEvent(keyCode: Int, keyEvent: String) {
18
25
  Log.d(LOG_TAG, "bridgeAndroidToJavaScript_KeyEvent keyCode = $keyCode, keyEvent = $keyEvent")
19
- executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('$keyEvent',true,true);evt.keyCode=$keyCode;evt.which=$keyCode;document.dispatchEvent(evt);})())")
26
+ executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('$keyEventPrefix$keyEvent',true,true);evt.keyCode=$keyCode;evt.which=$keyCode;(document.activeElement?document.activeElement:document).dispatchEvent(evt);})())")
20
27
  }
21
28
 
22
29
  /**
@@ -25,8 +32,8 @@ class BridgeToJavaScript(
25
32
  * @param mediaEvent the mediaEvent which is being sent from the Android code.
26
33
  */
27
34
  fun bridgeAndroidToJavaScript_MediaEvent(mediaEvent: String) {
28
- Log.d(LOG_TAG, "bridgeAndroidToJavaScript_MediaEvent $mediaEvent")
29
- executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('$mediaEvent',true,true);document.dispatchEvent(evt);})())")
35
+ Log.d(LOG_TAG, "bridgeAndroidToJavaScript_MediaEvent $mediaEventPrefix$mediaEvent")
36
+ executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('$mediaEventPrefix$mediaEvent',true,true);document.dispatchEvent(evt);})())")
30
37
  }
31
38
 
32
39
  /**
@@ -35,31 +42,42 @@ class BridgeToJavaScript(
35
42
  * @param mediaEvent the mediaEvent
36
43
  * @param tracks tracks from the players stream.
37
44
  */
38
- fun bridgeAndroidToJavaScript_MediaTrackEvent(mediaEvent: String, tracks: List<TrackInfo>) {
39
- val tracksJson = toJson(tracks)
45
+ fun bridgeAndroidToJavaScript_MediaTrackEvent(
46
+ mediaEvent: String,
47
+ audioTracks: List<AudioTrack>,
48
+ textTracks: List<TextTrack>
49
+ ) {
50
+ val tracksJson = toJson(audioTracks, textTracks)
40
51
  Log.d(LOG_TAG, tracksJson)
41
- val mediaEventString = "javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('$mediaEvent',true,true);evt.tracks='$tracksJson';document.dispatchEvent(evt);})())"
52
+ val mediaEventString = "javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('$mediaEventPrefix$mediaEvent',true,true);evt.tracks='$tracksJson';document.dispatchEvent(evt);})())"
42
53
  Log.v(LOG_TAG, mediaEventString)
43
54
  executeJavaScript(mediaEventString)
44
55
  }
45
56
 
46
57
  fun bridgeAndroidToJavaScript_IAPValidationError(message: String) {
47
58
  Log.d(LOG_TAG, "bridgeAndroidToJavaScript_IAPValidationError")
48
- executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('iapError',true,true);evt.message='$message';document.dispatchEvent(evt);})())")
59
+ executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('${iapEventPrefix}iapError',true,true);evt.message='$message';document.dispatchEvent(evt);})())")
49
60
  }
50
61
 
51
- fun bridgeAndroidToJavaScript_IAPValidationSuccess(userId: String, receiptId: String, sku: String) {
52
- Log.d(LOG_TAG, "bridgeAndroidToJavaScript_IAPValidationSuccess sku=$sku receiptId=$receiptId")
53
- executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('iapSuccess',true,true);evt.userId='$userId';evt.receiptId='$receiptId';evt.sku='$sku';document.dispatchEvent(evt);})())")
62
+ fun bridgeAndroidToJavaScript_IAPValidationSuccess(
63
+ userId: String,
64
+ receiptId: String,
65
+ sku: String
66
+ ) {
67
+ Log.d(
68
+ LOG_TAG,
69
+ "bridgeAndroidToJavaScript_IAPValidationSuccess sku=$sku receiptId=$receiptId"
70
+ )
71
+ executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('${iapEventPrefix}iapSuccess',true,true);evt.userId='$userId';evt.receiptId='$receiptId';evt.sku='$sku';document.dispatchEvent(evt);})())")
54
72
  }
55
73
 
56
74
  fun bridgeIAPGetProductDataSuccess(okSkus: String, badSkus: String) {
57
75
  Log.d(LOG_TAG, "bridgeIAPGetProductDataSuccess ok=$okSkus bad=$badSkus")
58
- executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('onInAppProductDetailSuccess',true,true);evt.okSkus=$okSkus;evt.badSkus=$badSkus;document.dispatchEvent(evt);})())")
76
+ executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('${iapEventPrefix}onInAppProductDetailSuccess',true,true);evt.okSkus=$okSkus;evt.badSkus=$badSkus;document.dispatchEvent(evt);})())")
59
77
  }
60
78
 
61
79
  fun bridgeIAPGetProductDataFail(reason: String) {
62
80
  Log.d(LOG_TAG, "bridgeIAPGetProductDataFail")
63
- executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('onInAppProductDetailError',true,true);evt.message='$reason';document.dispatchEvent(evt);})())")
81
+ executeJavaScript("javascript:((function dispatchEvent(){var evt = document.createEvent('Events');evt.initEvent('${iapEventPrefix}onInAppProductDetailError',true,true);evt.message='$reason';document.dispatchEvent(evt);})())")
64
82
  }
65
83
  }
@@ -1,9 +1,16 @@
1
1
  package com.twentyfouri.tvbridge.configuration
2
2
 
3
+ import com.twentyfouri.tvbridge.BuildConfig
4
+
3
5
  class BridgeConfig {
4
6
  var baseUrl: String = "http://portal.24imedia.tv/"
5
7
  var userAgent: UserAgent = UserAgent()
6
8
  var drm: Drm = Drm()
7
9
  var isEnabledTouchSound: Boolean = false
8
10
  var playerAppName: String? = null
11
+ var keyEventPrefix: String = ""
12
+ var mediaEventPrefix: String = ""
13
+ var iapEventPrefix: String = ""
14
+ var customizableUrl: Boolean = BuildConfig.DEBUG
15
+ var startWithHighVideoQuality: Boolean = false
9
16
  }
@@ -1,7 +1,9 @@
1
1
  package com.twentyfouri.tvbridge.global.di
2
2
 
3
3
  import android.app.Activity
4
- import com.twentyfouri.smartexoplayer.SmartPlayerFactory
4
+ import com.twentyfouri.player.base.PlayerFactoryBase
5
+ import com.twentyfouri.tvbridge.configuration.BridgeConfig
6
+ import com.twentyfouri.tvbridge.global.utils.PlayerFactoryExoPlayerCustomized
5
7
  import dagger.Module
6
8
  import dagger.Provides
7
9
 
@@ -14,6 +16,6 @@ class ActivityModule(
14
16
  activity
15
17
 
16
18
  @Provides
17
- fun providePlayerFactory() =
18
- SmartPlayerFactory(activity)
19
+ fun providePlayerFactory(config: BridgeConfig): PlayerFactoryBase =
20
+ PlayerFactoryExoPlayerCustomized(config)
19
21
  }
@@ -3,28 +3,28 @@ package com.twentyfouri.tvbridge.global.utils
3
3
  import android.util.Base64
4
4
  import android.util.Log
5
5
  import com.google.android.exoplayer2.drm.ExoMediaDrm
6
- import com.google.android.exoplayer2.upstream.HttpDataSource
7
- import com.twentyfouri.smartexoplayer.drm.SmartHttpMediaDrmCallback
8
- import com.twentyfouri.smartexoplayer.drm.SmartMediaDrmCallback
9
- import com.twentyfouri.smartexoplayer.model.DrmConfiguration
10
- import com.twentyfouri.tvbridge.BuildConfig
6
+ import com.google.android.exoplayer2.drm.MediaDrmCallback
11
7
  import java.util.*
12
8
 
13
9
  class LoggingDrmCallback(
14
- private val licenseUrl: String?,
15
- forceDefaultUrl: Boolean,
16
- dataSourceFactory: HttpDataSource.Factory
17
- ) : SmartHttpMediaDrmCallback(licenseUrl, forceDefaultUrl, dataSourceFactory) {
10
+ private val base: MediaDrmCallback,
11
+ private val licenseUrl: String? = null
12
+ ) : MediaDrmCallback {
13
+ override fun executeProvisionRequest(
14
+ uuid: UUID,
15
+ request: ExoMediaDrm.ProvisionRequest
16
+ ): ByteArray {
17
+ return base.executeProvisionRequest(uuid, request)
18
+ }
18
19
 
19
- @Throws(Exception::class)
20
20
  override fun executeKeyRequest(uuid: UUID, request: ExoMediaDrm.KeyRequest): ByteArray {
21
- if (BuildConfig.DEBUG) {
21
+ if (com.twentyfouri.player.exoplayer.BuildConfig.DEBUG) {
22
22
  Log.v(TAG, "DRM Embedded URL: ${request.licenseServerUrl}")
23
- Log.v(TAG, "DRM Default URL: ${licenseUrl}")
23
+ Log.v(TAG, "DRM Default URL: $licenseUrl")
24
24
  Log.v(TAG, "DRM request:\n${request.data.toBase64()}")
25
25
  }
26
- val response = super.executeKeyRequest(uuid, request)
27
- if (BuildConfig.DEBUG) {
26
+ val response = base.executeKeyRequest(uuid, request)
27
+ if (com.twentyfouri.player.exoplayer.BuildConfig.DEBUG) {
28
28
  Log.v(TAG, "DRM response:\n" + response.toBase64())
29
29
  }
30
30
  return response
@@ -32,15 +32,7 @@ class LoggingDrmCallback(
32
32
 
33
33
  private fun ByteArray.toBase64(): String = Base64.encodeToString(this, Base64.DEFAULT)
34
34
 
35
- class Factory(
36
- private val licenseUrl: String?,
37
- private val forceDefaultUrl: Boolean
38
- ) : SmartMediaDrmCallback.Factory {
39
- override fun build(drm: DrmConfiguration, dataSourceFactory: HttpDataSource.Factory): SmartMediaDrmCallback =
40
- LoggingDrmCallback(licenseUrl, forceDefaultUrl, dataSourceFactory)
41
- }
42
-
43
35
  companion object {
44
- private const val TAG = "DrmCallback"
36
+ const val TAG = "DrmCallback"
45
37
  }
46
38
  }