react-native-rook-sdk 0.6.2 → 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.
Files changed (146) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/AndroidManifestNew.xml +0 -8
  3. package/android/src/main/java/com/rooksdk/RookSdkModule.kt +94 -580
  4. package/android/src/main/java/com/rooksdk/RookSdkPackage.kt +17 -1
  5. package/android/src/main/java/com/rooksdk/broadcasts/AndroidPermissionsReceiverTransmitter.kt +54 -0
  6. package/android/src/main/java/com/rooksdk/broadcasts/HealthConnectPermissionsReceiverTransmitter.kt +53 -0
  7. package/android/src/main/java/com/rooksdk/modules/RookConfigurationModule.kt +108 -0
  8. package/android/src/main/java/com/rooksdk/modules/RookPermissionsModule.kt +160 -0
  9. package/android/src/main/java/com/rooksdk/modules/RookStepsModule.kt +105 -0
  10. package/android/src/main/java/com/rooksdk/modules/RookSyncModule.kt +497 -0
  11. package/android/src/main/java/com/rooksdk/utils/DatasourcesUtils.kt +49 -0
  12. package/android/src/main/java/com/rooksdk/utils/ReadableToWritable.kt +64 -0
  13. package/android/src/main/java/com/rooksdk/utils/RookDateTime.kt +20 -0
  14. package/ios/RookSdk.mm +393 -42
  15. package/lib/commonjs/context/RookSyncGateContext.js +12 -0
  16. package/lib/commonjs/context/RookSyncGateContext.js.map +1 -1
  17. package/lib/commonjs/context/RookSyncGateProvider.js +14 -6
  18. package/lib/commonjs/context/RookSyncGateProvider.js.map +1 -1
  19. package/lib/commonjs/context/RookSyncGateReducer.js +15 -0
  20. package/lib/commonjs/context/RookSyncGateReducer.js.map +1 -1
  21. package/lib/commonjs/hooks/useRookAndroidBackgroundSteps.js +26 -38
  22. package/lib/commonjs/hooks/useRookAndroidBackgroundSteps.js.map +1 -1
  23. package/lib/commonjs/hooks/useRookAppleHealth.js +24 -10
  24. package/lib/commonjs/hooks/useRookAppleHealth.js.map +1 -1
  25. package/lib/commonjs/hooks/useRookAppleHealthVariables.js +22 -4
  26. package/lib/commonjs/hooks/useRookAppleHealthVariables.js.map +1 -1
  27. package/lib/commonjs/hooks/useRookConfiguration.js +32 -16
  28. package/lib/commonjs/hooks/useRookConfiguration.js.map +1 -1
  29. package/lib/commonjs/hooks/useRookDataSources.js +30 -5
  30. package/lib/commonjs/hooks/useRookDataSources.js.map +1 -1
  31. package/lib/commonjs/hooks/useRookEvents.js +61 -57
  32. package/lib/commonjs/hooks/useRookEvents.js.map +1 -1
  33. package/lib/commonjs/hooks/useRookPermissions.js +79 -37
  34. package/lib/commonjs/hooks/useRookPermissions.js.map +1 -1
  35. package/lib/commonjs/hooks/useRookSummaries.js +23 -29
  36. package/lib/commonjs/hooks/useRookSummaries.js.map +1 -1
  37. package/lib/commonjs/index.js +20 -8
  38. package/lib/commonjs/index.js.map +1 -1
  39. package/lib/commonjs/modules/hook/useRookAutoSync.js +133 -27
  40. package/lib/commonjs/modules/hook/useRookAutoSync.js.map +1 -1
  41. package/lib/commonjs/modules/types/sendMessageBroadcast.js +2 -0
  42. package/lib/commonjs/modules/types/sendMessageBroadcast.js.map +1 -0
  43. package/lib/commonjs/types/PermissionsType.js +2 -0
  44. package/lib/commonjs/types/PermissionsType.js.map +1 -0
  45. package/lib/commonjs/utils/getNativeModule.js +29 -0
  46. package/lib/commonjs/utils/getNativeModule.js.map +1 -0
  47. package/lib/commonjs/utils/getRookModule.js +7 -0
  48. package/lib/commonjs/utils/getRookModule.js.map +1 -1
  49. package/lib/commonjs/utils/isModuleReady.js +6 -0
  50. package/lib/commonjs/utils/isModuleReady.js.map +1 -1
  51. package/lib/commonjs/utils/isValidDate.js +6 -0
  52. package/lib/commonjs/utils/isValidDate.js.map +1 -1
  53. package/lib/commonjs/utils/nativeModules.js +19 -0
  54. package/lib/commonjs/utils/nativeModules.js.map +1 -0
  55. package/lib/module/context/RookSyncGateContext.js +12 -0
  56. package/lib/module/context/RookSyncGateContext.js.map +1 -1
  57. package/lib/module/context/RookSyncGateProvider.js +10 -2
  58. package/lib/module/context/RookSyncGateProvider.js.map +1 -1
  59. package/lib/module/context/RookSyncGateReducer.js +15 -0
  60. package/lib/module/context/RookSyncGateReducer.js.map +1 -1
  61. package/lib/module/hooks/useRookAndroidBackgroundSteps.js +14 -26
  62. package/lib/module/hooks/useRookAndroidBackgroundSteps.js.map +1 -1
  63. package/lib/module/hooks/useRookAppleHealth.js +15 -2
  64. package/lib/module/hooks/useRookAppleHealth.js.map +1 -1
  65. package/lib/module/hooks/useRookAppleHealthVariables.js +20 -2
  66. package/lib/module/hooks/useRookAppleHealthVariables.js.map +1 -1
  67. package/lib/module/hooks/useRookConfiguration.js +18 -3
  68. package/lib/module/hooks/useRookConfiguration.js.map +1 -1
  69. package/lib/module/hooks/useRookDataSources.js +27 -3
  70. package/lib/module/hooks/useRookDataSources.js.map +1 -1
  71. package/lib/module/hooks/useRookEvents.js +32 -28
  72. package/lib/module/hooks/useRookEvents.js.map +1 -1
  73. package/lib/module/hooks/useRookPermissions.js +63 -22
  74. package/lib/module/hooks/useRookPermissions.js.map +1 -1
  75. package/lib/module/hooks/useRookSummaries.js +16 -22
  76. package/lib/module/hooks/useRookSummaries.js.map +1 -1
  77. package/lib/module/index.js +2 -1
  78. package/lib/module/index.js.map +1 -1
  79. package/lib/module/modules/hook/useRookAutoSync.js +133 -28
  80. package/lib/module/modules/hook/useRookAutoSync.js.map +1 -1
  81. package/lib/module/modules/types/sendMessageBroadcast.js +2 -0
  82. package/lib/module/modules/types/sendMessageBroadcast.js.map +1 -0
  83. package/lib/module/types/PermissionsType.js +2 -0
  84. package/lib/module/types/PermissionsType.js.map +1 -0
  85. package/lib/module/utils/getNativeModule.js +23 -0
  86. package/lib/module/utils/getNativeModule.js.map +1 -0
  87. package/lib/module/utils/getRookModule.js +8 -0
  88. package/lib/module/utils/getRookModule.js.map +1 -1
  89. package/lib/module/utils/isModuleReady.js +6 -0
  90. package/lib/module/utils/isModuleReady.js.map +1 -1
  91. package/lib/module/utils/isValidDate.js +6 -0
  92. package/lib/module/utils/isValidDate.js.map +1 -1
  93. package/lib/module/utils/nativeModules.js +13 -0
  94. package/lib/module/utils/nativeModules.js.map +1 -0
  95. package/lib/typescript/src/context/RookSyncGateContext.d.ts +7 -0
  96. package/lib/typescript/src/context/RookSyncGateContext.d.ts.map +1 -1
  97. package/lib/typescript/src/context/RookSyncGateProvider.d.ts.map +1 -1
  98. package/lib/typescript/src/context/RookSyncGateReducer.d.ts +15 -0
  99. package/lib/typescript/src/context/RookSyncGateReducer.d.ts.map +1 -1
  100. package/lib/typescript/src/hooks/useRookAndroidBackgroundSteps.d.ts +6 -2
  101. package/lib/typescript/src/hooks/useRookAndroidBackgroundSteps.d.ts.map +1 -1
  102. package/lib/typescript/src/hooks/useRookAppleHealth.d.ts +1 -1
  103. package/lib/typescript/src/hooks/useRookAppleHealth.d.ts.map +1 -1
  104. package/lib/typescript/src/hooks/useRookAppleHealthVariables.d.ts +9 -0
  105. package/lib/typescript/src/hooks/useRookAppleHealthVariables.d.ts.map +1 -1
  106. package/lib/typescript/src/hooks/useRookConfiguration.d.ts +7 -1
  107. package/lib/typescript/src/hooks/useRookConfiguration.d.ts.map +1 -1
  108. package/lib/typescript/src/hooks/useRookDataSources.d.ts +8 -1
  109. package/lib/typescript/src/hooks/useRookDataSources.d.ts.map +1 -1
  110. package/lib/typescript/src/hooks/useRookEvents.d.ts +9 -1
  111. package/lib/typescript/src/hooks/useRookEvents.d.ts.map +1 -1
  112. package/lib/typescript/src/hooks/useRookPermissions.d.ts +16 -3
  113. package/lib/typescript/src/hooks/useRookPermissions.d.ts.map +1 -1
  114. package/lib/typescript/src/hooks/useRookSummaries.d.ts +6 -6
  115. package/lib/typescript/src/hooks/useRookSummaries.d.ts.map +1 -1
  116. package/lib/typescript/src/index.d.ts +2 -1
  117. package/lib/typescript/src/index.d.ts.map +1 -1
  118. package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts +18 -1
  119. package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts.map +1 -1
  120. package/lib/typescript/src/modules/types/sendMessageBroadcast.d.ts +6 -0
  121. package/lib/typescript/src/modules/types/sendMessageBroadcast.d.ts.map +1 -0
  122. package/lib/typescript/src/types/DataSource.d.ts +1 -0
  123. package/lib/typescript/src/types/DataSource.d.ts.map +1 -1
  124. package/lib/typescript/src/types/PermissionsType.d.ts +6 -0
  125. package/lib/typescript/src/types/PermissionsType.d.ts.map +1 -0
  126. package/lib/typescript/src/utils/getNativeModule.d.ts +10 -0
  127. package/lib/typescript/src/utils/getNativeModule.d.ts.map +1 -0
  128. package/lib/typescript/src/utils/getRookModule.d.ts +7 -0
  129. package/lib/typescript/src/utils/getRookModule.d.ts.map +1 -1
  130. package/lib/typescript/src/utils/isModuleReady.d.ts +6 -0
  131. package/lib/typescript/src/utils/isModuleReady.d.ts.map +1 -1
  132. package/lib/typescript/src/utils/isValidDate.d.ts +6 -0
  133. package/lib/typescript/src/utils/isValidDate.d.ts.map +1 -1
  134. package/lib/typescript/src/utils/nativeModules.d.ts +14 -0
  135. package/lib/typescript/src/utils/nativeModules.d.ts.map +1 -0
  136. package/package.json +1 -1
  137. package/react-native-rook-sdk.podspec +1 -1
  138. package/android/src/main/java/com/rooksdk/HealthConnectPermissionsActivity.kt +0 -40
  139. package/android/src/main/java/com/rooksdk/RookDateTime.kt +0 -12
  140. package/android/src/main/res/layout/activity_health_connect_permissions.xml +0 -15
  141. package/lib/commonjs/utils/index.js +0 -69
  142. package/lib/commonjs/utils/index.js.map +0 -1
  143. package/lib/module/utils/index.js +0 -9
  144. package/lib/module/utils/index.js.map +0 -1
  145. package/lib/typescript/src/utils/index.d.ts +0 -9
  146. package/lib/typescript/src/utils/index.d.ts.map +0 -1
@@ -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
- return listOf(RookSdkModule(reactContext))
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<*, *>> {
@@ -0,0 +1,54 @@
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
+ * AndroidPermissionsReceiverTransmitter 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 AndroidPermissionsReceiverTransmitter: 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_ANDROID_PERMISSIONS_GRANTED,
30
+ /* defaultValue = */ false
31
+ ) ?: false
32
+
33
+ if (reactApplicationContext == null) return
34
+
35
+ val params = Arguments.createMap().apply {
36
+ putString("type", "ROOK_BACKGROUND_ANDROID_PERMISSIONS")
37
+ putBoolean("value", permissionsGranted)
38
+ }
39
+
40
+ reactApplicationContext!!
41
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
42
+ .emit("ROOK_NOTIFICATION", params)
43
+ }
44
+
45
+ /**
46
+ * Sets the ReactApplicationContext to be used for emitting events to the React Native side.
47
+ *
48
+ * @param context The ReactApplicationContext provided by React Native.
49
+ */
50
+ fun setReactApplicationContext(context: ReactApplicationContext) {
51
+ this.reactApplicationContext = context
52
+ }
53
+
54
+ }
@@ -0,0 +1,53 @@
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
+ if (reactApplicationContext == null) return
34
+
35
+ val params = Arguments.createMap().apply {
36
+ putString("type", "ROOK_HEALTH_CONNECT_PERMISSIONS")
37
+ putBoolean("value", permissionsGranted)
38
+ }
39
+
40
+ reactApplicationContext!!
41
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
42
+ .emit("ROOK_NOTIFICATION", params)
43
+ }
44
+
45
+ /**
46
+ * Sets the ReactApplicationContext to be used for emitting events to the React Native side.
47
+ *
48
+ * @param context The ReactApplicationContext provided by React Native.
49
+ */
50
+ fun setReactApplicationContext(context: ReactApplicationContext) {
51
+ this.reactApplicationContext = context
52
+ }
53
+ }
@@ -0,0 +1,108 @@
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.RookConfigurationManager
8
+ import kotlinx.coroutines.CoroutineScope
9
+ import kotlinx.coroutines.Dispatchers
10
+ import kotlinx.coroutines.SupervisorJob
11
+ import kotlinx.coroutines.launch
12
+
13
+ class RookConfigurationModule(
14
+ reactContext: ReactApplicationContext,
15
+ private val rookConfigurationManager: RookConfigurationManager
16
+ ): ReactContextBaseJavaModule(reactContext) {
17
+
18
+ private val scope: CoroutineScope by lazy {
19
+ CoroutineScope(SupervisorJob() + Dispatchers.Main)
20
+ }
21
+
22
+ /**
23
+ * Retrieves the currently stored user ID in the Rook SDK configuration.
24
+ * @param promise A promise object to handle the result (resolved with the user ID or rejected with an error).
25
+ */
26
+ @ReactMethod
27
+ fun getUserID(promise: Promise) {
28
+ scope.launch {
29
+ try {
30
+ promise.resolve(rookConfigurationManager.getUserID())
31
+ }
32
+ catch (e: Exception) {
33
+ promise.reject(e)
34
+ }
35
+ }
36
+ }
37
+
38
+ /**
39
+ * Updates the user ID in the Rook SDK configuration.
40
+ * @param userID The new user ID to be set.
41
+ * @param promise A promise object to handle the result (resolved on success, rejected on failure).
42
+ */
43
+ @ReactMethod
44
+ fun updateUserID(userID: String, promise: Promise) {
45
+ scope.launch {
46
+ rookConfigurationManager.updateUserID(userID).fold({
47
+ promise.resolve(true)
48
+ }, {
49
+ promise.reject(it)
50
+ })
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Clears the user ID stored in the Rook SDK configuration.
56
+ * @param promise A promise object to handle the result (resolved on success, rejected on failure).
57
+ */
58
+ @ReactMethod
59
+ fun clearUserID(promise: Promise) {
60
+ scope.launch {
61
+ rookConfigurationManager.clearUserID().fold({
62
+ promise.resolve(true)
63
+ }, {
64
+ promise.reject(it)
65
+ })
66
+ }
67
+ }
68
+
69
+ /**
70
+ * Deletes the user data from the Rook platform by removing the user from the system.
71
+ * @param promise A promise object to handle the result (resolved on success, rejected on failure).
72
+ */
73
+ @ReactMethod
74
+ fun removeUserFromRook(promise: Promise) {
75
+ scope.launch {
76
+ val result = rookConfigurationManager.deleteUserFromRook()
77
+
78
+ result.fold({
79
+ promise.resolve(true)
80
+ }, {
81
+ promise.reject(it)
82
+ })
83
+ }
84
+ }
85
+
86
+ /**
87
+ * Synchronizes the user's time zone with the Rook platform to ensure data is processed correctly.
88
+ * @param promise A promise object to handle the result (resolved on success, rejected on failure).
89
+ */
90
+ @ReactMethod
91
+ fun syncUserTimeZone(promise: Promise) {
92
+ scope.launch {
93
+ val result = rookConfigurationManager.syncUserTimeZone()
94
+
95
+ result.fold({
96
+ promise.resolve(true)
97
+ }, {
98
+ promise.reject(it)
99
+ })
100
+ }
101
+ }
102
+
103
+ override fun getName(): String {
104
+ return "RookConfigurationModule"
105
+ }
106
+
107
+
108
+ }
@@ -0,0 +1,160 @@
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.RookPermissionsManager
8
+ import com.rookmotion.rook.sdk.domain.enums.HealthConnectAvailability
9
+ import com.rookmotion.rook.sdk.domain.enums.RequestPermissionsStatus
10
+ import kotlinx.coroutines.CoroutineScope
11
+ import kotlinx.coroutines.Dispatchers
12
+ import kotlinx.coroutines.SupervisorJob
13
+ import kotlinx.coroutines.launch
14
+
15
+ class RookPermissionsModule(reactContext: ReactApplicationContext):
16
+ ReactContextBaseJavaModule(reactContext) {
17
+
18
+ private val rookPermissionsManager: RookPermissionsManager by lazy {
19
+ RookPermissionsManager(reactContext)
20
+ }
21
+
22
+ private val scope: CoroutineScope by lazy {
23
+ CoroutineScope(SupervisorJob() + Dispatchers.Main)
24
+ }
25
+
26
+ /**
27
+ * Checks the availability of Health Connect on the device (whether it is installed, not installed, or not supported).
28
+ * @param promise A promise object to handle the result (resolved with the availability status or rejected on failure).
29
+ */
30
+ @ReactMethod
31
+ fun checkAvailability(promise: Promise) {
32
+ val r = rookPermissionsManager.checkHealthConnectAvailability()
33
+
34
+ when(r) {
35
+ HealthConnectAvailability.INSTALLED -> promise.resolve("INSTALED")
36
+ HealthConnectAvailability.NOT_INSTALLED -> promise.resolve("NOT_INSTALED")
37
+ HealthConnectAvailability.NOT_SUPPORTED -> promise.resolve("NOT_SUPPORTED")
38
+ }
39
+ }
40
+
41
+ /**
42
+ * Opens the Health Connect settings page on the device for the user to manage permissions.
43
+ * @param promise A promise object to handle the result (resolved on success, rejected on failure).
44
+ */
45
+ @ReactMethod
46
+ fun openHealthConnectSettings(promise: Promise) {
47
+ scope.launch {
48
+
49
+ val result = rookPermissionsManager.openHealthConnectSettings()
50
+
51
+ result.fold({
52
+ promise.resolve(true)
53
+ },{
54
+ promise.reject(it)
55
+ })
56
+
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Checks the current permissions granted by Health Connect to ensure the application has the necessary access.
62
+ * @param promise A promise object to handle the result (resolved with permission status or rejected on failure).
63
+ */
64
+ @ReactMethod
65
+ fun checkPermissions(promise: Promise) {
66
+ scope.launch {
67
+ val result = rookPermissionsManager.checkHealthConnectPermissions()
68
+
69
+ result.fold({
70
+ promise.resolve(it)
71
+ }, {
72
+ promise.reject(it)
73
+ })
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Requests Health Connect permissions from the user if they are not already granted.
79
+ * @param promise A promise object to handle the result (resolved with the permission status or rejected on failure).
80
+ */
81
+ @ReactMethod
82
+ fun requestAllPermissions(promise: Promise) {
83
+ scope.launch {
84
+ rookPermissionsManager.requestHealthConnectPermissions().fold({
85
+ when(it) {
86
+ RequestPermissionsStatus.REQUEST_SENT -> {
87
+ promise.resolve("REQUEST_SENT")
88
+ }
89
+ RequestPermissionsStatus .ALREADY_GRANTED -> {
90
+ promise.resolve("ALREADY_GRANTED")
91
+ }
92
+ }
93
+ }, {
94
+ promise.reject(it)
95
+ })
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Checks if the SDK has permissions to use background permissions
101
+ * */
102
+ @ReactMethod
103
+ fun hasAndroidBackgroundPermissions(promise: Promise) {
104
+ try {
105
+ val result = rookPermissionsManager.checkAndroidPermissions()
106
+ promise.resolve(result)
107
+ }
108
+ catch (e: Exception) {
109
+ promise.reject(e)
110
+ }
111
+ }
112
+
113
+ /**
114
+ * Requests Android permissions for step counting if they are not already granted.
115
+ * @param promise A promise object to handle the result (resolved with the permission status or rejected on failure).
116
+ */
117
+ @ReactMethod
118
+ fun requestAndroidBackgroundPermissions(promise: Promise) {
119
+ try {
120
+ val response = rookPermissionsManager.requestAndroidPermissions()
121
+
122
+ if (response == RequestPermissionsStatus.REQUEST_SENT)
123
+ promise.resolve("REQUEST_SENT")
124
+ else promise.resolve("ALREADY_GRANTED")
125
+ }
126
+ catch (e: Exception) {
127
+ promise.reject(e)
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Check if the SDK should request permissions to use android services
133
+ * to show an sticky notification
134
+ * */
135
+ @ReactMethod
136
+ fun shouldRequestAndroidBackgroundPermissions(promise: Promise) {
137
+ val activity = reactApplicationContext.currentActivity
138
+
139
+ if (activity == null) {
140
+ promise.reject(Exception("Error trying to request permissions"))
141
+ return
142
+ }
143
+
144
+ try {
145
+ val r = RookPermissionsManager.shouldRequestAndroidPermissions(activity)
146
+ promise.resolve(r)
147
+ }
148
+ catch (e: Exception) {
149
+ promise.reject(e)
150
+ }
151
+ }
152
+
153
+ companion object {
154
+ const val NAME = "RookPermissionsModule"
155
+ }
156
+
157
+ override fun getName(): String {
158
+ return NAME
159
+ }
160
+ }
@@ -0,0 +1,105 @@
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.RookStepsManager
8
+ import kotlinx.coroutines.CoroutineScope
9
+ import kotlinx.coroutines.Dispatchers
10
+ import kotlinx.coroutines.SupervisorJob
11
+ import kotlinx.coroutines.cancel
12
+ import kotlinx.coroutines.launch
13
+
14
+ class RookStepsModule(
15
+ reactContext: ReactApplicationContext
16
+ ): ReactContextBaseJavaModule(reactContext) {
17
+
18
+ private val scope: CoroutineScope by lazy {
19
+ CoroutineScope(SupervisorJob() + Dispatchers.Main)
20
+ }
21
+
22
+ private val rookStepsManager: RookStepsManager by lazy {
23
+ RookStepsManager(reactApplicationContext)
24
+ }
25
+
26
+ /**
27
+ * Checks if step count data is available on the device.
28
+ * @param promise A promise object to handle the result (resolved with true/false).
29
+ */
30
+ @ReactMethod
31
+ fun isStepsAvailable(promise: Promise) {
32
+ promise.resolve(rookStepsManager.isAvailable())
33
+ }
34
+
35
+ /**
36
+ * Enables background step counting on Android devices, allowing the app to track steps continuously.
37
+ * @param promise A promise object to handle the result (resolved on success, rejected on failure).
38
+ */
39
+ @ReactMethod
40
+ fun enableBackgroundAndroidSteps(promise: Promise) {
41
+ rookStepsManager.enableBackgroundAndroidSteps().fold({
42
+ promise.resolve(true)
43
+ }, {
44
+ promise.reject(it)
45
+ })
46
+ }
47
+
48
+ /**
49
+ * Disables background step counting on Android devices.
50
+ * @param promise A promise object to handle the result (resolved on success, rejected on failure).
51
+ */
52
+ @ReactMethod
53
+ fun disableBackgroundAndroidSteps(promise: Promise) {
54
+ rookStepsManager
55
+ .disableBackgroundAndroidSteps()
56
+ .fold({
57
+ scope.cancel()
58
+ promise.resolve(true)
59
+ }, {
60
+ promise.reject(it)
61
+ })
62
+ }
63
+
64
+ /**
65
+ * Checks whether background step tracking on Android is currently active.
66
+ * This method queries the Rook SDK to determine if background step counting
67
+ * is enabled and active on the device.
68
+ *
69
+ * @param promise A promise object that resolves with a boolean value:
70
+ * - true if background step tracking is active,
71
+ * - false otherwise.
72
+ */
73
+ @ReactMethod
74
+ fun isBackgroundAndroidStepsActive(promise: Promise) {
75
+ scope.launch {
76
+ val response = rookStepsManager.isBackgroundAndroidStepsActive()
77
+ promise.resolve(response)
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Synchronizes the step count for the current day
83
+ * This method queries the Rook SDK to retrieve the number of steps counted today
84
+ * from the Android platform and returns the result to the React Native layer.
85
+ *
86
+ * @param promise A promise object that resolves with the step count as a string
87
+ * or rejects with an error if the synchronization fails.
88
+ */
89
+ @ReactMethod
90
+ fun syncTodayAndroidStepsCount(promise: Promise) {
91
+ scope.launch {
92
+ rookStepsManager
93
+ .syncTodayAndroidStepsCount()
94
+ .fold({
95
+ promise.resolve(it.toString())
96
+ }, {
97
+ promise.reject(it)
98
+ })
99
+ }
100
+ }
101
+
102
+ override fun getName(): String {
103
+ return "RookStepsModule"
104
+ }
105
+ }