@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.
- package/dist/templates/platforms/androidtv/project/README.md +198 -0
- package/dist/templates/platforms/androidtv/project/amazoniap/build.gradle +39 -0
- package/dist/templates/platforms/androidtv/project/amazoniap/consumer-rules.pro +0 -0
- package/dist/templates/platforms/androidtv/project/amazoniap/libs/in-app-purchasing-2.0.76.jar +0 -0
- package/dist/templates/platforms/androidtv/project/amazoniap/proguard-rules.pro +21 -0
- package/dist/templates/platforms/androidtv/project/amazoniap/src/main/AndroidManifest.xml +4 -0
- package/dist/templates/platforms/androidtv/project/amazoniap/src/main/java/com/twentyfouri/bridgetv/amazoniap/AmazonIapSevice.kt +106 -0
- package/dist/templates/platforms/androidtv/project/app/build.gradle +371 -0
- package/dist/templates/platforms/androidtv/project/app/proguard-rules.pro +32 -0
- package/dist/templates/platforms/androidtv/project/app/src/alhurra/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/alhurra/res/raw/configuration.json +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/androidTest/assets/getStatusSuccesfulResponse.json +9 -0
- package/dist/templates/platforms/androidtv/project/app/src/androidTest/assets/tokenFromPassword_200.json +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/ngsn/tv/RestServiceTestHelper.java +34 -0
- package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/ngsn/tv/WebViewActivityTest.java +104 -0
- package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/twentyfouri/tvbridge/SignTest.kt +54 -0
- package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/twentyfouri/tvbridge/amazonIAP/AmazonIAPManagerTest.java +74 -0
- package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/twentyfouri/tvbridge/amazonIAP/SinclairTestRunner.java +22 -0
- package/dist/templates/platforms/androidtv/project/app/src/androidTest/java/com/twentyfouri/tvbridge/webview/ui/model/BridgeWebViewTest.java +50 -0
- package/dist/templates/platforms/androidtv/project/app/src/bbg/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/bbg/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bbg/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bbg/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bbg/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bbg/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bbg/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bbg/res/raw/configuration.json +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/bigscreenAppstage/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/java/com/twentyfouri/tvbridge/Flavor.kt +9 -0
- package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/broadwayhd/res/raw/configuration.json +16 -0
- package/dist/templates/platforms/androidtv/project/app/src/cineClick/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/cineClick/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/entel/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/entel/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuboTV/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuboTV/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuse/AndroidManifest.xml +12 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuse/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuse/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuse/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuse/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuse/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuse/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuse/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/fuse/res/raw/configuration.json +9 -0
- package/dist/templates/platforms/androidtv/project/app/src/gsn/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/gsn/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/gsn/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/gsn/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/gsn/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/gsn/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/gsn/res/raw/configuration.json +8 -0
- package/dist/templates/platforms/androidtv/project/app/src/heremedia/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/heremedia/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/hummingbird/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/hummingbird/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/kijk/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/kijk/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kijk/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kijk/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kijk/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kijk/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kijk/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kijk/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/kpn/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/kpn/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kpn/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kpn/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kpn/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kpn/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kpn/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/kpn/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/AndroidManifest.xml +47 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/FlavorBase.kt +12 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/bridge/BridgeFromJavaScript.kt +379 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/bridge/BridgeToJavaScript.kt +65 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/BridgeConfig.kt +9 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/ConfigCallback.kt +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/ConfigProvider.kt +27 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/Drm.kt +10 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/configuration/UserAgent.kt +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/BaseApplication.kt +73 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ActivityComponent.kt +13 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ActivityModule.kt +19 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ApplicationComponent.kt +24 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/ApplicationModule.kt +43 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/di/PerActivity.kt +26 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/HttpMediaDrmCallback.kt +184 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/LocalStorage.kt +30 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/LoggingDrmCallback.kt +46 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/global/utils/SimpleActivityLifecycleCallback.kt +32 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/jump/JumpAnalytics.kt +209 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/sound/TouchPlayer.kt +86 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/client/BridgeWebView.kt +80 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/client/BridgeWebViewClient.kt +114 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/AnalyticsPlaybackInfo.kt +10 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/ContentModel.kt +14 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/DrmModel.kt +20 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/model/MediaEventType.kt +17 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/ContentModelParser.kt +16 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/DeviceInfoParser.kt +22 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/PlaybackInfoParser.kt +10 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/parser/TrackJsonModelParser.kt +76 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/Mainview.kt +22 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/PlayerCache.kt +15 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/view/WebViewActivity.kt +279 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/java/com/twentyfouri/tvbridge/webview/viewmodel/WebViewModel.kt +569 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/drawable/button_background_focus.xml +10 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/drawable/button_background_normal.xml +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/drawable/button_background_pressed.xml +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/drawable/button_focus.xml +8 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/layout/activity_web_view.xml +78 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/raw/click.ogg +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/raw/fiddle_root_michal_konecny.cer +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/raw/proxy_milanwilczak.pem +26 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/values/styles.xml +11 -0
- package/dist/templates/platforms/androidtv/project/app/src/main/res/xml/network_security_config.xml +12 -0
- package/dist/templates/platforms/androidtv/project/app/src/marti/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/marti/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/marti/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/marti/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/marti/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/marti/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/marti/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/marti/res/raw/configuration.json +8 -0
- package/dist/templates/platforms/androidtv/project/app/src/newsmax/AndroidManifest.xml +43 -0
- package/dist/templates/platforms/androidtv/project/app/src/newsmax/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/newsmax/res/raw/configuration.json +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/portal/java/com/twentyfouri/tvbridge/Flavor.kt +10 -0
- package/dist/templates/platforms/androidtv/project/app/src/portal/res/raw/configuration.json +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/portalDrm/java/com/twentyfouri/tvbridge/Flavor.kt +10 -0
- package/dist/templates/platforms/androidtv/project/app/src/portalDrm/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/portalDrm/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/pureflix/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/pureflix/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfa/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfa/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfa/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfa/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfa/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfa/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfa/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfa/res/raw/configuration.json +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfe/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfe/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfe/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfe/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfe/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfe/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfe/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rfe/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/rte/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/rte/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rte/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rte/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rte/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rte/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rte/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/rte/res/raw/configuration.json +9 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentai/google-services.json +191 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentai/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentai/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentai/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentai/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentai/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentai/res/raw/configuration.json +15 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/google-services.json +191 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/java/com/twentyfouri/tvbridge/Flavor.kt +54 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/java/com/twentyfouri/tvbridge/SentaiRequestData.kt +13 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/sentaiandroidtv/res/raw/configuration.json +14 -0
- package/dist/templates/platforms/androidtv/project/app/src/smartott/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/smartott/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/smartott/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/smartott/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/smartott/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/smartott/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/java/com/twentyfouri/tvbridge/Flavor.kt +9 -0
- package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/tennisChannel/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/app/src/topic/java/com/twentyfouri/tvbridge/Flavor.kt +9 -0
- package/dist/templates/platforms/androidtv/project/app/src/topic/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/topic/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/topic/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/topic/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/topic/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/topic/res/raw/configuration.json +9 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa/res/raw/configuration.json +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa365/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa365/res/drawable/banner.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa365/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa365/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa365/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa365/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa365/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/dist/templates/platforms/androidtv/project/app/src/voa365/res/raw/configuration.json +7 -0
- package/dist/templates/platforms/androidtv/project/app/src/youFone/java/com/twentyfouri/tvbridge/Flavor.kt +5 -0
- package/dist/templates/platforms/androidtv/project/app/src/youFone/res/raw/configuration.json +6 -0
- package/dist/templates/platforms/androidtv/project/build.gradle +52 -0
- package/dist/templates/platforms/androidtv/project/common/build.gradle +38 -0
- package/dist/templates/platforms/androidtv/project/common/consumer-rules.pro +0 -0
- package/dist/templates/platforms/androidtv/project/common/proguard-rules.pro +21 -0
- package/dist/templates/platforms/androidtv/project/common/src/main/AndroidManifest.xml +4 -0
- package/dist/templates/platforms/androidtv/project/common/src/main/java/com/twentyfouri/tvbridge/common/IapService.kt +114 -0
- package/dist/templates/platforms/androidtv/project/googleiap/build.gradle +40 -0
- package/dist/templates/platforms/androidtv/project/googleiap/consumer-rules.pro +0 -0
- package/dist/templates/platforms/androidtv/project/googleiap/proguard-rules.pro +21 -0
- package/dist/templates/platforms/androidtv/project/googleiap/src/main/AndroidManifest.xml +6 -0
- package/dist/templates/platforms/androidtv/project/googleiap/src/main/java/com/twentyfouri/tvbridge/googleiap/GoogleIapService.kt +29 -0
- package/dist/templates/platforms/androidtv/project/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/dist/templates/platforms/androidtv/project/gradle/wrapper/gradle-wrapper.properties +6 -0
- package/dist/templates/platforms/androidtv/project/gradle.properties +5 -0
- package/dist/templates/platforms/androidtv/project/keystore/debug_madrid.jks +0 -0
- package/dist/templates/platforms/androidtv/project/proguard-rules.pro +42 -0
- package/dist/templates/platforms/androidtv/project/settings.gradle +4 -0
- 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
|
+
}
|