@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.
- package/dist/templates/platforms/androidtv/project/amazoniap/build.gradle +1 -3
- package/dist/templates/platforms/androidtv/project/app/build.gradle +50 -28
- package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/raw/configuration.json +4 -1
- package/dist/templates/platforms/androidtv/project/app/src/kan/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/kan/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kan/res/raw/configuration.json +9 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/AndroidManifest.xml +8 -2
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/bridge/BridgeFromJavaScript.kt +19 -13
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/bridge/BridgeToJavaScript.kt +32 -14
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/BridgeConfig.kt +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ActivityModule.kt +5 -3
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/LoggingDrmCallback.kt +15 -23
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/OverriddenHttpMediaDrmCallback.kt +134 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/PlayerFactoryExoPlayerCustomized.kt +84 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/SourceDrmOverridden.kt +49 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/jump/JumpAnalytics.kt +4 -2
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/client/BridgeWebView.kt +2 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/MediaEventType.kt +3 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/TrackJsonModelParser.kt +37 -55
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/Mainview.kt +1 -3
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/PlayerCache.kt +2 -2
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/WebViewActivity.kt +40 -18
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/viewmodel/WebViewModel.kt +173 -171
- package/dist/templates/platforms/androidtv/project/app/src/main/res/layout/activity_web_view.xml +2 -4
- package/dist/templates/platforms/androidtv/project/app/src/main/res/values/styles.xml +1 -0
- package/dist/templates/platforms/androidtv/project/build.gradle +5 -9
- package/dist/templates/platforms/androidtv/project/common/build.gradle +1 -3
- package/dist/templates/platforms/androidtv/project/googleiap/build.gradle +1 -3
- package/dist/templates/platforms/androidtv/project/gradle/wrapper/gradle-wrapper.properties +3 -3
- package/dist/templates/platforms/androidtv/project/gradle.properties +1 -2
- package/dist/templates/platforms/androidtv/project/keystore/kan11_applicaster.keystore +0 -0
- package/dist/templates/platforms/androidtv/project/local.properties +8 -0
- 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
|
|
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
|
|
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
|
|
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
|
|
238
|
-
versionName "
|
|
239
|
-
applicationId "
|
|
240
|
-
resValue "string", "app_name", "
|
|
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-
|
|
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.
|
|
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
|
|
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
|
|
331
|
-
implementation 'com.google.firebase:firebase-crashlytics:18.2.
|
|
332
|
-
implementation 'com.google.firebase:firebase-analytics:
|
|
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.
|
|
335
|
-
kapt "com.google.dagger:dagger-compiler:2.
|
|
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:
|
|
340
|
-
implementation "com.squareup.okhttp3:okhttp:
|
|
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.
|
|
359
|
-
androidTestImplementation "androidx.test:rules:1.
|
|
360
|
-
androidTestImplementation 'androidx.test.ext:junit:1.1.
|
|
361
|
-
androidTestImplementation "androidx.test.espresso:espresso-core:3.
|
|
362
|
-
androidTestImplementation "androidx.test.espresso:espresso-web:3.
|
|
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
|
}
|
package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/drawable/banner.png
CHANGED
|
Binary file
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
{
|
|
2
|
-
"baseUrl": "
|
|
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
|
}
|
|
Binary file
|
package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-hdpi/ic_launcher.png
ADDED
|
Binary file
|
package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-mdpi/ic_launcher.png
ADDED
|
Binary file
|
package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-xhdpi/ic_launcher.png
ADDED
|
Binary file
|
package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-xxhdpi/ic_launcher.png
ADDED
|
Binary file
|
package/dist/templates/platforms/androidtv/project/app/src/kan/res/mipmap-xxxhdpi/ic_launcher.png
ADDED
|
Binary file
|
|
@@ -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:
|
|
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.
|
|
10
|
-
import com.twentyfouri.
|
|
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.
|
|
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() /
|
|
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(
|
|
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(
|
|
240
|
+
viewModel.setSubtitleTrack(null)
|
|
238
241
|
} else if (trackJson == "false") {
|
|
239
242
|
Log.d(LOG_TAG, "bridgeJavaScriptToAndroid_SetTrack false => DISABLED")
|
|
240
|
-
viewModel.setSubtitleTrack(
|
|
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(
|
|
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(
|
|
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",
|
|
379
|
+
addProperty("type", "audio")
|
|
374
380
|
}.toString()
|
|
375
381
|
val DISABLED_SUBTITLE_TRACK = JsonObject().apply {
|
|
376
|
-
addProperty("type",
|
|
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.
|
|
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
|
-
|
|
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(
|
|
39
|
-
|
|
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(
|
|
52
|
-
|
|
53
|
-
|
|
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.
|
|
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
|
-
|
|
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.
|
|
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
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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: $
|
|
23
|
+
Log.v(TAG, "DRM Default URL: $licenseUrl")
|
|
24
24
|
Log.v(TAG, "DRM request:\n${request.data.toBase64()}")
|
|
25
25
|
}
|
|
26
|
-
val response =
|
|
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
|
-
|
|
36
|
+
const val TAG = "DrmCallback"
|
|
45
37
|
}
|
|
46
38
|
}
|