hypertrack-sdk-react-native 10.0.3 → 11.0.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 +48 -0
- package/CONTRIBUTING.md +1 -1
- package/README.md +2 -2
- package/android/build.gradle +5 -1
- package/android/gradle.properties +1 -1
- package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackReactNativePlugin.kt +80 -115
- package/android/src/main/java/com/reactnativehypertracksdk/ReactNativeSerialization.kt +23 -3
- package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackSdkWrapper.kt +87 -220
- package/android/src/main/java/com/reactnativehypertracksdk/common/SdkMethod.kt +11 -9
- package/android/src/main/java/com/reactnativehypertracksdk/common/Serialization.kt +216 -132
- package/android/src/main/java/com/reactnativehypertracksdk/common/{Result.kt → WrapperResult.kt} +9 -7
- package/hypertrack-sdk-react-native.podspec +1 -1
- package/ios/HyperTrackReactNativePlugin.m +13 -11
- package/ios/HyperTrackReactNativePlugin.swift +141 -114
- package/ios/common/DictionaryDecoder.swift +5 -5
- package/ios/common/HyperTrackSDKWrapper.swift +44 -80
- package/ios/common/SDKMethod.swift +13 -12
- package/ios/common/Serialization.swift +190 -245
- package/lib/commonjs/HyperTrack/HyperTrack.js +224 -124
- package/lib/commonjs/HyperTrack/HyperTrack.js.map +1 -1
- package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js +13 -17
- package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js.map +1 -1
- package/lib/commonjs/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -1
- package/lib/commonjs/HyperTrack/data_types/internal/Metadata.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/internal/Metadata.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/internal/Name.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/internal/Name.js.map +1 -0
- package/lib/commonjs/index.js +0 -7
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/HyperTrack/HyperTrack.js +224 -124
- package/lib/module/HyperTrack/HyperTrack.js.map +1 -1
- package/lib/module/HyperTrack/data_types/HyperTrackError.js +13 -17
- package/lib/module/HyperTrack/data_types/HyperTrackError.js.map +1 -1
- package/lib/module/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -1
- package/lib/module/HyperTrack/data_types/internal/Metadata.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/Metadata.js.map +1 -0
- package/lib/module/HyperTrack/data_types/internal/Name.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/Name.js.map +1 -0
- package/lib/module/index.js +0 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/HyperTrack/HyperTrack.d.ts +106 -54
- package/lib/typescript/HyperTrack/data_types/HyperTrackError.d.ts +59 -17
- package/lib/typescript/HyperTrack/data_types/internal/HyperTrackErrorInternal.d.ts +1 -1
- package/lib/typescript/HyperTrack/data_types/internal/Metadata.d.ts +4 -0
- package/lib/typescript/HyperTrack/data_types/internal/Name.d.ts +7 -0
- package/lib/typescript/index.d.ts +0 -1
- package/package.json +1 -1
- package/src/HyperTrack/HyperTrack.ts +281 -161
- package/src/HyperTrack/data_types/HyperTrackError.ts +73 -18
- package/src/HyperTrack/data_types/internal/HyperTrackErrorInternal.ts +3 -3
- package/src/HyperTrack/data_types/internal/Metadata.ts +4 -0
- package/src/HyperTrack/data_types/internal/Name.ts +7 -0
- package/src/index.tsx +0 -1
- package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackError.kt +0 -28
- package/android/src/main/java/com/reactnativehypertracksdk/common/LocationError.kt +0 -9
- package/android/src/main/java/com/reactnativehypertracksdk/common/SdkInitParams.kt +0 -44
- package/ios/common/HyperTrackError.swift +0 -20
- package/ios/common/SDKInitParams.swift +0 -13
- package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js +0 -2
- package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js.map +0 -1
- package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js +0 -2
- package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js.map +0 -1
- package/lib/module/HyperTrack/data_types/SdkInitParams.js +0 -2
- package/lib/module/HyperTrack/data_types/SdkInitParams.js.map +0 -1
- package/lib/module/HyperTrack/data_types/internal/DeviceName.js +0 -2
- package/lib/module/HyperTrack/data_types/internal/DeviceName.js.map +0 -1
- package/lib/typescript/HyperTrack/data_types/SdkInitParams.d.ts +0 -25
- package/lib/typescript/HyperTrack/data_types/internal/DeviceName.d.ts +0 -4
- package/src/HyperTrack/data_types/SdkInitParams.ts +0 -28
- 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.
|
|
5
|
-
import com.
|
|
6
|
-
import com.
|
|
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
|
|
16
|
-
import
|
|
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
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
114
|
-
|
|
54
|
+
is Result.Success -> {
|
|
55
|
+
serializeLocationWithDeviationSuccess(it.success)
|
|
115
56
|
}
|
|
116
57
|
}
|
|
117
58
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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
|
|
126
|
-
return Success(
|
|
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
|
|
136
|
-
return
|
|
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
|
|
147
|
-
return
|
|
148
|
-
.
|
|
149
|
-
|
|
150
|
-
}
|
|
77
|
+
fun getIsAvailable(): WrapperResult<Serialized> {
|
|
78
|
+
return Success(
|
|
79
|
+
serializeIsAvailable(HyperTrack.isAvailable)
|
|
80
|
+
)
|
|
151
81
|
}
|
|
152
82
|
|
|
153
|
-
fun
|
|
154
|
-
return
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
83
|
+
fun getIsTracking(): WrapperResult<Serialized> {
|
|
84
|
+
return Success(
|
|
85
|
+
serializeIsTracking(HyperTrack.isTracking)
|
|
86
|
+
)
|
|
158
87
|
}
|
|
159
88
|
|
|
160
|
-
fun getLocation():
|
|
161
|
-
return
|
|
162
|
-
.
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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
|
|
173
|
-
return
|
|
101
|
+
fun getMetadata(): WrapperResult<Serialized> {
|
|
102
|
+
return Success(
|
|
103
|
+
serializeMetadata(HyperTrack.metadata.toMap())
|
|
104
|
+
)
|
|
174
105
|
}
|
|
175
106
|
|
|
176
|
-
fun
|
|
177
|
-
return
|
|
107
|
+
fun getName(): WrapperResult<Serialized> {
|
|
108
|
+
return Success(
|
|
109
|
+
serializeName(HyperTrack.name)
|
|
110
|
+
)
|
|
178
111
|
}
|
|
179
112
|
|
|
180
|
-
|
|
181
|
-
return
|
|
182
|
-
|
|
183
|
-
|
|
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
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
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
|
-
|
|
258
|
-
return
|
|
259
|
-
.
|
|
260
|
-
|
|
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
|
-
|
|
10
|
+
addGeotag,
|
|
10
11
|
getDeviceID,
|
|
12
|
+
getErrors,
|
|
13
|
+
getIsAvailable,
|
|
14
|
+
getIsTracking,
|
|
11
15
|
getLocation,
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
+
getMetadata,
|
|
17
|
+
getName,
|
|
18
|
+
locate,
|
|
19
|
+
setIsAvailable,
|
|
20
|
+
setIsTracking,
|
|
16
21
|
setMetadata,
|
|
17
|
-
|
|
18
|
-
isAvailable,
|
|
19
|
-
addGeotag,
|
|
20
|
-
sync
|
|
22
|
+
setName,
|
|
21
23
|
}
|