react-native-rook-sdk 1.3.2 → 2.0.0-beta.1

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 (84) hide show
  1. package/android/build.gradle +2 -1
  2. package/android/src/main/java/com/rooksdk/RookSdkModule.kt +66 -15
  3. package/android/src/main/java/com/rooksdk/RookSdkPackage.kt +10 -5
  4. package/android/src/main/java/com/rooksdk/broadcasts/SamsungHealthPermissionsReceiverTransmitter.kt +52 -0
  5. package/android/src/main/java/com/rooksdk/modules/RookConfigurationModule.kt +57 -17
  6. package/android/src/main/java/com/rooksdk/modules/RookPermissionsModule.kt +92 -2
  7. package/android/src/main/java/com/rooksdk/modules/RookSyncModule.kt +157 -296
  8. package/android/src/main/java/com/rooksdk/utils/DatasourcesUtils.kt +14 -0
  9. package/android/src/main/java/com/rooksdk/utils/PermissionConversion.kt +21 -0
  10. package/android/src/main/java/com/rooksdk/utils/SamsungAvailability.kt +21 -0
  11. package/android/src/main/java/com/rooksdk/utils/Source.kt +6 -0
  12. package/android/src/main/java/com/rooksdk/utils/StringToSyncType.kt +25 -0
  13. package/lib/commonjs/hooks/index.js +7 -0
  14. package/lib/commonjs/hooks/index.js.map +1 -1
  15. package/lib/commonjs/hooks/useRookAppleHealthVariables.js +1 -0
  16. package/lib/commonjs/hooks/useRookAppleHealthVariables.js.map +1 -1
  17. package/lib/commonjs/hooks/useRookConfiguration.js +33 -14
  18. package/lib/commonjs/hooks/useRookConfiguration.js.map +1 -1
  19. package/lib/commonjs/hooks/useRookDataSources.js +1 -0
  20. package/lib/commonjs/hooks/useRookDataSources.js.map +1 -1
  21. package/lib/commonjs/hooks/useRookPermissions.js +32 -5
  22. package/lib/commonjs/hooks/useRookPermissions.js.map +1 -1
  23. package/lib/commonjs/hooks/useRookSync.js +103 -25
  24. package/lib/commonjs/hooks/useRookSync.js.map +1 -1
  25. package/lib/commonjs/hooks/useRookVariables.js +69 -0
  26. package/lib/commonjs/hooks/useRookVariables.js.map +1 -0
  27. package/lib/commonjs/index.js +17 -1
  28. package/lib/commonjs/index.js.map +1 -1
  29. package/lib/commonjs/modules/hook/useRookAutoSync.js +25 -2
  30. package/lib/commonjs/modules/hook/useRookAutoSync.js.map +1 -1
  31. package/lib/commonjs/modules/utils/errors.js +1 -1
  32. package/lib/commonjs/modules/utils/errors.js.map +1 -1
  33. package/lib/commonjs/types/SDKSources.js +13 -0
  34. package/lib/commonjs/types/SDKSources.js.map +1 -0
  35. package/lib/commonjs/types/SamsungHealthPermissions.js +23 -0
  36. package/lib/commonjs/types/SamsungHealthPermissions.js.map +1 -0
  37. package/lib/commonjs/types/SyncTypes.js +4 -0
  38. package/lib/module/hooks/index.js +1 -0
  39. package/lib/module/hooks/index.js.map +1 -1
  40. package/lib/module/hooks/useRookAppleHealthVariables.js +1 -0
  41. package/lib/module/hooks/useRookAppleHealthVariables.js.map +1 -1
  42. package/lib/module/hooks/useRookConfiguration.js +33 -15
  43. package/lib/module/hooks/useRookConfiguration.js.map +1 -1
  44. package/lib/module/hooks/useRookDataSources.js +1 -0
  45. package/lib/module/hooks/useRookDataSources.js.map +1 -1
  46. package/lib/module/hooks/useRookPermissions.js +32 -5
  47. package/lib/module/hooks/useRookPermissions.js.map +1 -1
  48. package/lib/module/hooks/useRookSync.js +103 -25
  49. package/lib/module/hooks/useRookSync.js.map +1 -1
  50. package/lib/module/hooks/useRookVariables.js +61 -0
  51. package/lib/module/hooks/useRookVariables.js.map +1 -0
  52. package/lib/module/index.js +2 -0
  53. package/lib/module/index.js.map +1 -1
  54. package/lib/module/modules/hook/useRookAutoSync.js +25 -2
  55. package/lib/module/modules/hook/useRookAutoSync.js.map +1 -1
  56. package/lib/module/modules/utils/errors.js +1 -1
  57. package/lib/module/modules/utils/errors.js.map +1 -1
  58. package/lib/module/types/SDKSources.js +7 -0
  59. package/lib/module/types/SDKSources.js.map +1 -0
  60. package/lib/module/types/SamsungHealthPermissions.js +17 -0
  61. package/lib/module/types/SamsungHealthPermissions.js.map +1 -0
  62. package/lib/module/types/SyncTypes.js +1 -1
  63. package/lib/typescript/src/hooks/index.d.ts +1 -0
  64. package/lib/typescript/src/hooks/index.d.ts.map +1 -1
  65. package/lib/typescript/src/hooks/useRookAppleHealthVariables.d.ts +1 -0
  66. package/lib/typescript/src/hooks/useRookAppleHealthVariables.d.ts.map +1 -1
  67. package/lib/typescript/src/hooks/useRookConfiguration.d.ts +8 -4
  68. package/lib/typescript/src/hooks/useRookConfiguration.d.ts.map +1 -1
  69. package/lib/typescript/src/hooks/useRookDataSources.d.ts.map +1 -1
  70. package/lib/typescript/src/hooks/useRookPermissions.d.ts +9 -4
  71. package/lib/typescript/src/hooks/useRookPermissions.d.ts.map +1 -1
  72. package/lib/typescript/src/hooks/useRookSync.d.ts.map +1 -1
  73. package/lib/typescript/src/hooks/useRookVariables.d.ts +22 -0
  74. package/lib/typescript/src/hooks/useRookVariables.d.ts.map +1 -0
  75. package/lib/typescript/src/index.d.ts +2 -0
  76. package/lib/typescript/src/index.d.ts.map +1 -1
  77. package/lib/typescript/src/modules/hook/useRookAutoSync.d.ts.map +1 -1
  78. package/lib/typescript/src/types/SDKSources.d.ts +6 -0
  79. package/lib/typescript/src/types/SDKSources.d.ts.map +1 -0
  80. package/lib/typescript/src/types/SamsungHealthPermissions.d.ts +16 -0
  81. package/lib/typescript/src/types/SamsungHealthPermissions.d.ts.map +1 -0
  82. package/lib/typescript/src/types/SyncTypes.d.ts +15 -1
  83. package/lib/typescript/src/types/SyncTypes.d.ts.map +1 -1
  84. package/package.json +1 -1
@@ -90,8 +90,9 @@ dependencies {
90
90
  //noinspection GradleDynamicVersion
91
91
  implementation "com.facebook.react:react-native:+"
92
92
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
93
- implementation 'com.google.code.gson:gson:2.11.0'
93
+ implementation 'com.google.code.gson:gson:2.13.0'
94
94
 
95
+ implementation("io.tryrook.android:rook-sdk-samsung:1.0.0-beta01")
95
96
  implementation 'com.rookmotion.android:rook-sdk:2.1.0'
96
97
  }
97
98
 
@@ -1,6 +1,7 @@
1
1
  package com.rooksdk
2
2
 
3
3
  import android.content.IntentFilter
4
+ import android.util.Log
4
5
  import androidx.core.content.ContextCompat
5
6
  import com.facebook.react.bridge.Promise
6
7
  import com.facebook.react.bridge.ReactApplicationContext
@@ -17,7 +18,18 @@ import com.rookmotion.rook.sdk.domain.environment.RookEnvironment
17
18
  import com.rookmotion.rook.sdk.domain.model.RookConfiguration
18
19
  import com.rooksdk.broadcasts.AndroidPermissionsReceiverTransmitter
19
20
  import com.rooksdk.broadcasts.HealthConnectPermissionsReceiverTransmitter
21
+ import com.rooksdk.broadcasts.SamsungHealthPermissionsReceiverTransmitter
20
22
  import com.rooksdk.utils.ReadableToWritable
23
+ import com.rooksdk.utils.SamsungAvailability
24
+ import io.tryrook.sdk.samsung.RookSamsung
25
+ import io.tryrook.sdk.samsung.RookSamsungObject
26
+ import io.tryrook.sdk.samsung.domain.analytics.SHRookAnalytics
27
+ import io.tryrook.sdk.samsung.domain.analytics.SHRookFramework
28
+ import io.tryrook.sdk.samsung.domain.enums.SamsungHealthAvailability
29
+ import io.tryrook.sdk.samsung.domain.enums.SamsungHealthPermission
30
+ import io.tryrook.sdk.samsung.domain.environment.SHAndroidClass
31
+ import io.tryrook.sdk.samsung.domain.environment.SHEnvironment
32
+ import io.tryrook.sdk.samsung.domain.model.SHConfiguration
21
33
  import kotlinx.coroutines.CoroutineScope
22
34
  import kotlinx.coroutines.Dispatchers
23
35
  import kotlinx.coroutines.SupervisorJob
@@ -49,7 +61,8 @@ import kotlinx.coroutines.launch
49
61
  */
50
62
  class RookSdkModule(
51
63
  reactContext: ReactApplicationContext,
52
- private val rookConfigurationManager: RookConfigurationManager
64
+ private val rookConfigurationManager: RookConfigurationManager,
65
+ private val rookSamsung: RookSamsung
53
66
  ): ReactContextBaseJavaModule(reactContext) {
54
67
 
55
68
  private var scope: CoroutineScope = CoroutineScope(SupervisorJob() + Dispatchers.Main)
@@ -67,6 +80,10 @@ class RookSdkModule(
67
80
  HealthConnectPermissionsReceiverTransmitter()
68
81
  }
69
82
 
83
+ private val shHealthPermissionsReceiverTransmitter: SamsungHealthPermissionsReceiverTransmitter by lazy {
84
+ SamsungHealthPermissionsReceiverTransmitter()
85
+ }
86
+
70
87
  override fun getName(): String {
71
88
  return NAME
72
89
  }
@@ -76,6 +93,7 @@ class RookSdkModule(
76
93
  if (listenerCount == 0) {
77
94
  androidPermissionsReceiverTransmitter.setReactApplicationContext(reactApplicationContext)
78
95
  hcPermissionsReceiverTransmitter.setReactApplicationContext(reactApplicationContext)
96
+ shHealthPermissionsReceiverTransmitter.setReactApplicationContext(reactApplicationContext)
79
97
 
80
98
  ContextCompat.registerReceiver(
81
99
  reactApplicationContext,
@@ -90,6 +108,13 @@ class RookSdkModule(
90
108
  IntentFilter(RookPermissionsManager.ACTION_HEALTH_CONNECT_PERMISSIONS),
91
109
  ContextCompat.RECEIVER_EXPORTED,
92
110
  )
111
+
112
+ ContextCompat.registerReceiver(
113
+ reactApplicationContext,
114
+ shHealthPermissionsReceiverTransmitter,
115
+ IntentFilter(SamsungHealthPermission.ACTION_SAMSUNG_HEALTH_PERMISSIONS),
116
+ ContextCompat.RECEIVER_EXPORTED
117
+ )
93
118
  }
94
119
 
95
120
  listenerCount += 1
@@ -124,12 +149,12 @@ class RookSdkModule(
124
149
  }
125
150
 
126
151
  var environment = RookEnvironment.SANDBOX
152
+ var shEnv = SHEnvironment.SANDBOX
127
153
 
128
- if (config.getString("environment") == "production")
154
+ if (config.getString("environment") == "production") {
129
155
  environment = RookEnvironment.PRODUCTION
130
-
131
- if (config.getString("environment") == "development") RookAndroidClass.test()
132
- else RookAndroidClass.disableTest()
156
+ shEnv = SHEnvironment.SANDBOX
157
+ }
133
158
 
134
159
  val rookConfiguration = RookConfiguration(
135
160
  environment = environment,
@@ -137,24 +162,39 @@ class RookSdkModule(
137
162
  secretKey = secretKey
138
163
  )
139
164
 
165
+ val shConfig = SHConfiguration(
166
+ environment = shEnv,
167
+ clientUUID = clientUUID,
168
+ secretKey = secretKey
169
+ )
170
+
140
171
  val enableLogs = config.getBoolean("enableLogs")
141
- if(enableLogs) rookConfigurationManager.enableLocalLogs()
172
+ if(enableLogs) {
173
+ rookConfigurationManager.enableLocalLogs()
174
+ rookSamsung.enableLocalLogs()
175
+ }
142
176
 
143
177
  rookConfigurationManager.setConfiguration(rookConfiguration)
144
178
 
145
179
  RookAnalytics.setFramework(RookFramework.REACT_NATIVE)
180
+ SHRookAnalytics.setFramework(SHRookFramework.REACT_NATIVE)
146
181
 
147
182
  scope.launch {
148
- val result = rookConfigurationManager.initRook()
149
-
150
- result.fold(
151
- {
152
- promise.resolve(true)
153
- },
154
- {
155
- promise.reject(it)
183
+ try {
184
+ val result = rookConfigurationManager.initRook()
185
+ result.getOrThrow()
186
+
187
+ val availableResult = SamsungAvailability.getSamsungHealthAvailabilityOrDefault(rookSamsung)
188
+
189
+ if (availableResult == SamsungHealthAvailability.INSTALLED) {
190
+ rookSamsung.initRook(shConfig)
191
+ tryToSetSamsungUserId()
156
192
  }
157
- )
193
+
194
+ promise.resolve(true)
195
+ } catch (e: Throwable) {
196
+ promise.reject(e)
197
+ }
158
198
  }
159
199
  }
160
200
  catch (e: Exception) {
@@ -163,6 +203,17 @@ class RookSdkModule(
163
203
 
164
204
  }
165
205
 
206
+ private fun tryToSetSamsungUserId() {
207
+ scope.launch {
208
+ val result = rookConfigurationManager.getUserID()
209
+
210
+ if (result != null) {
211
+ val user = rookSamsung.updateUserID(result)
212
+ user.getOrNull()
213
+ }
214
+ }
215
+ }
216
+
166
217
  /**
167
218
  * Sends a broadcast message to the React Native layer.
168
219
  * This method emits a message event to the React Native side via the
@@ -1,5 +1,6 @@
1
1
  package com.rooksdk
2
2
 
3
+ import RookSyncModule
3
4
  import com.facebook.react.ReactPackage
4
5
  import com.facebook.react.bridge.NativeModule
5
6
  import com.facebook.react.bridge.ReactApplicationContext
@@ -9,21 +10,25 @@ import com.rooksdk.modules.RookBackgroundSyncModule
9
10
  import com.rooksdk.modules.RookConfigurationModule
10
11
  import com.rooksdk.modules.RookPermissionsModule
11
12
  import com.rooksdk.modules.RookStepsModule
12
- import com.rooksdk.modules.RookSyncModule
13
+ import io.tryrook.sdk.samsung.RookSamsung
13
14
 
14
15
 
15
16
  class RookSdkPackage : ReactPackage {
16
17
  private var rookConfigurationManager: RookConfigurationManager? = null
18
+ private var rookSamsung: RookSamsung? = null
17
19
 
18
20
  override fun createNativeModules(reactContext: ReactApplicationContext): List<NativeModule> {
19
21
  if (rookConfigurationManager == null)
20
22
  rookConfigurationManager = RookConfigurationManager(reactContext)
21
23
 
24
+ if (rookSamsung == null)
25
+ rookSamsung = RookSamsung(reactContext)
26
+
22
27
  return listOf(
23
- RookSdkModule(reactContext, rookConfigurationManager!!),
24
- RookPermissionsModule(reactContext),
25
- RookConfigurationModule(reactContext, rookConfigurationManager!!),
26
- RookSyncModule(reactContext, rookConfigurationManager!!),
28
+ RookSdkModule(reactContext, rookConfigurationManager!!, rookSamsung!!),
29
+ RookPermissionsModule(reactContext, rookSamsung!!),
30
+ RookConfigurationModule(reactContext, rookConfigurationManager!!, rookSamsung!!),
31
+ RookSyncModule(reactContext, rookSamsung!!),
27
32
  RookBackgroundSyncModule(reactContext),
28
33
  RookStepsModule(reactContext)
29
34
  )
@@ -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
+ }
@@ -4,7 +4,13 @@ import com.facebook.react.bridge.Promise
4
4
  import com.facebook.react.bridge.ReactApplicationContext
5
5
  import com.facebook.react.bridge.ReactContextBaseJavaModule
6
6
  import com.facebook.react.bridge.ReactMethod
7
+ import com.facebook.react.bridge.ReadableArray
7
8
  import com.rookmotion.rook.sdk.RookConfigurationManager
9
+ import com.rooksdk.utils.DatasourcesUtils
10
+ import com.rooksdk.utils.SamsungAvailability
11
+ import com.rooksdk.utils.Source
12
+ import io.tryrook.sdk.samsung.RookSamsung
13
+ import io.tryrook.sdk.samsung.domain.enums.SamsungHealthAvailability
8
14
  import kotlinx.coroutines.CoroutineScope
9
15
  import kotlinx.coroutines.Dispatchers
10
16
  import kotlinx.coroutines.SupervisorJob
@@ -12,7 +18,8 @@ import kotlinx.coroutines.launch
12
18
 
13
19
  class RookConfigurationModule(
14
20
  reactContext: ReactApplicationContext,
15
- private val rookConfigurationManager: RookConfigurationManager
21
+ private val rookConfigurationManager: RookConfigurationManager,
22
+ private val rookSamsung: RookSamsung,
16
23
  ): ReactContextBaseJavaModule(reactContext) {
17
24
 
18
25
  private val scope: CoroutineScope by lazy {
@@ -27,7 +34,8 @@ class RookConfigurationModule(
27
34
  fun getUserID(promise: Promise) {
28
35
  scope.launch {
29
36
  try {
30
- promise.resolve(rookConfigurationManager.getUserID())
37
+ val user = rookConfigurationManager.getUserID()
38
+ promise.resolve(user)
31
39
  }
32
40
  catch (e: Exception) {
33
41
  promise.reject(e)
@@ -43,11 +51,19 @@ class RookConfigurationModule(
43
51
  @ReactMethod
44
52
  fun updateUserID(userID: String, promise: Promise) {
45
53
  scope.launch {
46
- rookConfigurationManager.updateUserID(userID).fold({
54
+ try {
55
+ if (SamsungAvailability.isSamsungAvailable(rookSamsung)) {
56
+ val r = rookSamsung.updateUserID(userID).getOrNull()
57
+ if (r == null) println("We couldn't initiate the user id in Samsung Health")
58
+ }
59
+
60
+ val result = rookConfigurationManager.updateUserID(userID)
61
+ result.getOrThrow()
62
+
47
63
  promise.resolve(true)
48
- }, {
49
- promise.reject(it)
50
- })
64
+ } catch (e: Exception) {
65
+ promise.reject(e)
66
+ }
51
67
  }
52
68
  }
53
69
 
@@ -56,13 +72,26 @@ class RookConfigurationModule(
56
72
  * @param promise A promise object to handle the result (resolved on success, rejected on failure).
57
73
  */
58
74
  @ReactMethod
59
- fun clearUserID(promise: Promise) {
75
+ fun clearUserID(rawSources: ReadableArray, promise: Promise) {
60
76
  scope.launch {
61
- rookConfigurationManager.clearUserID().fold({
77
+ try {
78
+ val sources = DatasourcesUtils.readableArrayToSourceList(rawSources)
79
+
80
+ if(Source.HEALTH_CONNECT in sources) {
81
+ val hcResult = rookConfigurationManager.clearUserID()
82
+ hcResult.getOrThrow()
83
+ }
84
+
85
+ if(Source.SAMSUNG_HEALTH in sources && SamsungAvailability.isSamsungAvailable(rookSamsung)) {
86
+ val hcResult = rookSamsung.clearUserID()
87
+ hcResult.getOrThrow()
88
+ }
89
+
62
90
  promise.resolve(true)
63
- }, {
64
- promise.reject(it)
65
- })
91
+ }
92
+ catch (e: Exception) {
93
+ promise.reject(e)
94
+ }
66
95
  }
67
96
  }
68
97
 
@@ -71,15 +100,26 @@ class RookConfigurationModule(
71
100
  * @param promise A promise object to handle the result (resolved on success, rejected on failure).
72
101
  */
73
102
  @ReactMethod
74
- fun removeUserFromRook(promise: Promise) {
103
+ fun removeUserFromRook(rawSources: ReadableArray, promise: Promise) {
75
104
  scope.launch {
76
- val result = rookConfigurationManager.deleteUserFromRook()
105
+ try {
106
+ val sources = DatasourcesUtils.readableArrayToSourceList(rawSources)
107
+
108
+ if(Source.HEALTH_CONNECT in sources) {
109
+ val hcResult = rookConfigurationManager.deleteUserFromRook()
110
+ hcResult.getOrThrow()
111
+ }
112
+
113
+ if(Source.SAMSUNG_HEALTH in sources && SamsungAvailability.isSamsungAvailable(rookSamsung)) {
114
+ val hcResult = rookSamsung.deleteUserFromRook()
115
+ hcResult.getOrThrow()
116
+ }
77
117
 
78
- result.fold({
79
118
  promise.resolve(true)
80
- }, {
81
- promise.reject(it)
82
- })
119
+ }
120
+ catch (e: Exception) {
121
+ promise.reject(e)
122
+ }
83
123
  }
84
124
  }
85
125
 
@@ -4,16 +4,23 @@ import com.facebook.react.bridge.Promise
4
4
  import com.facebook.react.bridge.ReactApplicationContext
5
5
  import com.facebook.react.bridge.ReactContextBaseJavaModule
6
6
  import com.facebook.react.bridge.ReactMethod
7
+ import com.facebook.react.bridge.ReadableArray
7
8
  import com.rookmotion.rook.sdk.RookPermissionsManager
8
9
  import com.rookmotion.rook.sdk.domain.enums.BackgroundReadStatus
9
10
  import com.rookmotion.rook.sdk.domain.enums.HealthConnectAvailability
10
11
  import com.rookmotion.rook.sdk.domain.enums.RequestPermissionsStatus
12
+ import com.rooksdk.utils.PermissionConversion
13
+ import com.rooksdk.utils.SamsungAvailability
14
+ import io.tryrook.sdk.samsung.RookSamsung
15
+ import io.tryrook.sdk.samsung.domain.enums.SHRequestPermissionsStatus
16
+ import io.tryrook.sdk.samsung.domain.enums.SamsungHealthAvailability
17
+ import io.tryrook.sdk.samsung.domain.enums.SamsungHealthPermission
11
18
  import kotlinx.coroutines.CoroutineScope
12
19
  import kotlinx.coroutines.Dispatchers
13
20
  import kotlinx.coroutines.SupervisorJob
14
21
  import kotlinx.coroutines.launch
15
22
 
16
- class RookPermissionsModule(reactContext: ReactApplicationContext):
23
+ class RookPermissionsModule(reactContext: ReactApplicationContext, private val rookSamsung: RookSamsung):
17
24
  ReactContextBaseJavaModule(reactContext) {
18
25
 
19
26
  private val rookPermissionsManager: RookPermissionsManager by lazy {
@@ -24,6 +31,27 @@ class RookPermissionsModule(reactContext: ReactApplicationContext):
24
31
  CoroutineScope(SupervisorJob() + Dispatchers.Main)
25
32
  }
26
33
 
34
+ @ReactMethod
35
+ fun checkSamsungAvailability(promise: Promise) {
36
+ scope.launch {
37
+ rookSamsung.checkSamsungHealthAvailability().fold(
38
+ { availability ->
39
+ when (availability) {
40
+ SamsungHealthAvailability.INSTALLED -> promise.resolve("INSTALLED")
41
+ SamsungHealthAvailability.NOT_INSTALLED -> promise.resolve("NOT_INSTALLED")
42
+ SamsungHealthAvailability.OUTDATED -> promise.resolve("OUTDATED")
43
+ SamsungHealthAvailability.DISABLED -> promise.resolve("DISABLED")
44
+ SamsungHealthAvailability.NOT_READY -> promise.resolve("NOT_READY")
45
+ }
46
+ },
47
+ {
48
+ promise.reject(it)
49
+ },
50
+ )
51
+
52
+ }
53
+ }
54
+
27
55
  /**
28
56
  * Checks the availability of Health Connect on the device (whether it is installed, not installed, or not supported).
29
57
  * @param promise A promise object to handle the result (resolved with the availability status or rejected on failure).
@@ -58,8 +86,46 @@ class RookPermissionsModule(reactContext: ReactApplicationContext):
58
86
  }
59
87
  }
60
88
 
89
+ @ReactMethod
90
+ fun checkSamsungHealthPermissions(promise: Promise){
91
+ scope.launch {
92
+ if (!SamsungAvailability.isSamsungAvailable(rookSamsung)){
93
+ promise.reject(Throwable("Samsung health is not available"))
94
+ return@launch
95
+ }
96
+
97
+ rookSamsung.checkSamsungHealthPermissions(SamsungHealthPermission.entries.toSet()).fold(
98
+ { hasAllPermissions ->
99
+ promise.resolve(hasAllPermissions)
100
+ },
101
+ {
102
+ promise.reject(it)
103
+ }
104
+ )
105
+ }
106
+ }
107
+
108
+ @ReactMethod
109
+ fun checkSamsungHealthPermissionsPartially(promise: Promise){
110
+ scope.launch {
111
+ if (!SamsungAvailability.isSamsungAvailable(rookSamsung)){
112
+ promise.reject(Throwable("Samsung health is not available"))
113
+ return@launch
114
+ }
115
+
116
+ rookSamsung.checkSamsungHealthPermissionsPartially(SamsungHealthPermission.entries.toSet()).fold(
117
+ { hasAllPermissions ->
118
+ promise.resolve(hasAllPermissions)
119
+ },
120
+ {
121
+ promise.reject(it)
122
+ }
123
+ )
124
+ }
125
+ }
126
+
61
127
  /**
62
- * Checks the current permissions granted by Health Connect to ensure the application has the necessary access.
128
+ * Checks the current permissions granted by Health Conect to ensure the application has the necessary access.
63
129
  * @param promise A promise object to handle the result (resolved with permission status or rejected on failure).
64
130
  */
65
131
  @ReactMethod
@@ -110,6 +176,30 @@ class RookPermissionsModule(reactContext: ReactApplicationContext):
110
176
  }
111
177
  }
112
178
 
179
+ @ReactMethod
180
+ fun requestSamsungPermissions(permissions: ReadableArray, promise: Promise) {
181
+ val shPermissions = PermissionConversion.parseSamsungPermissions(permissions)
182
+
183
+ scope.launch {
184
+ if (!SamsungAvailability.isSamsungAvailable(rookSamsung)) {
185
+ promise.reject(Throwable("Samsung Health is not available"))
186
+ return@launch
187
+ }
188
+
189
+ rookSamsung.requestSamsungHealthPermissions(shPermissions).fold(
190
+ {
191
+ when (it) {
192
+ SHRequestPermissionsStatus.ALREADY_GRANTED -> promise.resolve("ALREADY_GRANTED")
193
+ SHRequestPermissionsStatus.REQUEST_SENT -> promise.resolve("REQUEST_SENT")
194
+ }
195
+ },
196
+ {
197
+ promise.reject(it)
198
+ }
199
+ )
200
+ }
201
+ }
202
+
113
203
  /**
114
204
  * Checks if the SDK has permissions to use background permissions
115
205
  * */