react-native-spike-sdk 4.0.13-beta.6 → 4.0.13-beta.7

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 (143) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/src/main/java/com/spikesdk/SpikeSdkModule.kt +323 -184
  3. package/ios/SpikeSdk.m +14 -4
  4. package/ios/SpikeSdk.swift +82 -10
  5. package/lib/commonjs/Spike.js +5 -1
  6. package/lib/commonjs/Spike.js.map +1 -1
  7. package/lib/commonjs/index.js +56 -0
  8. package/lib/commonjs/index.js.map +1 -1
  9. package/lib/commonjs/v3/DataModels/ActivityAdditionalData.js +18 -0
  10. package/lib/commonjs/v3/DataModels/ActivityAdditionalData.js.map +1 -0
  11. package/lib/commonjs/v3/DataModels/ActivityConfig.js +17 -0
  12. package/lib/commonjs/v3/DataModels/ActivityConfig.js.map +1 -0
  13. package/lib/commonjs/v3/DataModels/ActivityEntry.js +2 -0
  14. package/lib/commonjs/v3/DataModels/ActivityEntry.js.map +1 -0
  15. package/lib/commonjs/v3/DataModels/ActivitySamples.js +2 -0
  16. package/lib/commonjs/v3/DataModels/ActivitySamples.js.map +1 -0
  17. package/lib/commonjs/v3/DataModels/ActivityTag.js +5 -1
  18. package/lib/commonjs/v3/DataModels/ActivityTag.js.map +1 -1
  19. package/lib/commonjs/v3/DataModels/ActivityType.js +2 -1
  20. package/lib/commonjs/v3/DataModels/ActivityType.js.map +1 -1
  21. package/lib/commonjs/v3/DataModels/InputMethod.js +2 -1
  22. package/lib/commonjs/v3/DataModels/InputMethod.js.map +1 -1
  23. package/lib/commonjs/v3/DataModels/MetricType.js +36 -2
  24. package/lib/commonjs/v3/DataModels/MetricType.js.map +1 -1
  25. package/lib/commonjs/v3/DataModels/Provider.js +2 -13
  26. package/lib/commonjs/v3/DataModels/Provider.js.map +1 -1
  27. package/lib/commonjs/v3/DataModels/ProviderSource.js +6 -1
  28. package/lib/commonjs/v3/DataModels/ProviderSource.js.map +1 -1
  29. package/lib/commonjs/v3/DataModels/RecordSource.js +2 -0
  30. package/lib/commonjs/v3/DataModels/RecordSource.js.map +1 -0
  31. package/lib/commonjs/v3/DataModels/SleepConfig.js +6 -0
  32. package/lib/commonjs/v3/DataModels/SleepConfig.js.map +1 -0
  33. package/lib/commonjs/v3/DataModels/StatisticsInterval.js +3 -3
  34. package/lib/commonjs/v3/DataModels/StatisticsInterval.js.map +1 -1
  35. package/lib/commonjs/v3/DataModels/StatisticsType.js +2 -1
  36. package/lib/commonjs/v3/DataModels/StatisticsType.js.map +1 -1
  37. package/lib/commonjs/v3/DataModels/Unit.js +2 -1
  38. package/lib/commonjs/v3/DataModels/Unit.js.map +1 -1
  39. package/lib/commonjs/v3/SpikeRNConnectionAPIv3.js +47 -12
  40. package/lib/commonjs/v3/SpikeRNConnectionAPIv3.js.map +1 -1
  41. package/lib/commonjs/v3/StatisticsFilter.js +4 -1
  42. package/lib/commonjs/v3/StatisticsFilter.js.map +1 -1
  43. package/lib/commonjs/version.js +1 -1
  44. package/lib/module/Spike.js +5 -1
  45. package/lib/module/Spike.js.map +1 -1
  46. package/lib/module/index.js +5 -3
  47. package/lib/module/index.js.map +1 -1
  48. package/lib/module/v3/DataModels/ActivityAdditionalData.js +12 -0
  49. package/lib/module/v3/DataModels/ActivityAdditionalData.js.map +1 -0
  50. package/lib/module/v3/DataModels/ActivityConfig.js +10 -0
  51. package/lib/module/v3/DataModels/ActivityConfig.js.map +1 -0
  52. package/lib/module/v3/DataModels/ActivityEntry.js +2 -0
  53. package/lib/module/v3/DataModels/ActivityEntry.js.map +1 -0
  54. package/lib/module/v3/DataModels/ActivitySamples.js +2 -0
  55. package/lib/module/v3/DataModels/ActivitySamples.js.map +1 -0
  56. package/lib/module/v3/DataModels/ActivityTag.js +5 -2
  57. package/lib/module/v3/DataModels/ActivityTag.js.map +1 -1
  58. package/lib/module/v3/DataModels/ActivityType.js +2 -2
  59. package/lib/module/v3/DataModels/ActivityType.js.map +1 -1
  60. package/lib/module/v3/DataModels/InputMethod.js +2 -2
  61. package/lib/module/v3/DataModels/InputMethod.js.map +1 -1
  62. package/lib/module/v3/DataModels/MetricType.js +36 -3
  63. package/lib/module/v3/DataModels/MetricType.js.map +1 -1
  64. package/lib/module/v3/DataModels/Provider.js +2 -14
  65. package/lib/module/v3/DataModels/Provider.js.map +1 -1
  66. package/lib/module/v3/DataModels/ProviderSource.js +6 -2
  67. package/lib/module/v3/DataModels/ProviderSource.js.map +1 -1
  68. package/lib/module/v3/DataModels/RecordSource.js +2 -0
  69. package/lib/module/v3/DataModels/RecordSource.js.map +1 -0
  70. package/lib/module/v3/DataModels/SleepConfig.js +2 -0
  71. package/lib/module/v3/DataModels/SleepConfig.js.map +1 -0
  72. package/lib/module/v3/DataModels/StatisticsInterval.js +3 -4
  73. package/lib/module/v3/DataModels/StatisticsInterval.js.map +1 -1
  74. package/lib/module/v3/DataModels/StatisticsType.js +2 -2
  75. package/lib/module/v3/DataModels/StatisticsType.js.map +1 -1
  76. package/lib/module/v3/DataModels/Unit.js +2 -2
  77. package/lib/module/v3/DataModels/Unit.js.map +1 -1
  78. package/lib/module/v3/SpikeRNConnectionAPIv3.js +47 -12
  79. package/lib/module/v3/SpikeRNConnectionAPIv3.js.map +1 -1
  80. package/lib/module/v3/StatisticsFilter.js +4 -1
  81. package/lib/module/v3/StatisticsFilter.js.map +1 -1
  82. package/lib/module/version.js +1 -1
  83. package/lib/typescript/Spike.d.ts +7 -2
  84. package/lib/typescript/Spike.d.ts.map +1 -1
  85. package/lib/typescript/index.d.ts +13 -4
  86. package/lib/typescript/index.d.ts.map +1 -1
  87. package/lib/typescript/v3/DataModels/ActivityAdditionalData.d.ts +9 -0
  88. package/lib/typescript/v3/DataModels/ActivityAdditionalData.d.ts.map +1 -0
  89. package/lib/typescript/v3/DataModels/ActivityConfig.d.ts +12 -0
  90. package/lib/typescript/v3/DataModels/ActivityConfig.d.ts.map +1 -0
  91. package/lib/typescript/v3/DataModels/ActivityEntry.d.ts +10 -0
  92. package/lib/typescript/v3/DataModels/ActivityEntry.d.ts.map +1 -0
  93. package/lib/typescript/v3/DataModels/ActivitySamples.d.ts +8 -0
  94. package/lib/typescript/v3/DataModels/ActivitySamples.d.ts.map +1 -0
  95. package/lib/typescript/v3/DataModels/ActivityTag.d.ts +3 -0
  96. package/lib/typescript/v3/DataModels/ActivityTag.d.ts.map +1 -1
  97. package/lib/typescript/v3/DataModels/ActivityType.d.ts.map +1 -1
  98. package/lib/typescript/v3/DataModels/InputMethod.d.ts.map +1 -1
  99. package/lib/typescript/v3/DataModels/MetricType.d.ts +34 -1
  100. package/lib/typescript/v3/DataModels/MetricType.d.ts.map +1 -1
  101. package/lib/typescript/v3/DataModels/Provider.d.ts +0 -12
  102. package/lib/typescript/v3/DataModels/Provider.d.ts.map +1 -1
  103. package/lib/typescript/v3/DataModels/ProviderSource.d.ts +4 -0
  104. package/lib/typescript/v3/DataModels/ProviderSource.d.ts.map +1 -1
  105. package/lib/typescript/v3/DataModels/RecordSource.d.ts +11 -0
  106. package/lib/typescript/v3/DataModels/RecordSource.d.ts.map +1 -0
  107. package/lib/typescript/v3/DataModels/SleepConfig.d.ts +5 -0
  108. package/lib/typescript/v3/DataModels/SleepConfig.d.ts.map +1 -0
  109. package/lib/typescript/v3/DataModels/SpikeRecord.d.ts +21 -18
  110. package/lib/typescript/v3/DataModels/SpikeRecord.d.ts.map +1 -1
  111. package/lib/typescript/v3/DataModels/Statistic.d.ts +2 -2
  112. package/lib/typescript/v3/DataModels/Statistic.d.ts.map +1 -1
  113. package/lib/typescript/v3/DataModels/StatisticsInterval.d.ts.map +1 -1
  114. package/lib/typescript/v3/DataModels/StatisticsType.d.ts.map +1 -1
  115. package/lib/typescript/v3/DataModels/Unit.d.ts.map +1 -1
  116. package/lib/typescript/v3/SpikeRNConnectionAPIv3.d.ts +44 -6
  117. package/lib/typescript/v3/SpikeRNConnectionAPIv3.d.ts.map +1 -1
  118. package/lib/typescript/v3/StatisticsFilter.d.ts +5 -1
  119. package/lib/typescript/v3/StatisticsFilter.d.ts.map +1 -1
  120. package/lib/typescript/version.d.ts +1 -1
  121. package/package.json +2 -2
  122. package/src/Spike.ts +10 -3
  123. package/src/index.ts +29 -3
  124. package/src/v3/DataModels/ActivityAdditionalData.ts +11 -0
  125. package/src/v3/DataModels/ActivityConfig.ts +20 -0
  126. package/src/v3/DataModels/ActivityEntry.ts +10 -0
  127. package/src/v3/DataModels/ActivitySamples.ts +10 -0
  128. package/src/v3/DataModels/ActivityTag.ts +6 -2
  129. package/src/v3/DataModels/ActivityType.ts +3 -2
  130. package/src/v3/DataModels/InputMethod.ts +3 -2
  131. package/src/v3/DataModels/MetricType.ts +37 -3
  132. package/src/v3/DataModels/Provider.ts +3 -14
  133. package/src/v3/DataModels/ProviderSource.ts +7 -2
  134. package/src/v3/DataModels/RecordSource.ts +13 -0
  135. package/src/v3/DataModels/SleepConfig.ts +8 -0
  136. package/src/v3/DataModels/SpikeRecord.ts +25 -23
  137. package/src/v3/DataModels/Statistic.ts +12 -10
  138. package/src/v3/DataModels/StatisticsInterval.ts +3 -7
  139. package/src/v3/DataModels/StatisticsType.ts +3 -2
  140. package/src/v3/DataModels/Unit.ts +3 -2
  141. package/src/v3/SpikeRNConnectionAPIv3.ts +119 -27
  142. package/src/v3/StatisticsFilter.ts +9 -1
  143. package/src/version.ts +1 -1
@@ -76,7 +76,7 @@ dependencies {
76
76
  //noinspection GradleDynamicVersion
77
77
  implementation "com.facebook.react:react-android:0.71.3"
78
78
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
79
- implementation 'com.spikeapi.sdk:spike-sdk:4.0.12-beta.3'
79
+ implementation 'com.spikeapi.sdk:spike-sdk:4.0.12-beta.4'
80
80
  implementation 'androidx.core:core-ktx:1.9.0'
81
81
  implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.5.1'
82
82
  implementation 'com.google.code.gson:gson:2.10.1'
@@ -16,7 +16,13 @@ import com.spikeapi.SpikePackageChecker
16
16
  import com.spikeapi.healthconnect.HealthConnectAvailability
17
17
  import com.spikeapi.apiv3.SpikeConnectionAPIv3
18
18
  import com.spikeapi.apiv3.datamodels.MetricType
19
+ import com.spikeapi.apiv3.datamodels.ActivityConfig
19
20
  import com.spikeapi.apiv3.datamodels.StatisticsType
21
+ import com.spikeapi.apiv3.datamodels.utils.ActivityConfigUtils
22
+ import com.spikeapi.apiv3.datamodels.utils.SleepConfigUtils
23
+ import com.spikeapi.apiv3.datamodels.utils.StatisticsTypeUtils
24
+ import com.spikeapi.apiv3.datamodels.utils.StatisticsIntervalUtils
25
+ import com.spikeapi.apiv3.datamodels.utils.MetricTypeUtils
20
26
  import com.spikeapi.apiv3.datamodels.StatisticsInterval
21
27
  import com.spikeapi.apiv3.datamodels.StatisticsFilter
22
28
  import com.spikeapi.apiv3.healthconnect.HealthConnectPermissionManager
@@ -608,7 +614,7 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
608
614
  /// --- Read Health connect data ---
609
615
 
610
616
  @ReactMethod
611
- fun getStatisticsconnectionUUID(
617
+ fun getStatistics(
612
618
  connectionUUID: String,
613
619
  types: ReadableArray, // [StatisticsType]
614
620
  from: String, // Instant
@@ -618,32 +624,37 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
618
624
  promise: Promise
619
625
  ) {
620
626
  scope.launch {
621
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
622
- SpikeExceptions.SpikeException("Connection not found").mapException(),
623
- "Connection not found (enableHealthConnectIntegration)"
624
- )
625
- val statTypes = types.toArrayList().mapNotNull {
626
- StatisticsType.fromValue(it as String)
627
- }.toSet()
628
- val dateFrom = convertIsoStringToInstant(from)
629
- val dateTo = convertIsoStringToInstant(to)
630
- val statsInterval = StatisticsInterval.fromValue(interval)
631
- val statsFilter = StatisticsFilter.fromValue(filter)
632
-
633
- val result = connection.getStatistics(
634
- types = statTypes,
635
- from = dateFrom,
636
- to = dateTo,
637
- interval = statsInterval,
638
- filter = statsFilter
639
- )
627
+ try {
628
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
629
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
630
+ "Connection not found (enableHealthConnectIntegration)"
631
+ )
632
+ val statTypes = types.toArrayList().mapNotNull {
633
+ StatisticsTypeUtils.fromValue(it as String)
634
+ }.toSet()
635
+ val dateFrom = convertIsoStringToInstant(from)
636
+ val dateTo = convertIsoStringToInstant(to)
637
+ val statsInterval = StatisticsIntervalUtils.fromValue(interval)
638
+ val statsFilter = StatisticsFilter.fromValue(filter)
639
+
640
+ val result = connection.getStatistics(
641
+ types = statTypes,
642
+ from = dateFrom,
643
+ to = dateTo,
644
+ interval = statsInterval,
645
+ filter = statsFilter
646
+ )
647
+
648
+ promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
640
649
 
641
- promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
650
+ } catch (e: SpikeExceptions) {
651
+ promise.reject(e.mapException(), e.message)
652
+ }
642
653
  }
643
654
  }
644
655
 
645
656
  @ReactMethod
646
- fun getRecordsconnectionUUID(
657
+ fun getRecords(
647
658
  connectionUUID: String,
648
659
  types: ReadableArray, // [MetricType]
649
660
  from: String, // Instant
@@ -652,25 +663,68 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
652
663
  promise: Promise
653
664
  ) {
654
665
  scope.launch {
655
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
656
- SpikeExceptions.SpikeException("Connection not found").mapException(),
657
- "Connection not found (enableHealthConnectIntegration)"
658
- )
659
- val statTypes = types.toArrayList().mapNotNull {
660
- MetricType.fromValue(it as String)
661
- }.toSet()
662
- val dateFrom = convertIsoStringToInstant(from)
663
- val dateTo = convertIsoStringToInstant(to)
664
- val statsFilter = StatisticsFilter.fromValue(filter)
665
-
666
- val result = connection.getRecords(
667
- types = statTypes,
668
- from = dateFrom,
669
- to = dateTo,
670
- filter = statsFilter
671
- )
666
+ try {
667
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
668
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
669
+ "Connection not found (enableHealthConnectIntegration)"
670
+ )
671
+ val statTypes = types.toArrayList().mapNotNull {
672
+ MetricTypeUtils.fromValue(it as String)
673
+ }.toSet()
674
+ val dateFrom = convertIsoStringToInstant(from)
675
+ val dateTo = convertIsoStringToInstant(to)
676
+ val statsFilter = StatisticsFilter.fromValue(filter)
677
+
678
+ val result = connection.getRecords(
679
+ types = statTypes,
680
+ from = dateFrom,
681
+ to = dateTo,
682
+ filter = statsFilter
683
+ )
684
+
685
+ promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
686
+
687
+ } catch (e: SpikeExceptions) {
688
+ promise.reject(e.mapException(), e.message)
689
+ }
690
+ }
691
+ }
672
692
 
673
- promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
693
+ @ReactMethod
694
+ fun getActivities(
695
+ connectionUUID: String,
696
+ configJson: String, // ActivityConfig
697
+ from: String, // Instant
698
+ to: String, // Instant
699
+ filter: String?, // StatisticsFilter?
700
+ promise: Promise
701
+ ) {
702
+ scope.launch {
703
+ try {
704
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
705
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
706
+ "Connection not found (enableHealthConnectIntegration)"
707
+ )
708
+ // val statTypes = types.toArrayList().mapNotNull {
709
+ // MetricTypeUtils.fromValue(it as String)
710
+ // }.toSet()
711
+ val dateFrom = convertIsoStringToInstant(from)
712
+ val dateTo = convertIsoStringToInstant(to)
713
+ val statsFilter = StatisticsFilter.fromValue(filter)
714
+ val configObject = ActivityConfigUtils.fromValue(configJson) ?: ActivityConfig()
715
+
716
+ val result = connection.getActivities(
717
+ config = configObject,
718
+ from = dateFrom,
719
+ to = dateTo,
720
+ filter = statsFilter
721
+ )
722
+
723
+ promise.resolve(SpikeConnectionAPIv3.convertToJson(result))
724
+
725
+ } catch (e: SpikeExceptions) {
726
+ promise.reject(e.mapException(), e.message)
727
+ }
674
728
  }
675
729
  }
676
730
 
@@ -679,183 +733,253 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
679
733
  @ReactMethod
680
734
  fun checkHealthConnectAvailability(connectionUUID: String, promise: Promise) {
681
735
  scope.launch {
682
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
683
- SpikeExceptions.SpikeException("Connection not found").mapException(),
684
- "Connection not found (checkHealthConnectAvailability)"
685
- )
736
+ try {
737
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
738
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
739
+ "Connection not found (checkHealthConnectAvailability)"
740
+ )
686
741
 
687
- val result = connection.checkHealthConnectAvailability()
688
- promise.resolve(result.value)
742
+ val result = connection.checkHealthConnectAvailability()
743
+ promise.resolve(result.value)
744
+
745
+ } catch (e: SpikeExceptions) {
746
+ promise.reject(e.mapException(), e.message)
747
+ }
689
748
  }
690
749
  }
691
750
 
692
751
  @ReactMethod
693
752
  fun openHealthConnectInstallation(connectionUUID: String, promise: Promise) {
694
753
  scope.launch {
695
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
696
- SpikeExceptions.SpikeException("Connection not found").mapException(),
697
- "Connection not found (openHealthConnectInstallation)"
698
- )
754
+ try {
755
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
756
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
757
+ "Connection not found (openHealthConnectInstallation)"
758
+ )
699
759
 
700
- connection.openHealthConnectInstallation()
701
- promise.resolve(true)
760
+ connection.openHealthConnectInstallation()
761
+ promise.resolve(true)
762
+
763
+ } catch (e: SpikeExceptions) {
764
+ promise.reject(e.mapException(), e.message)
765
+ }
702
766
  }
703
767
  }
704
768
 
705
769
  @ReactMethod
706
770
  fun enableHealthConnectIntegration(connectionUUID: String, promise: Promise) {
707
771
  scope.launch {
708
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
709
- SpikeExceptions.SpikeException("Connection not found").mapException(),
710
- "Connection not found (enableHealthConnectIntegration)"
711
- )
772
+ try {
773
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
774
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
775
+ "Connection not found (enableHealthConnectIntegration)"
776
+ )
712
777
 
713
- connection.enableHealthConnectIntegration()
714
- Log.d("SpikeSdkModule", "Health Connect integration enabled")
715
- promise.resolve(true)
778
+ connection.enableHealthConnectIntegration()
779
+ Log.d("SpikeSdkModule", "Health Connect integration enabled")
780
+ promise.resolve(true)
781
+ } catch (e: SpikeExceptions) {
782
+ promise.reject(e.mapException(), e.message)
783
+ }
716
784
  }
717
785
  }
718
786
 
719
787
  @ReactMethod
720
788
  fun disableHealthConnectIntegration(connectionUUID: String, promise: Promise) {
721
789
  scope.launch {
722
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
723
- SpikeExceptions.SpikeException("Connection not found").mapException(),
724
- "Connection not found (enableHealthConnectIntegration)"
725
- )
790
+ try {
791
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
792
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
793
+ "Connection not found (enableHealthConnectIntegration)"
794
+ )
726
795
 
727
- connection.disableHealthConnectIntegration()
728
- Log.d("SpikeSdkModule", "Health Connect integration disabled")
729
- promise.resolve(true)
796
+ connection.disableHealthConnectIntegration()
797
+ Log.d("SpikeSdkModule", "Health Connect integration disabled")
798
+ promise.resolve(true)
799
+
800
+ } catch (e: SpikeExceptions) {
801
+ promise.reject(e.mapException(), e.message)
802
+ }
730
803
  }
731
804
  }
732
805
 
733
806
  @ReactMethod
734
807
  fun isHealthConnectIntegrationEnabled(connectionUUID: String, promise: Promise) {
735
808
  scope.launch {
736
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
737
- SpikeExceptions.SpikeException("Connection not found").mapException(),
738
- "Connection not found (enableHealthConnectIntegration)"
739
- )
809
+ try {
810
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
811
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
812
+ "Connection not found (enableHealthConnectIntegration)"
813
+ )
814
+
815
+ val result = connection.isHealthConnectIntegrationEnabled()
816
+ Log.d("SpikeSdkModule", "Health Connect integration is " + if (result) { "enabled" } else ( "disabled" ))
817
+ promise.resolve(result)
740
818
 
741
- val result = connection.isHealthConnectIntegrationEnabled()
742
- Log.d("SpikeSdkModule", "Health Connect integration is " + if (result) { "enabled" } else ( "disabled" ))
743
- promise.resolve(result)
819
+ } catch (e: SpikeExceptions) {
820
+ promise.reject(e.mapException(), e.message)
821
+ }
744
822
  }
745
823
  }
746
824
 
747
825
  @ReactMethod
748
826
  fun getGrantedHealthKitPermissions(connectionUUID: String, promise: Promise) {
749
827
  scope.launch {
750
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
751
- SpikeExceptions.SpikeException("Connection not found").mapException(),
752
- "Connection not found (getGrantedHealthKitPermissions)"
753
- )
754
- if (!connection.isHealthConnectIntegrationEnabled()) {
755
- return@launch promise.reject(
756
- SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
757
- "Health Connect should be enabled before calling getGrantedHealthKitPermissions"
828
+ try {
829
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
830
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
831
+ "Connection not found (getGrantedHealthKitPermissions)"
758
832
  )
759
- }
833
+ if (!connection.isHealthConnectIntegrationEnabled()) {
834
+ return@launch promise.reject(
835
+ SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
836
+ "Health Connect should be enabled before calling getGrantedHealthKitPermissions"
837
+ )
838
+ }
760
839
 
761
- val permissions = connection
762
- .getHealthConnectPermissionManager()
763
- .getGrantedPermissions()
840
+ val permissions = connection
841
+ .getHealthConnectPermissionManager()
842
+ .getGrantedPermissions()
843
+
844
+ val result = Arguments.createArray()
845
+ permissions.forEach {
846
+ result.pushString(it)
847
+ }
848
+
849
+ Log.w("SpikeSdkModule", "$permissions")
850
+ promise.resolve(result)
764
851
 
765
- val result = Arguments.createArray()
766
- permissions.forEach {
767
- result.pushString(it)
852
+ } catch (e: SpikeExceptions) {
853
+ promise.reject(e.mapException(), e.message)
768
854
  }
769
-
770
- Log.w("SpikeSdkModule", "$permissions")
771
- promise.resolve(result)
772
855
  }
773
856
  }
774
857
 
775
858
  @ReactMethod
776
- fun getHealthConnectPermissionsForStatisticTypes(connectionUUID: String, statisticTypes: ReadableArray, promise: Promise) {
859
+ fun getHealthConnectPermissions(
860
+ connectionUUID: String,
861
+ statisticTypes: ReadableArray,
862
+ metricTypes: ReadableArray,
863
+ activityConfigs: ReadableArray,
864
+ sleepConfigs: ReadableArray,
865
+ includeEnhancedPermissions: Boolean,
866
+ promise: Promise
867
+ ) {
777
868
  scope.launch {
778
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
779
- SpikeExceptions.SpikeException("Connection not found").mapException(),
780
- "Connection not found (getPermissionsForHealthConnect)"
781
- )
782
- if (!connection.isHealthConnectIntegrationEnabled()) {
783
- return@launch promise.reject(
784
- SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
785
- "Health Connect should be enabled before calling getHealthConnectPermissionsForStatisticTypes"
869
+ try {
870
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
871
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
872
+ "Connection not found (getHealthConnectPermissions)"
786
873
  )
787
- }
788
- val permissionManager = connection.getHealthConnectPermissionManager()
789
-
790
- val statTypes = statisticTypes.toArrayList().mapNotNull {
791
- StatisticsType.fromValue(it as String)
792
- }.toSet()
874
+ if (!connection.isHealthConnectIntegrationEnabled()) {
875
+ return@launch promise.reject(
876
+ SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
877
+ "Health Connect should be enabled before calling getHealthConnectPermissionsForStatisticTypes"
878
+ )
879
+ }
880
+ val permissionManager = connection.getHealthConnectPermissionManager()
881
+
882
+ val statTypes = statisticTypes.toArrayList().mapNotNull {
883
+ StatisticsTypeUtils.fromValue(it as String)
884
+ }.toSet()
885
+
886
+ val mTypes = metricTypes.toArrayList().mapNotNull {
887
+ MetricTypeUtils.fromValue(it as String)
888
+ }.toSet()
889
+
890
+ val aConfigs = activityConfigs.toArrayList().mapNotNull {
891
+ ActivityConfigUtils.fromValue(it as String)
892
+ }.toSet()
893
+
894
+ val sConfigs = sleepConfigs.toArrayList().mapNotNull {
895
+ SleepConfigUtils.fromValue(it as String)
896
+ }.toSet()
897
+
898
+ val permissions = permissionManager
899
+ .getPermissions(
900
+ statisticsTypes = statTypes,
901
+ metricTypes = mTypes,
902
+ activityConfigs = aConfigs,
903
+ sleepConfigs = sConfigs,
904
+ includeEnhancedPermissions = includeEnhancedPermissions
905
+ )
793
906
 
794
- val permissions = permissionManager
795
- .getPermissionsForStatistics(statisticsTypes = statTypes)
907
+ val result = Arguments.createArray()
908
+ permissions.forEach {
909
+ result.pushString(it)
910
+ }
911
+
912
+ // Log.w("SpikeSdkModule", "$permissions")
913
+ promise.resolve(result)
796
914
 
797
- val result = Arguments.createArray()
798
- permissions.forEach {
799
- result.pushString(it)
915
+ } catch (e: SpikeExceptions) {
916
+ promise.reject(e.mapException(), e.message)
800
917
  }
801
-
802
- // Log.w("SpikeSdkModule", "$permissions")
803
- promise.resolve(result)
804
918
  }
805
919
  }
806
920
 
807
921
  @ReactMethod
808
922
  fun revokeAllHealthConnectPermissions(connectionUUID: String, promise: Promise) {
809
923
  scope.launch {
810
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
811
- SpikeExceptions.SpikeException("Connection not found").mapException(),
812
- "Connection not found (revokeAllHealthConnectPermissions)"
813
- )
814
- if (!connection.isHealthConnectIntegrationEnabled()) {
815
- return@launch promise.reject(
816
- SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
817
- "Health Connect should be enabled before calling revokeAllHealthConnectPermissions"
924
+ try {
925
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
926
+ SpikeExceptions.SpikeException("Connection not found").mapException(),
927
+ "Connection not found (revokeAllHealthConnectPermissions)"
818
928
  )
819
- }
929
+ if (!connection.isHealthConnectIntegrationEnabled()) {
930
+ return@launch promise.reject(
931
+ SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
932
+ "Health Connect should be enabled before calling revokeAllHealthConnectPermissions"
933
+ )
934
+ }
820
935
 
821
- connection
822
- .getHealthConnectPermissionManager()
823
- .revokeAllPermissions()
824
-
825
- promise.resolve(true)
936
+ connection
937
+ .getHealthConnectPermissionManager()
938
+ .revokeAllPermissions()
939
+
940
+ promise.resolve(true)
941
+
942
+ } catch (e: SpikeExceptions) {
943
+ promise.reject(e.mapException(), e.message)
944
+ }
826
945
  }
827
946
  }
828
947
 
829
948
  @ReactMethod
830
949
  fun requestPermissionsFromHealthConnect(connectionUUID: String, permissions: ReadableArray, promise: Promise) {
831
950
  scope.launch {
832
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
833
- SpikeExceptions.SpikeException(
834
- "Connection not found"
835
- ).mapException(), "Connection not found"
836
- )
837
- if (!connection.isHealthConnectIntegrationEnabled()) {
838
- return@launch promise.reject(
839
- SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
840
- "Health Connect should be enabled before calling requestPermissionsFromHealthConnect"
951
+ try {
952
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
953
+ SpikeExceptions.SpikeException(
954
+ "Connection not found"
955
+ ).mapException(), "Connection not found"
841
956
  )
842
- }
957
+ if (!connection.isHealthConnectIntegrationEnabled()) {
958
+ return@launch promise.reject(
959
+ SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
960
+ "Health Connect should be enabled before calling requestPermissionsFromHealthConnect"
961
+ )
962
+ }
843
963
 
844
- val permissionManager = connection.getHealthConnectPermissionManager()
845
- val permissionsStrings = permissions.toArrayList().map{ it as String }.toSet()
964
+ val permissionManager = connection.getHealthConnectPermissionManager()
965
+ val permissionsStrings = permissions.toArrayList().map{ it as String }.toSet()
846
966
 
847
- if (checkIfAllPermissionsAreGranted(permissionManager, permissionsStrings)) {
848
- // All permissions granted, nothing to do here
849
- promise.resolve(true)
850
- return@launch
851
- }
852
-
853
- Log.d("SpikeSdkModule", "Will ask for following Health Connect permissions: $permissions")
967
+ if (checkIfAllPermissionsAreGranted(permissionManager, permissionsStrings)) {
968
+ // All permissions granted, nothing to do here
969
+ promise.resolve(true)
970
+ return@launch
971
+ }
972
+
973
+ Log.d("SpikeSdkModule", "Will ask for following Health Connect permissions: $permissions")
854
974
 
855
- if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.TIRAMISU) {
856
- startHealthConnectRequest_oldAndroid(connectionUUID, permissionManager, permissionsStrings, promise)
857
- } else {
858
- startHealthConnectRequest(connectionUUID, permissionManager, permissionsStrings, promise)
975
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.TIRAMISU) {
976
+ startHealthConnectRequest_oldAndroid(connectionUUID, permissionManager, permissionsStrings, promise)
977
+ } else {
978
+ startHealthConnectRequest(connectionUUID, permissionManager, permissionsStrings, promise)
979
+ }
980
+
981
+ } catch (e: SpikeExceptions) {
982
+ promise.reject(e.mapException(), e.message)
859
983
  }
860
984
  }
861
985
  }
@@ -863,54 +987,69 @@ class SpikeSdkModule(reactContext: ReactApplicationContext) :
863
987
  private fun startHealthConnectRequest_oldAndroid(connectionUUID: String, permissionManager: HealthConnectPermissionManager, permissions: Set<String>, promise: Promise) {
864
988
  // val availability = connection.getHealthConnectAvailability()
865
989
  // && availability == HealthConnectAvailability.INSTALLED
866
- val intent = permissionManager.getRequestPermissionResultContract().createIntent(
867
- reactApplicationContext, permissions
868
- )
990
+ try {
991
+ val intent = permissionManager.getRequestPermissionResultContract().createIntent(
992
+ reactApplicationContext, permissions
993
+ )
869
994
 
870
- reactApplicationContext.currentActivity?.startActivityForResult(
871
- intent,
872
- REQUEST_CODE
873
- )
874
- promise.resolve(true)
995
+ reactApplicationContext.currentActivity?.startActivityForResult(
996
+ intent,
997
+ REQUEST_CODE
998
+ )
999
+ promise.resolve(true)
1000
+
1001
+ } catch (e: SpikeExceptions) {
1002
+ promise.reject(e.mapException(), e.message)
1003
+ }
875
1004
  }
876
1005
 
877
1006
  private var checkPermissionsForV3: Triple<String, Set<String>, Promise>? = null
878
1007
 
879
1008
  private fun startHealthConnectRequest(connectionUUID: String, permissionManager: HealthConnectPermissionManager, permissions: Set<String>, promise: Promise) {
880
- val activity = reactApplicationContext.currentActivity
881
- if (!(activity is ComponentActivity)) {
882
- promise.resolve(false)
883
- return
884
- }
885
- checkPermissionsForV3 = Triple(
886
- connectionUUID,
887
- permissions,
888
- promise
889
- )
890
- val launcher = activity.registerActivityResultLauncher(permissionManager.getRequestPermissionResultContract()) {
1009
+ try {
1010
+ val activity = reactApplicationContext.currentActivity
1011
+ if (!(activity is ComponentActivity)) {
1012
+ promise.resolve(false)
1013
+ return
1014
+ }
1015
+ checkPermissionsForV3 = Triple(
1016
+ connectionUUID,
1017
+ permissions,
1018
+ promise
1019
+ )
1020
+ val launcher = activity.registerActivityResultLauncher(permissionManager.getRequestPermissionResultContract()) {
891
1021
 
1022
+ }
1023
+ launcher.launch(permissions)
1024
+
1025
+ } catch (e: SpikeExceptions) {
1026
+ promise.reject(e.mapException(), e.message)
892
1027
  }
893
- launcher.launch(permissions)
894
1028
  }
895
1029
 
896
1030
  @ReactMethod
897
1031
  fun areAllPermissionsGranted(connectionUUID: String, permissions: Set<String>, promise: Promise) {
898
1032
  scope.launch {
899
- val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
900
- SpikeExceptions.SpikeException(
901
- "Connection not found"
902
- ).mapException(), "Connection not found"
903
- )
904
- if (!connection.isHealthConnectIntegrationEnabled()) {
905
- return@launch promise.reject(
906
- SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
907
- "Health Connect should be enabled before calling areAllPermissionsGranted"
1033
+ try {
1034
+ val connection = getConnectionV3(connectionUUID) ?: return@launch promise.reject(
1035
+ SpikeExceptions.SpikeException(
1036
+ "Connection not found"
1037
+ ).mapException(), "Connection not found"
908
1038
  )
909
- }
910
- val permissionManager = connection.getHealthConnectPermissionManager()
1039
+ if (!connection.isHealthConnectIntegrationEnabled()) {
1040
+ return@launch promise.reject(
1041
+ SpikeExceptions.SpikeException("Health Connect is disabled").mapException(),
1042
+ "Health Connect should be enabled before calling areAllPermissionsGranted"
1043
+ )
1044
+ }
1045
+ val permissionManager = connection.getHealthConnectPermissionManager()
911
1046
 
912
- val permissionsGranted: Boolean = checkIfAllPermissionsAreGranted(permissionManager, permissions)
913
- promise.resolve(permissionsGranted)
1047
+ val permissionsGranted: Boolean = checkIfAllPermissionsAreGranted(permissionManager, permissions)
1048
+ promise.resolve(permissionsGranted)
1049
+
1050
+ } catch (e: SpikeExceptions) {
1051
+ promise.reject(e.mapException(), e.message)
1052
+ }
914
1053
  }
915
1054
  }
916
1055