react-native-tpstreams 0.1.9 → 0.1.10

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.
@@ -1,210 +1,226 @@
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
- class PlayerFragment : Fragment() {
23
-
24
- lateinit var player: TpStreamPlayer
25
- lateinit var playerView: TPStreamPlayerView
26
- lateinit var playerFragment: TpStreamPlayerFragment
27
- private var videoId :String = ""
28
- private var accessToken :String = ""
29
- private var enableDownloadSupport :Boolean = true
30
- private var setAutoPlay :Boolean = true
31
-
32
- companion object {
33
- var instance: PlayerFragment? = null
34
- }
35
-
36
- override fun onCreate(savedInstanceState: Bundle?) {
37
- super.onCreate(savedInstanceState)
38
- val bundle = arguments
39
- if (bundle != null) {
40
- videoId = bundle.getString("VIDEO_ID") ?: ""
41
- accessToken = bundle.getString("ACCESS_TOKEN") ?: ""
42
- enableDownloadSupport = bundle.getBoolean("ENABLE_DOWNLOAD_SUPPORT", true)
43
- setAutoPlay = bundle.getBoolean("AUTO_PLAY", true)
44
-
45
- }
46
- }
47
-
48
- override fun onCreateView(
49
- inflater: LayoutInflater, container: ViewGroup?,
50
- savedInstanceState: Bundle?
51
- ): View? {
52
- return inflater.inflate(R.layout.fragment_player, container, false)
53
- }
54
-
55
- override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
56
- super.onViewCreated(view, savedInstanceState)
57
- instance = this
58
- playerFragment = childFragmentManager.findFragmentById(R.id.tpstream_player_fragment) as TpStreamPlayerFragment
59
- playerFragment.setOnInitializationListener(object: InitializationListener {
60
-
61
- override fun onInitializationSuccess(player: TpStreamPlayer) {
62
- this@PlayerFragment.player = player
63
- playerView = playerFragment.tpStreamPlayerView
64
- loadPLayer()
65
- addPlayerListener()
66
- }
67
- })
68
- }
69
-
70
- fun loadPLayer() {
71
- val parameters = TpInitParams.Builder()
72
- .setVideoId(videoId)
73
- .setAccessToken(accessToken)
74
- .enableDownloadSupport(enableDownloadSupport)
75
- .setAutoPlay(setAutoPlay)
76
- .build()
77
- requireActivity().runOnUiThread {
78
- player.load(parameters)
79
- }
80
- }
81
-
82
- private fun sendEvent(eventName: String, params: Any?) {
83
- TpstreamsModule.sendEvent(eventName, params)
84
- }
85
-
86
- private fun addPlayerListener(){
87
- player.setListener( object : TPStreamPlayerListener {
88
- override fun onPlaybackStateChanged(playbackState: Int) {
89
- sendEvent("onPlaybackStateChanged", playbackState)
90
- }
91
-
92
- override fun onAccessTokenExpired(videoId: String, callback: (String) -> Unit) {
93
- sendEvent("onAccessTokenExpired", videoId)
94
- callback(accessToken)
95
- }
96
-
97
- override fun onMarkerCallback(timesInSeconds: Long) {
98
- requireActivity().runOnUiThread {
99
- Toast.makeText(requireContext(),"Time $timesInSeconds", Toast.LENGTH_SHORT).show()
100
- }
101
- sendEvent("onMarkerCallback", timesInSeconds)
102
- }
103
-
104
- override fun onDeviceInfoChanged(deviceInfo: DeviceInfo) {
105
- sendEvent("onDeviceInfoChanged", deviceInfo.toString())
106
- }
107
-
108
- override fun onFullScreenChanged(isFullScreen: Boolean) {
109
- sendEvent("onFullScreenChanged", isFullScreen)
110
- }
111
-
112
- override fun onIsLoadingChanged(isLoading: Boolean) {
113
- sendEvent("onIsLoadingChanged", isLoading)
114
- }
115
-
116
- override fun onIsPlayingChanged(isPlaying: Boolean) {
117
- sendEvent("onIsPlayingChanged", isPlaying)
118
- }
119
-
120
- override fun onPlayerError(playbackError: PlaybackError) {
121
- sendEvent("onPlayerError", playbackError.toString())
122
- }
123
-
124
- override fun onSeekBackIncrementChanged(incrementMs: Long) {
125
- sendEvent("onSeekBackIncrementChanged", incrementMs)
126
- }
127
-
128
- override fun onSeekForwardIncrementChanged(incrementMs: Long) {
129
- sendEvent("onSeekForwardIncrementChanged", incrementMs)
130
- }
131
-
132
- override fun onTimelineChanged(timeline: Timeline, reason: Int) {
133
- sendEvent("onTimelineChanged", null)
134
- }
135
-
136
- override fun onTracksChanged(tracks: Tracks) {
137
- sendEvent("onTracksChanged", tracks.toString())
138
- }
139
- })
140
- }
141
- // Core Player Controls
142
- fun play() {
143
- requireActivity().runOnUiThread {
144
- player.play()
145
- }
146
- }
147
-
148
- fun pause() {
149
- requireActivity().runOnUiThread {
150
- player.pause()
151
- }
152
- }
153
-
154
- fun seekTo(position: Long) {
155
- requireActivity().runOnUiThread {
156
- player.seekTo(position)
157
- }
158
- }
159
-
160
- fun release() {
161
- requireActivity().runOnUiThread {
162
- player.release()
163
- }
164
- }
165
-
166
- fun load(params: TpInitParams) {
167
- requireActivity().runOnUiThread {
168
- player.load(params)
169
- }
170
- }
171
-
172
- // Playback & State Management
173
- fun getCurrentTime(): Double = player.getCurrentTime().toDouble()
174
-
175
- fun getDuration(): Double = player.getDuration().toDouble()
176
-
177
- fun getBufferedTime(): Double = player.getBufferedTime().toDouble()
178
-
179
- fun getPlaybackState(): Int = player.getPlaybackState()
180
-
181
- fun getPlayWhenReady(): Boolean = player.getPlayWhenReady()
182
-
183
- fun setPlayWhenReady(playWhenReady: Boolean) {
184
- requireActivity().runOnUiThread {
185
- player.setPlayWhenReady(playWhenReady)
186
- }
187
- }
188
-
189
-
190
- // Speed & Volume
191
- fun getPlaybackSpeed(): Float = player.getPlayBackSpeed()
192
-
193
- fun setPlaybackSpeed(speed: Float) {
194
- requireActivity().runOnUiThread {
195
- player.setPlaybackSpeed(speed)
196
- }
197
- }
198
-
199
- override fun onResume() {
200
- super.onResume()
201
- Log.d("ReactNativeJS", "onResume: ")
202
- }
203
-
204
- override fun onDestroy() {
205
- super.onDestroy()
206
- instance = null
207
- Log.d("ReactNativeJS", "onDestroy: ")
208
- }
209
-
210
- }
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 = 15
35
+
36
+ private var accessTokenCallback : onAccessTokenCallbase? = null
37
+
38
+ companion object {
39
+ var instance: PlayerFragment? = null
40
+ }
41
+
42
+ override fun onCreate(savedInstanceState: Bundle?) {
43
+ super.onCreate(savedInstanceState)
44
+ val bundle = arguments
45
+ if (bundle != null) {
46
+ videoId = bundle.getString("VIDEO_ID") ?: ""
47
+ accessToken = bundle.getString("ACCESS_TOKEN") ?: ""
48
+ enableDownloadSupport = bundle.getBoolean("ENABLE_DOWNLOAD_SUPPORT", true)
49
+ setAutoPlay = bundle.getBoolean("AUTO_PLAY", true)
50
+ startAt = bundle.getInt("START_AT", 0)
51
+ offlineLicenseExpireTime = bundle.getInt("OFFLINE_LICENSE_EXPIRE_TIME", 15)
52
+
53
+ }
54
+ }
55
+
56
+ override fun onCreateView(
57
+ inflater: LayoutInflater, container: ViewGroup?,
58
+ savedInstanceState: Bundle?
59
+ ): View? {
60
+ return inflater.inflate(R.layout.fragment_player, container, false)
61
+ }
62
+
63
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
64
+ super.onViewCreated(view, savedInstanceState)
65
+ instance = this
66
+ playerFragment = childFragmentManager.findFragmentById(R.id.tpstream_player_fragment) as TpStreamPlayerFragment
67
+ playerFragment.setOnInitializationListener(object: InitializationListener {
68
+
69
+ override fun onInitializationSuccess(player: TpStreamPlayer) {
70
+ this@PlayerFragment.player = player
71
+ playerView = playerFragment.tpStreamPlayerView
72
+ loadPLayer()
73
+ addPlayerListener()
74
+ }
75
+ })
76
+ }
77
+
78
+ fun loadPLayer() {
79
+ val parameters = TpInitParams.Builder()
80
+ .setVideoId(videoId)
81
+ .setAccessToken(accessToken)
82
+ .enableDownloadSupport(enableDownloadSupport)
83
+ .setAutoPlay(setAutoPlay)
84
+ .startAt(startAt.toLong())
85
+ .setOfflineLicenseExpireTime(offlineLicenseExpireTime)
86
+ .build()
87
+ requireActivity().runOnUiThread {
88
+ player.load(parameters)
89
+ }
90
+ }
91
+
92
+ private fun sendEvent(eventName: String, params: Any?) {
93
+ TpstreamsModule.sendEvent(eventName, params)
94
+ }
95
+
96
+ private fun addPlayerListener(){
97
+ player.setListener( object : TPStreamPlayerListener {
98
+ override fun onPlaybackStateChanged(playbackState: Int) {
99
+ sendEvent("onPlaybackStateChanged", playbackState)
100
+ }
101
+
102
+ override fun onAccessTokenExpired(videoId: String, callback: (String) -> Unit) {
103
+ Log.d("ReactNativeJS", "onTokenExpired: $videoId")
104
+ accessTokenCallback = callback
105
+ sendEvent("onAccessTokenExpired", videoId)
106
+ }
107
+
108
+ override fun onMarkerCallback(timesInSeconds: Long) {
109
+ requireActivity().runOnUiThread {
110
+ Toast.makeText(requireContext(),"Time $timesInSeconds", Toast.LENGTH_SHORT).show()
111
+ }
112
+ sendEvent("onMarkerCallback", timesInSeconds)
113
+ }
114
+
115
+ override fun onDeviceInfoChanged(deviceInfo: DeviceInfo) {
116
+ sendEvent("onDeviceInfoChanged", deviceInfo.toString())
117
+ }
118
+
119
+ override fun onFullScreenChanged(isFullScreen: Boolean) {
120
+ sendEvent("onFullScreenChanged", isFullScreen)
121
+ }
122
+
123
+ override fun onIsLoadingChanged(isLoading: Boolean) {
124
+ sendEvent("onIsLoadingChanged", isLoading)
125
+ }
126
+
127
+ override fun onIsPlayingChanged(isPlaying: Boolean) {
128
+ sendEvent("onIsPlayingChanged", isPlaying)
129
+ }
130
+
131
+ override fun onPlayerError(playbackError: PlaybackError) {
132
+ sendEvent("onPlayerError", playbackError.toString())
133
+ }
134
+
135
+ override fun onSeekBackIncrementChanged(incrementMs: Long) {
136
+ sendEvent("onSeekBackIncrementChanged", incrementMs)
137
+ }
138
+
139
+ override fun onSeekForwardIncrementChanged(incrementMs: Long) {
140
+ sendEvent("onSeekForwardIncrementChanged", incrementMs)
141
+ }
142
+
143
+ override fun onTimelineChanged(timeline: Timeline, reason: Int) {
144
+ sendEvent("onTimelineChanged", null)
145
+ }
146
+
147
+ override fun onTracksChanged(tracks: Tracks) {
148
+ sendEvent("onTracksChanged", tracks.toString())
149
+ }
150
+ })
151
+ }
152
+ // Core Player Controls
153
+ fun play() {
154
+ requireActivity().runOnUiThread {
155
+ player.play()
156
+ }
157
+ }
158
+
159
+ fun pause() {
160
+ requireActivity().runOnUiThread {
161
+ player.pause()
162
+ }
163
+ }
164
+
165
+ fun seekTo(position: Long) {
166
+ requireActivity().runOnUiThread {
167
+ player.seekTo(position)
168
+ }
169
+ }
170
+
171
+ fun release() {
172
+ requireActivity().runOnUiThread {
173
+ player.release()
174
+ }
175
+ }
176
+
177
+ fun load(params: TpInitParams) {
178
+ requireActivity().runOnUiThread {
179
+ player.load(params)
180
+ }
181
+ }
182
+
183
+ // Playback & State Management
184
+ fun getCurrentTime(): Double = player.getCurrentTime().toDouble()
185
+
186
+ fun getDuration(): Double = player.getDuration().toDouble()
187
+
188
+ fun getBufferedTime(): Double = player.getBufferedTime().toDouble()
189
+
190
+ fun getPlaybackState(): Int = player.getPlaybackState()
191
+
192
+ fun getPlayWhenReady(): Boolean = player.getPlayWhenReady()
193
+
194
+ fun setPlayWhenReady(playWhenReady: Boolean) {
195
+ requireActivity().runOnUiThread {
196
+ player.setPlayWhenReady(playWhenReady)
197
+ }
198
+ }
199
+
200
+
201
+ // Speed & Volume
202
+ fun getPlaybackSpeed(): Float = player.getPlayBackSpeed()
203
+
204
+ fun setPlaybackSpeed(speed: Float) {
205
+ requireActivity().runOnUiThread {
206
+ player.setPlaybackSpeed(speed)
207
+ }
208
+ }
209
+
210
+ fun setNewAccessToken(token: String) {
211
+ accessTokenCallback?.invoke(token)
212
+ accessTokenCallback = null
213
+ }
214
+
215
+ override fun onResume() {
216
+ super.onResume()
217
+ Log.d("ReactNativeJS", "onResume: ")
218
+ }
219
+
220
+ override fun onDestroy() {
221
+ super.onDestroy()
222
+ instance = null
223
+ Log.d("ReactNativeJS", "onDestroy: ")
224
+ }
225
+
226
+ }
@@ -1,79 +1,93 @@
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.uimanager.ThemedReactContext
10
-
11
- class TpStreamsPlayerView @JvmOverloads constructor(
12
- context: Context,
13
- attrs: AttributeSet? = null
14
- ) : FrameLayout(context, attrs), CoroutineScope {
15
-
16
- private var videoId: String? = null
17
- private var accessToken: String? = null
18
- private var enableDownload: Boolean = true
19
- private var autoPlay :Boolean = true
20
- private var fragmentModule: FragmentModule? = null
21
-
22
- private val job = SupervisorJob()
23
- override val coroutineContext = Dispatchers.Main + job
24
- private var updateJob: Job? = null
25
-
26
- init {
27
- if (context is ThemedReactContext) {
28
- val reactContext = context.reactApplicationContext
29
- val activity = context.currentActivity as? FragmentActivity
30
-
31
- if (activity != null) {
32
- fragmentModule = FragmentModule(reactContext)
33
- }
34
- }
35
- }
36
-
37
- fun setVideoId(id: String) {
38
- videoId = id
39
- updateFragment()
40
- }
41
-
42
- fun setAccessToken(token: String) {
43
- accessToken = token
44
- updateFragment()
45
- }
46
-
47
- fun setEnableDownload(enableDownload: Boolean?) {
48
- this.enableDownload = enableDownload ?: true
49
- updateFragment()
50
- }
51
-
52
- fun setAutoPlay(autoPlay: Boolean?) {
53
- this.autoPlay = autoPlay ?: true
54
- updateFragment()
55
- }
56
-
57
- private fun updateFragment() {
58
- if (!videoId.isNullOrEmpty() && !accessToken.isNullOrEmpty()) {
59
- updateJob?.cancel()
60
- updateJob = launch {
61
- delay(50)
62
- fragmentModule?.closeCustomFragment()
63
- fragmentModule?.showCustomFragment(
64
- videoId!!,
65
- accessToken!!,
66
- enableDownload,
67
- autoPlay ?: true
68
- )
69
- }
70
- }
71
- }
72
-
73
- override fun onDetachedFromWindow() {
74
- super.onDetachedFromWindow()
75
- coroutineContext.cancel()
76
- fragmentModule?.closeCustomFragment()
77
- }
78
-
79
- }
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.uimanager.ThemedReactContext
10
+
11
+ class TpStreamsPlayerView @JvmOverloads constructor(
12
+ context: Context,
13
+ attrs: AttributeSet? = null
14
+ ) : FrameLayout(context, attrs), CoroutineScope {
15
+
16
+ private var videoId: String? = null
17
+ private var accessToken: String? = null
18
+ private var enableDownload: Boolean = true
19
+ private var autoPlay :Boolean = true
20
+ private var startAt :Int = 0
21
+ private var offlineLicenseExpireTime :Int = 15
22
+ private var fragmentModule: FragmentModule? = null
23
+
24
+ private val job = SupervisorJob()
25
+ override val coroutineContext = Dispatchers.Main + job
26
+ private var updateJob: Job? = null
27
+
28
+ init {
29
+ if (context is ThemedReactContext) {
30
+ val reactContext = context.reactApplicationContext
31
+ val activity = context.currentActivity as? FragmentActivity
32
+
33
+ if (activity != null) {
34
+ fragmentModule = FragmentModule(reactContext)
35
+ }
36
+ }
37
+ }
38
+
39
+ fun setVideoId(id: String) {
40
+ videoId = id
41
+ updateFragment()
42
+ }
43
+
44
+ fun setAccessToken(token: String) {
45
+ accessToken = token
46
+ updateFragment()
47
+ }
48
+
49
+ fun setEnableDownload(enableDownload: Boolean?) {
50
+ this.enableDownload = enableDownload ?: true
51
+ updateFragment()
52
+ }
53
+
54
+ fun setAutoPlay(autoPlay: Boolean?) {
55
+ this.autoPlay = autoPlay ?: true
56
+ updateFragment()
57
+ }
58
+
59
+ fun setStartTime(startAt: Int?) {
60
+ this.startAt = startAt ?: 0
61
+ updateFragment()
62
+ }
63
+
64
+ fun setOfflineLicenseExpireTime(offlineLicenseExpireTime: Int?) {
65
+ this.offlineLicenseExpireTime = offlineLicenseExpireTime ?: 15
66
+ updateFragment()
67
+ }
68
+
69
+ private fun updateFragment() {
70
+ if (!videoId.isNullOrEmpty() && !accessToken.isNullOrEmpty()) {
71
+ updateJob?.cancel()
72
+ updateJob = launch {
73
+ delay(50)
74
+ fragmentModule?.closeCustomFragment()
75
+ fragmentModule?.showCustomFragment(
76
+ videoId!!,
77
+ accessToken!!,
78
+ enableDownload,
79
+ autoPlay ?: true,
80
+ startAt,
81
+ offlineLicenseExpireTime,
82
+ )
83
+ }
84
+ }
85
+ }
86
+
87
+ override fun onDetachedFromWindow() {
88
+ super.onDetachedFromWindow()
89
+ coroutineContext.cancel()
90
+ fragmentModule?.closeCustomFragment()
91
+ }
92
+
93
+ }