hypertrack-sdk-react-native 10.0.3 → 11.0.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.
Files changed (70) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/CONTRIBUTING.md +1 -1
  3. package/README.md +2 -2
  4. package/android/build.gradle +5 -1
  5. package/android/gradle.properties +1 -1
  6. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackReactNativePlugin.kt +80 -115
  7. package/android/src/main/java/com/reactnativehypertracksdk/ReactNativeSerialization.kt +23 -3
  8. package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackSdkWrapper.kt +87 -220
  9. package/android/src/main/java/com/reactnativehypertracksdk/common/SdkMethod.kt +11 -9
  10. package/android/src/main/java/com/reactnativehypertracksdk/common/Serialization.kt +216 -132
  11. package/android/src/main/java/com/reactnativehypertracksdk/common/{Result.kt → WrapperResult.kt} +9 -7
  12. package/hypertrack-sdk-react-native.podspec +1 -1
  13. package/ios/HyperTrackReactNativePlugin.m +13 -11
  14. package/ios/HyperTrackReactNativePlugin.swift +141 -114
  15. package/ios/common/DictionaryDecoder.swift +5 -5
  16. package/ios/common/HyperTrackSDKWrapper.swift +46 -80
  17. package/ios/common/SDKMethod.swift +13 -12
  18. package/ios/common/Serialization.swift +200 -245
  19. package/lib/commonjs/HyperTrack/HyperTrack.js +224 -124
  20. package/lib/commonjs/HyperTrack/HyperTrack.js.map +1 -1
  21. package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js +13 -17
  22. package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js.map +1 -1
  23. package/lib/commonjs/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -1
  24. package/lib/commonjs/HyperTrack/data_types/internal/Metadata.js +2 -0
  25. package/lib/commonjs/HyperTrack/data_types/internal/Metadata.js.map +1 -0
  26. package/lib/commonjs/HyperTrack/data_types/internal/Name.js +2 -0
  27. package/lib/commonjs/HyperTrack/data_types/internal/Name.js.map +1 -0
  28. package/lib/commonjs/index.js +0 -7
  29. package/lib/commonjs/index.js.map +1 -1
  30. package/lib/module/HyperTrack/HyperTrack.js +224 -124
  31. package/lib/module/HyperTrack/HyperTrack.js.map +1 -1
  32. package/lib/module/HyperTrack/data_types/HyperTrackError.js +13 -17
  33. package/lib/module/HyperTrack/data_types/HyperTrackError.js.map +1 -1
  34. package/lib/module/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -1
  35. package/lib/module/HyperTrack/data_types/internal/Metadata.js +2 -0
  36. package/lib/module/HyperTrack/data_types/internal/Metadata.js.map +1 -0
  37. package/lib/module/HyperTrack/data_types/internal/Name.js +2 -0
  38. package/lib/module/HyperTrack/data_types/internal/Name.js.map +1 -0
  39. package/lib/module/index.js +0 -1
  40. package/lib/module/index.js.map +1 -1
  41. package/lib/typescript/HyperTrack/HyperTrack.d.ts +106 -54
  42. package/lib/typescript/HyperTrack/data_types/HyperTrackError.d.ts +59 -17
  43. package/lib/typescript/HyperTrack/data_types/internal/HyperTrackErrorInternal.d.ts +1 -1
  44. package/lib/typescript/HyperTrack/data_types/internal/Metadata.d.ts +4 -0
  45. package/lib/typescript/HyperTrack/data_types/internal/Name.d.ts +7 -0
  46. package/lib/typescript/index.d.ts +0 -1
  47. package/package.json +1 -1
  48. package/src/HyperTrack/HyperTrack.ts +281 -161
  49. package/src/HyperTrack/data_types/HyperTrackError.ts +73 -18
  50. package/src/HyperTrack/data_types/internal/HyperTrackErrorInternal.ts +3 -3
  51. package/src/HyperTrack/data_types/internal/Metadata.ts +4 -0
  52. package/src/HyperTrack/data_types/internal/Name.ts +7 -0
  53. package/src/index.tsx +0 -1
  54. package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackError.kt +0 -28
  55. package/android/src/main/java/com/reactnativehypertracksdk/common/LocationError.kt +0 -9
  56. package/android/src/main/java/com/reactnativehypertracksdk/common/SdkInitParams.kt +0 -44
  57. package/ios/common/HyperTrackError.swift +0 -20
  58. package/ios/common/SDKInitParams.swift +0 -13
  59. package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js +0 -2
  60. package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js.map +0 -1
  61. package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js +0 -2
  62. package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js.map +0 -1
  63. package/lib/module/HyperTrack/data_types/SdkInitParams.js +0 -2
  64. package/lib/module/HyperTrack/data_types/SdkInitParams.js.map +0 -1
  65. package/lib/module/HyperTrack/data_types/internal/DeviceName.js +0 -2
  66. package/lib/module/HyperTrack/data_types/internal/DeviceName.js.map +0 -1
  67. package/lib/typescript/HyperTrack/data_types/SdkInitParams.d.ts +0 -25
  68. package/lib/typescript/HyperTrack/data_types/internal/DeviceName.d.ts +0 -4
  69. package/src/HyperTrack/data_types/SdkInitParams.ts +0 -28
  70. package/src/HyperTrack/data_types/internal/DeviceName.ts +0 -4
@@ -1,19 +1,27 @@
1
1
  package com.reactnativehypertracksdk.common
2
2
 
3
3
  import com.hypertrack.sdk.*
4
- import com.hypertrack.sdk.GeotagResult
5
- import com.reactnativehypertracksdk.common.Serialization.deserializeAvailability
6
- import com.reactnativehypertracksdk.common.Serialization.deserializeDeviceName
4
+ import com.hypertrack.sdk.android.HyperTrack
5
+ import com.hypertrack.sdk.android.HyperTrack.metadata
6
+ import com.hypertrack.sdk.android.Json
7
+ import com.hypertrack.sdk.android.Result
8
+ import com.reactnativehypertracksdk.common.Serialization.deserializeIsAvailable
9
+ import com.reactnativehypertracksdk.common.Serialization.deserializeName
7
10
  import com.reactnativehypertracksdk.common.Serialization.deserializeGeotagData
11
+ import com.reactnativehypertracksdk.common.Serialization.deserializeIsTracking
12
+ import com.reactnativehypertracksdk.common.Serialization.deserializeMetadata
8
13
  import com.reactnativehypertracksdk.common.Serialization.serializeDeviceId
9
14
  import com.reactnativehypertracksdk.common.Serialization.serializeErrors
10
15
  import com.reactnativehypertracksdk.common.Serialization.serializeIsAvailable
11
16
  import com.reactnativehypertracksdk.common.Serialization.serializeIsTracking
12
17
  import com.reactnativehypertracksdk.common.Serialization.serializeLocationErrorFailure
18
+ import com.reactnativehypertracksdk.common.Serialization.serializeLocationResult
13
19
  import com.reactnativehypertracksdk.common.Serialization.serializeLocationSuccess
14
20
  import com.reactnativehypertracksdk.common.Serialization.serializeLocationWithDeviationSuccess
15
- import java.lang.IllegalStateException
16
- import java.lang.RuntimeException
21
+ import com.reactnativehypertracksdk.common.Serialization.serializeMetadata
22
+ import com.reactnativehypertracksdk.common.Serialization.serializeName
23
+
24
+ typealias Serialized = Map<String, Any?>
17
25
 
18
26
  /**
19
27
  * This class stores SDK instance, calls HyperTrack SDK methods and serializes responses.
@@ -21,257 +29,116 @@ import java.lang.RuntimeException
21
29
  */
22
30
  internal object HyperTrackSdkWrapper {
23
31
 
24
- // initialize method is guaranteed to be called (by non-native side)
25
- // prior to any access to the SDK instance
26
- private lateinit var _sdkInstance: HyperTrack
27
- val sdkInstance: HyperTrack
28
- get() = _sdkInstance
29
-
30
- // method is named to align with 'initializeSDK' in iOS
31
- fun initializeSdk(
32
- args: Map<String, Any?>
33
- ): Result<HyperTrack> {
34
- return try {
35
- SdkInitParams.fromMap(args)
36
- .flatMapSuccess { initParams ->
37
- _sdkInstance = HyperTrack.getInstance(initParams.publishableKey)
38
- if (initParams.loggingEnabled) {
39
- HyperTrack.enableDebugLogging()
40
- }
41
- if (initParams.allowMockLocations) {
42
- sdkInstance.allowMockLocations()
43
- }
44
- sdkInstance.backgroundTrackingRequirement(
45
- initParams.requireBackgroundTrackingPermission
46
- )
47
- Success(sdkInstance)
48
- }
49
- } catch (exception: Exception) {
50
- Failure(exception)
51
- }
52
- }
53
-
54
- fun getDeviceId(): Result<Map<String, Any?>> {
55
- return Success(serializeDeviceId(sdkInstance.deviceID))
56
- }
57
-
58
- fun startTracking(): Result<Unit> {
59
- sdkInstance.start()
60
- return Success(Unit)
61
- }
62
-
63
- fun stopTracking(): Result<Unit> {
64
- sdkInstance.stop()
65
- return Success(Unit)
66
- }
67
-
68
- fun sync(): Result<Unit> {
69
- sdkInstance.syncDeviceSettings()
70
- return Success(Unit)
71
- }
72
-
73
- fun addGeotag(args: Map<String, Any?>): Result<Map<String, Any?>> {
32
+ fun addGeotag(args: Serialized): WrapperResult<Serialized> {
74
33
  return deserializeGeotagData(args)
75
34
  .flatMapSuccess { geotag ->
76
- sdkInstance
77
- .addGeotag(geotag.data, geotag.expectedLocation)
78
- .let { result ->
79
- if(geotag.expectedLocation == null) {
80
- when (result) {
81
- is GeotagResult.SuccessWithDeviation -> {
82
- // not supposed to happen
83
- serializeLocationSuccess(result.deviceLocation)
84
- }
85
-
86
- is GeotagResult.Success -> {
87
- serializeLocationSuccess(result.deviceLocation)
88
- }
89
-
90
- is GeotagResult.Error -> {
91
- serializeLocationErrorFailure(getLocationError(result.reason))
92
- }
93
-
94
- else -> {
95
- throw IllegalArgumentException()
96
- }
97
- }
98
- } else {
99
- when (result) {
100
- is GeotagResult.SuccessWithDeviation -> {
101
- serializeLocationWithDeviationSuccess(result.deviceLocation, result.deviationDistance.toDouble())
102
- }
103
-
104
- is GeotagResult.Success -> {
105
- // not supposed to happen
106
- serializeLocationWithDeviationSuccess(result.deviceLocation, 0.0)
107
- }
108
-
109
- is GeotagResult.Error -> {
110
- serializeLocationErrorFailure(getLocationError(result.reason))
35
+ // TODO: return proper error if JSON is wrong
36
+ val geotagMetadata = Json.fromMap(geotag.data)!!
37
+ val expectedLocation = geotag
38
+ .expectedLocation
39
+ ?.let {
40
+ HyperTrack.Location(
41
+ latitude = it.latitude,
42
+ longitude = it.longitude
43
+ )
44
+ }
45
+ if (expectedLocation != null) {
46
+ HyperTrack
47
+ .addGeotag(geotagMetadata, expectedLocation)
48
+ .let {
49
+ when (it) {
50
+ is Result.Failure -> {
51
+ serializeLocationErrorFailure(it.failure)
111
52
  }
112
53
 
113
- else -> {
114
- throw IllegalArgumentException()
54
+ is Result.Success -> {
55
+ serializeLocationWithDeviationSuccess(it.success)
115
56
  }
116
57
  }
117
58
  }
118
- }
119
- .let {
120
- Success(it)
121
- }
59
+ } else {
60
+ HyperTrack
61
+ .addGeotag(geotagMetadata)
62
+ .let { serializeLocationResult(it) }
63
+ }.let {
64
+ Success(it)
65
+ }
122
66
  }
123
67
  }
124
68
 
125
- fun isTracking(): Result<Map<String, Any?>> {
126
- return Success(serializeIsTracking(sdkInstance.isTracking))
127
- }
128
-
129
- fun isAvailable(): Result<Map<String, Any?>> {
130
- return Success(
131
- serializeIsAvailable(sdkInstance.availability.equals(Availability.AVAILABLE))
132
- )
69
+ fun getDeviceId(): WrapperResult<Serialized> {
70
+ return Success(serializeDeviceId(HyperTrack.deviceID))
133
71
  }
134
72
 
135
- fun setAvailability(args: Map<String, Any?>): Result<Unit> {
136
- return deserializeAvailability(args)
137
- .mapSuccess { isAvailable ->
138
- if (isAvailable) {
139
- sdkInstance.availability = Availability.AVAILABLE
140
- } else {
141
- sdkInstance.availability = Availability.UNAVAILABLE
142
- }
143
- }
73
+ fun getErrors(): WrapperResult<List<Serialized>> {
74
+ return Success(serializeErrors(HyperTrack.errors))
144
75
  }
145
76
 
146
- fun setName(args: Map<String, Any?>): Result<Unit> {
147
- return deserializeDeviceName(args)
148
- .mapSuccess { name ->
149
- sdkInstance.setDeviceName(name)
150
- }
77
+ fun getIsAvailable(): WrapperResult<Serialized> {
78
+ return Success(
79
+ serializeIsAvailable(HyperTrack.isAvailable)
80
+ )
151
81
  }
152
82
 
153
- fun setMetadata(metadata: Map<String, Any?>): Result<Unit> {
154
- return Result.tryAsResult {
155
- sdkInstance.setDeviceMetadata(metadata)
156
- Unit
157
- }
83
+ fun getIsTracking(): WrapperResult<Serialized> {
84
+ return Success(
85
+ serializeIsTracking(HyperTrack.isTracking)
86
+ )
158
87
  }
159
88
 
160
- fun getLocation(): Result<Map<String, Any?>> {
161
- return sdkInstance.latestLocation
162
- .let { result ->
163
- if (result.isSuccess) {
164
- serializeLocationSuccess(result.value)
165
- } else {
166
- serializeLocationErrorFailure(getLocationError(result.error))
89
+ fun getLocation(): WrapperResult<Serialized> {
90
+ return HyperTrack
91
+ .location
92
+ .let {
93
+ when (it) {
94
+ is Result.Failure -> serializeLocationErrorFailure(it.failure)
95
+ is Result.Success -> serializeLocationSuccess(it.success)
167
96
  }
168
97
  }
169
98
  .let { Success(it) }
170
99
  }
171
100
 
172
- fun getInitialErrors(): List<Map<String, String>> {
173
- return serializeErrors(getHyperTrackErrorsFromBlockers())
101
+ fun getMetadata(): WrapperResult<Serialized> {
102
+ return Success(
103
+ serializeMetadata(HyperTrack.metadata.toMap())
104
+ )
174
105
  }
175
106
 
176
- fun getErrors(error: TrackingError): List<Map<String, String>> {
177
- return serializeErrors(getTrackingErrors((error)))
107
+ fun getName(): WrapperResult<Serialized> {
108
+ return Success(
109
+ serializeName(HyperTrack.name)
110
+ )
178
111
  }
179
112
 
180
- private fun getTrackingErrors(error: TrackingError): Set<HyperTrackError> {
181
- return when (error.code) {
182
- TrackingError.INVALID_PUBLISHABLE_KEY_ERROR -> {
183
- HyperTrackError.invalidPublishableKey
184
- }
185
- TrackingError.PERMISSION_DENIED_ERROR -> {
186
- null
187
- }
188
- TrackingError.AUTHORIZATION_ERROR -> {
189
- HyperTrackError.blockedFromRunning
190
- }
191
- TrackingError.GPS_PROVIDER_DISABLED_ERROR -> {
192
- HyperTrackError.locationServicesDisabled
193
- }
194
- TrackingError.UNKNOWN_NETWORK_ERROR -> {
195
- HyperTrackError.blockedFromRunning
196
- }
197
- else -> {
198
- throw RuntimeException("Unknown tracking error")
199
- }
200
- }
201
- .let { hyperTrackError ->
202
- (hyperTrackError?.let { setOf(it) } ?: setOf()) + getHyperTrackErrorsFromBlockers()
113
+ fun setIsAvailable(args: Serialized): WrapperResult<Unit> {
114
+ return deserializeIsAvailable(args)
115
+ .mapSuccess { isAvailable ->
116
+ HyperTrack.isAvailable = isAvailable
203
117
  }
204
118
  }
205
119
 
206
- private fun getLocationError(error: OutageReason): LocationError {
207
- val blockersErrors = getHyperTrackErrorsFromBlockers()
208
- return when (error) {
209
- OutageReason.NO_GPS_SIGNAL -> {
210
- Errors(setOf(HyperTrackError.gpsSignalLost) + blockersErrors)
211
- }
212
- OutageReason.MISSING_LOCATION_PERMISSION -> {
213
- Errors(setOf(HyperTrackError.locationPermissionsDenied) + blockersErrors)
120
+ fun setIsTracking(args: Serialized): WrapperResult<Unit> {
121
+ return deserializeIsTracking(args)
122
+ .mapSuccess { isTracking ->
123
+ HyperTrack.isTracking = isTracking
214
124
  }
215
- OutageReason.LOCATION_SERVICE_DISABLED -> {
216
- Errors(setOf(HyperTrackError.locationServicesDisabled) + blockersErrors)
217
- }
218
- OutageReason.MISSING_ACTIVITY_PERMISSION -> {
219
- Errors(setOf(HyperTrackError.motionActivityPermissionsDenied) + blockersErrors)
220
- }
221
- OutageReason.NOT_TRACKING -> {
222
- NotRunning
223
- }
224
- OutageReason.START_HAS_NOT_FINISHED -> {
225
- Starting
226
- }
227
- OutageReason.RESTART_REQUIRED -> {
228
- throw IllegalStateException("RESTART_REQUIRED must not be returned")
229
- }
230
- }
231
125
  }
232
126
 
233
- private fun getLocationError(error: GeotagResult.Error.Reason): LocationError {
234
- val blockersErrors = getHyperTrackErrorsFromBlockers()
235
- return when (error) {
236
- GeotagResult.Error.Reason.NO_GPS_SIGNAL -> {
237
- Errors(setOf(HyperTrackError.gpsSignalLost) + blockersErrors)
238
- }
239
- GeotagResult.Error.Reason.MISSING_LOCATION_PERMISSION -> {
240
- Errors(setOf(HyperTrackError.locationPermissionsDenied) + blockersErrors)
241
- }
242
- GeotagResult.Error.Reason.LOCATION_SERVICE_DISABLED -> {
243
- Errors(setOf(HyperTrackError.locationServicesDisabled) + blockersErrors)
244
- }
245
- GeotagResult.Error.Reason.MISSING_ACTIVITY_PERMISSION -> {
246
- Errors(setOf(HyperTrackError.motionActivityPermissionsDenied) + blockersErrors)
247
- }
248
- GeotagResult.Error.Reason.NOT_TRACKING -> {
249
- NotRunning
250
- }
251
- GeotagResult.Error.Reason.START_HAS_NOT_FINISHED -> {
252
- Starting
127
+ fun setMetadata(args: Serialized): WrapperResult<Unit> {
128
+ return deserializeMetadata(args)
129
+ .flatMapSuccess { metadata ->
130
+ WrapperResult.tryAsResult {
131
+ // TODO: return proper error if JSON is wrong
132
+ HyperTrack.metadata = Json.fromMap(metadata)!!
133
+ }
253
134
  }
254
- }
255
135
  }
256
136
 
257
- private fun getHyperTrackErrorsFromBlockers(): Set<HyperTrackError> {
258
- return HyperTrack.getBlockers()
259
- .map {
260
- when (it) {
261
- Blocker.LOCATION_PERMISSION_DENIED -> {
262
- HyperTrackError.locationPermissionsDenied
263
- }
264
- Blocker.LOCATION_SERVICE_DISABLED -> {
265
- HyperTrackError.locationServicesDisabled
266
- }
267
- Blocker.ACTIVITY_PERMISSION_DENIED -> {
268
- HyperTrackError.motionActivityPermissionsDenied
269
- }
270
- Blocker.BACKGROUND_LOCATION_DENIED -> {
271
- HyperTrackError.locationPermissionsInsufficientForBackground
272
- }
273
- }
137
+ fun setName(args: Serialized): WrapperResult<Unit> {
138
+ return deserializeName(args)
139
+ .mapSuccess { name ->
140
+ HyperTrack.name = name
274
141
  }
275
- .toSet()
276
142
  }
143
+
277
144
  }
@@ -2,20 +2,22 @@ package com.reactnativehypertracksdk.common
2
2
 
3
3
  /**
4
4
  * The list of available methods in the SDK API.
5
+ * It is used to match method calls in some wrappers (like Flutter)
5
6
  * Enum naming convention is ignored to make datatype sync across platforms easier.
6
7
  * Using Swift naming convention.
7
8
  */
8
9
  internal enum class SdkMethod {
9
- initialize,
10
+ addGeotag,
10
11
  getDeviceID,
12
+ getErrors,
13
+ getIsAvailable,
14
+ getIsTracking,
11
15
  getLocation,
12
- startTracking,
13
- stopTracking,
14
- setAvailability,
15
- setName,
16
+ getMetadata,
17
+ getName,
18
+ locate,
19
+ setIsAvailable,
20
+ setIsTracking,
16
21
  setMetadata,
17
- isTracking,
18
- isAvailable,
19
- addGeotag,
20
- sync
22
+ setName,
21
23
  }