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.
- package/android/build.gradle +1 -1
- package/android/src/main/java/com/spikesdk/SpikeSdkModule.kt +323 -184
- package/ios/SpikeSdk.m +14 -4
- package/ios/SpikeSdk.swift +82 -10
- package/lib/commonjs/Spike.js +5 -1
- package/lib/commonjs/Spike.js.map +1 -1
- package/lib/commonjs/index.js +56 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/v3/DataModels/ActivityAdditionalData.js +18 -0
- package/lib/commonjs/v3/DataModels/ActivityAdditionalData.js.map +1 -0
- package/lib/commonjs/v3/DataModels/ActivityConfig.js +17 -0
- package/lib/commonjs/v3/DataModels/ActivityConfig.js.map +1 -0
- package/lib/commonjs/v3/DataModels/ActivityEntry.js +2 -0
- package/lib/commonjs/v3/DataModels/ActivityEntry.js.map +1 -0
- package/lib/commonjs/v3/DataModels/ActivitySamples.js +2 -0
- package/lib/commonjs/v3/DataModels/ActivitySamples.js.map +1 -0
- package/lib/commonjs/v3/DataModels/ActivityTag.js +5 -1
- package/lib/commonjs/v3/DataModels/ActivityTag.js.map +1 -1
- package/lib/commonjs/v3/DataModels/ActivityType.js +2 -1
- package/lib/commonjs/v3/DataModels/ActivityType.js.map +1 -1
- package/lib/commonjs/v3/DataModels/InputMethod.js +2 -1
- package/lib/commonjs/v3/DataModels/InputMethod.js.map +1 -1
- package/lib/commonjs/v3/DataModels/MetricType.js +36 -2
- package/lib/commonjs/v3/DataModels/MetricType.js.map +1 -1
- package/lib/commonjs/v3/DataModels/Provider.js +2 -13
- package/lib/commonjs/v3/DataModels/Provider.js.map +1 -1
- package/lib/commonjs/v3/DataModels/ProviderSource.js +6 -1
- package/lib/commonjs/v3/DataModels/ProviderSource.js.map +1 -1
- package/lib/commonjs/v3/DataModels/RecordSource.js +2 -0
- package/lib/commonjs/v3/DataModels/RecordSource.js.map +1 -0
- package/lib/commonjs/v3/DataModels/SleepConfig.js +6 -0
- package/lib/commonjs/v3/DataModels/SleepConfig.js.map +1 -0
- package/lib/commonjs/v3/DataModels/StatisticsInterval.js +3 -3
- package/lib/commonjs/v3/DataModels/StatisticsInterval.js.map +1 -1
- package/lib/commonjs/v3/DataModels/StatisticsType.js +2 -1
- package/lib/commonjs/v3/DataModels/StatisticsType.js.map +1 -1
- package/lib/commonjs/v3/DataModels/Unit.js +2 -1
- package/lib/commonjs/v3/DataModels/Unit.js.map +1 -1
- package/lib/commonjs/v3/SpikeRNConnectionAPIv3.js +47 -12
- package/lib/commonjs/v3/SpikeRNConnectionAPIv3.js.map +1 -1
- package/lib/commonjs/v3/StatisticsFilter.js +4 -1
- package/lib/commonjs/v3/StatisticsFilter.js.map +1 -1
- package/lib/commonjs/version.js +1 -1
- package/lib/module/Spike.js +5 -1
- package/lib/module/Spike.js.map +1 -1
- package/lib/module/index.js +5 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/v3/DataModels/ActivityAdditionalData.js +12 -0
- package/lib/module/v3/DataModels/ActivityAdditionalData.js.map +1 -0
- package/lib/module/v3/DataModels/ActivityConfig.js +10 -0
- package/lib/module/v3/DataModels/ActivityConfig.js.map +1 -0
- package/lib/module/v3/DataModels/ActivityEntry.js +2 -0
- package/lib/module/v3/DataModels/ActivityEntry.js.map +1 -0
- package/lib/module/v3/DataModels/ActivitySamples.js +2 -0
- package/lib/module/v3/DataModels/ActivitySamples.js.map +1 -0
- package/lib/module/v3/DataModels/ActivityTag.js +5 -2
- package/lib/module/v3/DataModels/ActivityTag.js.map +1 -1
- package/lib/module/v3/DataModels/ActivityType.js +2 -2
- package/lib/module/v3/DataModels/ActivityType.js.map +1 -1
- package/lib/module/v3/DataModels/InputMethod.js +2 -2
- package/lib/module/v3/DataModels/InputMethod.js.map +1 -1
- package/lib/module/v3/DataModels/MetricType.js +36 -3
- package/lib/module/v3/DataModels/MetricType.js.map +1 -1
- package/lib/module/v3/DataModels/Provider.js +2 -14
- package/lib/module/v3/DataModels/Provider.js.map +1 -1
- package/lib/module/v3/DataModels/ProviderSource.js +6 -2
- package/lib/module/v3/DataModels/ProviderSource.js.map +1 -1
- package/lib/module/v3/DataModels/RecordSource.js +2 -0
- package/lib/module/v3/DataModels/RecordSource.js.map +1 -0
- package/lib/module/v3/DataModels/SleepConfig.js +2 -0
- package/lib/module/v3/DataModels/SleepConfig.js.map +1 -0
- package/lib/module/v3/DataModels/StatisticsInterval.js +3 -4
- package/lib/module/v3/DataModels/StatisticsInterval.js.map +1 -1
- package/lib/module/v3/DataModels/StatisticsType.js +2 -2
- package/lib/module/v3/DataModels/StatisticsType.js.map +1 -1
- package/lib/module/v3/DataModels/Unit.js +2 -2
- package/lib/module/v3/DataModels/Unit.js.map +1 -1
- package/lib/module/v3/SpikeRNConnectionAPIv3.js +47 -12
- package/lib/module/v3/SpikeRNConnectionAPIv3.js.map +1 -1
- package/lib/module/v3/StatisticsFilter.js +4 -1
- package/lib/module/v3/StatisticsFilter.js.map +1 -1
- package/lib/module/version.js +1 -1
- package/lib/typescript/Spike.d.ts +7 -2
- package/lib/typescript/Spike.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +13 -4
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/ActivityAdditionalData.d.ts +9 -0
- package/lib/typescript/v3/DataModels/ActivityAdditionalData.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/ActivityConfig.d.ts +12 -0
- package/lib/typescript/v3/DataModels/ActivityConfig.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/ActivityEntry.d.ts +10 -0
- package/lib/typescript/v3/DataModels/ActivityEntry.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/ActivitySamples.d.ts +8 -0
- package/lib/typescript/v3/DataModels/ActivitySamples.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/ActivityTag.d.ts +3 -0
- package/lib/typescript/v3/DataModels/ActivityTag.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/ActivityType.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/InputMethod.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/MetricType.d.ts +34 -1
- package/lib/typescript/v3/DataModels/MetricType.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/Provider.d.ts +0 -12
- package/lib/typescript/v3/DataModels/Provider.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/ProviderSource.d.ts +4 -0
- package/lib/typescript/v3/DataModels/ProviderSource.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/RecordSource.d.ts +11 -0
- package/lib/typescript/v3/DataModels/RecordSource.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/SleepConfig.d.ts +5 -0
- package/lib/typescript/v3/DataModels/SleepConfig.d.ts.map +1 -0
- package/lib/typescript/v3/DataModels/SpikeRecord.d.ts +21 -18
- package/lib/typescript/v3/DataModels/SpikeRecord.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/Statistic.d.ts +2 -2
- package/lib/typescript/v3/DataModels/Statistic.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/StatisticsInterval.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/StatisticsType.d.ts.map +1 -1
- package/lib/typescript/v3/DataModels/Unit.d.ts.map +1 -1
- package/lib/typescript/v3/SpikeRNConnectionAPIv3.d.ts +44 -6
- package/lib/typescript/v3/SpikeRNConnectionAPIv3.d.ts.map +1 -1
- package/lib/typescript/v3/StatisticsFilter.d.ts +5 -1
- package/lib/typescript/v3/StatisticsFilter.d.ts.map +1 -1
- package/lib/typescript/version.d.ts +1 -1
- package/package.json +2 -2
- package/src/Spike.ts +10 -3
- package/src/index.ts +29 -3
- package/src/v3/DataModels/ActivityAdditionalData.ts +11 -0
- package/src/v3/DataModels/ActivityConfig.ts +20 -0
- package/src/v3/DataModels/ActivityEntry.ts +10 -0
- package/src/v3/DataModels/ActivitySamples.ts +10 -0
- package/src/v3/DataModels/ActivityTag.ts +6 -2
- package/src/v3/DataModels/ActivityType.ts +3 -2
- package/src/v3/DataModels/InputMethod.ts +3 -2
- package/src/v3/DataModels/MetricType.ts +37 -3
- package/src/v3/DataModels/Provider.ts +3 -14
- package/src/v3/DataModels/ProviderSource.ts +7 -2
- package/src/v3/DataModels/RecordSource.ts +13 -0
- package/src/v3/DataModels/SleepConfig.ts +8 -0
- package/src/v3/DataModels/SpikeRecord.ts +25 -23
- package/src/v3/DataModels/Statistic.ts +12 -10
- package/src/v3/DataModels/StatisticsInterval.ts +3 -7
- package/src/v3/DataModels/StatisticsType.ts +3 -2
- package/src/v3/DataModels/Unit.ts +3 -2
- package/src/v3/SpikeRNConnectionAPIv3.ts +119 -27
- package/src/v3/StatisticsFilter.ts +9 -1
- package/src/version.ts +1 -1
package/android/build.gradle
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
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
|
-
|
|
650
|
+
} catch (e: SpikeExceptions) {
|
|
651
|
+
promise.reject(e.mapException(), e.message)
|
|
652
|
+
}
|
|
642
653
|
}
|
|
643
654
|
}
|
|
644
655
|
|
|
645
656
|
@ReactMethod
|
|
646
|
-
fun
|
|
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
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
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
|
-
|
|
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
|
-
|
|
683
|
-
|
|
684
|
-
|
|
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
|
-
|
|
688
|
-
|
|
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
|
-
|
|
696
|
-
|
|
697
|
-
|
|
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
|
-
|
|
701
|
-
|
|
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
|
-
|
|
709
|
-
|
|
710
|
-
|
|
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
|
-
|
|
714
|
-
|
|
715
|
-
|
|
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
|
-
|
|
723
|
-
|
|
724
|
-
|
|
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
|
-
|
|
728
|
-
|
|
729
|
-
|
|
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
|
-
|
|
737
|
-
|
|
738
|
-
|
|
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
|
-
|
|
742
|
-
|
|
743
|
-
|
|
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
|
-
|
|
751
|
-
|
|
752
|
-
|
|
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
|
-
|
|
762
|
-
|
|
763
|
-
|
|
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
|
-
|
|
766
|
-
|
|
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
|
|
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
|
-
|
|
779
|
-
|
|
780
|
-
|
|
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
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
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
|
-
|
|
795
|
-
.
|
|
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
|
-
|
|
798
|
-
|
|
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
|
-
|
|
811
|
-
|
|
812
|
-
|
|
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
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
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
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
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
|
-
|
|
845
|
-
|
|
964
|
+
val permissionManager = connection.getHealthConnectPermissionManager()
|
|
965
|
+
val permissionsStrings = permissions.toArrayList().map{ it as String }.toSet()
|
|
846
966
|
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
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
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
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
|
-
|
|
867
|
-
|
|
868
|
-
|
|
990
|
+
try {
|
|
991
|
+
val intent = permissionManager.getRequestPermissionResultContract().createIntent(
|
|
992
|
+
reactApplicationContext, permissions
|
|
993
|
+
)
|
|
869
994
|
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
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
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
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
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
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
|
-
|
|
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
|
-
|
|
913
|
-
|
|
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
|
|