react-native-rook-sdk 0.7.0 → 1.0.0-rc.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/android/src/main/java/com/rooksdk/RookSdkModule.kt +51 -597
- package/android/src/main/java/com/rooksdk/RookSdkPackage.kt +17 -1
- package/android/src/main/java/com/rooksdk/broadcasts/AndroidPermissionsReceiverTransmitter.kt +18 -0
- package/android/src/main/java/com/rooksdk/broadcasts/HealthConnectPermissionsReceiverTransmitter.kt +18 -0
- package/android/src/main/java/com/rooksdk/modules/RookConfigurationModule.kt +108 -0
- package/android/src/main/java/com/rooksdk/modules/RookPermissionsModule.kt +160 -0
- package/android/src/main/java/com/rooksdk/modules/RookStepsModule.kt +105 -0
- package/android/src/main/java/com/rooksdk/modules/RookSyncModule.kt +497 -0
- package/android/src/main/java/com/rooksdk/utils/DatasourcesUtils.kt +49 -0
- package/android/src/main/java/com/rooksdk/utils/ReadableToWritable.kt +20 -0
- package/android/src/main/java/com/rooksdk/utils/RookDateTime.kt +8 -0
- package/ios/RookSdk.mm +296 -8
- package/lib/commonjs/context/RookSyncGateContext.js +12 -0
- package/lib/commonjs/context/RookSyncGateContext.js.map +1 -1
- package/lib/commonjs/context/RookSyncGateProvider.js +12 -5
- package/lib/commonjs/context/RookSyncGateProvider.js.map +1 -1
- package/lib/commonjs/context/RookSyncGateReducer.js +15 -0
- package/lib/commonjs/context/RookSyncGateReducer.js.map +1 -1
- package/lib/commonjs/hooks/useRookAndroidBackgroundSteps.js +26 -41
- package/lib/commonjs/hooks/useRookAndroidBackgroundSteps.js.map +1 -1
- package/lib/commonjs/hooks/useRookAppleHealth.js +24 -10
- package/lib/commonjs/hooks/useRookAppleHealth.js.map +1 -1
- package/lib/commonjs/hooks/useRookAppleHealthVariables.js +22 -4
- package/lib/commonjs/hooks/useRookAppleHealthVariables.js.map +1 -1
- package/lib/commonjs/hooks/useRookConfiguration.js +32 -16
- package/lib/commonjs/hooks/useRookConfiguration.js.map +1 -1
- package/lib/commonjs/hooks/useRookDataSources.js +18 -5
- package/lib/commonjs/hooks/useRookDataSources.js.map +1 -1
- package/lib/commonjs/hooks/useRookEvents.js +61 -57
- package/lib/commonjs/hooks/useRookEvents.js.map +1 -1
- package/lib/commonjs/hooks/useRookPermissions.js +59 -28
- package/lib/commonjs/hooks/useRookPermissions.js.map +1 -1
- package/lib/commonjs/hooks/useRookSummaries.js +23 -30
- package/lib/commonjs/hooks/useRookSummaries.js.map +1 -1
- package/lib/commonjs/modules/hook/useRookAutoSync.js +100 -32
- package/lib/commonjs/modules/hook/useRookAutoSync.js.map +1 -1
- package/lib/commonjs/types/PermissionsType.js +2 -0
- package/lib/commonjs/types/PermissionsType.js.map +1 -0
- package/lib/commonjs/utils/getNativeModule.js +29 -0
- package/lib/commonjs/utils/getNativeModule.js.map +1 -0
- package/lib/commonjs/utils/getRookModule.js +7 -0
- package/lib/commonjs/utils/getRookModule.js.map +1 -1
- package/lib/commonjs/utils/isModuleReady.js +6 -0
- package/lib/commonjs/utils/isModuleReady.js.map +1 -1
- package/lib/commonjs/utils/isValidDate.js +6 -0
- package/lib/commonjs/utils/isValidDate.js.map +1 -1
- package/lib/commonjs/utils/nativeModules.js +19 -0
- package/lib/commonjs/utils/nativeModules.js.map +1 -0
- package/lib/module/context/RookSyncGateContext.js +12 -0
- package/lib/module/context/RookSyncGateContext.js.map +1 -1
- package/lib/module/context/RookSyncGateProvider.js +8 -1
- package/lib/module/context/RookSyncGateProvider.js.map +1 -1
- package/lib/module/context/RookSyncGateReducer.js +15 -0
- package/lib/module/context/RookSyncGateReducer.js.map +1 -1
- package/lib/module/hooks/useRookAndroidBackgroundSteps.js +14 -29
- package/lib/module/hooks/useRookAndroidBackgroundSteps.js.map +1 -1
- package/lib/module/hooks/useRookAppleHealth.js +15 -2
- package/lib/module/hooks/useRookAppleHealth.js.map +1 -1
- package/lib/module/hooks/useRookAppleHealthVariables.js +20 -2
- package/lib/module/hooks/useRookAppleHealthVariables.js.map +1 -1
- package/lib/module/hooks/useRookConfiguration.js +18 -3
- package/lib/module/hooks/useRookConfiguration.js.map +1 -1
- package/lib/module/hooks/useRookDataSources.js +14 -2
- package/lib/module/hooks/useRookDataSources.js.map +1 -1
- package/lib/module/hooks/useRookEvents.js +32 -28
- package/lib/module/hooks/useRookEvents.js.map +1 -1
- package/lib/module/hooks/useRookPermissions.js +39 -9
- package/lib/module/hooks/useRookPermissions.js.map +1 -1
- package/lib/module/hooks/useRookSummaries.js +16 -23
- package/lib/module/hooks/useRookSummaries.js.map +1 -1
- package/lib/module/modules/hook/useRookAutoSync.js +100 -33
- package/lib/module/modules/hook/useRookAutoSync.js.map +1 -1
- package/lib/module/types/PermissionsType.js +2 -0
- package/lib/module/types/PermissionsType.js.map +1 -0
- package/lib/module/utils/getNativeModule.js +23 -0
- package/lib/module/utils/getNativeModule.js.map +1 -0
- package/lib/module/utils/getRookModule.js +8 -0
- package/lib/module/utils/getRookModule.js.map +1 -1
- package/lib/module/utils/isModuleReady.js +6 -0
- package/lib/module/utils/isModuleReady.js.map +1 -1
- package/lib/module/utils/isValidDate.js +6 -0
- package/lib/module/utils/isValidDate.js.map +1 -1
- package/lib/module/utils/nativeModules.js +13 -0
- package/lib/module/utils/nativeModules.js.map +1 -0
- package/lib/typescript/src/context/RookSyncGateContext.d.ts +7 -0
- package/lib/typescript/src/context/RookSyncGateContext.d.ts.map +1 -1
- package/lib/typescript/src/context/RookSyncGateProvider.d.ts.map +1 -1
- package/lib/typescript/src/context/RookSyncGateReducer.d.ts +15 -0
- package/lib/typescript/src/context/RookSyncGateReducer.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookAndroidBackgroundSteps.d.ts +6 -2
- package/lib/typescript/src/hooks/useRookAndroidBackgroundSteps.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookAppleHealth.d.ts +1 -1
- package/lib/typescript/src/hooks/useRookAppleHealth.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookAppleHealthVariables.d.ts +9 -0
- package/lib/typescript/src/hooks/useRookAppleHealthVariables.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookConfiguration.d.ts +6 -0
- package/lib/typescript/src/hooks/useRookConfiguration.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookDataSources.d.ts +6 -0
- package/lib/typescript/src/hooks/useRookDataSources.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookEvents.d.ts +9 -1
- package/lib/typescript/src/hooks/useRookEvents.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookPermissions.d.ts +10 -0
- package/lib/typescript/src/hooks/useRookPermissions.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookSummaries.d.ts +6 -6
- package/lib/typescript/src/hooks/useRookSummaries.d.ts.map +1 -1
- package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts +16 -0
- package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts.map +1 -1
- package/lib/typescript/src/types/PermissionsType.d.ts +6 -0
- package/lib/typescript/src/types/PermissionsType.d.ts.map +1 -0
- package/lib/typescript/src/utils/getNativeModule.d.ts +10 -0
- package/lib/typescript/src/utils/getNativeModule.d.ts.map +1 -0
- package/lib/typescript/src/utils/getRookModule.d.ts +7 -0
- package/lib/typescript/src/utils/getRookModule.d.ts.map +1 -1
- package/lib/typescript/src/utils/isModuleReady.d.ts +6 -0
- package/lib/typescript/src/utils/isModuleReady.d.ts.map +1 -1
- package/lib/typescript/src/utils/isValidDate.d.ts +6 -0
- package/lib/typescript/src/utils/isValidDate.d.ts.map +1 -1
- package/lib/typescript/src/utils/nativeModules.d.ts +14 -0
- package/lib/typescript/src/utils/nativeModules.d.ts.map +1 -0
- package/package.json +1 -1
- package/react-native-rook-sdk.podspec +1 -1
- package/lib/commonjs/utils/index.js +0 -69
- package/lib/commonjs/utils/index.js.map +0 -1
- package/lib/module/utils/index.js +0 -9
- package/lib/module/utils/index.js.map +0 -1
- package/lib/typescript/src/utils/index.d.ts +0 -9
- package/lib/typescript/src/utils/index.d.ts.map +0 -1
|
@@ -18,6 +18,7 @@ import com.rookmotion.rook.sdk.RookPermissionsManager
|
|
|
18
18
|
import com.rookmotion.rook.sdk.RookStepsManager
|
|
19
19
|
import com.rookmotion.rook.sdk.RookSummaryManager
|
|
20
20
|
import com.rookmotion.rook.sdk.RookYesterdaySyncManager
|
|
21
|
+
import com.rookmotion.rook.sdk.domain.enums.DataSourceType
|
|
21
22
|
import com.rookmotion.rook.sdk.domain.enums.HealthConnectAvailability
|
|
22
23
|
import com.rookmotion.rook.sdk.domain.environment.RookAndroidClass
|
|
23
24
|
import com.rookmotion.rook.sdk.domain.environment.RookEnvironment
|
|
@@ -37,31 +38,41 @@ import kotlinx.coroutines.SupervisorJob
|
|
|
37
38
|
import kotlinx.coroutines.cancel
|
|
38
39
|
import kotlinx.coroutines.launch
|
|
39
40
|
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
/**
|
|
42
|
+
* The `RookSdkHealthConnectModule` class is a React Native module that interfaces
|
|
43
|
+
* with the Rook SDK for managing and syncing health data using Android's Health Connect.
|
|
44
|
+
* It provides methods for initializing the SDK, handling user configuration, syncing
|
|
45
|
+
* health data, and managing permissions.
|
|
46
|
+
*
|
|
47
|
+
* Main Responsibilities:
|
|
48
|
+
* - Initialize and configure the Rook SDK.
|
|
49
|
+
* - Manage user-related information such as user ID.
|
|
50
|
+
* - Sync health-related summaries and events (e.g., sleep, body metrics, physical activities).
|
|
51
|
+
* - Handle Health Connect permissions and check availability.
|
|
52
|
+
* - Transmit permission changes through Android and Health Connect.
|
|
53
|
+
* - Provide the ability to listen to permission changes using Android broadcast receivers.
|
|
54
|
+
* - Expose methods to JavaScript for requesting or syncing data.
|
|
55
|
+
*
|
|
56
|
+
* Key Components:
|
|
57
|
+
* - `RookConfigurationManager`: Manages configuration settings for the SDK.
|
|
58
|
+
* - `RookSummaryManager`: Handles syncing health data summaries (e.g., sleep, physical, body).
|
|
59
|
+
* - `RookEventManager`: Manages the synchronization of health-related events (e.g., physical activities, blood pressure, etc.).
|
|
60
|
+
* - `RookPermissionsManager`: Handles permission management and availability checks for Health Connect.
|
|
61
|
+
* - `RookStepsManager`: Manages steps data synchronization.
|
|
62
|
+
* - `CoroutineScope`: Used to launch asynchronous operations.
|
|
63
|
+
*/
|
|
64
|
+
class RookSdkModule(
|
|
65
|
+
reactContext: ReactApplicationContext,
|
|
66
|
+
private val rookConfigurationManager: RookConfigurationManager
|
|
67
|
+
): ReactContextBaseJavaModule(reactContext) {
|
|
42
68
|
|
|
43
|
-
private val rookConfigurationManager = RookConfigurationManager(reactApplicationContext)
|
|
44
|
-
private val rookSummaryManager = RookSummaryManager(rookConfigurationManager)
|
|
45
|
-
private val rookEventManager = RookEventManager(rookConfigurationManager)
|
|
46
69
|
private var scope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
|
47
70
|
private var listenerCount = 0
|
|
48
71
|
|
|
49
|
-
private val rookSynManager: RookYesterdaySyncManager by lazy {
|
|
50
|
-
RookYesterdaySyncManager(reactApplicationContext)
|
|
51
|
-
}
|
|
52
|
-
|
|
53
72
|
private val stepsScope: CoroutineScope by lazy {
|
|
54
73
|
CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
|
55
74
|
}
|
|
56
75
|
|
|
57
|
-
private val rookStepsManager: RookStepsManager by lazy {
|
|
58
|
-
RookStepsManager(reactApplicationContext)
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
private val rookPermissionsManager: RookPermissionsManager by lazy {
|
|
62
|
-
RookPermissionsManager(reactApplicationContext)
|
|
63
|
-
}
|
|
64
|
-
|
|
65
76
|
private val androidPermissionsReceiverTransmitter: AndroidPermissionsReceiverTransmitter by lazy {
|
|
66
77
|
AndroidPermissionsReceiverTransmitter()
|
|
67
78
|
}
|
|
@@ -109,106 +120,22 @@ class RookSdkModule(reactContext: ReactApplicationContext) :
|
|
|
109
120
|
}
|
|
110
121
|
}
|
|
111
122
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
"BLOOD_PRESSURE_EVENT" -> HealthDataType.BLOOD_PRESSURE_BODY_EVENT
|
|
119
|
-
"BODY_METRICS_EVENT" -> HealthDataType.BODY_METRICS_EVENT
|
|
120
|
-
"HEART_RATE_EVENT" -> HealthDataType.HEART_RATE_BODY_EVENT
|
|
121
|
-
"HYDRATION_EVENT" -> HealthDataType.HYDRATION_BODY_EVENT
|
|
122
|
-
"NUTRITION_EVENT" -> HealthDataType.NUTRITION_BODY_EVENT
|
|
123
|
-
"OXYGENATION_EVENT" -> HealthDataType.OXYGENATION_BODY_EVENT
|
|
124
|
-
"PHYSICAL_EVENT" -> HealthDataType.PHYSICAL_EVENT
|
|
125
|
-
"TEMPERATURE_EVENT" -> HealthDataType.TEMPERATURE_BODY_EVENT
|
|
126
|
-
else -> HealthDataType.SLEEP_SUMMARY
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
private fun dataSourcesToWritableArray(dataSources: List<DataSource>): WritableArray {
|
|
131
|
-
val array = Arguments.createArray()
|
|
132
|
-
for (dataSource in dataSources) {
|
|
133
|
-
val map = Arguments.createMap()
|
|
134
|
-
map.putString("name", dataSource.name)
|
|
135
|
-
map.putString("description", dataSource.description)
|
|
136
|
-
map.putString("imageUrl", dataSource.image)
|
|
137
|
-
map.putBoolean("connected", dataSource.connected)
|
|
138
|
-
dataSource.authorizationUrl?.let {
|
|
139
|
-
map.putString("authorizationUrl", it)
|
|
140
|
-
}
|
|
141
|
-
array.pushMap(map)
|
|
142
|
-
}
|
|
143
|
-
return array
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
@ReactMethod
|
|
147
|
-
fun getUserID(promise: Promise) {
|
|
148
|
-
scope.launch {
|
|
149
|
-
try {
|
|
150
|
-
promise.resolve(rookConfigurationManager.getUserID())
|
|
151
|
-
}
|
|
152
|
-
catch (e: Exception) {
|
|
153
|
-
promise.reject(e)
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
@ReactMethod
|
|
159
|
-
fun updateUserID(userID: String, promise: Promise) {
|
|
160
|
-
scope.launch {
|
|
161
|
-
rookConfigurationManager.updateUserID(userID)
|
|
162
|
-
.fold({
|
|
163
|
-
promise.resolve(true)
|
|
164
|
-
}, {
|
|
165
|
-
promise.reject(it)
|
|
166
|
-
})
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
@ReactMethod
|
|
171
|
-
fun clearUserID(promise: Promise) {
|
|
172
|
-
scope.launch {
|
|
173
|
-
rookConfigurationManager.clearUserID().fold({
|
|
174
|
-
promise.resolve(true)
|
|
175
|
-
}, {
|
|
176
|
-
promise.reject(it)
|
|
177
|
-
})
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
@ReactMethod
|
|
182
|
-
fun removeUserFromRook(promise: Promise) {
|
|
183
|
-
scope.launch {
|
|
184
|
-
val result = rookConfigurationManager.deleteUserFromRook()
|
|
185
|
-
|
|
186
|
-
result.fold({
|
|
187
|
-
promise.resolve(true)
|
|
188
|
-
}, {
|
|
189
|
-
promise.reject(it)
|
|
190
|
-
})
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
@ReactMethod
|
|
195
|
-
fun syncUserTimeZone(promise: Promise) {
|
|
196
|
-
scope.launch {
|
|
197
|
-
val result = rookConfigurationManager.syncUserTimeZone()
|
|
198
|
-
|
|
199
|
-
result.fold({
|
|
200
|
-
promise.resolve(true)
|
|
201
|
-
}, {
|
|
202
|
-
promise.reject(it)
|
|
203
|
-
})
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
123
|
+
/**
|
|
124
|
+
* Initializes the Rook SDK with the specified configuration settings (environment, clientUUID, secretKey).
|
|
125
|
+
* This is required before any data synchronization or user management can occur.
|
|
126
|
+
* @param config A map containing the environment, clientUUID, secretKey, and other settings.
|
|
127
|
+
* @param promise A promise object to handle the result (resolved on success, rejected on failure).
|
|
128
|
+
*/
|
|
209
129
|
@ReactMethod
|
|
210
130
|
fun initRook(config: ReadableMap,promise: Promise) {
|
|
211
131
|
try {
|
|
132
|
+
val clientUUID = config.getString("clientUUID")?.trim() ?: ""
|
|
133
|
+
val secretKey = config.getString("password")?.trim() ?: ""
|
|
134
|
+
|
|
135
|
+
if (clientUUID.isBlank() || secretKey.isBlank()) {
|
|
136
|
+
promise.reject("Invalid Credentials", "Invalid credentials")
|
|
137
|
+
return
|
|
138
|
+
}
|
|
212
139
|
|
|
213
140
|
var environment = RookEnvironment.SANDBOX
|
|
214
141
|
|
|
@@ -220,8 +147,8 @@ class RookSdkModule(reactContext: ReactApplicationContext) :
|
|
|
220
147
|
|
|
221
148
|
val rookConfiguration = RookConfiguration(
|
|
222
149
|
environment = environment,
|
|
223
|
-
clientUUID =
|
|
224
|
-
secretKey =
|
|
150
|
+
clientUUID = clientUUID,
|
|
151
|
+
secretKey = secretKey
|
|
225
152
|
)
|
|
226
153
|
|
|
227
154
|
val enableLogs = config.getBoolean("enableLogs")
|
|
@@ -248,487 +175,14 @@ class RookSdkModule(reactContext: ReactApplicationContext) :
|
|
|
248
175
|
|
|
249
176
|
}
|
|
250
177
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
try {
|
|
262
|
-
val r = RookPermissionsManager.shouldRequestAndroidPermissions(activity)
|
|
263
|
-
promise.resolve(r)
|
|
264
|
-
}
|
|
265
|
-
catch (e: Exception) {
|
|
266
|
-
promise.reject(e)
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
@ReactMethod
|
|
271
|
-
fun checkAvailability(promise: Promise) {
|
|
272
|
-
|
|
273
|
-
val r = rookPermissionsManager.checkHealthConnectAvailability()
|
|
274
|
-
|
|
275
|
-
when(r) {
|
|
276
|
-
HealthConnectAvailability.INSTALLED -> promise.resolve("INSTALED")
|
|
277
|
-
HealthConnectAvailability.NOT_INSTALLED -> promise.resolve("NOT_INSTALED")
|
|
278
|
-
HealthConnectAvailability.NOT_SUPPORTED -> promise.resolve("NOT_SUPPORTED")
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
@ReactMethod
|
|
284
|
-
fun openHealthConnectSettings(promise: Promise) {
|
|
285
|
-
scope.launch {
|
|
286
|
-
|
|
287
|
-
val result = rookPermissionsManager.openHealthConnectSettings()
|
|
288
|
-
|
|
289
|
-
result.fold({
|
|
290
|
-
promise.resolve(true)
|
|
291
|
-
},{
|
|
292
|
-
promise.reject(it)
|
|
293
|
-
})
|
|
294
|
-
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
@ReactMethod
|
|
299
|
-
fun checkPermissions(promise: Promise) {
|
|
300
|
-
scope.launch {
|
|
301
|
-
val result = rookPermissionsManager.checkHealthConnectPermissions()
|
|
302
|
-
|
|
303
|
-
result.fold({
|
|
304
|
-
promise.resolve(it)
|
|
305
|
-
}, {
|
|
306
|
-
promise.reject(it)
|
|
307
|
-
})
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
@ReactMethod
|
|
312
|
-
fun requestPermissions(promise: Promise) {
|
|
313
|
-
scope.launch {
|
|
314
|
-
rookPermissionsManager.requestHealthConnectPermissions().fold({
|
|
315
|
-
when(it) {
|
|
316
|
-
RequestPermissionsStatus.REQUEST_SENT -> {
|
|
317
|
-
promise.resolve("REQUEST_SENT")
|
|
318
|
-
}
|
|
319
|
-
RequestPermissionsStatus .ALREADY_GRANTED -> {
|
|
320
|
-
promise.resolve("ALREADY_GRANTED")
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
}, {
|
|
324
|
-
promise.reject(it)
|
|
325
|
-
})
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
// MARK: - Sync Summaries
|
|
330
|
-
@ReactMethod
|
|
331
|
-
fun shouldSyncFor(summaryString: String, date: String,promise: Promise) {
|
|
332
|
-
scope.launch {
|
|
333
|
-
RookHelpers.shouldSyncFor(
|
|
334
|
-
healthDataType = determineSummaryValue(summaryString),
|
|
335
|
-
localDate = RookDateTime.stringToLocalDate(date)
|
|
336
|
-
).fold({
|
|
337
|
-
promise.resolve(it)
|
|
338
|
-
},{
|
|
339
|
-
promise.reject(it)
|
|
340
|
-
})
|
|
341
|
-
}
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
@ReactMethod
|
|
345
|
-
fun syncSleepSummary(date: String, promise: Promise) {
|
|
346
|
-
scope.launch {
|
|
347
|
-
val result = rookSummaryManager.syncSleepSummary(RookDateTime.stringToLocalDate(date))
|
|
348
|
-
|
|
349
|
-
result.fold({
|
|
350
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
351
|
-
else promise.resolve(false)
|
|
352
|
-
}, {
|
|
353
|
-
promise.reject(it)
|
|
354
|
-
})
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
// Body
|
|
359
|
-
@ReactMethod
|
|
360
|
-
fun syncBodySummary(date: String, promise: Promise) {
|
|
361
|
-
scope.launch {
|
|
362
|
-
val result = rookSummaryManager.syncBodySummary(RookDateTime.stringToLocalDate(date))
|
|
363
|
-
|
|
364
|
-
result.fold({
|
|
365
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
366
|
-
else promise.resolve(false)
|
|
367
|
-
}, {
|
|
368
|
-
promise.reject(it)
|
|
369
|
-
})
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
// Physical
|
|
374
|
-
@ReactMethod
|
|
375
|
-
fun syncPhysicalSummary(date: String, promise: Promise) {
|
|
376
|
-
scope.launch {
|
|
377
|
-
val result = rookSummaryManager.syncPhysicalSummary(RookDateTime.stringToLocalDate(date))
|
|
378
|
-
|
|
379
|
-
result.fold({
|
|
380
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
381
|
-
else promise.resolve(false)
|
|
382
|
-
}, {
|
|
383
|
-
promise.reject(it)
|
|
384
|
-
})
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
@ReactMethod
|
|
389
|
-
fun syncPendingSummaries(promise: Promise) {
|
|
390
|
-
scope.launch {
|
|
391
|
-
val result = rookSummaryManager.syncPendingSummaries()
|
|
392
|
-
|
|
393
|
-
result.fold({
|
|
394
|
-
promise.resolve(true)
|
|
395
|
-
}, {
|
|
396
|
-
promise.reject(it)
|
|
397
|
-
})
|
|
398
|
-
}
|
|
399
|
-
}
|
|
400
|
-
|
|
401
|
-
// MARK: - Events
|
|
402
|
-
@ReactMethod
|
|
403
|
-
fun syncPhysicalEvents(date: String, promise: Promise) {
|
|
404
|
-
scope.launch {
|
|
405
|
-
val result = rookEventManager.syncPhysicalEvents(RookDateTime.stringToLocalDate(date))
|
|
406
|
-
|
|
407
|
-
result.fold({
|
|
408
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
409
|
-
else promise.resolve(false)
|
|
410
|
-
}, {
|
|
411
|
-
promise.reject(it)
|
|
412
|
-
})
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
@ReactMethod
|
|
417
|
-
fun syncBloodGlucoseEvents(date: String, promise: Promise) {
|
|
418
|
-
scope.launch {
|
|
419
|
-
val result = rookEventManager.syncBloodGlucoseEvents(RookDateTime.stringToLocalDate(date))
|
|
420
|
-
|
|
421
|
-
result.fold({
|
|
422
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
423
|
-
else promise.resolve(false)
|
|
424
|
-
}, {
|
|
425
|
-
promise.reject(it)
|
|
426
|
-
})
|
|
427
|
-
}
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
@ReactMethod
|
|
431
|
-
fun syncBloodPressureEvents(date: String, promise: Promise) {
|
|
432
|
-
scope.launch {
|
|
433
|
-
val result = rookEventManager.syncBloodPressureEvents(RookDateTime.stringToLocalDate(date))
|
|
434
|
-
|
|
435
|
-
result.fold({
|
|
436
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
437
|
-
else promise.resolve(false)
|
|
438
|
-
}, {
|
|
439
|
-
promise.reject(it)
|
|
440
|
-
})
|
|
441
|
-
}
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
@ReactMethod
|
|
445
|
-
fun syncBodyMetricsEvent(date: String, promise: Promise) {
|
|
446
|
-
scope.launch {
|
|
447
|
-
val result = rookEventManager.syncBodyMetricsEvents(RookDateTime.stringToLocalDate(date))
|
|
448
|
-
|
|
449
|
-
result.fold({
|
|
450
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
451
|
-
else promise.resolve(false)
|
|
452
|
-
}, {
|
|
453
|
-
promise.reject(it)
|
|
454
|
-
})
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
@ReactMethod
|
|
459
|
-
fun syncBodyHeartRateEvent(date: String, promise: Promise) {
|
|
460
|
-
scope.launch {
|
|
461
|
-
val result = rookEventManager.syncBodyHeartRateEvents(RookDateTime.stringToLocalDate(date))
|
|
462
|
-
|
|
463
|
-
result.fold({
|
|
464
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
465
|
-
else promise.resolve(false)
|
|
466
|
-
}, {
|
|
467
|
-
promise.reject(it)
|
|
468
|
-
})
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
@ReactMethod
|
|
473
|
-
fun syncPhysicalHeartRateEvent(date: String, promise: Promise) {
|
|
474
|
-
scope.launch {
|
|
475
|
-
val result = rookEventManager.syncPhysicalHeartRateEvents(RookDateTime.stringToLocalDate(date))
|
|
476
|
-
|
|
477
|
-
result.fold({
|
|
478
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
479
|
-
else promise.resolve(false)
|
|
480
|
-
}, {
|
|
481
|
-
promise.reject(it)
|
|
482
|
-
})
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
|
-
|
|
486
|
-
@ReactMethod
|
|
487
|
-
fun syncNutritionEvents(date: String, promise: Promise) {
|
|
488
|
-
scope.launch {
|
|
489
|
-
val result = rookEventManager.syncNutritionEvents(RookDateTime.stringToLocalDate(date))
|
|
490
|
-
|
|
491
|
-
result.fold({
|
|
492
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
493
|
-
else promise.resolve(false)
|
|
494
|
-
}, {
|
|
495
|
-
promise.reject(it)
|
|
496
|
-
})
|
|
497
|
-
}
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
@ReactMethod
|
|
501
|
-
fun syncHydrationEvents(date: String, promise: Promise) {
|
|
502
|
-
scope.launch {
|
|
503
|
-
val result = rookEventManager.syncHydrationEvents(RookDateTime.stringToLocalDate(date))
|
|
504
|
-
|
|
505
|
-
result.fold({
|
|
506
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
507
|
-
else promise.resolve(false)
|
|
508
|
-
}, {
|
|
509
|
-
promise.reject(it)
|
|
510
|
-
})
|
|
511
|
-
}
|
|
512
|
-
}
|
|
513
|
-
@ReactMethod
|
|
514
|
-
fun syncPhysicalOxygenationEvent(date: String, promise: Promise) {
|
|
515
|
-
scope.launch {
|
|
516
|
-
val result = rookEventManager.syncPhysicalOxygenationEvents(RookDateTime.stringToLocalDate(date))
|
|
517
|
-
|
|
518
|
-
result.fold({
|
|
519
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
520
|
-
else promise.resolve(false)
|
|
521
|
-
}, {
|
|
522
|
-
promise.reject(it)
|
|
523
|
-
})
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
|
|
527
|
-
@ReactMethod
|
|
528
|
-
fun syncBodyOxygenationEvent(date: String, promise: Promise) {
|
|
529
|
-
scope.launch {
|
|
530
|
-
val result = rookEventManager.syncBodyOxygenationEvents(RookDateTime.stringToLocalDate(date))
|
|
531
|
-
|
|
532
|
-
result.fold({
|
|
533
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
534
|
-
else promise.resolve(false)
|
|
535
|
-
}, {
|
|
536
|
-
promise.reject(it)
|
|
537
|
-
})
|
|
538
|
-
}
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
@ReactMethod
|
|
542
|
-
fun syncTemperatureEvent(date: String, promise: Promise) {
|
|
543
|
-
scope.launch {
|
|
544
|
-
val result = rookEventManager
|
|
545
|
-
.syncTemperatureEvents(RookDateTime.stringToLocalDate(date))
|
|
546
|
-
|
|
547
|
-
result.fold({
|
|
548
|
-
if (it == SyncStatus.SYNCED) promise.resolve(true)
|
|
549
|
-
else promise.resolve(false)
|
|
550
|
-
}, {
|
|
551
|
-
promise.reject(it)
|
|
552
|
-
})
|
|
553
|
-
}
|
|
554
|
-
}
|
|
555
|
-
|
|
556
|
-
@ReactMethod
|
|
557
|
-
fun syncPendingEvents(promise: Promise) {
|
|
558
|
-
scope.launch {
|
|
559
|
-
val result = rookEventManager.syncPendingEvents()
|
|
560
|
-
|
|
561
|
-
result.fold({
|
|
562
|
-
promise.resolve(true)
|
|
563
|
-
}, {
|
|
564
|
-
promise.reject(it)
|
|
565
|
-
})
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
// MARK: - Health Connect Background
|
|
570
|
-
@ReactMethod
|
|
571
|
-
fun scheduleYesterdaySync(config: ReadableMap, promise: Promise) {
|
|
572
|
-
scope.launch {
|
|
573
|
-
try {
|
|
574
|
-
var environment = RookEnvironment.SANDBOX
|
|
575
|
-
|
|
576
|
-
if (config.getString("environment") == "production")
|
|
577
|
-
environment = RookEnvironment.PRODUCTION
|
|
578
|
-
|
|
579
|
-
rookSynManager.scheduleYesterdaySync(
|
|
580
|
-
enableLogs = true,
|
|
581
|
-
clientUUID = config.getString("clientUUID") ?: "",
|
|
582
|
-
secretKey = config.getString(",") ?: "",
|
|
583
|
-
environment = environment,
|
|
584
|
-
)
|
|
585
|
-
|
|
586
|
-
promise.resolve(true)
|
|
587
|
-
|
|
588
|
-
}
|
|
589
|
-
catch (e: Exception) {
|
|
590
|
-
promise.reject(e)
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
@ReactMethod
|
|
597
|
-
fun requestAndroidBackgroundPermissions(promise: Promise) {
|
|
598
|
-
try {
|
|
599
|
-
val response = rookPermissionsManager.requestAndroidPermissions()
|
|
600
|
-
|
|
601
|
-
if (response == RequestPermissionsStatus.REQUEST_SENT)
|
|
602
|
-
promise.resolve("REQUEST_SENT")
|
|
603
|
-
else promise.resolve("ALREADY_GRANTED")
|
|
604
|
-
}
|
|
605
|
-
catch (e: Exception) {
|
|
606
|
-
promise.reject(e)
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
|
|
610
|
-
@ReactMethod
|
|
611
|
-
fun hasAndroidBackgroundPermissions(promise: Promise) {
|
|
612
|
-
try {
|
|
613
|
-
val result = rookPermissionsManager.checkAndroidPermissions()
|
|
614
|
-
promise.resolve(result)
|
|
615
|
-
}
|
|
616
|
-
catch (e: Exception) {
|
|
617
|
-
promise.reject(e)
|
|
618
|
-
}
|
|
619
|
-
}
|
|
620
|
-
|
|
621
|
-
// MARK: - Steps
|
|
622
|
-
@ReactMethod
|
|
623
|
-
fun isStepsAvailable(promise: Promise) {
|
|
624
|
-
promise.resolve(rookStepsManager.isAvailable())
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
@ReactMethod
|
|
628
|
-
fun hasStepsPermissions(promise: Promise) {
|
|
629
|
-
promise.resolve(rookPermissionsManager.checkAndroidPermissions())
|
|
630
|
-
}
|
|
631
|
-
|
|
632
|
-
@ReactMethod
|
|
633
|
-
fun enableBackgroundAndroidSteps(promise: Promise) {
|
|
634
|
-
rookStepsManager.enableBackgroundAndroidSteps().fold({
|
|
635
|
-
promise.resolve(true)
|
|
636
|
-
}, {
|
|
637
|
-
promise.reject(it)
|
|
638
|
-
})
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
@ReactMethod
|
|
642
|
-
fun disableBackgroundAndroidSteps(promise: Promise) {
|
|
643
|
-
rookStepsManager
|
|
644
|
-
.disableBackgroundAndroidSteps()
|
|
645
|
-
.fold({
|
|
646
|
-
stepsScope.cancel()
|
|
647
|
-
promise.resolve(true)
|
|
648
|
-
}, {
|
|
649
|
-
promise.reject(it)
|
|
650
|
-
})
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
@ReactMethod
|
|
654
|
-
fun isBackgroundAndroidStepsActive(promise: Promise) {
|
|
655
|
-
scope.launch {
|
|
656
|
-
val response = rookStepsManager.isBackgroundAndroidStepsActive()
|
|
657
|
-
promise.resolve(response)
|
|
658
|
-
}
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
@ReactMethod
|
|
662
|
-
fun syncTodayAndroidStepsCount(promise: Promise) {
|
|
663
|
-
scope.launch {
|
|
664
|
-
rookStepsManager
|
|
665
|
-
.syncTodayAndroidStepsCount()
|
|
666
|
-
.fold({
|
|
667
|
-
promise.resolve(it.toString())
|
|
668
|
-
}, {
|
|
669
|
-
promise.reject(it)
|
|
670
|
-
})
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
@ReactMethod
|
|
675
|
-
fun syncTodayHealthConnectStepsCount(promise: Promise) {
|
|
676
|
-
scope.launch {
|
|
677
|
-
rookEventManager.syncTodayHealthConnectStepsCount().fold(
|
|
678
|
-
{
|
|
679
|
-
when (it) {
|
|
680
|
-
SyncStatusWithData.RecordsNotFound -> {
|
|
681
|
-
promise.reject("syncTodayHealthConnect", "Records Not Found")
|
|
682
|
-
}
|
|
683
|
-
|
|
684
|
-
is SyncStatusWithData.Synced -> {
|
|
685
|
-
val steps = it.data
|
|
686
|
-
promise.resolve(steps)
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
},
|
|
690
|
-
{
|
|
691
|
-
promise.reject(it)
|
|
692
|
-
}
|
|
693
|
-
)
|
|
694
|
-
}
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
// MARK: - Datasources
|
|
698
|
-
@ReactMethod
|
|
699
|
-
fun getAvailableDataSources(options: ReadableMap?, promise: Promise) {
|
|
700
|
-
val rookDataSources = RookDataSources(reactApplicationContext)
|
|
701
|
-
println(options)
|
|
702
|
-
var redirectURL: String? = null
|
|
703
|
-
|
|
704
|
-
if (options !== null) redirectURL = options.getString("redirectURL")
|
|
705
|
-
|
|
706
|
-
scope.launch {
|
|
707
|
-
rookDataSources.getAvailableDataSources(redirectURL).fold(
|
|
708
|
-
{ dataSources ->
|
|
709
|
-
promise.resolve(dataSourcesToWritableArray(dataSources))
|
|
710
|
-
},
|
|
711
|
-
{
|
|
712
|
-
promise.reject(it)
|
|
713
|
-
},
|
|
714
|
-
)
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
|
|
718
|
-
@ReactMethod
|
|
719
|
-
fun presentDataSourceView(options: ReadableMap?, promise: Promise) {
|
|
720
|
-
val rookDataSources = RookDataSources(reactApplicationContext)
|
|
721
|
-
var redirectURL: String? = null
|
|
722
|
-
|
|
723
|
-
if (options !== null) redirectURL = options.getString("redirectURL")
|
|
724
|
-
|
|
725
|
-
rookDataSources.presentDataSourceView(redirectURL).fold({
|
|
726
|
-
promise.resolve(true)
|
|
727
|
-
}, {
|
|
728
|
-
promise.reject(it)
|
|
729
|
-
})
|
|
730
|
-
}
|
|
731
|
-
|
|
178
|
+
/**
|
|
179
|
+
* Sends a broadcast message to the React Native layer.
|
|
180
|
+
* This method emits a message event to the React Native side via the
|
|
181
|
+
* `ROOK_NOTIFICATION` channel, allowing communication from the native module.
|
|
182
|
+
*
|
|
183
|
+
* @param message A ReadableMap containing the message data to send.
|
|
184
|
+
* @param promise A promise object that resolves with true if the message was sent successfully.
|
|
185
|
+
*/
|
|
732
186
|
@ReactMethod
|
|
733
187
|
fun sendMessageToBroadcast(message: ReadableMap, promise: Promise) {
|
|
734
188
|
if (listenerCount <= 0) return
|
|
@@ -4,11 +4,27 @@ import com.facebook.react.ReactPackage
|
|
|
4
4
|
import com.facebook.react.bridge.NativeModule
|
|
5
5
|
import com.facebook.react.bridge.ReactApplicationContext
|
|
6
6
|
import com.facebook.react.uimanager.ViewManager
|
|
7
|
+
import com.rookmotion.rook.sdk.RookConfigurationManager
|
|
8
|
+
import com.rooksdk.modules.RookConfigurationModule
|
|
9
|
+
import com.rooksdk.modules.RookPermissionsModule
|
|
10
|
+
import com.rooksdk.modules.RookStepsModule
|
|
11
|
+
import com.rooksdk.modules.RookSyncModule
|
|
7
12
|
|
|
8
13
|
|
|
9
14
|
class RookSdkPackage : ReactPackage {
|
|
15
|
+
private var rookConfigurationManager: RookConfigurationManager? = null
|
|
16
|
+
|
|
10
17
|
override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
|
|
11
|
-
|
|
18
|
+
if (rookConfigurationManager == null)
|
|
19
|
+
rookConfigurationManager = RookConfigurationManager(reactContext)
|
|
20
|
+
|
|
21
|
+
return listOf(
|
|
22
|
+
RookSdkModule(reactContext, rookConfigurationManager!!),
|
|
23
|
+
RookPermissionsModule(reactContext),
|
|
24
|
+
RookConfigurationModule(reactContext, rookConfigurationManager!!),
|
|
25
|
+
RookSyncModule(reactContext, rookConfigurationManager!!),
|
|
26
|
+
RookStepsModule(reactContext)
|
|
27
|
+
)
|
|
12
28
|
}
|
|
13
29
|
|
|
14
30
|
override fun createViewManagers(reactContext: ReactApplicationContext): List<ViewManager<*, *>> {
|