@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,569 @@
1
+ package com.twentyfouri.tvbridge.webview.viewmodel
2
+
3
+ import android.app.Activity
4
+ import android.content.Context
5
+ import android.content.Intent
6
+ import android.net.Uri
7
+ import android.os.Build
8
+ import android.util.Log
9
+ import android.view.KeyEvent
10
+ import android.view.View
11
+ import android.webkit.CookieManager
12
+ import android.webkit.WebView
13
+ import androidx.databinding.BaseObservable
14
+ import androidx.databinding.Bindable
15
+ import com.google.android.exoplayer2.ExoPlaybackException
16
+ import com.google.android.exoplayer2.Player
17
+ import com.google.android.exoplayer2.SeekParameters
18
+ import com.google.android.exoplayer2.source.TrackGroupArray
19
+ import com.google.android.exoplayer2.trackselection.TrackSelectionArray
20
+ import com.google.android.exoplayer2.upstream.DefaultHttpDataSource
21
+ import com.google.android.exoplayer2.upstream.DefaultHttpDataSourceFactory
22
+ import com.google.android.exoplayer2.upstream.HttpDataSource
23
+ import com.google.android.exoplayer2.util.Util
24
+ import com.google.gson.JsonArray
25
+ import com.google.gson.JsonObject
26
+ import com.twentyfouri.smartexoplayer.SmartPlayer
27
+ import com.twentyfouri.smartexoplayer.SmartPlayerFactory
28
+ import com.twentyfouri.smartexoplayer.model.DrmConfiguration
29
+ import com.twentyfouri.smartexoplayer.model.PlayerConfigurationModel
30
+ import com.twentyfouri.smartexoplayer.model.PlayerSourceModel
31
+ import com.twentyfouri.smartexoplayer.tracks.TrackInfo
32
+ import com.twentyfouri.smartexoplayer.tracks.TrackPreference
33
+ import com.twentyfouri.smartexoplayer.tracks.TrackPreferences
34
+ import com.twentyfouri.smartexoplayer.tracks.VideoPreference
35
+ import com.twentyfouri.smartexoplayer.ui.TimerHelper
36
+ import com.twentyfouri.tvbridge.BR
37
+ import com.twentyfouri.tvbridge.BuildConfig
38
+ import com.twentyfouri.tvbridge.Flavor
39
+ import com.twentyfouri.tvbridge.bridge.BridgeFromJavaScript
40
+ import com.twentyfouri.tvbridge.bridge.BridgeToJavaScript
41
+ import com.twentyfouri.tvbridge.common.*
42
+ import com.twentyfouri.tvbridge.configuration.BridgeConfig
43
+ import com.twentyfouri.tvbridge.global.utils.HttpMediaDrmCallback
44
+ import com.twentyfouri.tvbridge.global.utils.LocalStorage
45
+ import com.twentyfouri.tvbridge.global.utils.LoggingDrmCallback
46
+ import com.twentyfouri.tvbridge.jump.JumpAnalytics
47
+ import com.twentyfouri.tvbridge.webview.client.BridgeWebView
48
+ import com.twentyfouri.tvbridge.webview.client.BridgeWebViewClient
49
+ import com.twentyfouri.tvbridge.webview.client.BridgeWebViewClient.BridgeWebViewClientCallback
50
+ import com.twentyfouri.tvbridge.webview.model.AnalyticsPlaybackInfo
51
+ import com.twentyfouri.tvbridge.webview.model.ContentModel
52
+ import com.twentyfouri.tvbridge.webview.model.MediaEventType
53
+ import com.twentyfouri.tvbridge.webview.view.Mainview
54
+ import com.twentyfouri.tvbridge.webview.view.PlayerCache
55
+ import javax.inject.Inject
56
+
57
+ /**
58
+ * Created by destivar on 15/02/16.
59
+ */
60
+ class WebViewModel @Inject constructor(
61
+ private val context: Context,
62
+ private val localStorage: LocalStorage,
63
+ private val config: BridgeConfig,
64
+ private val iapService: IapService,
65
+ private val playerFactory: SmartPlayerFactory
66
+ ) : BaseObservable(), Player.EventListener, TimerHelper.Listener {
67
+ private var player: SmartPlayer? = null
68
+ private var view: Mainview? = null
69
+ private val jsBridge = BridgeToJavaScript { s: String? ->
70
+ view?.loadUrl(s)
71
+ }
72
+ private val iapCallback = InnerIapCallback()
73
+ private val playerCache = PlayerCache()
74
+ private val jumpAnalytics = JumpAnalytics()
75
+ private val timerHelper = TimerHelper().also { it.addListener(this) }
76
+
77
+ private var contentModel: ContentModel? = null
78
+
79
+ var audioTrack: TrackInfo? = null
80
+ private set
81
+ var subtitleTrack: TrackInfo? = null
82
+ private set
83
+
84
+ var appUrl: String? = null
85
+
86
+ var urlSetterVisible: Boolean = false
87
+ set(value) {
88
+ if (field == value) return
89
+ field = value
90
+ notifyPropertyChanged(BR.urlSetterVisibility)
91
+ }
92
+
93
+ @get:Bindable
94
+ val urlSetterVisibility: Int
95
+ get() = if (urlSetterVisible) View.VISIBLE else View.GONE
96
+
97
+ private val trackPreferences = TrackPreferences.Builder()
98
+
99
+ fun attachView(view: Mainview?) {
100
+ this.view = view
101
+ if (view != null) {
102
+ iapService.initialize()
103
+ checkNewPurchases()
104
+ timerHelper.onAttachedToWindow()
105
+ } else {
106
+ timerHelper.onDetachedFromWindow()
107
+ }
108
+ }
109
+
110
+ fun configureWebView(webView: BridgeWebView) {
111
+
112
+ // Enable remote debugging on devices at API level 19 (KitKat) or higher.
113
+ if (BuildConfig.DEBUG) {
114
+ WebView.setWebContentsDebuggingEnabled(true)
115
+ }
116
+
117
+ // Add the JavaScript bridge.
118
+ webView.addJavascriptInterface(BridgeFromJavaScript(this), JAVA_SCRIPT_BRIDGE)
119
+
120
+ // WebView callback methods.
121
+ webView.webViewClient = BridgeWebViewClient(object : BridgeWebViewClientCallback {
122
+ override fun onUnhandledKeyEvent(view: WebView, event: KeyEvent) {
123
+ if (event.action == KeyEvent.ACTION_DOWN) {
124
+ sendKeyCode(event.keyCode, MediaEventType.KEY_DOWN)
125
+ } else if (event.action == KeyEvent.ACTION_UP) {
126
+ sendKeyCode(event.keyCode, MediaEventType.KEY_UP)
127
+ }
128
+ }
129
+ })
130
+
131
+ webView.previewKeyEvent = this::dispatchKeyEvent
132
+
133
+ CookieManager.getInstance().setAcceptCookie(true)
134
+ CookieManager.getInstance().setAcceptThirdPartyCookies(webView, true)
135
+ }
136
+
137
+ fun onClickGo() {
138
+ view?.loadUrl(appUrl)
139
+ urlSetterVisible = false
140
+ if (BuildConfig.DEBUG) {
141
+ view?.hideKeyboard()
142
+ }
143
+ }
144
+
145
+ fun setVideo(contentModel: ContentModel) {
146
+ logContentModel(contentModel)
147
+ playDirectly(contentModel)
148
+ }
149
+
150
+ private fun logContentModel(contentModel: ContentModel) {
151
+ Log.i("BridgeVideo", "Url: " + contentModel.streamUrl)
152
+ val drmModel = contentModel.drmModel
153
+ if (drmModel != null) {
154
+ Log.i("BridgeVideo", "DRM: " + drmModel.drmSchemeUuid)
155
+ Log.i("BridgeVideo", "LicenseUrl: " + drmModel.drmLicenseUrl)
156
+ }
157
+ }
158
+
159
+ private fun playInExoPlayerDemoApp(contentModel: ContentModel) {
160
+ val intent = Intent("com.google.android.exoplayer.demo.action.VIEW", Uri.parse(contentModel.streamUrl))
161
+ val drmModel = contentModel.drmModel
162
+ if (drmModel != null) {
163
+ intent.putExtra("drm_scheme", drmModel.drmSchemeUuid)
164
+ intent.putExtra("drm_license_url", drmModel.drmLicenseUrl)
165
+ }
166
+ try {
167
+ context.startActivity(intent)
168
+ } catch (e: Exception) {
169
+ Log.w("WebViewModel", "Failed to start ExoPlayer demo app", e)
170
+ }
171
+ }
172
+
173
+ private fun playDirectly(contentModel: ContentModel) {
174
+ this.contentModel = contentModel
175
+ val playerSourceModel = getPlayerSourceModel(contentModel)
176
+ val playerConfigurationModel = getConfigurationModel(contentModel)
177
+ val player = playerFactory.build(playerConfigurationModel)
178
+ this.player = player
179
+ view?.assignPlayer(player)
180
+ timerHelper.player = player
181
+ jumpAnalytics.setVideoPlayer(player.exoPlayer)
182
+ player.exoPlayer?.setSeekParameters(SeekParameters.CLOSEST_SYNC)
183
+ player.playWhenReady = true
184
+ if (isLowEndDevice) {
185
+ player.trackSelector.trackPreferences = player.trackSelector.trackPreferences.copy(
186
+ video = VideoPreference.Builder().apply {
187
+ maxBitrate = LOW_END_DEVICE_MAX_BITRATE
188
+ }.build()
189
+ )
190
+ }
191
+ player.addListener(this)
192
+ player.prepare(playerSourceModel)
193
+ }
194
+
195
+ private fun getPlayerSourceModel(contentModel: ContentModel): PlayerSourceModel {
196
+ return PlayerSourceModel.Builder().apply {
197
+ uri = contentModel.streamUrl
198
+ contentModel.streamType?.let { extensionOverride = it }
199
+ }.build()
200
+ }
201
+
202
+ private val isLowEndDevice: Boolean
203
+ get() = when (Build.MODEL) {
204
+ "AFTB" -> true
205
+ "AFTM" -> true
206
+ else -> false
207
+ }
208
+
209
+ private fun getConfigurationModel(contentModel: ContentModel): PlayerConfigurationModel {
210
+ val configurationModel = PlayerConfigurationModel.Builder()
211
+ config.playerAppName?.let { configurationModel.userAgent = Util.getUserAgent(context, it) }
212
+ val drmModel = contentModel.drmModel
213
+ if (drmModel != null) {
214
+ val drmConfiguration = DrmConfiguration.Builder()
215
+ drmConfiguration.drmLicenseUrl = drmModel.drmLicenseUrl
216
+ drmConfiguration.drmSchemeUuid = Util.getDrmUuid(drmModel.drmSchemeUuid ?: "widevine")
217
+ val overrideDrmCallback = drmModel.overrideDrmCallback
218
+ ?: config.drm.shouldOverrideDrmCallback()
219
+ if (overrideDrmCallback) {
220
+ drmConfiguration.drmCallbackFactory = HttpMediaDrmCallback.Factory(
221
+ drmModel.drmLicenseUrl, true)
222
+ } else {
223
+ drmConfiguration.drmCallbackFactory = LoggingDrmCallback.Factory(
224
+ drmModel.drmLicenseUrl, true)
225
+ }
226
+ val allowMultiSession = drmModel.multiSessionEnabled ?: config.drm.isMultiSessionEnabled
227
+ drmConfiguration.drmMultiSession = allowMultiSession
228
+ configurationModel.drm = drmConfiguration
229
+ }
230
+ return configurationModel.build()
231
+ }
232
+
233
+ private fun buildHttpDataSourceFactory(): HttpDataSource.Factory {
234
+ return DefaultHttpDataSourceFactory(
235
+ Util.getUserAgent(context, "smartexoplayer"),
236
+ null,
237
+ DefaultHttpDataSource.DEFAULT_CONNECT_TIMEOUT_MILLIS,
238
+ DefaultHttpDataSource.DEFAULT_READ_TIMEOUT_MILLIS,
239
+ true)
240
+ }
241
+
242
+ fun startPlayer() {
243
+ player?.playWhenReady = true
244
+ }
245
+
246
+ fun resumePlayer() {
247
+ val savedContentModel = playerCache.savedContentModel
248
+ if (playerCache.loadFromCache && savedContentModel != null && playerCache.savedPlayerState !== PlayerCache.PlayerState.PAUSED) {
249
+ setVideo(savedContentModel)
250
+ var position = playerCache.savedPlayerPosition
251
+ val player = this.player ?: return
252
+ if (player.isCurrentWindowDynamic) {
253
+ position = 0
254
+ }
255
+ player.seekTo(position)
256
+ view?.requestAudioFocus()
257
+ if (playerCache.savedPlayerState === PlayerCache.PlayerState.PLAYING) {
258
+ player.playWhenReady = true
259
+ }
260
+ } else {
261
+ if (player?.isCurrentWindowDynamic == true) {
262
+ player?.seekTo(0)
263
+ }
264
+ player?.playWhenReady = true
265
+ }
266
+ }
267
+
268
+ fun pausePlayer() {
269
+ player?.playWhenReady = false
270
+ }
271
+
272
+ fun stopPlayer() {
273
+ view?.setBlackCurtainVisibility(View.VISIBLE)
274
+ contentModel = null
275
+
276
+ player?.also { player ->
277
+ player.stop()
278
+ player.release()
279
+ jumpAnalytics.setVideoPlayer(null)
280
+ }
281
+ this.player = null
282
+ }
283
+
284
+ fun releasePlayer() {
285
+ val player = this.player ?: return
286
+ if (contentModel != null) {
287
+ playerCache.loadFromCache = true
288
+ playerCache.savedContentModel = contentModel
289
+ playerCache.savedPlayerDuration = player.duration
290
+ playerCache.savedPlayerPosition = player.currentPosition
291
+ playerCache.savedPlayerState = if (player.isPlaying) PlayerCache.PlayerState.PLAYING else PlayerCache.PlayerState.PAUSED
292
+ }
293
+ timerHelper.player = null
294
+ player.release()
295
+ jumpAnalytics.setVideoPlayer(null)
296
+ view?.assignPlayer(null)
297
+ this.player = null
298
+ }
299
+
300
+ val currentPosition: Int
301
+ get() = player?.currentPosition?.toInt() ?: playerCache.savedPlayerPosition.toInt()
302
+ val duration: Int
303
+ get() = player?.duration?.toInt() ?: playerCache.savedPlayerDuration.toInt()
304
+
305
+ fun seekToPosition(position: Int) {
306
+ player?.seekTo(position.toLong())
307
+ }
308
+
309
+ val isPlayerPlaying: Boolean
310
+ get() = player?.isPlaying == true
311
+ val isInPlayer: Boolean
312
+ get() = player != null && contentModel != null
313
+
314
+ fun loadUrl(url: String?) {
315
+ view?.loadUrl(url)
316
+ }
317
+
318
+ fun setSubtitlesVisibility(visibility: Boolean) {
319
+ view?.setSubtitlesVisibility(visibility)
320
+ }
321
+
322
+ fun enableFullScreen() {
323
+ view?.goFullscreen()
324
+ }
325
+
326
+ fun disableFullScreen(width: Int, height: Int, left: Int, top: Int) {
327
+ view?.exitFullscreen(width, height, left, top)
328
+ }
329
+
330
+ override fun onPlayerError(error: ExoPlaybackException) {
331
+ jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.ERROR)
332
+ stopPlayer()
333
+ Log.e("AndroidPlayer", "Player error", error)
334
+ }
335
+
336
+ private var previousPlayWhenReady = false
337
+ private var previousState = Player.STATE_IDLE
338
+
339
+ override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
340
+ if (playbackState != previousState) {
341
+ when (playbackState) {
342
+ Player.STATE_ENDED ->
343
+ jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.ENDED)
344
+ Player.STATE_BUFFERING ->
345
+ jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.WAITING)
346
+ Player.STATE_READY -> {
347
+ view?.setBlackCurtainVisibility(View.GONE)
348
+ jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.PLAYING)
349
+ }
350
+ }
351
+ } else if (playWhenReady != previousPlayWhenReady) {
352
+ if (playWhenReady) {
353
+ jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.PLAYING)
354
+ }
355
+ }
356
+ previousPlayWhenReady = playWhenReady
357
+ previousState = playbackState
358
+ }
359
+
360
+ override fun onPositionDiscontinuity(reason: Int) {
361
+ when (reason) {
362
+ Player.DISCONTINUITY_REASON_SEEK,
363
+ Player.DISCONTINUITY_REASON_SEEK_ADJUSTMENT -> {
364
+ jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.WAITING)
365
+ }
366
+ }
367
+ }
368
+
369
+ override fun onSeekProcessed() {
370
+ jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.SEEKED)
371
+ }
372
+
373
+ override fun onTimer() {
374
+ jsBridge.bridgeAndroidToJavaScript_MediaEvent(MediaEventType.TIME_UPDATE)
375
+ }
376
+
377
+ fun setSubtitleTrack(track: TrackPreference?) {
378
+ trackPreferences.subtitles = track ?: return
379
+ player?.trackSelector?.trackPreferences = trackPreferences.build()
380
+ }
381
+
382
+ fun setAudioTrack(track: TrackPreference?) {
383
+ trackPreferences.audio = track ?: return
384
+ player?.trackSelector?.trackPreferences = trackPreferences.build()
385
+ }
386
+
387
+ fun saveToLocalStorage(key: String?, value: String?) {
388
+ localStorage.saveCookieJson(key, value)
389
+ }
390
+
391
+ fun getFromLocalStorage(key: String?): String? {
392
+ return localStorage.getFromLocalStorage(key)
393
+ }
394
+
395
+ fun removeFromLocalStorage(key: String?) {
396
+ localStorage.removeFromLocalStorage(key)
397
+ }
398
+
399
+ override fun onTracksChanged(trackGroups: TrackGroupArray, trackSelections: TrackSelectionArray) {
400
+ val player = this.player ?: return
401
+ val tracks = player.trackSelector.getTrackInfos(player)
402
+ val filtered = tracks.filter { it.type != TrackInfo.TYPE_VIDEO }
403
+ audioTrack = tracks.firstOrNull { it.selected && it.type == TrackInfo.TYPE_AUDIO }
404
+ subtitleTrack = tracks.firstOrNull { it.selected && it.type == TrackInfo.TYPE_SUBTITLES }
405
+ Log.d("WebViewModel", "onTracksChanged: audio=$audioTrack subtitle=$subtitleTrack")
406
+ jsBridge.bridgeAndroidToJavaScript_MediaTrackEvent(MediaEventType.TRACKS_CHANGED, filtered)
407
+ }
408
+
409
+ fun sendKeyCode(keyCode: Int, mediaEventType: String) {
410
+ jsBridge.bridgeAndroidToJavaScript_KeyEvent(keyCode, mediaEventType)
411
+ }
412
+
413
+ fun setPlaybackInfo(playbackInfo: AnalyticsPlaybackInfo) {
414
+ if ("JUMP" == playbackInfo.name) {
415
+ jumpAnalytics.setPlaybackInfo(playbackInfo)
416
+ }
417
+ }
418
+
419
+ fun showMessage(message: String?) {
420
+ view?.showMessage(message)
421
+ }
422
+
423
+ fun requestAudioFocus(): Int? {
424
+ return view?.requestAudioFocus()
425
+ }
426
+
427
+ fun abandonAudioFocus() {
428
+ view?.abandonAudioFocus()
429
+ }
430
+
431
+ fun onBackPressed() {
432
+ stopPlayer()
433
+ view?.onBackPressed()
434
+ loadUrl(appUrl)
435
+ }
436
+
437
+ fun signData(dataJson: String?): String? {
438
+ return if (dataJson == null || dataJson.isEmpty()) "" else Flavor().signData(context, dataJson)
439
+ }
440
+
441
+ fun launchIapPurchase(sku: String?) {
442
+ if (sku == null || sku.isEmpty()) return
443
+ view?.launchIapPurchase(sku)
444
+ }
445
+
446
+ fun checkNewPurchases() {
447
+ iapService.setCallback(iapCallback)
448
+ iapService.checkNewPurchases()
449
+ }
450
+
451
+ fun launchIapPurchase(activity: Activity, sku: String) {
452
+ iapService.setCallback(iapCallback)
453
+ iapService.purchase(activity, sku)
454
+ }
455
+
456
+ fun getIapProductDetails(skus: List<String>) {
457
+ iapService.setCallback(iapCallback)
458
+ iapService.getProducts(skus)
459
+ }
460
+
461
+ fun acknowledgeIapReceipt(receiptId: String) {
462
+ iapService.setCallback(iapCallback)
463
+ iapService.acknowledgeReceipt(receiptId)
464
+ }
465
+
466
+ private fun dispatchKeyEvent(event: KeyEvent): Boolean {
467
+ // pause and stop events should be caught only when we are in player
468
+ // -> because we want to let user have option to pause/stop some background playback
469
+ if (isInPlayer) {
470
+ // we have to catch all media events, otherwise they will be unhandled and reported in onUnhandledKeyEvent
471
+ // -> and later sent to broadcast receivers of other media apps, which can resume stream/audio from background app
472
+ when (event.keyCode) {
473
+ KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE,
474
+ KeyEvent.KEYCODE_MEDIA_STOP,
475
+ KeyEvent.KEYCODE_MEDIA_PAUSE -> {
476
+ if (event.action == KeyEvent.ACTION_DOWN) {
477
+ jsBridge.bridgeAndroidToJavaScript_KeyEvent(event.keyCode, MediaEventType.KEY_DOWN)
478
+ } else if (event.action == KeyEvent.ACTION_UP) {
479
+ jsBridge.bridgeAndroidToJavaScript_KeyEvent(event.keyCode, MediaEventType.KEY_UP)
480
+ }
481
+ return true
482
+ }
483
+ }
484
+ }
485
+ when (event.keyCode) {
486
+ KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK,
487
+ KeyEvent.KEYCODE_MEDIA_CLOSE,
488
+ KeyEvent.KEYCODE_MEDIA_EJECT,
489
+ KeyEvent.KEYCODE_MEDIA_FAST_FORWARD,
490
+ KeyEvent.KEYCODE_MEDIA_NEXT,
491
+ KeyEvent.KEYCODE_MEDIA_PREVIOUS,
492
+ KeyEvent.KEYCODE_MEDIA_RECORD,
493
+ KeyEvent.KEYCODE_MEDIA_REWIND,
494
+ KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD,
495
+ KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD,
496
+ KeyEvent.KEYCODE_MEDIA_STEP_BACKWARD,
497
+ KeyEvent.KEYCODE_MEDIA_STEP_FORWARD,
498
+ KeyEvent.KEYCODE_MEDIA_TOP_MENU,
499
+ KeyEvent.KEYCODE_MEDIA_PLAY -> {
500
+ if (event.action == KeyEvent.ACTION_DOWN) {
501
+ jsBridge.bridgeAndroidToJavaScript_KeyEvent(event.keyCode, MediaEventType.KEY_DOWN)
502
+ } else if (event.action == KeyEvent.ACTION_UP) {
503
+ jsBridge.bridgeAndroidToJavaScript_KeyEvent(event.keyCode, MediaEventType.KEY_UP)
504
+ }
505
+ return true
506
+ }
507
+ }
508
+ return false
509
+ }
510
+
511
+ private inner class InnerIapCallback : IapCallback {
512
+ override fun checkNewPurchasesFinished(result: List<IapPurchase>) {
513
+ // not actually used at the moment
514
+ }
515
+
516
+ override fun checkNewPurchasesFinished(exception: Exception) {
517
+ // not actually used at the moment
518
+ }
519
+
520
+ override fun purchaseFinished(result: IapPurchase) {
521
+ jsBridge.bridgeAndroidToJavaScript_IAPValidationSuccess(result.userId, result.receipt, result.sku)
522
+ }
523
+
524
+ override fun purchaseFinished(exception: Exception) {
525
+ if (exception is IapException) {
526
+ jsBridge.bridgeAndroidToJavaScript_IAPValidationError(exception.status)
527
+ } else {
528
+ jsBridge.bridgeAndroidToJavaScript_IAPValidationError(exception.message
529
+ ?: "Purchase failed")
530
+ }
531
+ }
532
+
533
+ override fun getProductsFinished(result: List<IapProduct>, missing: List<String>) {
534
+ val okSkus = JsonArray()
535
+ for (iapProduct in result) {
536
+ val jsonProduct = JsonObject()
537
+ jsonProduct.addProperty("title", iapProduct.title)
538
+ jsonProduct.addProperty("description", iapProduct.description)
539
+ jsonProduct.addProperty("price", iapProduct.price)
540
+ jsonProduct.addProperty("icon", iapProduct.icon)
541
+ jsonProduct.addProperty("type", iapProduct.type)
542
+ jsonProduct.addProperty("sku", iapProduct.sku)
543
+ okSkus.add(jsonProduct)
544
+ }
545
+ val badSkus = JsonArray()
546
+ for (sku in missing) {
547
+ badSkus.add(sku)
548
+ }
549
+ jsBridge.bridgeIAPGetProductDataSuccess(okSkus.toString(), badSkus.toString())
550
+ }
551
+
552
+ override fun getProductsFinished(exception: Exception) {
553
+ if (exception is IapException) {
554
+ jsBridge.bridgeIAPGetProductDataFail(exception.status)
555
+ } else {
556
+ jsBridge.bridgeIAPGetProductDataFail(exception.message ?: "Purchase failed")
557
+ }
558
+ }
559
+
560
+ override fun acknowledgeReceiptFinished(exception: Exception?) {
561
+ // JS does not care
562
+ }
563
+ }
564
+
565
+ companion object {
566
+ const val JAVA_SCRIPT_BRIDGE = "JavaScriptBridge"
567
+ const val LOW_END_DEVICE_MAX_BITRATE = 1500000
568
+ }
569
+ }
@@ -0,0 +1,10 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android">
3
+ <solid
4
+ android:color="#E5F0FD"/>
5
+ <stroke
6
+ android:color="#33D7FF"
7
+ android:width="3dp"/>
8
+ <corners
9
+ android:radius="5dp" />
10
+ </shape>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android">
3
+ <solid
4
+ android:color="#E5F0FD"/>
5
+ <corners
6
+ android:radius="5dp" />
7
+ </shape>
@@ -0,0 +1,7 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <shape xmlns:android="http://schemas.android.com/apk/res/android">
3
+ <solid
4
+ android:color="#1FD3FF"/>
5
+ <corners
6
+ android:radius="5dp" />
7
+ </shape>
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <selector xmlns:android="http://schemas.android.com/apk/res/android">
3
+ <item android:drawable="@drawable/button_background_pressed"
4
+ android:state_pressed="true" />
5
+ <item android:drawable="@drawable/button_background_focus"
6
+ android:state_focused="true" />
7
+ <item android:drawable="@drawable/button_background_normal"/>
8
+ </selector>
@@ -0,0 +1,78 @@
1
+ <layout xmlns:android="http://schemas.android.com/apk/res/android"
2
+ xmlns:app="http://schemas.android.com/apk/res-auto"
3
+ xmlns:tools="http://schemas.android.com/tools">
4
+
5
+ <data>
6
+
7
+ <variable
8
+ name="viewModel"
9
+ type="com.twentyfouri.tvbridge.webview.viewmodel.WebViewModel" />
10
+ </data>
11
+
12
+ <RelativeLayout
13
+ android:layout_width="match_parent"
14
+ android:layout_height="match_parent"
15
+ android:background="@android:color/black"
16
+ tools:context=".webview.ui.view.WebViewActivity">
17
+
18
+ <com.twentyfouri.smartexoplayer.ui.SmartExoPlayerView
19
+ android:id="@+id/exoplayer_view"
20
+ android:layout_width="match_parent"
21
+ android:layout_height="match_parent"
22
+ app:useControls="false"
23
+ app:useProgress="false"/>
24
+
25
+ <View
26
+ android:id="@+id/black_curtain"
27
+ android:layout_width="match_parent"
28
+ android:layout_height="match_parent"
29
+ android:background="@android:color/black" />
30
+
31
+ <LinearLayout
32
+ android:id="@+id/url_setter"
33
+ android:layout_width="match_parent"
34
+ android:layout_height="wrap_content"
35
+ android:layout_centerInParent="true"
36
+ android:layout_margin="80dp"
37
+ android:orientation="vertical"
38
+ app:visibility="@{viewModel.urlSetterVisibility}">
39
+
40
+ <EditText
41
+ android:id="@+id/url"
42
+ android:layout_width="match_parent"
43
+ android:layout_height="wrap_content"
44
+ android:nextFocusUp="@+id/url"
45
+ android:nextFocusLeft="@+id/url"
46
+ android:nextFocusRight="@+id/url"
47
+ android:textColor="@android:color/white"/>
48
+
49
+ <Button
50
+ android:id="@+id/button_go"
51
+ android:layout_width="100dp"
52
+ android:layout_height="wrap_content"
53
+ android:background="@drawable/button_focus"
54
+ android:textColor="@android:color/black"
55
+ android:nextFocusDown="@+id/button_go"
56
+ android:nextFocusLeft="@+id/button_go"
57
+ android:nextFocusRight="@+id/button_go"
58
+ android:onClick="@{() -> viewModel.onClickGo()}"
59
+ android:text="GO" />
60
+
61
+ </LinearLayout>
62
+
63
+ <com.twentyfouri.tvbridge.webview.client.BridgeWebView
64
+ android:id="@+id/webview"
65
+ android:layout_width="match_parent"
66
+ android:layout_height="match_parent"
67
+ android:layout_alignParentBottom="true"
68
+ android:layout_alignParentEnd="true"
69
+ android:layout_alignParentStart="true"
70
+ android:layout_alignParentTop="true"
71
+ android:background="@android:color/transparent"
72
+ android:visibility="gone"/>
73
+
74
+ </RelativeLayout>
75
+
76
+ </layout>
77
+
78
+