react-native-tpstreams 0.1.15 → 0.2.1
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/LICENSE +1 -1
- package/README.md +20 -418
- package/Tpstreams.podspec +3 -25
- package/android/build.gradle +14 -42
- package/android/src/main/AndroidManifest.xml +1 -3
- package/android/src/main/java/com/tpstreams/TPStreamsRNModule.kt +18 -0
- package/android/src/main/java/com/tpstreams/{TpstreamsPackage.kt → TPStreamsRNPackage.kt} +10 -5
- package/android/src/main/java/com/tpstreams/TPStreamsRNPlayerView.kt +162 -0
- package/android/src/main/java/com/tpstreams/TPStreamsRNPlayerViewManager.kt +97 -0
- package/ios/TpstreamsView.h +14 -0
- package/ios/TpstreamsView.mm +71 -0
- package/ios/TpstreamsViewManager.mm +19 -0
- package/lib/module/TPStreamsPlayer.js +159 -0
- package/lib/module/TPStreamsPlayer.js.map +1 -0
- package/lib/module/TPStreamsPlayerViewNativeComponent.ts +70 -0
- package/lib/module/index.js +10 -3
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/TPStreamsPlayer.d.ts +32 -0
- package/lib/typescript/src/TPStreamsPlayer.d.ts.map +1 -0
- package/lib/typescript/src/TPStreamsPlayerViewNativeComponent.d.ts +54 -0
- package/lib/typescript/src/TPStreamsPlayerViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +8 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/package.json +42 -76
- package/src/TPStreamsPlayer.tsx +225 -0
- package/src/TPStreamsPlayerViewNativeComponent.ts +70 -0
- package/src/index.tsx +12 -7
- package/android/generated/java/com/tpstreams/NativeTpstreamsSpec.java +0 -37
- package/android/generated/jni/CMakeLists.txt +0 -36
- package/android/generated/jni/RNTpstreamsSpec-generated.cpp +0 -32
- package/android/generated/jni/RNTpstreamsSpec.h +0 -31
- package/android/generated/jni/react/renderer/components/RNTpstreamsSpec/RNTpstreamsSpecJSI-generated.cpp +0 -28
- package/android/generated/jni/react/renderer/components/RNTpstreamsSpec/RNTpstreamsSpecJSI.h +0 -71
- package/android/libs/extracted-aar/META-INF/com/android/build/gradle/aar-metadata.properties +0 -4
- package/android/src/main/AndroidManifestNew.xml +0 -2
- package/android/src/main/java/com/tpstreams/FragmentModule.kt +0 -225
- package/android/src/main/java/com/tpstreams/PlayerFragment.kt +0 -234
- package/android/src/main/java/com/tpstreams/TpStreamsPlayerView.kt +0 -102
- package/android/src/main/java/com/tpstreams/TpStreamsPlayerViewManager.kt +0 -55
- package/android/src/main/java/com/tpstreams/TpstreamsModule.kt +0 -168
- package/android/src/main/res/layout/fragment_player.xml +0 -29
- package/android/src/main/res/xml/network_security_config.xml +0 -8
- package/ios/Tpstreams.h +0 -6
- package/ios/Tpstreams.mm +0 -18
- package/ios/generated/RNTpstreamsSpec/RNTpstreamsSpec-generated.mm +0 -39
- package/ios/generated/RNTpstreamsSpec/RNTpstreamsSpec.h +0 -63
- package/ios/generated/RNTpstreamsSpecJSI-generated.cpp +0 -28
- package/ios/generated/RNTpstreamsSpecJSI.h +0 -71
- package/lib/commonjs/NativeTpstreams.js +0 -9
- package/lib/commonjs/NativeTpstreams.js.map +0 -1
- package/lib/commonjs/index.js +0 -10
- package/lib/commonjs/index.js.map +0 -1
- package/lib/commonjs/types.js +0 -2
- package/lib/commonjs/types.js.map +0 -1
- package/lib/module/NativeTpstreams.js +0 -5
- package/lib/module/NativeTpstreams.js.map +0 -1
- package/lib/module/types.js +0 -2
- package/lib/module/types.js.map +0 -1
- package/lib/typescript/commonjs/package.json +0 -1
- package/lib/typescript/commonjs/src/NativeTpstreams.d.ts +0 -7
- package/lib/typescript/commonjs/src/NativeTpstreams.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/index.d.ts +0 -5
- package/lib/typescript/commonjs/src/index.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/types.d.ts +0 -11
- package/lib/typescript/commonjs/src/types.d.ts.map +0 -1
- package/lib/typescript/module/src/NativeTpstreams.d.ts +0 -7
- package/lib/typescript/module/src/NativeTpstreams.d.ts.map +0 -1
- package/lib/typescript/module/src/index.d.ts +0 -5
- package/lib/typescript/module/src/index.d.ts.map +0 -1
- package/lib/typescript/module/src/types.d.ts +0 -11
- package/lib/typescript/module/src/types.d.ts.map +0 -1
- package/react-native.config.js +0 -12
- package/src/NativeTpstreams.ts +0 -8
- package/src/types.ts +0 -10
- /package/lib/{typescript/module → module}/package.json +0 -0
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
-
*
|
|
5
|
-
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
-
* once the code is regenerated.
|
|
7
|
-
*
|
|
8
|
-
* @generated by codegen project: GenerateModuleJniCpp.js
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#include "RNTpstreamsSpec.h"
|
|
12
|
-
|
|
13
|
-
namespace facebook::react {
|
|
14
|
-
|
|
15
|
-
static facebook::jsi::Value __hostFunction_NativeTpstreamsSpecJSI_multiply(facebook::jsi::Runtime& rt, TurboModule &turboModule, const facebook::jsi::Value* args, size_t count) {
|
|
16
|
-
static jmethodID cachedMethodId = nullptr;
|
|
17
|
-
return static_cast<JavaTurboModule &>(turboModule).invokeJavaMethod(rt, NumberKind, "multiply", "(DD)D", args, count, cachedMethodId);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
NativeTpstreamsSpecJSI::NativeTpstreamsSpecJSI(const JavaTurboModule::InitParams ¶ms)
|
|
21
|
-
: JavaTurboModule(params) {
|
|
22
|
-
methodMap_["multiply"] = MethodMetadata {2, __hostFunction_NativeTpstreamsSpecJSI_multiply};
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
std::shared_ptr<TurboModule> RNTpstreamsSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms) {
|
|
26
|
-
if (moduleName == "Tpstreams") {
|
|
27
|
-
return std::make_shared<NativeTpstreamsSpecJSI>(params);
|
|
28
|
-
}
|
|
29
|
-
return nullptr;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
} // namespace facebook::react
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
/**
|
|
3
|
-
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
|
4
|
-
*
|
|
5
|
-
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
|
6
|
-
* once the code is regenerated.
|
|
7
|
-
*
|
|
8
|
-
* @generated by codegen project: GenerateModuleJniH.js
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
#pragma once
|
|
12
|
-
|
|
13
|
-
#include <ReactCommon/JavaTurboModule.h>
|
|
14
|
-
#include <ReactCommon/TurboModule.h>
|
|
15
|
-
#include <jsi/jsi.h>
|
|
16
|
-
|
|
17
|
-
namespace facebook::react {
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* JNI C++ class for module 'NativeTpstreams'
|
|
21
|
-
*/
|
|
22
|
-
class JSI_EXPORT NativeTpstreamsSpecJSI : public JavaTurboModule {
|
|
23
|
-
public:
|
|
24
|
-
NativeTpstreamsSpecJSI(const JavaTurboModule::InitParams ¶ms);
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
JSI_EXPORT
|
|
29
|
-
std::shared_ptr<TurboModule> RNTpstreamsSpec_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams ¶ms);
|
|
30
|
-
|
|
31
|
-
} // namespace facebook::react
|
|
@@ -1,28 +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: GenerateModuleCpp.js
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
#include "RNTpstreamsSpecJSI.h"
|
|
11
|
-
|
|
12
|
-
namespace facebook::react {
|
|
13
|
-
|
|
14
|
-
static jsi::Value __hostFunction_NativeTpstreamsCxxSpecJSI_multiply(jsi::Runtime &rt, TurboModule &turboModule, const jsi::Value* args, size_t count) {
|
|
15
|
-
return static_cast<NativeTpstreamsCxxSpecJSI *>(&turboModule)->multiply(
|
|
16
|
-
rt,
|
|
17
|
-
count <= 0 ? throw jsi::JSError(rt, "Expected argument in position 0 to be passed") : args[0].asNumber(),
|
|
18
|
-
count <= 1 ? throw jsi::JSError(rt, "Expected argument in position 1 to be passed") : args[1].asNumber()
|
|
19
|
-
);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
NativeTpstreamsCxxSpecJSI::NativeTpstreamsCxxSpecJSI(std::shared_ptr<CallInvoker> jsInvoker)
|
|
23
|
-
: TurboModule("Tpstreams", jsInvoker) {
|
|
24
|
-
methodMap_["multiply"] = MethodMetadata {2, __hostFunction_NativeTpstreamsCxxSpecJSI_multiply};
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
} // namespace facebook::react
|
package/android/generated/jni/react/renderer/components/RNTpstreamsSpec/RNTpstreamsSpecJSI.h
DELETED
|
@@ -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,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
|
-
}
|