@24i/smartapps-bigscreen-rnv-build-engine 0.17.2-alpha.2154 → 0.17.2-alpha.2155

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 (279) hide show
  1. package/dist/templates/platforms/androidtv/project/README.md +198 -0
  2. package/dist/templates/platforms/androidtv/project/amazoniap/build.gradle +39 -0
  3. package/dist/templates/platforms/androidtv/project/amazoniap/consumer-rules.pro +0 -0
  4. package/dist/templates/platforms/androidtv/project/amazoniap/libs/in-app-purchasing-2.0.76.jar +0 -0
  5. package/dist/templates/platforms/androidtv/project/amazoniap/proguard-rules.pro +21 -0
  6. package/dist/templates/platforms/androidtv/project/amazoniap/src/main/AndroidManifest.xml +4 -0
  7. package/dist/templates/platforms/androidtv/project/amazoniap/src/main/java/com/twentyfouri/bridgetv/amazoniap/AmazonIapSevice.kt +106 -0
  8. package/dist/templates/platforms/androidtv/project/app/build.gradle +371 -0
  9. package/dist/templates/platforms/androidtv/project/app/proguard-rules.pro +32 -0
  10. package/dist/templates/platforms/androidtv/project/app/src/alhurra/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  11. package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/drawable/banner.png +0 -0
  12. package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/mipmap-hdpi/ic_launcher.png +0 -0
  13. package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/mipmap-mdpi/ic_launcher.png +0 -0
  14. package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/mipmap-xhdpi/ic_launcher.png +0 -0
  15. package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  16. package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  17. package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/raw/configuration.json +7 -0
  18. package/dist/templates/platforms/androidtv/project/app/src/androidTest/assets/getStatusSuccesfulResponse.json +9 -0
  19. package/dist/templates/platforms/androidtv/project/app/src/androidTest/assets/tokenFromPassword_200.json +7 -0
  20. package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/ngsn/tv/RestServiceTestHelper.java +34 -0
  21. package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/ngsn/tv/WebViewActivityTest.java +104 -0
  22. package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/twentyfouri/tvbridge/SignTest.kt +54 -0
  23. package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/twentyfouri/tvbridge/amazonIAP/AmazonIAPManagerTest.java +74 -0
  24. package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/twentyfouri/tvbridge/amazonIAP/SinclairTestRunner.java +22 -0
  25. package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/twentyfouri/tvbridge/webview/ui/model/BridgeWebViewTest.java +50 -0
  26. package/dist/templates/platforms/androidtv/project/app/src/bbg/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  27. package/dist/templates/platforms/androidtv/project/app/src/bbg/res/drawable/banner.png +0 -0
  28. package/dist/templates/platforms/androidtv/project/app/src/bbg/res/mipmap-hdpi/ic_launcher.png +0 -0
  29. package/dist/templates/platforms/androidtv/project/app/src/bbg/res/mipmap-mdpi/ic_launcher.png +0 -0
  30. package/dist/templates/platforms/androidtv/project/app/src/bbg/res/mipmap-xhdpi/ic_launcher.png +0 -0
  31. package/dist/templates/platforms/androidtv/project/app/src/bbg/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  32. package/dist/templates/platforms/androidtv/project/app/src/bbg/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  33. package/dist/templates/platforms/androidtv/project/app/src/bbg/res/raw/configuration.json +7 -0
  34. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  35. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/drawable/banner.png +0 -0
  36. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/mipmap-hdpi/ic_launcher.png +0 -0
  37. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/mipmap-mdpi/ic_launcher.png +0 -0
  38. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/mipmap-xhdpi/ic_launcher.png +0 -0
  39. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  40. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  41. package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/raw/configuration.json +6 -0
  42. package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/java/com/twentyfouri/tvbridge/Flavor.kt +9 -0
  43. package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/drawable/banner.png +0 -0
  44. package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/mipmap-hdpi/ic_launcher.png +0 -0
  45. package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/mipmap-mdpi/ic_launcher.png +0 -0
  46. package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/mipmap-xhdpi/ic_launcher.png +0 -0
  47. package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  48. package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/raw/configuration.json +16 -0
  49. package/dist/templates/platforms/androidtv/project/app/src/cineClick/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  50. package/dist/templates/platforms/androidtv/project/app/src/cineClick/res/raw/configuration.json +6 -0
  51. package/dist/templates/platforms/androidtv/project/app/src/entel/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  52. package/dist/templates/platforms/androidtv/project/app/src/entel/res/raw/configuration.json +6 -0
  53. package/dist/templates/platforms/androidtv/project/app/src/fuboTV/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  54. package/dist/templates/platforms/androidtv/project/app/src/fuboTV/res/raw/configuration.json +6 -0
  55. package/dist/templates/platforms/androidtv/project/app/src/fuse/AndroidManifest.xml +12 -0
  56. package/dist/templates/platforms/androidtv/project/app/src/fuse/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  57. package/dist/templates/platforms/androidtv/project/app/src/fuse/res/drawable/banner.png +0 -0
  58. package/dist/templates/platforms/androidtv/project/app/src/fuse/res/mipmap-hdpi/ic_launcher.png +0 -0
  59. package/dist/templates/platforms/androidtv/project/app/src/fuse/res/mipmap-mdpi/ic_launcher.png +0 -0
  60. package/dist/templates/platforms/androidtv/project/app/src/fuse/res/mipmap-xhdpi/ic_launcher.png +0 -0
  61. package/dist/templates/platforms/androidtv/project/app/src/fuse/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  62. package/dist/templates/platforms/androidtv/project/app/src/fuse/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  63. package/dist/templates/platforms/androidtv/project/app/src/fuse/res/raw/configuration.json +9 -0
  64. package/dist/templates/platforms/androidtv/project/app/src/gsn/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  65. package/dist/templates/platforms/androidtv/project/app/src/gsn/res/drawable/banner.png +0 -0
  66. package/dist/templates/platforms/androidtv/project/app/src/gsn/res/mipmap-hdpi/ic_launcher.png +0 -0
  67. package/dist/templates/platforms/androidtv/project/app/src/gsn/res/mipmap-mdpi/ic_launcher.png +0 -0
  68. package/dist/templates/platforms/androidtv/project/app/src/gsn/res/mipmap-xhdpi/ic_launcher.png +0 -0
  69. package/dist/templates/platforms/androidtv/project/app/src/gsn/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  70. package/dist/templates/platforms/androidtv/project/app/src/gsn/res/raw/configuration.json +8 -0
  71. package/dist/templates/platforms/androidtv/project/app/src/heremedia/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  72. package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/drawable/banner.png +0 -0
  73. package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/mipmap-hdpi/ic_launcher.png +0 -0
  74. package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/mipmap-mdpi/ic_launcher.png +0 -0
  75. package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/mipmap-xhdpi/ic_launcher.png +0 -0
  76. package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  77. package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  78. package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/raw/configuration.json +6 -0
  79. package/dist/templates/platforms/androidtv/project/app/src/hummingbird/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  80. package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/mipmap-hdpi/ic_launcher.png +0 -0
  81. package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/mipmap-mdpi/ic_launcher.png +0 -0
  82. package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/mipmap-xhdpi/ic_launcher.png +0 -0
  83. package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  84. package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  85. package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/raw/configuration.json +6 -0
  86. package/dist/templates/platforms/androidtv/project/app/src/kijk/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  87. package/dist/templates/platforms/androidtv/project/app/src/kijk/res/drawable/banner.png +0 -0
  88. package/dist/templates/platforms/androidtv/project/app/src/kijk/res/mipmap-hdpi/ic_launcher.png +0 -0
  89. package/dist/templates/platforms/androidtv/project/app/src/kijk/res/mipmap-mdpi/ic_launcher.png +0 -0
  90. package/dist/templates/platforms/androidtv/project/app/src/kijk/res/mipmap-xhdpi/ic_launcher.png +0 -0
  91. package/dist/templates/platforms/androidtv/project/app/src/kijk/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  92. package/dist/templates/platforms/androidtv/project/app/src/kijk/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  93. package/dist/templates/platforms/androidtv/project/app/src/kijk/res/raw/configuration.json +6 -0
  94. package/dist/templates/platforms/androidtv/project/app/src/kpn/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  95. package/dist/templates/platforms/androidtv/project/app/src/kpn/res/drawable/banner.png +0 -0
  96. package/dist/templates/platforms/androidtv/project/app/src/kpn/res/mipmap-hdpi/ic_launcher.png +0 -0
  97. package/dist/templates/platforms/androidtv/project/app/src/kpn/res/mipmap-mdpi/ic_launcher.png +0 -0
  98. package/dist/templates/platforms/androidtv/project/app/src/kpn/res/mipmap-xhdpi/ic_launcher.png +0 -0
  99. package/dist/templates/platforms/androidtv/project/app/src/kpn/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  100. package/dist/templates/platforms/androidtv/project/app/src/kpn/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  101. package/dist/templates/platforms/androidtv/project/app/src/kpn/res/raw/configuration.json +6 -0
  102. package/dist/templates/platforms/androidtv/project/app/src/main/AndroidManifest.xml +47 -0
  103. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/FlavorBase.kt +12 -0
  104. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/bridge/BridgeFromJavaScript.kt +379 -0
  105. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/bridge/BridgeToJavaScript.kt +65 -0
  106. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/BridgeConfig.kt +9 -0
  107. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/ConfigCallback.kt +6 -0
  108. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/ConfigProvider.kt +27 -0
  109. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/Drm.kt +10 -0
  110. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/UserAgent.kt +6 -0
  111. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/BaseApplication.kt +73 -0
  112. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ActivityComponent.kt +13 -0
  113. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ActivityModule.kt +19 -0
  114. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ApplicationComponent.kt +24 -0
  115. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ApplicationModule.kt +43 -0
  116. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/PerActivity.kt +26 -0
  117. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/HttpMediaDrmCallback.kt +184 -0
  118. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/LocalStorage.kt +30 -0
  119. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/LoggingDrmCallback.kt +46 -0
  120. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/SimpleActivityLifecycleCallback.kt +32 -0
  121. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/jump/JumpAnalytics.kt +209 -0
  122. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/sound/TouchPlayer.kt +86 -0
  123. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/client/BridgeWebView.kt +80 -0
  124. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/client/BridgeWebViewClient.kt +114 -0
  125. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/AnalyticsPlaybackInfo.kt +10 -0
  126. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/ContentModel.kt +14 -0
  127. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/DrmModel.kt +20 -0
  128. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/MediaEventType.kt +17 -0
  129. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/ContentModelParser.kt +16 -0
  130. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/DeviceInfoParser.kt +22 -0
  131. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/PlaybackInfoParser.kt +10 -0
  132. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/TrackJsonModelParser.kt +76 -0
  133. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/Mainview.kt +22 -0
  134. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/PlayerCache.kt +15 -0
  135. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/WebViewActivity.kt +279 -0
  136. package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/viewmodel/WebViewModel.kt +569 -0
  137. package/dist/templates/platforms/androidtv/project/app/src/main/res/drawable/banner.png +0 -0
  138. package/dist/templates/platforms/androidtv/project/app/src/main/res/drawable/button_background_focus.xml +10 -0
  139. package/dist/templates/platforms/androidtv/project/app/src/main/res/drawable/button_background_normal.xml +7 -0
  140. package/dist/templates/platforms/androidtv/project/app/src/main/res/drawable/button_background_pressed.xml +7 -0
  141. package/dist/templates/platforms/androidtv/project/app/src/main/res/drawable/button_focus.xml +8 -0
  142. package/dist/templates/platforms/androidtv/project/app/src/main/res/layout/activity_web_view.xml +78 -0
  143. package/dist/templates/platforms/androidtv/project/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  144. package/dist/templates/platforms/androidtv/project/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  145. package/dist/templates/platforms/androidtv/project/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  146. package/dist/templates/platforms/androidtv/project/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  147. package/dist/templates/platforms/androidtv/project/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  148. package/dist/templates/platforms/androidtv/project/app/src/main/res/raw/click.ogg +0 -0
  149. package/dist/templates/platforms/androidtv/project/app/src/main/res/raw/fiddle_root_michal_konecny.cer +0 -0
  150. package/dist/templates/platforms/androidtv/project/app/src/main/res/raw/proxy_milanwilczak.pem +26 -0
  151. package/dist/templates/platforms/androidtv/project/app/src/main/res/values/styles.xml +11 -0
  152. package/dist/templates/platforms/androidtv/project/app/src/main/res/xml/network_security_config.xml +12 -0
  153. package/dist/templates/platforms/androidtv/project/app/src/marti/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  154. package/dist/templates/platforms/androidtv/project/app/src/marti/res/drawable/banner.png +0 -0
  155. package/dist/templates/platforms/androidtv/project/app/src/marti/res/mipmap-hdpi/ic_launcher.png +0 -0
  156. package/dist/templates/platforms/androidtv/project/app/src/marti/res/mipmap-mdpi/ic_launcher.png +0 -0
  157. package/dist/templates/platforms/androidtv/project/app/src/marti/res/mipmap-xhdpi/ic_launcher.png +0 -0
  158. package/dist/templates/platforms/androidtv/project/app/src/marti/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  159. package/dist/templates/platforms/androidtv/project/app/src/marti/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  160. package/dist/templates/platforms/androidtv/project/app/src/marti/res/raw/configuration.json +8 -0
  161. package/dist/templates/platforms/androidtv/project/app/src/newsmax/AndroidManifest.xml +43 -0
  162. package/dist/templates/platforms/androidtv/project/app/src/newsmax/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  163. package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/drawable/banner.png +0 -0
  164. package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/mipmap-hdpi/ic_launcher.png +0 -0
  165. package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/mipmap-mdpi/ic_launcher.png +0 -0
  166. package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/mipmap-xhdpi/ic_launcher.png +0 -0
  167. package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  168. package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  169. package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/raw/configuration.json +7 -0
  170. package/dist/templates/platforms/androidtv/project/app/src/portal/java/com/twentyfouri/tvbridge/Flavor.kt +10 -0
  171. package/dist/templates/platforms/androidtv/project/app/src/portal/res/raw/configuration.json +7 -0
  172. package/dist/templates/platforms/androidtv/project/app/src/portalDrm/java/com/twentyfouri/tvbridge/Flavor.kt +10 -0
  173. package/dist/templates/platforms/androidtv/project/app/src/portalDrm/res/drawable/banner.png +0 -0
  174. package/dist/templates/platforms/androidtv/project/app/src/portalDrm/res/raw/configuration.json +6 -0
  175. package/dist/templates/platforms/androidtv/project/app/src/pureflix/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  176. package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/drawable/banner.png +0 -0
  177. package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/mipmap-hdpi/ic_launcher.png +0 -0
  178. package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/mipmap-mdpi/ic_launcher.png +0 -0
  179. package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/mipmap-xhdpi/ic_launcher.png +0 -0
  180. package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  181. package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  182. package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/raw/configuration.json +6 -0
  183. package/dist/templates/platforms/androidtv/project/app/src/rfa/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  184. package/dist/templates/platforms/androidtv/project/app/src/rfa/res/drawable/banner.png +0 -0
  185. package/dist/templates/platforms/androidtv/project/app/src/rfa/res/mipmap-hdpi/ic_launcher.png +0 -0
  186. package/dist/templates/platforms/androidtv/project/app/src/rfa/res/mipmap-mdpi/ic_launcher.png +0 -0
  187. package/dist/templates/platforms/androidtv/project/app/src/rfa/res/mipmap-xhdpi/ic_launcher.png +0 -0
  188. package/dist/templates/platforms/androidtv/project/app/src/rfa/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  189. package/dist/templates/platforms/androidtv/project/app/src/rfa/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  190. package/dist/templates/platforms/androidtv/project/app/src/rfa/res/raw/configuration.json +7 -0
  191. package/dist/templates/platforms/androidtv/project/app/src/rfe/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  192. package/dist/templates/platforms/androidtv/project/app/src/rfe/res/drawable/banner.png +0 -0
  193. package/dist/templates/platforms/androidtv/project/app/src/rfe/res/mipmap-hdpi/ic_launcher.png +0 -0
  194. package/dist/templates/platforms/androidtv/project/app/src/rfe/res/mipmap-mdpi/ic_launcher.png +0 -0
  195. package/dist/templates/platforms/androidtv/project/app/src/rfe/res/mipmap-xhdpi/ic_launcher.png +0 -0
  196. package/dist/templates/platforms/androidtv/project/app/src/rfe/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  197. package/dist/templates/platforms/androidtv/project/app/src/rfe/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  198. package/dist/templates/platforms/androidtv/project/app/src/rfe/res/raw/configuration.json +6 -0
  199. package/dist/templates/platforms/androidtv/project/app/src/rte/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  200. package/dist/templates/platforms/androidtv/project/app/src/rte/res/drawable/banner.png +0 -0
  201. package/dist/templates/platforms/androidtv/project/app/src/rte/res/mipmap-hdpi/ic_launcher.png +0 -0
  202. package/dist/templates/platforms/androidtv/project/app/src/rte/res/mipmap-mdpi/ic_launcher.png +0 -0
  203. package/dist/templates/platforms/androidtv/project/app/src/rte/res/mipmap-xhdpi/ic_launcher.png +0 -0
  204. package/dist/templates/platforms/androidtv/project/app/src/rte/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  205. package/dist/templates/platforms/androidtv/project/app/src/rte/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  206. package/dist/templates/platforms/androidtv/project/app/src/rte/res/raw/configuration.json +9 -0
  207. package/dist/templates/platforms/androidtv/project/app/src/sentai/google-services.json +191 -0
  208. package/dist/templates/platforms/androidtv/project/app/src/sentai/res/mipmap-hdpi/ic_launcher.png +0 -0
  209. package/dist/templates/platforms/androidtv/project/app/src/sentai/res/mipmap-mdpi/ic_launcher.png +0 -0
  210. package/dist/templates/platforms/androidtv/project/app/src/sentai/res/mipmap-xhdpi/ic_launcher.png +0 -0
  211. package/dist/templates/platforms/androidtv/project/app/src/sentai/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  212. package/dist/templates/platforms/androidtv/project/app/src/sentai/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  213. package/dist/templates/platforms/androidtv/project/app/src/sentai/res/raw/configuration.json +15 -0
  214. package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/google-services.json +191 -0
  215. package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/java/com/twentyfouri/tvbridge/Flavor.kt +54 -0
  216. package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/java/com/twentyfouri/tvbridge/SentaiRequestData.kt +13 -0
  217. package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/drawable/banner.png +0 -0
  218. package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/mipmap-hdpi/ic_launcher.png +0 -0
  219. package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/mipmap-mdpi/ic_launcher.png +0 -0
  220. package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/mipmap-xhdpi/ic_launcher.png +0 -0
  221. package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  222. package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  223. package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/raw/configuration.json +14 -0
  224. package/dist/templates/platforms/androidtv/project/app/src/smartott/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  225. package/dist/templates/platforms/androidtv/project/app/src/smartott/res/mipmap-hdpi/ic_launcher.png +0 -0
  226. package/dist/templates/platforms/androidtv/project/app/src/smartott/res/mipmap-mdpi/ic_launcher.png +0 -0
  227. package/dist/templates/platforms/androidtv/project/app/src/smartott/res/mipmap-xhdpi/ic_launcher.png +0 -0
  228. package/dist/templates/platforms/androidtv/project/app/src/smartott/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  229. package/dist/templates/platforms/androidtv/project/app/src/smartott/res/raw/configuration.json +6 -0
  230. package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/java/com/twentyfouri/tvbridge/Flavor.kt +9 -0
  231. package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/mipmap-hdpi/ic_launcher.png +0 -0
  232. package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/mipmap-mdpi/ic_launcher.png +0 -0
  233. package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/mipmap-xhdpi/ic_launcher.png +0 -0
  234. package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  235. package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  236. package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/raw/configuration.json +6 -0
  237. package/dist/templates/platforms/androidtv/project/app/src/topic/java/com/twentyfouri/tvbridge/Flavor.kt +9 -0
  238. package/dist/templates/platforms/androidtv/project/app/src/topic/res/drawable/banner.png +0 -0
  239. package/dist/templates/platforms/androidtv/project/app/src/topic/res/mipmap-hdpi/ic_launcher.png +0 -0
  240. package/dist/templates/platforms/androidtv/project/app/src/topic/res/mipmap-mdpi/ic_launcher.png +0 -0
  241. package/dist/templates/platforms/androidtv/project/app/src/topic/res/mipmap-xhdpi/ic_launcher.png +0 -0
  242. package/dist/templates/platforms/androidtv/project/app/src/topic/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  243. package/dist/templates/platforms/androidtv/project/app/src/topic/res/raw/configuration.json +9 -0
  244. package/dist/templates/platforms/androidtv/project/app/src/voa/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  245. package/dist/templates/platforms/androidtv/project/app/src/voa/res/drawable/banner.png +0 -0
  246. package/dist/templates/platforms/androidtv/project/app/src/voa/res/mipmap-hdpi/ic_launcher.png +0 -0
  247. package/dist/templates/platforms/androidtv/project/app/src/voa/res/mipmap-mdpi/ic_launcher.png +0 -0
  248. package/dist/templates/platforms/androidtv/project/app/src/voa/res/mipmap-xhdpi/ic_launcher.png +0 -0
  249. package/dist/templates/platforms/androidtv/project/app/src/voa/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  250. package/dist/templates/platforms/androidtv/project/app/src/voa/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  251. package/dist/templates/platforms/androidtv/project/app/src/voa/res/raw/configuration.json +7 -0
  252. package/dist/templates/platforms/androidtv/project/app/src/voa365/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  253. package/dist/templates/platforms/androidtv/project/app/src/voa365/res/drawable/banner.png +0 -0
  254. package/dist/templates/platforms/androidtv/project/app/src/voa365/res/mipmap-hdpi/ic_launcher.png +0 -0
  255. package/dist/templates/platforms/androidtv/project/app/src/voa365/res/mipmap-mdpi/ic_launcher.png +0 -0
  256. package/dist/templates/platforms/androidtv/project/app/src/voa365/res/mipmap-xhdpi/ic_launcher.png +0 -0
  257. package/dist/templates/platforms/androidtv/project/app/src/voa365/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  258. package/dist/templates/platforms/androidtv/project/app/src/voa365/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  259. package/dist/templates/platforms/androidtv/project/app/src/voa365/res/raw/configuration.json +7 -0
  260. package/dist/templates/platforms/androidtv/project/app/src/youFone/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
  261. package/dist/templates/platforms/androidtv/project/app/src/youFone/res/raw/configuration.json +6 -0
  262. package/dist/templates/platforms/androidtv/project/build.gradle +52 -0
  263. package/dist/templates/platforms/androidtv/project/common/build.gradle +38 -0
  264. package/dist/templates/platforms/androidtv/project/common/consumer-rules.pro +0 -0
  265. package/dist/templates/platforms/androidtv/project/common/proguard-rules.pro +21 -0
  266. package/dist/templates/platforms/androidtv/project/common/src/main/AndroidManifest.xml +4 -0
  267. package/dist/templates/platforms/androidtv/project/common/src/main/java/com/twentyfouri/tvbridge/common/IapService.kt +114 -0
  268. package/dist/templates/platforms/androidtv/project/googleiap/build.gradle +40 -0
  269. package/dist/templates/platforms/androidtv/project/googleiap/consumer-rules.pro +0 -0
  270. package/dist/templates/platforms/androidtv/project/googleiap/proguard-rules.pro +21 -0
  271. package/dist/templates/platforms/androidtv/project/googleiap/src/main/AndroidManifest.xml +6 -0
  272. package/dist/templates/platforms/androidtv/project/googleiap/src/main/java/com/twentyfouri/tvbridge/googleiap/GoogleIapService.kt +29 -0
  273. package/dist/templates/platforms/androidtv/project/gradle/wrapper/gradle-wrapper.jar +0 -0
  274. package/dist/templates/platforms/androidtv/project/gradle/wrapper/gradle-wrapper.properties +6 -0
  275. package/dist/templates/platforms/androidtv/project/gradle.properties +5 -0
  276. package/dist/templates/platforms/androidtv/project/keystore/debug_madrid.jks +0 -0
  277. package/dist/templates/platforms/androidtv/project/proguard-rules.pro +42 -0
  278. package/dist/templates/platforms/androidtv/project/settings.gradle +4 -0
  279. package/package.json +3 -2
@@ -0,0 +1,26 @@
1
+ package com.twentyfouri.tvbridge.global.di
2
+
3
+ import javax.inject.Scope
4
+
5
+ /*
6
+ * Copyright (C) 2013 Square, Inc.
7
+ *
8
+ * Licensed under the Apache License, Version 2.0 (the "License");
9
+ * you may not use this file except in compliance with the License.
10
+ * You may obtain a copy of the License at
11
+ *
12
+ * http://www.apache.org/licenses/LICENSE-2.0
13
+ *
14
+ * Unless required by applicable law or agreed to in writing, software
15
+ * distributed under the License is distributed on an "AS IS" BASIS,
16
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ * See the License for the specific language governing permissions and
18
+ * limitations under the License.
19
+ */ /**
20
+ * A scoping annotation to permit objects whose lifetime should
21
+ * conform to the life of the activity to be memoized in the
22
+ * correct component.
23
+ */
24
+ @Scope
25
+ @kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
26
+ annotation class PerActivity
@@ -0,0 +1,184 @@
1
+ package com.twentyfouri.tvbridge.global.utils
2
+
3
+ import android.net.Uri
4
+ import android.text.TextUtils
5
+ import android.util.Base64
6
+ import android.util.Log
7
+ import com.google.android.exoplayer2.C
8
+ import com.google.android.exoplayer2.drm.ExoMediaDrm
9
+ import com.google.android.exoplayer2.upstream.DataSourceInputStream
10
+ import com.google.android.exoplayer2.upstream.DataSpec
11
+ import com.google.android.exoplayer2.upstream.HttpDataSource
12
+ import com.google.android.exoplayer2.util.Assertions
13
+ import com.google.android.exoplayer2.util.Util
14
+ import com.twentyfouri.smartexoplayer.drm.SmartMediaDrmCallback
15
+ import com.twentyfouri.smartexoplayer.model.DrmConfiguration
16
+ import com.twentyfouri.tvbridge.BuildConfig
17
+ import org.json.JSONException
18
+ import org.json.JSONObject
19
+ import java.io.BufferedReader
20
+ import java.io.IOException
21
+ import java.io.InputStreamReader
22
+ import java.net.MalformedURLException
23
+ import java.net.URL
24
+ import java.net.URLEncoder
25
+ import java.util.HashMap
26
+ import java.util.UUID
27
+
28
+ class HttpMediaDrmCallback(
29
+ private val defaultLicenseUrl: String?,
30
+ private val forceDefaultLicenseUrl: Boolean,
31
+ private val dataSourceFactory: HttpDataSource.Factory
32
+ ) : SmartMediaDrmCallback {
33
+
34
+ private val keyRequestProperties = HashMap<String, String>()
35
+
36
+ /**
37
+ * @param defaultLicenseUrl The default license URL. Used for key requests that do not specify
38
+ * their own license URL.
39
+ * @param dataSourceFactory A factory from which to obtain [HttpDataSource] instances.
40
+ */
41
+ constructor(defaultLicenseUrl: String, dataSourceFactory: HttpDataSource.Factory) : this(defaultLicenseUrl, false, dataSourceFactory) {}
42
+
43
+ /**
44
+ * Sets a header for key requests made by the callback.
45
+ *
46
+ * @param name The name of the header field.
47
+ * @param value The value of the field.
48
+ */
49
+ override fun setKeyRequestProperty(name: String, value: String) {
50
+ Log.d(TAG, "setKeyRequestProperty")
51
+ Assertions.checkNotNull(name)
52
+ Assertions.checkNotNull(value)
53
+ synchronized(keyRequestProperties) { keyRequestProperties.put(name, value) }
54
+ }
55
+
56
+ /**
57
+ * Clears a header for key requests made by the callback.
58
+ *
59
+ * @param name The name of the header field.
60
+ */
61
+ override fun clearKeyRequestProperty(name: String) {
62
+ Log.d(TAG, "clearKeyRequestProperty")
63
+ Assertions.checkNotNull(name)
64
+ synchronized(keyRequestProperties) { keyRequestProperties.remove(name) }
65
+ }
66
+
67
+ /**
68
+ * Clears all headers for key requests made by the callback.
69
+ */
70
+ override fun clearAllKeyRequestProperties() {
71
+ Log.d(TAG, "clearAllKeyRequestProperties")
72
+ synchronized(keyRequestProperties) { keyRequestProperties.clear() }
73
+ }
74
+
75
+ @Throws(IOException::class)
76
+ override fun executeProvisionRequest(uuid: UUID, request: ExoMediaDrm.ProvisionRequest): ByteArray {
77
+ Log.d(TAG, "executeProvisionRequest")
78
+ val url = request.defaultUrl + "&signedRequest=" + String(request.data)
79
+ return executePost(dataSourceFactory, url, ByteArray(0), null)
80
+ }
81
+
82
+ @Throws(Exception::class)
83
+ override fun executeKeyRequest(uuid: UUID, request: ExoMediaDrm.KeyRequest): ByteArray {
84
+ Log.d(TAG, "executeKeyRequest")
85
+ var url: String? = request.licenseServerUrl
86
+ if (forceDefaultLicenseUrl || url.isNullOrEmpty()) {
87
+ url = defaultLicenseUrl
88
+ }
89
+ val requestProperties: MutableMap<String, String> = HashMap()
90
+ // Add standard request properties for supported schemes.
91
+ val contentType = "text/plain"
92
+ requestProperties["Content-Type"] = contentType
93
+ if (C.PLAYREADY_UUID == uuid) {
94
+ requestProperties["SOAPAction"] = "http://schemas.microsoft.com/DRM/2007/03/protocols/AcquireLicense"
95
+ }
96
+ // Add additional request properties.
97
+ synchronized(keyRequestProperties) { requestProperties.putAll(keyRequestProperties) }
98
+
99
+ //adding data to url
100
+ val challenge = request.data
101
+ val encoded = URLEncoder.encode(Base64.encodeToString(challenge, Base64.NO_WRAP), "UTF-8")
102
+ url = appendQuery(url, "_widevineChallenge=$encoded")
103
+ if (BuildConfig.DEBUG) {
104
+ Log.d(TAG, "Executing post on url $url with content type $contentType")
105
+ }
106
+ return executeGet(url)
107
+ }
108
+
109
+ class Factory(
110
+ private val licenseUrl: String?,
111
+ private val forceDefaultUrl: Boolean
112
+ ) : SmartMediaDrmCallback.Factory {
113
+ override fun build(drm: DrmConfiguration, dataSourceFactory: HttpDataSource.Factory): SmartMediaDrmCallback =
114
+ HttpMediaDrmCallback(licenseUrl, forceDefaultUrl, dataSourceFactory)
115
+ }
116
+
117
+ companion object {
118
+ private const val TAG = "DrmCallback"
119
+
120
+ private fun executeGet(urlString: String): ByteArray {
121
+ var licenserRequest: URL? = null
122
+ try {
123
+ licenserRequest = URL(urlString)
124
+ val yc = licenserRequest.openConnection()
125
+ val input = BufferedReader(InputStreamReader(yc.getInputStream()))
126
+ val builder = StringBuilder()
127
+ var inputLine: String?
128
+ while (input.readLine().also { inputLine = it } != null) {
129
+ builder.append(inputLine)
130
+ }
131
+ input.close()
132
+ val jsonObject = JSONObject(builder.toString())
133
+ val container = jsonObject.getJSONObject("getWidevineLicenseResponse")
134
+ val license = container.getString("license")
135
+ if (BuildConfig.DEBUG) {
136
+ Log.d(TAG, "Finished post: $license")
137
+ }
138
+ return Base64.decode(license, Base64.NO_WRAP)
139
+ } catch (e: MalformedURLException) {
140
+ e.printStackTrace()
141
+ } catch (e: IOException) {
142
+ e.printStackTrace()
143
+ } catch (e: JSONException) {
144
+ e.printStackTrace()
145
+ }
146
+ return byteArrayOf()
147
+ }
148
+
149
+ @Throws(IOException::class)
150
+ private fun executePost(
151
+ dataSourceFactory: HttpDataSource.Factory,
152
+ url: String,
153
+ data: ByteArray,
154
+ requestProperties: Map<String, String>?
155
+ ): ByteArray {
156
+ Log.d(TAG, "executePost")
157
+ val dataSource = dataSourceFactory.createDataSource()
158
+ if (requestProperties != null) {
159
+ for ((key, value) in requestProperties) {
160
+ dataSource.setRequestProperty(key, value)
161
+ }
162
+ }
163
+ val dataSpec = DataSpec(Uri.parse(url), data, 0, 0, C.LENGTH_UNSET.toLong(), null,
164
+ DataSpec.FLAG_ALLOW_GZIP)
165
+ val inputStream = DataSourceInputStream(dataSource, dataSpec)
166
+ return try {
167
+ Util.toByteArray(inputStream)
168
+ } finally {
169
+ Util.closeQuietly(inputStream)
170
+ }
171
+ }
172
+
173
+ fun appendQuery(url: String?, appendQuery: String): String {
174
+ val oldUri = Uri.parse(url)
175
+ var newQuery = oldUri.query
176
+ if (newQuery == null) {
177
+ newQuery = appendQuery
178
+ } else {
179
+ newQuery += "&$appendQuery"
180
+ }
181
+ return oldUri.scheme + "://" + oldUri.authority + oldUri.path + "?" + newQuery
182
+ }
183
+ }
184
+ }
@@ -0,0 +1,30 @@
1
+ package com.twentyfouri.tvbridge.global.utils
2
+
3
+ import android.content.Context
4
+ import android.content.SharedPreferences
5
+
6
+ class LocalStorage(context: Context) {
7
+
8
+ private val preferences: SharedPreferences =
9
+ context.applicationContext.getSharedPreferences(SHARED_PREFERENCES, Context.MODE_PRIVATE)
10
+
11
+ fun saveCookieJson(key: String?, value: String?) {
12
+ val editor = preferences.edit()
13
+ editor.putString(key, value)
14
+ editor.apply()
15
+ }
16
+
17
+ fun removeFromLocalStorage(key: String?) {
18
+ val editor = preferences.edit()
19
+ editor.remove(key)
20
+ editor.apply()
21
+ }
22
+
23
+ fun getFromLocalStorage(key: String?): String? {
24
+ return preferences.getString(key, null)
25
+ }
26
+
27
+ companion object {
28
+ private const val SHARED_PREFERENCES = "com.twentyfouri.tvbridge"
29
+ }
30
+ }
@@ -0,0 +1,46 @@
1
+ package com.twentyfouri.tvbridge.global.utils
2
+
3
+ import android.util.Base64
4
+ import android.util.Log
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
11
+ import java.util.*
12
+
13
+ class LoggingDrmCallback(
14
+ private val licenseUrl: String?,
15
+ forceDefaultUrl: Boolean,
16
+ dataSourceFactory: HttpDataSource.Factory
17
+ ) : SmartHttpMediaDrmCallback(licenseUrl, forceDefaultUrl, dataSourceFactory) {
18
+
19
+ @Throws(Exception::class)
20
+ override fun executeKeyRequest(uuid: UUID, request: ExoMediaDrm.KeyRequest): ByteArray {
21
+ if (BuildConfig.DEBUG) {
22
+ Log.v(TAG, "DRM Embedded URL: ${request.licenseServerUrl}")
23
+ Log.v(TAG, "DRM Default URL: ${licenseUrl}")
24
+ Log.v(TAG, "DRM request:\n${request.data.toBase64()}")
25
+ }
26
+ val response = super.executeKeyRequest(uuid, request)
27
+ if (BuildConfig.DEBUG) {
28
+ Log.v(TAG, "DRM response:\n" + response.toBase64())
29
+ }
30
+ return response
31
+ }
32
+
33
+ private fun ByteArray.toBase64(): String = Base64.encodeToString(this, Base64.DEFAULT)
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
+ companion object {
44
+ private const val TAG = "DrmCallback"
45
+ }
46
+ }
@@ -0,0 +1,32 @@
1
+ package com.twentyfouri.tvbridge.global.utils
2
+
3
+ import android.app.Activity
4
+ import android.app.Application.ActivityLifecycleCallbacks
5
+ import android.os.Bundle
6
+
7
+ abstract class SimpleActivityLifecycleCallback : ActivityLifecycleCallbacks {
8
+
9
+ override fun onActivityStarted(activity: Activity) {
10
+ //Do nothing
11
+ }
12
+
13
+ override fun onActivityResumed(activity: Activity) {
14
+ //Do nothing
15
+ }
16
+
17
+ override fun onActivityPaused(activity: Activity) {
18
+ //Do nothing
19
+ }
20
+
21
+ override fun onActivityStopped(activity: Activity) {
22
+ //Do nothing
23
+ }
24
+
25
+ override fun onActivitySaveInstanceState(activity: Activity, bundle: Bundle) {
26
+ //Do nothing
27
+ }
28
+
29
+ override fun onActivityDestroyed(activity: Activity) {
30
+ //Do nothing
31
+ }
32
+ }
@@ -0,0 +1,209 @@
1
+ package com.twentyfouri.tvbridge.jump
2
+
3
+ import android.util.Log
4
+ import com.google.android.exoplayer2.SimpleExoPlayer
5
+ import com.google.gson.JsonObject
6
+ import com.twentyfouri.tvbridge.BuildConfig
7
+ import com.twentyfouri.tvbridge.webview.model.AnalyticsPlaybackInfo
8
+ import jump.JumpKit
9
+ import jump.insights.models.contextinformation.*
10
+ import jump.insights.models.track.events.JKContentType
11
+ import jump.insights.models.track.events.JKTransactionType
12
+ import jump.libs.gson.annotations.SerializedName
13
+ import java.util.*
14
+
15
+ class JumpAnalytics {
16
+
17
+ private var started = false
18
+ private var hasContent = false
19
+
20
+ fun setPlaybackInfo(playbackInfo: AnalyticsPlaybackInfo) {
21
+ setApplicationId(playbackInfo.id ?: return)
22
+ setUserInfo(playbackInfo.userInfo)
23
+ setContentInfo(playbackInfo.contentInfo)
24
+ }
25
+
26
+ private fun setApplicationId(applicationId: String) {
27
+ if (started) return
28
+ started = true
29
+ JumpKit.setDebugMode(BuildConfig.DEBUG)
30
+ JumpKit.start(applicationId)
31
+ }
32
+
33
+ private fun setUserInfo(params: JsonObject?) {
34
+ JumpKit.insights.setUserInfo(parseUserInfo(params))
35
+ }
36
+
37
+ private fun setContentInfo(params: JsonObject?) {
38
+ val contentInfo = parseContentInfo(params)
39
+ jump.exoplayerextension.JumpKit.insights.setContentInfo(contentInfo)
40
+ hasContent = true
41
+ }
42
+
43
+ fun setVideoPlayer(player: SimpleExoPlayer?) {
44
+ if (player == null) {
45
+ /* NOTICE: passing null also causes insights.setContentInfo(null) */
46
+ jump.exoplayerextension.JumpKit.insights.setVideoPlayer(null)
47
+ hasContent = false
48
+ } else if (started && hasContent) {
49
+ jump.exoplayerextension.JumpKit.insights.setVideoPlayer(player)
50
+ } else if (started) {
51
+ Log.w("JumpAnalytics", "No content data available. Did you call SetPlaybackInfo before SetVideoPath?")
52
+ }
53
+ }
54
+
55
+ private fun parseUserInfo(params: JsonObject?): JKUserInfo {
56
+ return try {
57
+ var userType = parseEnum(params, "userType", JKUserType::class.java)
58
+ if (userType == null) userType = JKUserType.ANONYMOUS
59
+ val userId = parseString(params, "userId")
60
+ val userCountry = parseString(params, "userCountry")
61
+ val userBirthDate = parseString(params, "userBirthDate")
62
+ var userSex = parseEnum(params, "userSex", JKUserSex::class.java)
63
+ if (userSex == null) userSex = JKUserSex.UNDEFINED
64
+ val userProfileId = parseString(params, "userProfileId")
65
+ val userOperator = parseString(params, "userOperator")
66
+ if (userType == JKUserType.ANONYMOUS) JKUserInfo.anonymousInstance() else JKUserInfo(userType, userId, userCountry, userBirthDate, userSex, userProfileId, userOperator)
67
+ } catch (e: Exception) {
68
+ Log.w("JumpAnalytics", "Parsing userInfo failed. Falling back to ANONYMOUS", e)
69
+ JKUserInfo.anonymousInstance()
70
+ }
71
+ }
72
+
73
+ private fun parseCategory(params: JsonObject?, property: String): JKContextCategory? {
74
+ val jsonValue = params?.get(property) ?: return null
75
+ return if (!jsonValue.isJsonObject) null else parseCategory(jsonValue.asJsonObject)
76
+ }
77
+
78
+ private fun parseCategory(params: JsonObject): JKContextCategory {
79
+ return JKContextCategory(
80
+ parseString(params, "categoryId"),
81
+ parseString(params, "categoryName")
82
+ )
83
+ }
84
+
85
+ private fun parseSubCategory(params: JsonObject?, property: String): JKContextSubcategory? {
86
+ val jsonValue = params?.get(property) ?: return null
87
+ return if (!jsonValue.isJsonObject) null else parseSubCategory(jsonValue.asJsonObject)
88
+ }
89
+
90
+ private fun parseSubCategory(params: JsonObject): JKContextSubcategory {
91
+ return JKContextSubcategory(
92
+ parseString(params, "subcategoryId"),
93
+ parseString(params, "categoryId"),
94
+ parseString(params, "subcategoryName")
95
+ )
96
+ }
97
+
98
+ private fun parseGenre(params: JsonObject): JKContextGenre {
99
+ return JKContextGenre(
100
+ parseString(params, "genreId"),
101
+ parseString(params, "genreName"),
102
+ parseCategory(params, "categoryId"),
103
+ parseSubCategory(params, "subCategoryId")
104
+ )
105
+ }
106
+
107
+ private fun parseContentInfo(params: JsonObject?): JKContextContent {
108
+ return JKContextContent(
109
+ parseString(params, "contentId"),
110
+ parseString(params, "contentTitle"),
111
+ parseString(params, "contentSerieTitle"),
112
+ parseInteger(params, "contentEpisodeNumber"),
113
+ parseInteger(params, "contentSeasonNumber"),
114
+ parseString(params, "contentDescription"),
115
+ parseCategory(params, "contentCategory"),
116
+ parseSubCategory(params, "contentSubCategory"),
117
+ parseGenres(params, "contentGenres"),
118
+ parseString(params, "contentProvider"),
119
+ parseEnum(params, "contentTransactionType", JKTransactionType::class.java),
120
+ parseEnum(params, "contentType", JKContentType::class.java),
121
+ parseString(params, "contentLanguage")
122
+ )
123
+ }
124
+
125
+ private fun parseGenres(container: JsonObject?, property: String): List<JKContextGenre>? {
126
+ if (container == null) return null
127
+ val jsonValue = container[property] ?: return null
128
+ if (!jsonValue.isJsonArray) return null
129
+ val list = ArrayList<JKContextGenre>()
130
+ for (jsonElement in jsonValue.asJsonArray) {
131
+ if (!jsonElement.isJsonObject) continue
132
+ list.add(parseGenre(jsonElement.asJsonObject))
133
+ }
134
+ return list
135
+ }
136
+
137
+ private fun <T : Enum<T>> parseEnum(container: JsonObject?, property: String, type: Class<T>): T? {
138
+ if (container == null) return null
139
+ val jsonValue = container[property] ?: return null
140
+ if (!jsonValue.isJsonPrimitive) return null
141
+ val primitive = jsonValue.asJsonPrimitive
142
+ return when {
143
+ primitive.isString ->
144
+ parseEnum(type, jsonValue.asString)
145
+ primitive.isNumber ->
146
+ parseEnum(type, jsonValue.asInt)
147
+ else ->
148
+ null
149
+ }
150
+ }
151
+
152
+ private fun <T : Enum<T>> parseEnum(type: Class<T>, value: String): T? {
153
+ try {
154
+ for (constant in type.enumConstants ?: return null) {
155
+ val name = constant.name
156
+ if (name == value) {
157
+ return constant
158
+ }
159
+ val annotation = type.getField(name).getAnnotation(SerializedName::class.java)
160
+ if (annotation != null) {
161
+ if (annotation.value == value) {
162
+ return constant
163
+ }
164
+ }
165
+ }
166
+ return null
167
+ } catch (e: NoSuchFieldException) {
168
+ return null
169
+ }
170
+ }
171
+
172
+ @Suppress("UNCHECKED_CAST")
173
+ private fun <T : Enum<T>> parseEnum(type: Class<T>, value: Int): T? {
174
+ return try {
175
+ val map = type.getDeclaredField("mapper")[null] as Map<T, Int>
176
+ for ((key, value1) in map) {
177
+ if (value1 == value) {
178
+ return key
179
+ }
180
+ }
181
+ null
182
+ } catch (e: ClassCastException) {
183
+ null
184
+ } catch (e: IllegalAccessException) {
185
+ null
186
+ } catch (e: NoSuchFieldException) {
187
+ null
188
+ }
189
+ }
190
+
191
+ private fun parseString(container: JsonObject?, property: String): String? {
192
+ if (container == null) return null
193
+ var jsonValue = container[property]
194
+ if (jsonValue == null && property.endsWith("Id")) {
195
+ // inconsistencies in SDK cause confusion, try uppercased xxxxID just in case
196
+ jsonValue = container[property.replace("Id", "ID")]
197
+ }
198
+ if (jsonValue == null) return null
199
+ if (!jsonValue.isJsonPrimitive) return null
200
+ return if (!jsonValue.asJsonPrimitive.isString) null else jsonValue.asString
201
+ }
202
+
203
+ private fun parseInteger(container: JsonObject?, property: String): Int? {
204
+ if (container == null) return null
205
+ val jsonValue = container[property] ?: return null
206
+ if (!jsonValue.isJsonPrimitive) return null
207
+ return if (!jsonValue.asJsonPrimitive.isNumber) null else jsonValue.asInt
208
+ }
209
+ }
@@ -0,0 +1,86 @@
1
+ package com.twentyfouri.tvbridge.sound
2
+
3
+ import android.content.Context
4
+ import android.media.AudioManager
5
+ import android.media.MediaPlayer
6
+ import android.provider.MediaStore
7
+ import android.util.Log
8
+ import androidx.annotation.IntRange
9
+ import androidx.annotation.RawRes
10
+ import com.twentyfouri.tvbridge.R
11
+
12
+ /**
13
+ * Play touch sound. Uses queue to handle several overlapping sounds
14
+ * Configuration:
15
+ * MEDIA_PLAYER_LIST_SIZE: Number of parallel touch sounds that can be played at once
16
+ * TOUCH_SOUND_RES: Resource ID of touch sound to be used
17
+ * USE_NATIVE_SOUND: Uses native click sound from AudioManager, don't use overlapping & queue at all
18
+ */
19
+ class TouchPlayer(
20
+ private val context: Context
21
+ ) : MediaPlayer.OnCompletionListener {
22
+
23
+ companion object {
24
+ private const val MEDIA_PLAYER_LIST_SIZE = 1L
25
+ @RawRes
26
+ private const val TOUCH_SOUND_RES = R.raw.click
27
+ private const val USE_NATIVE_SOUND = true
28
+ private var audioManager: AudioManager? = null
29
+ }
30
+
31
+ private var mediaPlayerList = mutableListOf<MediaPlayer>()
32
+
33
+ @IntRange(from = 0, to = MEDIA_PLAYER_LIST_SIZE - 1)
34
+ private var mediaPlayerListIterator: Int = 0
35
+
36
+ init {
37
+ for (i in 0 until Companion.MEDIA_PLAYER_LIST_SIZE) {
38
+ mediaPlayerList.add(getNewPlayer())
39
+ }
40
+ if (USE_NATIVE_SOUND) {
41
+ audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
42
+ }
43
+ }
44
+
45
+ fun play() {
46
+ Log.d("TouchPlayer", "Touch event envoked")
47
+ audioManager?.playSoundEffect(AudioManager.FX_KEY_CLICK)
48
+ ?: getAvailableMediaPlayer()?.start()
49
+ }
50
+
51
+ override fun onCompletion(mp: MediaPlayer) {
52
+ if (mp in mediaPlayerList) {
53
+ mediaPlayerList[mediaPlayerList.indexOf(mp)] = getNewPlayer()
54
+ mp.release()
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Returns available player from buffer. If there is no available player already, it returns null
60
+ */
61
+ private fun getAvailableMediaPlayer(): MediaPlayer? {
62
+ val nextIter = if (MEDIA_PLAYER_LIST_SIZE.toInt() == 1) {
63
+ mediaPlayerListIterator
64
+ } else {
65
+ ++mediaPlayerListIterator / MEDIA_PLAYER_LIST_SIZE.toInt()
66
+ }
67
+ val selectedPlayer = mediaPlayerList[mediaPlayerListIterator]
68
+
69
+ return if (selectedPlayer.isPlaying) { // We reached the end of available buffer
70
+ null
71
+ } else {
72
+ mediaPlayerListIterator = nextIter
73
+ selectedPlayer
74
+ }
75
+ }
76
+
77
+ private fun getNewPlayer(): MediaPlayer {
78
+ val mediaPlayer = MediaPlayer()
79
+ mediaPlayer.setAudioStreamType(AudioManager.STREAM_SYSTEM)
80
+ mediaPlayer.setOnCompletionListener(this)
81
+ val afd = context.resources.openRawResourceFd(TOUCH_SOUND_RES)
82
+ mediaPlayer.setDataSource(afd.fileDescriptor, afd.startOffset, afd.length)
83
+ mediaPlayer.prepare()
84
+ return mediaPlayer
85
+ }
86
+ }