@24i/smartapps-bigscreen-rnv-build-engine 5.0.0-alpha.25 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/build-freshness.js +158 -0
  2. package/dist/.build-freshness.json +1010 -0
  3. package/dist/templates/platforms/firetv/project/README.md +196 -0
  4. package/dist/templates/platforms/firetv/project/amazoniap/build.gradle +41 -0
  5. package/dist/templates/platforms/firetv/project/amazoniap/consumer-rules.pro +0 -0
  6. package/dist/templates/platforms/firetv/project/amazoniap/proguard-rules.pro +21 -0
  7. package/dist/templates/platforms/firetv/project/amazoniap/src/main/kotlin/com/twentyfouri/bridgetv/amazoniap/AmazonIapService.kt +91 -0
  8. package/dist/templates/platforms/firetv/project/amazoniap/src/main/kotlin/com/twentyfouri/bridgetv/amazoniap/AmazonIapServiceFactory.kt +13 -0
  9. package/dist/templates/platforms/firetv/project/app/build.gradle +138 -0
  10. package/dist/templates/platforms/firetv/project/app/proguard-rules.pro +47 -0
  11. package/dist/templates/platforms/firetv/project/app/src/bigscreenAppstage/kotlin/com/twentyfouri/tvbridge/Flavor.kt +9 -0
  12. package/dist/templates/platforms/firetv/project/app/src/bigscreenAppstage/res/raw/configuration.json +8 -0
  13. package/dist/templates/platforms/firetv/project/app/src/main/AndroidManifest.xml +52 -0
  14. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/FlavorBase.kt +9 -0
  15. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/bridge/BridgeFromJavaScript.kt +421 -0
  16. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/bridge/BridgeToJavaScript.kt +121 -0
  17. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/configuration/BridgeConfig.kt +19 -0
  18. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/configuration/ConfigCallback.kt +6 -0
  19. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/configuration/ConfigProvider.kt +27 -0
  20. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/configuration/Drm.kt +10 -0
  21. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/configuration/UserAgent.kt +6 -0
  22. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/BaseApplication.kt +73 -0
  23. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/di/ActivityComponent.kt +13 -0
  24. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/di/ActivityModule.kt +14 -0
  25. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/di/ApplicationComponent.kt +23 -0
  26. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/di/ApplicationModule.kt +51 -0
  27. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/di/PerActivity.kt +26 -0
  28. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/utils/LocalStorage.kt +30 -0
  29. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/utils/LoggingDrmCallback.kt +38 -0
  30. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/utils/OverriddenHttpMediaDrmCallback.kt +134 -0
  31. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/utils/PlayerFactoryBitmovinCustomized.kt +19 -0
  32. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/utils/PlayerFactoryConfigured.kt +37 -0
  33. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/utils/PlayerFactoryExoPlayerCustomized.kt +106 -0
  34. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/utils/PlayerFactoryExoPlayerNpaw.kt +581 -0
  35. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/utils/PlayerFactoryVersion.kt +27 -0
  36. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/utils/SimpleActivityLifecycleCallback.kt +32 -0
  37. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/global/utils/SourceDrmOverridden.kt +91 -0
  38. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/sound/TouchPlayer.kt +86 -0
  39. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/client/BridgeWebView.kt +82 -0
  40. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/client/BridgeWebViewClient.kt +114 -0
  41. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/model/AnalyticsPlaybackInfo.kt +10 -0
  42. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/model/ContentModel.kt +14 -0
  43. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/model/DrmModel.kt +20 -0
  44. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/model/MediaEventType.kt +31 -0
  45. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/parser/PlaybackInfoParser.kt +10 -0
  46. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/parser/SourceParser.kt +89 -0
  47. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/parser/TrackJsonModelParser.kt +58 -0
  48. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/view/Mainview.kt +18 -0
  49. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/view/PlayerCache.kt +15 -0
  50. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/view/WebViewActivity.kt +252 -0
  51. package/dist/templates/platforms/firetv/project/app/src/main/kotlin/com/twentyfouri/tvbridge/webview/viewmodel/WebViewModel.kt +748 -0
  52. package/dist/templates/platforms/firetv/project/app/src/main/res/drawable/button_background_focus.xml +10 -0
  53. package/dist/templates/platforms/firetv/project/app/src/main/res/drawable/button_background_normal.xml +7 -0
  54. package/dist/templates/platforms/firetv/project/app/src/main/res/drawable/button_background_pressed.xml +7 -0
  55. package/dist/templates/platforms/firetv/project/app/src/main/res/drawable/button_focus.xml +8 -0
  56. package/dist/templates/platforms/firetv/project/app/src/main/res/layout/activity_web_view.xml +28 -0
  57. package/dist/templates/platforms/firetv/project/app/src/main/res/raw/click.ogg +0 -0
  58. package/dist/templates/platforms/firetv/project/app/src/main/res/values/styles.xml +12 -0
  59. package/dist/templates/platforms/firetv/project/app/src/main/res/xml/network_security_config.xml +4 -0
  60. package/dist/templates/platforms/firetv/project/build.gradle +45 -0
  61. package/dist/templates/platforms/firetv/project/common/build.gradle +41 -0
  62. package/dist/templates/platforms/firetv/project/common/consumer-rules.pro +0 -0
  63. package/dist/templates/platforms/firetv/project/common/proguard-rules.pro +21 -0
  64. package/dist/templates/platforms/firetv/project/common/src/main/kotlin/com/twentyfouri/tvbridge/common/Util.kt +11 -0
  65. package/dist/templates/platforms/firetv/project/common/src/main/kotlin/com/twentyfouri/tvbridge/common/iap/IapCallback.kt +11 -0
  66. package/dist/templates/platforms/firetv/project/common/src/main/kotlin/com/twentyfouri/tvbridge/common/iap/IapException.kt +14 -0
  67. package/dist/templates/platforms/firetv/project/common/src/main/kotlin/com/twentyfouri/tvbridge/common/iap/IapProduct.kt +16 -0
  68. package/dist/templates/platforms/firetv/project/common/src/main/kotlin/com/twentyfouri/tvbridge/common/iap/IapPurchase.kt +9 -0
  69. package/dist/templates/platforms/firetv/project/common/src/main/kotlin/com/twentyfouri/tvbridge/common/iap/IapService.kt +14 -0
  70. package/dist/templates/platforms/firetv/project/common/src/main/kotlin/com/twentyfouri/tvbridge/common/iap/IapServiceFactory.kt +8 -0
  71. package/dist/templates/platforms/firetv/project/common/src/main/kotlin/com/twentyfouri/tvbridge/common/iap/NullIapService.kt +32 -0
  72. package/dist/templates/platforms/firetv/project/googleiap/build.gradle +41 -0
  73. package/dist/templates/platforms/firetv/project/googleiap/consumer-rules.pro +0 -0
  74. package/dist/templates/platforms/firetv/project/googleiap/proguard-rules.pro +21 -0
  75. package/dist/templates/platforms/firetv/project/googleiap/src/main/kotlin/com/twentyfouri/tvbridge/googleiap/GoogleIapService.kt +6 -0
  76. package/dist/templates/platforms/firetv/project/googleiap/src/main/kotlin/com/twentyfouri/tvbridge/googleiap/GoogleIapServiceFactory.kt +13 -0
  77. package/dist/templates/platforms/firetv/project/gradle/wrapper/gradle-wrapper.jar +0 -0
  78. package/dist/templates/platforms/firetv/project/gradle/wrapper/gradle-wrapper.properties +7 -0
  79. package/dist/templates/platforms/firetv/project/gradle.properties +4 -0
  80. package/dist/templates/platforms/firetv/project/gradlew +251 -0
  81. package/dist/templates/platforms/firetv/project/gradlew.bat +94 -0
  82. package/dist/templates/platforms/firetv/project/proguard-rules.pro +42 -0
  83. package/dist/templates/platforms/firetv/project/settings.gradle +4 -0
  84. package/index.js +2 -31
  85. package/package.json +4 -3
  86. package/project.json +57 -11
@@ -0,0 +1,196 @@
1
+ # Android TV Bridge
2
+
3
+ > Readme updated for the androidVersionCode 2
4
+
5
+ ## Requirements
6
+ * Android Studio (https://developer.android.com/studio/index.html)
7
+
8
+ ## Getting started
9
+
10
+ #### Repository
11
+ Clone the repository `git clone git@bitbucket.org:24imedia/androidtvbridge.git`
12
+
13
+ #### Editor
14
+ Open the project by opening Android Studio and selecting `Open an existing Android Studio project`. Select the folder in which you've cloned the repository.
15
+
16
+ #### Installation
17
+ Make sure you have ADB (Android Debug Bridge) install in order to run the app on a device through Android Studio or via "command line" (https://developer.android.com/studio/command-line/adb.html#wireless)
18
+
19
+ #### Launch
20
+ * Android Studio
21
+ * Once you've connected a device you can press `Run` in Android Studio and it will take care of building and running the app. You will be prompted with a dialog box asking where to run the application, select the device and the application will be started.
22
+ * Command line
23
+ * adb connect `<IP of the TV>`
24
+ * adb install `<apk file>`
25
+
26
+ ## Changing the default URL
27
+
28
+ The application by default has a front-loading page where you can enter the URL you want to load. You can adjust this default by modifying the following values:
29
+
30
+ **app/build.gradle**
31
+
32
+ This file determines which URL is loaded.
33
+
34
+ productFlavors {
35
+ flavourName {
36
+ resValue "string", "app_name", "24i Bridge"
37
+ resValue "string", "url_base", "http://smart-template-sinclair-appcore.feature1.24i-dev.com/build/amazon-firetv_stb-default/index.html"
38
+ }
39
+ ...
40
+ }
41
+
42
+ #### Adding new environments
43
+ Add a new flavour to let Android Studio generate a new version pointing to the new url.
44
+
45
+ ### JS Methods
46
+
47
+ #### void bridgeAndroidToJavaScript_KeyEvent(int keyCode, String keyEvent)
48
+ Fires a JS key event
49
+ Possible events:
50
+ * keypress
51
+ * keyup
52
+ * keydown
53
+
54
+ Where keycode is the keycode that is send
55
+
56
+ #### void bridgeAndroidToJavaScript_MediaEvent(String mediaEvent)
57
+ Fires a JS MediaEvent
58
+ Possible mediaEvents:
59
+ * timeupdate
60
+ * error
61
+ * playing
62
+ * ended
63
+ * waiting
64
+ * seeked
65
+
66
+ #### void bridgeJavaScriptToAndroid_Message(String messageString)
67
+ Send a message/Toast to Android app
68
+
69
+ #### void bridgeJavaScriptToAndroid_SetVideoPath(final String jsonString)
70
+ Sets the content to the player. Can be only a stream Url example `http://www.stream.nl?lsadlk.m3u8`
71
+ Or:
72
+ Json string expected format:
73
+ ```json
74
+ {
75
+ "streamUrl": "http://www.stream.nl?lsadlk.m3u8",
76
+ "drmConfig": {
77
+ "drmSchemeUuid": "widevine",
78
+ "drmLicenseUrl": "http://licenseurl.com",
79
+ "drmCustomData": {
80
+ "custom": "data",
81
+ "data": "custom"
82
+ }
83
+ }
84
+ }
85
+ ```
86
+ drmConfig is nullable
87
+
88
+ * streamUrl: the stream url
89
+ * drmSchemeUuid: widevine, playready, clearkey or custom UUID
90
+ * drmLicenseUrl: the license server url
91
+ * drmCustomData: key value pairs of custom data
92
+
93
+ #### void bridgeJavaScriptToAndroid_PlayVideo()
94
+ Plays the current stream
95
+
96
+ #### bridgeJavaScriptToAndroid_PauseVideo()
97
+ Pauses the current stream
98
+
99
+ #### bridgeJavaScriptToAndroid_StopVideo()
100
+ Stops the current stream
101
+
102
+ #### int bridgeJavaScriptToAndroid_GetCurrentTime()
103
+ Gets the current time from player
104
+
105
+ #### float bridgeJavaScriptToAndroid_GetCurrentTimeFloat()
106
+ Gets the current time float from player
107
+
108
+ #### void bridgeJavaScriptToAndroid_setNativeSubtitlesEnabled(boolean subtitlesEnabled)
109
+ Enable or disable subtitles in the player
110
+
111
+ #### int bridgeJavaScriptToAndroid_GetTotalTime()
112
+ Gets the duration of the stream
113
+
114
+ #### void bridgeJavaScriptToAndroid_SeekTo(int seconds)
115
+ Seek to a specific position in the stream
116
+
117
+ #### boolean bridgeJavaScriptToAndroid_IsPlaying()
118
+ Return true if the player is playing, otherwise false
119
+
120
+ #### void bridgeJavaScriptToAndroid_FullScreenVideo()
121
+ Sets the player to full screen mode
122
+
123
+ #### void bridgeJavaScriptToAndroid_SetVideoLayout(int width, int height, int left, int top)
124
+ Resize the player
125
+
126
+ #### void bridgeJavaScriptToAndroid_Back()
127
+ Simulate a native Android back press
128
+
129
+ #### void bridgeAndroidToJavaScript_MediaTrackEvent(String mediaEvent, List<TrackInfo> tracks)
130
+ Send event to JS
131
+ Possible event:
132
+ trackschanged
133
+
134
+ TrackInfo list:
135
+ ```json
136
+ [
137
+ {
138
+ "type": "",
139
+ "language": "",
140
+ "name": ""
141
+ },
142
+ {
143
+ "type": "",
144
+ "language": "",
145
+ "name": ""
146
+ }
147
+ ]
148
+ ```
149
+
150
+ #### void bridgeJavaScriptToAndroid_SetTrack(String trackJson)
151
+ Change the track thats currently playing
152
+ Returns void
153
+ trackJson format:
154
+ ```json
155
+ {
156
+ "type": "",
157
+ "language": "",
158
+ "name": ""
159
+ }
160
+ ```
161
+ * type: audio or subtitles
162
+ * language: the language String example: `en`
163
+ * name: the name of language(display name) example: `English`
164
+ Disable the tracks again. Set `off` in language
165
+
166
+ #### void bridgeJavaScriptToAndroid_SaveToLocalStorage(String key, String value)
167
+ Save an string to Android localStorage
168
+ * key: a constant set in JS app to save/get the saved value
169
+ * value: the value you want to save(can be a json string)
170
+
171
+ #### void bridgeJavaScriptToAndroid_RemoveFromLocalStorage(String key)
172
+ * key: a constant set in JS app to remove the saved value
173
+
174
+ #### String bridgeJavaScriptToAndroid_GetFromLocalStorage(String key)
175
+ * key: a constant set in JS app to get the saved value
176
+
177
+ #### void bridgeReceiptAmazonIAPValidation(String sku, String token, String urlReceiptValidation, String urlGetStatus)
178
+ Validate that the in app purchase is accepted by Amazon
179
+ * sku: id of the product
180
+ * token: token of the sell
181
+ * urlReceiptValidation: url where to validate the receipt
182
+ * urlGetStatus: url to get the status of the purchase
183
+ #### void bridgeReceiptAmazonIAPValidated(String receiptId)
184
+ In app purchase validation of a receipt by Amazon
185
+ * receiptId: id of the receipt
186
+ #### String bridgeGetHistoricPurchases()
187
+ Get the history of the purchases by Amazon of the current user
188
+ #### String bridgeJavaScriptToAndroid_GetDeviceInfo()
189
+ Returns a Json string with the information about the device brand, model and Android version.
190
+ Json format example:
191
+ ```json
192
+ { "deviceBrand": "Sony",
193
+ "deviceModel": "BRAVIA 4K 2015",
194
+ "osVersion": "7.0"
195
+ }
196
+ ```
@@ -0,0 +1,41 @@
1
+ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2
+
3
+ plugins {
4
+ id 'com.android.library'
5
+ id 'kotlin-android'
6
+ }
7
+
8
+ android {
9
+ namespace = "com.twentyfouri.androidtv.amazoniap"
10
+ compileSdk = {{COMPILE_SDK_VERSION}}
11
+
12
+ compileOptions {
13
+ sourceCompatibility JavaVersion.VERSION_17
14
+ targetCompatibility JavaVersion.VERSION_17
15
+ }
16
+
17
+ defaultConfig {
18
+ minSdk = {{MIN_SDK_VERSION}}
19
+ targetSdk = {{TARGET_SDK_VERSION}}
20
+
21
+ versionCode {{APP_VERSION_CODE}}
22
+ versionName "{{APP_VERSION_NAME}}"
23
+
24
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
25
+ consumerProguardFiles "consumer-rules.pro"
26
+ }
27
+
28
+ buildTypes {
29
+ release {
30
+ minifyEnabled false
31
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
32
+ }
33
+ }
34
+ }
35
+
36
+ kotlin.compilerOptions.jvmTarget = JvmTarget.JVM_17
37
+
38
+ dependencies {
39
+ implementation 'com.amazon.device:amazon-appstore-sdk:3.0.8'
40
+ implementation project(':common')
41
+ }
@@ -0,0 +1,21 @@
1
+ # Add project specific ProGuard rules here.
2
+ # You can control the set of applied configuration files using the
3
+ # proguardFiles setting in build.gradle.
4
+ #
5
+ # For more details, see
6
+ # http://developer.android.com/guide/developing/tools/proguard.html
7
+
8
+ # If your project uses WebView with JS, uncomment the following
9
+ # and specify the fully qualified class name to the JavaScript interface
10
+ # class:
11
+ #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12
+ # public *;
13
+ #}
14
+
15
+ # Uncomment this to preserve the line number information for
16
+ # debugging stack traces.
17
+ #-keepattributes SourceFile,LineNumberTable
18
+
19
+ # If you keep the line number information, uncomment this to
20
+ # hide the original source file name.
21
+ #-renamesourcefileattribute SourceFile
@@ -0,0 +1,91 @@
1
+ package com.twentyfouri.bridgetv.amazoniap
2
+
3
+ import android.app.Activity
4
+ import android.content.Context
5
+ import com.amazon.device.iap.PurchasingListener
6
+ import com.amazon.device.iap.PurchasingService
7
+ import com.amazon.device.iap.model.FulfillmentResult
8
+ import com.amazon.device.iap.model.ProductDataResponse
9
+ import com.amazon.device.iap.model.PurchaseResponse
10
+ import com.amazon.device.iap.model.PurchaseUpdatesResponse
11
+ import com.amazon.device.iap.model.UserDataResponse
12
+ import com.twentyfouri.tvbridge.common.iap.IapCallback
13
+ import com.twentyfouri.tvbridge.common.iap.IapException
14
+ import com.twentyfouri.tvbridge.common.iap.IapProduct
15
+ import com.twentyfouri.tvbridge.common.iap.IapPurchase
16
+ import com.twentyfouri.tvbridge.common.iap.IapService
17
+ import org.json.JSONObject
18
+
19
+ class AmazonIapService(private val context: Context) : IapService, PurchasingListener {
20
+ private var callback: IapCallback? = null
21
+
22
+ override fun initialize() {
23
+ PurchasingService.registerListener(context, this)
24
+ }
25
+
26
+ override fun destroy() = Unit
27
+
28
+ override fun setCallback(callback: IapCallback?) {
29
+ this.callback = callback
30
+ }
31
+
32
+ override fun onUserDataResponse(result: UserDataResponse) = Unit
33
+
34
+ override fun checkNewPurchases() {
35
+ PurchasingService.getPurchaseUpdates(true)
36
+ }
37
+
38
+ override fun onPurchaseUpdatesResponse(result: PurchaseUpdatesResponse) {
39
+ if (result.requestStatus == PurchaseUpdatesResponse.RequestStatus.SUCCESSFUL) {
40
+ callback?.checkNewPurchasesFinished(
41
+ result.receipts.map { receipt ->
42
+ IapPurchase(receipt.sku, result.userData.userId, receipt.toJSON())
43
+ }
44
+ )
45
+ } else {
46
+ callback?.checkNewPurchasesFinished(IapException(result.requestStatus.name))
47
+ }
48
+ }
49
+
50
+ override fun purchase(activity: Activity, sku: String) {
51
+ PurchasingService.purchase(sku)
52
+ }
53
+
54
+ override fun onPurchaseResponse(result: PurchaseResponse) {
55
+ if (result.requestStatus == PurchaseResponse.RequestStatus.SUCCESSFUL) {
56
+ callback?.purchaseFinished(
57
+ IapPurchase(result.receipt.sku, result.userData.userId, result.receipt.toJSON())
58
+ )
59
+ } else {
60
+ callback?.purchaseFinished(IapException(result.requestStatus.name))
61
+ }
62
+ }
63
+
64
+ override fun getProducts(skus: Iterable<String>) {
65
+ PurchasingService.getProductData(skus.toSet())
66
+ }
67
+
68
+ override fun onProductDataResponse(result: ProductDataResponse) {
69
+ if (result.requestStatus == ProductDataResponse.RequestStatus.SUCCESSFUL) {
70
+ callback?.getProductsFinished(
71
+ result.productData.values.map {
72
+ IapProduct(
73
+ it.title.orEmpty(),
74
+ it.description.orEmpty(),
75
+ it.price.orEmpty(),
76
+ it.smallIconUrl.orEmpty(),
77
+ it.productType.name,
78
+ it.sku
79
+ )
80
+ },
81
+ result.unavailableSkus.toList()
82
+ )
83
+ } else {
84
+ callback?.getProductsFinished(IapException(result.requestStatus.name))
85
+ }
86
+ }
87
+
88
+ override fun acknowledgeReceipt(receipt: JSONObject) {
89
+ PurchasingService.notifyFulfillment(receipt.getString("receiptId"), FulfillmentResult.FULFILLED)
90
+ }
91
+ }
@@ -0,0 +1,13 @@
1
+ package com.twentyfouri.bridgetv.amazoniap
2
+
3
+ import android.content.Context
4
+ import android.os.Build
5
+ import com.twentyfouri.tvbridge.common.iap.IapServiceFactory
6
+ import com.twentyfouri.tvbridge.common.installerPackageName
7
+
8
+ object AmazonIapServiceFactory : IapServiceFactory {
9
+ override fun detectSupport(context: Context) =
10
+ context.installerPackageName == "com.amazon.venezia" || Build.MANUFACTURER == "Amazon"
11
+
12
+ override fun build(context: Context) = AmazonIapService(context)
13
+ }
@@ -0,0 +1,138 @@
1
+ import org.jetbrains.kotlin.gradle.dsl.JvmTarget
2
+
3
+ plugins {
4
+ id 'com.android.application'
5
+ id 'kotlin-android'
6
+ id 'kotlin-kapt'
7
+ }
8
+
9
+ def bitmovinLicense = '{{BITMOVIN_LICENSE}}'
10
+ def bitmovinAnalytics = '{{BITMOVIN_ANALYTICS}}'
11
+ def useBitmovin = bitmovinLicense != ''
12
+ def npawAccountCode = '{{NPAW_ACCOUNT_CODE}}'
13
+ def useNpawPlugin = npawAccountCode != ''
14
+ def useImaSdk = {{ENABLE_IMA_SDK}}
15
+
16
+ def player_version = '0.8.0-alpha.43'
17
+
18
+ android {
19
+ namespace = 'com.twentyfouri.tvbridge'
20
+ compileSdk = {{COMPILE_SDK_VERSION}}
21
+
22
+ compileOptions {
23
+ coreLibraryDesugaringEnabled true
24
+ sourceCompatibility JavaVersion.VERSION_17
25
+ targetCompatibility JavaVersion.VERSION_17
26
+ }
27
+
28
+ packagingOptions {
29
+ exclude 'META-INF/*.kotlin_module'
30
+ }
31
+
32
+ defaultConfig {
33
+ minSdk = {{MIN_SDK_VERSION}}
34
+ targetSdk = {{TARGET_SDK_VERSION}}
35
+
36
+ applicationId 'com.twentyfouri.tvbridge'
37
+ versionCode 1
38
+ versionName "1.0"
39
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
40
+
41
+ // necessary for Fire OS - installation of debug build fails otherwise
42
+ multiDexEnabled true
43
+
44
+ buildConfigField "String", "APP_URL", '"{{APP_URL}}"'
45
+ buildConfigField "String", "BITMOVIN_LICENSE", "\"$bitmovinLicense\""
46
+ buildConfigField "String", "BITMOVIN_ANALYTICS", "\"$bitmovinAnalytics\""
47
+ buildConfigField "String", "NPAW_ACCOUNT_CODE", "\"$npawAccountCode\""
48
+ buildConfigField "Boolean", "startWithHighVideoQuality", "true"
49
+ }
50
+
51
+ signingConfigs {
52
+ bigscreenAppstage {
53
+ keyAlias '{{KEY_ALIAS}}'
54
+ keyPassword '{{KEY_PASSWORD}}'
55
+ storeFile file('{{STORE_FILE}}')
56
+ storePassword '{{STORE_PASSWORD}}'
57
+ }
58
+ }
59
+
60
+ buildTypes {
61
+ debug {
62
+ // uncomment for signing testing builds
63
+ // signingConfig null
64
+ }
65
+ release {
66
+ minifyEnabled true
67
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
68
+ }
69
+ }
70
+
71
+ buildFeatures {
72
+ buildConfig true
73
+ viewBinding true
74
+ }
75
+
76
+ flavorDimensions "bridge"
77
+ productFlavors {
78
+ bigscreenAppstage {
79
+ // X.Y.Z XXYYZZUU -> version 1.2.3 will be 01020300, 5th update of 1.2.3 will be 01020305
80
+ dimension "bridge"
81
+ versionCode {{APP_VERSION_CODE}}
82
+ versionName "{{APP_VERSION_NAME}}"
83
+ applicationId "{{APP_ID}}"
84
+ resValue "string", "app_name", "{{configProps.appName}}"
85
+ {{SIGNING_CONFIG_REF}}
86
+ }
87
+ }
88
+ lintOptions {
89
+ disable "Instantiatable"
90
+ }
91
+ }
92
+
93
+ kotlin.compilerOptions {
94
+ jvmTarget = JvmTarget.JVM_17
95
+ freeCompilerArgs.add('-Xjvm-default=all-compatibility')
96
+ }
97
+
98
+ dependencies {
99
+ coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.1.5'
100
+
101
+ implementation project(':common')
102
+ {{IAP_DEPENDENCIES}}
103
+
104
+ implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"
105
+ implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2"
106
+
107
+ implementation "androidx.lifecycle:lifecycle-common:2.9.2"
108
+ implementation "com.google.code.gson:gson:2.13.1"
109
+
110
+ implementation "com.google.dagger:dagger:2.57"
111
+ kapt "com.google.dagger:dagger-compiler:2.57"
112
+
113
+ if (useBitmovin) {
114
+ compileOnly "com.twentyfouri.player:exoplayer:$player_version"
115
+ implementation "com.twentyfouri.player:bitmovin:$player_version"
116
+ } else {
117
+ implementation "com.twentyfouri.player:exoplayer:$player_version"
118
+ compileOnly "com.twentyfouri.player:bitmovin:$player_version"
119
+ }
120
+
121
+ def npaw = '7.3.7'
122
+ def exo = '2.19.1'
123
+ if (useNpawPlugin && !useBitmovin) {
124
+ implementation "com.npaw.plugin:plugin:$npaw"
125
+ implementation "com.npaw.plugin:plugin-exoplayer:$exo-$npaw"
126
+ implementation "com.google.android.exoplayer:extension-okhttp:$exo"
127
+ } else {
128
+ compileOnly "com.npaw.plugin:plugin:$npaw"
129
+ compileOnly "com.npaw.plugin:plugin-exoplayer:$exo-$npaw"
130
+ compileOnly "com.google.android.exoplayer:extension-okhttp:$exo"
131
+ }
132
+
133
+ if (useImaSdk) {
134
+ implementation 'com.google.ads.interactivemedia.v3:interactivemedia:3.36.0'
135
+ }
136
+
137
+ implementation "com.google.android.gms:play-services-ads-identifier:18.2.0"
138
+ }
@@ -0,0 +1,47 @@
1
+ # Add project specific ProGuard rules here.
2
+ # By default, the flags in this file are appended to flags specified
3
+ # in /Applications/Android SDK/sdk/tools/proguard/proguard-android.txt
4
+ # You can edit the include path and order by changing the proguardFiles
5
+ # directive in build.gradle.
6
+ #
7
+ # For more details, see
8
+ # http://developer.android.com/guide/developing/tools/proguard.html
9
+
10
+ # Add any project specific keep options here:
11
+
12
+ # If your project uses WebView with JS, uncomment the following
13
+ # and specify the fully qualified class name to the JavaScript interface
14
+ # class:
15
+ -keepclassmembers class com.twentyfouri.tvbridge.bridge.JavaScript** {
16
+ public *;
17
+ }
18
+ -dontwarn okhttp3.**
19
+ -dontwarn javax.annotation.**
20
+ # A resource is loaded with a relative path so the package of this class must be preserved.
21
+ -keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
22
+
23
+ -ignorewarnings
24
+ -keep class * {
25
+ public private *;
26
+ }
27
+
28
+ -dontwarn com.amazon.**
29
+ -keep class com.amazon.** {*;}
30
+ -keepattributes *Annotation*
31
+
32
+ -keep class com.bitmovin.** {*;}
33
+ -dontwarn com.bitmovin.**
34
+ -keep public class com.google.android.gms.* { public *; }
35
+ -dontwarn com.google.android.gms.**
36
+
37
+ # In case of using yospace integration
38
+ -keep class com.yospace.util.** {*;}
39
+ -dontwarn com.yospace.util.**
40
+
41
+ # For native Google IMA integration
42
+ -keep class com.google.obf.** { *; }
43
+ -keep interface com.google.obf.** { *; }
44
+ -keep class com.google.ads.interactivemedia.** { *; }
45
+ -keep interface com.google.ads.interactivemedia.** { *; }
46
+
47
+ -optimizationpasses 1
@@ -0,0 +1,9 @@
1
+ package com.twentyfouri.tvbridge
2
+
3
+ import com.twentyfouri.tvbridge.common.iap.IapServiceFactory
4
+
5
+ {{FLAVOR_IMPORTS}}
6
+
7
+ object Flavor : FlavorBase() {
8
+ override val iapServiceFactories = listOf<IapServiceFactory>({{FLAVOR_IAP_FACTORIES}})
9
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "customizableUrl": false,
3
+ "mediaEventPrefix": "player:",
4
+ "startWithHighVideoQuality": true,
5
+ "drm": {
6
+ "overrideDrmCallback": false
7
+ }
8
+ }
@@ -0,0 +1,52 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android"
3
+ xmlns:tools="http://schemas.android.com/tools">
4
+
5
+ <!-- Allow the app to run on non-touch devices. -->
6
+ <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
7
+ <uses-feature android:name="android.hardware.screen.portrait" android:required="false" />
8
+ <!-- Limit the app to running on Android TV devices. -->
9
+ <uses-feature android:name="android.software.leanback" android:required="true" />
10
+
11
+ <!-- Allow the app access to the internet. -->
12
+ <uses-permission android:name="android.permission.INTERNET" />
13
+
14
+ <uses-permission android:name="android.permission.WAKE_LOCK" />
15
+
16
+ <uses-permission android:name="com.google.android.assistant.READ_HOTWORD_STATE" />
17
+ <uses-permission android:name="com.google.android.assistant.WRITE_HOTWORD_STATE" />
18
+
19
+ <application
20
+ android:name=".global.BaseApplication"
21
+ android:allowBackup="true"
22
+ android:banner="@drawable/banner"
23
+ android:icon="@mipmap/ic_launcher"
24
+ android:label="@string/app_name"
25
+ android:networkSecurityConfig="@xml/network_security_config"
26
+ tools:ignore="GoogleAppIndexingWarning"
27
+ android:usesCleartextTraffic="true"
28
+ android:extractNativeLibs="false"
29
+ android:theme="@style/AppTheme">
30
+ <activity
31
+ android:name=".webview.view.WebViewActivity"
32
+ android:hardwareAccelerated="true"
33
+ android:label="@string/app_name"
34
+ android:exported="true">
35
+ <intent-filter>
36
+ <action android:name="android.intent.action.MAIN" />
37
+
38
+ <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
39
+ <category android:name="android.intent.category.LAUNCHER" />
40
+ </intent-filter>
41
+ </activity>
42
+ <receiver android:name="com.amazon.device.iap.ResponseReceiver"
43
+ android:permission="com.amazon.inapp.purchasing.Permission.NOTIFY"
44
+ android:exported="true">
45
+ <intent-filter>
46
+ <action
47
+ android:name="com.amazon.inapp.purchasing.NOTIFY" />
48
+ </intent-filter>
49
+ </receiver>
50
+ </application>
51
+
52
+ </manifest>
@@ -0,0 +1,9 @@
1
+ package com.twentyfouri.tvbridge
2
+
3
+ import android.content.Context
4
+ import com.twentyfouri.tvbridge.common.iap.IapServiceFactory
5
+
6
+ abstract class FlavorBase {
7
+ open val iapServiceFactories = emptyList<IapServiceFactory>()
8
+ open fun signData(applicationContext: Context, dataJson: String) = ""
9
+ }