react-native-tpstreams 0.1.15 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +20 -418
  3. package/Tpstreams.podspec +3 -25
  4. package/android/build.gradle +14 -42
  5. package/android/src/main/AndroidManifest.xml +1 -3
  6. package/android/src/main/java/com/tpstreams/TPStreamsRNModule.kt +18 -0
  7. package/android/src/main/java/com/tpstreams/{TpstreamsPackage.kt → TPStreamsRNPackage.kt} +10 -5
  8. package/android/src/main/java/com/tpstreams/TPStreamsRNPlayerView.kt +53 -0
  9. package/android/src/main/java/com/tpstreams/TPStreamsRNPlayerViewManager.kt +46 -0
  10. package/ios/TpstreamsView.h +14 -0
  11. package/ios/TpstreamsView.mm +71 -0
  12. package/ios/TpstreamsViewManager.mm +19 -0
  13. package/lib/module/TPStreamsPlayerViewNativeComponent.ts +9 -0
  14. package/lib/module/index.js +9 -3
  15. package/lib/module/index.js.map +1 -1
  16. package/lib/typescript/package.json +1 -0
  17. package/lib/typescript/src/TPStreamsPlayerViewNativeComponent.d.ts +9 -0
  18. package/lib/typescript/src/TPStreamsPlayerViewNativeComponent.d.ts.map +1 -0
  19. package/lib/typescript/src/index.d.ts +6 -0
  20. package/lib/typescript/src/index.d.ts.map +1 -0
  21. package/package.json +42 -76
  22. package/src/TPStreamsPlayerViewNativeComponent.ts +9 -0
  23. package/src/index.tsx +9 -7
  24. package/android/generated/java/com/tpstreams/NativeTpstreamsSpec.java +0 -37
  25. package/android/generated/jni/CMakeLists.txt +0 -36
  26. package/android/generated/jni/RNTpstreamsSpec-generated.cpp +0 -32
  27. package/android/generated/jni/RNTpstreamsSpec.h +0 -31
  28. package/android/generated/jni/react/renderer/components/RNTpstreamsSpec/RNTpstreamsSpecJSI-generated.cpp +0 -28
  29. package/android/generated/jni/react/renderer/components/RNTpstreamsSpec/RNTpstreamsSpecJSI.h +0 -71
  30. package/android/libs/extracted-aar/META-INF/com/android/build/gradle/aar-metadata.properties +0 -4
  31. package/android/src/main/AndroidManifestNew.xml +0 -2
  32. package/android/src/main/java/com/tpstreams/FragmentModule.kt +0 -225
  33. package/android/src/main/java/com/tpstreams/PlayerFragment.kt +0 -234
  34. package/android/src/main/java/com/tpstreams/TpStreamsPlayerView.kt +0 -102
  35. package/android/src/main/java/com/tpstreams/TpStreamsPlayerViewManager.kt +0 -55
  36. package/android/src/main/java/com/tpstreams/TpstreamsModule.kt +0 -168
  37. package/android/src/main/res/layout/fragment_player.xml +0 -29
  38. package/android/src/main/res/xml/network_security_config.xml +0 -8
  39. package/ios/Tpstreams.h +0 -6
  40. package/ios/Tpstreams.mm +0 -18
  41. package/ios/generated/RNTpstreamsSpec/RNTpstreamsSpec-generated.mm +0 -39
  42. package/ios/generated/RNTpstreamsSpec/RNTpstreamsSpec.h +0 -63
  43. package/ios/generated/RNTpstreamsSpecJSI-generated.cpp +0 -28
  44. package/ios/generated/RNTpstreamsSpecJSI.h +0 -71
  45. package/lib/commonjs/NativeTpstreams.js +0 -9
  46. package/lib/commonjs/NativeTpstreams.js.map +0 -1
  47. package/lib/commonjs/index.js +0 -10
  48. package/lib/commonjs/index.js.map +0 -1
  49. package/lib/commonjs/types.js +0 -2
  50. package/lib/commonjs/types.js.map +0 -1
  51. package/lib/module/NativeTpstreams.js +0 -5
  52. package/lib/module/NativeTpstreams.js.map +0 -1
  53. package/lib/module/types.js +0 -2
  54. package/lib/module/types.js.map +0 -1
  55. package/lib/typescript/commonjs/package.json +0 -1
  56. package/lib/typescript/commonjs/src/NativeTpstreams.d.ts +0 -7
  57. package/lib/typescript/commonjs/src/NativeTpstreams.d.ts.map +0 -1
  58. package/lib/typescript/commonjs/src/index.d.ts +0 -5
  59. package/lib/typescript/commonjs/src/index.d.ts.map +0 -1
  60. package/lib/typescript/commonjs/src/types.d.ts +0 -11
  61. package/lib/typescript/commonjs/src/types.d.ts.map +0 -1
  62. package/lib/typescript/module/src/NativeTpstreams.d.ts +0 -7
  63. package/lib/typescript/module/src/NativeTpstreams.d.ts.map +0 -1
  64. package/lib/typescript/module/src/index.d.ts +0 -5
  65. package/lib/typescript/module/src/index.d.ts.map +0 -1
  66. package/lib/typescript/module/src/types.d.ts +0 -11
  67. package/lib/typescript/module/src/types.d.ts.map +0 -1
  68. package/react-native.config.js +0 -12
  69. package/src/NativeTpstreams.ts +0 -8
  70. package/src/types.ts +0 -10
  71. /package/lib/{typescript/module → module}/package.json +0 -0
@@ -1,71 +0,0 @@
1
- /**
2
- * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
- *
4
- * Do not edit this file as changes may cause incorrect behavior and will be lost
5
- * once the code is regenerated.
6
- *
7
- * @generated by codegen project: GenerateModuleH.js
8
- */
9
-
10
- #pragma once
11
-
12
- #include <ReactCommon/TurboModule.h>
13
- #include <react/bridging/Bridging.h>
14
-
15
- namespace facebook::react {
16
-
17
-
18
- class JSI_EXPORT NativeTpstreamsCxxSpecJSI : public TurboModule {
19
- protected:
20
- NativeTpstreamsCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker);
21
-
22
- public:
23
- virtual double multiply(jsi::Runtime &rt, double a, double b) = 0;
24
-
25
- };
26
-
27
- template <typename T>
28
- class JSI_EXPORT NativeTpstreamsCxxSpec : public TurboModule {
29
- public:
30
- jsi::Value create(jsi::Runtime &rt, const jsi::PropNameID &propName) override {
31
- return delegate_.create(rt, propName);
32
- }
33
-
34
- std::vector<jsi::PropNameID> getPropertyNames(jsi::Runtime& runtime) override {
35
- return delegate_.getPropertyNames(runtime);
36
- }
37
-
38
- static constexpr std::string_view kModuleName = "Tpstreams";
39
-
40
- protected:
41
- NativeTpstreamsCxxSpec(std::shared_ptr<CallInvoker> jsInvoker)
42
- : TurboModule(std::string{NativeTpstreamsCxxSpec::kModuleName}, jsInvoker),
43
- delegate_(reinterpret_cast<T*>(this), jsInvoker) {}
44
-
45
-
46
- private:
47
- class Delegate : public NativeTpstreamsCxxSpecJSI {
48
- public:
49
- Delegate(T *instance, std::shared_ptr<CallInvoker> jsInvoker) :
50
- NativeTpstreamsCxxSpecJSI(std::move(jsInvoker)), instance_(instance) {
51
-
52
- }
53
-
54
- double multiply(jsi::Runtime &rt, double a, double b) override {
55
- static_assert(
56
- bridging::getParameterCount(&T::multiply) == 3,
57
- "Expected multiply(...) to have 3 parameters");
58
-
59
- return bridging::callFromJs<double>(
60
- rt, &T::multiply, jsInvoker_, instance_, std::move(a), std::move(b));
61
- }
62
-
63
- private:
64
- friend class NativeTpstreamsCxxSpec;
65
- T *instance_;
66
- };
67
-
68
- Delegate delegate_;
69
- };
70
-
71
- } // namespace facebook::react
@@ -1,4 +0,0 @@
1
- aarFormatVersion=1.0
2
- aarMetadataVersion=1.0
3
- minCompileSdk=1
4
- minAndroidGradlePluginVersion=1.0.0
@@ -1,2 +0,0 @@
1
- <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
- </manifest>
@@ -1,225 +0,0 @@
1
- package com.tpstreams
2
-
3
- import android.content.Context
4
- import android.os.Bundle
5
- import androidx.fragment.app.FragmentActivity
6
- import com.facebook.react.bridge.ReactMethod
7
- import com.facebook.react.bridge.ReactContextBaseJavaModule
8
- import com.facebook.react.bridge.ReactApplicationContext
9
- import android.util.Log
10
- import androidx.lifecycle.LiveData
11
- import androidx.lifecycle.ViewModel
12
- import androidx.lifecycle.ViewModelProvider
13
- import com.facebook.react.bridge.Arguments
14
- import com.facebook.react.bridge.WritableMap
15
- import com.facebook.react.modules.core.DeviceEventManagerModule
16
- import com.tpstream.player.data.Asset
17
- import com.tpstream.player.offline.TpStreamDownloadManager
18
- import com.tpstream.player.TPStreamsSDK
19
- import com.facebook.react.bridge.ReadableMap
20
- import com.facebook.react.bridge.WritableNativeMap
21
-
22
-
23
- class FragmentModule(reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
24
-
25
- lateinit var viewModel: DownloadListViewModel
26
- private var assets = listOf<Asset>()
27
-
28
- override fun initialize() {
29
- super.initialize()
30
- (currentActivity as? FragmentActivity)?.let {
31
- viewModel = DownloadListViewModel.init(it)
32
- }
33
- Log.d("FragmentModule", "initialize: ")
34
- }
35
-
36
- override fun getName(): String {
37
- return "FragmentModule"
38
- }
39
-
40
- @ReactMethod
41
- fun showCustomFragment(
42
- videoId: String,
43
- accessToken: String,
44
- enableDownload: Boolean,
45
- autoPlay: Boolean,
46
- startAt: Int,
47
- offlineLicenseExpireTime: Int,
48
- downloadMetadata: ReadableMap?,
49
- ) {
50
- Log.e("FragmentModule", "showCustomFragment() called")
51
- // Ensure the currentActivity is a FragmentActivity
52
- val activity = currentActivity as? FragmentActivity
53
- activity?.let {
54
- // Begin the fragment transaction
55
- val fragmentTransaction = it.supportFragmentManager.beginTransaction()
56
-
57
- // Create a new fragment instance
58
- val bundle = Bundle()
59
- bundle.putString("VIDEO_ID", videoId)
60
- bundle.putString("ACCESS_TOKEN", accessToken)
61
- bundle.putBoolean("ENABLE_DOWNLOAD_SUPPORT", enableDownload)
62
- bundle.putBoolean("AUTO_PLAY", autoPlay)
63
- bundle.putInt("START_AT", startAt)
64
- bundle.putInt("OFFLINE_LICENSE_EXPIRE_TIME", offlineLicenseExpireTime)
65
- bundle.putSerializable("DOWNLOAD_METADATA", downloadMetadata?.toHashMapString())
66
- val fragment = PlayerFragment()
67
- fragment.setArguments(bundle)
68
-
69
- // Find a container to add the fragment
70
- val fragmentContainerId = android.R.id.content // or you could specify your own container ID
71
-
72
- // Add the fragment
73
- fragmentTransaction.replace(fragmentContainerId, fragment)
74
- fragmentTransaction.addToBackStack(null) // Optional: Add fragment to back stack
75
- fragmentTransaction.commit()
76
- } ?: run {
77
- // Handle the error if the activity is not a FragmentActivity
78
- Log.e("ReactNativeJS", "Current activity is not a FragmentActivity")
79
- }
80
- }
81
-
82
- @ReactMethod
83
- fun closeCustomFragment() {
84
- Log.e("FragmentModule", "closeCustomFragment() called")
85
-
86
- // Ensure currentActivity is a FragmentActivity
87
- val activity = currentActivity as? FragmentActivity
88
- if (activity == null || activity.isFinishing || activity.isDestroyed) {
89
- Log.e("FragmentModule", "Activity is null, finishing, or destroyed")
90
- return
91
- }
92
-
93
- val fragmentManager = activity.supportFragmentManager
94
- val playerFragment = fragmentManager.findFragmentByTag("PLAYER_FRAGMENT") as? PlayerFragment
95
-
96
- if (playerFragment != null) {
97
- Log.d("FragmentModule", "Removing PlayerFragment")
98
- fragmentManager.beginTransaction()
99
- .remove(playerFragment)
100
- .commitAllowingStateLoss() // Avoid IllegalStateException
101
- } else if (fragmentManager.backStackEntryCount > 0) {
102
- Log.d("FragmentModule", "Popping back stack")
103
- fragmentManager.popBackStack()
104
- } else {
105
- Log.e("FragmentModule", "No fragments to remove")
106
- }
107
- }
108
-
109
- @ReactMethod
110
- fun observeDownloadData() {
111
- // Ensure this code runs on the main thread
112
- currentActivity?.runOnUiThread {
113
- val activity = currentActivity as? FragmentActivity
114
- activity?.let {
115
- // Observe LiveData only on the main thread
116
- viewModel.getDownloadData().observe(it) { assets ->
117
- this.assets = assets ?: emptyList()
118
- // Emit event to React Native
119
- val eventMap = Arguments.createMap()
120
- val assetsList = Arguments.createArray()
121
-
122
- assets?.forEachIndexed { index , asset ->
123
- val assetMap = Arguments.createMap()
124
- assetMap.putString("id", index.toString())
125
- assetMap.putString("videoId", asset.id)
126
- assetMap.putString("title", asset.title)
127
- assetMap.putString("percentage", asset.video.percentageDownloaded.toString())
128
- assetMap.putString("status", asset.video.downloadState?.name ?: "Unknown")
129
- assetMap.putString("duration", asset.video.duration.toString())
130
- assetMap.putMap("metadata", asset.metadata?.toWritableMap() ?: null)
131
- assetsList.pushMap(assetMap)
132
- }
133
-
134
- eventMap.putArray("assets", assetsList)
135
- reactApplicationContext
136
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
137
- .emit("onDownloadDataChanged", eventMap)
138
- }
139
- } ?: run {
140
- Log.e("FragmentModule", "Current activity is not a FragmentActivity")
141
- }
142
- }
143
- }
144
-
145
- fun ReadableMap.toHashMapString(): HashMap<String, String> {
146
- val result = HashMap<String, String>()
147
- val iterator = this.keySetIterator()
148
- while (iterator.hasNextKey()) {
149
- val key = iterator.nextKey()
150
- val value = this.getString(key) // Ensuring values are strings
151
- if (value != null) {
152
- result[key] = value
153
- }
154
- }
155
- return result
156
- }
157
-
158
- fun Map<String, String>.toWritableMap(): ReadableMap {
159
- val writableMap: WritableMap = WritableNativeMap()
160
- for ((key, value) in this) {
161
- writableMap.putString(key, value)
162
- }
163
- return writableMap
164
- }
165
-
166
- @ReactMethod
167
- fun pauseDownload(videoId: String) {
168
- val asset = assets.first { it.id == videoId }
169
- viewModel.pauseDownload(asset)
170
- }
171
-
172
- @ReactMethod
173
- fun resumeDownload(videoId: String) {
174
- val asset = assets.first { it.id == videoId }
175
- viewModel.resumeDownload(asset)
176
- }
177
-
178
- @ReactMethod
179
- fun cancelDownload(videoId: String) {
180
- val asset = assets.first { it.id == videoId }
181
- viewModel.cancelDownload(asset)
182
- }
183
-
184
- @ReactMethod
185
- fun deleteDownload(videoId: String) {
186
- val asset = assets.first { it.id == videoId }
187
- viewModel.deleteDownload(asset)
188
- }
189
-
190
- }
191
-
192
- class DownloadListViewModel(context: Context): ViewModel() {
193
-
194
- private var tpStreamDownloadManager: TpStreamDownloadManager = TpStreamDownloadManager(context)
195
-
196
- fun getDownloadData(): LiveData<List<Asset>?> {
197
- return tpStreamDownloadManager.getAllDownloads()
198
- }
199
-
200
- fun pauseDownload(offlineAssetInfo: Asset) {
201
- tpStreamDownloadManager.pauseDownload(offlineAssetInfo)
202
- }
203
-
204
- fun resumeDownload(offlineAssetInfo: Asset) {
205
- tpStreamDownloadManager.resumeDownload(offlineAssetInfo)
206
- }
207
-
208
- fun cancelDownload(offlineAssetInfo: Asset) {
209
- tpStreamDownloadManager.cancelDownload(offlineAssetInfo)
210
- }
211
-
212
- fun deleteDownload(offlineAssetInfo: Asset) {
213
- tpStreamDownloadManager.deleteDownload(offlineAssetInfo)
214
- }
215
-
216
- companion object {
217
- fun init(fragmentActivity: FragmentActivity) : DownloadListViewModel {
218
- return ViewModelProvider(fragmentActivity, object : ViewModelProvider.Factory {
219
- override fun <T : ViewModel> create(modelClass: Class<T>): T {
220
- return DownloadListViewModel(fragmentActivity) as T
221
- }
222
- })[DownloadListViewModel::class.java]
223
- }
224
- }
225
- }
@@ -1,234 +0,0 @@
1
- package com.tpstreams
2
-
3
- import android.os.Bundle
4
- import android.util.Log
5
- import android.view.LayoutInflater
6
- import android.view.View
7
- import android.view.ViewGroup
8
- import android.widget.Toast
9
- import androidx.fragment.app.Fragment
10
- import com.tpstream.player.TPStreamPlayerListener
11
- import com.tpstream.player.TpInitParams
12
- import com.tpstream.player.TpStreamPlayer
13
- import com.tpstream.player.ui.InitializationListener
14
- import com.tpstream.player.ui.TPStreamPlayerView
15
- import com.tpstream.player.ui.TpStreamPlayerFragment
16
- import com.tpstream.player.constants.PlaybackError
17
- import com.tpstream.player.Tracks
18
- import com.tpstream.player.Timeline
19
- import com.tpstream.player.DeviceInfo
20
- import com.tpstreams.TpstreamsModule
21
-
22
- internal typealias onAccessTokenCallbase = (String) -> Unit
23
-
24
- class PlayerFragment : Fragment() {
25
-
26
- lateinit var player: TpStreamPlayer
27
- lateinit var playerView: TPStreamPlayerView
28
- lateinit var playerFragment: TpStreamPlayerFragment
29
- private var videoId :String = ""
30
- private var accessToken :String = ""
31
- private var enableDownloadSupport :Boolean = true
32
- private var setAutoPlay :Boolean = true
33
- private var startAt :Int = 0
34
- private var offlineLicenseExpireTime :Int = 60 * 60 * 24 * 15 //15 days
35
- private var downloadMetadata: HashMap<String, String>? = null
36
-
37
- private var accessTokenCallback : onAccessTokenCallbase? = null
38
-
39
- companion object {
40
- var instance: PlayerFragment? = null
41
- }
42
-
43
- override fun onCreate(savedInstanceState: Bundle?) {
44
- super.onCreate(savedInstanceState)
45
- val bundle = arguments
46
- if (bundle != null) {
47
- videoId = bundle.getString("VIDEO_ID") ?: ""
48
- accessToken = bundle.getString("ACCESS_TOKEN") ?: ""
49
- enableDownloadSupport = bundle.getBoolean("ENABLE_DOWNLOAD_SUPPORT", true)
50
- setAutoPlay = bundle.getBoolean("AUTO_PLAY", true)
51
- startAt = bundle.getInt("START_AT", 0)
52
- offlineLicenseExpireTime = bundle.getInt("OFFLINE_LICENSE_EXPIRE_TIME", offlineLicenseExpireTime)
53
- downloadMetadata = bundle.getSerializable("DOWNLOAD_METADATA") as? HashMap<String, String>
54
- }
55
- }
56
-
57
- override fun onCreateView(
58
- inflater: LayoutInflater, container: ViewGroup?,
59
- savedInstanceState: Bundle?
60
- ): View? {
61
- return inflater.inflate(R.layout.fragment_player, container, false)
62
- }
63
-
64
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
65
- super.onViewCreated(view, savedInstanceState)
66
- instance = this
67
- playerFragment = childFragmentManager.findFragmentById(R.id.tpstream_player_fragment) as TpStreamPlayerFragment
68
- playerFragment.setOnInitializationListener(object: InitializationListener {
69
-
70
- override fun onInitializationSuccess(player: TpStreamPlayer) {
71
- this@PlayerFragment.player = player
72
- playerView = playerFragment.tpStreamPlayerView
73
- loadPLayer()
74
- addPlayerListener()
75
- }
76
- })
77
- }
78
-
79
- fun loadPLayer() {
80
- val parameters = TpInitParams.Builder()
81
- .setVideoId(videoId)
82
- .setAccessToken(accessToken)
83
- .enableDownloadSupport(enableDownloadSupport)
84
- .setAutoPlay(setAutoPlay)
85
- .startAt(startAt.toLong())
86
- .setOfflineLicenseExpireTime(offlineLicenseExpireTime)
87
- .build()
88
- requireActivity().runOnUiThread {
89
- player.load(parameters, getMetadata())
90
- }
91
- }
92
- private fun getMetadata(): HashMap<String, String> {
93
- return downloadMetadata ?: hashMapOf()
94
- }
95
-
96
- private fun sendEvent(eventName: String, params: Any?) {
97
- TpstreamsModule.sendEvent(eventName, params)
98
- }
99
-
100
- private fun addPlayerListener(){
101
- player.setListener( object : TPStreamPlayerListener {
102
- override fun onPlaybackStateChanged(playbackState: Int) {
103
- sendEvent("onPlaybackStateChanged", playbackState)
104
- }
105
-
106
- override fun onAccessTokenExpired(videoId: String, callback: (String) -> Unit) {
107
- Log.d("ReactNativeJS", "onTokenExpired: $videoId")
108
- accessTokenCallback = callback
109
- sendEvent("onAccessTokenExpired", videoId)
110
- }
111
-
112
- override fun onMarkerCallback(timesInSeconds: Long) {
113
- requireActivity().runOnUiThread {
114
- Toast.makeText(requireContext(),"Time $timesInSeconds", Toast.LENGTH_SHORT).show()
115
- }
116
- sendEvent("onMarkerCallback", timesInSeconds)
117
- }
118
-
119
- override fun onDeviceInfoChanged(deviceInfo: DeviceInfo) {
120
- sendEvent("onDeviceInfoChanged", deviceInfo.toString())
121
- }
122
-
123
- override fun onFullScreenChanged(isFullScreen: Boolean) {
124
- sendEvent("onFullScreenChanged", isFullScreen)
125
- }
126
-
127
- override fun onIsLoadingChanged(isLoading: Boolean) {
128
- sendEvent("onIsLoadingChanged", isLoading)
129
- }
130
-
131
- override fun onIsPlayingChanged(isPlaying: Boolean) {
132
- sendEvent("onIsPlayingChanged", isPlaying)
133
- }
134
-
135
- override fun onPlayerError(playbackError: PlaybackError) {
136
- sendEvent("onPlayerError", playbackError.toString())
137
- }
138
-
139
- override fun onSeekBackIncrementChanged(incrementMs: Long) {
140
- sendEvent("onSeekBackIncrementChanged", incrementMs)
141
- }
142
-
143
- override fun onSeekForwardIncrementChanged(incrementMs: Long) {
144
- sendEvent("onSeekForwardIncrementChanged", incrementMs)
145
- }
146
-
147
- override fun onTimelineChanged(timeline: Timeline, reason: Int) {
148
- sendEvent("onTimelineChanged", null)
149
- }
150
-
151
- override fun onTracksChanged(tracks: Tracks) {
152
- sendEvent("onTracksChanged", tracks.toString())
153
- }
154
-
155
- override fun onPlaybackSpeedChange(speed: Float) {
156
- sendEvent("onPlaybackSpeedChanged", speed)
157
- }
158
- })
159
- }
160
- // Core Player Controls
161
- fun play() {
162
- requireActivity().runOnUiThread {
163
- player.play()
164
- }
165
- }
166
-
167
- fun pause() {
168
- requireActivity().runOnUiThread {
169
- player.pause()
170
- }
171
- }
172
-
173
- fun seekTo(position: Long) {
174
- requireActivity().runOnUiThread {
175
- player.seekTo(position)
176
- }
177
- }
178
-
179
- fun release() {
180
- requireActivity().runOnUiThread {
181
- player.release()
182
- }
183
- }
184
-
185
- fun load(params: TpInitParams) {
186
- requireActivity().runOnUiThread {
187
- player.load(params)
188
- }
189
- }
190
-
191
- // Playback & State Management
192
- fun getCurrentTime(): Double = player.getCurrentTime().toDouble()
193
-
194
- fun getDuration(): Double = player.getDuration().toDouble()
195
-
196
- fun getBufferedTime(): Double = player.getBufferedTime().toDouble()
197
-
198
- fun getPlaybackState(): Int = player.getPlaybackState()
199
-
200
- fun getPlayWhenReady(): Boolean = player.getPlayWhenReady()
201
-
202
- fun setPlayWhenReady(playWhenReady: Boolean) {
203
- requireActivity().runOnUiThread {
204
- player.setPlayWhenReady(playWhenReady)
205
- }
206
- }
207
-
208
-
209
- // Speed & Volume
210
- fun getPlaybackSpeed(): Float = player.getPlayBackSpeed()
211
-
212
- fun setPlaybackSpeed(speed: Float) {
213
- requireActivity().runOnUiThread {
214
- player.setPlaybackSpeed(speed)
215
- }
216
- }
217
-
218
- fun setNewAccessToken(token: String) {
219
- accessTokenCallback?.invoke(token)
220
- accessTokenCallback = null
221
- }
222
-
223
- override fun onResume() {
224
- super.onResume()
225
- Log.d("ReactNativeJS", "onResume: ")
226
- }
227
-
228
- override fun onDestroy() {
229
- super.onDestroy()
230
- instance = null
231
- Log.d("ReactNativeJS", "onDestroy: ")
232
- }
233
-
234
- }
@@ -1,102 +0,0 @@
1
- package com.tpstreams
2
-
3
- import kotlinx.coroutines.*
4
- import android.content.Context
5
- import android.util.AttributeSet
6
- import android.widget.FrameLayout
7
- import androidx.fragment.app.FragmentActivity
8
- import com.facebook.react.bridge.ReactApplicationContext
9
- import com.facebook.react.bridge.ReadableMap
10
- import com.facebook.react.bridge.WritableMap
11
- import com.facebook.react.uimanager.ThemedReactContext
12
-
13
- class TpStreamsPlayerView @JvmOverloads constructor(
14
- context: Context,
15
- attrs: AttributeSet? = null
16
- ) : FrameLayout(context, attrs), CoroutineScope {
17
-
18
- private var videoId: String? = null
19
- private var accessToken: String? = null
20
- private var enableDownload: Boolean = true
21
- private var autoPlay :Boolean = true
22
- private var startAt :Int = 0
23
- private var offlineLicenseExpireTime :Int = 60 * 60 * 24 * 15
24
- private var downloadMetadata: ReadableMap? = null
25
- private var fragmentModule: FragmentModule? = null
26
-
27
- private val job = SupervisorJob()
28
- override val coroutineContext = Dispatchers.Main + job
29
- private var updateJob: Job? = null
30
-
31
- init {
32
- if (context is ThemedReactContext) {
33
- val reactContext = context.reactApplicationContext
34
- val activity = context.currentActivity as? FragmentActivity
35
-
36
- if (activity != null) {
37
- fragmentModule = FragmentModule(reactContext)
38
- }
39
- }
40
- }
41
-
42
- fun setVideoId(id: String) {
43
- videoId = id
44
- updateFragment()
45
- }
46
-
47
- fun setAccessToken(token: String) {
48
- accessToken = token
49
- updateFragment()
50
- }
51
-
52
- fun setEnableDownload(enableDownload: Boolean?) {
53
- this.enableDownload = enableDownload ?: true
54
- updateFragment()
55
- }
56
-
57
- fun setAutoPlay(autoPlay: Boolean?) {
58
- this.autoPlay = autoPlay ?: true
59
- updateFragment()
60
- }
61
-
62
- fun setStartTime(startAt: Int?) {
63
- this.startAt = startAt ?: 0
64
- updateFragment()
65
- }
66
-
67
- fun setOfflineLicenseExpireTime(offlineLicenseExpireTime: Int?) {
68
- this.offlineLicenseExpireTime = offlineLicenseExpireTime ?: 60 * 60 * 24 * 15
69
- updateFragment()
70
- }
71
-
72
- fun setDownloadMetadata(metadata: ReadableMap?) {
73
- downloadMetadata = metadata ?: null
74
- updateFragment()
75
- }
76
-
77
- private fun updateFragment() {
78
- if (!videoId.isNullOrEmpty() && !accessToken.isNullOrEmpty()) {
79
- updateJob?.cancel()
80
- updateJob = launch {
81
- delay(50)
82
- fragmentModule?.closeCustomFragment()
83
- fragmentModule?.showCustomFragment(
84
- videoId!!,
85
- accessToken!!,
86
- enableDownload,
87
- autoPlay ?: true,
88
- startAt,
89
- offlineLicenseExpireTime,
90
- downloadMetadata,
91
- )
92
- }
93
- }
94
- }
95
-
96
- override fun onDetachedFromWindow() {
97
- super.onDetachedFromWindow()
98
- coroutineContext.cancel()
99
- fragmentModule?.closeCustomFragment()
100
- }
101
-
102
- }
@@ -1,55 +0,0 @@
1
- package com.tpstreams
2
-
3
- import com.facebook.react.uimanager.SimpleViewManager
4
- import com.facebook.react.uimanager.ThemedReactContext
5
- import com.facebook.react.uimanager.annotations.ReactProp
6
- import com.facebook.react.bridge.ReadableMap
7
-
8
- class TpStreamsPlayerViewManager : SimpleViewManager<TpStreamsPlayerView>() {
9
-
10
- override fun getName() = "TpStreamsPlayerView"
11
-
12
- override fun createViewInstance(reactContext : ThemedReactContext) :TpStreamsPlayerView {
13
- return TpStreamsPlayerView(reactContext)
14
- }
15
-
16
- @ReactProp(name = "videoId")
17
- fun setVideoId(view: TpStreamsPlayerView, videoId: String?) {
18
- videoId?.let { view.setVideoId(it) }
19
- }
20
-
21
- @ReactProp(name = "accessToken")
22
- fun setAccessToken(view: TpStreamsPlayerView, accessToken: String?) {
23
- accessToken?.let { view.setAccessToken(it) }
24
- }
25
-
26
- @ReactProp(name = "enableDownload")
27
- fun setEnableDownload(view: TpStreamsPlayerView, enableDownload: Boolean?) {
28
- view.setEnableDownload(enableDownload)
29
- }
30
-
31
- @ReactProp(name = "autoPlay")
32
- fun setAutoPlay(view: TpStreamsPlayerView, autoPlay: Boolean?) {
33
- view.setAutoPlay(autoPlay)
34
- }
35
-
36
- @ReactProp(name = "startAt")
37
- fun setStartTime(view: TpStreamsPlayerView, startAt: Int?) {
38
- view.setStartTime(startAt ?: 0)
39
- }
40
-
41
- @ReactProp(name = "offlineLicenseExpireTime")
42
- fun setOfflineLicenseExpireTime(view: TpStreamsPlayerView, offlineLicenseExpireTime: Int?) {
43
- view.setOfflineLicenseExpireTime(offlineLicenseExpireTime ?: 60 * 60 * 24 * 15)
44
- }
45
-
46
- @ReactProp(name = "downloadMetadata")
47
- fun setDownloadMetadata(view: TpStreamsPlayerView, downloadMetadata: ReadableMap?) {
48
- downloadMetadata?.let { view.setDownloadMetadata(downloadMetadata) }
49
- }
50
- }
51
-
52
-
53
-
54
-
55
-