react-native-rook-sdk 4.0.0-beta.1 → 4.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/LICENSE +1 -1
- package/README.md +3 -35
- package/android/build.gradle +45 -20
- package/android/gradle.properties +5 -5
- package/android/src/main/AndroidManifest.xml +2 -1
- package/android/src/main/AndroidManifestNew.xml +36 -0
- package/android/src/main/java/com/rooksdk/RookSdkModule.kt +263 -11
- package/android/src/main/java/com/rooksdk/RookSdkPackage.kt +42 -26
- package/android/src/main/java/com/rooksdk/broadcasts/AndroidPermissionsReceiverTransmitter.kt +65 -0
- package/android/src/main/java/com/rooksdk/broadcasts/HealthConnectPermissionsReceiverTransmitter.kt +70 -0
- package/android/src/main/java/com/rooksdk/broadcasts/SamsungHealthPermissionsReceiverTransmitter.kt +52 -0
- package/android/src/main/java/com/rooksdk/modules/RookBackgroundSyncModule.kt +99 -0
- package/android/src/main/java/com/rooksdk/modules/RookConfigurationModule.kt +182 -0
- package/android/src/main/java/com/rooksdk/modules/RookLocalData.kt +301 -0
- package/android/src/main/java/com/rooksdk/modules/RookPermissionsModule.kt +359 -0
- package/android/src/main/java/com/rooksdk/modules/RookSourcesModule.kt +102 -0
- package/android/src/main/java/com/rooksdk/modules/RookStepsModule.kt +119 -0
- package/android/src/main/java/com/rooksdk/modules/RookSyncModule.kt +551 -0
- package/android/src/main/java/com/rooksdk/utils/DatasourcesUtils.kt +34 -0
- package/android/src/main/java/com/rooksdk/utils/PermissionConversion.kt +21 -0
- package/android/src/main/java/com/rooksdk/utils/ReadableToWritable.kt +145 -0
- package/android/src/main/java/com/rooksdk/utils/RookDateTime.kt +26 -0
- package/android/src/main/java/com/rooksdk/utils/RookGsonBuilder.kt +17 -0
- package/android/src/main/java/com/rooksdk/utils/SamsungAvailability.kt +21 -0
- package/android/src/main/java/com/rooksdk/utils/Source.kt +6 -0
- package/android/src/main/java/com/rooksdk/utils/StringToSyncType.kt +41 -0
- package/android/src/main/java/com/rooksdk/utils/serializers/InstantSerializer.kt +19 -0
- package/android/src/main/java/com/rooksdk/utils/serializers/LocalDateSerializer.kt +21 -0
- package/android/src/main/res/drawable/ic_health_connect.xml +19 -0
- package/android/src/main/res/values/themes.xml +3 -0
- package/ios/DateHelper.swift +4 -4
- package/ios/EncodableDataSource.swift +3 -2
- package/ios/EncodableDataSourceAuthorizer.swift +3 -2
- package/ios/{HearRateMapper.swift → EncodableHeartRate.swift} +3 -3
- package/ios/EncodableRookDataSource.swift +36 -0
- package/ios/EncodableSDKState.swift +94 -0
- package/ios/EncodableStatusDataSources.swift +47 -0
- package/ios/NutritionMapper.swift +114 -0
- package/ios/RookBackground.swift +8 -5
- package/ios/RookBackgroundModule.h +5 -0
- package/ios/RookBackgroundModule.mm +15 -0
- package/ios/RookConfiguration.swift +34 -24
- package/ios/RookConfigurationModule.h +5 -0
- package/ios/RookConfigurationModule.mm +22 -0
- package/ios/RookExternalModule.h +5 -0
- package/ios/RookExternalModule.m +31 -0
- package/ios/{RookData.swift → RookLocalData.swift} +70 -48
- package/ios/RookPermissions.swift +33 -5
- package/ios/RookPermissionsModule.h +5 -0
- package/ios/RookPermissionsModule.mm +20 -0
- package/ios/RookSdk.h +2 -14
- package/ios/RookSdk.mm +97 -546
- package/ios/RookSources.swift +54 -60
- package/ios/RookSourcesModule.h +5 -0
- package/ios/RookSourcesModule.mm +18 -0
- package/ios/RookSync.h +5 -0
- package/ios/RookSync.m +35 -0
- package/ios/RookSync.swift +78 -48
- package/ios/SwiftTest.swift +18 -0
- package/ios/react-native-rook-sdk-Bridging-Header.h +12 -0
- package/{src/context/RookSyncGateContext.ts → lib/commonjs/context/RookSyncGateContext.js} +13 -10
- package/lib/commonjs/context/RookSyncGateContext.js.map +1 -0
- package/lib/commonjs/context/RookSyncGateProvider.js +108 -0
- package/lib/commonjs/context/RookSyncGateProvider.js.map +1 -0
- package/{src/context/RookSyncGateReducer.ts → lib/commonjs/context/RookSyncGateReducer.js} +44 -13
- package/lib/commonjs/context/RookSyncGateReducer.js.map +1 -0
- package/lib/commonjs/context/RookSyncGateTypes.js +6 -0
- package/lib/commonjs/context/RookSyncGateTypes.js.map +1 -0
- package/lib/commonjs/context/index.js +14 -0
- package/lib/commonjs/context/index.js.map +1 -0
- package/lib/commonjs/hooks/index.js +76 -0
- package/lib/commonjs/hooks/index.js.map +1 -0
- package/{src/hooks/useRookAPISources.ts → lib/commonjs/hooks/useRookAPISources.js} +36 -40
- package/lib/commonjs/hooks/useRookAPISources.js.map +1 -0
- package/lib/commonjs/hooks/useRookAndroidBackgroundSteps.js +88 -0
- package/lib/commonjs/hooks/useRookAndroidBackgroundSteps.js.map +1 -0
- package/lib/commonjs/hooks/useRookAppleHealth.js +63 -0
- package/lib/commonjs/hooks/useRookAppleHealth.js.map +1 -0
- package/lib/commonjs/hooks/useRookConfiguration.js +113 -0
- package/lib/commonjs/hooks/useRookConfiguration.js.map +1 -0
- package/lib/commonjs/hooks/useRookData.js +116 -0
- package/lib/commonjs/hooks/useRookData.js.map +1 -0
- package/lib/commonjs/hooks/useRookHealthConnect.js +70 -0
- package/lib/commonjs/hooks/useRookHealthConnect.js.map +1 -0
- package/lib/commonjs/hooks/useRookPermissions.js +211 -0
- package/lib/commonjs/hooks/useRookPermissions.js.map +1 -0
- package/lib/commonjs/hooks/useRookSamsungHealth.js +54 -0
- package/lib/commonjs/hooks/useRookSamsungHealth.js.map +1 -0
- package/lib/commonjs/hooks/useRookSync.js +148 -0
- package/lib/commonjs/hooks/useRookSync.js.map +1 -0
- package/lib/commonjs/hooks/useRookVariables.js +93 -0
- package/lib/commonjs/hooks/useRookVariables.js.map +1 -0
- package/lib/commonjs/index.js +121 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/modules/hook/useRookAutoSync.js +261 -0
- package/lib/commonjs/modules/hook/useRookAutoSync.js.map +1 -0
- package/lib/commonjs/modules/types/sendMessageBroadcast.js +2 -0
- package/lib/commonjs/modules/types/sendMessageBroadcast.js.map +1 -0
- package/lib/commonjs/modules/utils/errors.js +12 -0
- package/lib/commonjs/modules/utils/errors.js.map +1 -0
- package/lib/commonjs/types/ActivityEvent.js +6 -0
- package/lib/commonjs/types/ActivityEvent.js.map +1 -0
- package/lib/commonjs/types/AppleHealthNutritionEvent.js +77 -0
- package/lib/commonjs/types/AppleHealthNutritionEvent.js.map +1 -0
- package/lib/{module/NativeRookSdk.js → commonjs/types/AppleHealthPermissions.js} +7 -45
- package/lib/commonjs/types/AppleHealthPermissions.js.map +1 -0
- package/lib/commonjs/types/AuthorizedSources.js +6 -0
- package/lib/commonjs/types/AuthorizedSources.js.map +1 -0
- package/lib/commonjs/types/BodySummary.js +6 -0
- package/lib/{module/types/Rook.js.map → commonjs/types/BodySummary.js.map} +1 -1
- package/lib/commonjs/types/DataSource.js +16 -0
- package/lib/commonjs/types/DataSource.js.map +1 -0
- package/lib/commonjs/types/DiagnosticState.js +2 -0
- package/lib/commonjs/types/DiagnosticState.js.map +1 -0
- package/lib/commonjs/types/HCMealData.js +65 -0
- package/lib/commonjs/types/HCMealData.js.map +1 -0
- package/lib/commonjs/types/HeartRateEvent.js +2 -0
- package/lib/commonjs/types/HeartRateEvent.js.map +1 -0
- package/lib/commonjs/types/PermissionsType.js +2 -0
- package/lib/commonjs/types/PermissionsType.js.map +1 -0
- package/lib/commonjs/types/PhysicalSummary.js +6 -0
- package/lib/commonjs/types/PhysicalSummary.js.map +1 -0
- package/lib/commonjs/types/SDKSources.js +13 -0
- package/lib/commonjs/types/SDKSources.js.map +1 -0
- package/lib/commonjs/types/SamsungHealthPermissions.js +23 -0
- package/lib/commonjs/types/SamsungHealthPermissions.js.map +1 -0
- package/lib/commonjs/types/SleepSummary.js +6 -0
- package/lib/commonjs/types/SleepSummary.js.map +1 -0
- package/lib/commonjs/types/SummaryTypes.js +2 -0
- package/lib/commonjs/types/SummaryTypes.js.map +1 -0
- package/lib/commonjs/types/SyncTypes.js +33 -0
- package/lib/commonjs/types/SyncTypes.js.map +1 -0
- package/lib/commonjs/types/WriteNutrition.js +18 -0
- package/lib/commonjs/types/WriteNutrition.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 +28 -0
- package/lib/commonjs/utils/getRookModule.js.map +1 -0
- package/{src/utils/isModuleReady.ts → lib/commonjs/utils/isModuleReady.js} +10 -4
- package/lib/commonjs/utils/isModuleReady.js.map +1 -0
- package/lib/commonjs/utils/isRunningOnAndroid.js +15 -0
- package/lib/commonjs/utils/isRunningOnAndroid.js.map +1 -0
- package/lib/commonjs/utils/isRunningOniOS.js +15 -0
- package/lib/commonjs/utils/isRunningOniOS.js.map +1 -0
- package/lib/commonjs/utils/isValidDate.js +41 -0
- package/lib/commonjs/utils/isValidDate.js.map +1 -0
- package/lib/commonjs/utils/nativeModules.js +29 -0
- package/lib/commonjs/utils/nativeModules.js.map +1 -0
- package/lib/commonjs/utils/packageInfo.js +13 -0
- package/lib/commonjs/utils/packageInfo.js.map +1 -0
- package/lib/module/context/RookSyncGateContext.js +0 -2
- package/lib/module/context/RookSyncGateContext.js.map +1 -1
- package/lib/module/context/RookSyncGateProvider.js +31 -22
- package/lib/module/context/RookSyncGateProvider.js.map +1 -1
- package/lib/module/context/RookSyncGateReducer.js +12 -4
- package/lib/module/context/RookSyncGateReducer.js.map +1 -1
- package/lib/module/context/RookSyncGateTypes.js +0 -2
- package/lib/module/context/index.js +2 -0
- package/lib/module/context/index.js.map +1 -0
- package/lib/module/hooks/index.js +11 -0
- package/lib/module/hooks/index.js.map +1 -0
- package/lib/module/hooks/useRookAPISources.js +16 -10
- package/lib/module/hooks/useRookAPISources.js.map +1 -1
- package/lib/module/hooks/useRookAndroidBackgroundSteps.js +12 -11
- package/lib/module/hooks/useRookAndroidBackgroundSteps.js.map +1 -1
- package/lib/module/hooks/useRookAppleHealth.js +10 -9
- package/lib/module/hooks/useRookAppleHealth.js.map +1 -1
- package/lib/module/hooks/useRookConfiguration.js +34 -10
- package/lib/module/hooks/useRookConfiguration.js.map +1 -1
- package/lib/module/hooks/useRookData.js +45 -31
- package/lib/module/hooks/useRookData.js.map +1 -1
- package/lib/module/hooks/useRookHealthConnect.js +10 -9
- package/lib/module/hooks/useRookHealthConnect.js.map +1 -1
- package/lib/module/hooks/useRookPermissions.js +49 -26
- package/lib/module/hooks/useRookPermissions.js.map +1 -1
- package/lib/module/hooks/useRookSamsungHealth.js +20 -8
- package/lib/module/hooks/useRookSamsungHealth.js.map +1 -1
- package/lib/module/hooks/useRookSync.js +32 -23
- package/lib/module/hooks/useRookSync.js.map +1 -1
- package/lib/module/hooks/useRookVariables.js +37 -19
- package/lib/module/hooks/useRookVariables.js.map +1 -1
- package/lib/module/index.js +10 -18
- package/lib/module/index.js.map +1 -1
- package/lib/module/modules/hook/useRookAutoSync.js +40 -27
- package/lib/module/modules/hook/useRookAutoSync.js.map +1 -1
- package/lib/module/modules/types/sendMessageBroadcast.js +1 -1
- package/lib/module/modules/utils/errors.js +0 -2
- package/lib/module/modules/utils/errors.js.map +1 -1
- package/lib/module/types/ActivityEvent.js +0 -2
- package/lib/module/types/AppleHealthNutritionEvent.js +70 -0
- package/lib/module/types/AppleHealthNutritionEvent.js.map +1 -0
- package/lib/module/types/AppleHealthPermissions.js +0 -2
- package/lib/module/types/AppleHealthPermissions.js.map +1 -1
- package/lib/module/types/AuthorizedSources.js +0 -2
- package/lib/module/types/BodySummary.js +0 -2
- package/lib/module/types/DataSource.js +0 -2
- package/lib/module/types/DataSource.js.map +1 -1
- package/lib/module/types/DiagnosticState.js +2 -0
- package/lib/module/types/DiagnosticState.js.map +1 -0
- package/lib/module/types/HCMealData.js +59 -0
- package/lib/module/types/HCMealData.js.map +1 -0
- package/lib/module/types/HeartRateEvent.js +1 -1
- package/lib/module/types/PermissionsType.js +1 -1
- package/lib/module/types/PhysicalSummary.js +0 -2
- package/lib/module/types/SDKSources.js +0 -2
- package/lib/module/types/SDKSources.js.map +1 -1
- package/lib/module/types/SamsungHealthPermissions.js +0 -3
- package/lib/module/types/SamsungHealthPermissions.js.map +1 -1
- package/lib/module/types/SleepSummary.js +0 -2
- package/lib/module/types/SummaryTypes.js +1 -1
- package/lib/module/types/SyncTypes.js +0 -2
- package/lib/module/types/SyncTypes.js.map +1 -1
- package/lib/module/types/WriteNutrition.js +12 -0
- package/lib/module/types/WriteNutrition.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 +22 -0
- package/lib/module/utils/getRookModule.js.map +1 -0
- package/lib/module/utils/isModuleReady.js +0 -2
- package/lib/module/utils/isModuleReady.js.map +1 -1
- package/lib/module/utils/isRunningOnAndroid.js +0 -2
- package/lib/module/utils/isRunningOnAndroid.js.map +1 -1
- package/lib/module/utils/isRunningOniOS.js +0 -2
- package/lib/module/utils/isRunningOniOS.js.map +1 -1
- package/lib/module/utils/isValidDate.js +20 -2
- package/lib/module/utils/isValidDate.js.map +1 -1
- package/lib/module/utils/nativeModules.js +23 -0
- package/lib/module/utils/nativeModules.js.map +1 -0
- package/lib/module/utils/packageInfo.js +7 -0
- package/lib/module/utils/packageInfo.js.map +1 -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.map +1 -1
- package/lib/typescript/src/context/RookSyncGateTypes.d.ts +14 -4
- package/lib/typescript/src/context/RookSyncGateTypes.d.ts.map +1 -1
- package/lib/typescript/src/context/index.d.ts +2 -0
- package/lib/typescript/src/context/index.d.ts.map +1 -0
- package/lib/typescript/src/hooks/index.d.ts +11 -0
- package/lib/typescript/src/hooks/index.d.ts.map +1 -0
- package/lib/typescript/src/hooks/useRookAPISources.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookAndroidBackgroundSteps.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookAppleHealth.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookConfiguration.d.ts +3 -1
- package/lib/typescript/src/hooks/useRookConfiguration.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookData.d.ts +2 -2
- package/lib/typescript/src/hooks/useRookData.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookHealthConnect.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookPermissions.d.ts +2 -0
- package/lib/typescript/src/hooks/useRookPermissions.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookSamsungHealth.d.ts +6 -0
- package/lib/typescript/src/hooks/useRookSamsungHealth.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookSync.d.ts.map +1 -1
- package/lib/typescript/src/hooks/useRookVariables.d.ts +2 -0
- package/lib/typescript/src/hooks/useRookVariables.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +8 -17
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts.map +1 -1
- package/lib/typescript/src/types/AppleHealthNutritionEvent.d.ts +76 -0
- package/lib/typescript/src/types/AppleHealthNutritionEvent.d.ts.map +1 -0
- package/lib/typescript/src/types/AuthorizedSources.d.ts +0 -11
- package/lib/typescript/src/types/AuthorizedSources.d.ts.map +1 -1
- package/lib/typescript/src/types/DiagnosticState.d.ts +13 -0
- package/lib/typescript/src/types/DiagnosticState.d.ts.map +1 -0
- package/lib/typescript/src/types/HCMealData.d.ts +60 -0
- package/lib/typescript/src/types/HCMealData.d.ts.map +1 -0
- package/lib/typescript/src/types/HeartRateEvent.d.ts +2 -2
- package/lib/typescript/src/types/HeartRateEvent.d.ts.map +1 -1
- package/lib/typescript/src/types/SamsungHealthPermissions.d.ts +0 -1
- package/lib/typescript/src/types/SamsungHealthPermissions.d.ts.map +1 -1
- package/lib/typescript/src/types/SyncTypes.d.ts +1 -5
- package/lib/typescript/src/types/SyncTypes.d.ts.map +1 -1
- package/lib/typescript/src/types/WriteNutrition.d.ts +61 -0
- package/lib/typescript/src/types/WriteNutrition.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 +9 -0
- package/lib/typescript/src/utils/getRookModule.d.ts.map +1 -0
- package/lib/typescript/src/utils/isModuleReady.d.ts.map +1 -1
- package/lib/typescript/src/utils/isValidDate.d.ts +8 -0
- package/lib/typescript/src/utils/isValidDate.d.ts.map +1 -1
- package/lib/typescript/src/utils/nativeModules.d.ts +24 -0
- package/lib/typescript/src/utils/nativeModules.d.ts.map +1 -0
- package/lib/typescript/src/utils/packageInfo.d.ts +6 -0
- package/lib/typescript/src/utils/packageInfo.d.ts.map +1 -0
- package/package.json +98 -94
- package/react-native-rook-sdk.podspec +45 -0
- package/RNRookSdk.podspec +0 -22
- package/ios/Encodable.swift +0 -25
- package/ios/RookEntry.swift +0 -61
- package/ios/RookSdk-Bridging-Header.h +0 -12
- package/ios/boost-boost_privacy-Bridging-Header.h +0 -4
- package/lib/module/NativeRookSdk.js.map +0 -1
- package/lib/module/package.json +0 -1
- package/lib/module/types/Rook.js +0 -2
- package/lib/typescript/package.json +0 -1
- package/lib/typescript/src/NativeRookSdk.d.ts +0 -190
- package/lib/typescript/src/NativeRookSdk.d.ts.map +0 -1
- package/lib/typescript/src/types/Rook.d.ts +0 -9
- package/lib/typescript/src/types/Rook.d.ts.map +0 -1
- package/src/NativeRookSdk.ts +0 -281
- package/src/context/RookSyncGateProvider.tsx +0 -78
- package/src/context/RookSyncGateTypes.ts +0 -34
- package/src/hooks/useRookAndroidBackgroundSteps.ts +0 -81
- package/src/hooks/useRookAppleHealth.ts +0 -55
- package/src/hooks/useRookConfiguration.ts +0 -82
- package/src/hooks/useRookData.ts +0 -122
- package/src/hooks/useRookHealthConnect.ts +0 -59
- package/src/hooks/useRookPermissions.ts +0 -224
- package/src/hooks/useRookSamsungHealth.ts +0 -37
- package/src/hooks/useRookSync.ts +0 -157
- package/src/hooks/useRookVariables.ts +0 -77
- package/src/index.tsx +0 -28
- package/src/modules/hook/useRookAutoSync.ts +0 -305
- package/src/modules/types/sendMessageBroadcast.ts +0 -5
- package/src/modules/utils/errors.ts +0 -9
- package/src/types/ActivityEvent.ts +0 -159
- package/src/types/AppleHealthPermissions.ts +0 -49
- package/src/types/AuthorizedSources.ts +0 -33
- package/src/types/BodySummary.ts +0 -116
- package/src/types/DataSource.ts +0 -16
- package/src/types/HeartRateEvent.ts +0 -26
- package/src/types/PermissionsType.ts +0 -9
- package/src/types/PhysicalSummary.ts +0 -84
- package/src/types/Rook.ts +0 -8
- package/src/types/SDKSources.ts +0 -5
- package/src/types/SamsungHealthPermissions.ts +0 -16
- package/src/types/SleepSummary.ts +0 -66
- package/src/types/SummaryTypes.ts +0 -70
- package/src/types/SyncTypes.ts +0 -63
- package/src/utils/isRunningOnAndroid.ts +0 -10
- package/src/utils/isRunningOniOS.ts +0 -10
- package/src/utils/isValidDate.ts +0 -15
package/android/src/main/java/com/rooksdk/broadcasts/HealthConnectPermissionsReceiverTransmitter.kt
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
package com.rooksdk.broadcasts
|
|
2
|
+
|
|
3
|
+
import android.content.BroadcastReceiver
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.content.Intent
|
|
6
|
+
import com.facebook.react.bridge.Arguments
|
|
7
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
8
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
9
|
+
import com.rookmotion.rook.sdk.RookPermissionsManager
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* HealthConnectPermissionsReceiverTransmitter is a custom BroadcastReceiver used to listen for updates
|
|
13
|
+
* on Android permission changes and transmit them back to the React Native layer.
|
|
14
|
+
* It listens for a broadcast containing permission status, then emits a corresponding event to JavaScript.
|
|
15
|
+
*/
|
|
16
|
+
class HealthConnectPermissionsReceiverTransmitter: BroadcastReceiver() {
|
|
17
|
+
private var reactApplicationContext: ReactApplicationContext? = null
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* This method is called when a broadcast is received.
|
|
21
|
+
* It checks whether the broadcast includes the permission status and emits an event to the React Native
|
|
22
|
+
* JavaScript layer with the results.
|
|
23
|
+
*
|
|
24
|
+
* @param context The context in which the receiver is running.
|
|
25
|
+
* @param intent The intent containing permission-related data.
|
|
26
|
+
*/
|
|
27
|
+
override fun onReceive(context: Context?, intent: Intent?) {
|
|
28
|
+
val permissionsGranted = intent?.getBooleanExtra(
|
|
29
|
+
/* name = */ RookPermissionsManager.EXTRA_HEALTH_CONNECT_PERMISSIONS_GRANTED,
|
|
30
|
+
/* defaultValue = */ false
|
|
31
|
+
) ?: false
|
|
32
|
+
|
|
33
|
+
val partiallyGranted = intent?.getBooleanExtra(
|
|
34
|
+
RookPermissionsManager.EXTRA_HEALTH_CONNECT_PERMISSIONS_PARTIALLY_GRANTED,
|
|
35
|
+
false
|
|
36
|
+
) ?: false
|
|
37
|
+
|
|
38
|
+
val backgroundReadStatus = intent?.getBooleanExtra(
|
|
39
|
+
RookPermissionsManager.EXTRA_HEALTH_CONNECT_BACKGROUND_PERMISSION_GRANTED,
|
|
40
|
+
false
|
|
41
|
+
) ?: false
|
|
42
|
+
|
|
43
|
+
reactApplicationContext?.also { reactContext ->
|
|
44
|
+
val events = listOf(
|
|
45
|
+
"ROOK_HEALTH_CONNECT_PERMISSIONS" to permissionsGranted,
|
|
46
|
+
"ROOK_HEALTH_CONNECT_PERMISSIONS_PARTIALLY_GRANTED" to partiallyGranted,
|
|
47
|
+
"ROOK_HEALTH_CONNECT_BACKGROUND_PERMISSIONS" to backgroundReadStatus,
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
val emitter = reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
51
|
+
|
|
52
|
+
events.forEach { (type, value) ->
|
|
53
|
+
Arguments.createMap().apply {
|
|
54
|
+
putString("type", type)
|
|
55
|
+
putBoolean("value", value)
|
|
56
|
+
emitter.emit("ROOK_NOTIFICATION", this)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Sets the ReactApplicationContext to be used for emitting events to the React Native side.
|
|
64
|
+
*
|
|
65
|
+
* @param context The ReactApplicationContext provided by React Native.
|
|
66
|
+
*/
|
|
67
|
+
fun setReactApplicationContext(context: ReactApplicationContext) {
|
|
68
|
+
this.reactApplicationContext = context
|
|
69
|
+
}
|
|
70
|
+
}
|
package/android/src/main/java/com/rooksdk/broadcasts/SamsungHealthPermissionsReceiverTransmitter.kt
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
package com.rooksdk.broadcasts
|
|
2
|
+
|
|
3
|
+
import android.content.BroadcastReceiver
|
|
4
|
+
import android.content.Context
|
|
5
|
+
import android.content.Intent
|
|
6
|
+
import com.facebook.react.bridge.Arguments
|
|
7
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
8
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
9
|
+
import io.tryrook.sdk.samsung.domain.enums.SamsungHealthPermission
|
|
10
|
+
|
|
11
|
+
class SamsungHealthPermissionsReceiverTransmitter: BroadcastReceiver() {
|
|
12
|
+
private var reactApplicationContext: ReactApplicationContext? = null
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Sets the ReactApplicationContext to be used for emitting events to the React Native side.
|
|
16
|
+
*
|
|
17
|
+
* @param context The ReactApplicationContext provided by React Native.
|
|
18
|
+
*/
|
|
19
|
+
fun setReactApplicationContext(context: ReactApplicationContext) {
|
|
20
|
+
this.reactApplicationContext = context
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
override fun onReceive(conext: Context?, intent: Intent?) {
|
|
24
|
+
val allPermissionsGranted = intent?.getBooleanExtra(
|
|
25
|
+
/* name = */ SamsungHealthPermission.EXTRA_SAMSUNG_HEALTH_PERMISSIONS_GRANTED,
|
|
26
|
+
/* defaultValue = */ false
|
|
27
|
+
) ?: false
|
|
28
|
+
|
|
29
|
+
val permissionsPartiallyGranted = intent?.getBooleanExtra(
|
|
30
|
+
/* name = */ SamsungHealthPermission.EXTRA_SAMSUNG_HEALTH_PERMISSIONS_PARTIALLY_GRANTED,
|
|
31
|
+
/* defaultValue = */ false
|
|
32
|
+
) ?: false
|
|
33
|
+
|
|
34
|
+
reactApplicationContext?.also { reactContext ->
|
|
35
|
+
val events = listOf(
|
|
36
|
+
"ROOK_SAMSUNG_HEALTH_PERMISSIONS" to allPermissionsGranted,
|
|
37
|
+
"ROOK_SAMSUNG_HEALTH_PERMISSIONS_PARTIALLY_GRANTED" to permissionsPartiallyGranted,
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
val emitter = reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
41
|
+
|
|
42
|
+
events.forEach { (type, value) ->
|
|
43
|
+
Arguments.createMap().apply {
|
|
44
|
+
putString("type", type)
|
|
45
|
+
putBoolean("value", value)
|
|
46
|
+
emitter.emit("ROOK_NOTIFICATION", this)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
package com.rooksdk.modules
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Promise
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
6
|
+
import com.facebook.react.bridge.ReactMethod
|
|
7
|
+
import com.rookmotion.rook.sdk.RookBackgroundSyncManager
|
|
8
|
+
import com.rookmotion.rook.sdk.domain.exception.HCException
|
|
9
|
+
import io.tryrook.api.sources.domain.exception.ApiException
|
|
10
|
+
import kotlinx.coroutines.CoroutineScope
|
|
11
|
+
import kotlinx.coroutines.Dispatchers
|
|
12
|
+
import kotlinx.coroutines.SupervisorJob
|
|
13
|
+
import kotlinx.coroutines.launch
|
|
14
|
+
|
|
15
|
+
class RookBackgroundSyncModule (reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext) {
|
|
16
|
+
|
|
17
|
+
private val backgroundSyncManager = RookBackgroundSyncManager(reactContext)
|
|
18
|
+
|
|
19
|
+
private val scope: CoroutineScope by lazy {
|
|
20
|
+
CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
override fun getName(): String {
|
|
24
|
+
return "RookBackgroundModule"
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Schedules the background synchronization of health data using Rook.
|
|
29
|
+
*
|
|
30
|
+
* This function enables automatic background data synchronization with Rook.
|
|
31
|
+
* It ensures that health data is periodically fetched and sent to Rook’s API
|
|
32
|
+
* based on the defined configuration.
|
|
33
|
+
*
|
|
34
|
+
* If the scheduling is successful, the promise resolves with "SUCCESS".
|
|
35
|
+
* If an error occurs, the promise rejects with an error message.
|
|
36
|
+
*
|
|
37
|
+
* @param promise A React Native promise that resolves when the sync is scheduled successfully or rejects with an error.
|
|
38
|
+
*/
|
|
39
|
+
@ReactMethod
|
|
40
|
+
fun scheduleBackgroundSync(enableLogs: Boolean, promise: Promise) {
|
|
41
|
+
try {
|
|
42
|
+
backgroundSyncManager.schedule(enableLogs)
|
|
43
|
+
promise.resolve(true)
|
|
44
|
+
}
|
|
45
|
+
catch (e: Exception) {
|
|
46
|
+
if (e is HCException) {
|
|
47
|
+
promise.reject(e.code.toString(), e.message, e)
|
|
48
|
+
} else {
|
|
49
|
+
promise.reject("1001", e.message, e)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Cancels the scheduled background synchronization of health data.
|
|
57
|
+
*
|
|
58
|
+
* This function stops the automatic background sync previously scheduled using Rook.
|
|
59
|
+
* It ensures that no further health data is fetched and sent until scheduled again.
|
|
60
|
+
*
|
|
61
|
+
* If the cancellation is successful, the promise resolves with "SUCCESS".
|
|
62
|
+
* If an error occurs, the promise rejects with an error message.
|
|
63
|
+
*
|
|
64
|
+
* @param promise A React Native promise that resolves when the sync is canceled successfully or rejects with an error.
|
|
65
|
+
*/
|
|
66
|
+
@ReactMethod
|
|
67
|
+
fun cancelBackgroundSync(promise: Promise) {
|
|
68
|
+
scope.launch {
|
|
69
|
+
try {
|
|
70
|
+
backgroundSyncManager.cancel()
|
|
71
|
+
promise.resolve(true)
|
|
72
|
+
} catch (e: Exception) {
|
|
73
|
+
if (e is HCException) {
|
|
74
|
+
promise.reject(e.code.toString(), e.message, e)
|
|
75
|
+
} else {
|
|
76
|
+
promise.reject("1001", e.message, e)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
@ReactMethod
|
|
83
|
+
fun isBackgroundSyncEnabled(promise: Promise) {
|
|
84
|
+
scope.launch {
|
|
85
|
+
backgroundSyncManager.isScheduled().fold(
|
|
86
|
+
{
|
|
87
|
+
promise.resolve(it)
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
if (it is HCException) {
|
|
91
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
92
|
+
} else {
|
|
93
|
+
promise.reject("1001", it.message, it)
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
package com.rooksdk.modules
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Promise
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
6
|
+
import com.facebook.react.bridge.ReactMethod
|
|
7
|
+
import com.facebook.react.bridge.ReadableArray
|
|
8
|
+
import com.google.gson.Gson
|
|
9
|
+
import com.rookmotion.rook.sdk.RookConfigurationManager
|
|
10
|
+
import com.rookmotion.rook.sdk.domain.exception.HCException
|
|
11
|
+
import com.rooksdk.utils.DatasourcesUtils
|
|
12
|
+
import com.rooksdk.utils.RookGsonBuilder
|
|
13
|
+
import com.rooksdk.utils.SamsungAvailability
|
|
14
|
+
import com.rooksdk.utils.Source
|
|
15
|
+
import io.tryrook.sdk.samsung.RookSamsung
|
|
16
|
+
import io.tryrook.sdk.samsung.domain.enums.SamsungHealthAvailability
|
|
17
|
+
import kotlinx.coroutines.CoroutineScope
|
|
18
|
+
import kotlinx.coroutines.Dispatchers
|
|
19
|
+
import kotlinx.coroutines.SupervisorJob
|
|
20
|
+
import kotlinx.coroutines.launch
|
|
21
|
+
|
|
22
|
+
class RookConfigurationModule(
|
|
23
|
+
reactContext: ReactApplicationContext,
|
|
24
|
+
private val rookConfigurationManager: RookConfigurationManager,
|
|
25
|
+
private val rookSamsung: RookSamsung,
|
|
26
|
+
): ReactContextBaseJavaModule(reactContext) {
|
|
27
|
+
|
|
28
|
+
private val scope: CoroutineScope by lazy {
|
|
29
|
+
CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
private val gsonBuilder: Gson by lazy {
|
|
33
|
+
RookGsonBuilder.getGsonBuilder()
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Retrieves the currently stored user ID in the Rook SDK configuration.
|
|
37
|
+
* @param promise A promise object to handle the result (resolved with the user ID or rejected with an error).
|
|
38
|
+
*/
|
|
39
|
+
@ReactMethod
|
|
40
|
+
fun getUserID(promise: Promise) {
|
|
41
|
+
scope.launch {
|
|
42
|
+
try {
|
|
43
|
+
val user = rookConfigurationManager.getUserID()
|
|
44
|
+
promise.resolve(user)
|
|
45
|
+
}
|
|
46
|
+
catch (it: Exception) {
|
|
47
|
+
if (it is HCException) {
|
|
48
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
49
|
+
} else {
|
|
50
|
+
promise.reject("1001", it.message, it)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Updates the user ID in the Rook SDK configuration.
|
|
58
|
+
* @param userID The new user ID to be set.
|
|
59
|
+
* @param promise A promise object to handle the result (resolved on success, rejected on failure).
|
|
60
|
+
*/
|
|
61
|
+
@ReactMethod
|
|
62
|
+
fun updateUserID(userID: String, promise: Promise) {
|
|
63
|
+
scope.launch {
|
|
64
|
+
try {
|
|
65
|
+
if (SamsungAvailability.isSamsungAvailable(rookSamsung)) {
|
|
66
|
+
val samsungResult = rookSamsung.updateUserID(userID)
|
|
67
|
+
|
|
68
|
+
if (samsungResult.isFailure) {
|
|
69
|
+
println("We couldn't initiate the user id in Samsung Health")
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
samsungResult.getOrThrow()
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
val healthConnectResult = rookConfigurationManager.updateUserID(userID)
|
|
76
|
+
|
|
77
|
+
if (healthConnectResult.isFailure) {
|
|
78
|
+
println("We couldn't initiate the user id in Health Connect")
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
healthConnectResult.getOrThrow()
|
|
82
|
+
|
|
83
|
+
promise.resolve(true)
|
|
84
|
+
} catch (it: Exception) {
|
|
85
|
+
if (it is HCException) {
|
|
86
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
87
|
+
} else {
|
|
88
|
+
promise.reject("1001", it.message, it)
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Deletes the user data from the Rook platform by removing the user from the system.
|
|
96
|
+
* @param promise A promise object to handle the result (resolved on success, rejected on failure).
|
|
97
|
+
*/
|
|
98
|
+
@ReactMethod
|
|
99
|
+
fun removeUserFromRook(rawSources: ReadableArray, promise: Promise) {
|
|
100
|
+
scope.launch {
|
|
101
|
+
try {
|
|
102
|
+
val sources = DatasourcesUtils.readableArrayToSourceList(rawSources)
|
|
103
|
+
|
|
104
|
+
if(Source.HEALTH_CONNECT in sources) {
|
|
105
|
+
val hcResult = rookConfigurationManager.deleteUserFromRook()
|
|
106
|
+
hcResult.getOrThrow()
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if(Source.SAMSUNG_HEALTH in sources && SamsungAvailability.isSamsungAvailable(rookSamsung)) {
|
|
110
|
+
val hcResult = rookSamsung.deleteUserFromRook()
|
|
111
|
+
hcResult.getOrThrow()
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
promise.resolve(true)
|
|
115
|
+
}
|
|
116
|
+
catch (it: Exception) {
|
|
117
|
+
if (it is HCException) {
|
|
118
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
119
|
+
} else {
|
|
120
|
+
promise.reject("1001", it.message, it)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Synchronizes the user's time zone with the Rook platform to ensure data is processed correctly.
|
|
128
|
+
* @param promise A promise object to handle the result (resolved on success, rejected on failure).
|
|
129
|
+
*/
|
|
130
|
+
@ReactMethod
|
|
131
|
+
fun syncUserTimeZone(promise: Promise) {
|
|
132
|
+
scope.launch {
|
|
133
|
+
val result = rookConfigurationManager.syncUserTimeZone()
|
|
134
|
+
|
|
135
|
+
result.fold({
|
|
136
|
+
promise.resolve(true)
|
|
137
|
+
}, {
|
|
138
|
+
if (it is HCException) {
|
|
139
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
140
|
+
} else {
|
|
141
|
+
promise.reject("1001", it.message, it)
|
|
142
|
+
}
|
|
143
|
+
})
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@ReactMethod
|
|
148
|
+
fun getHealthConnectDiagnosticState(promise: Promise) {
|
|
149
|
+
scope.launch {
|
|
150
|
+
try {
|
|
151
|
+
val result = rookConfigurationManager.getDiagnosticState().getOrThrow()
|
|
152
|
+
promise.resolve(gsonBuilder.toJson(result))
|
|
153
|
+
} catch (it: Exception) {
|
|
154
|
+
if (it is HCException) {
|
|
155
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
156
|
+
} else {
|
|
157
|
+
promise.reject("1001", it.message, it)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
@ReactMethod
|
|
164
|
+
fun getSamsungHealthDiagnosticState(promise: Promise) {
|
|
165
|
+
scope.launch {
|
|
166
|
+
try {
|
|
167
|
+
val result = rookSamsung.getDiagnosticState().getOrThrow()
|
|
168
|
+
promise.resolve(gsonBuilder.toJson(result))
|
|
169
|
+
} catch (it: Exception) {
|
|
170
|
+
if (it is HCException) {
|
|
171
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
172
|
+
} else {
|
|
173
|
+
promise.reject("1001", it.message, it)
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
override fun getName(): String {
|
|
180
|
+
return "RookConfigurationModule"
|
|
181
|
+
}
|
|
182
|
+
}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
package com.rooksdk.modules
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.Promise
|
|
4
|
+
import com.facebook.react.bridge.ReactApplicationContext
|
|
5
|
+
import com.facebook.react.bridge.ReactContextBaseJavaModule
|
|
6
|
+
import com.facebook.react.bridge.ReactMethod
|
|
7
|
+
import com.facebook.react.bridge.ReadableMap
|
|
8
|
+
import com.google.gson.Gson
|
|
9
|
+
import com.google.gson.GsonBuilder
|
|
10
|
+
import com.rookmotion.rook.sdk.RookSyncManager
|
|
11
|
+
import com.rookmotion.rook.sdk.RookWriteManager
|
|
12
|
+
import com.rookmotion.rook.sdk.domain.annotation.ExperimentalRookApi
|
|
13
|
+
import com.rookmotion.rook.sdk.domain.exception.HCException
|
|
14
|
+
import com.rookmotion.rook.sdk.domain.model.HCActivityEvent
|
|
15
|
+
import com.rookmotion.rook.sdk.domain.model.HCBodySummary
|
|
16
|
+
import com.rookmotion.rook.sdk.domain.model.HCPhysicalSummary
|
|
17
|
+
import com.rookmotion.rook.sdk.domain.model.HCSleepSummary
|
|
18
|
+
import com.rookmotion.rook.sdk.domain.model.SyncStatusWithData
|
|
19
|
+
import com.rooksdk.utils.ReadableToWritable
|
|
20
|
+
import com.rooksdk.utils.serializers.InstantSerializer
|
|
21
|
+
import com.rooksdk.utils.RookDateTime
|
|
22
|
+
import com.rooksdk.utils.RookGsonBuilder
|
|
23
|
+
import com.rooksdk.utils.serializers.LocalDateSerializer
|
|
24
|
+
import io.tryrook.sdk.samsung.RookSamsung
|
|
25
|
+
import io.tryrook.sdk.samsung.domain.exception.SHException
|
|
26
|
+
import io.tryrook.sdk.samsung.domain.model.SHActivityEvent
|
|
27
|
+
import io.tryrook.sdk.samsung.domain.model.SHBodySummary
|
|
28
|
+
import io.tryrook.sdk.samsung.domain.model.SHPhysicalSummary
|
|
29
|
+
import io.tryrook.sdk.samsung.domain.model.SHSleepSummary
|
|
30
|
+
import io.tryrook.sdk.samsung.domain.model.SHSyncStatusWithData
|
|
31
|
+
import kotlinx.coroutines.CoroutineScope
|
|
32
|
+
import kotlinx.coroutines.Dispatchers
|
|
33
|
+
import kotlinx.coroutines.SupervisorJob
|
|
34
|
+
import kotlinx.coroutines.launch
|
|
35
|
+
import java.time.Instant
|
|
36
|
+
import java.time.LocalDate
|
|
37
|
+
|
|
38
|
+
class RookLocalData (
|
|
39
|
+
private val reactContext: ReactApplicationContext,
|
|
40
|
+
private val rookSamsung: RookSamsung,
|
|
41
|
+
): ReactContextBaseJavaModule(reactContext){
|
|
42
|
+
|
|
43
|
+
private val scope: CoroutineScope by lazy {
|
|
44
|
+
CoroutineScope(SupervisorJob() + Dispatchers.Main)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
private val rookHealthConnect by lazy {
|
|
48
|
+
RookSyncManager(reactContext)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private val gsonBuilder: Gson by lazy {
|
|
52
|
+
RookGsonBuilder.getGsonBuilder()
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
@ReactMethod
|
|
56
|
+
fun getSamsungSleepSummary(date: String, promise: Promise) {
|
|
57
|
+
val localDate = RookDateTime.stringToLocalDate(date)
|
|
58
|
+
|
|
59
|
+
scope.launch {
|
|
60
|
+
rookSamsung.getSleepSummary(localDate).fold(
|
|
61
|
+
{
|
|
62
|
+
when (it) {
|
|
63
|
+
SHSyncStatusWithData.RecordsNotFound -> {
|
|
64
|
+
promise.reject("SamsungSleepSummary", "Records Not Found For Date: $date")
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
is SHSyncStatusWithData.Synced<List<SHSleepSummary>> -> {
|
|
68
|
+
promise.resolve(gsonBuilder.toJson(it.data))
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
if (it is SHException) {
|
|
74
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
75
|
+
} else {
|
|
76
|
+
promise.reject("1001", it.message, it)
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
@ReactMethod
|
|
84
|
+
fun getSamsungPhysicalSummary(date: String, promise: Promise) {
|
|
85
|
+
val localDate = RookDateTime.stringToLocalDate(date)
|
|
86
|
+
|
|
87
|
+
scope.launch {
|
|
88
|
+
rookSamsung.getPhysicalSummary(localDate).fold(
|
|
89
|
+
{
|
|
90
|
+
when (it) {
|
|
91
|
+
SHSyncStatusWithData.RecordsNotFound -> {
|
|
92
|
+
promise.reject("SamsungPhysicalSummary", "Records Not Found For Date: $date")
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
is SHSyncStatusWithData.Synced<SHPhysicalSummary> -> {
|
|
96
|
+
promise.resolve(gsonBuilder.toJson(it.data))
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
if (it is SHException) {
|
|
102
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
103
|
+
} else {
|
|
104
|
+
promise.reject("1001", it.message, it)
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
@ReactMethod
|
|
112
|
+
fun getSamsungBodySummary(date: String, promise: Promise) {
|
|
113
|
+
val localDate = RookDateTime.stringToLocalDate(date)
|
|
114
|
+
|
|
115
|
+
scope.launch {
|
|
116
|
+
rookSamsung.getBodySummary(localDate).fold(
|
|
117
|
+
{
|
|
118
|
+
when (it) {
|
|
119
|
+
SHSyncStatusWithData.RecordsNotFound -> {
|
|
120
|
+
promise.reject("SamsungBodySummary", "Records Not Found For Date: $date")
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
is SHSyncStatusWithData.Synced<SHBodySummary> -> {
|
|
124
|
+
promise.resolve(gsonBuilder.toJson(it.data))
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
if (it is SHException) {
|
|
130
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
131
|
+
} else {
|
|
132
|
+
promise.reject("1001", it.message, it)
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
@ReactMethod
|
|
140
|
+
fun getSamsungActivityEvents(date: String, promise: Promise) {
|
|
141
|
+
val localDate = RookDateTime.stringToLocalDate(date)
|
|
142
|
+
|
|
143
|
+
scope.launch {
|
|
144
|
+
rookSamsung.getActivityEvents(localDate).fold(
|
|
145
|
+
{
|
|
146
|
+
when (it) {
|
|
147
|
+
SHSyncStatusWithData.RecordsNotFound -> {
|
|
148
|
+
promise.reject("SamsungActivityEvents", "Records Not Found For Date: $date")
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
is SHSyncStatusWithData.Synced<List<SHActivityEvent>> -> {
|
|
152
|
+
promise.resolve(gsonBuilder.toJson(it.data))
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
if (it is SHException) {
|
|
158
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
159
|
+
} else {
|
|
160
|
+
promise.reject("1001", it.message, it)
|
|
161
|
+
}
|
|
162
|
+
},
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Health Connect
|
|
168
|
+
@ReactMethod
|
|
169
|
+
fun getHealthConnectSleepSummary(date: String, promise: Promise) {
|
|
170
|
+
val localDate = RookDateTime.stringToLocalDate(date)
|
|
171
|
+
|
|
172
|
+
scope.launch {
|
|
173
|
+
rookHealthConnect.getSleepSummary(localDate).fold(
|
|
174
|
+
{
|
|
175
|
+
when (it) {
|
|
176
|
+
SyncStatusWithData.RecordsNotFound -> {
|
|
177
|
+
promise.reject("HealthConnectSleepSummary", "Records Not Found For Date: $date")
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
is SyncStatusWithData.Synced<List<HCSleepSummary>> -> {
|
|
181
|
+
promise.resolve(gsonBuilder.toJson(it.data))
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
if (it is HCException) {
|
|
187
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
188
|
+
} else {
|
|
189
|
+
promise.reject("1001", it.message, it)
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
)
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
@ReactMethod
|
|
197
|
+
fun getHealthConnectPhysicalSummary(date: String, promise: Promise) {
|
|
198
|
+
val localDate = RookDateTime.stringToLocalDate(date)
|
|
199
|
+
|
|
200
|
+
scope.launch {
|
|
201
|
+
rookHealthConnect.getPhysicalSummary(localDate).fold(
|
|
202
|
+
{
|
|
203
|
+
when (it) {
|
|
204
|
+
SyncStatusWithData.RecordsNotFound -> {
|
|
205
|
+
promise.reject("HealthConnectPhysicalSummary", "Records Not Found For Date: $date")
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
is SyncStatusWithData.Synced<HCPhysicalSummary> -> {
|
|
209
|
+
promise.resolve(gsonBuilder.toJson(it.data))
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
if (it is HCException) {
|
|
215
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
216
|
+
} else {
|
|
217
|
+
promise.reject("1001", it.message, it)
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
)
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
@ReactMethod
|
|
225
|
+
fun getHealthConnectBodySummary(date: String, promise: Promise) {
|
|
226
|
+
val localDate = RookDateTime.stringToLocalDate(date)
|
|
227
|
+
|
|
228
|
+
scope.launch {
|
|
229
|
+
rookHealthConnect.getBodySummary(localDate).fold(
|
|
230
|
+
{
|
|
231
|
+
when (it) {
|
|
232
|
+
SyncStatusWithData.RecordsNotFound -> {
|
|
233
|
+
promise.reject("HealthConnectBodySummary", "Records Not Found For Date: $date")
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
is SyncStatusWithData.Synced<HCBodySummary> -> {
|
|
237
|
+
promise.resolve(gsonBuilder.toJson(it.data))
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
if (it is HCException) {
|
|
243
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
244
|
+
} else {
|
|
245
|
+
promise.reject("1001", it.message, it)
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
)
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
@ReactMethod
|
|
253
|
+
fun getHealthConnectActivityEvents(date: String, promise: Promise) {
|
|
254
|
+
val localDate = RookDateTime.stringToLocalDate(date)
|
|
255
|
+
|
|
256
|
+
scope.launch {
|
|
257
|
+
rookHealthConnect.getActivityEvents(localDate).fold(
|
|
258
|
+
{
|
|
259
|
+
when (it) {
|
|
260
|
+
SyncStatusWithData.RecordsNotFound -> {
|
|
261
|
+
promise.reject("HealthConnectActivityEvents", "Records Not Found For Date: $date")
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
is SyncStatusWithData.Synced<List<HCActivityEvent>> -> {
|
|
265
|
+
promise.resolve(gsonBuilder.toJson(it.data))
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
if (it is HCException) {
|
|
271
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
272
|
+
} else {
|
|
273
|
+
promise.reject("1001", it.message, it)
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
)
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
@OptIn(ExperimentalRookApi::class)
|
|
281
|
+
@ReactMethod
|
|
282
|
+
fun writeHealthConnectMealData(data: ReadableMap, promise: Promise){
|
|
283
|
+
val mealData = ReadableToWritable.mapReadableMapToHCMealData(data)
|
|
284
|
+
|
|
285
|
+
scope.launch {
|
|
286
|
+
RookWriteManager.writeNutritionEvent(reactContext, mealData).fold({
|
|
287
|
+
promise.resolve(true)
|
|
288
|
+
}, {
|
|
289
|
+
if (it is HCException) {
|
|
290
|
+
promise.reject(it.code.toString(), it.message, it)
|
|
291
|
+
} else {
|
|
292
|
+
promise.reject("1001", it.message, it)
|
|
293
|
+
}
|
|
294
|
+
})
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
override fun getName(): String {
|
|
299
|
+
return "RookLocalData"
|
|
300
|
+
}
|
|
301
|
+
}
|