Skip to content

Commit 37822a4

Browse files
Add automaticallyRequestPermissions to SdkInitParams
Port changes of the native code from Flutter. Fix LICENSE. Add docs command to justfile.
1 parent 52c5a6a commit 37822a4

File tree

19 files changed

+196
-170
lines changed

19 files changed

+196
-170
lines changed

.justfile

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
alias b := build
2+
3+
alias d := docs
4+
alias od := open-docs
5+
6+
build:
7+
yarn prepare
8+
9+
docs:
10+
yarn docs
11+
12+
open-docs: docs
13+
open docs/index.html
File renamed without changes.

android/src/main/java/com/reactnativehypertracksdk/HyperTrackReactNativePlugin.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ class HyperTrackReactNativePlugin(reactContext: ReactApplicationContext?) :
7070
promise: Promise
7171
) {
7272
HyperTrackSdkWrapper
73-
.initialize(initParams.toHashMap())
73+
.initializeSdk(initParams.toHashMap())
7474
.mapSuccess { sdk ->
7575
initListeners(sdk)
7676
}
@@ -122,7 +122,7 @@ class HyperTrackReactNativePlugin(reactContext: ReactApplicationContext?) :
122122

123123
@ReactMethod
124124
fun getDeviceId(promise: Promise) {
125-
HyperTrackSdkWrapper.getDeviceID().toPromise(promise)
125+
HyperTrackSdkWrapper.getDeviceId().toPromise(promise)
126126
}
127127

128128
@ReactMethod

android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackError.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package com.reactnativehypertracksdk.common
22

33
/**
4-
* Check HyperTrack SDK docs for HyperTrackError
5-
* Enum naming convention is ignored to make datatype sync across platforms easier
4+
* Check HyperTrack SDK docs for HyperTrackError.
5+
* Enum naming convention is ignored to make datatype sync across platforms easier.
6+
* Using Swift naming convention.
67
*/
78
@Suppress("EnumEntryName")
89
internal enum class HyperTrackError {

android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackSdkWrapper.kt

Lines changed: 63 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,16 @@ package com.reactnativehypertracksdk.common
22

33
import com.hypertrack.sdk.*
44
import com.reactnativehypertracksdk.common.Serialization.deserializeAvailability
5+
import com.reactnativehypertracksdk.common.Serialization.deserializeDeviceName
56
import com.reactnativehypertracksdk.common.Serialization.deserializeGeotagData
6-
import com.reactnativehypertracksdk.common.Serialization.serializeFailure
7+
import com.reactnativehypertracksdk.common.Serialization.serializeDeviceId
78
import com.reactnativehypertracksdk.common.Serialization.serializeErrors
9+
import com.reactnativehypertracksdk.common.Serialization.serializeFailure
810
import com.reactnativehypertracksdk.common.Serialization.serializeIsAvailable
911
import com.reactnativehypertracksdk.common.Serialization.serializeIsTracking
1012
import com.reactnativehypertracksdk.common.Serialization.serializeSuccess
11-
import com.reactnativehypertracksdk.common.Serialization.serializeDeviceId
12-
import com.reactnativehypertracksdk.common.Serialization.deserializeDeviceName
13-
import com.reactnativehypertracksdk.common.Serialization.parse
1413
import java.lang.IllegalStateException
1514
import java.lang.RuntimeException
16-
import android.util.Log
17-
1815

1916
/**
2017
* This class stores SDK instance, calls HyperTrack SDK methods and serializes responses.
@@ -28,29 +25,32 @@ internal object HyperTrackSdkWrapper {
2825
val sdkInstance: HyperTrack
2926
get() = _sdkInstance
3027

31-
fun initialize(
28+
// method is named to align with 'initializeSDK' in iOS
29+
fun initializeSdk(
3230
args: Map<String, Any?>
3331
): Result<HyperTrack> {
3432
return try {
35-
SdkInitParams.fromMap(args).flatMapSuccess { initParams ->
36-
_sdkInstance = HyperTrack.getInstance(initParams.publishableKey)
37-
if (initParams.loggingEnabled) {
38-
HyperTrack.enableDebugLogging()
39-
}
40-
if (initParams.allowMockLocations) {
41-
sdkInstance.allowMockLocations()
33+
SdkInitParams
34+
.fromMap(args)
35+
.flatMapSuccess { initParams ->
36+
_sdkInstance = HyperTrack.getInstance(initParams.publishableKey)
37+
if (initParams.loggingEnabled) {
38+
HyperTrack.enableDebugLogging()
39+
}
40+
if (initParams.allowMockLocations) {
41+
sdkInstance.allowMockLocations()
42+
}
43+
this.sdkInstance.backgroundTrackingRequirement(
44+
initParams.requireBackgroundTrackingPermission
45+
)
46+
Success(sdkInstance)
4247
}
43-
this.sdkInstance.backgroundTrackingRequirement(
44-
initParams.requireBackgroundTrackingPermission
45-
)
46-
Success(sdkInstance)
47-
}
4848
} catch (exception: Exception) {
4949
Failure(Exception("Hypertrack SDK initialization failed.", exception))
5050
}
5151
}
5252

53-
fun getDeviceID(): Result<Map<String, Any?>> {
53+
fun getDeviceId(): Result<Map<String, Any?>> {
5454
return Success(serializeDeviceId(sdkInstance.deviceID))
5555
}
5656

@@ -70,26 +70,30 @@ internal object HyperTrackSdkWrapper {
7070
}
7171

7272
fun addGeotag(args: Map<String, Any?>): Result<Map<String, Any?>> {
73-
return deserializeGeotagData(args).flatMapSuccess { geotag ->
74-
sdkInstance.addGeotag(geotag.data).let { result ->
75-
when (result) {
76-
is GeotagResult.SuccessWithDeviation -> {
77-
serializeSuccess(result.deviceLocation)
73+
return deserializeGeotagData(args)
74+
.flatMapSuccess { geotag ->
75+
sdkInstance
76+
.addGeotag(geotag.data)
77+
.let { result ->
78+
when (result) {
79+
is GeotagResult.SuccessWithDeviation -> {
80+
serializeSuccess(result.deviceLocation)
81+
}
82+
is GeotagResult.Success -> {
83+
serializeSuccess(result.deviceLocation)
84+
}
85+
is GeotagResult.Error -> {
86+
serializeFailure(getLocationError(result.reason))
87+
}
88+
else -> {
89+
throw IllegalArgumentException()
90+
}
91+
}
7892
}
79-
is GeotagResult.Success -> {
80-
serializeSuccess(result.deviceLocation)
93+
.let {
94+
Success(it)
8195
}
82-
is GeotagResult.Error -> {
83-
serializeFailure(getLocationError(result.reason))
84-
}
85-
else -> {
86-
throw IllegalArgumentException()
87-
}
88-
}
89-
}.let {
90-
Success(it)
9196
}
92-
}
9397
}
9498

9599
fun isTracking(): Result<Map<String, Any?>> {
@@ -103,19 +107,21 @@ internal object HyperTrackSdkWrapper {
103107
}
104108

105109
fun setAvailability(args: Map<String, Any?>): Result<Unit> {
106-
return deserializeAvailability(args).mapSuccess { isAvailable ->
107-
if (isAvailable) {
108-
sdkInstance.availability = Availability.AVAILABLE
109-
} else {
110-
sdkInstance.availability = Availability.UNAVAILABLE
110+
return deserializeAvailability(args)
111+
.mapSuccess { isAvailable ->
112+
if (isAvailable) {
113+
sdkInstance.availability = Availability.AVAILABLE
114+
} else {
115+
sdkInstance.availability = Availability.UNAVAILABLE
116+
}
111117
}
112-
}
113118
}
114119

115120
fun setName(args: Map<String, Any?>): Result<Unit> {
116-
return deserializeDeviceName(args).mapSuccess { name ->
117-
sdkInstance.setDeviceName(name)
118-
}
121+
return deserializeDeviceName(args)
122+
.mapSuccess { name ->
123+
sdkInstance.setDeviceName(name)
124+
}
119125
}
120126

121127
fun setMetadata(metadata: Map<String, Any?>): Result<Unit> {
@@ -126,13 +132,15 @@ internal object HyperTrackSdkWrapper {
126132
}
127133

128134
fun getLocation(): Result<Map<String, Any?>> {
129-
return sdkInstance.latestLocation.let { result ->
130-
if (result.isSuccess) {
131-
serializeSuccess(result.value)
132-
} else {
133-
serializeFailure(getLocationError(result.error))
135+
return sdkInstance.latestLocation
136+
.let { result ->
137+
if (result.isSuccess) {
138+
serializeSuccess(result.value)
139+
} else {
140+
serializeFailure(getLocationError(result.error))
141+
}
134142
}
135-
}.let { Success(it) }
143+
.let { Success(it) }
136144
}
137145

138146
fun getInitialErrors(): List<Map<String, String>> {
@@ -163,9 +171,10 @@ internal object HyperTrackSdkWrapper {
163171
else -> {
164172
throw RuntimeException("Unknown tracking error")
165173
}
166-
}.let { hyperTrackError ->
167-
(hyperTrackError?.let { setOf(it) } ?: setOf()) + getHyperTrackErrorsFromBlockers()
168174
}
175+
.let { hyperTrackError ->
176+
(hyperTrackError?.let { setOf(it) } ?: setOf()) + getHyperTrackErrorsFromBlockers()
177+
}
169178
}
170179

171180
private fun getLocationError(error: OutageReason): LocationError {
@@ -239,5 +248,4 @@ internal object HyperTrackSdkWrapper {
239248
}
240249
.toSet()
241250
}
242-
243251
}
Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,31 @@
11
package com.reactnativehypertracksdk.common
22

3-
internal sealed class Result<S> {
4-
fun <T> flatMapSuccess(onSuccess: (S) -> Result<T>): Result<T> {
3+
internal sealed class Result<SuccessType> {
4+
fun <MappedSuccess> flatMapSuccess(
5+
onSuccess: (SuccessType) -> Result<MappedSuccess>
6+
): Result<MappedSuccess> {
57
return when (this) {
68
is Success -> {
79
onSuccess.invoke(this.success)
810
}
911
is Failure -> {
10-
Failure<T>(this.failure)
12+
Failure<MappedSuccess>(this.failure)
1113
}
1214
}
1315
}
1416

15-
fun <T> mapSuccess(onSuccess: (S) -> T): Result<T> {
17+
fun <MappedSuccess> mapSuccess(onSuccess: (SuccessType) -> MappedSuccess): Result<MappedSuccess> {
1618
return when (this) {
1719
is Success -> {
1820
Success(onSuccess.invoke(this.success))
1921
}
2022
is Failure -> {
21-
Failure<T>(this.failure)
23+
Failure<MappedSuccess>(this.failure)
2224
}
2325
}
2426
}
2527

26-
fun getOrThrow(): S {
28+
fun getOrThrow(): SuccessType {
2729
return when (this) {
2830
is Success -> this.success
2931
is Failure -> throw Exception(
@@ -34,7 +36,7 @@ internal sealed class Result<S> {
3436
}
3537

3638
companion object {
37-
fun <T> tryAsResult(block: () -> T): Result<T> {
39+
fun <SuccessType> tryAsResult(block: () -> SuccessType): Result<SuccessType> {
3840
return try {
3941
Success(block.invoke())
4042
} catch (e: Exception) {
@@ -44,5 +46,5 @@ internal sealed class Result<S> {
4446
}
4547
}
4648

47-
internal data class Success<S>(val success: S) : Result<S>()
48-
internal data class Failure<S>(val failure: Throwable) : Result<S>()
49+
internal data class Success<SuccessType>(val success: SuccessType) : Result<SuccessType>()
50+
internal data class Failure<SuccessType>(val failure: Throwable) : Result<SuccessType>()
Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.reactnativehypertracksdk.common
22

33
import com.reactnativehypertracksdk.common.Serialization.parse
4-
import android.util.Log
54

65
/**
76
* SDK config params
@@ -10,24 +9,26 @@ internal data class SdkInitParams(
109
val publishableKey: String,
1110
val requireBackgroundTrackingPermission: Boolean,
1211
val loggingEnabled: Boolean,
13-
val allowMockLocations: Boolean,
12+
val allowMockLocations: Boolean
1413
) {
1514

1615
companion object {
1716
fun fromMap(map: Map<String, Any?>): Result<SdkInitParams> {
18-
Log.v(javaClass.simpleName, "fromMap 1")
1917
return parse(map) {
20-
Log.v(javaClass.simpleName, "parse 1")
2118
SdkInitParams(
22-
publishableKey = it.get<String>(KEY_PUBLISHABLE_KEY).getOrThrow(),
23-
requireBackgroundTrackingPermission = it.get<Boolean>(
24-
KEY_REQUIRE_BACKGROUND_TRACKING_PERMISSION
25-
).getOrThrow(),
26-
loggingEnabled = it.get<Boolean>(KEY_LOGGING_ENABLED).getOrThrow(),
27-
allowMockLocations = it.get<Boolean>(KEY_ALLOW_MOCK_LOCATIONS).getOrThrow()
19+
publishableKey = it
20+
.get<String>(KEY_PUBLISHABLE_KEY)
21+
.getOrThrow(),
22+
requireBackgroundTrackingPermission = it
23+
.get<Boolean>(KEY_REQUIRE_BACKGROUND_TRACKING_PERMISSION)
24+
.getOrThrow(),
25+
loggingEnabled = it
26+
.get<Boolean>(KEY_LOGGING_ENABLED)
27+
.getOrThrow(),
28+
allowMockLocations = it
29+
.get<Boolean>(KEY_ALLOW_MOCK_LOCATIONS)
30+
.getOrThrow()
2831
)
29-
}.also {
30-
Log.v(javaClass.simpleName, "fromMap $it")
3132
}
3233
}
3334

@@ -40,7 +41,4 @@ internal data class SdkInitParams(
4041
private const val KEY_ALLOW_MOCK_LOCATIONS =
4142
"allowMockLocations"
4243
}
43-
4444
}
45-
46-

android/src/main/java/com/reactnativehypertracksdk/common/SdkMethod.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ package com.reactnativehypertracksdk.common
22

33
/**
44
* The list of available methods in the SDK API.
5-
* Enum naming convention is ignored to make datatype sync across platforms easier
5+
* Enum naming convention is ignored to make datatype sync across platforms easier.
6+
* Using Swift naming convention.
67
*/
78
internal enum class SdkMethod {
89
initialize,
9-
getDeviceId,
10+
getDeviceID,
1011
getLocation,
1112
startTracking,
1213
stopTracking,

0 commit comments

Comments
 (0)