react-native-spike-sdk 4.5.23 → 4.7.13

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 (193) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/com/spikesdk/SpikeMappers.kt +0 -46
  3. package/android/src/main/java/com/spikesdk/SpikeSdkModule.kt +50 -483
  4. package/ios/SpikeExceptionMapper.swift +4 -12
  5. package/ios/SpikeSdk.m +8 -79
  6. package/ios/SpikeSdk.swift +62 -419
  7. package/lib/commonjs/Spike.js +1 -57
  8. package/lib/commonjs/Spike.js.map +1 -1
  9. package/lib/commonjs/SpikeException.js +15 -94
  10. package/lib/commonjs/SpikeException.js.map +1 -1
  11. package/lib/commonjs/index.js +0 -71
  12. package/lib/commonjs/index.js.map +1 -1
  13. package/lib/commonjs/v3/SpikeRNConnectionAPIv3.js +40 -17
  14. package/lib/commonjs/v3/SpikeRNConnectionAPIv3.js.map +1 -1
  15. package/lib/commonjs/version.js +1 -1
  16. package/lib/module/Spike.js +1 -55
  17. package/lib/module/Spike.js.map +1 -1
  18. package/lib/module/SpikeException.js +14 -83
  19. package/lib/module/SpikeException.js.map +1 -1
  20. package/lib/module/index.js +3 -8
  21. package/lib/module/index.js.map +1 -1
  22. package/lib/module/v3/SpikeRNConnectionAPIv3.js +40 -17
  23. package/lib/module/v3/SpikeRNConnectionAPIv3.js.map +1 -1
  24. package/lib/module/version.js +1 -1
  25. package/lib/typescript/Spike.d.ts +2 -29
  26. package/lib/typescript/Spike.d.ts.map +1 -1
  27. package/lib/typescript/SpikeException.d.ts +5 -30
  28. package/lib/typescript/SpikeException.d.ts.map +1 -1
  29. package/lib/typescript/index.d.ts +6 -25
  30. package/lib/typescript/index.d.ts.map +1 -1
  31. package/lib/typescript/v3/DataModels/BackgroundDeliveryConfig.d.ts +2 -0
  32. package/lib/typescript/v3/DataModels/BackgroundDeliveryConfig.d.ts.map +1 -1
  33. package/lib/typescript/v3/SpikeRNConnectionAPIv3.d.ts +34 -9
  34. package/lib/typescript/v3/SpikeRNConnectionAPIv3.d.ts.map +1 -1
  35. package/lib/typescript/version.d.ts +1 -1
  36. package/package.json +2 -2
  37. package/src/Spike.ts +4 -89
  38. package/src/SpikeException.ts +13 -96
  39. package/src/index.ts +2 -61
  40. package/src/v3/DataModels/BackgroundDeliveryConfig.ts +2 -0
  41. package/src/v3/SpikeRNConnectionAPIv3.ts +82 -19
  42. package/src/version.ts +1 -1
  43. package/android/src/main/java/com/spikesdk/SpikeConnectionLogger.kt +0 -37
  44. package/ios/SpikeConnectionListener.swift +0 -17
  45. package/ios/SpikeConnectionLogger.swift +0 -43
  46. package/ios/SpikeDataTypeMapper.swift +0 -255
  47. package/lib/commonjs/DataModels/SpikeActivitiesStreamDataEntry.js +0 -2
  48. package/lib/commonjs/DataModels/SpikeActivitiesStreamDataEntry.js.map +0 -1
  49. package/lib/commonjs/DataModels/SpikeActivitiesSummaryDataEntry.js +0 -2
  50. package/lib/commonjs/DataModels/SpikeActivitiesSummaryDataEntry.js.map +0 -1
  51. package/lib/commonjs/DataModels/SpikeBodyDataEntry.js +0 -2
  52. package/lib/commonjs/DataModels/SpikeBodyDataEntry.js.map +0 -1
  53. package/lib/commonjs/DataModels/SpikeBreathingDataEntry.js +0 -2
  54. package/lib/commonjs/DataModels/SpikeBreathingDataEntry.js.map +0 -1
  55. package/lib/commonjs/DataModels/SpikeCaloriesDataEntry.js +0 -2
  56. package/lib/commonjs/DataModels/SpikeCaloriesDataEntry.js.map +0 -1
  57. package/lib/commonjs/DataModels/SpikeData.js +0 -6
  58. package/lib/commonjs/DataModels/SpikeData.js.map +0 -1
  59. package/lib/commonjs/DataModels/SpikeDataTypes.js +0 -23
  60. package/lib/commonjs/DataModels/SpikeDataTypes.js.map +0 -1
  61. package/lib/commonjs/DataModels/SpikeDistanceDataEntry.js +0 -2
  62. package/lib/commonjs/DataModels/SpikeDistanceDataEntry.js.map +0 -1
  63. package/lib/commonjs/DataModels/SpikeEcgDataEntry.js +0 -2
  64. package/lib/commonjs/DataModels/SpikeEcgDataEntry.js.map +0 -1
  65. package/lib/commonjs/DataModels/SpikeGlucoseDataEntry.js +0 -2
  66. package/lib/commonjs/DataModels/SpikeGlucoseDataEntry.js.map +0 -1
  67. package/lib/commonjs/DataModels/SpikeHeartDataEntry.js +0 -2
  68. package/lib/commonjs/DataModels/SpikeHeartDataEntry.js.map +0 -1
  69. package/lib/commonjs/DataModels/SpikeOxygenSaturationDataEntry.js +0 -2
  70. package/lib/commonjs/DataModels/SpikeOxygenSaturationDataEntry.js.map +0 -1
  71. package/lib/commonjs/DataModels/SpikeSleepDataEntry.js +0 -2
  72. package/lib/commonjs/DataModels/SpikeSleepDataEntry.js.map +0 -1
  73. package/lib/commonjs/DataModels/SpikeStepsDataEntry.js +0 -2
  74. package/lib/commonjs/DataModels/SpikeStepsDataEntry.js.map +0 -1
  75. package/lib/commonjs/DataModels/SpikeStepsIntradayDataEntry.js +0 -2
  76. package/lib/commonjs/DataModels/SpikeStepsIntradayDataEntry.js.map +0 -1
  77. package/lib/commonjs/DataModels/SpikeWebhookJob.js +0 -2
  78. package/lib/commonjs/DataModels/SpikeWebhookJob.js.map +0 -1
  79. package/lib/commonjs/DataTypes/SpikeDataType.js +0 -59
  80. package/lib/commonjs/DataTypes/SpikeDataType.js.map +0 -1
  81. package/lib/commonjs/SpikeBackgroundDeliveriesLogger.js +0 -2
  82. package/lib/commonjs/SpikeBackgroundDeliveriesLogger.js.map +0 -1
  83. package/lib/commonjs/SpikeConnection.js +0 -301
  84. package/lib/commonjs/SpikeConnection.js.map +0 -1
  85. package/lib/commonjs/SpikeConnectionTypes.js +0 -6
  86. package/lib/commonjs/SpikeConnectionTypes.js.map +0 -1
  87. package/lib/commonjs/SpikeLogger.js +0 -6
  88. package/lib/commonjs/SpikeLogger.js.map +0 -1
  89. package/lib/module/DataModels/SpikeActivitiesStreamDataEntry.js +0 -2
  90. package/lib/module/DataModels/SpikeActivitiesStreamDataEntry.js.map +0 -1
  91. package/lib/module/DataModels/SpikeActivitiesSummaryDataEntry.js +0 -2
  92. package/lib/module/DataModels/SpikeActivitiesSummaryDataEntry.js.map +0 -1
  93. package/lib/module/DataModels/SpikeBodyDataEntry.js +0 -2
  94. package/lib/module/DataModels/SpikeBodyDataEntry.js.map +0 -1
  95. package/lib/module/DataModels/SpikeBreathingDataEntry.js +0 -2
  96. package/lib/module/DataModels/SpikeBreathingDataEntry.js.map +0 -1
  97. package/lib/module/DataModels/SpikeCaloriesDataEntry.js +0 -2
  98. package/lib/module/DataModels/SpikeCaloriesDataEntry.js.map +0 -1
  99. package/lib/module/DataModels/SpikeData.js +0 -4
  100. package/lib/module/DataModels/SpikeData.js.map +0 -1
  101. package/lib/module/DataModels/SpikeDataTypes.js +0 -19
  102. package/lib/module/DataModels/SpikeDataTypes.js.map +0 -1
  103. package/lib/module/DataModels/SpikeDistanceDataEntry.js +0 -2
  104. package/lib/module/DataModels/SpikeDistanceDataEntry.js.map +0 -1
  105. package/lib/module/DataModels/SpikeEcgDataEntry.js +0 -2
  106. package/lib/module/DataModels/SpikeEcgDataEntry.js.map +0 -1
  107. package/lib/module/DataModels/SpikeGlucoseDataEntry.js +0 -2
  108. package/lib/module/DataModels/SpikeGlucoseDataEntry.js.map +0 -1
  109. package/lib/module/DataModels/SpikeHeartDataEntry.js +0 -2
  110. package/lib/module/DataModels/SpikeHeartDataEntry.js.map +0 -1
  111. package/lib/module/DataModels/SpikeOxygenSaturationDataEntry.js +0 -2
  112. package/lib/module/DataModels/SpikeOxygenSaturationDataEntry.js.map +0 -1
  113. package/lib/module/DataModels/SpikeSleepDataEntry.js +0 -2
  114. package/lib/module/DataModels/SpikeSleepDataEntry.js.map +0 -1
  115. package/lib/module/DataModels/SpikeStepsDataEntry.js +0 -2
  116. package/lib/module/DataModels/SpikeStepsDataEntry.js.map +0 -1
  117. package/lib/module/DataModels/SpikeStepsIntradayDataEntry.js +0 -2
  118. package/lib/module/DataModels/SpikeStepsIntradayDataEntry.js.map +0 -1
  119. package/lib/module/DataModels/SpikeWebhookJob.js +0 -2
  120. package/lib/module/DataModels/SpikeWebhookJob.js.map +0 -1
  121. package/lib/module/DataTypes/SpikeDataType.js +0 -42
  122. package/lib/module/DataTypes/SpikeDataType.js.map +0 -1
  123. package/lib/module/SpikeBackgroundDeliveriesLogger.js +0 -2
  124. package/lib/module/SpikeBackgroundDeliveriesLogger.js.map +0 -1
  125. package/lib/module/SpikeConnection.js +0 -296
  126. package/lib/module/SpikeConnection.js.map +0 -1
  127. package/lib/module/SpikeConnectionTypes.js +0 -4
  128. package/lib/module/SpikeConnectionTypes.js.map +0 -1
  129. package/lib/module/SpikeLogger.js +0 -4
  130. package/lib/module/SpikeLogger.js.map +0 -1
  131. package/lib/typescript/DataModels/SpikeActivitiesStreamDataEntry.d.ts +0 -66
  132. package/lib/typescript/DataModels/SpikeActivitiesStreamDataEntry.d.ts.map +0 -1
  133. package/lib/typescript/DataModels/SpikeActivitiesSummaryDataEntry.d.ts +0 -29
  134. package/lib/typescript/DataModels/SpikeActivitiesSummaryDataEntry.d.ts.map +0 -1
  135. package/lib/typescript/DataModels/SpikeBodyDataEntry.d.ts +0 -54
  136. package/lib/typescript/DataModels/SpikeBodyDataEntry.d.ts.map +0 -1
  137. package/lib/typescript/DataModels/SpikeBreathingDataEntry.d.ts +0 -13
  138. package/lib/typescript/DataModels/SpikeBreathingDataEntry.d.ts.map +0 -1
  139. package/lib/typescript/DataModels/SpikeCaloriesDataEntry.d.ts +0 -15
  140. package/lib/typescript/DataModels/SpikeCaloriesDataEntry.d.ts.map +0 -1
  141. package/lib/typescript/DataModels/SpikeData.d.ts +0 -27
  142. package/lib/typescript/DataModels/SpikeData.d.ts.map +0 -1
  143. package/lib/typescript/DataModels/SpikeDataTypes.d.ts +0 -17
  144. package/lib/typescript/DataModels/SpikeDataTypes.d.ts.map +0 -1
  145. package/lib/typescript/DataModels/SpikeDistanceDataEntry.d.ts +0 -13
  146. package/lib/typescript/DataModels/SpikeDistanceDataEntry.d.ts.map +0 -1
  147. package/lib/typescript/DataModels/SpikeEcgDataEntry.d.ts +0 -13
  148. package/lib/typescript/DataModels/SpikeEcgDataEntry.d.ts.map +0 -1
  149. package/lib/typescript/DataModels/SpikeGlucoseDataEntry.d.ts +0 -21
  150. package/lib/typescript/DataModels/SpikeGlucoseDataEntry.d.ts.map +0 -1
  151. package/lib/typescript/DataModels/SpikeHeartDataEntry.d.ts +0 -32
  152. package/lib/typescript/DataModels/SpikeHeartDataEntry.d.ts.map +0 -1
  153. package/lib/typescript/DataModels/SpikeOxygenSaturationDataEntry.d.ts +0 -15
  154. package/lib/typescript/DataModels/SpikeOxygenSaturationDataEntry.d.ts.map +0 -1
  155. package/lib/typescript/DataModels/SpikeSleepDataEntry.d.ts +0 -30
  156. package/lib/typescript/DataModels/SpikeSleepDataEntry.d.ts.map +0 -1
  157. package/lib/typescript/DataModels/SpikeStepsDataEntry.d.ts +0 -13
  158. package/lib/typescript/DataModels/SpikeStepsDataEntry.d.ts.map +0 -1
  159. package/lib/typescript/DataModels/SpikeStepsIntradayDataEntry.d.ts +0 -17
  160. package/lib/typescript/DataModels/SpikeStepsIntradayDataEntry.d.ts.map +0 -1
  161. package/lib/typescript/DataModels/SpikeWebhookJob.d.ts +0 -11
  162. package/lib/typescript/DataModels/SpikeWebhookJob.d.ts.map +0 -1
  163. package/lib/typescript/DataTypes/SpikeDataType.d.ts +0 -68
  164. package/lib/typescript/DataTypes/SpikeDataType.d.ts.map +0 -1
  165. package/lib/typescript/SpikeBackgroundDeliveriesLogger.d.ts +0 -4
  166. package/lib/typescript/SpikeBackgroundDeliveriesLogger.d.ts.map +0 -1
  167. package/lib/typescript/SpikeConnection.d.ts +0 -63
  168. package/lib/typescript/SpikeConnection.d.ts.map +0 -1
  169. package/lib/typescript/SpikeConnectionTypes.d.ts +0 -102
  170. package/lib/typescript/SpikeConnectionTypes.d.ts.map +0 -1
  171. package/lib/typescript/SpikeLogger.d.ts +0 -13
  172. package/lib/typescript/SpikeLogger.d.ts.map +0 -1
  173. package/src/DataModels/SpikeActivitiesStreamDataEntry.ts +0 -67
  174. package/src/DataModels/SpikeActivitiesSummaryDataEntry.ts +0 -28
  175. package/src/DataModels/SpikeBodyDataEntry.ts +0 -61
  176. package/src/DataModels/SpikeBreathingDataEntry.ts +0 -12
  177. package/src/DataModels/SpikeCaloriesDataEntry.ts +0 -13
  178. package/src/DataModels/SpikeData.ts +0 -38
  179. package/src/DataModels/SpikeDataTypes.ts +0 -31
  180. package/src/DataModels/SpikeDistanceDataEntry.ts +0 -12
  181. package/src/DataModels/SpikeEcgDataEntry.ts +0 -12
  182. package/src/DataModels/SpikeGlucoseDataEntry.ts +0 -20
  183. package/src/DataModels/SpikeHeartDataEntry.ts +0 -34
  184. package/src/DataModels/SpikeOxygenSaturationDataEntry.ts +0 -14
  185. package/src/DataModels/SpikeSleepDataEntry.ts +0 -29
  186. package/src/DataModels/SpikeStepsDataEntry.ts +0 -12
  187. package/src/DataModels/SpikeStepsIntradayDataEntry.ts +0 -16
  188. package/src/DataModels/SpikeWebhookJob.ts +0 -10
  189. package/src/DataTypes/SpikeDataType.ts +0 -93
  190. package/src/SpikeBackgroundDeliveriesLogger.ts +0 -3
  191. package/src/SpikeConnection.ts +0 -495
  192. package/src/SpikeConnectionTypes.ts +0 -124
  193. package/src/SpikeLogger.ts +0 -14
@@ -8,12 +8,8 @@ import androidx.activity.result.contract.ActivityResultContract
8
8
  import com.facebook.react.bridge.*
9
9
  import com.facebook.react.modules.core.DeviceEventManagerModule
10
10
  import com.google.gson.GsonBuilder
11
- import com.spikeapi.SpikeConnection
12
- import com.spikeapi.SpikeEnvironment
13
11
  import com.spikeapi.SpikeExceptions
14
- import com.spikeapi.SpikeLogger
15
12
  import com.spikeapi.SpikePackageChecker
16
- import com.spikeapi.healthconnect.HealthConnectAvailability
17
13
  import com.spikeapi.apiv3.SpikeConnectionAPIv3
18
14
  import com.spikeapi.apiv3.datamodels.MetricType
19
15
  import com.spikeapi.apiv3.datamodels.ActivityConfig
@@ -21,10 +17,10 @@ import com.spikeapi.apiv3.datamodels.RecordConfig
21
17
  import com.spikeapi.apiv3.datamodels.SleepConfig
22
18
  import com.spikeapi.apiv3.datamodels.StatisticsType
23
19
  import com.spikeapi.apiv3.datamodels.NutritionRecord
20
+ import com.spikeapi.apiv3.datamodels.NutritionalField
24
21
  import com.spikeapi.apiv3.datamodels.NutritionalAnalysisConfig
25
22
  import com.spikeapi.apiv3.datamodels.NutritionFactsLabelRecognitionConfig
26
23
  import com.spikeapi.apiv3.datamodels.NutritionRecordAnalysisMode
27
- import com.spikeapi.apiv3.datamodels.NutritionalField
28
24
  import com.spikeapi.apiv3.datamodels.utils.ActivityConfigUtils
29
25
  import com.spikeapi.apiv3.datamodels.utils.SleepConfigUtils
30
26
  import com.spikeapi.apiv3.datamodels.utils.StatisticsTypeUtils
@@ -62,9 +58,6 @@ fun <I, O> ComponentActivity.registerActivityResultLauncher(
62
58
  class SpikeSdkModule(reactContext: ReactApplicationContext) :
63
59
  ReactContextBaseJavaModule(reactContext), LifecycleEventListener {
64
60
 
65
- // Do not use this directly, use `addConnection` and `getConnection` instead
66
- private val _connections = mutableMapOf<String, SpikeConnection>()
67
-
68
61
  private val scope = CoroutineScope(SupervisorJob() + Dispatchers.Main.immediate)
69
62
 
70
63
  private val gson = GsonBuilder()
@@ -73,8 +66,6 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
73
66
  OffsetDateTime::class.java,
74
67
  OffsetDateTimeSerializer()
75
68
  ).create()
76
- private var checkPermissionsFor: Triple<String, Set<String>, Promise>? = null
77
-
78
69
  override fun getName(): String {
79
70
  return NAME
80
71
  }
@@ -99,443 +90,6 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
99
90
  }
100
91
  }
101
92
 
102
- @ReactMethod
103
- fun createConnection(
104
- uuid: String,
105
- appId: String,
106
- authToken: String,
107
- customerEndUserId: String,
108
- callbackUrl: String?,
109
- useLogger: Boolean,
110
- promise: Promise
111
- ) {
112
- scope.launch {
113
- try {
114
- val logger = if (useLogger) {
115
- createLogger(uuid)
116
- } else {
117
- null
118
- }
119
- addConnection(connection = SpikeConnection.createConnection(
120
- context = reactApplicationContext,
121
- authToken = authToken,
122
- customerEndUserId = customerEndUserId,
123
- appId = appId,
124
- callbackUrl = callbackUrl,
125
- env = SpikeEnvironment.PROD,
126
- logger = logger,
127
- ), uuid = uuid)
128
- promise.resolve(uuid)
129
- } catch (e: SpikeExceptions) {
130
- promise.reject(e.mapException(), e.message)
131
- }
132
- }
133
- }
134
-
135
- @ReactMethod
136
- fun getAppId(uuid: String, promise: Promise) {
137
- scope.launch {
138
- try {
139
- val connection = getConnection(uuid) ?: return@launch promise.reject(
140
- SpikeExceptions.SpikeException(
141
- "Connection not found"
142
- ).mapException(), "Connection not found"
143
- )
144
- val appId = connection.getAppId()
145
- promise.resolve(appId)
146
- } catch (e: SpikeExceptions) {
147
- promise.reject(e.mapException(), e.message)
148
- }
149
- }
150
- }
151
-
152
- @ReactMethod
153
- fun getSpikeEndUserId(uuid: String, promise: Promise) {
154
- scope.launch {
155
- try {
156
- val connection = getConnection(uuid) ?: return@launch promise.reject(
157
- SpikeExceptions.SpikeException(
158
- "Connection not found"
159
- ).mapException(), "Connection not found"
160
- )
161
- val spikeEndUserId = connection.getSpikeUserId()
162
- promise.resolve(spikeEndUserId)
163
- } catch (e: SpikeExceptions) {
164
- promise.reject(e.mapException(), e.message)
165
- }
166
- }
167
- }
168
-
169
- @ReactMethod
170
- fun getCustomerEndUserId(uuid: String, promise: Promise) {
171
- scope.launch {
172
- try {
173
- val connection = getConnection(uuid) ?: return@launch promise.reject(
174
- SpikeExceptions.SpikeException(
175
- "Connection not found"
176
- ).mapException(), "Connection not found"
177
- )
178
- val customerEndUserId = connection.getCustomerUserId()
179
- promise.resolve(customerEndUserId)
180
- } catch (e: SpikeExceptions) {
181
- promise.reject(e.mapException(), e.message)
182
- }
183
- }
184
- }
185
-
186
- @ReactMethod
187
- fun getCallbackUrl(uuid: String, promise: Promise) {
188
- scope.launch {
189
- try {
190
- val connection = getConnection(uuid) ?: return@launch promise.reject(
191
- SpikeExceptions.SpikeException(
192
- "Connection not found"
193
- ).mapException(), "Connection not found"
194
- )
195
- val callbackUrl = connection.getPostbackUrl()
196
- promise.resolve(callbackUrl)
197
- } catch (e: SpikeExceptions) {
198
- promise.reject(e.mapException(), e.message)
199
- }
200
- }
201
- }
202
-
203
-
204
- @ReactMethod
205
- fun close(uuid: String, promise: Promise) {
206
- scope.launch {
207
- try {
208
- val connection = getConnection(uuid) ?: return@launch promise.reject(
209
- SpikeExceptions.SpikeException(
210
- "Connection not found"
211
- ).mapException(), "Connection not found"
212
- )
213
- connection.close()
214
- promise.resolve(true)
215
- } catch (e: SpikeExceptions) {
216
- promise.reject(e.mapException(), e.message)
217
- }
218
- }
219
- }
220
-
221
- @ReactMethod
222
- fun extractDataInRange(
223
- connectionUUID: String,
224
- dataType: String,
225
- fromDateMillis: Double,
226
- toDateMillis: Double,
227
- promise: Promise
228
- ) {
229
- scope.launch {
230
- try {
231
- val connection = getConnection(connectionUUID) ?: return@launch promise.reject(
232
- SpikeExceptions.SpikeException(
233
- "Connection not found"
234
- ).mapException(), "Connection not found"
235
- )
236
- val result = connection.extractData(
237
- dataType = dataType.toSpikeDataType(),
238
- from = fromDateMillis.toLong().millisToOffsetDataTime(),
239
- to = toDateMillis.toLong().millisToOffsetDataTime()
240
- )
241
- promise.resolve(gson.toJson(result))
242
- } catch (e: SpikeExceptions) {
243
- promise.reject(e.mapException(), e.message)
244
- }
245
- }
246
- }
247
-
248
- @ReactMethod
249
- fun extractAndPostDataInRange(
250
- connectionUUID: String,
251
- dataType: String,
252
- fromDateMillis: Double,
253
- toDateMillis: Double,
254
- promise: Promise
255
- ) {
256
- scope.launch {
257
- try {
258
- val connection = getConnection(connectionUUID) ?: return@launch promise.reject(
259
- SpikeExceptions.SpikeException(
260
- "Connection not found"
261
- ).mapException(), "Connection not found"
262
- )
263
- val result = connection.extractAndPostData(
264
- dataType = dataType.toSpikeDataType(),
265
- from = fromDateMillis.toLong().millisToOffsetDataTime(),
266
- to = toDateMillis.toLong().millisToOffsetDataTime()
267
- )
268
- promise.resolve(gson.toJson(result))
269
- } catch (e: SpikeExceptions) {
270
- promise.reject(e.mapException(), e.message)
271
- }
272
- }
273
- }
274
-
275
- @ReactMethod
276
- fun extractData(
277
- connectionUUID: String,
278
- dataType: String,
279
- promise: Promise
280
- ) {
281
- scope.launch {
282
- try {
283
- val connection = getConnection(connectionUUID) ?: return@launch promise.reject(
284
- SpikeExceptions.SpikeException(
285
- "Connection not found"
286
- ).mapException(), "Connection not found"
287
- )
288
- val result = connection.extractData(
289
- dataType = dataType.toSpikeDataType()
290
- )
291
- promise.resolve(gson.toJson(result))
292
- } catch (e: SpikeExceptions) {
293
- promise.reject(e.mapException(), e.message)
294
- }
295
- }
296
- }
297
-
298
- @ReactMethod
299
- fun extractAndPostData(
300
- connectionUUID: String,
301
- dataType: String,
302
- promise: Promise
303
- ) {
304
- scope.launch {
305
- try {
306
- val connection = getConnection(connectionUUID) ?: return@launch promise.reject(
307
- SpikeExceptions.SpikeException(
308
- "Connection not found"
309
- ).mapException(), "Connection not found"
310
- )
311
- val result = connection.extractAndPostData(
312
- dataType = dataType.toSpikeDataType()
313
- )
314
- promise.resolve(gson.toJson(result))
315
- } catch (e: SpikeExceptions) {
316
- promise.reject(e.mapException(), e.message)
317
- }
318
- }
319
- }
320
-
321
- @ReactMethod
322
- fun manageHealthConnect(connectionUUID: String, promise: Promise) {
323
- scope.launch {
324
- try {
325
- val connection = getConnection(connectionUUID) ?: return@launch promise.reject(
326
- SpikeExceptions.SpikeException(
327
- "Connection not found"
328
- ).mapException(), "Connection not found"
329
- )
330
- connection.manageHealthConnect()
331
- promise.resolve(true)
332
- } catch (e: SpikeExceptions) {
333
- promise.reject(e.mapException(), e.message)
334
- }
335
- }
336
- }
337
-
338
- @ReactMethod
339
- fun checkPermissionsGranted(connectionUUID: String, dataType: String, promise: Promise) {
340
- scope.launch {
341
- try {
342
- val connection = getConnection(connectionUUID) ?: return@launch promise.reject(
343
- SpikeExceptions.SpikeException(
344
- "Connection not found"
345
- ).mapException(), "Connection not found"
346
- )
347
- val requiredPermissions = connection.getRequiredHealthPermissionsMetadata(
348
- dataType.toSpikeDataType()
349
- )
350
- val permissionsGranted: Boolean =
351
- connection.hasHealthPermissionsGranted(requiredPermissions)
352
- promise.resolve(permissionsGranted)
353
- } catch (e: SpikeExceptions) {
354
- promise.reject(e.mapException(), e.message)
355
- }
356
- }
357
- }
358
-
359
- @ReactMethod
360
- fun getHealthConnectAvailability(connectionUUID: String, promise: Promise) {
361
- scope.launch {
362
- try {
363
- val connection = getConnection(connectionUUID) ?: return@launch promise.reject(
364
- SpikeExceptions.SpikeException(
365
- "Connection not found"
366
- ).mapException(), "Connection not found"
367
- )
368
- val availability = connection.getHealthConnectAvailability()
369
- promise.resolve(availability.toStringType())
370
- } catch (e: SpikeExceptions) {
371
- promise.reject(e.mapException(), e.message)
372
- }
373
- }
374
- }
375
-
376
- @ReactMethod
377
- fun revokeAllPermissions(connectionUUID: String, promise: Promise) {
378
- scope.launch {
379
- try {
380
- val connection = getConnection(connectionUUID) ?: return@launch promise.reject(
381
- SpikeExceptions.SpikeException(
382
- "Connection not found"
383
- ).mapException(), "Connection not found"
384
- )
385
- connection.revokeAllPermissions()
386
- promise.resolve(true)
387
- } catch (e: SpikeExceptions) {
388
- promise.reject(e.mapException(), e.message)
389
- }
390
- }
391
- }
392
-
393
- @ReactMethod
394
- fun requestHealthPermissions(connectionUUID: String, dataType: String, promise: Promise) {
395
- scope.launch {
396
- val connection = getConnection(connectionUUID) ?: return@launch promise.reject(
397
- SpikeExceptions.SpikeException(
398
- "Connection not found"
399
- ).mapException(), "Connection not found"
400
- )
401
-
402
- val permissions =
403
- connection.getRequiredHealthPermissionsMetadata(dataType.toSpikeDataType())
404
-
405
- if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.TIRAMISU) {
406
- val intent = SpikeConnection.requestReadAuthorization().createIntent(
407
- reactApplicationContext, permissions
408
- )
409
-
410
- val availability = connection.getHealthConnectAvailability()
411
- if (availability == HealthConnectAvailability.INSTALLED) {
412
- reactApplicationContext.currentActivity?.startActivityForResult(
413
- intent,
414
- REQUEST_CODE
415
- )
416
- promise.resolve(true)
417
- } else {
418
- promise.reject(
419
- SpikeExceptions.SpikeException().mapException(),
420
- SpikeExceptions.SpikeException().message
421
- )
422
- }
423
- } else {
424
- val activity = reactApplicationContext.currentActivity
425
- if (activity is ComponentActivity) {
426
- checkPermissionsFor = Triple(connectionUUID, setOf(dataType), promise)
427
- val launcher =
428
- activity.registerActivityResultLauncher(
429
- SpikeConnection.requestReadAuthorization()
430
- ) {
431
-
432
- }
433
-
434
- if (permissions.isNotEmpty()) {
435
- launcher.launch(permissions)
436
- } else {
437
- promise.resolve(false)
438
- }
439
- } else {
440
- promise.resolve(false)
441
- }
442
- }
443
- }
444
- }
445
-
446
- @ReactMethod
447
- fun requestMultipleHealthPermissions(connectionUUID: String, dataTypes: ReadableArray, promise: Promise) {
448
- scope.launch {
449
- val connection = getConnection(connectionUUID) ?: return@launch promise.reject(
450
- SpikeExceptions.SpikeException(
451
- "Connection not found"
452
- ).mapException(), "Connection not found"
453
- )
454
-
455
- val permissions = mutableSetOf<String>()
456
- dataTypes.toArrayList().forEach {
457
- connection.getRequiredHealthPermissionsMetadata((it as String).toSpikeDataType())
458
- .forEach {
459
- permissions.add(it)
460
- }
461
- }
462
-
463
- if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.TIRAMISU) {
464
- val availability = connection.getHealthConnectAvailability()
465
- if (permissions.isNotEmpty() && availability == HealthConnectAvailability.INSTALLED) {
466
- val intent = SpikeConnection.requestReadAuthorization().createIntent(
467
- reactApplicationContext, permissions
468
- )
469
-
470
- reactApplicationContext.currentActivity?.startActivityForResult(
471
- intent,
472
- REQUEST_CODE
473
- )
474
- promise.resolve(true)
475
- } else {
476
- promise.reject(
477
- SpikeExceptions.SpikeException().mapException(),
478
- SpikeExceptions.SpikeException().message
479
- )
480
- }
481
- } else {
482
- val activity = reactApplicationContext.currentActivity
483
- if (activity is ComponentActivity) {
484
- checkPermissionsFor = Triple(
485
- connectionUUID,
486
- dataTypes.toArrayList().toSet() as Set<String>,
487
- promise
488
- )
489
- val launcher =
490
- activity.registerActivityResultLauncher(
491
- SpikeConnection.requestReadAuthorization()
492
- ) {
493
-
494
- }
495
- if (permissions.isNotEmpty()) {
496
- launcher.launch(permissions)
497
- } else {
498
- promise.reject(
499
- SpikeExceptions.SpikeException().mapException(),
500
- SpikeExceptions.SpikeException().message
501
- )
502
- }
503
- } else {
504
- promise.resolve(false)
505
- }
506
- }
507
- }
508
- }
509
-
510
- private fun createLogger(connectionUUID: String): SpikeLogger {
511
- return SpikeConnectionLogger(connectionUUID) { _, logLevel, message ->
512
- val body = WritableNativeMap().apply {
513
- putString("connectionUUID", connectionUUID)
514
- putString("message", message)
515
- }
516
-
517
- when (logLevel) {
518
- SpikeLogLevel.DEBUG -> sendEvent(
519
- reactContext = reactApplicationContext,
520
- eventName = logLevel.jsEventName,
521
- params = body
522
- )
523
-
524
- SpikeLogLevel.ERROR -> sendEvent(
525
- reactContext = reactApplicationContext,
526
- eventName = logLevel.jsEventName,
527
- params = body
528
- )
529
-
530
- SpikeLogLevel.INFO -> sendEvent(
531
- reactContext = reactApplicationContext,
532
- eventName = logLevel.jsEventName,
533
- params = body
534
- )
535
- }
536
- }
537
- }
538
-
539
93
  private fun sendEvent(reactContext: ReactContext, eventName: String, params: WritableMap?) {
540
94
  reactContext
541
95
  .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
@@ -543,19 +97,6 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
543
97
  }
544
98
 
545
99
  override fun onHostResume() {
546
- // Old SDK
547
- checkPermissionsFor?.let {
548
- it.second.forEach { permission ->
549
- checkPermissionsGranted(
550
- it.first,
551
- permission,
552
- it.third
553
- )
554
- }
555
- }
556
- checkPermissionsFor = null
557
-
558
- // New SDK V3
559
100
  checkPermissionsForV3?.let {
560
101
  areAllPermissionsGranted(it.first, it.second, it.third)
561
102
  }
@@ -572,25 +113,9 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
572
113
  const val REQUEST_CODE = 4200
573
114
  }
574
115
 
575
- // Connections
116
+ // ------------------------- V3 -------------------------
576
117
 
577
118
  private val mutex = Mutex()
578
-
579
- // Add new connection to the dictionary in a thread-safe manner
580
- private suspend fun addConnection(connection: SpikeConnection, uuid: String) {
581
- mutex.withLock {
582
- _connections[uuid] = connection
583
- }
584
- }
585
-
586
- // Synchronised read for safe multithreaded usage
587
- private suspend fun getConnection(uuid: String): SpikeConnection? {
588
- mutex.withLock {
589
- return _connections[uuid]
590
- }
591
- }
592
-
593
- // ------------------------- V3 -------------------------
594
119
 
595
120
  @ReactMethod
596
121
  fun setWrapper(type: String, version: String) {
@@ -675,6 +200,17 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
675
200
  }
676
201
  }
677
202
 
203
+ @ReactMethod
204
+ fun closeV3(connectionUUID: String, promise: Promise) {
205
+ executeV3MethodWithConnection("closeV3", connectionUUID, promise) { connection ->
206
+ connection.close()
207
+ mutex.withLock {
208
+ _connectionsV3.remove(connectionUUID)
209
+ }
210
+ promise.resolve(true)
211
+ }
212
+ }
213
+
678
214
  /// --- Read user info ---
679
215
 
680
216
  @ReactMethod
@@ -915,6 +451,7 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
915
451
  metricTypes: ReadableArray,
916
452
  activityConfigs: ReadableArray,
917
453
  sleepConfigs: ReadableArray,
454
+ nutritionalFields: ReadableArray,
918
455
  includeEnhancedPermissions: Boolean,
919
456
  includeBackgroundDelivery: Boolean,
920
457
  promise: Promise
@@ -941,12 +478,15 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
941
478
  SleepConfigUtils.fromValue(it as String)
942
479
  }.toSet()
943
480
 
481
+ val nFields = makeNutritionalFields(nutritionalFields)
482
+
944
483
  val permissions = permissionManager
945
484
  .getPermissions(
946
485
  statisticsTypes = statTypes,
947
486
  metricTypes = mTypes,
948
487
  activityConfigs = aConfigs,
949
488
  sleepConfigs = sConfigs,
489
+ nutritionalFields = nFields,
950
490
  includeEnhancedPermissions = includeEnhancedPermissions,
951
491
  includeBackgroundDelivery = includeBackgroundDelivery
952
492
  )
@@ -1090,6 +630,7 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1090
630
  metricTypes: ReadableArray,
1091
631
  activityConfigs: ReadableArray,
1092
632
  sleepConfigs: ReadableArray,
633
+ nutritionalFields: ReadableArray,
1093
634
  promise: Promise
1094
635
  ) {
1095
636
  executeV3MethodWithConnection("enableBackgroundDelivery", connectionUUID, promise) { connection ->
@@ -1116,11 +657,14 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1116
657
  SleepConfigUtils.fromValue(it as String)
1117
658
  }.toSet()
1118
659
 
660
+ val nFields = makeNutritionalFields(nutritionalFields)
661
+
1119
662
  connection.enableBackgroundDelivery(
1120
663
  statisticsTypes = statTypes,
1121
664
  metricTypes = mTypes,
1122
665
  activityConfigs = aConfigs,
1123
- sleepConfigs = sConfigs
666
+ sleepConfigs = sConfigs,
667
+ nutritionalFields = nFields
1124
668
  )
1125
669
 
1126
670
  promise.resolve(true)
@@ -1134,6 +678,7 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1134
678
  metricTypes: ReadableArray,
1135
679
  activityConfigs: ReadableArray,
1136
680
  sleepConfigs: ReadableArray,
681
+ nutritionalFields: ReadableArray,
1137
682
  days: String?,
1138
683
  promise: Promise
1139
684
  ) {
@@ -1154,12 +699,15 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1154
699
  SleepConfigUtils.fromValue(it as String)
1155
700
  }.toSet()
1156
701
 
702
+ val nFields = makeNutritionalFields(nutritionalFields)
703
+
1157
704
  connection.backfill(
1158
705
  days = days?.toIntOrNull(),
1159
706
  statisticsTypes = statTypes,
1160
707
  metricTypes = mTypes,
1161
708
  activityConfigs = aConfigs,
1162
- sleepConfigs = sConfigs
709
+ sleepConfigs = sConfigs,
710
+ nutritionalFields = nFields
1163
711
  )
1164
712
 
1165
713
  promise.resolve(true)
@@ -1204,6 +752,13 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1204
752
  }
1205
753
  }
1206
754
 
755
+ private fun makeNutritionalFields(nutritionalFields: ReadableArray): Set<NutritionalField> {
756
+ return nutritionalFields.toArrayList().mapNotNull { item ->
757
+ val value = item as? String ?: return@mapNotNull null
758
+ NutritionalField.values().find { it.value == value }
759
+ }.toSet()
760
+ }
761
+
1207
762
  /// --- Private stuff ---
1208
763
 
1209
764
  // Do not use this directly, use `addConnection` and `getConnection` instead
@@ -1336,6 +891,7 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1336
891
  metricTypes: ReadableArray,
1337
892
  activityConfigs: ReadableArray,
1338
893
  sleepConfigs: ReadableArray,
894
+ nutritionalFields: ReadableArray,
1339
895
  promise: Promise
1340
896
  ) {
1341
897
  executeV3MethodWithConnection("getSamsungHealthDataPermissions", connectionUUID, promise) { connection ->
@@ -1360,12 +916,15 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1360
916
  SleepConfigUtils.fromValue(it as String)
1361
917
  }.toSet()
1362
918
 
919
+ val nFields = makeNutritionalFields(nutritionalFields)
920
+
1363
921
  val permissions = permissionManager
1364
922
  .getPermissions(
1365
923
  statisticsTypes = statTypes,
1366
924
  metricTypes = mTypes,
1367
925
  activityConfigs = aConfigs,
1368
- sleepConfigs = sConfigs
926
+ sleepConfigs = sConfigs,
927
+ nutritionalFields = nFields
1369
928
  )
1370
929
 
1371
930
  val result = Arguments.createArray()
@@ -1384,6 +943,7 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1384
943
  metricTypes: ReadableArray,
1385
944
  activityConfigs: ReadableArray,
1386
945
  sleepConfigs: ReadableArray,
946
+ nutritionalFields: ReadableArray,
1387
947
  promise: Promise
1388
948
  ) {
1389
949
  executeV3MethodWithConnection("requestPermissionsFromSamsungHealthData", connectionUUID, promise) { connection ->
@@ -1408,8 +968,10 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1408
968
  val sConfigs = sleepConfigs.toArrayList().mapNotNull {
1409
969
  SleepConfigUtils.fromValue(it as String)
1410
970
  }.toSet()
1411
-
1412
- Log.d("SpikeSdkModule", "Will ask for Samsung Health Data permissions with: statTypes=$statTypes, metricTypes=$mTypes, activityConfigs=$aConfigs, sleepConfigs=$sConfigs")
971
+
972
+ val nFields = makeNutritionalFields(nutritionalFields)
973
+
974
+ Log.d("SpikeSdkModule", "Will ask for Samsung Health Data permissions with: statTypes=$statTypes, metricTypes=$mTypes, activityConfigs=$aConfigs, sleepConfigs=$sConfigs, nutritionalFields=$nFields")
1413
975
 
1414
976
  val activity = reactApplicationContext.currentActivity
1415
977
  if (activity == null) {
@@ -1421,7 +983,8 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1421
983
  statisticsTypes = statTypes,
1422
984
  metricTypes = mTypes,
1423
985
  activityConfigs = aConfigs,
1424
- sleepConfigs = sConfigs
986
+ sleepConfigs = sConfigs,
987
+ nutritionalFields = nFields
1425
988
  )
1426
989
 
1427
990
  val result = Arguments.createArray()
@@ -1443,6 +1006,7 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1443
1006
  metricTypes: ReadableArray,
1444
1007
  activityConfigs: ReadableArray,
1445
1008
  sleepConfigs: ReadableArray,
1009
+ nutritionalFields: ReadableArray,
1446
1010
  days: String?,
1447
1011
  promise: Promise
1448
1012
  ) {
@@ -1468,12 +1032,15 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
1468
1032
  SleepConfigUtils.fromValue(it as String)
1469
1033
  }.toSet()
1470
1034
 
1035
+ val nFields = makeNutritionalFields(nutritionalFields)
1036
+
1471
1037
  connection.requestPermissionsFromSamsungHealthDataAndBackfill(
1472
1038
  activity = activity,
1473
1039
  statisticsTypes = statTypes,
1474
1040
  metricTypes = mTypes,
1475
1041
  activityConfigs = aConfigs,
1476
1042
  sleepConfigs = sConfigs,
1043
+ nutritionalFields = nFields,
1477
1044
  backfillDays = days?.toIntOrNull()
1478
1045
  )
1479
1046