hypertrack-sdk-react-native 8.2.2 → 9.1.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.
- package/CHANGELOG.md +29 -1
- package/CONTRIBUTING.md +30 -110
- package/LICENSE +2 -0
- package/README.md +20 -40
- package/android/build.gradle +112 -113
- package/android/gradle.properties +1 -1
- package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackReactNativePlugin.kt +209 -0
- package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackSdkPackage.kt +2 -4
- package/android/src/main/java/com/reactnativehypertracksdk/ReactNativeSerialization.kt +88 -0
- package/android/src/main/java/com/reactnativehypertracksdk/common/Geotag.kt +9 -0
- package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackError.kt +28 -0
- package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackSdkWrapper.kt +251 -0
- package/android/src/main/java/com/reactnativehypertracksdk/common/LocationError.kt +9 -0
- package/android/src/main/java/com/reactnativehypertracksdk/common/Result.kt +50 -0
- package/android/src/main/java/com/reactnativehypertracksdk/common/SdkInitParams.kt +44 -0
- package/android/src/main/java/com/reactnativehypertracksdk/common/SdkMethod.kt +21 -0
- package/android/src/main/java/com/reactnativehypertracksdk/common/Serialization.kt +203 -0
- package/hypertrack-sdk-react-native.podspec +1 -1
- package/ios/HyperTrackReactNativePlugin.m +54 -0
- package/ios/HyperTrackReactNativePlugin.swift +253 -0
- package/ios/HyperTrackSdk-Bridging-Header.h +2 -0
- package/ios/HyperTrackSdk.xcodeproj/project.pbxproj +8 -11
- package/ios/common/DictionaryDecoder.swift +28 -0
- package/ios/common/HyperTrackError.swift +20 -0
- package/ios/common/HyperTrackSDKWrapper.swift +120 -0
- package/ios/common/SDKInitParams.swift +13 -0
- package/ios/common/SDKMethod.swift +14 -0
- package/ios/common/Serialization.swift +268 -0
- package/lib/commonjs/HyperTrack/HyperTrack.js +142 -142
- package/lib/commonjs/HyperTrack/HyperTrack.js.map +1 -1
- package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js +31 -0
- package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/Location.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/Location.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/LocationError.js +6 -0
- package/lib/commonjs/HyperTrack/data_types/LocationError.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/internal/DeviceId.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/internal/DeviceId.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/internal/Geotag.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/internal/Geotag.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/internal/HyperTrackErrorInternal.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/internal/IsAvailable.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/internal/IsAvailable.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/internal/IsTracking.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/internal/IsTracking.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/internal/LocationErrorInternal.js +6 -0
- package/lib/commonjs/HyperTrack/data_types/internal/LocationErrorInternal.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/internal/LocationResponse.js +6 -0
- package/lib/commonjs/HyperTrack/data_types/internal/LocationResponse.js.map +1 -0
- package/lib/commonjs/index.js +28 -17
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/HyperTrack/HyperTrack.js +141 -134
- package/lib/module/HyperTrack/HyperTrack.js.map +1 -1
- package/lib/module/HyperTrack/data_types/HyperTrackError.js +24 -0
- package/lib/module/HyperTrack/data_types/HyperTrackError.js.map +1 -0
- package/lib/module/HyperTrack/data_types/Location.js +2 -0
- package/lib/module/HyperTrack/data_types/Location.js.map +1 -0
- package/lib/module/HyperTrack/data_types/LocationError.js +2 -0
- package/lib/module/HyperTrack/data_types/LocationError.js.map +1 -0
- package/lib/module/HyperTrack/data_types/SdkInitParams.js +2 -0
- package/lib/module/HyperTrack/data_types/SdkInitParams.js.map +1 -0
- package/lib/module/HyperTrack/data_types/internal/DeviceId.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/DeviceId.js.map +1 -0
- package/lib/module/HyperTrack/data_types/internal/DeviceName.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/DeviceName.js.map +1 -0
- package/lib/module/HyperTrack/data_types/internal/Geotag.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/Geotag.js.map +1 -0
- package/lib/module/HyperTrack/data_types/internal/HyperTrackErrorInternal.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -0
- package/lib/module/HyperTrack/data_types/internal/IsAvailable.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/IsAvailable.js.map +1 -0
- package/lib/module/HyperTrack/data_types/internal/IsTracking.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/IsTracking.js.map +1 -0
- package/lib/module/HyperTrack/data_types/internal/LocationErrorInternal.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/LocationErrorInternal.js.map +1 -0
- package/lib/module/HyperTrack/data_types/internal/LocationResponse.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/LocationResponse.js.map +1 -0
- package/lib/module/index.js +4 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/HyperTrack/HyperTrack.d.ts +66 -100
- package/lib/typescript/HyperTrack/data_types/HyperTrackError.d.ts +20 -0
- package/lib/typescript/HyperTrack/data_types/Location.d.ts +7 -0
- package/lib/typescript/HyperTrack/data_types/LocationError.d.ts +8 -0
- package/lib/typescript/HyperTrack/data_types/SdkInitParams.d.ts +25 -0
- package/lib/typescript/HyperTrack/data_types/internal/DeviceId.d.ts +4 -0
- package/lib/typescript/HyperTrack/data_types/internal/DeviceName.d.ts +4 -0
- package/lib/typescript/HyperTrack/data_types/internal/Geotag.d.ts +3 -0
- package/lib/typescript/HyperTrack/data_types/internal/HyperTrackErrorInternal.d.ts +4 -0
- package/lib/typescript/HyperTrack/data_types/internal/IsAvailable.d.ts +4 -0
- package/lib/typescript/HyperTrack/data_types/internal/IsTracking.d.ts +4 -0
- package/lib/typescript/HyperTrack/data_types/internal/LocationErrorInternal.d.ts +12 -0
- package/lib/typescript/HyperTrack/data_types/internal/LocationResponse.d.ts +11 -0
- package/lib/typescript/index.d.ts +4 -1
- package/package.json +156 -156
- package/src/HyperTrack/HyperTrack.ts +164 -163
- package/src/HyperTrack/data_types/HyperTrackError.ts +22 -0
- package/src/HyperTrack/data_types/Location.ts +7 -0
- package/src/HyperTrack/data_types/LocationError.ts +11 -0
- package/src/HyperTrack/data_types/SdkInitParams.ts +28 -0
- package/src/HyperTrack/data_types/internal/DeviceId.ts +4 -0
- package/src/HyperTrack/data_types/internal/DeviceName.ts +4 -0
- package/src/HyperTrack/data_types/internal/Geotag.ts +3 -0
- package/src/HyperTrack/data_types/internal/HyperTrackErrorInternal.ts +4 -0
- package/src/HyperTrack/data_types/internal/IsAvailable.ts +4 -0
- package/src/HyperTrack/data_types/internal/IsTracking.ts +4 -0
- package/src/HyperTrack/data_types/internal/LocationErrorInternal.ts +14 -0
- package/src/HyperTrack/data_types/internal/LocationResponse.ts +14 -0
- package/src/index.tsx +4 -7
- package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackModule.kt +0 -284
- package/ios/HyperTrack.h +0 -7
- package/ios/HyperTrack.m +0 -384
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import HyperTrack
|
|
2
|
+
|
|
3
|
+
enum SuccessResult {
|
|
4
|
+
case void
|
|
5
|
+
case dict(Dictionary<String, Any>)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
enum FailureResult: Error {
|
|
9
|
+
case fatalError(_ message: String)
|
|
10
|
+
case error(_ message: String)
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
var sdkInstance: HyperTrack! // initialize method is guaranteed to be called (by non-native side) prior to any access to the SDK instance
|
|
14
|
+
|
|
15
|
+
// method is named 'initializeSDK' to avoid conflict with React Native plugin 'initialize' method
|
|
16
|
+
func initializeSDK(
|
|
17
|
+
_ params: Dictionary<String, Any>
|
|
18
|
+
) -> Result<SuccessResult, FailureResult> {
|
|
19
|
+
if let sdkInitParams = SDKInitParams(params) {
|
|
20
|
+
let publishableKey = HyperTrack.PublishableKey(params["publishableKey"] as! String)
|
|
21
|
+
if let publishableKey = publishableKey {
|
|
22
|
+
switch HyperTrack.makeSDK(
|
|
23
|
+
publishableKey: publishableKey,
|
|
24
|
+
automaticallyRequestPermissions: sdkInitParams.automaticallyRequestPermissions,
|
|
25
|
+
mockLocationsAllowed: sdkInitParams.allowMockLocations
|
|
26
|
+
) {
|
|
27
|
+
case let .success(hyperTrack):
|
|
28
|
+
sdkInstance = hyperTrack
|
|
29
|
+
HyperTrack.isLoggingEnabled = sdkInitParams.loggingEnabled
|
|
30
|
+
return .success(.void)
|
|
31
|
+
case let .failure(fatalError):
|
|
32
|
+
return .failure(mapFatalError(fatalError: fatalError))
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
return .failure(.fatalError("Invalid publishable key"))
|
|
36
|
+
}
|
|
37
|
+
} else {
|
|
38
|
+
return .failure(.error("Invalid SDK init parameters \(params)"))
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
func getDeviceID() -> Result<SuccessResult, FailureResult> {
|
|
43
|
+
.success(.dict(serializeDeviceID(sdkInstance.deviceID)))
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
func getLocation() -> Result<SuccessResult, FailureResult> {
|
|
47
|
+
.success(.dict(serializeLocationResult(sdkInstance.location)))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
func startTracking() -> Result<SuccessResult, FailureResult> {
|
|
51
|
+
.success(asVoid(sdkInstance.start()))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
func stopTracking() -> Result<SuccessResult, FailureResult> {
|
|
55
|
+
.success(asVoid(sdkInstance.stop()))
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
func setAvailability(
|
|
59
|
+
_ availability: Dictionary<String, Any>
|
|
60
|
+
) -> Result<SuccessResult, FailureResult> {
|
|
61
|
+
deserializeAvailability(availability).flatMap { (isAvailable:Bool) in
|
|
62
|
+
if(isAvailable) {
|
|
63
|
+
sdkInstance.availability = .available
|
|
64
|
+
} else {
|
|
65
|
+
sdkInstance.availability = .unavailable
|
|
66
|
+
}
|
|
67
|
+
return .success(.void)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
func setName(_ args: Dictionary<String, Any>) -> Result<SuccessResult, FailureResult> {
|
|
72
|
+
deserializeDeviceName(args).flatMap({ (name: String) in
|
|
73
|
+
.success(asVoid(sdkInstance.setDeviceName(name)))
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
func setMetadata(_ map: Dictionary<String, Any>) -> Result<SuccessResult, FailureResult> {
|
|
78
|
+
sdkInstance.metadata = getJSON(map)
|
|
79
|
+
return .success(.void)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
func isTracking() -> Result<SuccessResult, FailureResult> {
|
|
83
|
+
.success(.dict(serializeIsTracking(sdkInstance.isTracking)))
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
func isAvailable() -> Result<SuccessResult, FailureResult> {
|
|
87
|
+
.success(.dict(serializeIsAvailable(sdkInstance.availability)))
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
func addGeotag(_ args: Dictionary<String, Any>) -> Result<SuccessResult, FailureResult> {
|
|
91
|
+
return deserializeGeotagData(args).flatMap { data in
|
|
92
|
+
let metadata: HyperTrack.JSON.Object = getJSON(data)
|
|
93
|
+
let result = sdkInstance.addGeotag(metadata)
|
|
94
|
+
return .success(.dict(serializeLocationResult(result)))
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
func sync() -> Result<SuccessResult, FailureResult> {
|
|
99
|
+
.success(asVoid(sdkInstance.syncDeviceSettings()))
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
func asVoid(_ void: Void) -> SuccessResult {
|
|
103
|
+
.void
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private func mapFatalError(fatalError: HyperTrack.FatalError) -> FailureResult {
|
|
107
|
+
switch fatalError {
|
|
108
|
+
case .developmentError(.missingLocationUpdatesBackgroundModeCapability):
|
|
109
|
+
return .fatalError("missingLocationUpdatesBackgroundModeCapability")
|
|
110
|
+
case .developmentError(.runningOnSimulatorUnsupported):
|
|
111
|
+
return .fatalError("runningOnSimulatorUnsupported")
|
|
112
|
+
// typo is in the HyperTrack SDK itself, no need to fix (it will be deleted in the next major update)
|
|
113
|
+
case .productionError(.locationServicesUnavalible):
|
|
114
|
+
return .error("locationServicesUnavalible")
|
|
115
|
+
case .productionError(.motionActivityServicesUnavalible):
|
|
116
|
+
return .error("motionActivityServicesUnavalible")
|
|
117
|
+
case .productionError(.motionActivityPermissionsDenied):
|
|
118
|
+
return .fatalError("motionActivityPermissionsDenied")
|
|
119
|
+
}
|
|
120
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
public struct SDKInitParams {
|
|
2
|
+
let publishableKey: String
|
|
3
|
+
let loggingEnabled: Bool
|
|
4
|
+
let allowMockLocations: Bool
|
|
5
|
+
let automaticallyRequestPermissions: Bool
|
|
6
|
+
|
|
7
|
+
init?(_ map: Dictionary<String, Any>) {
|
|
8
|
+
self.publishableKey = (map["publishableKey"] as! String)
|
|
9
|
+
self.loggingEnabled = (map["loggingEnabled"] as! Bool)
|
|
10
|
+
self.allowMockLocations = (map["allowMockLocations"] as! Bool)
|
|
11
|
+
self.automaticallyRequestPermissions = (map["automaticallyRequestPermissions"] as! Bool)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
enum SDKMethod: String {
|
|
2
|
+
case initialize = "initialize"
|
|
3
|
+
case getDeviceID = "getDeviceID"
|
|
4
|
+
case getLocation = "getLocation"
|
|
5
|
+
case startTracking = "startTracking"
|
|
6
|
+
case stopTracking = "stopTracking"
|
|
7
|
+
case setAvailability = "setAvailability"
|
|
8
|
+
case setName = "setName"
|
|
9
|
+
case setMetadata = "setMetadata"
|
|
10
|
+
case isTracking = "isTracking"
|
|
11
|
+
case isAvailable = "isAvailable"
|
|
12
|
+
case addGeotag = "addGeotag"
|
|
13
|
+
case sync = "sync"
|
|
14
|
+
}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import HyperTrack
|
|
2
|
+
|
|
3
|
+
private let keyType = "type"
|
|
4
|
+
private let keyValue = "value"
|
|
5
|
+
|
|
6
|
+
private let typeSuccess = "success"
|
|
7
|
+
private let typeFailure = "failure"
|
|
8
|
+
private let typeHyperTrackError = "hyperTrackError"
|
|
9
|
+
private let typeIsTracking = "isTracking"
|
|
10
|
+
private let typeIsAvailable = "isAvailable"
|
|
11
|
+
|
|
12
|
+
let keyGeotagData = "data"
|
|
13
|
+
|
|
14
|
+
func getJSON(_ dictionary: Dictionary<String, Any>) -> HyperTrack.JSON.Object {
|
|
15
|
+
return try! DictionaryDecoder().decode(HyperTrack.JSON.Object.self, from: dictionary)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
func getHyperTrackError(_ error: HyperTrack.UnrestorableError) -> HyperTrackError {
|
|
19
|
+
switch(error) {
|
|
20
|
+
case .invalidPublishableKey:
|
|
21
|
+
return HyperTrackError.invalidPublishableKey
|
|
22
|
+
case .motionActivityPermissionsDenied:
|
|
23
|
+
return HyperTrackError.locationPermissionsDenied
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func getHyperTrackError(_ error: HyperTrack.RestorableError) -> HyperTrackError {
|
|
28
|
+
switch(error) {
|
|
29
|
+
case .locationPermissionsNotDetermined:
|
|
30
|
+
return HyperTrackError.locationPermissionsNotDetermined
|
|
31
|
+
case .motionActivityPermissionsNotDetermined:
|
|
32
|
+
return HyperTrackError.motionActivityPermissionsNotDetermined
|
|
33
|
+
case .locationPermissionsCantBeAskedInBackground:
|
|
34
|
+
return HyperTrackError.locationPermissionsNotDetermined
|
|
35
|
+
case .motionActivityPermissionsCantBeAskedInBackground:
|
|
36
|
+
return HyperTrackError.motionActivityPermissionsNotDetermined
|
|
37
|
+
case .locationPermissionsRestricted:
|
|
38
|
+
return HyperTrackError.locationPermissionsRestricted
|
|
39
|
+
case .motionActivityPermissionsRestricted:
|
|
40
|
+
return HyperTrackError.motionActivityPermissionsRestricted
|
|
41
|
+
case .locationPermissionsDenied:
|
|
42
|
+
return HyperTrackError.locationPermissionsDenied
|
|
43
|
+
case .locationPermissionsInsufficientForBackground:
|
|
44
|
+
return HyperTrackError.locationPermissionsInsufficientForBackground
|
|
45
|
+
case .locationServicesDisabled:
|
|
46
|
+
return HyperTrackError.locationServicesDisabled
|
|
47
|
+
case .motionActivityServicesDisabled:
|
|
48
|
+
return HyperTrackError.motionActivityServicesDisabled
|
|
49
|
+
case .networkConnectionUnavailable:
|
|
50
|
+
return HyperTrackError.networkConnectionUnavailable
|
|
51
|
+
case .trialEnded:
|
|
52
|
+
return HyperTrackError.blockedFromRunning
|
|
53
|
+
case .paymentDefault:
|
|
54
|
+
return HyperTrackError.blockedFromRunning
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
func getHyperTrackError(_ error: HyperTrack.HyperTrackError) -> HyperTrackError {
|
|
59
|
+
switch(error) {
|
|
60
|
+
case .locationPermissionsNotDetermined:
|
|
61
|
+
return .locationPermissionsNotDetermined
|
|
62
|
+
case .locationPermissionsInsufficientForBackground:
|
|
63
|
+
return .locationPermissionsInsufficientForBackground
|
|
64
|
+
case .locationPermissionsRestricted:
|
|
65
|
+
return .locationPermissionsRestricted
|
|
66
|
+
case .locationPermissionsReducedAccuracy:
|
|
67
|
+
return .locationPermissionsReducedAccuracy
|
|
68
|
+
case .locationPermissionsProvisional:
|
|
69
|
+
return .locationPermissionsProvisional
|
|
70
|
+
case .locationPermissionsDenied:
|
|
71
|
+
return .locationPermissionsDenied
|
|
72
|
+
case .locationServicesDisabled:
|
|
73
|
+
return .locationServicesDisabled
|
|
74
|
+
case .motionActivityPermissionsNotDetermined:
|
|
75
|
+
return .motionActivityPermissionsNotDetermined
|
|
76
|
+
case .motionActivityPermissionsDenied:
|
|
77
|
+
return .motionActivityPermissionsDenied
|
|
78
|
+
case .motionActivityServicesDisabled:
|
|
79
|
+
return .motionActivityServicesDisabled
|
|
80
|
+
case .motionActivityServicesUnavailable:
|
|
81
|
+
return .motionActivityServicesUnavailable
|
|
82
|
+
case .gpsSignalLost:
|
|
83
|
+
return .gpsSignalLost
|
|
84
|
+
case .locationMocked:
|
|
85
|
+
return .locationMocked
|
|
86
|
+
case .invalidPublishableKey:
|
|
87
|
+
return .invalidPublishableKey
|
|
88
|
+
case .blockedFromRunning:
|
|
89
|
+
return .blockedFromRunning
|
|
90
|
+
default:
|
|
91
|
+
preconditionFailure("Unknown error \(error)")
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
func serializeErrors(_ errors: Set<HyperTrack.HyperTrackError>) -> Array<Dictionary<String, Any>> {
|
|
96
|
+
return errors.map({ error in
|
|
97
|
+
serializeHyperTrackError(getHyperTrackError(error))
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
func serializeDeviceID(_ deviceID: String) -> Dictionary<String, Any> {
|
|
102
|
+
return [
|
|
103
|
+
keyType: "deviceID",
|
|
104
|
+
keyValue: deviceID
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
func serializeLocationResult(_ result: Result<HyperTrack.Location, HyperTrack.LocationError>) -> Dictionary<String, Any> {
|
|
109
|
+
switch (result) {
|
|
110
|
+
case .success(let success):
|
|
111
|
+
return [
|
|
112
|
+
keyType: typeSuccess,
|
|
113
|
+
keyValue: [
|
|
114
|
+
keyType: "location",
|
|
115
|
+
keyValue: [
|
|
116
|
+
"latitude": success.latitude,
|
|
117
|
+
"longitude": success.longitude
|
|
118
|
+
]
|
|
119
|
+
]
|
|
120
|
+
]
|
|
121
|
+
case .failure(let failure):
|
|
122
|
+
var locationError: Dictionary<String, Any>
|
|
123
|
+
switch(failure) {
|
|
124
|
+
case .locationPermissionsNotDetermined:
|
|
125
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsNotDetermined)
|
|
126
|
+
case .locationPermissionsCantBeAskedInBackground:
|
|
127
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsNotDetermined)
|
|
128
|
+
case .locationPermissionsInsufficientForBackground:
|
|
129
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsInsufficientForBackground)
|
|
130
|
+
case .locationPermissionsRestricted:
|
|
131
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsRestricted)
|
|
132
|
+
case .locationPermissionsReducedAccuracy:
|
|
133
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsReducedAccuracy)
|
|
134
|
+
case .locationPermissionsDenied:
|
|
135
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationPermissionsDenied)
|
|
136
|
+
case .locationServicesDisabled:
|
|
137
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationServicesDisabled)
|
|
138
|
+
case .motionActivityPermissionsNotDetermined:
|
|
139
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityPermissionsNotDetermined)
|
|
140
|
+
case .motionActivityPermissionsCantBeAskedInBackground:
|
|
141
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityPermissionsNotDetermined)
|
|
142
|
+
case .motionActivityPermissionsDenied:
|
|
143
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityPermissionsDenied)
|
|
144
|
+
case .motionActivityServicesDisabled:
|
|
145
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.motionActivityServicesDisabled)
|
|
146
|
+
case .gpsSignalLost:
|
|
147
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.gpsSignalLost)
|
|
148
|
+
case .locationMocked:
|
|
149
|
+
locationError = serializeHyperTrackErrorAsLocationError(HyperTrackError.locationMocked)
|
|
150
|
+
case .starting:
|
|
151
|
+
locationError = [
|
|
152
|
+
keyType: "starting"
|
|
153
|
+
]
|
|
154
|
+
case .notRunning:
|
|
155
|
+
locationError = [
|
|
156
|
+
keyType: "notRunning"
|
|
157
|
+
]
|
|
158
|
+
}
|
|
159
|
+
return [
|
|
160
|
+
keyType: typeFailure,
|
|
161
|
+
keyValue: locationError
|
|
162
|
+
]
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
func serializeLocationResult(_ result: Result<HyperTrack.Location, HyperTrack.NoLocationError>) -> Dictionary<String, Any> {
|
|
167
|
+
switch (result) {
|
|
168
|
+
case .success(let success):
|
|
169
|
+
return [
|
|
170
|
+
keyType: typeSuccess,
|
|
171
|
+
keyValue: [
|
|
172
|
+
keyType: "location",
|
|
173
|
+
keyValue: [
|
|
174
|
+
"latitude": success.latitude,
|
|
175
|
+
"longitude": success.longitude
|
|
176
|
+
]
|
|
177
|
+
]
|
|
178
|
+
]
|
|
179
|
+
case .failure(let failure):
|
|
180
|
+
var locationError: Dictionary<String, Any>
|
|
181
|
+
switch(failure) {
|
|
182
|
+
case .starting:
|
|
183
|
+
locationError = [
|
|
184
|
+
keyType: "starting"
|
|
185
|
+
]
|
|
186
|
+
case .notRunning:
|
|
187
|
+
locationError = [
|
|
188
|
+
keyType: "notRunning"
|
|
189
|
+
]
|
|
190
|
+
case .errors(let errors):
|
|
191
|
+
locationError = [
|
|
192
|
+
keyType: "errors",
|
|
193
|
+
keyValue: serializeErrors(errors)
|
|
194
|
+
]
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return [
|
|
198
|
+
keyType: typeFailure,
|
|
199
|
+
keyValue: locationError
|
|
200
|
+
]
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
func serializeHyperTrackErrorAsLocationError(_ error: HyperTrackError) -> Dictionary<String, Any> {
|
|
205
|
+
return [
|
|
206
|
+
keyType: "errors",
|
|
207
|
+
keyValue: [
|
|
208
|
+
[
|
|
209
|
+
keyType: typeHyperTrackError,
|
|
210
|
+
keyValue: error.rawValue
|
|
211
|
+
]
|
|
212
|
+
]
|
|
213
|
+
]
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
func serializeHyperTrackError(_ error: HyperTrackError) -> Dictionary<String, Any> {
|
|
217
|
+
return [
|
|
218
|
+
keyType: typeHyperTrackError,
|
|
219
|
+
keyValue: error.rawValue
|
|
220
|
+
]
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
func serializeIsTracking(_ isTracking: Bool) -> Dictionary<String, Any> {
|
|
224
|
+
return [
|
|
225
|
+
keyType: typeIsTracking,
|
|
226
|
+
keyValue: isTracking
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
func serializeIsAvailable(_ isAvailable: HyperTrack.Availability) -> Dictionary<String, Any> {
|
|
231
|
+
return [
|
|
232
|
+
keyType: typeIsAvailable,
|
|
233
|
+
keyValue: isAvailable == .available
|
|
234
|
+
]
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
func deserializeDeviceName(_ data: Dictionary<String, Any>) -> Result<String, FailureResult> {
|
|
238
|
+
if (data[keyType] as? String != "deviceName") {
|
|
239
|
+
return .failure(.fatalError(getParseError(data, key: keyType)))
|
|
240
|
+
}
|
|
241
|
+
guard let value = data[keyValue] as? String else {
|
|
242
|
+
return .failure(.fatalError(getParseError(data, key: keyValue)))
|
|
243
|
+
}
|
|
244
|
+
return .success(value)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
func deserializeAvailability(_ data: Dictionary<String, Any>) -> Result<Bool, FailureResult> {
|
|
248
|
+
if (data[keyType] as? String != typeIsAvailable) {
|
|
249
|
+
return .failure(.fatalError(getParseError(data, key: keyType)))
|
|
250
|
+
}
|
|
251
|
+
guard let value = data[keyValue] as? Bool else {
|
|
252
|
+
return .failure(.fatalError(getParseError(data, key: keyValue)))
|
|
253
|
+
}
|
|
254
|
+
return .success(value)
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
func deserializeGeotagData(
|
|
258
|
+
_ geotag: Dictionary<String, Any>
|
|
259
|
+
) -> Result<Dictionary<String, Any>, FailureResult> {
|
|
260
|
+
guard let data = geotag[keyGeotagData] as? Dictionary<String, Any> else {
|
|
261
|
+
return .failure(.fatalError(getParseError(geotag, key: keyGeotagData)))
|
|
262
|
+
}
|
|
263
|
+
return .success(data)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
func getParseError(_ data: Any, key: String) -> String {
|
|
267
|
+
return "Invalid input for key \(key): \(data)"
|
|
268
|
+
}
|